sureflap chatière connectée

On parle ici de l’utilisation de vos objets connectés avec eedomus

Re: sureflap chatière connectée

Messagepar Kebiel » 20 Déc 2019 20:40

Merci Merguez07 pour le temps passé.
Maintenant je peux modifier les "droits" d'accès (l'ouverture) de la "grande chatière".
Après teste :
concernant les leds du hub (oreilles de chats)... la valeur "off" ne veut pas passer, ça reste en "dim" . Sur eedomus on voit le "off" passer, mais les oreilles restent en "dim"...puis au bout d'un moment même la valeur sur eedomus suate toute seule de "off" vers "dim".
Faut dire que c'est un detail..mais tant qu-à faire un retour ... :)

Ensuite je trouve que les images des hubs flap ne correspondent pas bien selon moi. En effet la valeur "both" avec une icone de chat vert semble indiiquer que l'on laisse passer les chats dans les deux sens, or cette valeur correspond à la fermeture totale (dans les deux sens), donc j'aurai mis un chat rouge. L'inverse est vrai pour la vlauer "none" avec chat rouge... en fait les chats peuvent passer... donc j'aurai mis le chat verts.

C'est facilement modifiable, dons c'est vraiment pas un soucis, c'est juste pour faire un retour complet.

Merci encore,

Keb
Kebiel
 
Messages : 216
Inscription : 27 Déc 2017

Re: sureflap chatière connectée

Messagepar merguez07 » 20 Déc 2019 20:46

:thumbup:

je prends en compte
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: sureflap chatière connectée

Messagepar vandevelde » 19 Jan 2020 18:08

Hello,

Est-il nécessaire d'avoir le HUB de la chatière connect pour interfacer la chatière avec la box eedomus ? (je vois que les chatières connect peuvent être vendu sans HUB).

merci pour votre réponse
vandevelde
 
Messages : 3
Inscription : 19 Jan 2020

Re: sureflap chatière connectée

Messagepar merguez07 » 20 Jan 2020 10:24

Bonjour,

vandevelde a écrit:Est-il nécessaire d'avoir le HUB de la chatière connect pour interfacer la chatière avec la box eedomus ? (je vois que les chatières connect peuvent être vendu sans HUB).


Sauf erreur de ma part c'est le hub qui fait la passerelle avec le réseau et donc , oui, pour moi il faut le hub pour piloter la chatière par eedomus.

Après, mais c'est un autre sujet, je m'interroge sur le pérénité de ce type de chatière car sur leur site j'ai vu des modèles en rupture de stock ce que je trouve etonnant de la part du fournisseur officiel
tuto 1 -->Programmation des scripts Eedomus
tuto 2 -->SmartDevice
tuto 3 -->Le déclenchement de règles
scripts -->Météo du jour | GH Thermostat | TotalWatt | Detecfire | smartbattery
Skype Eedomus -->lien vers le skype Eedomus
merguez07
 
Messages : 2346
Inscription : 15 Sep 2017
Localisation : Le Teil en Ardèche

Re: sureflap chatière connectée

Messagepar Kebiel » 21 Jan 2020 12:57

Bonjour,
Oui, il faut le hub (au moins un hub). en fait ton appli sureflap (ou le script) communique au hub, qui lui communique avec la chatière.
J'ai essayé hier soir en deco le hub... rien ne marche, dans l'appli la chatière apparait grisée.

Keb
Kebiel
 
Messages : 216
Inscription : 27 Déc 2017

Re: sureflap chatière connectée

Messagepar vandevelde » 26 Jan 2020 09:59

Hello,

ok c'est clair pour moi maintenant.

Merci pour vos réponses !
vandevelde
 
Messages : 3
Inscription : 19 Jan 2020

Re: sureflap chatière connectée

Messagepar vandevelde » 26 Jan 2020 10:25

Pour mon utilisation, je crois que je vais plutôt placer un détecteur devant une chatière classique.
OK, je ne pourrai pas la verrouiller / déverrouiller à distance, ou récupérer l'ID de l'animal, mais bcp moins cher et finalement ce qui m’intéresse surtout c'est de savoir si ma bête est en mouvement pdt mes vacances.
voilà voilà, dommage, j'aimais bien le principe quand même et l'idée d'intégrer la chatière au système, mais j'imaginais un tarif plus abordable.
vandevelde
 
Messages : 3
Inscription : 19 Jan 2020

Re: sureflap chatière connectée

Messagepar Muss » 26 Jan 2020 23:20

Je ne comprend pas ce qui serait possible de faire avec cette chatière connectée sauf si une caméra est en capacité d’identifier ton chat :?: :?:
Muss
 
Messages : 3
Inscription : 26 Jan 2020

Re: sureflap chatière connectée

Messagepar gabvoir » 14 Fév 2020 21:45

Bonjour,
Le hub flap donnant l'état ne semble pas fonctionné.
///IDxxxxxx/Lock
Valeur lue vide
Auriez vous une idée ?
Si besoin de faire des tests je veux bien les tester !
Merci
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

Re: sureflap chatière connectée

