Forum eedomus
http://forum.eedomus.fr/

[Store] Script - Etat des ouvertures pour notification
http://forum.eedomus.fr/viewtopic.php?f=50&t=3421
Page 1 sur 8  Suivant »
Auteur:  influman [ 10 Déc 2015 16:04 ]
Sujet du message:  [Store] Script - Etat des ouvertures pour notification

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

**********************************
Auteur:  dplein [ 11 Déc 2015 12:45 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

Super le script !!!! Merci beaucoup :D :D
Auteur:  eedomusbox [ 11 Déc 2015 23:38 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

Pas mal, je vais le tester et te faire un retour.merci
Auteur:  eedomusbox [ 13 Déc 2015 09:49 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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\" ?>";
Auteur:  jc.dubois74 [ 15 Déc 2015 19:08 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

+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.
Auteur:  Nico33 [ 17 Déc 2015 16:56 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

Ca marche nickel.
Merci pour le partage.
Il est vrai que ce sera mieux quand ce sera sur la box elle-même.
Auteur:  Nico33 [ 18 Déc 2015 08:15 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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).
Auteur:  Madoma73 [ 18 Déc 2015 10:26 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

ç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
Auteur:  Nico33 [ 18 Déc 2015 14:16 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

La seule différence est dans l'appel API ?
Ou il y a d'autres modifs ?
Auteur:  Madoma73 [ 18 Déc 2015 14:24 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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....
Auteur:  influman [ 18 Déc 2015 23:49 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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 :)
Auteur:  eedomusbox [ 21 Déc 2015 13:10 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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 :-)
Auteur:  Madoma73 [ 21 Déc 2015 14:59 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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 !
Auteur:  latoupie [ 21 Déc 2015 22:27 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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é 35689 fois


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

merci
Auteur:  eedomusbox [ 22 Déc 2015 05:59 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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),
);
Auteur:  latoupie [ 22 Déc 2015 07:23 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

Merci je regarde dès que possible
Et merci une fois de plus aux scripteurs
Auteur:  Madoma73 [ 22 Déc 2015 08:19 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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
Auteur:  latoupie [ 22 Déc 2015 08:37 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

Argh.... Va falloir que j attende ce soir pour tester.
Merci pour les évolutions !
Auteur:  eric63 [ 22 Déc 2015 11:24 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

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
Auteur:  latoupie [ 22 Déc 2015 11:40 ]
Sujet du message:  Re: Script - Etat des ouvertures pour notification

@eric63, voici ce que j'ai fait comme capteur
Capture.PNG
Capture.PNG (26.82 Kio) Consulté 35653 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é 35653 fois
Page 1 sur 8 Le fuseau horaire est UTC+1 heure