Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….
Daylight saving time avec NotifheureXL

Mise a jour / Modification auto (été-hiver) NotifHeureXL.

Un article rapide , pour expliquer comment mettre à jour ou modifier facilement l’heure du NotifHeure. En ces temps de changement d’heure , on me redemande souvent comment mettre a jour l’heure . Bien qu’il soit possible de le faire via l’interface web , celaxige une intervention manuel.

Aujourd’hui je vais expliquer comment automatiser le décalage horaire via le protocole MQTT. Et ainsi avoir un NotifHeure toujours a l’heure même lors du changement été / hiver ( DST* )

Prérequis , avoir la dernière version du firmware NotifHeureXL en place.

Rappel sur la commande Configuration via MQTT

La commande via le protocole MQTT , est sous la forme :

Topic : byfeel/NotifheureXL/xxxxxx/name/config ( xxxxxx : numéro série ESP et name : nom donné au NotifHeure )

Texte Json { « key« : »value » } ou key= tzoffset et value = 120 ( temps en minutes ) pour deux heures . Je suis sur le fuseau UTC+1 et avec 1H00 de plus pour le DST* je dois donc passer mon réglage de 60 à 120 minutes.

exemple avec MQTT Explorer :

Si ok , le NotifHeure reboot automatiquement et la nouvelle heure sera affichée.

Pour info , voici quelques autres exemples de commande à envoyer via le topic config :

  • speed : modifie la vitesse de défilement par défaut (0 à 100 , 0 très rapide 100 très lent , par défaut 40 )
  • pause : modifie la pause par défaut en fin de scrolling , avant d’afficher la prochaine information
  • name : modifie le nom de votre NotifHeure
  • tzoffset : modifie le décalage de l’heure par rapport à l’heure GMT
  • nntpserver : modifie le nom ou l’ip du serveur stp
  • etc ….

Pour illustrer l’automatisation , je vais m’appuyer sur deux box domotique , Home assistant et jeedom … facilement adaptable à d’autres box.

Automatisation sous home assistant

Je crée un script , afin d’avoir un service a appeler pour modifier l’heure, dans le menu paramètre -> automatisation et scene -> script .
Apres lui avoir donné un nom ,je sauvegarde, et je bascule en mode yaml .

Ce script sera appelé en lui fournissant deux variables :

  • offset : temps en minutes pour le décalage
  • target : Le NotifHeure a modifié ( si plusieurs NotifHeure , si un seul on peut simplifier le script )

Dans ce script , je montre un exemple avec 3 NotifHeures , si vous en avez qu’un la ligne topic ne contiendra qu’un seul topic

alias: Update time NotifHeure
## definition des champs
fields:
  offset:
    description: time Offset
    example: 120
## Si Un seul NotifHeure , la variable target peut être supprimé
  target:
    description: target NotifHeure
    example: bureau
##debut script avec notification par défaut le bureau
sequence:
  - service: mqtt.publish
    data_template:
      payload: "{\"tzoffset\":\"{{ offset }}\"}"
      qos: 0
      retain: false
## si un seul NotifHeure la commande topic est sous la forme
## topic: "byfeel/NotifheureXL/236a40/salon/config "
      topic: >
        {% if target == "bureau" %}  byfeel/NotifheureXL/46fac3/bureau/config 
        {% elif target == "salon" %}  byfeel/NotifheureXL/236a40/salon/config 
        {% elif target == "cuisine" %}  byfeel/NotifheureXL/680a1a/cuisine/config
        {% else %} 
## NotifHeure par défaut 
        byfeel/NotifheureXL/46fdc2/bureau/config {% endif %}
mode: single
icon: mdi:clock-digital
exemple du script

Pour tester le script , se rendre dans le menu « Outils de développement ». « services » et chercher le script nouvellement créé.

On renseigne offset: 120 et on appelle le service , votre NotifHeure reboot et affiche l’heure avec un décalage de 120 minutes sur l’heure GMT.

Il ne reste plus qu’a automatiser cet appel de script a chaque changement hiver – > été .

Automatisation DST :

Pour mener a bien cette derniére, je vais avoir besoin d’un déclencheur , pour me prévenir du passage au changement d’heure.

Je crée un « binary-sensor » basé sur la fonction now() inclus dans home assistant. J’utilise template pour la création du sensor ( plus d’indo sur la documentation sur template dans home assistant ).

A renseigner dans votre fichier .yaml , basé sur la fonction now().timetuple() .

template:   
   - binary_sensor:       
        - name: "isDST Time"
          state: " {{now().timetuple().tm_isdst}}"
          unique_id: isdst-0242ac120002
now().timetuple() renvoie un objet sous la forme
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=31, tm_hour=23, 
tm_min=59, tm_sec=59, tm_wday=1, tm_yday=365, tm_isdst=-1)