Messagepar gabvoir » 16 Fév 2020 18:03

Il me semble avoir compris.
C'est l'API qui ne donne pas l'information Locking quand un couvre feu est réglé.
Je laisse tout de même merguez07 confirmer ;-)
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

Re: sureflap chatière connectée

Messagepar Homenivers » 12 Avr 2020 10:52

Bonjour moi je n'obtiens que ce message pouvez vous m'aider

La fonction saveVariable n'est autorisée que sur la box eedomus

Cdt
Homenivers
 
Messages : 2
Inscription : 12 Avr 2020

Re: sureflap chatière connectée

Messagepar xeos » 14 Avr 2020 09:14

j'utilise ce plugin pour mon minou et aucun souci, il faut verifier si tu as la bonne url dans l'appel du script.
Je suis Fou et insatiable
xeos
 
Messages : 836
Inscription : 02 Sep 2017
Localisation : Alsace

Re: sureflap chatière connectée

Messagepar leraystep95 » 20 Déc 2023 19:32

Bonjour à tous,
J'utilisais ce plugin depuis à peu près un an sans problème...
Cependant depuis peu. Je n'ai plus le retour de position ! Ça reste en "No location!"
Lorsque je teste le script j'obtiens ceci :

## ERROR: Querying [https://app.api.surehub.io/api/auth/logout]
Error 0:
## ERROR: Querying [https://app.api.surehub.io/api/pet/149546/position]
Error 0:
<root><cached>0</cached><status>success!</status>
<Houses>
<ID85312>xxxxxx</ID85312>
</Houses>
<Devices>
<Devicehouse>xxxxxx</Devicehouse>
<ID352816>
<type>Hub</type>
<Name>Chatière</Name>
<Mac>000004916278F664</Mac>
<SN>H009-0352816</SN>
<Led></Led>
</ID352816>
<ID419229>
<type>DualScan Cat Flap Connect</type>
<Name>Chatière</Name>
<Mac>FAAD01CFF9D5B370</Mac>
<SN>N006-0110074</SN>
</ID419229>
</Devices>
<Pets>
<Pethouse>xxxxxx</Pethouse>
<ID149546>
<species>Chatte</species>
<name>Zoé</name>
</ID149546>
</Pets>
<PetLocations>
<ID149546>No location!</ID149546>
</PetLocations>
</root>

Quelqu'un peu m'aider ?
Merci d'avance
leraystep95
 
Messages : 2
Inscription : 23 Avr 2023

Re: sureflap chatière connectée

Messagepar flux » 07 Jan 2024 18:27

Bonjour,

Impacté aussi, et c'est général, l'API surehub a changé récemment :(
Vu côté jeedom sur leur forum, le développeur du plug-in a pu le corriger en rajoutant des headers et changeant l'url https://community.jeedom.com/t/ajouter- ... e/117317/9
Peut-être que @merguez07 (l'auteur du plug-in eedomus) a quelques cartes en main pour rétablir le plug-in ? :ugeek:
flux
 
Messages : 53
Inscription : 30 Nov 2018

Re: sureflap chatière connectée

Messagepar gabvoir » 09 Jan 2024 15:40

Bonjour,
Le problème cité côté jeedom n'a rien à voir.
Malheureusement l'API eedomus httpQuery n'est pas documenté sur l'erreur 0, sur le logout et le pet...position.
Donc difficile de savoir ce qui ne va plus :(

Je dirais au pif que le plugin à un soucis à retrouver son token de connexion. Mais pour autant la connexion est bien établi puisque
Code : Tout sélectionner
<status>success!</status>

Et par ailleurs seul ces 2 fonction logout et pet....location semblent planté.
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

Re: sureflap chatière connectée

Messagepar flux » 09 Jan 2024 19:04

gabvoir a écrit:Bonjour,
Le problème cité côté jeedom n'a rien à voir.
Malheureusement l'API eedomus httpQuery n'est pas documenté sur l'erreur 0, sur le logout et le pet...position.
Donc difficile de savoir ce qui ne va plus :(

Je dirais au pif que le plugin à un soucis à retrouver son token de connexion. Mais pour autant la connexion est bien établi puisque
Code : Tout sélectionner
<status>success!</status>

Et par ailleurs seul ces 2 fonction logout et pet....location semblent planté.

Je ne serais pas aussi sûr que ça ;)
De plus le projet github de l'api (sur lequel se base surement le plug-in eedomus au vu du code commun) s'est aussi adapté à la nouvelle adresse de l'API sureflap mi décembre.
https://github.com/fabieu/sureflap-api/ ... 212399f209

Pour le logout est appelé au tout début de la méthode de login donc c'est "normal" qu'il soit le premier à renvoyer une erreur
Code : Tout sélectionner
function sdk_login(){
    global $oldtoken,$email_address,$password,$device_id,
           $endpoint,$login,$token,$xml;
    if  ($oldtoken = loadVariable("token")) {
        sdk_logout();
    }

Pour moi c'est pas un souci propre à eedomus. Mais pas simple à debugger, je tente quelques adaptations avec mon maigre niveau quand j'ai un peu de temps...
flux
 
Messages : 53
Inscription : 30 Nov 2018

Re: sureflap chatière connectée

Messagepar gabvoir » 09 Jan 2024 22:18

Ok en effet !
J'ai pris connaissance du commit et j'essai également de merger avec notre bon vieux PHP.
Effectivement le endpoint d'accès à changé, mais également les headers d'accès
-> ca c'est un moindre mal
La ou je bloque c'est la génération aléatoire d'un UUID sous la norme RFC 4122.
-> je ne suis pas sur que PHP sache faire cela
=> J'ai ouvert un ticket auprès du support eedomus afin de trouver une solution pour générer cette UUID v1
https://docs.python.org/fr/3/library/uuid.html#uuid.uuid1

Bon ben a force de chercher, j'ai trouvé une fonction simple :)
Code : Tout sélectionner
function sdk_genuuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        // 32 bits for "time_low"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

        // 16 bits for "time_mid"
        mt_rand( 0, 0xffff ),

        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand( 0, 0x0fff ) | 0x4000,

        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand( 0, 0x3fff ) | 0x8000,

        // 48 bits for "node"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
    );
}


Du coup j'ai réussi à obtenir mon token, et a me connecter à l'API :)
Youpi !
Quelque débug et je ferai un commit ici :)
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

