_[OBSOLETE] Domoticz Scripts LUA - vzwingma/domotique GitHub Wiki

Cette page présente les scripts LUA et Bash définis pour Domoticz :

La plupart des scripts sont en LUA pour accéder aux variables de Domoticz (sans passer par l'API HTTP) et réaliser les traitements et le parsing JSON

Les actions liés aux actions d'un interrupteur sont écrites en bash notamment les commandes radio.

LUA

La documentation se trouve ici et la liste des commandes spéciales ici

Remarque : Domoticz interrompt un script qui dure trop longtemps (> 10 secondes); ainsi les scripts LUA appellent des coroutines pour continuer le traitement malgré l'alerte

Scripts

Présence de smartphones (Via Orange)

Ce script vérifie l'état des smartphones et mets à jour l'interrupteur Alarme dans Domoticz. Cela est utilisé pour déclencher des actions lorsqu'il n'y a personne à la maison comme couper les interrupteurs.

Le script est plus précis que le ping de smartphone, il utilise l'API exposé par la Livebox Orange qui maintiens la liste des périphériques connectés. L'ancien script réalisait un ping des smartphones connectés, mais il y avait 2 problèmes :

  • Les smartphones étaient en DHCP, ils pouvaient donc changer d'adresses IP à tout moment. Cela aurait pu être corrigé en affectant des IP statiques.
  • L'iPhone désactive le Wifi et ne répond plus au ping lorsque l'écran est éteint.

Ce script appelle périodiquement l'API pour recevoir l'état des smartphones; ensuite il change l'état de l'interrupteur Alarme dans Domoticz, si celui ci a changé.

La commande est gérée par le script :

Script LUA

Le script LUA est déclenché périodiquement.

Il récupère la UserVariables suivante :

 at_home_mac_adresses : la liste des adresses MAC des périphériques à superviser. Les adresses sont visibles dans la liste des périphériques dans l'admin de la livebox. Le séparateur est ";"
 at_home_invite : le flag "mode invité". Si celui ci est à `true`, l'alarme n'est pas activée, même si aucun smartphone n'est détecté

Le script est découpé en plusieurs étapes :

  • lance les commandes http de l'API de la Livebox via la commande curl et

    • Liste les périphériques réseau connectés à la Livebox
  • S'il n'y a aucun smartphone actif ET que la dernière activité est ancienne de plus de 15 minutes ET que at_home_invite est à false :

    • le script met à jour un compteur dans un fichier temporaire
    • Si le compteur est supérieur à 5
      • lance les commandes http de l'API de Domoticz via la commande curl et met à jour l'état de l'interrupteur alarme à On.
  • Sinon, le script supprime le compteur dans ce fichier temporaire

    • lance les commandes HTTP de l'API de Domoticz via la commande curl et met à jour l'état de l'interrupteur alarme à Off.

Liste des périphériques connectés à la Livebox

  • La liste des périphériques est reçue du service /sysbus/Devices:get. L'API recueille l'état du périphérique (active ) pour chacun des périphériques listés. Cependant, le périphérique peut être encore considéré comme actif même lorsqu'il n'est plus connecté au WiFI. L'état est complété d'une comparaison entre l'attribut LastChanged du périphérique (en UTC) et la date courante.

Mise à jour de l'interrupteur Alarme dans Domoticz

Une fois l'état courant des smartphone, il reste à le comparer à l'état d'Alarme dans Domoticz; s'ils sont différents, le script met à jour l'interrupeur d'Alarme

Remarque : La mise à jour de l'interrupteur déclenche le traitement suivant


Commande Orange LiveBox Player

Cette commande permet de démarrer la Livebox Player Orange, choisir CanalSat et afficher la chaîne paramétrée. Ce script est utilisée comme réveil et démarrer la télévision le matin.

La commande est réalisée dans un script LUA

Le script LUA est de type script_device et donc déclenché à chaque changement de statut d'un interrupteur. Les actions sont exécutées lorsque l'interrupteur Livebox Player passe à l'état ON.

Il récupère les UserVariables suivantes :

 ip_livebox_tv : IP de la livebox TV
 tv_channel : Chaine télé à afficher

puis appelle une fonction dans une coroutine pour ne pas être interrompu par Domoticz car son temps d'exécution dépasse 10 secondes.

Le script les commandes http de l'API du Player via la commande curl.

La séquence est donc la suivante :

  • on/pff pour allumer le player
  • volume - x3 pour attendre la chaine avant de mettre le son
  • Enfin appuyer sur les chiffres pour sélectionner la chaine :
    • 1
    • 0
    • 2
  • volume + x3 pour mettre le son

Commandes Livebox Player

Les commande ont la forme http://ip_livebox_tv:8080/remoteControl/cmd?operation=01&key=code_touche&mode=numéro_mode

 numéro_mode :
      0 : envoi unique de touche
      1 : appui prolongé de touche
      2 : relacher la touche après un appui prolongé

 code_touche :
      116 : ON/OFF
      512 : 0
      513 : 1
      514 : 2
      515 : 3
      516 : 4
      517 : 5
      518 : 6
      519 : 7
      520 : 8
      521 : 9
      402 : CH+
      403 : CH-
      115 : VOL+
      114 : VOL-
      113 : MUTE
      103 : UP
      108 : DOWN
      105 : LEFT
      116 : RIGHT
      352 : OK
      158 : BACK
      139 : MENU
      164 : PLAY/PAUSE
      168 : FBWD
      159 : FFWD
      167 : REC
      393 : VOD

Statut Livebox Player

Les commande ont la forme http://ip_livebox_tv:8080/remoteControl/cmd?operation=10

le résultat est de la forme :

 {
     "result": {
         "responseCode": "0",
         "message": "ok",
         "data": {
             "osdContext": "CANAL",
             "macAddress": "22:64:D9:E0:09:C2",
             "wolSupport": "0",
             "friendlyName": "décodeur TV d'Orange",
             "activeStandbyState": "0"
         }
     }
 }

avec

 activeStandbyState :
      0 : télévision active
      1 : télévision éteinte

Commande Interrupteurs Chacon DI/O

Cette commande permet d'allumer ou éteindre les interrupteurs Chacon. Ce script est utilisé sur les actions on et off des interrupteurs déclarés dans Domoticz

La commande est exécutée par le script LUA script_device_radio_chacon

Le script est paramétré sur les interrupteurs Salon,Lampes Chambre avec les paramètres suivants :

Le script appelle l'API de commande du docker radio. Celle ci lance le script radioEmission (cf. ici pour piloter l'émetteur radio du Raspberry Pi)


