Gestion d'un sèche-serviette avec Home Assistant et Tasmota

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)

Sonoff-Dual-R2-1

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.
seche-serviette-1

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 :

  1. il durera 40min pour ensuite
  2. passer au mode ECO pendant 40min
  3. 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 ON et Power2 OFF
  • HORS-GEL : Power1 OFF et Power2 ON
  • ECO : Power1 ON et Power2 ON
  • CONFORT : Power1 OFF et Power2 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)

TASMOTA-Timers

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 Number pour piloter les modes
  • 1x Input Select pour faire joli sur les DashBoard...
  • 1x MQTT Switch pour le mode sport today
  • Des Binary pour gérer les modes de présences (workday, vacances, teletravail, ...)
  • 1x Sensor de T° de la pièce pour le mode pre-heat de l'hiver
  • Une application modile déclarée et fonctionnelle
  • 5x automations pour faire fonctionner tout ça
  • 1x automation pour 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: true

MQTT 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: true

Binary Sensors

Libre à vous de définir vos binary pour gérer les scénarios.
Ici j'ai :

  • binary_sensor.workday : Le WorkDay intégré à HA
  • input_boolean.nowork_day : Un binary pour les jours de repas
  • input_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_select avec le number pour 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_select ou number

  • 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 RuleTimer 40min 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.workday
  • input_boolean.nowork_day
  • input_boolean.homeoffice_day
  • 4h00 au cas où...

Tasmota :

  • Timer1 : PreHeat Matin
  • Timer2 : Matin
  • Timer3 : Soir

Actions :

  • Activer/Désactiver et régler Heure de Timer1, Timer2 et Timer3
  • 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_boolean
  • mobile_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_today

Automation : 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"
Automation : Notification

Et c'est tout ^^

HA-DashBoard-SdB

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)