Re: sureflap chatière connectée

Messagepar gabvoir » 12 Jan 2024 08:51

Bonjour à tous !

Voilà ma mise à jour :
https://www.diffchecker.com/7oxW9NyI/
Code : Tout sélectionner
<?php

/*
indice 1.1 du 19 decembre 2019 par Merguez07
1.0 : Creation du plugin
1.1 : integration des chatieres de type door connect
      modification de la gestion du cache
1.2 : Correction d'un bug dans les led hub et changement d'icone
remerciements :
Bart de Eedomus pour le code de la gestion du cache
RAR69 pour les icones
eedomus.yves.delort pour les beta-tests
Kebiel pour l'integration du door connect(indice 1.1)
2.0 : Mise à jour vers la nouvelle API :
 - nouveau endpoint + header par défaut + suppression de sdk_logout
 - réorganisation du xml de sortie pour coller à l'API et limiter les appels :
   suppresion de sdk_getpetlocation car déplacement dans l'API du petLocation, car /pet/".$pet_id."/position n'existe plus
   suppresion de sdk_getCurfewStatus car déplacement dans l'API ['control']['led_mode'], ['control']['locking'], ['control']['curfew']
*/

$mode           = getArg('mode',false); // mode=list pour la configuration du plugin

$device_id      = (string) sdk_genuuid();
$endpoint       = "https://app-api.production.surehub.io";
$url_logout      = "/api/auth/logout";
$url_login      = "/api/auth/login";
$url_household   = "/api/household";
$url_device      = "/api/device";
$url_pet         = "/api/pet";
$header_default = array(
            "Host: app.api.surehub.io",
            "Connection: keep-alive",
            "Accept: application/json, text/plain, */*",
            "Accept-Encoding: gzip, deflate",
            "Accept-Language: en-US,en-GB;q=0.9",
            "Content-Type: application/json",
            "Origin: https://surepetcare.io",
            "Referer: https://surepetcare.io",
            "X-Requested-With: com.sureflap.surepetcare",
            "X-Device-Id: ".$device_id
            );

//---------------------------config du plugin------------------------------------
if ($mode == 'list')  {
    if (isset($_POST['email'])&& isset($_POST['motdepasse'])){
        $email_address  = $_POST['email'];
        $password       = $_POST['motdepasse'];
        saveVariable("email",$email_address);
        saveVariable("password",$password );
        sdk_login();sdk_gethousehold(); sdk_getdevices();sdk_getpet();
        sdk_inithtml();
        echo utf8_encode($head.$html_hub.$html_flap.$html_pet.$html_script.$end);
        die();
    } else {
        sdk_inithtml();
        echo utf8_encode($head.$html_login.$end);
    }
    die;
}
//-------------------------------------------------------------------------------

$email_address  = loadVariable("email");
$password       = loadVariable("password");
$set            = getArg('set',false);    // ledbright/leddim/ledoff
                                          // lockin/lockout/lockboth/locknone
                                          // pos1/pos2
                                          // curfew

//---------------------------lumiere du Hub-------------------------------------
$test=sdk_Targ($set,'led');
if ($test[0]) {
    $hub_id= getArg('hubid',true);
    sdk_login();
    sdk_gethousehold();
    sdk_getdevices();
    sdk_sethubledbrightness($test[1],$hub_id) ;
    echo $xml;
    die;
}
//-------------------------------------------------------------------------------

//--------------------verrouillage de la chatiere--------------------------------
$test=sdk_Targ($set,'lock');
if ($test[0]) {
    $flap_id= getArg('flapid',true);
    sdk_login();
    sdk_gethousehold();
    sdk_getdevices();
    sdk_setlockmode ($test[1],$flap_id) ;
    echo $xml;
    die;
}
//-------------------------------------------------------------------------------