L’objet qui m’intéresse dans mon cas est tm_isdst , qui renvoie 1 si DST actif , 0 si inactif et -1 si inexistant.

Mon Sensor aura donc la valeur « true » si tm_isdst=1 et « false » pour les autres valeurs ( 0 ou -1 ).

exemple affichage sensor is_dst :

Ce qui donne pour l’automatisation :

résumé automatisation

Création de la nouvelle automatisation , pour les déclencheurs , je choisi un déclenchement sur état . Heure été quand is_dst passe de OFF a ON et heure hiver quand is_dst passe de On à OFF

Exemple déclenchement heure été

Puis appel du script pour mettre à jour, en une fois, tous les NotifHeure ( je passe par la commande répéter ) , via un script yaml

Ci dessous le script complet de l’automatisation ( a adapter en fonction de vos NotifHeure ) :

alias: Notifheure DST auto Ete-Hiver
description: ""
trigger:
  - platform: state
    entity_id:
      - binary_sensor.isdst_time
    from: "off"
    to: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 10
    id: Heure_ete
  - platform: state
    entity_id:
      - binary_sensor.isdst_time
    id: Heure_hiver
    from: "on"
    to: "off"
    for:
      hours: 0
      minutes: 0
      seconds: 10
action:
  - choose:
      - conditions:
          - condition: trigger
            id: Heure_ete
        sequence:
          - alias: repeter action ete pour chaque notifheure
            repeat:
              for_each:
                - salon
                - bureau
                - cuisine
              sequence:
                service: script.update_time_notifheure
                data:
                  offset: 120
                  target: "{{ repeat.item }}"
      - conditions:
          - condition: trigger
            id: Heure_hiver
        sequence:
          - alias: repeter action hiver pour chaque notifheure
            repeat:
              for_each:
                - salon
                - bureau
                - cuisine
              sequence:
                service: script.update_time_notifheure
                data:
                  offset: 60
                  target: "{{ repeat.item }}"
mode: single

Home assistant permet de parvenir a ses fins par d’autres chemins, a vous de voir celui qui vous convient le mieux.

Voyons sous jeedom comment faire …

Automatisation sous Jeedom

Je crée une nouvelle commande action dans l’équipement NotifHeure avec le plugin JMQTT

Plusieurs façon de procéder ( soit avec une commande curseur , afin de paramétrer à la minute près )

Ajouter une commande action
Type: Choisir curseur
Topic : byfeel/NotifheureXL/xxxxxx/name/config. ( remplacer xxxxx et name , par les valeurs de votre NotifHeure )
Valeur: Rentrer le format JSON suivant {‘tzoffset’:’#slider#’} ( tzoffset est la clé , et la valeur du curseur sera le décalage horaire en minute )
Unité : Indiquer 0 à 180 ( pour des décalage allant de 0 à 3heures ) ou selon votre zone horaire par rapport à GMT ( l’amplitude qui vous correspond ).
Retain et Qos : Vous pouvez laisser les valeurs par défaut

Soit avec une commande action de type list , afin de choisir entre mode été ou hiver:

Type: Choisir liste
Topic : byfeel/NotifheureXL/xxxxxx/name/config. ( remplacer xxxxx et name , par les valeurs de votre NotifHeure )
Valeur: Rentrer le format JSON suivant {‘tzoffset’:’#select#’} ( tzoffset est la clé , select la valeur numérique de la liste ( en minutes )
Unité : J’indique mes choix possibles. ici concernant ma localisation ( en France ) 60|Hiver;120|Eté
Retain et Qos : Vous pouvez laisser les valeurs par défaut

La page d’affichage de votre équipement :


Détection du changement DST :

Pour detecter le changement de DST , je crée un script sous jeedom que j’actualise tous les jours à 03h00 du matin.

Puis dans l’onglet commande je crée une commande info basé sur un script bash.

et le script bash utilisé

#!/bin/sh
date=$(date +%Y%m%d%H%M.%S)
isdst=$(date +%Z)
if [ "$isdst" = "CEST" ] 
then
	echo "Eté"
else
	echo "Hiver"
fi

Le scenario :

Dans le menu scenario de jeedom , nouveau scenario , déclenchement provoqué par la commande dsttest du script.

puis deux bloc if qui test la valeur de dsttest , et autant d’action qu’il y a de NotifHeure ….

sur chaque bloc if , j’interdis la répétition des actions tant que la valeur de dsttest ne change pas

Concernant les autres box , il sera assez facile de reproduire ces actions , des que vous pouvez utiliser le protocole MQTT.

* DST signifie « heure d’été » ou « daylight saving time » en anglais. Il s’agit d’une pratique consistant à avancer les horloges d’une heure pendant les mois d’été, de sorte que la lumière du jour soit mieux exploitée pendant les heures de veille.

chatGPT

12 commentaires sur “Mise a jour / Modification auto (été-hiver) NotifHeureXL.”

Les commentaires sont fermés.