Des scripts plus faciles pour Domoticz avec dzVents

Vous êtes sans doute nombreux à avoir vu passer l’info: depuis quelques semaines il existe un nouveau type de langage de scripts que l’on peut intégrer à Domoticz, les dzEvents de dannybloe.

Langage de script qui se veut plus simple et plus lisible que Lua et qui est une surcouche du Lua Domoticz. Ainsi le dzEvent sera « retraduit » en « vrai » Lua. L’idée est de faciliter la lecture/ecriture de scripts.

Vous trouverez donc ici la traduction à ma sauce et des débuts d’explications de ces ressources anglophones : http://www.domoticz.com/forum/viewtopic.php?f=23&t=10834&sid=b844044efb6fbeb0841881a164361a0c

et https://github.com/dannybloe/dzVents

Voici donc le pitch de dzEvents

Présentation

dzVents (|diː ziː vɛnts| raccourci pour Domoticz Easy Events) apporte un nouveau type de scripting dans Domoticz.

Vous pouvez gérer vos switches facilement,vous aurez un contrôle sur les scripts basés sur le temps avec un vrai planning, dzEvent vous apporte une API qui utilise toutes les informations de Domoticz issues de toutes les différentes tables de Domoticz.Plus de commandArrays complexes car dzEvent les encapsule tous y compris les écritures et lecture de vos périphériques.

Et cerise sur le gâteau la performance des scripts à été améliorée : si vous avez beaucoup de scripts Domoticz ne cherchera qu’une seule fois l’information pour vos script device et time au lieu de parcourir tous les scripts un par un.

Un exemple :

Imaginez que nous ayons un switch, qui à son changement d’état doit activer un autre switch si et seulement si la température d’une pièce est supérieure à une valeur niveau puis nous envoyer une notification

En dzEvent cela donne :

return {
    active = true, 
    on = {
        'Premier switch'
    },

    execute = function(domoticz, roomSwitch)

        if (roomSwitch.state == 'On' and domoticz.devices['Salon'].temperature > 18) then
            domoticz.devices['Autre switch'].switchOn()
            domoticz.notify('Ca marche!',
                            'J'ai eteint car il faisait trop chaud',
                            domoticz.PRIORITY_LOW)
        end

    end
}

Pas mal !

Remarquez la syntaxe du haut on = , c’est le déclencheur sur l’état de quelque chose.

Un autre exemple avec des dates/heures/jours, le on = est ici un timer

return {
    active = true,
    on = {
        ['timer'] = {'Every 10 minutes on mon,tue,wed,thu,fri'}
    },

    execute = function(domoticz)

        -- check time of the day
        if (domoticz.time.isDayTime and domoticz.variables['myVar'].nValue == 10) then
            domoticz.variables['anotherVar'].set(15)
            --activate my scene
            domoticz.setScene('Evening lights', 'On')
            if (domoticz.devices['My PIR'].lastUpdate.minutesAgo > 5) then
                domoticz.devices['Bathroom lights'].switchOff()
            end
        end         

    end
}

Voyez qu’ici toutes les 10 minutes les lundi,mardi,mercredi,jeudi,vendredi on va lire une variable MyVar et si elle est égale a 10 on met une autre variable nommée ‘AnotherVar’  à 15 et on active une scène ‘Evening lights’ et si le périphérique nommé PIR n’a rien vu bouger depuis 5 minutes on met Bathroom lights à off par un switchOff.

Simple et concis.

Voyons la mise en place.

Installation.

Note: Ceci n’est pas testé pour des machines  non-linux (Windows).  Je suis certain que vous aurez des problèmes (dixit dannybloe concepteur du script).

Récupérez la dernière version depuis  GitHub, décompressez la dans le dossier de vos scripts Lua (/domoticz/scripts/lua)

cd domoticz/scripts/
https://github.com/dannybloe/dzVents/archive/master.zip
unzip master.zip

Vous obtenez un dossier dzEvent-master, entrez à l’intérieur prenez en le contenu (copier) et recopiez le directement dans le dossier Lua (coller) pour obtenir cela  :

dzEvent_1

Supprimez dzEvent-master une fois que tout est fonctionnel.

En résumé, un dossier  dzVents,puis les fichiers dzVents contenant :

domoticz/
    scripts/
        lua/
            dzVents/
                ... <dzVents files> ...
                examples/ 
                tests/
            scripts/
            script_time_main.lua
            script_device_main.lua
            dzVents_settings.lua
            ... <other stuff that was already there> ...