//---------------------------position de l'animal--------------------------------
$test=sdk_Targ($set,'pos');
if ($test[0]) {
    $pet_id= getArg('petid',true);
    sdk_login();
    sdk_setpetlocation($test[1],$pet_id) ;
    echo $xml;
    die;
}
//-------------------------------------------------------------------------------

//---------------------------reglage du couvre-feu-------------------------------
if ($set=="curfew") {
    $locktime          = getArg('locktime',false);
    $unlocktime        = getArg('unlocktime',false);
    $id                = getArg('id',true);
    sdk_login();
    sdk_setEnableCurfew($locktime,$unlocktime,$id) ;
    echo $xml;
    die;
}
//-------------------------------------------------------------------------------
$cache_duration = 0.1; // minutes
$time_last_xml  = loadVariable('time_last_xml');
if ((time() - $time_last_xml) / 60 < $cache_duration)
{
    sdk_header('text/xml');
    $cached_xml = loadVariable('cached_xml');
    echo $cached_xml;
    die();
}

//$xml = '<root>' ."\n";

sdk_login();
sdk_gethousehold();
sdk_getdevices();
sdk_getpet();

//$xml .= '</root>' ."\n"; 

$cached_xml = '<root>';
$cached_xml .= '<cached>0</cached>';
$cached_xml .= $xml;
$cached_xml .= '</root>';

echo $cached_xml;

if ($xml != '') // non vide
{
    $cached_xml = str_replace('<cached>0</cached>', '<cached>1</cached>', $cached_xml);
    saveVariable('cached_xml', $cached_xml);
    saveVariable('time_last_xml', time());
}
                             
die;

function sdk_genuuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
        mt_rand( 0, 0xffff ),
        mt_rand( 0, 0x0fff ) | 0x4000,
        mt_rand( 0, 0x3fff ) | 0x8000,
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
    );
}

function sdk_headerTokened(){
   global $token,$header_default;
   return array_merge($header_default, array("Authorization: Bearer $token"));   
}

#---------------------------------------logout---------------------------------------------   
function sdk_logout(){
   global $oldtoken,$endpoint,$url_logout;
    $url    = $endpoint.$url_logout;
    $action = 'GET';
    $header = array("Content-Type: application/json",
                    "Authorization: Bearer $oldtoken");
    $result = sdk_curl($url,$action,null,$header);
}   
#------------------------------------------------------------------------------------------

#---------------------------------------login----------------------------------------------
function sdk_login(){
    global $oldtoken,$email_address,$password,$device_id,
           $endpoint,$url_login,$token,$xml,$header_default;
    if  ($oldtoken = loadVariable("token")) {
        //sdk_logout();
    }
    $url    = $endpoint.$url_login;
    $action = 'POST';
    $post   = '{"email_address":"'.$email_address.'",
                "password":"'     .$password.     '",
                "device_id":"'    .$device_id.    '"}';
    $result =sdk_curl($url,$action,$post,$header_default);
    if (array_key_exists(token,$result['data'])) {
        $token = $result['data']['token'];
        saveVariable("token",$token);
        $xml .= '<status>'   ."success!"                 .'</status>'."\n"; 
    } else {
        $xml .= '<status>'   ."Token Invalid/Expired!"   .'</status>'."\n";
        //$xml .= '</root>' ."\n"; 
        die("Login Failed!\n");
    }
}
#------------------------------------------------------------------------------------------

#-------------------------------------gethouseold------------------------------------------
function sdk_gethousehold() {
    global $endpoint,$url_household,$xml,$Thouses;
    $xml   .= '<Houses>'."\n";
    $Thouses = array();
    $url    = $endpoint.$url_household;
    $action = 'GET';
    $result = sdk_curl($url,$action,null,sdk_headerTokened());
    $houses = $result['data'];
    if($houses) {
        foreach($houses as $house){
            $Thouses += array($house['id']=>$house['name']);
            $xml .= '   <ID'.$house['id'].'>'  .$house['name']    .'</ID'.$house['id'].'>'."\n";
       }
       $xml .= '</Houses>'."\n";
    } else {
       $xml .= '   <House>'             ."No House!"                                .'</House>'."\n";
       $xml .= '</Houses>'."\n";
       die("No House!");
    }
}
#------------------------------------------------------------------------------------------

