_[OBSOLETE] Domoticz Scripts LUA - vzwingma/domotique GitHub Wiki
Cette page présente les scripts LUA et Bash définis pour Domoticz :
- Présence des smartphones
- Commandes de la télévision
- Commandes des composants Chacon DI.O
- Alarme
- Réveil-matin
- Remise à zéro des statuts
- Lecture de température et d'humidité
- TODO : Détection de la présence d'individus
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'interrupteuralarme
àOn
.
- lance les commandes http de l'API de Domoticz via la commande
-
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'interrupteuralarme
àOff
.
- lance les commandes HTTP de l'API de Domoticz via la commande
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 playervolume -
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
etLampe 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é
- Le scénario
- Sinon :
- Le scénario
Bonne nuit
est activé
- Le scénario
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é
- Le scénario
- 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'interrupteurCuisine
-
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.