Bonjour @Haz
Comme @mycanaletto , je ne comprends pas ce qui te pose problème… Le module de @Argonaute ne commande pas une puissance mais alimente le relai de ton radiateur pendant un certain nombre de minutes sur une période de 10 minutes, tout comme ton thermostat intégré qui alimente 30 s par minute pour une puissance de 1/2.
Tu n’as pas besoin de mettre les thermostats de tes radiateurs « à fond », il suffit qu’ils soient réglés pour une température légèrement supérieure à la température de consigne max de Home Assistant.
Pour les autres besoins, tu dois pouvoir les intégrer avec des automatisations. Est-ce vraiment nécessaire de répartir la puissance entre les radiateurs ? Dans mon cas, j’ai 3 radiateurs dans le salon et, pour uniformiser la température, ils se déclenchent tous en même temps via un groupe.
Salut Kriss
Le passage de % à puissance (ou inversement) ne me pose pas problème.
C’est vrai que la commande en % permet d’appliquer un % de ce pour quoi les radiateurs sont déjà réglés et cela simplifie le problème.
Mon post était plus sur le fait de séparer le blueprint d’Argonaute en 2 pour en avoir un indépendant du calcul de puissance. C’est ce que je veux et je pensais que c’est ce que tu voulais quand tu écrivais « créer un pseudo-contacteur qui renverrait vers une automatisation qui actionnerait le véritable contacteur suivant ta routine de calcul de puissance ». Non?
Non, ce n’était pas mon idée.
Je pense que tu as été trompé par le terme « puissance » utilisé par @Argonaute . En fait, il fait une régulation ON/OFF plus fine qu’un thermostat normal en alimentant le radiateur en discontinu au lieu de l’alimenter en continu jusqu’à ce que la température soit atteinte. De plus, son code est très bien fait et tu ne risques pas d’emballement du radiateur en cas de panne. Dans tous les cas, le pilotage d’un radiateur par un système domotique impose de régler le thermostat du radiateur à une valeur plus élevée que celui du système domotique (23 sur le radiateur au lieu de 20-21 sur la domotique par exemple).
Mon idée était logicielle et me permettait de récupérer sa formule (puissance / alimentation discontinue) pour l’utiliser avec le thermostat de base de HA. Le truc était de créer un pseudo-relai d’alimentation géré par le thermostat HA qui actionnerait une automation qui calculerait une « puissance » et actionnerait le véritable relai en discontinu pour profiter de la régulation fine et de la coupure en cas de fenêtre ouverte.
oui j’ai bien compris le code d’Argonaute
L’alimentation discontinue sur une plage de temps, c’est le principe du PWM…
(Pulse width modulation, les circuits de contrôle de LED fonctionnent généralement en PWM: pas de puissance consommée contrairement aux résistances).
J’ai cherché un peu d’infos et je trouve l’idée PWM/TPI d’@Argonaute est théoriquement intéressante.
Si j’ai bien compris ça consiste à faire des ON/OFF pour moins consommer en fonction de la température atteinte en jouant sur l’inertie ? Ca pourrait d’ailleurs se présenter sous la forme d’un fake switch ? Combien de ON/OFF par heure ? Reste à voir si les convecteurs sont adaptés à ce mode, sans parler des contacteurs (externes ou gérés par le fil pilote) qui vont êtres méchamment sollicites.
Hello,
Oui, une puissance en % comprise entre 0 et 100 est calculée toutes les 10mn et baisse doucement jusqu’a atteindre la température de consigne. Si il fait froid dehors, la puissance se stabilise entre 10% et 15% pour combler les pertes thermiques.
J’ai des radiateurs électriques en fonte a forte inertie et ils restent en permanence juste tièdes sans oscillation de température et cela est vraiment efficace. J’ai maintenant 5 ans de recul pour l’affirmer (sur eedomus avant).
Si la puissance calculée est par exemple de 30%, le convecteur chauffera 3 minutes, puis s’arrêtera 7 minutes, puis recommencera un cycle de 10mn (3 minutes chauffe / 7 minutes arrêt si il reste a 30%). Il y aura donc 6 marche-arrêt par heure.
Effectivement, il est plus que préférable d’utiliser une commande par fil pilote (qubino, heatzy par exemple) car des coupures d’alimentations risquent d’endommager la carte électronique du convecteur.
En utilisant le thermostat de HA on va chauffer très fort jusqu’a la consigne puis arrêter le convecteur. Et chauffer très fort n’est pour le coup pas bon et accélérera le vieillissement du convecteur !
J’ai 2 pièces avec des chauffages au sol électriques (pilotage par thermostat heatit) et cela fonctionne parfaitement aussi.
J’ai vu pour information qu’il existe une proposition de thermostat pid, qui serait une alternative a mon implémentation, mais sans prise en compte de la température extérieure, ce qui me semble dommage.
J’ai testé le blueprint d’Argonaute et cela fonctionne très bien pour diminuer la consommation.
Je l’ai laissé comme dans sa proposition à des mise à jour de la consigne toutes les 5mn, cela donne 12 cycles par heure.
J’ai des sorties de câble connectées Legrand et je suppose qu’elles commutent lorsque la phase est zéro (j’associe Legrand avec qualité). J’ai lu qq part que cela permet de limiter les harmoniques dans le réseau. Dans tous les cas mes radiateurs fonctionnent en PWM avec un cycle par minutes… Je l’ai découvert en branchant la sortie de câble.
Mes radiateurs sont jolis avec une très bonne inertie mais le fils pilote ne fonctionne pas . D’où mon intérêt pour ce qu’a fait Argonaute.
Par contre, j’ai besoin de connaitre un peu mieux comment ma maison réagit à une coupure du chauffage et une remise en route des convecteurs. En adaptant le blueprint, on peut envoyer une puissance fixe (non adapté à la consigne) et voir la température remonter.
Une fois la maison identifiée, je testerai un régulateur avec une vraie intégrale. Je pourrais aussi programmer une sortie de hors gel tranquille en faisant tourner mes 3 radiateurs les uns après les autres ou deux par deux.
Je suis allé voir cette intégration du thermostat PID. Ca a l’air déjà pas mal aboutit. A première vue je dirait que la prise en compte de la température extérieure que tu regrette prends son importance dans une maison peu isolée ou avec des un fort impact du soleil (grandes baies vitrées par exemple). Sans quoi on doit pouvoir s’en passer. Le placement de la sonde me parait également important… Bref, je vais tester ce thermostat…
Intéressant cette intégration. Ca permet de rester dans le « climate » et pour ma part de l’envoyer dans HomeKit pour le control.
Et promis je partage mes carte Apex asap.
Edit: J’ai quand même fait un issue GH pour qu’il rajoute la gestion des ouvrants.
Voila le code de mes cartes Apex :
Consommation/Coûts Energie Globale :
type: custom:apexcharts-card
cache: false
update_interval: 1h
header:
standard_format: true
show: false
title: Consommation HP/HC 7j
show_states: true
span:
end: day
graph_span: 7d
stacked: true
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
show: true
series:
- entity: sensor.daily_energy_offpeak
type: column
name: HC
color: 5A6FE7
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: sensor.daily_energy_peak
type: column
name: HP
color: EA4234
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
card_mod:
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: true
update_interval: 30min
header:
show: false
standard_format: true
title: Consommation Jour/7j
show_states: true
span:
end: day
graph_span: 7d
stacked: false
apex_config:
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
series:
- entity: sensor.smart_meter_electric_consumed_kwh
type: column
name: Globale
color: EA4234
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: sensor.cumul_chauffage_new
type: column
name: Chauffages
color: 5A6FE7
unit: kWh
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
card_mod:
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: false
update_interval: 1h
header:
standard_format: true
show: false
title: Coût HP/HC 7J
show_states: true
span:
end: day
graph_span: 7d
stacked: true
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
show: true
series:
- entity: sensor.cout_jour_energie_hc
type: column
name: HC
color: 5A6FE7
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: sensor.cout_jour_energie_hp
type: column
name: HP
color: EA4234
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
card_mod:
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
show: false
standard_format: true
title: Consommation Heure/24H
show_states: false
span:
start: day
graph_span: 24h
stacked: false
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
series:
- entity: sensor.smart_meter_electric_consumed_kwh
type: column
name: Global
float_precision: 2
color: EA4234
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: sensor.cumul_chauffage_new
type: column
name: Chauffages
float_precision: 2
color: 5A6FE7
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
card_mod:
class: add-header
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
show: false
standard_format: true
title: Consommation 24H/Veille
show_states: false
span:
start: day
graph_span: 24h
stacked: false
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
series:
- entity: sensor.smart_meter_electric_consumed_kwh
type: column
name: Veille
offset: '-1d'
float_precision: 2
color: grey
opacity: 0.3
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: sensor.smart_meter_electric_consumed_kwh
type: column
name: Jour
float_precision: 2
color: EA4234
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
card_mod:
class: add-header
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
show: false
standard_format: true
title: Coût HP/HC 24H
show_states: false
span:
start: day
graph_span: 24h
stacked: true
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: true
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
series:
- entity: sensor.cout_heure_energie_hp
type: column
name: HP
float_precision: 2
color: EA4234
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: sensor.cout_heure_energie_hc
type: column
name: HC
float_precision: 2
color: 5A6FE7
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
card_mod:
class: add-header
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
Consommation/Energie Chauffage :
type: custom:apexcharts-card
cache: true
update_interval: 5min
header:
show: false
standard_format: true
title: Chauffages 24H
show_states: false
span:
start: day
graph_span: 24h
stacked: false
apex_config:
grid:
show: false
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
series:
- entity: sensor.cumul_chauffage_new
type: column
offset: '-1d'
name: Veille
float_precision: 2
color: grey
opacity: 0.2
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: sensor.cumul_chauffage_new
type: column
name: Chauffages
float_precision: 2
color: EA4234
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
card_mod:
class: add-header
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
# --paper-item-icon-color: #6E6E6E;
# --paper-item-icon-active-color: #44739e;
--mini-media-player-background-opacity:0;
--ha-card-box-shadow: 0px;
}
ha-card > h1 {
text-align: center;
}
type: custom:apexcharts-card
cache: true
update_interval: 10min
header:
standard_format: true
show: false
title: Consommation Jour/7j
show_states: true
span:
end: day
graph_span: 7d
stacked: true
apex_config:
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: false
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
show: false
series:
- entity: sensor.cumul_chauffage_new
type: column
name: Chauffage
color: EA4234
unit: kWh
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
card_mod:
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
--paper-item-icon-color: #6E6E6E;
--paper-item-icon-active-color: #44739e;
}
ha-card > h1 {
text-align: center;
}
type: entities
entities:
- type: custom:button-card
name: Consommation
size: 0px
aspect_ratio: 10/1
show_icon: true
- type: custom:apexcharts-card
cache: true
update_interval: 5min
now:
show: false
label: Maintenant
header:
standard_format: false
show: false
show_states: false
span:
start: day
offset: '-1day'
graph_span: 48h
stacked: true
apex_config:
legend:
show: false
xaxis:
axisBorder:
show: false
axisTicks:
show: false
yaxis:
axisBorder:
show: false
axisTicks:
show: false
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: false
series:
- entity: input_number.chauffage_salon_1_index
type: column
name: Salon 1
float_precision: 2
color: 17AB48
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: input_number.chauffage_salon_2_index
type: column
name: Salon 2
float_precision: 2
color: 177DF7
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: input_number.chauffage_sam_index
type: column
name: Salle a Manger
float_precision: 2
color: EA4234
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: input_number.chauffage_pauline_index
type: column
name: Pauline
float_precision: 2
color: F399CA
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
- entity: input_number.chauffage_parents_index
type: column
name: Parents
float_precision: 2
color: D3D24C
opacity: 1
group_by:
duration: 1h
func: diff
show:
datalabels: false
style: |
ha-card {
background: var(--background-card-color);
box-shadow: none;
font-size: 1px;
top: -2px;
margin: -18px
}
- type: divider
- type: custom:apexcharts-card
cache: true
update_interval: 5min
chart_type: donut
header:
standard_format: true
show: false
show_states: false
span:
start: day
graph_span: 24h
stacked: false
apex_config:
stroke:
show: true
width: 0.5
fill:
opacity: 1
type: gradient
gradient:
shade: light
type: horizontal
grid:
show: false
series:
- entity: input_number.chauffage_salon_1_index
name: Salon 1
float_precision: 1
color: 17AB48
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: input_number.chauffage_salon_2_index
name: Salon 2
float_precision: 1
color: 177DF7
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: input_number.chauffage_sam_index
name: Salle a Manger
float_precision: 1
color: EA4234
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: input_number.chauffage_pauline_index
name: Pauline
float_precision: 1
color: F399CA
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
- entity: input_number.chauffage_parents_index
name: Parents
float_precision: 1
color: D3D24C
opacity: 1
group_by:
duration: 1d
func: diff
show:
datalabels: true
style: |
ha-card {
background: var(--background-card-color);
box-shadow: none;
font-size: 1px;
top: -2px;
margin: -6px
}
show_header_toggle: false
card_mod:
style: |
ha-card {
--ha-card-background: #131313BF;
--ha-card-border-radius: 10px;
# --paper-item-icon-color: #6E6E6E;
# --paper-item-icon-active-color: #44739e;
--mini-media-player-background-opacity:0;
--ha-card-box-shadow: 0px;
--accent-color: #EA4234;
}
Désolé du pavé , amusez vous bien!
@Argonaute je peux déplacer ça dans un nouveau topic si ça t’embête ici
Hello @djal,
Excellent, merci pour le partage. Non cela m’embête pas, mais par contre, tu as la un beau contenu et il va être noyé dans toutes les réponses à mon post. C’est vraiment dommage. Si cela te convient, l’idéal serait que tu refasses un sujet à toi avec le titre et l’intro qui vont bien. Je référencerai ton post dans mon post initial, comme j’ai déjà commencé à le faire.
Sympa tes exemples. Je garde ça de coté
Mais l’intégration Energy maintenant disponible va continuer à bien évoluer, en tous cas chez HA il y bossent.
J’ai regardé le PID et oui ça à l’air pas mal.
On peut noter que le terme utilisé pour actionner les radiateur est PWM.
De mes souvenir d’automatisme, une pré-commande (ici en delta de température consigne-externe) peut être ajoutée sans problème à un PID (si elle n’est pas complètement fausse). Par contre cela nécessiterait de modifier le python.
Pour ma part, je posséde des panneaux rayonnants donc pas d’inertie.
Si je veux atteindre la consigne, il m’a été nécessaire d’ajuster le coefficient C à 0,8 et T à 0,015.
Il faut que je fignole encore ces paramètres compte tenu de la température extérieure qui baisse et qui continuera de baisser.
Mouais, entre la complexité du code de ScratMan et la simplicité de celui de @Argonaute, je n’hésite pas longtemps.
J’imagine que la complexité vient sans doute de l’intégration dans le climate
.
Et effectivement, l’absence de prise en compte de la température extérieure (alors que l’algo en PID devrait être adapté) me semble une limitation (ce n’est que mon avis): tout le monde n’a pas un lieu de vie « bien » isolé, et c’est justement l’intérêt de l’approche d’@argonaute.
Bref, merci @Argonaute pour ce travail (je me répète, mais bon ) mais j’attends tout de même ton retour @mycanaletto !
L’approche est très différente. Le composant de ScratMan est un thermostat utilisable en remplacement des thermostats en place, il en est au début et va surement évoluer. Je lui ai laissé un mot à propos des condition extérieures, je pense plus à la température ressentie car en cas de vent ça a son importance…
63 messages ont été fusionnés à un sujet existant : [HACS] Smart Thermostat - le chauffage contrôlé par PID
Bonjour merci pour ce topic.
Le mode est très intéressant.
j’ai juste un problème en tant que novice, je souhaiterai mettre à la place du capteur de fenêtre que je n’ai pas, un virtual switch : binary_sensor si j’ai bien compris mais je ne trouve pas de tuto claire pour en créer un et pouvoir le sélectionner dans le paramétrage du blueprints.