Alarme

Ce script est attaché à l'interrupteur Alarme mis à jour avec le script Présence des smartphones.

Ce script LUA est de type script_device et donc déclenché à chaque changement de statut d'un interrupteur. Les actions sont exécutées lorsque l'interrupteur Alarme change d'état.

Il récupère les UserVariables suivantes :

 free_sms_user : Utilisateur FreeMobile
 free_sms_pass : Mot de passe FreeMobile

Si l'alarme est activée :

  • Un SMS est envoyé sur le portable de l'utilisateur paramétré
  • Les interrupteurs Lampe 1 et Lampe 2 sont désactivés
  • Le scénario Arrêter télévision est activé

Si l'alarme est désactivée :

  • Un SMS est envoyé sur le portable de l'utilisateur paramétré
  • S'il est moins de 22h30
    • Le scénario Démarrer télévision est activé
  • Sinon :
    • Le scénario Bonne nuit est activé

Réveil matin

Ce script LUA est de type script_time et donc déclenché toutes les minutes.

Il récupère les UserVariables suivantes :

 reveil_heure : Heure de réveil
  • Si l'heure paramétrée est l'heure courante le script appelle la fonction lancementReveil()

Cette fonction vérifie que l'on est en semaine (jour courant différent de Samedi et Dimanche), que ce n'est pas un jour férié (jour courant différent de la liste des jours fériés) et que l'alarme n'est pas activée.

  • Si c'est le cas :
    • Le scénario Bon matin est activé
  • Sinon :
    • Un log indique l'annulation du script

Recherche des jours fériés

Une fois par an, le script recherche la liste des jours fériés de l'année. Pour cela, il appelle l'API holiday de tuxx.co et stocke le résultat dans un fichier.

Le résultat est un fichier JSON de la forme suivante :

 [
     {
         "holiday": "Jour de l'an",
         "date_start": "2017-01-01",
         "date_end": "2017-01-01",
         "type": "holiday",
         "region": "France"
     }
 [...]
 ]

Il est ensuite utilisé pour vérifier que le jour courant n'est pas dans cette liste.

Pour ne déclencher la mise à jour et ne pas spammer l'API, le script vérifie la date de dernière mise à jour du fichier qui stocke les données résultant de l'API. Si l'année est l'année courante, il est inutile d'appeler l'API; sinon, l'API est appelée et le fichier est mis à jour, modifiant la date de dernière mise à jour.


Remise à zéro des statuts

Ce script LUA est de type script_time et donc déclenché toutes les minutes.

Comme les interrupteurs n'ont pas de retour d'état, il est impossible (pour le moment) de connaitre exactement l'état des interrupteurs. Par exemple, les actions via la télécommande changent l'état sans que Domoticz en soit informé.

Ce script permet de mettre à jour les interrupteurs dans l'état où ils sont logiquement dans le cas d'actions lors de scénarios :

  • La nuit, si l'alarme est à On (personne à la maison), désactivation de l'interrupteur Cuisine

  • Les forcages d'état unitaires sont déclenchés directement par DomoticZ en planification sur les interrupteurs


Lecture de température et d'humidité

Ce script LUA est de type script_time et donc déclenché toutes les minutes.

Ce script appelle le module temperature via l'API receptionDHT11

Celui ci indique en réponse les valeurs de température et d'humidité sous la forme JSON suivante :

 {
    "temperature":"32.0",
    "humidite":"23.0",
     "log":"Humidite = 32.0 %, Température = 23.0 *C "
 }

Le script vérifie la validité des valeurs remontées car il y a beaucoup d'erreurs (humidité > 100% ou une température > 40°C), ou encore avec une variation beaucoup trop importante par rapport à la valeur précédente (+ 30%). Dans ce dernier cas, la nouvelle valeur est plafonnée à 30% de l'ancienne valeur pour lisser le changement de valeur.

Une fois le calcul réalisé, la valeur est publiée sur Domoticz en mettant à jour le capteur Température+Humidité dont l'id est donné par la variable Domoticz interrupteur_id_dht11

La valeur de l'interrupteur est définie de la manière suivante :

 id_dht11|0|valeur_temperature;valeur_humidité;1

Lecture du capteur de présence PIR

Ce script Shell est un script démon qui est en constante utilisation.

Ce script appelle le programme GPIO de la librairie [WiringPi}(https://github.com/vzwingma/domotique/tree/master/wiringPi)

Celui ci indique en réponse la présence ou l’absence d'une personne avec O ou 1.

Ce script doit être très réactif et ne peut pas attendre l'intervalle d'exécution de Domoticz à 1 minute. Ainsi, ce script lit sans arrêt la valeur du capteur de présence et dès que la valeur change, il appelle le service REST de Domoticz pour publier le changement de valeur.