#---------------------------------------getpet---------------------------------------------
function sdk_getpet() {
    global $endpoint,$url_pet,$xml,$Thouses,$Tpets;
    $xml .= '<Pets>'."\n";
    $Tpets=array();

   $url = $endpoint.$url_pet;
   $action = 'GET';
   $result = sdk_curl($url,$action,null,sdk_headerTokened());
   $pets   = $result['data'];
   if($pets) {
      foreach ($pets as $pet) {
         $chien  = ($pet['gender']     === 0 )? "Chienne":"Chien";
         $chat   = ($pet['gender']     === 0 )? "Chatte":"Chat";
         $species= ($pet['species_id'] === 2 )? $chien:$chat;
         $Tpets += array($pet['id']=>$pet['name']);
         $xml .= '   <ID'.$pet['id'].'>'  ."\n";
         $xml .= '      <House>'         .$Thouses[$pet['household_id']]      .'</House>'."\n";
         $xml .= '      <Species>'     .$species       .'</Species>'."\n";
         $xml .= '      <Name>'        .$pet['name']   .'</Name>'."\n";
         if($pet['position']['where'] == "1") {
            $xml .= '      <Location>' ."Inside" .'</Location>'."\n";
         } else {
            $xml .= '       <Location>' ."Outside".'</Location>'."\n";
         }
         $xml .= '      <LocationSince>'.$pet['position']['since'].'</LocationSince>'."\n";
         $xml .= '   </ID'.$pet['id'].'>'  . "\n";
      }
   } else {
      $xml .= '       <Pet>'           ."No Pet!"          .'</Pet>'."\n";
   }
    $xml .= '</Pets>'."\n";
}
#------------------------------------------------------------------------------------------

#-------------------------------------getdevices-------------------------------------------
function sdk_getdevices() {
    global $endpoint,$url_device,$xml,$Tflaps,$Thubs, $Thouses, $Trepeaters,$Tfeeder_connects,$Tprogrammers  ;
    $xml .= '<Devices>'."\n";
    $Tflaps = array();$Thubs  = array();$Trepeaters= array() ;
    $Tfeeder_connects= array();$Tprogrammers= array();

   $url    = $endpoint.$url_device;
   $action = 'GET';
   $result = sdk_curl($url,$action,null,sdk_headerTokened());
   $devices= $result['data'];
   if ($devices) {
      foreach ($devices as $device) {
         switch($device['product_id']) {
            case 1:
               $Thubs += array($device['id']=>$device['name']);
               $DeviceType = "Hub";
               break;
            case 2:
               $Trepeaters  += array($device['id']=>$device['name']);
               $DeviceType = "Repeater";
               break;
            case 3:
               $Tflaps += array($device['id']=>$device['name']);
               $DeviceType = "Pet Door Connect";
                break;
            case 4:
               $Tfeeder_connects += array($device['id']=>$device['name']);
               $DeviceType = "Pet Feeder Connect";
               break;
            case 5:
               $Tprogrammers += array($device['id']=>$device['name']);
               $DeviceType = "Programmer";
                break;
            case 6:
               $Tflaps += array($device['id']=>$device['name']);
               $DeviceType = "DualScan Cat Flap Connect";
               break;
         }
         if (array_key_exists(serial_number,$device)) $DeviceSN = $device['serial_number']; else $DeviceSN   = "";
         $xml .= '   <ID'.$device['id'].">\n";
         $xml .= '      <House>'         .$Thouses[$device['household_id']]      .'</House>'."\n";
         $xml .= '      <Type>'         .$DeviceType                          .'</Type>'."\n";
         $xml .= '      <Name>'         .$device['name']                      .'</Name>'."\n";
         $xml .= '      <Mac>'          .$device['mac_address']               .'</Mac>' ."\n";
         $xml .= '      <SN>'           .$DeviceSN                            .'</SN>'  ."\n";
         if (array_key_exists(status,$device)) {
            if (array_key_exists(battery,$device['status'])) {
               $xml .= '      <Battery>'   .$device['status']['battery']         .'</Battery>'  ."\n";
            }
            if (array_key_exists(locking,$device['status'])) {
               if (array_key_exists(mode,$device['status'])) {
                  $Tlock=array(2=>"In", 1=>"Out", 3=>"Both",0=>"None");
                  $xml .= '      <Lock>'   .$Tlock[$device['status']['locking']['mode']]   .'</Lock>'  ."\n";
               }
            }
            if (array_key_exists(led_mode,$device['status'])) {
               $Tled=array(1=>"Bright", 4=>"Dim", 0=>"Off");
               $xml .= '      <Led>'   .$Tled[$device['status']['led_mode']]   .'</Led>'  ."\n";
            }
         }
         if (array_key_exists(control,$device)) {
            if (array_key_exists(curfew,$device['control'])) {
               if (array_key_exists(0,$device['control']['curfew'])) {
                  for ($i = 0; $i < count($device['control']['curfew']); $i++) {
                     $etat= ($device['control']['curfew'][$i]['enabled'])? "Enabled":"Disabled";
                     $xml .= '           <curfew'.($i+1).'>'     .$etat             .'</curfew'.($i+1).'>'  ."\n";
                     if ($etat=="Enabled") {
                        $Curfew_LockTime   = $device['control']['curfew'][$i]['lock_time'];
                        $Curfew_UnlockTime = $device['control']['curfew'][$i]['unlock_time'];
                        $xml .= '               <LockTime>'     .$Curfew_LockTime             .'</LockTime>'  ."\n";   
                        $xml .= '               <UnLockTime>'     .$Curfew_UnlockTime             .'</UnLockTime>'  ."\n";
                     }
                  }
               } else {
                     $etat= ($device['control']['curfew']['enabled'])? "Enabled":"Disabled";
                     $xml .= '           <curfew'.($i+1).'>'     .$etat             .'</curfew'.($i+1).'>'  ."\n";
                     if ($etat=="Enabled") {
                        $Curfew_LockTime   = $device['control']['curfew']['lock_time'];
                        $Curfew_UnlockTime = $device['control']['curfew']['unlock_time'];
                        $xml .= '               <LockTime>'     .$Curfew_LockTime             .'</LockTime>'  ."\n";   
                        $xml .= '               <UnLockTime>'     .$Curfew_UnlockTime             .'</UnLockTime>'  ."\n";
                     }
               }
            }
         }
         $xml .= '   </ID'.$device['id'].'>' ."\n";
      }
   } else {
      $xml .= '   <Device>'           ."No Device!"          .'</Device>'."\n";
   }
    $xml .= '</Devices>'."\n";
}
#------------------------------------------------------------------------------------------

