[Store] Script - Etat des ouvertures pour notification

Discussion et échanges de scripts pour la box eedomus

[Store] Script - Etat des ouvertures pour notification

Messagepar influman » 10 Déc 2015 16:04

Suite aux différents échanges récents sur le sujet, je vous propose le script php suivant qui donne l'état des différentes ouvertures de la maison, et construit un message qui pourra être lu vocalement à votre guise.

1/ Il vous faut au préalable mettre vos codes API, et modifier le tableau des ouvertures pour chacun des cas de votre habitat
2/ Le script est au format PHP pour serveur classique (testé sur synology), il doit bien y avoir un bon samaritain sur le forum qui doit pouvoir le mettre à jour pour qu'il fonctionne au sein des scripts eedomus directement. A mon avis, il y a peu de changement.
3/ Cela génère un xml, il vous faut donc créer un capteur http, avec l'appel au script http://IP/getOuvertures.php, et le XPATH /OUVERTURES/MESSAGE pour avoir le message donc
4/ Mettez une mise à jour à 0 mn pour ce capteur http (polling)
5/ Créez une règle qui, à chaque fois qu'une de vos ouvertures devient ouverte ou fermée (change de valeur), met à jour le capteur http. Ainsi, à chaque changement d'état, le message indique ce qui est ouvert, précisément.
6/ Pour ceux qui ont un test à faire lors d'un armement alarme ou autre, il suffit de tester si au moins une des ouvertures est ouverte, et si oui, vous pouvez faire lire le message du capteur http.
7/ Si vous utilisez le bloc-notes, pensez à enregistrer le fichier php en encodage UTF-8

Version initiale "Script sur serveur déporté" :

Code : Tout sélectionner
<?php
   $xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>";      
   //***********************************************************************************************************************
   // V1.0 : Script qui fournit l'etat des ouvertures parametrees et le message vocal associe
   //*************************************** API eedomus ******************************************************************
   $api_user = "XXXXXX";
   $api_secret = "xxxxxxxxxxxxxxxx";
   //*************************************** Messages personnels***********************************************************
   $msg_allclosed = "Apres vérification, tout est bien fermé";
   $msg_open = "Je detecte que ";
   //*************************************** Tableau des ouvertures *******************************************************
        $tabouvertures = array(1 => array("TYPE" => "la porte du garage", "API" => "AAAAAA", "ETAT" => 0),
                2 => array("TYPE" => "la fenêtre de la chambre de Louis", "API" => "BBBBBB", "ETAT" => 0));
   $nbouvertures = 2;
   //**********************************************************************************************************************
   $xml .= "<OUVERTURES>";
   $idoors = 1;
   $nbouvert = 0;
   $annonce = $msg_allclosed;
   foreach($tabouvertures as $ouvertures) {
      $periphid = $ouvertures["API"];
      $urlValue =  "https://api.eedomus.com/get?action=periph.caract&periph_id=".$periphid."&api_user=".$api_user."&api_secret=".$api_secret;
      $arrValue = json_decode(utf8_encode(file_get_contents($urlValue)));
      if(array_key_exists("body", $arrValue) && array_key_exists("last_value", $arrValue->body)) {
         if ($arrValue->body->last_value == 0) {
            $ouvertures["ETAT"] = 0;
         }
         else {
            $ouvertures["ETAT"] = 1;
            $nbouvert++;
            if ($nbouvert == 1) {
               $annonce = $msg_open.$ouvertures["TYPE"];
            }
            else {
               $annonce = $annonce." et ".$ouvertures["TYPE"];
            }
         }
         $xml .= "<OUVERTURE_".$idoors."><TYPE>".$ouvertures["TYPE"]."</TYPE>";
         $xml .= "<ETAT>".$ouvertures["ETAT"]."</ETAT></OUVERTURE_".$idoors.">";
      }
      $idoors++;
   }
   if ($nbouvert == 1) {
      $annonce .= " est ouverte.";
   } else if ($nbouvert > 1) {
      $annonce .= " sont ouvertes.";
   }
   $xml .= "<MESSAGE>".$annonce."</MESSAGE>";
   $xml .= "</OUVERTURES>";
   header("Content-Type: text/xml");
   echo $xml;
?>


Image

Nouvelle version de Madoma73 "Script intégrable dans l'eedomus" :

