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/

Domoticz sous Windows fait tweeter ma maison Partie 1

Continuons de découvrir le couple Powershell/Domoticz en illustrant l’envoi de twitts grâce à un script que nous pourrons déclencher par les action ON/Action Off.

Le point de départ est cette référence ici dont je vais traduire les explications en Français.

Twitter

Créez vous un compte si ce n’est déjà fait.

Un numéro de téléphone est obligatoire dans votre profil Twitter, Complétez le maintenant , c’est dans le profil puis « Paramètres » puis dans le menu « Mobile ».

Gestion des authorisations

twitter_Domoticz_1

  • Remplissez les champs obligatoires avec n’importe quoi mais indiquez http://le_nom_d_un_vrai_site_web.tld (http:// obligatoire)

twitter_Domoticz_create_app_2

  • Validez et créez l’appli

twitter_Domoticz_3Si vous avez le message

twitter_Domoticz_4Relisez ce qui est marqué tout en haut de cette page sous le titre Twitter et le numéro de téléphone obligatoire.Lire la suite

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

Windows, Powershell : Envoyer des données vers Domoticz

Domoticz, Windows et Powershell piloter les équipements par script

Continuant l’écriture de quelques scripts Powserhell (PS) dans Domoticz, et après avoir vu les bases,  découvrons ici comment utiliser le curl des Powershell pour envoyer des données vers Domoticz via l’API JSON et mettre à jour nos widgets du tableau de bord.

Bien entendu le format de l’API JSON est le même que l’on soit sous Linux ou Windows©, la page de référence se trouve ici http://www.domoticz.com/wiki/Domoticz_API/JSON_URL’s

L’utilisation de cette API à été détaillée ici à plusieurs reprise et juste pour rappel cela consiste à envoyer une chaine de caractères bien formatée vers l’adresse ip de Domoticz.

Page avec illustrations ici https://easydomoticz.com/manipuler-les-donnees-json-de-domoticz-en-shell/

Il faudra donc se munir de l’idx du périphérique que l’on veut valoriser et du formatage de la chaine à envoyer, en effet on ne pilote pas un interrupteur comme on pilote un widget de température.

Dans ce qui suit je vais prendre comme exemple l’activation d’un interrupteur.

Le script Powershell.

Résultat de recherche d'images pour "powershell script"

Voici le script PS , copiez le dans  Powershell ISE, ajustez vos variables adresse de Domoticz, idx à activer , éventuels user/pass (laisser à vide si il n’y a pas d’authentification dans votre Domoticz), lancez le script par le flèche verte en haut de ISE et regardez les messages en rouge qui peuvent d’afficher en bas.

 

La variable debug à 1 affiche les url envoyées vers DZ et les messages de retour

# --- les adresses Domoticz user/pass  et l'idx à activer --------
$domoticz="http://127.0.0.1:8080"
$user="patrice"
$pass="123456"
$idx="3"
#------------------------------------------

# -----debug a 1 pour afficher qq messages, 0 sinon ----
$debug=0
#------------------------------


#------------------------------


$pair = "${user}:${pass}"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$headers = @{ Authorization = $basicAuthValue }


$url1="/json.htm?type=command&param=switchlight&idx="+$idx
$url2="&switchcmd=On"
$urldz=($domoticz+$url1+$url2)

#Invoke the web-request avec les headers d'authentification

try { $json=Invoke-WebRequest -uri $urldz  -Headers $headers } catch
     {
        $_.Exception.Response.StatusCode.Value__
        if ($_.Exception.Response.StatusCode.Value__-eq 401) {write-host "erreur authentification user/pass"}
     }

     
# recup reponse JSON
$infos_json = ConvertFrom-Json -InputObject $json


#recuperation depuis $infos_json avec les libelles Domoticz
$Val_Retour=$infos_json.status
if ($debug-eq 1)  {
Write-Host "url Domoticz=" $urldz
Write-Host "message Json="$json
Write-host "Status retourné="$Val_Retour}

Vous remarquerez que j’ai abandonné le « curl » au profit du Invoke-WebRequest plus canonique en Powershell.

Lancement régulier via planificateur de tâches

Bien entendu il faut utiliser le planificateur Windows pour lancer ce script à la fréquence souhaitée.

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

Domoticz Windows et Powershell : Envoyer un SMS via Free

Quelques articles existants:

https://easydomoticz.com/domoticz-et-windows-les-scripts-powershell-1

https://easydomoticz.com/domoticz-et-windows-les-scripts-powershell-2

permettent de vous familiariser avec l’écriture de scripts Powershell (PS) sous Windows et surtout leurs appels au sein des champs Action On/Action Off de Domoticz.

Voyons ici comment utiliser les service d’envoi de SMS de chez Free (accessibles aux abonnés uniquement) depuis Windows.

Un article ancien décrivait l’activation de ce service chez Free et il reste valable encore à ce jour.

Nous ne verrons ici que la partie script powershell spécifique à Windows.

Le Script Powershell.

Sous Linux, la commande  qui permet d’appeler une url se nomme curl.

En powershell, la commande  qui permet d’appeler une url se nomme curl aussi. :mrgreen:

Testons en ligne de commande powershell  en ouvrant tout d’abord une invite de commande DOS puis en tapant powershell

ps_1

Puis tapons

curl  "https://smsapi.free-mobile.fr/sendmsg?user=4745125&pass=DD44DCQQAECGH145541nWhNe&msg=Mon message !"

