10

Régulation de chaudière avec FHEM – part 2

Lors de ce premier hiver d’expérience avec mon contrôle de chauffage FHEM, je l’ai affiné un peu pour le rendre plus fonctionnel.freezin penguin

Fonctions

  • Plusieurs modes de fonctionnement  (outre les modes manuels ON et OFF décrits dans le premier post):
    • Auto : température gérée par le calendrier
    • Confort : température forcée à une valeur fixe haute (confort)
    • Eco : température forcée à une valeur basse (night)
    • Modes temporaires : « temp_comfort » et « temp_night » : idem « comfort » et « night » mais la température revient au calendrier lors du prochain changement de consigne. On peut aussi ajuster une température temporaire avec un curseur.
    • Hors gel (frost)
    • Arrêt (stop)
  • Contrôle des paramètres via l’interface web : mode, réglage des consignes de température …
  • Divers :
    • Contrôle par mail
    • Utilisation d’une télécommande pour le passage d’un mode à l’autre
    • Retour visuel ou vocal des changements de mode sur une squeezebox
    • Alerte par mail en cas d’anomalie sur la sonde de température

Fichier de configuration commenté

Tout est dans le fichier de configuration fhem.cfg . C’est un peu lourd mais on n’a pas besoin d’y retourner tous les jours ! Quelques commentaires sur des fonctions FHEM utiles que j’ai découvertes à l’occasion.

Définition de la chaudière (circulateur)

# relais Intertechno ITL-1000 : circulateur
define chaudiere TRX_LIGHT AC 000000010a light
attr chaudiere IODev TRX_2
attr chaudiere alias Chaudiere
attr chaudiere devStateIcon on:sani_floor_heating:off off:sani_floor_heating_off:on
attr chaudiere event-on-update-reading state
attr chaudiere group Chauffage
attr chaudiere icon sani_heating
attr chaudiere room Maison
define FileLog_chaudiere FileLog ./log/chaudiere-%Y.log chaudiere
attr FileLog_chaudiere alias Historique chaudière
attr FileLog_chaudiere icon icoLog
attr FileLog_chaudiere logtype fs20,text
attr FileLog_chaudiere room hidden

devStateIcon permet de définir une icone représentant l’état de l’objet. Celle-ci est cliquable et permet de changer l’état de l’objet.

group permet de regrouper des objets, à l’intérieur d’une pièce (room). J’utilise le groupe « Chauffage » pour afficher le statut du thermostat et de la chaudière,tandis que le groupe « Chauffage : réglages » permet de contrôler les paramètres

Définition de la Consigne de température

On utilise un device virtuel (type « dummy ») qui permettra d’une part de conserver la température de consigne mais aussi de la modifier :

  • à la main à l’aide d’un curseur (setList state:slider,5,1,30 permet d’afficher un curseur de 5 à 30 avec un pas de 1)
  • par commande, ce qui sera utilisé par la suite
#
# temperature de consigne
#
define config_chauffage_desired dummy
attr config_chauffage_desired alias Consigne actuelle
attr config_chauffage_desired group Chauffage : réglages
attr config_chauffage_desired icon temp_temperature
attr config_chauffage_desired room Maison
attr config_chauffage_desired setList state:slider,5,1,30
attr config_chauffage_desired webCmd state

Définition du thermostat

define thermostat THRESHOLD temp_hum_entree:temperature:0.1:config_chauffage_desired:state chaudiere
attr thermostat alias Thermostat
attr thermostat group Chauffage
attr thermostat icon sani_heating_temp
attr thermostat room Maison
attr thermostat state_cmd1_gt off
attr thermostat state_cmd2_lt on
attr thermostat state_format _m _sc (_s1v / _dv °C)

Le THRESHOLD permet de définir un cycle d’hystérésis. On asservit le circulateur à la température mesurée (temp_hum_entree:temperature) en fonction de la température de consigne (chauffage-desired:state) :

  • si elle est plus grande, la commande off est passée à « chaudiere »
  • si elle est plus petite, c’est la commande on

Définition des consignes Eco et Confort

