Gestion d'un sèche-serviette avec Home Assistant et Tasmota
Le Module
C'est certainement un des modules les plus anciens utilisé dans cette maison : un SonOff Dual.
Pour gérer le fil pilote d'un équipement de chauffage, ce module est très pratique car il permet de lier les 2 sorties des relais sans trop de manipulation.
La mise en oeuvre de ce montage n'est pas objectif de cet article, des tutos sont disponibles sur Internet (ici par exemple)
Tasmota est installé sur ce module (depuis la version... SonOff-OTA je crois bien)
Le Sèche Serviette
Mon sèche serviette n'est pas le chauffage principal de la salle de bain.
Il sert essentiellement à apporter le surplus de chaleur lors de l'utilisation de celle-ci et bien entendu de sécher les serviettes.
Le pilotage par fil pilote à 4 états nécessite de configurer 3 températures de consigne sur l'appareil.
Libre à vous de régler ces T° comme bon vous semble (attention, le gouvernement vous surveille !! :p)
Ici c'est 25°C CONFORT et 22° ECO pour lancer rapidement le chauffage et ensuite garder la chaleur quelques temps.
L'objectif de cet article est d'expliquer ma logique de mise en oeuvre du pilotage de cet appareil.
L'idée générale est de garder au maximum le module autonome.
Cahier des charges
- 2 plages de chauffe (matin et soir)
 - 1 plage de pré-chauffe pour l'hiver
 - Enchainement automatique CONFORT - ECO - ARRET pour chaque allumage
 - Gestion de la plage horaire matinale automatique en fonction du jour et des "états" de présence
 - Gestion de la plage horaire de fin de journée statique et via notification smartphone
 
De manière empirique j'ai calculé qu'un cycle de chauffe efficace se déroule comme suit :
- CONFORT 40min
 - ECO 40min
 - ARRET
 
La règle sera donc la suivante, à chaque démarrage du mode CONFORT :
- il durera 40min pour ensuite
 - passer au mode ECO pendant 40min
 - et on arrête tout
 