Code : Tout sélectionner
<?php
   $xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>";     
   //***********************************************************************************************************************
   // V1.0 : Script qui fournit l'etat des ouvertures parametrees et le message vocal associe
   //*************************************** API eedomus ******************************************************************
   //*************************************** Messages personnels***********************************************************
   $urlBase="http://api.eedomus.com/get?api_user=API_USER&api_secret=API_SECRET&action=periph.caract&periph_id=";
   $msg_allclosed = "Apres vérification, tout est bien fermé";
   $msg_open = "Je detecte que ";
   $tabouvertures=array();
     
   // recuperation des ID depuis la requete
   $periphs=getArg("periphIds", $mandatory = true, $default = '');
   $resultPeriphId=getArg("resultPeriphId", $mandatory = false, $default = '');
   $tabPeriphs=explode(",", $periphs);

   //reset de l'indicateur 'portes ouverte'
   if ($resultPeriphId)
   {
      SetValue($resultPeriphId, 0);
   }
   
   // recuperation du nom des peripheriques
   foreach($tabPeriphs as $periphId)
   {
     $urlValue =  $urlBase.$periphId;
     $arrValue = sdk_json_decode(utf8_encode(httpQuery($urlValue,'GET')));
     $name=utf8_decode($arrValue["body"]["name"]);
     $lastValue=utf8_decode($arrValue["body"]["last_value"]);
     $tabouvertures[]=array("NAME" => $name, "API" => $periphId, "ETAT" => $lastValue);
   }

   //**********************************************************************************************************************
   $xml .= "<OUVERTURES>";
   $idoors = 1;
   $nbouvert = 0;
   $annonce = $msg_allclosed;
   foreach($tabouvertures as $ouvertures) {
      $arrValue =  $ouvertures["ETAT"];
      if ($arrValue <> 0) {
         $ouvertures["ETAT"] = 1;
         $nbouvert++;
         if ($nbouvert == 1) {
            $annonce = $msg_open.$ouvertures["NAME"];
         }
         else {
            $annonce = $annonce." et ".$ouvertures["NAME"];
         }
      }
      $xml .= "<OUVERTURE_".$idoors."><TYPE>".$ouvertures["NAME"]."</TYPE>";
      $xml .= "<ETAT>".$ouvertures["ETAT"]."</ETAT></OUVERTURE_".$idoors.">\n";
      $idoors++;
   }
   if ($nbouvert == 1) {
      $annonce .= " est ouverte.";
   } else if ($nbouvert > 1) {
      $annonce .= " sont ouvertes.";   
   }
   
   if (($nbouvert > 0) && $resultPeriphId)
   {
      SetValue($resultPeriphId, 100);
   }
   
       
   $xml .= "<MESSAGE>".$annonce."</MESSAGE>";
   $xml .= "</OUVERTURES>";
   sdk_header('text/xml');
   echo $xml;
?>


dans le champ URL, le script peut être appeler de deux manières différentes
soit:
[*]http://localhost/script/?exec=EtatOuverture.php&periphIds=1,2,3
[*]http://localhost/script/?exec=EtatOuverture.php&periphIds=1,2,3&resultPeriphId=4
la deuxième manière nécessitant de créer un nouveau périphérique de type état (usage détecteur d'ouverture) qui permet de faire des règles plus faciles à mon goût, ce périphérique est "ouvert" si au moins des portes déclarées l'est et fermé sinon.


Les deux versions sont récupérables en zip sur le GitHub :
https://github.com/influman/eedomus_getOuvertures

[Store] ************************
Depuis fin septembre 2017, le script est directement accessible en plugin via le store eedomus.
Par défaut, la mise à jour du capteur est automatique toutes les mn (polling = 1).
Pour une mise à jour en temps-réel, il vous faut suivre les étapes 4) et 5) ci-dessus

**********************************
Dernière édition par influman le 10 Oct 2017 09:23, édité 9 fois.
influman
 
Messages : 2324
Inscription : 30 Oct 2013

Re: Script - Etat des ouvertures pour notification

Messagepar dplein » 11 Déc 2015 12:45

Super le script !!!! Merci beaucoup :D :D
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: Script - Etat des ouvertures pour notification

Messagepar eedomusbox » 11 Déc 2015 23:38

Pas mal, je vais le tester et te faire un retour.merci
eedomusbox
 
Messages : 887
Inscription : 12 Sep 2014
Localisation : 69

Re: Script - Etat des ouvertures pour notification

Messagepar eedomusbox » 13 Déc 2015 09:49

Chez moi, les accents sont mal encodés. (sur un RaspberryPI 2)
J'ai simplement changé la première ligne par
Code : Tout sélectionner
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
eedomusbox
 
Messages : 887
Inscription : 12 Sep 2014
Localisation : 69

Re: Script - Etat des ouvertures pour notification

Messagepar jc.dubois74 » 15 Déc 2015 19:08