Ouvrez le fichier  dzVents_settings.lua et placez vos ip et numéro de port Domoticz. Merci de vérifier que vous n’utilisez pas de user/password pour le réseaux locaux (127.0.0.1) dans la config de Domotic sinon dzVents ne pourra lire les valeurs de vos équipements !

Dans ces settings on peut régler le niveau de log souhaité, plus ou moins bavard, 3 étant le plus loquace et utile au tout départ afin de savoir si tout marche. Repassez le à 2 ensuite.

Le [‘Enable http fetch’] à placer à True ou False permet à dzVents d’interroger régilièrement Domoticz et de mettre à disposition des scripts dzVents toutes les valeurs de Domoticz d’un seul coup.

[‘Domoticz ip’] = ‘192.168.1.81’,
[‘Domoticz port’] = ‘8080’,
[‘Fetch interval’] = ‘every 30 minutes’, — see readme for timer settings
[‘Enable http fetch’] = true, — only works on linux systems
[‘Log level’] = 3
}

Le dossier nommé scripts devra contenir nos scripts dzVents, il suffit juste de les nommer en .lua, plus besoin de script_device, ou script_time…

Et tout de suite les logs Domoticz doivent vous donner trace de l’activité de dzEvents (ici avec niveau de log = 3)

LUA: Found otherdevices_utility adding this as a possible attribute
LUA: Found otherdevices_svalues adding this as a possible attribute
LUA: Found otherdevices_humidity adding this as a possible attribute
LUA: Found otherdevices_idx adding this as a possible attribute
LUA: Found otherdevices_dewpoint adding this as a possible attribute
LUA: Found otherdevices_temperature adding this as a possible attribute
LUA: Found otherdevices_lastupdate adding this as a possible attribute
LUA: Event in devicechanged: Memory Usage_Utility value: 7.7199997901917
LUA: Searching for scripts for changed device: Memory Usage
LUA: Event in devicechanged: Memory Usage value:
LUA: Searching for scripts for changed device: Memory Usage
LUA: Found otherdevices_utility adding this as a possible attribute
LUA: Found otherdevices_svalues adding this as a possible attribute
LUA: Found otherdevices_humidity adding this as a possible attribute
LUA: Found otherdevices_idx adding this as a possible attribute
LUA: Found otherdevices_dewpoint adding this as a possible attribute
LUA: Found otherdevices_temperature adding this as a possible attribute
LUA: Found otherdevices_lastupdate adding this as a possible attribute
LUA: Event in devicechanged: CPU_Usage value:
LUA: Searching for scripts for changed device: CPU_Usage
LUA: Event in devicechanged: CPU_Usage_Utility value: 1.4700000286102
LUA: Searching for scripts for changed device: CPU_Usage
LUA: Found otherdevices_utility adding this as a possible attribute
LUA: Found otherdevices_svalues adding this as a possible attribute

Bien maintenant que ça marche , continuons.

Si cela ne fonctionne pas vérifiez bien votre arborescence /domoticz/scripts/lua/dzevent avec le fichier de settings dans /lua

Mon premier script dzVents

Créons notre premier script :

Récupérez le nom exact d’un de vos switchs ici un capteur PIR nommé ‘Présence’ puis copiez ce script dans le dossier scripts (/domoticz/scripts/lua/scripts). Nommez le comme bon vous semble ici test.lua

Le script envoie une notification et affiche un message dans le log Domoticz lors de son passage à ON et envoie une notification lors du passage à OFF.

return {
    active = true,
    on = {
        'Présence'
    },
    execute = function(domoticz, switch)
        if (switch.state == 'On') then
            domoticz.notify('Alerte!', 'Capteur Presence à ON!',
            domoticz.PRIORITY_NORMAL)
         domoticz.log ('il y qq ds le salon')
        else
            domoticz.notify('Fin d'alerte', 'Plus rien à signaler',
            domoticz.PRIORITY_NORMAL)
        end
    end
}

le log affiche alors (en mode 3)

LUA: Found otherdevices_temperature adding this as a possible attribute
LUA: Found module in /home/pi/domoticz/scripts/lua/scripts folder: test
LUA: Event in devicechanged: Présence value: On
LUA: Searching for scripts for changed device: Présence
LUA: Handling events for: "Présence", value: "On"
LUA: =====================================================
LUA: >>> Handler: test
LUA: >>> Device: "Présence" Index: 157
LUA: .....................................................
LUA: il y a qq ds le salon
LUA: .....................................................
LUA: <<< Done
LUA: -----------------------------------------------------
LUA: [1] = SendNotification: Alerte!#Capteur Presence à ON!#0#pushove
LUA: =====================================================
Notification sent (email) => Success
Notification sent (http) => Success
EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_device_main.lua
2016-03-28 14:42:45.330 (Z-Stickusb11) Light/Switch (Présence)