#
# reglage des consignes
#
define config_chauffage_comfort dummy
attr config_chauffage_comfort alias Consigne Confort (°C)
attr config_chauffage_comfort group Chauffage : réglages
attr config_chauffage_comfort icon temp_temperature_max
attr config_chauffage_comfort room Maison
attr config_chauffage_comfort setList state:slider,5,1,30
attr config_chauffage_comfort webCmd state
#
define config_chauffage_night dummy
attr config_chauffage_night alias Consigne Eco (°C)
attr config_chauffage_night group Chauffage : réglages
attr config_chauffage_night icon temp_temperature_min
attr config_chauffage_night room Maison
attr config_chauffage_night setList state:slider,5,1,30
attr config_chauffage_night webCmd state

Définition du calendrier

#
# calendrier de definition temperature de consigne
#
define programme_thermostat Heating_Control config_chauffage_desired fr 67|07:30|19.5 67|12:00|20 12345|17:30|19 1234567|23:00|18 1234567|00:05|18 { fhem ("set config_chauffage_mode auto");; fhem ("set @ %");; }
attr programme_thermostat alias Calendrier
attr programme_thermostat disable 0
attr programme_thermostat group Chauffage : réglages
attr programme_thermostat icon time_calendar
attr programme_thermostat room Maison
attr programme_thermostat windowSensor porte_entree

Dans l’exemple, si porte_entree est Open le chauffage s’éteint. On peut utiliser un groupe d’ouvertures, aussi.

Définition du mode

#
# définition du mode
#
define config_chauffage_mode dummy
attr config_chauffage_mode alias Mode
attr config_chauffage_mode devStateIcon auto:time_automatic:temp_comfort temp_comfort:text_max:temp_night temp_night:text_min:comfort comfort:status_comfort:night night:status_night:frost frost:status_frost:stop stop:rc_STOP:auto
attr config_chauffage_mode group Chauffage : réglages
attr config_chauffage_mode icon temp_control
attr config_chauffage_mode room Maison
attr config_chauffage_mode setList state:auto,temp_comfort,temp_night,comfort,night,frost,stop
attr config_chauffage_mode webCmd state

Il reste maintenant à définir ce qui va être fait quand on change ce device d’état :

A la brute

On définit des notify qui interceptent les changements de mode, pour appliquer d’une part la consigne correspondante mais aussi la désactivation éventuelle du calendrier de consignes
# notifies pour les modes
define config_chauffage_mode_comfort_n notify config_chauffage_mode:comfort { my $temp=(Value("config_chauffage_comfort"));; fhem("set thermostat external;; set config_chauffage_desired $temp;; attr programme_thermostat disable 1")}
define config_chauffage_mode_night_n notify config_chauffage_mode:night { my $temp=(Value("config_chauffage_night"));; fhem("set thermostat external;; set config_chauffage_desired $temp;; attr programme_thermostat disable 1")}
define config_chauffage_mode_frost_n notify config_chauffage_mode:frost { fhem("set thermostat external;; set config_chauffage_desired 15;; attr programme_thermostat disable 1")}
define config_chauffage_mode_temp_comfort_n notify config_chauffage_mode:temp_comfort { my $temp=(Value("config_chauffage_comfort"));; fhem("set thermostat external;; set config_chauffage_desired $temp;; attr programme_thermostat disable 0")}
define config_chauffage_mode_temp_night_n notify config_chauffage_mode:temp_night { my $temp=(Value("config_chauffage_night"));;   fhem("set thermostat external;; set config_chauffage_desired $temp;; attr programme_thermostat disable 0") }
define config_chauffage_mode_stop_n notify config_chauffage_mode:stop { fhem("set thermostat deactivated;; set chaudiere off;; attr programme_thermostat disable 1") }
define config_chauffage_mode_auto_n notify config_chauffage_mode:auto { my $temp=(Value("programme_thermostat"));; fhem("set thermostat external;; set config_chauffage_desired $temp;; attr programme_thermostat disable 0")}

Un peu plus subtil

Comme on le voit les définitions ne sont pas très lisibles et alourdissent le fichier de config. Une bonne pratique est d’utiliser le fichier /opt/fhem/FHEM/99_myUtils.pm dans lequel ont peut écrire des procédures relatives à son installation personnelle. C’est ce qu’on va faire :