+1

Merci pour le partage !!

Je vais le tester également chez moi et te faire un retour dessus durant les vacances de noël.
Je cherchais justement à faire la même chose chez moi car j'en avais marre quand j'active mon alarme de vérifier quand une fenêtre ou porte est ouverte en me connectant sur l'appli ou sur ma tablette murale via impérihome (ton point n°,6 me concernant).

Après via du multiroom l'annonce va aussi servir à ma femme pour lui rappeler de fermer une fenêtre après avoir aérer la pièce plus de X mins (je me bats avec elle pour ce point, la elle aura plus d'excuses :twisted:).
Bonne soirée.
jc.dubois74
 
Messages : 3
Inscription : 13 Mai 2015

Re: Script - Etat des ouvertures pour notification

Messagepar Nico33 » 17 Déc 2015 16:56

Ca marche nickel.
Merci pour le partage.
Il est vrai que ce sera mieux quand ce sera sur la box elle-même.
Nico33
 
Messages : 1013
Inscription : 14 Juin 2013

Re: Script - Etat des ouvertures pour notification

Messagepar Nico33 » 18 Déc 2015 08:15

Perso, je pense qu'il est préférable d'utiliser l'API locale quand c'est possible.
Si le script est hébergé sur une machine du réseau local, autant l'utiliser.
Il suffit de remplacer la ligne d'appel à l'URL par :
$urlValue = "http://192.168.1.60/api/get?action=periph.caract&periph_id=".$periphid."&api_user=".$api_user."&api_secret=".$api_secret;

Bien entendu, il faut mettre l'IP LAN de votre eedomus.
Et à plus forte raison si vous faites un appel toutes les minutes de ce script et que vous avez comme moi 12 ouvrants à contrôler.
Ca monte vite dans une journée : 12 * 60 *24 = 17280 fois
Sachant que la limite est de 1000 par jour sans abonnement (en api distante).
Nico33
 
Messages : 1013
Inscription : 14 Juin 2013

Re: Script - Etat des ouvertures pour notification

Messagepar Madoma73 » 18 Déc 2015 10:26

ça peut encore s'améliorer mais voici une version qui marche directement sur la box

cf dernière version du script plus loin dans le fil
Pierre
Madoma73
 
Messages : 1440
Inscription : 16 Sep 2012
Localisation : 38

Re: Script - Etat des ouvertures pour notification

Messagepar Nico33 » 18 Déc 2015 14:16

La seule différence est dans l'appel API ?
Ou il y a d'autres modifs ?
Nico33
 
Messages : 1013
Inscription : 14 Juin 2013

Re: Script - Etat des ouvertures pour notification

Messagepar Madoma73 » 18 Déc 2015 14:24

y a en d'autres, un script ne te renvoie pas du json mais des tableaux....
rien de dramatique....
je pensais aussi récupérer le nom des devices via l'api plutôt que de l'écrire en dur dans le script et passer les id en paramètres pour ne pas avoir à modifier le script à chaque fois....
Pierre
Madoma73
 
Messages : 1440
Inscription : 16 Sep 2012
Localisation : 38

Re: Script - Etat des ouvertures pour notification

Messagepar influman » 18 Déc 2015 23:49

Nico33 a écrit:Perso, je pense qu'il est préférable d'utiliser l'API locale quand c'est possible.
Si le script est hébergé sur une machine du réseau local, autant l'utiliser.
Il suffit de remplacer la ligne d'appel à l'URL par :
$urlValue = "http://192.168.1.60/api/get?action=periph.caract&periph_id=".$periphid."&api_user=".$api_user."&api_secret=".$api_secret;

Bien entendu, il faut mettre l'IP LAN de votre eedomus.
Et à plus forte raison si vous faites un appel toutes les minutes de ce script et que vous avez comme moi 12 ouvrants à contrôler.
Ca monte vite dans une journée : 12 * 60 *24 = 17280 fois
Sachant que la limite est de 1000 par jour sans abonnement (en api distante).


Pour avoir l'etat en temps reel, il ne faut pas faire un appel par mn, mais un appel des lors qu'un ouvrant change d'etat. Ce qui, en plus, genere bcp moins d'appel au script. Sauf si c'est un vaudeville chez vous :)
influman
 
Messages : 2324
Inscription : 30 Oct 2013

Re: Script - Etat des ouvertures pour notification

Messagepar eedomusbox » 21 Déc 2015 13:10

Madoma73 a écrit:je pensais aussi récupérer le nom des devices via l'api plutôt que de l'écrire en dur dans le script et passer les id en paramètres pour ne pas avoir à modifier le script à chaque fois....