Voila, après cette première étape nous découvrirons d’autres fonctionnalités dans de prochains articles.

P.S : il y a un dossier examples dans le dossier dzVents contenant quelques fichiers exemple, n’hésitez pas à les ouvrir pour vous en inspirer.

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/

Un éditeur de scripts Lua intégré à Domoticz

Les contributeurs au développement de Domoticz nous font commencer l’année avec une belle évolution; à savoir : un éditeur de scripts Lua intégré directement à Domoticz ainsi que la conservation de ces nouveaux scripts Lua dans la base de données de Domoticz.

La version V2.4025 apporte ces modifications.

L’éditeur de scripts

L’éditeur de scripts autrefois destiné aux scripts Blockly vient donc d’évoluer en apportant un éditeur Lua intégré.

Maintenant lors de la création d’un script nous aurons le choix entre la création d’un Blockly ou d’un Lua

ed_lua

On accède à l’éditeur via « Réglages »/ »Plus d’options »/ »Evénements ».

 

Le sélecteur permet de choisir le type de script Lua ou Blockly et d’affecter une catégorie entre Device, security, time,variables , ces type correspondent au types d’événements déclencheurs de scripts Lua dans Domoticz . c.f la référence aux noms usuels des scripts Lua : script_devices, script_security, script_time et script_uservariable

Un autre type nommé « All » déclenche le script en question dès que N’IMPORTE LEQUEL DES EVENEMENTS SE PRODUIT (toutes les minutes, au changement d’une variable, à une mise à jour d’un périphérique, au changement d’état du panel de sécu), donc en fait en permanence ou quasiment.

  • Lors de la rédaction de nos scripts Lua une  liste de sélection de mots apparait dés lors que vous tapez quelque chose, (auto-complétion) vous y retrouverez les noms de vos matériels Domoticz , les mots clés Lua, vos fonctions…

 

ide_lua2

  • Il supporte le drag& drop de texte.
  • Le masquage/déroulement de fonctions par les flèches à droite des numéro de ligne, dont le repliement est marqué par un indicateur violet tout à droite.ide_lua32
  • Les lignes sont numérotées et en bout de ligne un marqueur rouge error indiquera que la ligne en cours n’a pas une syntaxe correcte.
  • Sous Firefox, mais pas sous Chrome, le clic droit permet de changer le thème de fond et d’inactiver l’auto-complétion.
  • Plein de raccourcis clavier existent, la liste complète ici https://github.com/ajaxorg/ace/wiki/Default-Keyboard-Shortcut  (merci Vil1Driver)

Ces scripts sont dorénavant conservés dans  la base de données de Domoticz (table EventMaster)

N.B Vos anciens scripts Lua (ceux de /domoticz/scripts/lua) NE sont pas concernés, ils ne sont pas éditables ici, ni conservés dans la base de données.

Recopiez les ici par des copier/coller si besoin.

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/

Mon premier script Lua dans Domoticz : La mise en oeuvre

Cet article fait suite à deux autres permettant de poser les bases du langage Lua dans Domoticz.