#-----------------------------sethubledbrightness  bright|dim|off-----------------------------
function sdk_sethubledbrightness($led,$hub_id) {
    global $endpoint,$Thubs,$xml ;
    $xml = '<root>' ."\n";
    switch($led) {
       case "bright":
          $ledN = 1;
          break;
       case "dim":
          $ledN = 4;
          break;
       case "off":
          $ledN = 0;
          break;
       default:
           $ledN = null;
    }
    if (isset($ledN)) {
        $post   = "{\"led_mode\":$ledN}";
        $url    = $endpoint."/api/device/$hub_id/control";
        $action ='PUT';
        $result = sdk_curl($url,$action,$post,sdk_headerTokened());
        if($result['data']['led_mode']==$ledN) {
            $hubname=$Thubs[$hub_id];
           $xml .= sdk_framed('<action>' ."Successfully Set \"$hubname\" LED Brightness! \"$led\"" .'</action>');
        } else {
            $xml .= sdk_framed('<action>' ."LED Brightness Change Failed!" .'</action>');
        }   
    } else {
        $xml .= sdk_framed('<action>' ."wrong parameter \"$led\"==> reminder: &ledbright ou &leddim ou &ledoff" .'</action>');
    }
    $xml .= '</root>' ."\n"; 
}
#---------------------------------------------------------------------------------------------

#------------------------------setlockmode(in|out|both|none,$flap_id)-------------------------
function sdk_setlockmode ($lock,$flap_id) {
    global $endpoint,$Tflaps,$xml ;
    $xml = '<root>' ."\n";
    switch($lock) {
       case "in":
          $lockN = 2;
          break;
       case "out":
          $lockN = 1;
          break;
       case "both":
          $lockN = 3;
          break;
       case "none":
          $lockN = 0;
          break;   
       default:
           $lockN = -1;
    }
    if (!($lockN==-1)) {
        $post   = "{\"locking\":\"$lockN\"}";
        $url    = $endpoint."/api/device/$flap_id/control";
        $action = 'PUT';
        $result =sdk_curl($url,$action,$post,sdk_headerTokened());
        if($result['data']['locking']==$lockN) {
            $flap_name = $Tflaps[$flap_id];
           $xml .= sdk_framed('<action>' ."Successfully Set \"$flap_name\" Lock Mode! \"$lock\"" .'</action>');
        } else {
            $xml .= sdk_framed('<action>' ."Lock Mode Change Failed!"                  .'</action>');
        }   
    } else {
        $xml .= sdk_framed('<action>' ."wrong parameter \"$lock\"==> reminder: &set=lockin|&set=lockout|&set=lockboth|&set=locknone" .'</action>');
    }
    $xml .= '</root>' ."\n"; 
}
#---------------------------------------------------------------------------------------------

#-------------------------setpetlocation(1(inside)|2(outside),$pet_id)------------------------
function sdk_setpetlocation($position,$pet_id){
    global $endpoint,$xml ;
    $xml = '<root>' ."\n";
    $date= date("Y-m-d H:i");
    $post   = "{\"where\":\"$position\",\"since\":\"$date\"}";
    $url    = $endpoint."/api/pet/$pet_id/position";
    $action = 'POST';
    $result =sdk_curl($url,$action,$post,sdk_headerTokened());
    if(!$result['error']){
        if($result['data']['where']==$position) {
            $Tposition=($position==1)? "inside":"outside";
            $xml .= sdk_framed('<action>' ."Successfully Set \"$pet_id\" location \"$Tposition\"!" .'</action>');
        } else {
            $xml .= sdk_framed('<action>' ."Set Location Failed"                  .'</action>');
       }
    } else {
        $xml .= sdk_framed('<action>' ."pet not found"                  .'</action>');
    }
   $xml .= '</root>' ."\n";
}
#---------------------------------------------------------------------------------------------