Salut,
tu penses le faire? l'idée me parait très intéressante :-)
eedomusbox
 
Messages : 887
Inscription : 12 Sep 2014
Localisation : 69

Re: Script - Etat des ouvertures pour notification

Messagepar Madoma73 » 21 Déc 2015 14:59

je pense à bcp de choses :mrgreen:
le problème est qu'écrire des scripts... ça me fait pas vivre .... sinon vous seriez inondés de scripts plus ou moins tordus que j'ai en tête !
Pierre
Madoma73
 
Messages : 1440
Inscription : 16 Sep 2012
Localisation : 38

Re: Script - Etat des ouvertures pour notification

Messagepar latoupie » 21 Déc 2015 22:27

Madoma73 a écrit:ça peut encore s'améliorer mais voici une version qui marche directement sur la box

La pièce jointe EtatOuverture.zip n’est plus disponible


En effet, j'ai bien un capteur qui me dit que tout est ok mais c'est tout
j'ai fait une règle qui met à jour ce capteur mais rien ne se passe si j'ouvre la porte par exemple

J'ai modifier le script ainsi pour 2 ouvrants (avec mon code API user et ID du module)
Capture.PNG
Capture.PNG (14.57 Kio) Consulté 32225 fois


c'est bien comme cela qu"il faut faire ? j'ai comme un doute ;[

merci
J'ai aussi un BeBop et un ZX81
latoupie
 
Messages : 1085
Inscription : 14 Fév 2015
Localisation : Pas loin

Re: Script - Etat des ouvertures pour notification

Messagepar eedomusbox » 22 Déc 2015 05:59

non il faut juste indiquer les codes de tes periphs
Code : Tout sélectionner
$tabouvertures = array(
1 => array("TYPE" => "La fenêtre de la chambre", "API" => "782323", "ETAT" => 0),
2 => array("TYPE" => "La porte d entrée", "API" => "244234", "ETAT" => 0),
);
eedomusbox
 
Messages : 887
Inscription : 12 Sep 2014
Localisation : 69

Re: Script - Etat des ouvertures pour notification

Messagepar latoupie » 22 Déc 2015 07:23

Merci je regarde dès que possible
Et merci une fois de plus aux scripteurs
J'ai aussi un BeBop et un ZX81
latoupie
 
Messages : 1085
Inscription : 14 Fév 2015
Localisation : Pas loin

Re: Script - Etat des ouvertures pour notification

Messagepar Madoma73 » 22 Déc 2015 08:19

voici la version dans laquelle, il suffit de rentrer les periphsId dans l'URL d'appel, plus besoin de modifier le script , et le script récupère tout seul le nom des périphériques :mrgreen:

cf dernière version du script plus loin dans le fil
Pierre
Madoma73
 
Messages : 1440
Inscription : 16 Sep 2012
Localisation : 38

Re: Script - Etat des ouvertures pour notification

Messagepar latoupie » 22 Déc 2015 08:37

Argh.... Va falloir que j attende ce soir pour tester.
Merci pour les évolutions !
J'ai aussi un BeBop et un ZX81
latoupie
 
Messages : 1085
Inscription : 14 Fév 2015
Localisation : Pas loin

Re: Script - Etat des ouvertures pour notification

Messagepar eric63 » 22 Déc 2015 11:24

Madoma73, je comprends pas ce que tu veux dire. Qu'est ce que les periphsld?
J'ai installé le script sur mon NAS mais rien ne se passe. Que faut-il mettre dans le XPATH?

Merci.

Madoma73 a écrit:voici la version dans laquelle, il suffit de rentrer les periphsId dans l'URL d'appel, plus besoin de modifier le script , et le script récupère tout seul le nom des périphériques :mrgreen:

EtatOuverture.zip
eric63
 
Messages : 129
Inscription : 16 Avr 2014

Re: Script - Etat des ouvertures pour notification

Messagepar latoupie » 22 Déc 2015 11:40

@eric63, voici ce que j'ai fait comme capteur
Capture.PNG
Capture.PNG (26.82 Kio) Consulté 32189 fois


Il faut mettre le script directement dans la box, pas besoin de le mettre dans ton NAS
Pour la dernière version de @Madoma73, je ne l'ai pas encore intégrée mais avec l'ancienne version, ça donne ça :
Capture.PNG
Capture.PNG (10.29 Kio) Consulté 32189 fois
J'ai aussi un BeBop et un ZX81
latoupie
 
Messages : 1085
Inscription : 14 Fév 2015
Localisation : Pas loin

Suivant

Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 22 invité(s)