Le premier  (https://easydomoticz.com/point-scripts-lua/)  décrivait quels étaient les principes de fonctionnement des script Lua.

Le second donnait quelques notions de langage.

Ici pour faire suite nous allons prendre un exemple que nous allons dérouler et complexifier étape par étape.

L’exemple que je souhaite détailler ici part du fait que je possède un capteur de luminosité, des volets roulants. Je voudrais que lorsque la luminosité descend en dessous de 170 et que il est plus de 17h30, fermer tous les volets automatiquement. 😯

fenetres_maison

N.B :Pour simplifier j’ai rassemblés tous (!) mes volets roulants au sein d’un groupe (une scène au sens Domoticz)  pour pouvoir les commander tous ensemble.

Dans un pseudo langage on pourrait écrire :

  • A chaque fois que la valeur de mon capteur de luminosité change

je regarde si il est plus de 17H30

ET si

elle est inférieure a 170

ALORS

je passe le groupe des volets à ON

Ce qui signifie qu’il nous faut un script basé sur les devices puisque je cherche à déclencher tout cela lorsque la luminosité change, il faudra récupérer la valeur de notre capteur , la comparer à un seuil, aller chercher l’heure actuelle la comparer à un seuil horaire, puis passer le groupe de volets à ON.

N.B : il y a un petit bug de conception car une fois que les volets vont être fermés, si j’allume puis éteint la lumière de mon salon, la luminosité va changer, il sera plus de 17h30 et on tentera de fermer les volets en permanence alors qu’ils le sont déjà.

Lire la suite

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/

Mon premier script Lua dans Domoticz : Les fondations

Nous avons vu précédemment https://easydomoticz.com/point-scripts-lua/ quels sont les principes de fonctionnement des script Lua au sein de Domoticz, voyons dans cet article les premières base de la rédaction de scripts puis nous prendrons un exemple que nous allons dérouler et complexifier de bout en bout afin de voir quelques instructions.

Les bases des scripts : Avoir les idées claires

idees

Avant toute chose, il faut que vous ayez les idées claires concernant les actions que vous devez réaliser, prenez un papier et un crayon et écrivez en français ce que vous devez faire.

Partant du fait que je possède un capteur de luminosité, des volets roulants que j’ai tous rassemblés dans un groupe (une scène au sens Domoticz)  pour pouvoir les commander tous ensemble, je voudrais que lorsque la luminosité descend en dessous de 170 et que il est plus de 17h30, fermer tous les volets.

 

Ce qui pourrait commencer à se traduire par :

  • A chaque fois que la valeur de mon capteur de luminosité change

je regarde si elle est inférieure a 170

ET si

il est plus de 17H30

ALORS

je passe le groupe des volets à ON

Ce qui signifie qu’il nous faut un script basé sur les devices puisque je cherche à déclencher tout cela lorsque la luminosité change, il faudra récupérer la valeur de notre capteur , la comparer à un seuil, aller chercher l’heure actuelle la comparer à un seuil horaire, puis passer le groupe de volets à ON.

N.B : il y a un petit bug de conception car une fois que les volets vont être fermés, si j’allume puis éteint la lumière de mon salon, la luminosité va changer, il sera plus de 17h30 et on tentera de fermer les volets alors qu’ils le sont déjà.

Lire la suite

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/

Le point sur les scripts lua de Domoticz

Vous le savez logo_domoticzincorpore le langage Lua

au même titre que  wc

ou bien fc

Essayons, nous aussi, de jouer avec et de préciser les bases de l’utilisation de ces scripts qui parfois déroutent les débutants.

Il ne s’agit pas ici de faire un cours de lua mais de détailler l’intégration de ces scripts dans Domoticz.

La page source sur le wiki Domoticz https://www.domoticz.com/wiki/Events#Using_the_events_system

Généralités

Il en existe de 4 types différents basés sur les événements qui surviennent sur le matériel, le temps, les variables, le panel de sécurité. Par événement on entend toute modification qui survient.

Il est important de comprendre (et je le répéterai)  que TOUS les scripts événements se déclenchent à toute modification sur l’événement correspondant (changement d’état d’un des matériels, toutes les minutes, à chaque changement d’une variable).

 

  • Tous les scripts Lua se trouvent dans le dossier domoticz/scripts/lua
  • Ils finissent par l’extension .lua sinon ils ne sont pas exécutés par Domoticz
  • Pour nos amis modifiant les fichiers sous Windows, enregistrez les en UTF8 sans BOM (Notepad++)
  • Ils n’ont pas besoin d’être chmodés (pas de chmod +x, +777) chrgp … non plus
  • Les scripts ne sont pas lancés en tache de fond, il sont lancés par Domoticz et n’ont que 10 secondes pour faire leur boulot, passé ce temps Domoticz les tue. En vertu de quoi évitez les sleep (20), d’interroger des services web qui répondent trop lentement …
  • Les noms à utiliser à l’intérieur des scripts sont ceux donnés dans la colonne Nom des périphériques, respectez EXACTEMENT l’orthographe majuscules/minuscules/espaces/accent. Et pour ne pas être embêtés bannissez les espaces/accents/caractères bizarres (‘/&…) en renommant votre matériel
  • Les valeurs reçues des capteurs ne sont pas modifiables via Lua, utilisez JSON
  • Tous les script doivent contenir un bloc commandArray={} puis return commandArray contenant les instructions à effectuer

Lire la suite

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/