#-----------------------setEnableCurfew("18:00", "06:00",$device_id)--------------------------------------------   
function sdk_setEnableCurfew($locktime, $unlocktime,$device_id) {
    global $endpoint,$xml ;
    $xml = '<root>' ."\n";
    $set = (($locktime)&&($unlocktime));
    $set1= ($set)?"true":"false";
    $post   = "{\"curfew\":[{\"enabled\":$set1,\"lock_time\":\"$locktime\",\"unlock_time\":\"$unlocktime\"},[],[]]}" ;   
    $url    = $endpoint."/api/device/$device_id/control";
    $action = 'PUT';
    $result =sdk_curl($url,$action,$post,sdk_headerTokened(),$set);
    if($result['data']['curfew'][0]['enabled']==true) {
       $xml .= sdk_framed('<action>' ."Successfully Enabled Curfew For \"$DeviceName\" Between $locktime & $unlocktime" .'</action>');
    } else {
       $xml .= sdk_framed('<action>' ."Successfully disabled Curfew!" .'</action>');
    }
    $xml .= '</root>' ."\n";
}
#---------------------------------------------------------------------------------------------

function sdk_Targ($arg,$text){
    #$arg='pos1' et $text='pos' --> array(true,1)
    $Targ[0] = (substr($arg,0,strlen($text))==$text);
    $Targ[1] = substr($arg,-(strlen($arg)-strlen($text)));
    return $Targ;
}

function sdk_Utf8_ansi($text) {
    #remet en forme $text pour voir les accents
    $text  = str_replace('\u','u',$text);
    $text  = preg_replace('/u([\da-fA-F]{4})/', '&#x\1;', $text);
    $text  = sdk_json_decode($text);
    return $text;     
}

function sdk_since($time){
    #donne le temps ecoule depuis $time
    $duration = strtotime(date("Y-m-d H:i:s", time()))-strtotime($time);
    switch (true) {
        case $duration < 60:
            return $duration." s";
        case $duration < 3600:
            return floor($duration/60)." min";
        case $duration < 86400:
            return floor($duration/3600)." h";
        case $duration < 172800:
            return "1 jour";
        case $duration < 2592000:
            return floor($duration/86400)." jours";
        case $duration < 5184000:
            return "1 mois";
        case $duration < 31536000:
            return floor($duration/2592000)." mois";
        case $duration < 63072000:
            return "1 an";
        case $duration > 63071999:
            return floor($duration/31536000)." annees";
        default:
    }
}

function sdk_only_letters($text){
    #ne garde que les lettres du debut de $text
    $text = substr($text,0,sdk_getPosInteger($text));
    $text = preg_replace('`[0-9. ]`sm', '', $text);
    return $text;
}

function sdk_getPosInteger($text) {
    #donne la position du premier chiffre dans $text
    $i = 0;
    $nLen = strlen($text);
    while ($i<$nLen) {
        if ( is_numeric( $text[$i] ) ) break;
        $i++;
    }
    return $i;
}

function sdk_curl($url,$action,$post,$header){
    $response = httpQuery(  $url            = $url,
                            $action         = $action,
                            $post           = $post,
                            $oauth_token    = null,
                            $header         = $header,
                            $use_cookies    = false,
                            $ignore_errors  = false,
                            $info           = null);
    $result = sdk_Utf8_ansi($response);
    return $result;
}

function sdk_framed($text){
    $text="#".$text."#";
    $nLen = strlen($text);
    $text="\n".str_repeat("#", $nLen)."\n".$text."\n".str_repeat("#", $nLen)."\n"."\n";
    return $text;
}

function sdk_inithtml() {
    global $head,$html_login,$html_hub,$html_flap,$html_pet,$html_script,$end,$Thubs,$Tflaps,$Tpets;

    $head = "<html>".
                "<head>".
                    "<meta charset='UTF-8'>".
                    "<link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'>".
                    "<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>".
                    "<style>".
                        "body {font-size: 14px;font-family: 'Roboto', sans-serif;width:50%;}".
                        "body {font-size: 14px;font-family: 'Roboto', sans-serif;width:50%;}".
                        "input[type='text'] {font-family: 'Roboto', sans-serif;}".
                        "ul {list-style: symbols;}".
                    "</style>".
                "</head>".
                "<body>".
                    "<img src='https://www.surepetcare.io/assets/images/onboarding/Sure_Petcare_Logo.png' alt='sure petcare' style='width:50%;' /><br />";
   
    $html_login =   "<p> Veuillez taper vos identifiants Sure Petcare</p>".
                    "<form action='/script/?exec=sureflap.php&mode=list' method='post'>".
                        "<p>";
                            $email   =(loadVariable('email'))?loadVariable('email'):"";
                            $password=(loadVariable('password'))?loadVariable('password'):"";
    $html_login .=          "<input type='text'  size='60' placeholder='votre email' name='email' value='$email'  /><br /><br />".
                            "<input type='password' size='20' placeholder='votre mot de passe' name='motdepasse' value='$password' /><br /><br />".
                            "<input type='submit' value='Valider' />".
                        "</p>".
                    "</form>";
   

    $html_hub =     "<div class='wrapper'>".
                        "<p>identifiant de votre Hub : ".
                            "<input id='hub_id' type='text' size='20' name='device_list' class='inputChoice' value='' onclick='this.select();' >".
                            "<ul class='elements'>";
                                foreach ($Thubs as $hubid=>$hubname){
    $html_hub.=                     "<li><input type='radio' name='hub_list' class='inputRadio' value='$hubid' id=''>".$hubid."-".$hubname."<br /></li>"; 
                                }
    $html_hub.=             "</ul>".
                        "</p>".
                    "</div>";
   
    $html_flap=     "<div class='wrapper'>".
                        "<p>identifiant de votre chatiere : ".
                            "<input id='flap_id' type='text' size='20' name='device_list' class='inputChoice' value='' onclick='this.select();' >".
                            "<ul class='elements'>";
                                foreach ($Tflaps as $flapid=>$flapname){
                                    $html_flap .="<li><input type='radio' name='flap_list' class='inputRadio' value='$flapid' id=''>".$flapid."-".$flapname."<br /></li>"; 
                                }
    $html_flap.=            "</ul>".
                        "</p>".
                    "</div>";
   
    $html_pet  =    "<div class='wrapper'>".
                        "<p>identifiant de votre animal : ".
                            "<input id='pet_id' type='text' size='20' name='device_list' class='inputChoice' value='' onclick='this.select();' >".
                            "<ul class='elements'>";
                                foreach ($Tpets as $petid=>$petname){
                                    $html_pet .="<li><input type='radio' name='pet_list' class='inputRadio' value='$petid' id=''>".$petid."-".$petname."<br /></li>"; 
                                }
    $html_pet.=             "</ul>".
                        "</p>".
                    "</div>";
   
    $html_script=   "<script type='text/javascript'>".
                        "$('html').on('click','.inputRadio', function(e) {".
                           
                            "$(this).closest('.wrapper').find('.inputChoice').val($(this).val());".
                        "});".
                    "</script>";
   
    $end =      "</body>".
            "</html>";
return;
}