sub chauffage_setmode(@) {
  my ($mode) = @_;
  my $temperature = Value("config_chauffage_desired");
  my $disable_program = "0";

  if( $mode eq "same" ) {
    # used in case FHEM is reinitialized.
    $mode = Value("config_chauffage_mode");
  }

  if( $mode eq "stop" )  {
    fhem("set thermostat deactivated; set chaudiere off;
          attr programme_thermostat disable 1");
  } else {
    fhem("set thermostat external");
    if( $mode =~ /(.*)((comfort)|(night))/ ) {
      $disable_program = ( $1 ne "temp_") ? "1" : "0";
      $temperature = Value("config_chauffage_$2");
    } elsif( $mode eq "auto" )  {
      $disable_program = "0";
      $temperature = Value("programme_thermostat");
    } elsif( $mode eq "frost" )  {
      $disable_program = "1";
      $temperature = "15";
    } elsif( $mode eq "+1" )  {
      $mode = Value("config_chauffage_mode");
      $temperature += 1;
    } elsif( $mode eq "-1" )  {
      $mode = Value("config_chauffage_mode");
      $temperature -= 1;
    } else {
      return 0;
    }
    fhem("set config_chauffage_desired $temperature");
    fhem("attr programme_thermostat disable $disable_program") ;
  }
  return "$temperature $disable_program";
}

On n’a maintenant plus besoin que d’un seul notify dans fhem.cfg pour gérer les actions à mener quand on change le mode avec l’interface graphique ou un set chauffage_mode mode

define config_chauffage_mode_n notify config_chauffage_mode { chauffage_setmode($EVTPART0) }

Activation/désactivation du calendrier

Le module Heating_Control utilise l’attribut disable qui permet de définir si le calendrier est actif ou pas. Or le statut des attributs n’est pas conservé lors d’un arrêt/relance de FHEM. La conséquence est que ce module ne reprend pas toujours la configuration voulue lors d’un arrêt/relance.

Il serait possible d’utiliser la commande save dans la procédure chauffage_setmode définie ci-dessus, mais l’inconvénient est que ça sauvegarde tous les changements apportés à la config, ce qui n’est pas nécessairement souhaitable. J’ai préféré ajouter un notify sur l’initialisation de FHEM, qui va resynchroniser le calendrier avec le mode :

define chauffage_init notify global:INITIALIZED { chauffage_setmode("same") }

[EDIT 2/1/2015] L’auteur du module a corrigé celui-ci : l’attribut disable permettant de déasctiver le calendrier est sauvegardé dans le Reading disabled, ce qui résoud les problèmes d’initialisation. Il a aussi ajouté les commandes enable et disable qui permettent d’activer/désactiver le calendrier :

set programme_thermostat disable

On peut donc réécrire les notify ou la procédure de manière plus lisible. Mais ce qui est décrit ci-dessus fonctionne.

Définition du graphe

Voir Régulation de chaudière avec FHEM – part 1 pour la définition d’un graphe faisant apparaître température de consigne, température mesurée et état du circulateur


# graphe chauffage
define chauffage_log FileLog ./log/chauffage-%Y-%m.log (thermostat:desired_value.*)|(thermostat:sensor_value.*)|(chaudiere.*)
attr chauffage_log room hidden
define wl_chauffage_log_1 SVG chauffage_log:wl_chauffage_log_1:CURRENT
attr wl_chauffage_log_1 alias Suivi régulation du chauffage
attr wl_chauffage_log_1 label "Température Min $data{min2}, Max $data{max2}, Last $data{currval2}"
attr wl_chauffage_log_1 room Maison

Supervision du capteur de température

Il m’est arrivé deux fois dans l’hiver d’avoir le chauffage bloqué en position On ou Off (j’ai eu les deux …) à cause d’un dysfonctionnement de capteur. La commande suivante permet de m’envoyer un mail si la sonde de température ne renvoie rien pendant 15mn.  A moi d’aviser : une fois c’était le RFXtrx qui ne recevait plus rien (action :  reboot) et l’autre fois seule la sonde n’émettait plus (pile à changer ).

# supervision du capteur de temperature
# send mail if we do not receive any message for 15 Minutes.
define temp_hum_entree_w watchdog temp_hum_entree:temperature.* 00:15:00 SAME trigger temp_hum_entree_w . ;; trigger sendMeAMail capteur temperature entree HS 15mn ;;

Reste à faire

  • Stats sur les durées de chauffage et le nombre de déclenchements par jour : HourCounter
  • Utilisation du module PID20 implémentant un régulateur PID, pour un asservissement plus efficace qu’un simple threshold
  • Temporisation sur le contrôle des ouvertures de fenêtre. Fiabilisation des remontées des capteurs d’ouverture (problèmes de réception pour certains)
  • Tenir compte de l’hygrométrie  (le confort thermique) avec l’indice humidex (calcul)

 

 

10 Comments

  1. Bonjour,

    Je viens de me lancer sur fhem et j’essais de comprendre la logique du logiciel en m’aidant de tes tutos qui sont très bien fait. Je me heurte néanmoins à un problème sur le thermostat, celui-ci ne me lit pas les sondes ni les consignes en mode externale….il y a surement quelque chose que je n’ai pas compris, aurais tu une piste pour m’aiguiller?

    Merci

  2. Bon je viens de trouver comment faire marcher le thermostat mais je ne sais pas pourquoi..

    J’ai été obligé d’écrire

    define thermostat THRESHOLD T1:state:0.1:T2:state chaudiere

    au lieu de

    define thermostat THRESHOLD T1:temperature:0.1:T2:state chaudiere

    Sais tu me dire pourquoi pour que je m’endorme moins bête?

  3. Qu’est-ce que tu utilises comme sonde ? Si sur celle-ci dans FHEM tu as la température dans state, et qu’il n’y a pas de Reading appelé temperature c’est normal qu’il faille définir ton THERSHOLD ainsi.
    Dans mon cas (sondes Oregon), dans state j’ai T: temperature H: humidity D: dewpoint et le Reading temperature existe bien. Voilà ce que ça donne dans l’interface Web : affichage de thermostat et affichage de temp_hum_entree en médaillon.

    • J’ai compris mon erreur, c’est qu’en fait, je n’ai pas encore de sonde et je simulais celle ci avec un dummy. Je reçois ma sonde Oregon aujourd’hui, je vais pouvoir tester ça en réel. Merci pour ta réponse…

  4. Bonjour,
    j’utilise fhem aussi mais je ne le trouve pas beau, ton thème a l’air bien, tu utilises lequel ? et je trouve que mon interface n’est pas super ergonomique ( j’ai des room a gauche et il faut que je navigue entre room).
    fhem sert pour mes sondes netatmo, le WOL, les thermostats EQ-3 MAX! via le maxcube et je dois encore rajouter mes volets.

    • J’utilise les thèmes ios7. Au niveau de l’interface il faut effectivement faire des personnalisations pour avoir quelque chose de plus sympa :

      • – ajout d’icônes, d’icônes d’état (attribut devStateIcon), widget à afficher (webCmd), pour les différents objects
      • – utiliser les attributs de FHEMWEB pour cacher des rooms (hiddenroom) ou des groupes (hiddengroup), donner des icônes aux menus (roomIcons), choisir les jeux d’icônes à utiliser (iconPath), réorganiser l’ordre des menus (sortRooms)…
      • -regrouper les objets avec l’attribut group

      Par ailleurs il y a quelque chose qu’il faut que je teste : FHEMJQWEB qui est semble-t-il une interface qui utilise les attributs définis pour FHEMWEB mais s’appuie sur jQuery et d’autres techniques plus modernes que celles utilisées dans FHEMWEB.

  5. merci Olivier, je vais personnaliser mon interface.
    ce week end j’ai rajouter mes volets roulants en dummy mais les commandes system (je lance un prog python) ne fonctionne pas encore sur le notify….
    j’ai également rajouter un jeelink en attendant mon capteur dx29dth , il recoit également mon roomnode (fait maison) mais n’arrive pas a le décoder.
    voila mes travaux en cours.

  6. super, l’interface ressemble enfin à une interface avec les commandes hiddengroup, hiddenroom et group
    j’ai aussi rajouter attr WEB defaultRoom all qui contient par défaut ce qu’il me faut.
    mes volets fonctionnent mais avec une commande php :
    define allNtfy2 notify voletTous:DESCENDRE {GetFileFromURL « http://……php. »}
    je n’ai pas réussi avec la commande system (a suivre)
    j’ai essayer FHEMJQWEB mais pas encore probant pour moi.
    mission du jour, décoder mon node via jeelink.
    encore merci pour ton aide.

  7. Ca y est mes commandes system fonctionne :
    system « sudo /usr/bin/python voleti2c.py -o 8 -s low & »
    avec une modif visudo : fhem ALL=(ALL) NOPASSWD: /usr/bin/python
    voila, si ca peux aider d’autres personnes, il me reste a intégrer mes nodes style « openenergymonitor » avec le jeelink.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *