powershell et airparif

A l’instar de ce qui avait été fait ici https://easydomoticz.com/domoticz-prend-lair-de-paris-avec-airparif/ avec Airparif et Python , retrouvez ici le portage sous Windows et  powershell.

Généralités

Le site Airparif.com met à notre disposition les mesures de pollution de la capitale pour 4 indices de pollution : indice global, NO2, O3 et pm10 (particules) allant de 0 faible à 100 très élevé.

Résultat de recherche d'images pour "pollution paris"

L’appel de l’ API airparif sous ce format http://www.airparif.asso.fr/appli/api/indice?date=jour vous renvoie un tableau de valeurs contenant les indices recherchés au format JSON.
Un peu de parsing JSON (dépiautage en français) , quelques widgets % dans Domoticz et c’est réglé.

Domoticz

Créez 4 widgets virtuels pourcentage et nommez les indice, NO2, O3, pm1 et notez soigneusement leurs idx respectifs.

Airparif_Domoticz_1

Airparif_Domoticz_2

Le script

Il faudra y définir les données de Domoticz et les indices respectifs de nos widgets.

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

# --- les adresses Domoticz user/pass --------
$domoticz="http://127.0.0.1:8080"
$user=""
$pass=""
#------------------------------------------



# --- les idx des widget pourcentag pour les indices --------
# mettez vos propres idx à la place de 13,12,11,10
# pour l'indice global, puis l'indice NO2, le 02 et enfin les pm10
  
$idx = @{
        "dz_indice_global"="13";
        "dz_indice_NO2"="12";
        "dz_indice_O3"="11";
        "dz_indice_pm10"="10"
        }


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

$url_airparif="http://www.airparif.asso.fr/appli/api/indice?date=jour"


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




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

function majdomoticz($idx,$val)
{

# ----- L url pour ecriture dans un widget pourcentage DZ ----
#http://IP:PORT/json.htm?type=command&param=udevice&idx=mon_idx&svalue=POURCENTAGE

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

#------------------------------
$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}

}

#--------------- recup des idx configures plus haut ----------
$idx_glob=$idx.Get_Item("dz_indice_global")
$idx_NO2=$idx.Get_Item("dz_indice_NO2")
$idx_O3=$idx.Get_Item("dz_indice_O3")
$idx_pm10=$idx.Get_Item("dz_indice_pm10")
#--------------- ---------------------------------------------

if ($debug-eq 1)  {
write-host "Les indices" $idx_glob $idx_NO2 $idx_O3 $idx_pm10

}

#--- Fonction d'interrogation de L'API airparif et recup de la couleur  dans des variables globales pour appel de la fonction de
# mise à jour de Domoticz 
# les 
#-----------------------

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

Try {
    $infos_airparif = ConvertFrom-Json -InputObject $airparif_json 
       #$infos_airparif
        $global:valeur_indice_global=$infos_airparif.global.indice
        $global:valeur_indice_no2=$infos_airparif.no2.indice 
        $global:valeur_indice_o3=$infos_airparif.o3.indice    
        $global:valeur_indice_pm10=$infos_airparif.pm10.indice   
        
    }
Catch {
# si il y a une erreur sur l'appel de l'adresse de airparif.com on affiche 100% dans les widgets
        $global:valeur_indice_global="99.99999"
        $global:valeur_indice_no2="99.999999"
        $global:valeur_indice_o3="99.999999"
        $global:valeur_indice_pm10="99.99999"

       }
       
   
     if ($debug-eq 1)  {
     
        write-host "indice glob: "$global:valeur_indice_global
        write-host "NO2 : "$global:valeur_indice_no2
        write-host "03: "$global:valeur_indice_o3
        write-host "pm10: "$global:valeur_indice_pm10
     }
 
}
#---------------------------------------
interroge_airparif

majdomoticz  $idx_glob $global:valeur_indice_global
majdomoticz  $idx_NO2 $Global:valeur_indice_no2
majdomoticz  $idx_O3 $global:valeur_indice_o3
majdomoticz  $idx_pm10 $global:valeur_indice_pm10

En cas de non réponse de Airparif les valeurs affichées dans les widgets seront 100 (99.9999 dans le script)

Il faudra placer ce script dans le planificateur de tâches  Windows afin de la lancer au moins une fois par jour afin d’obtenir nos indices

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 2

Voici la suite d’un billet paru ici https://easydomoticz.com/maison-pilotee-domoticz-windows-sait-tweeter concernant l’ajout de la fonction twitter à Domoticz sous Windows grâce aux Powershell.

Nous y avons vu la mise en place des autorisations twitter et de la mise en place du module PS associé.

Maintenant la commande Send-Tweet permet d’envoyer un message à un utilisateur Twitter depuis votre compte.

Send-Tweet -Message '@utilisateur_twitter  Message_ Twitter'

Si vous n’indiquez pas d’utilisateur ce tweett est envoyé dans votre propre compte.

Ou une autre syntaxe :

Send-Tweet 'porte ouverte'
Send-Tweet alerte

Remarquez l’absence de guillemets si votre tweet ne contient qu’un seul mot sinon les simples guillemets sont obligatoires

ATTENTION – ATTENTION

AUCUN CARACTERE AUTRE QUE ALPHABETIQUE OU NUMERIQUE N’EST ACCEPTE DANS LE TWEET

DONC PAS DE tirets, points, caractères 100 % français (éàè…)

ATTENTION – ATTENTION

Dans ce cas le tweet n’est pas recu

Les scripts .bat et .ps1

Comme nous avions vu dans d’autres billets il nous faudra un fichier en .ps1 contenant nos instructions powershell et un lanceur en .bat pour Domoticz.

Mon fichier porte_ouverte_tweet.ps1 contient

Send-Tweet 'porte ouverte'

et porte_ouverte_tweet.bat contient le désormais classique :

Powershell.exe -WindowStyle hidden  -nologo -executionpolicy remotesigned -Command « & ‘C:\Program Files (x86)\Domoticz\scripts\powershell\porte_ouverte_tweet.ps1′ »

Domoticz

Affectez au action on /action Off l’appel de votre script .bat

Domoticz_action_on

et voila

Domoticz_twitter

Lors de vos tests n’oubliez pas que Twitter refuse de publier un tweet dont le message est identique à un précédemment reçu. Prenez l’habitude de changer votre message à chaque envoi.

Vérifiez que dans la fenêtre Powershell qui s’ouvre il n’y ait pas de messages d’erreur en rouge et vérifiez dans Powershell ISE que votre script fonctionne.

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/

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/