Position animal :
Code : Tout sélectionner
//ID[VAR1]/Location


J'ai également rajouté la récupération du niveau de batterie :
Code : Tout sélectionner
//ID[VAR1]/Battery
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

Re: sureflap chatière connectée

Messagepar flux » 12 Jan 2024 09:18

Salut gabvoir,

Woa, tu gères !! Merci beaucoup pour cet update.
J'en profite pour une petite revue/questions et ça me tarde déjà de mettre ton code ce week-end :D Et super pour la remontée de batterie, très utile.

Mes questions :
- tu penses que c'est possible de gérer le no location comme avant par exemple avec :
Code : Tout sélectionner
if($pet['position']){
         if($pet['position']['where'] == "1") {
            $xml .= '      <Location>' ."Inside" .'</Location>'."\n";
         } else {
            $xml .= '       <Location>' ."Outside".'</Location>'."\n";
         }
} else $xml .= '       <Location>' ."No location !".'</Location>'."\n";

- pourquoi avoir diminué le cache a 6 secondes ? Est-ce que ça ne va pas provoquer trop de requêtes à terme (soit pour la box, soit pour l'api sureflap)
- la suppression de sdklogout a quel effet ?
- pourquoi avoir enlevé la boucle sur les houses ? Dans mon cas pas de souci car j'en ai qu'une mais est-ce que ça ne va pas limiter les personnes qui ont plusieurs chatières ?

Si tu veux on peut continuer en mp pour pas trop polluer ce post...

Flux
flux
 
Messages : 53
Inscription : 30 Nov 2018

Re: sureflap chatière connectée

Messagepar gabvoir » 12 Jan 2024 09:30

flux a écrit: Et super pour la remontée de batterie, très utile.
Je viens de voir qu'il y a un soucis. Malgré que ce soit bien formalisé en numériqué, eedomus me renvoi "valeur non numérique"

flux a écrit:tu penses que c'est possible de gérer le no location comme avant par exemple avec :
Ok je regarde ça !

flux a écrit:- pourquoi avoir diminué le cache a 6 secondes ? Est-ce que ça ne va pas provoquer trop de requêtes à terme (soit pour la box, soit pour l'api sureflap)
C'est un oubli de debug :)

flux a écrit:- la suppression de sdklogout a quel effet ?
J'ai remarqué que toutes les autres api trouvé sur le web, HA, python, n'avait pas ce logout.
Du coup je me suis dis qu'il ne servait à rien :)

flux a écrit:- pourquoi avoir enlevé la boucle sur les houses ? Dans mon cas pas de souci car j'en ai qu'une mais est-ce que ça ne va pas limiter les personnes qui ont plusieurs chatières ?
Initialement, il y avait 3 boucles :
- parcours des houses
- parcours des devices générales pour récupérer les infos propres (led, couvre-feu, locking mode)
- parcours des devices par house
Ainsi j'ai supprimé les 2 derniers pour ne faire qu'une boucle.
Du coup, dans le retour xml le niveau house, se retrouve en desous du pet/device. Mais pour autant il n'est pas supprimé.

Par ailleurs je n'ai pas du tout touché à la partie "set".
gabvoir
 
Messages : 175
Inscription : 24 Juin 2015

PrécédentSuivant

Retour vers Objets connectés

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité

cron