Un message arrive sur le téléphone, PS montre ceci  avec un StatusCode 200 OK:

ps_3Plaçons le bout de code dans un fichier smson.ps1, puis créons, comme nous l’avons vu dans un précédent article, un lanceur de ce ps1 en .bat.

Je crée donc un smson.bat dans mon dossier scripts/powershell qui contient :

Powershell.exe -WindowStyle hidden  -nologo -executionpolicy remotesigned -Command "& 'C:\Program Files (x86)\Domoticz\scripts\powershell\smson.ps1'"

J’ai pris l’habitude de nommer de la même façon le .ps1 et le .bat, cela simplifie le débogage.

L’interrupteur virtuel.

Si vous avez suivi les autres articles vous avez compris qu’il faut appeler le fichier .bat au sein du Action On/off de l’inter.ps_4

Certains 😛 souhaiteraient avoir la date et l’heure de l’envoi du SMS.

La commande est Get-Date

Le code PS devient :

$startTime = Get-Date
curl  "https://smsapi.free-mobile.fr/sendmsg?user=cx045511xsdg&pass=hjDdxxxfffggeessse&msg=Porte Ouverte à $startTime"

Ca marche pas !

Déjà un bon point de repère est l’ouverture de la fenêtre Powershell, si vous ne l’obtenez pas vérifiez les noms dans l’inter et dans le fichier .bat.

Testez vos scripts depuis PS_ISE  ou la ligne de commande en mode powershell et allant dans le répertoire des scripts pour lancer vos script.

Un lecteur me signale que  »

Pour les Utilisateurs sous Seven, ne pas oublier de mettre à jour NetFramework puis passer à la version Powershell 4
(La version 2 d’origine sous Seven ne connait pas la commande CURL.) »

Merci encore

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

Domoticz et Windows : Les scripts powershell, partie 2

Les utilisateurs de Domoticz sous Windows seront sans doute heureux (?) de trouver ici quelques articles concernant l’écriture de scripts sous Windows™.

Partant de l’idée que vous êtes nombreux à utiliser des Windows 7/8/9/10 je vais utiliser le langage Powershell qui est présent pour ces versions.

Les Vieux XP installeront les Powershell 2 comme expliqué ici http://syskb.com/comment-installer-et-executer-powershell-sur-un-systeme-windows/

Il ne s’agit pas ici de faire un cours de powershell mais de découvrir quelques fonctions utiles au travers d’exemples pratiques.

Bon c’est ici que ça va se compliquer un peu, non pas pour la rédaction des scripts Powershell dont la doc est dispo partout sur Internet , mais pour autoriser le lancement de ces scripts par Domoticz.

La méthode décrite ici est purement empiriquement issue de mes tests, succès, échecs.

Je suis à l’écoute de toutes vos remarques sur la technique en question.

Objectif

Pouvoir lancer un script Powershell via des action On/Action Off d’un interrupteur virtuel.

Création d’interrupteurs virtuels

Depuis le menu « Réglages » et « Matériel » ajouter le matériel virtuel, littérature ici. et en l’occurrence nous aurons juste besoin d’un interrupteur pour lancer notre script manuellement par un clic (ou de le programmer à intervalles régulier via le planning du bouton).

Affectation d’un script à un Action On/off

Un billet récent en expliquait la technique , info ici https://easydomoticz.com/domoticz-et-windows-scripts_et_action_on_action_off/

Il faut utiliser script://scripts\powershell\Backup_Domoticz.ps1

La commande Domoticz est script:// puis on indique le chemin vers le fichier batch, les dossiers sont séparés par des antislashes.

l tendance naturelle serait de mettre script://scripts\powershell\Backup_Domoticz.ps1

ps_script_domoticz

Ceci ne fonctionne pas.

On voit effectivement une fenêtre Powershell s’ouvrir puis un message d’erreur qui s’affiche nous informe (ça dure 1/4 de seconde) qu’ il y a une erreur dans le chemin du fichier. En effet powershell va chercher le fichier Backup_Domoticz.ps1 dans C:\Program Files (x86)\Domoticz et comme il y a une espace dans le nom du dossier , ca coince.

Le remède

après moult tests, la solution miracle fut de créer un .bat qui appelle le .ps1

Le contenu du fichier .bat lanceur est le suivant :

Powershell.exe -WindowStyle hidden  -nologo -executionpolicy remotesigned -Command "& 'C:\Program Files (x86)\Domoticz\scripts\powershell\Backup_Domoticz.ps1'"

On appelle Powershell en lui donnant le droit d’exécution de scripts et on lance la commande vers  C:\Program Files (x86)\Domoticz\scripts\powershell\Backup_Domoticz.ps1 en utilisant l’esperluette (j’adore) pour échapper les caractères espace.

Vous remarquerez que j’en ai profité pour essayer de masquer la fenêtre Powershell qui s’affiche systématiquement  par un nologo et WindowsStyle hidden mais sans succès, si vous savez pourquoi n’hésitez pas!

Je mets tous ça dans un fichier Backup_Domoticz.bat puis dans mon interrupteur je lance

ps_script_domoticz3

Conclusion

Quoique fastidieuse , la technique d’avoir systématiquement deux fichiers (un lanceur .bat et le script .ps1 lui même) permet vraiment d’apporter un plus à nos (vos)  install Domoticz sous Windows et d’atteindre un niveau de scripting qui est équivalent à celui du Raspberry.

Une bonne solution donc à adopter

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