La gestion des couleurs de tarifs EDF avec l’API domogeek et les powershells

Voyons ici un exemple d’illustration des scripts Powershell (PS) avec un exemple basé sur la récupération de la couleur du tarif TEMPO EDF et son affectation à un Widget Texte de Domoticz.

Il ne s’agit que de la transposition de cet article ci destiné au Raspberry sous Linux en PS Windows.

Rappels

domogeek.entropialux.com  met à notre disposition un jeu d’API permettant de recevoir une foule de choses utiles pour piloter notre domotique.

Comme :

  • savoir si en zone C on est en vacances !
  • si nous sommes en Week End,
  • récupérer la géolocalisation d’une ville,
  • le tarif EJP EDF,
  • le tarif Tempo EDF,
  • la liste des fêtes du calendrier,
  • les levers et couchers du soleil,
  • l’état de vigilance Méteo France (jaune,rouge orange pour chaque risque) …

C’est parfaitement documenté, hyper clair, simple : le bonheur !

Principe

En appelant une simple url bien formatée on reçoit en retour la réponse attendue.

La documentation nous dit que

http://domogeek.entropialux.com/tempoedf/now nous renvoie ‘bleu’

que

http://domogeek.entropialux.com/tempoedf/now/json nous renvoie {« tempocolor »: « bleu »}

Il suffira donc de récupérer cette valeur et de l’affecter à un widget texte Domoticz.

A noter que la couleur du lendemain peut être obtenue par http://domogeek.entropialux.com/tempoedf/tomorrow/json.

Coté Domoticz

Il faudra créer un widget virtuel TEXTE et récupérer son idx dans les dispositifs.

idx_domoticz

Le script PS

Comme d’habitude adaptez la partie des paramètres à votre configuration , user et pass restent à vide si vous n’avez pas authentification dans votre Domoticz, et adaptez l’idx à celui du widget texte.

Le debug à 1 affiche quelques valeurs d’url et de variables.

#---PARAMETRES-----------------------

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


$url_domogeek="http://domogeek.entropialux.com/tempoedf/now/json"



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


#--- FIN DES PARAMETRES-----------------------



#--- Fonction d'ecriture en vers Domoticz via url-------------------

function majdomoticz  
{

# ----- LEs url pour ecriture dans un widget texte DZ ----

$url1="/json.htm?type=command&param=udevice&idx="+$idx
$url2="&svalue="+$tempo_dgeek
$urldz=($domoticz+$url1+$url2)

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



#Invoke the web-request avec les headers d'authentification
#$json=Invoke-WebRequest -uri $urldz  -Headers $headers
try { $json=Invoke-WebRequest -uri $urldz  -Headers $headers } catch
     {
        $_.Exception.Response.StatusCode.Value__
        if ($_.Exception.Response.StatusCode.Value__-eq 201) {write-host "erreur authentification user/pass"}
     }

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


#recuperation depuis $infos_json avelc 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 retrourné="$Val_Retour}

}


#--- Fonction d'interrogation de L'API domogeek et recup de la couleur  dans $tempo_dgeek ------------
# ou d'une erreur eventuelle si on accede pas au site web

function tempo_domogeek
{
    try { $dgeek_json=Invoke-WebRequest -uri $url_domogeek}
    catch
     {
        $_.Exception.Response.StatusCode.Value__
        if ($_.Exception.Response.StatusCode.Value__ -eq 404) {write-host "erreur 404:  acces au site web"}
     }

Try {
    $infos_dgeek = ConvertFrom-Json -InputObject $dgeek_json 
    $tempo_dgeek=$infos_dgeek.tempocolor
    }
Catch {
    $tempo_dgeek="Erreur domogeek"
       }
       
   
     if ($debug-eq 1)  {
        write-host "la réponse de domogeek est :"$infos_dgeek
        write-host "la couleur du jour est: "$tempo_dgeek
     }
return $tempo_dgeek
  
}
#---------------------------------------


$tempo_dgeek=tempo_domogeek
majdomoticz 

Enregistrez ce script dans votre dossier de travail de vos scripts Domoticz , vérifiez avec Powershell ISE (voir articles précédents), le bon fonctionnement de celui ci.

Lancement du script via le planificateur de tâches Windows

J’ai expliqué en détail les manips dans un autre billet concernant le planificateur de tâches

En résumé on crée un fichier .bat de ce type

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

qui, on le voit, appelle le fichier powershell ci-dessus

Et on lance le fichier bat à intervalles réguliers via le planificateur de tâches, typiquement une fois par jour suffit.

 

couleur_edf Résultat de recherche d'images pour "thumbs up"

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/

Utiliser le planificateur de Tâches Windows pour les scripts Powershell

Toujours à la découverte de Domoticz sous Windows voyons ici comme ajouter un script Powershell (ps1) dans le planificateur de tâches Windows pour en assurer l’exécution à intervalles réguliers.

Les script Powershell et le lanceur associé.

Nous avions vu dans un épisode précédent que pour permettre facilement de lancer un PS j’utilise un fichier en .bat du même nom qui contient tout ce qui faut pour que le PS se lance.

Exemple de fichier bat :

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

C’est ce fichier bat qu’il faudra lancer via le planificateur.

Le planificateur.

Sachez que il faudra un compte d’administrateur possédant un mot de passe (les password vide ne sont pas acceptés par défaut)

Dans le panneau de configuration et dans les outils d’administration vous trouvez le planificateur de tâches.

planif_windows_1

Utilisez le menu à droite « Créer une tâche ».

Dans l’onglet Général

En :

  • 1 Nommons la tâche
  • 2 Autorisons nous à lancer le script même si il n’y à pas de session ouverte
  • 3 Donnons les droits maximaux à l’exécution du script .

planif_windows_2

Validons par « OK » puis dans l’écran qui suit :

planif_windows_3

  • Choisissiez tout en haut dans « Lancer la tâche » le « A l’heure programmée » (1) puis  la bonne fréquence (Une seule fois, Jour, Semaine , Mois).
  • Pour lancer la tâche toutes les X minutes chosissez « Chaque Jour »  (2)
  • Répétez la tâche toutes les 5 minutes (1,4…) et  « Indéfiniment » (3)
  • Éventuellement donnez une date de fin.

Validez puis allons dans l’onglet « Actions » (1)

planif_windows_4

  • Choisir « Démarrer un programme » vu que le reste est « déconseillé » !  (2)
  • Utiliser le bouton « Parcourir » pour aller chercher le script en .bat à lancer (3)
  • Validez et

 

  • Rendez vous dans l’écran des « Paramètres »   (1)
  • Cochez  « Exécuter la tâche des que ….  (2)
  • Décochez « Arrêter la tâche si elle s’exécute …. » (3) sinon ….

planif_windows_5

Validez tout ça

Windows vous demande de vous identifier avec votre mot de passe d’un compte administrateur.

Les mots de passe vide ne sont pas autorisés par défaut (sauf modifs dans la base de registre pour autoriser cela)

planif_windows_6

N.B Dans les actions on peut aussi indiquer comme ci-dessous :

Powershell.exe dans le programme à lancer et tous les paramètres qui sont dans le fichier en.bat sont passés dans les arguments y compris le chemin complet vers le fichier ps1.

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

 

planif_windows_8

Opération réussie !

 

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

Windows, Domoticz et Powershell : Utiliser JSON pour récupérer des données

Voici un nouvel article concernant l’utilisation de scripts Powershell destinés à Domoticz.

Je souhaite vous présenter ici la récupération de données issues de l’API Domoticz au format JSON.

Vous savez que en interrogeant Domoticz pour un matériel donné (par son idx) , renvoie une série de valeurs spécifiques à ce matériel.

Exemple : »http://192.168.1.81:8080/json.htm?type=devices&rid=126″ me renvoie les caractéristiques du matériel 126 au format JSON tel que ci dessous.

On voit Sunrise, Sunset, puis dans le bloc commençant par result BatteryLevel, Data, idx….

{
   "ActTime" : 1453670702,
   "ServerTime" : "2016-01-24 22:25:02",
   "Sunrise" : "08:29",
   "Sunset" : "17:56",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CustomImage" : 0,
         "Data" : "8.63%",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 12,
         "HardwareName" : "Motherboard",
         "HardwareType" : "Motherboard sensors",
         "HardwareTypeVal" : 23,
         "HaveTimeout" : false,
         "ID" : "0000044C",
         "Image" : "Computer",
         "LastUpdate" : "2016-01-24 22:24:32",
         "Name" : "Memory Usage",
         "Notifications" : "false",
         "PlanID" : "0",
         "PlanIDs" : [ 0 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : "-",
         "SubType" : "Percentage",
         "Timers" : "false",
         "Type" : "General",
         "TypeImg" : "hardware",
         "Unit" : 1,
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "126"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}

Ce que nous allons voir ici est la récupération via powershell de ces valeurs dans des variables.

Je veux donc récupérer Sunrise, BatteryLevel , Data et idx dans 4 variables.

Le script powershell

# indiquer ici l'url à interroger
$url="http://192.168.1.81:8080/json.htm?type=devices&rid=126"
$json=Invoke-WebRequest $url

#------------- # affiche les val json brutes
#decommentez la ligne ci-dessous pour voir les données recues de Domoticz
#Write-Host $json
#-------------

#------------- 
# Mettre les donnés dans $info_json, l'objet $json est converti 

$infos_json = ConvertFrom-Json -InputObject $json

#recuperation depuis $infos_json avec les libelles du JSON Domoticz

$Val_Sunrise=$infos_json.Sunrise
$Val_idx=$infos_json.result.idx
$Val_Batterie= $infos_json.result.BatteryLevel
$Val_Data= $infos_json.result.Data
Write-host $Val_Sunrise,$Val_idx,$Val_Batterie,$Val_Data

Une fois récupéré notre objet JSON dans $infos_json on va juste chercher la valeur souhaitée par appel de $infos_json.libelle_de_la _clé_JSON

Attention il faut absolument respecter la casse et l’orthographe des libelles renvoyés par Domoticz.

$infos_json.Sunrise
$infos_json.result.idx
$infos_json.result.BatteryLevel
$infos_json.result.Data

Remarquez que on va chercher idx, Data et BatteryLevel dans result.xxxx contrairement au champ Sunrise car ces 3 champs sont dans le pavé nommé result  dans le JSON renvoyé par Domoticz.

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/