Le mode "Pre Heat" consiste à lancer le mode CONFORT à 5h30 du matin, en heures creuses, afin d'avoir le sèche serviette déjà chaud pour la plage de chauffage matinale.
Ca coûte moins cher !
Comme indiqué en préambule, j'utilise Tasmota comme OS sur l'ESP du SonOff Dual.
On va donc essayer d'utiliser au maximum ses possibilités pour le rendre autonome, tout en gardant la reconfiguration et la télémétrie avec HA.
Implémentation et logique Tasmota
Les modes du fil pilote
Le module SonOff Dual R2 modifié permet d'activer les modes du fil pilote avec des combinaisons des 2 relais :
- STOP : 
Power1 ONetPower2 OFF - HORS-GEL : 
Power1 OFFetPower2 ON - ECO : 
Power1 ONetPower2 ON - CONFORT : 
Power1 OFFetPower2 OFF 
Pour se simplifier la vie, on va utiliser des Rules pour activer les modes (voir plus loin dans cet article)
Les Timers
Pour gérer des plages horaires, Tasmota dispose d'une fonction très sympa : les Timers.
Pour résumer les timers permettent de déclencher une action sur un relais à une heure fixe ou bien avec les heures du lever et coucher de soleil.
On peut configurer les jours où le timer est activé.
Par défaut, les actions d'un Timer sont on/off/toggle ou blink. Lorsqu'on utilise les "Rules" de Tasmota, le mode blink disparait pour laisser un autre mode : rule.
Et bien entendu, on vu utiliser les Rules !
Les Timers vont donc servir de déclencheur.
Maintenant nous allons voir comment on peut gérer la durée d'activation du chauffage.
On pourrait utiliser les Timers pour modifier les relais afin d'arrêter le mode CONFORT/ECO au bout des 40min.
Mais cela ne permettrait pas de prendre en compte l'activation du chauffage de manière manuelle. Mauvaise solution.
On va mettre en place un mécanisme qui fonctionne dans tous les cas ! (Timer et manuel)
Plutôt que de configurer les relais, on va créer des actions qui font tout : configurer les relais et activer les compteur de temps (RuleTimer)
Les RuleTimer
Cette fonction de Tasmota permet de faire un décompte.
Très intéressante lorsqu'on utilise les Rules car dès qu'un RuleTimer est terminé, nous avons un trigger !
On va donc utiliser 2 RuleTimer :
RuleTimer1: durée mode CONFORT (40min/2400s)RuleTimer2: durée mode ECO (40min/2400s)
A chaque changement de mode on reconfigure les RuleTimer pour éviter d'avoir des bugs du genre mode ECO et CONFORT en même temps...
Les Number
C'est le moment de faire une parenthèse sur l'intéraction entre HA et Tasmota.
Lorsqu'on utilise un relais, dans HA il est configuré comme un switch. Pas de problème pour le pilotage et les remontées d'états entre HA et Tasmota.
Par contre, lorsqu'on utilise un actionneur à plusieurs états c'est différent.
Ca ne peut pas être un sensor (remontée uniquement dans le sens Tasmota -> HA).
Ca doit être une variable commune entre HA et Tasmota : merci les number !
( voir https://www.home-assistant.io/integrations/number.mqtt/ )
Les number (MQTT number dans notre cas) permettent d'avoir une variable synchronisée sur Tasmota et sur HA. Peut importe d'où elle est modifiée, les 2 systèmes sont immédiatement mis à jour.
On va donc utiliser un MQTT Number de HA pour gérer nos 4 modes.
De manière arbitraire on définit :
0: Arrêt
1: Hors-Gel
2: Eco
3: Confort
J'ai ajouté un switch "sport-today" qui permet d'activer le chauffage n'importe que jour, le soir (la douche après le sport c'est important !)
Ce mode peut être activé manuellement par un switch sur HA. Le auto-off du switch est géré par Tasmota.
Maintenant que nous avons tous les concepts, on peut passer à l'implémentation.
Configuration Tasmota
Variables
Topic: salledebain
FullTopic: home/tasmota/%topic%/%prefix%/
Mem2: home/tasmota/
Mem2: 0-3 Heat Mode
      0: ARRET
      1: HORS-GEL
      2: ECO
      3: CONFORT
Auto Switch OFF
Mode CONFORT 40min/2400s :
- RuleTimer1 2400
 - RuleTimer2 0
Mode ECO 40min/2400s : - RuleTimer1 0
 - RuleTimer2 2400
 
Programmation par Timers
- Timer1 : pre-heat
 - Timer2 : morning
 - Timer3 : evening
 
Exemple de conf Timer envoyé par HA
Action 3 : pour trigger des Rules
Timer1 {"Enable":1,"Mode":0,"Time":"05:35:00","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}
Timer2 {"Enable":1,"Mode":0,"Time":"06:15:00","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}
Timer3 {"Enable":1,"Mode":0,"Time":"18:45:00","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}
Activation (globale) des Timers
Timers ON
RULE 1
Auto Switch OFF
Hardcoded Tasmota : RuleTimer1 (2400s)> Passage Eco + RuleTimer2 2400s > Off
HA en backup : 2500s
Trigger Modes
- Timer1 : PreHeat => Mode Confort
 - Timer2 : Morning => Mode Confort
 - Timer3 : Evening/Sport =>Mode Confort + disable MQTT switch sport-today
 
Timer1 : PreHeat Mode Confort Mem2 = 3
ON Clock#Timer=1
  DO Mem2 3
ENDON
Timer2 : Morning Mode Confort Mem2 = 3
ON Clock#Timer=2
  DO Mem2 3
ENDON
Timer3 : Evening/Sport Mode Confort + disable MQTT switch sport-today
ON Clock#Timer=3
  DO Backlog
  Mem2 3;
  publish2 %mem1%%topic%/sport-today OFF
ENDON
RuleTimer1 terminé : passage en mode ECO avec Mem2 = 2
ON Rules#Timer=1
  DO Mem2 2
ENDON
RuleTimer2 terminé : passage en mode ARRET avec Mem2 = 0
ON Rules#Timer=2
  DO Mem2 0
ENDON
RULE 2
Activation des relais et des décomptes
OnBoot : refresh Mem2 (Mode) pour update HA
Mem2 = 0 : Arret
ON Mem2#state==0
  DO backlog
    POWER1 on;
    POWER2 off;
    RULETIMER1 0;
    RULETIMER2 0
ENDON
Mem2 = 1 : Hors-Gel
ON Mem2#state==1
  DO backlog
    POWER1 off;
    POWER2 on;
    RULETIMER1 0;
    RULETIMER2 0
ENDON
Mem2 = 2 : Eco
ON Mem2#state==2
  DO backlog
    POWER1 on;
    POWER2 on;
    RULETIMER1 0;
    RULETIMER2 2400
ENDON
Mem2 = 3 : Confort
ON Mem2#state==3
  DO backlog
    POWER1 off;
    POWER2 off;
    RULETIMER1 2400;
    RULETIMER2 0
ENDON
ON System#boot
  DO Mem2
ENDON
Avec ces 2 règles le module est autonome.
Injection et Activation des règles dans Tasmota :
Rule1 "
Rule1 1
Rule1 ON Rules#Timer=1 DO Mem2 2 ENDON ON Rules#Timer=2 DO Mem2 0 ENDON ON Clock#Timer=1 DO Mem2 3 ENDON ON Clock#Timer=2 DO Mem2 3 ENDON ON Clock#Timer=3 DO Backlog Mem2 3; publish2 %mem1%%topic%/sport-today OFF ENDON
Rule2 "
Rule2 1
Rule2 ON Mem2#state==0 DO backlog POWER1 on; POWER2 off; RULETIMER1 0; RULETIMER2 0 ENDON ON Mem2#state==1 DO backlog POWER1 off; POWER2 on; RULETIMER1 0; RULETIMER2 0 ENDON ON Mem2#state==2 DO backlog POWER1 on; POWER2 on; RULETIMER1 0; RULETIMER2 2400 ENDON ON Mem2#state==3 DO backlog POWER1 off; POWER2 off; RULETIMER1 2400; RULETIMER2 0 ENDON ON System#boot DO Mem2 ENDON
Configuration HA
Passons maintenant à la configuration de HA.
De quoi avons-nous besoin ?
- 1x 
MQTT Numberpour piloter les modes - 1x 
Input Selectpour faire joli sur les DashBoard... - 1x 
MQTT Switchpour le mode sport today - Des 
Binarypour gérer les modes de présences (workday, vacances, teletravail, ...) - 1x 
Sensorde T° de la pièce pour le mode pre-heat de l'hiver - Une application modile déclarée et fonctionnelle
 - 5x 
automationspour faire fonctionner tout ça - 1x 
automationpour couper tout ça (vacances !) 
MQTT Number
Déclaration du MQTT Number qui se synchronise avec le retour de la commande Mem2 de Tasmota.
On surveille le topic RESULT et on ne prends la valeur que lorsque celui-ci affiche Mem2 dans le JSON.
On limite les valeurs à [0-3]
- name: "Heater Sdb Mode"
  state_topic: "home/tasmota/salledebain/stat/RESULT"
  value_template: >
    {% if value_json.Mem2 is defined %}
      {{ value_json['Mem2'] |int(0) }}
    {% else %}
      {{ states('number.heater_sdb_mode') }}
    {% endif %}
  command_topic: "home/tasmota/salledebain/cmnd/Mem2"
  min: 0
  max: 3
  availability_topic: "home/tasmota/salledebain/tele/LWT"
  payload_available: "Online"
  payload_not_available: "Offline"
  retain: trueMQTT Switch
Switch virtual dans le broker MQTT.
Utile uniquement pour un affichage dans le DashBoard de HA.
Il permet de savoir si on a activé ou non la programmation du soir.
- name: "Sport Today"
  state_topic: "home/tasmota/salledebain/sport-today"
  command_topic: "home/tasmota/salledebain/sport-today"
  payload_on: "ON"
  payload_off: "OFF"
  availability_topic: "home/tasmota/salledebain/tele/LWT"
  payload_available: "Online"
  payload_not_available: "Offline"
  icon: "hass:karate"
  retain: trueBinary Sensors
Libre à vous de définir vos binary pour gérer les scénarios.
Ici j'ai :
binary_sensor.workday: Le WorkDay intégré à HAinput_boolean.nowork_day: Un binary pour les jours de repasinput_boolean.homeoffice_day: un binary pour les jours de TT
Input Select
heater_sdb:
  name: 'Mode Chauffage'
  options:
    - 'Confort'
    - 'Eco'
    - 'Hors-Gel'
    - 'Arrêt'Les Automations :
Automation : Select Heater Mode
Cette automation permet de :
- 
Synchroniser le
input_selectavec lenumberpour toujours avoir HA et Tasmota dans le même mode - 
Petite astuce pour éviter les boucles d'automation : la désactiver au début en la laissant terminer les actions, et la réactiver à la fin !
 - 
Trigger :
input_selectounumber - 
Action : send MQTT Number to Tasmota (MQTT sonoff dual)
 
- alias: '[SDB] [HEATER] Select HeatMode'
  id: 92616569-60f5-48e1-a3df-90aae08f6b3e
  initial_state: true
  trigger:
    - platform: state
      entity_id: input_select.heater_sdb
      id: "input"
    - platform: state
      entity_id: number.heater_sdb_mode
      id: "number"
  variables:
    id_mode: >
      {% set heater_mode_list = {
        'Arrêt':'0',
        'Hors-Gel':'1',
        'Eco':'2',
        'Confort':'3',
        }
      %}
      {{ heater_mode_list[states('input_select.heater_sdb')] if states("input_select.heater_sdb") in heater_mode_list.keys() else 'error' }}
    select_mode: >
      {% set heater_mode_list = {
        '0':'Arrêt',
        '1':'Hors-Gel',
        '2':'Eco',
        '3':'Confort',
        }
      %}
      {{ heater_mode_list[states('number.heater_sdb_mode')] if states("number.heater_sdb_mode") in heater_mode_list.keys() else 'error' }}
  action:
    # Avoid loop : disable this automation.
    - service: automation.turn_off
      target:
        entity_id: automation.sdb_heater_select_heatmode
      data:
        stop_actions: false
    - choose:
      # Sync Number from Select
      - conditions:
          - condition: trigger
            id: "input"
        sequence:
          - service: number.set_value
            target:
              entity_id: number.heater_sdb_mode
            data:
              value: "{{ id_mode }}"
      # Sync Select from Number
      - conditions:
          - condition: trigger
            id: "number"
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.heater_sdb
            data:
              option: "{{ select_mode }}"
    # Avoid loop : Enable this automation
    - service: automation.turn_on
      target:
        entity_id: automation.sdb_heater_select_heatmode
Automation : Arrêt chauffage auto
Cette automation est un garde-fou si on a mouflé dans la conf Tasmota.
- Trigger : Mode Confort/Eco pdt 45 min (si Tasmota 
RuleTimer40min fail) - Action : Change Mode Confort -> Eco -> Arret
 
Normalement, cette automation n'est jamais lancé car les RuleTimers de Tasmota changent les modes au bout de 40min.
- alias: '[SDB] [HEATER] Stop Auto'
  id: 613ea8b7-dc23-4a0e-a696-ffaf5e15d4d8
  initial_state: true
  trigger:
    - platform: state
      entity_id: sensor.heater_sdb_status
      to:
        - 'Confort'
        - 'Eco'
      for:
        minutes: 45
  action:
    - choose:
      - conditions:
        # Mode Confort depuis 45min : Mode Eco
        - "{{ is_state('sensor.heater_sdb_status', 'Confort') }}"
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.heater_sdb
            data:
              option: 'Eco'
        # Mode Eco depuis 45min : Mode Arret
      - conditions:
        - "{{ is_state('sensor.heater_sdb_status', 'Eco') }}"
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.heater_sdb
            data:
              option: 'Arrêt'Automation : Programmation plages de chauffe
CONFORT
- 5h00 Workday ON et NoWork Day OFF et T° <20°C
 - 6h15 Workday ON et NoWork Day OFF et Home Office Day OFF
 - 6h45 Workday ON et NoWork Day OFF et Home Office Day ON
 - 8h45 NoWork Day OFF et Sat
 - 9h45 NoWork Day ON ou Sun
 - 18h45 Sunday
 - 6h05 Si il y a un loupé dans l'algo
 
Trigger :
binary_sensor.workdayinput_boolean.nowork_dayinput_boolean.homeoffice_day- 4h00 au cas où...
 
Tasmota :
Timer1: PreHeat MatinTimer2: MatinTimer3: Soir
Actions :
- Activer/Désactiver et régler Heure de 
Timer1,Timer2etTimer3 - Notify MobileApp pour supervision
 
- alias: '[SDB] [Prog] Regular'
  id: c6731b24-0d19-4ec5-975a-8ff080e35004
  initial_state: true
  trigger:
    # Changement de jour/mode
    - platform: state
      entity_id:
        - binary_sensor.workday
        - input_boolean.nowork_day
        - input_boolean.homeoffice_day
      to:
        - 'on'
        - 'off'
    # 4h00 au cas où fail au dessus
    - platform: time
      at:
      - '04:00:00'
  condition: []
  variables:
    morning_start_time: >
      {# CONFORT 6h15 si WorkDay #}
      {% if is_state('binary_sensor.workday', 'on') and is_state('input_boolean.nowork_day', 'off') and is_state('input_boolean.homeoffice_day', 'off')  %}
        06:15
      {# CONFORT 6h45 si WorkDay HomeOffice #}
      {% elif is_state('binary_sensor.workday', 'on') and is_state('input_boolean.nowork_day', 'off') and is_state('input_boolean.homeoffice_day', 'on')  %}
        06:45
      {# CONFORT 8h45 si Saturday et NoWorkDay #}
      {% elif is_state('binary_sensor.workday', 'off') and is_state('input_boolean.nowork_day', 'off') and (now().strftime('%A') == 'Saturday')  %}
        08:45
      {# CONFORT 9h45 si NoWorkDay ou Sunday #}
      {% elif is_state('input_boolean.nowork_day', 'on') or (now().strftime('%A') == 'Sunday')  %}
        09:45
      {# CONFORT 6h05 si j'ai loupé qqc #}
      {% else %}
        06:05
      {% endif %}      
  action:
    #
    # PreHeat
    - choose:
      #
      # CONFORT 5h35 si WorkDay et T° < 20°C
      - conditions:
        - "{{ is_state('binary_sensor.workday', 'on') }}"
        - "{{ is_state('input_boolean.nowork_day', 'off') }}"
        - "{{ states('sensor.sdb_temperature_mean')|int(0) < 20 }}"
        sequence:
          # Mode Confort (OFF,OFF)
          # Timer1 1 / Action 3 (rule)
          - service: mqtt.publish
            data:
              topic: 'home/tasmota/salledebain/cmnd/Timer1'
              payload_template: '{"Enable":1,"Mode":0,"Time":"05:35:00","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}'
              retain: false
          # Notify Mobile App
          - service: notify.mobile_app_mobile
            data:
              title: "Chauffage Salle de Bain"
              message: "Activation PreHeat"
              data:
                subject: "Mode Confort : 05h35"
                channel: "Salle de Bain"
                tag: "sdb-prog-preheat"
    #
    # Evening
    - choose:
      #
      # CONFORT 18h45 Sunday
      - conditions:
        - "{{ (now().strftime('%A') == 'Sunday') }}"
        sequence:
          # Mode Confort (OFF,OFF)
          # Timer3 1 / Action 3 (rule)
          - service: mqtt.publish
            data:
              topic: 'home/tasmota/salledebain/cmnd/Timer3'
              payload_template: '{"Enable":1,"Mode":0,"Time":"18:45:00","Window":0,"Days":"S000000","Repeat":0,"Action":3}'
              retain: false
          # Notify Mobile App
          - service: notify.mobile_app_mobile
            data:
              title: "Chauffage Salle de Bain"
              message: "Activation Evening"
              data:
                subject: "Mode Confort : 18h45"
                channel: "Salle de Bain"
                tag: "sdb-prog-evening"
    #
    # Morning Every Trigger
    # Mode Confort (OFF,OFF)
    # Timer2 1 / Action 3 (rule)
    # Si on veut activer la répétition permanente de ce Timer dans Tasmota => Mode : 1
    - service: mqtt.publish
      data:
        topic: 'home/tasmota/salledebain/cmnd/Timer2'
        payload_template: '{"Enable":1,"Mode":0,"Time":"{{ morning_start_time }}","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}'
        retain: false
   # Notify Mobile App
    - service: notify.mobile_app_mobile
      data:
        title: "Chauffage Salle de Bain"
        message: "Reconfiguration Morning"
        data:
          subject: "Mode Confort : {{ morning_start_time }}"
          channel: "Salle de Bain"
          tag: "sdb-prog-morning"Automation : Activer le mode CONFORT le soir
Trigger :
input_booleanmobile_app
Actions :
- Reconfiguration Tasmota 
Timers - Activation 
input_boolean 
- alias: '[SDB] [Prog] Sport Today'
  id: f38b2765-5387-4570-8e32-631d488f146b
  initial_state: true
  mode: restart
  trigger:
    - platform: state
      entity_id: switch.sport_today
      from:
        - 'on'
        - 'off'
      to:
        - 'on'
        - 'off'
        # Quand reboot : unavailable et flood...
      id: "switch"
    - platform: event
      event_type: mobile_app_notification_action
      event_data:
        action: mode_sport_on
      id: "mobile_app"
    - platform: event
      event_type: mobile_app_notification_action
      event_data:
        action: mode_sport_off
      id: "mobile_app"
  condition: []
  variables:
    timer_status: >
      {% if is_state("switch.sport_today", "on") %}
        1
      {% else %}
        0
      {% endif %}
  action:
    - choose:
      # Switch Trigger => Programmation + Notify MobileApp
      - conditions:
          - condition: trigger
            id: "switch"
        sequence:
          # Mode Confort (OFF,OFF)
          # Timer3 1 / Action 3 (rule)
          - service: mqtt.publish
            data:
              topic: 'home/tasmota/salledebain/cmnd/Timer3'
              payload_template: '{"Enable":{{ timer_status }},"Mode":0,"Time":"20:00:00","Window":0,"Days":"SMTWTFS","Repeat":0,"Action":3}'
              retain: false
          # Notify Mobile App
          - service: notify.mobile_app_mobile
            data:
              title: "Salle de Bain"
              message: "Programmation Chauffage Soir {{ states('switch.sport_today')|replace('off', 'désactivée')|replace('on', 'activée') }}"
              data:
                channel: Salle de Bain
                tag: "sdb-prog-sport"
      # MobileApp Trigger => Programmation (via switch sport_today)
      - conditions:
          - condition: trigger
            id: "mobile_app"
        sequence:
          - service_template: >
              {% if trigger.event.data.action == 'mode_sport_on' %}
                switch.turn_on
              {% elif trigger.event.data.action == 'mode_sport_off' %}
                switch.turn_off
              {% endif %}
            data:
              entity_id: switch.sport_todayAutomation : Envoie des notifs sur l'application
Trigger :
Time
- alias: '[SDB] [NOTIFY] Mode Sport'
  id: 86347de9-ca02-42ba-9bee-1424244a7204
  initial_state: true
  trigger:
    - platform: time
      at: '17:15:00'
  condition:
    condition: and
    conditions:
      - condition: time
        weekday:
          - tue
          - wed
          - fri
          - sat
  action:
    # Notify Mobile App
    - service: notify.mobile_app_mobile
      data:
        title: "Chauffage Salle de Bain"
        message: "Sport aujourd'hui ?"
        data:
          actions:
            - action: "mode_sport_on"
              title: "Oui"
            - action: "mode_sport_off"
              title: "Non"
          data:
            channel: "Salle de Bain"
            tag: "sdb-prog"Et c'est tout ^^
Cette configuration tourne depuis un peu moins d'un mois et je n'ai pas rencontré de bug.
Le module est autonome grace à Tasmota pour lancer le chauffage (pas de soucis en cas de reboot ou panne de HA).
HA permet d'apporter tout le confort d'utilisation.
Petite exemple de ce qu'il se passe à la fin du mode ECO :
(oui, ce module est aussi équipé d'un DHT22 pour avoir T° et humidité)
11:03:35.110 MQT: home/tasmota/salledebain/tele/SENSOR = {"Time":"2022-10-02T11:03:35","AM2301":{"Temperature":21.5,"Humidity":79,"DewPoint":17.6},"TempUnit":"C"} (retained)
11:04:35.147 MQT: home/tasmota/salledebain/tele/STATE = {"Time":"2022-10-02T11:04:35","Uptime":"9T02:32:28","UptimeSec":786748,"Heap":24,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":9,"POWER1":"ON","POWER2":"ON","Wifi":{"AP":1,"SSId":"home-iot","BSSId":"58:59:C2:A2:20:12","Channel":6,"Mode":"11n","RSSI":62,"Signal":-69,"LinkCount":9,"Downtime":"0T00:00:57"}}
11:04:35.166 MQT: home/tasmota/salledebain/tele/SENSOR = {"Time":"2022-10-02T11:04:35","AM2301":{"Temperature":21.5,"Humidity":79,"DewPoint":17.7},"TempUnit":"C"} (retained)
11:05:02.108 RUL: RULES#TIMER=2 performs "Mem2 0"
11:05:02.119 MQT: home/tasmota/salledebain/stat/RESULT = {"Mem2":"0"}
11:05:02.171 RUL: MEM2#STATE==0 performs "backlog POWER1 on; POWER2 off; RULETIMER1 0; RULETIMER2 0"
11:05:02.220 MQT: home/tasmota/salledebain/stat/RESULT = {"POWER1":"ON"}
11:05:02.223 MQT: home/tasmota/salledebain/stat/POWER1 = ON (retained)
11:05:02.426 MQT: home/tasmota/salledebain/stat/RESULT = {"POWER2":"OFF"}
11:05:02.430 MQT: home/tasmota/salledebain/stat/POWER2 = OFF (retained)
11:05:02.678 MQT: home/tasmota/salledebain/stat/RESULT = {"T1":0,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}
11:05:02.901 MQT: home/tasmota/salledebain/stat/RESULT = {"T1":0,"T2":0,"T3":0,"T4":0,"T5":0,"T6":0,"T7":0,"T8":0}
11:05:35.094 MQT: home/tasmota/salledebain/tele/STATE = {"Time":"2022-10-02T11:05:35","Uptime":"9T02:33:28","UptimeSec":786808,"Heap":24,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":9,"POWER1":"ON","POWER2":"OFF","Wifi":{"AP":1,"SSId":"home-iot","BSSId":"AA:BB:CC:A2:20:12","Channel":6,"Mode":"11n","RSSI":62,"Signal":-69,"LinkCount":9,"Downtime":"0T00:00:57"}}
11:05:35.106 MQT: home/tasmota/salledebain/tele/SENSOR = {"Time":"2022-10-02T11:05:35","AM2301":{"Temperature":21.5,"Humidity":79,"DewPoint":17.7},"TempUnit":"C"} (retained)