Avant toute chose merci de (re)prendre connaissance de la charte et de la respecter.
Pour résumer :
- Avant de poser une question, je cherche si la réponse existe
- Je suis poli, courtois et je respecte tout un chacun sur le forum
- Si un post m'agace : je m'en éloigne plutôt que de répondre d'une façon qui pourrait être mal interprétée


Il n'est jamais du luxe que de rappeler des choses simples :
Courtoisie, amabilité, politesse et bonne humeur sont les maîtres mots pour un forum sympathique, bienveillant et accueillant :)

Toute la communauté vous remercie

Création script Portier Ring.com

Réservé à l'utilisation et la programmation de scripts dans JEEDOM
maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Création script Portier Ring.com

Message par maxtone » 06 mars 2017, 16:53

Hello,

Ancien utilisateur d'eeDomus, j'explore ce nouveau monde qu'est Jeedom !! Et à vrai dire.. hum c'est un peu comme avec une femme que l'on rencontre pour la 1ère fois, on se dit : "Waouhhh que c'est beau !! Y'a tellement de trucs à faire avec mais on ne sait pas par où commencer !!" Hum, bref, ne nous égarons pas !

Je prends le donc le temps depuis quelques jours de bien me familiariser avec cette box que j'ai installé sur mon RPI 3 et puis ben là... Je me prends les pieds dans l'tapis !

Allez je vous expose mon cas !

Donc voilà j'aimerais faire reconnaître mon portier Ring.com avec Jeedom via un script que j'ai pu dégoté sur internet, qui pourrait alerter jeedom d'une présence humaine et aussi lorsque quelqu'un sonne. Oui je sais, ça peut être pratique pour un portier !

Alors voilà, j'ai 2 scripts PHP :

Le 1er, le voici le voilà, le fichier ring.php :

Code : Tout sélectionner

<?php
class Ring {
    private $_apiProto      = 'https://';
    private $_apiHost       = "api.ring.com";
    private $_apiVersion    = 9;
    private $_urlSession    = '/clients_api/session';
    private $_urlDings      = '/clients_api/dings/active';
    private $_urlDevices    = '/clients_api/ring_devices';
    private $_urlHistory    = '/clients_api/doorbots/history';
    private $_urlRecording  = '/clients_api/dings/{id}/recording';
    private $_authToken     = null;
    private function _httpCall($method, $call, $data, $username = null, $password = null) {
        $urlParameters = '';
        $headers = array();
        $headers[] = 'Accept-Encoding: gzip, deflate';
        $headers[] = 'User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; Build/KTU84Q)';
        
        
        $ch = curl_init();
        if ($method == 'POST') {
            $headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8';
            $postBody = $this->_arrayToUrlString($data);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody);
        } else {
            $urlParameters = '?'.$this->_arrayToUrlString($data);
        }
        
        $url = $this->_apiProto.$this->_apiHost.$call.$urlParameters;
        print "Call: ".$url."\n";
        curl_setopt($ch, CURLOPT_URL, $url);
        if (isset($username) || isset($password)) {
            curl_setopt($ch, CURLOPT_USERPWD,  $username.":".$password);
        }
            
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_ENCODING , "gzip, deflate");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        /*
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        */
        $serverResponse = curl_exec($ch);
        $httpCode       = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        //var_dump($serverResponse);
        curl_close ($ch);
        
        // Try JSON Decode
        $json = json_decode($serverResponse);
        if ($json) {
            return $json;
        } else {
            return $serverResponse;
        }
    }
    function authenticate($username, $password) {
        $postData['device[os]']                             = 'android';
        $postData['device[hardware_id]']                    = '180940d0-7285-3366-8c64-6ea91491982c';
        $postData['device[app_brand]']                      = 'ring';
        $postData['device[metadata][device_model]']         = 'VirtualBox';
        $postData['device[metadata][resolution]']           = '600x800';
        $postData['device[metadata][app_version]']          = '1.7.29';
        $postData['device[metadata][app_instalation_date]'] = '';
        $postData['device[metadata][os_version]']           = '4.4.4';
        $postData['device[metadata][manufacturer]']         = 'innotek GmbH';
        $postData['device[metadata][is_tablet]']            = 'true';
        $postData['device[metadata][linphone_initialized]'] = 'true';
        $postData['device[metadata][language]']             = 'en';
        $postData['api_version']                            = $this->_apiVersion;
        $headers = array();
        
        $response = $this->_httpCall('POST', $this->_urlSession, $postData, $username, $password);
        
        print "Authenticated as ".$response->profile->first_name.' '.$response->profile->last_name."\n";
        print "Authentication token is ".$response->profile->authentication_token."\n";
        $this->_authToken = $response->profile->authentication_token;
    }
    function poll() {
        $result = array();
        $data = array();
        $data['api_version'] = $this->_apiVersion;
        $data['auth_token']  = $this->_authToken;
        $response = $this->_httpCall('GET', $this->_urlDings, $data);
        foreach($response as $status) {
            foreach($status as $k => $v) {
                $result[$status->id][$k] = $v;
            }
            $result[$status->id]['is_motion']   = false;
            $result[$status->id]['is_ding']     = false;
            if ($status->state == 'ringing') {
                if ($status->kind == 'motion') {
                    $result[$status->id]['is_motion'] = true;
                }
                if ($status->kind =='ding') {
                    $result[$status->id]['is_ding'] = true;
                }
            }
        }
        
        if ($result) {
            return $result;
        } else {
            return false;
        }
    }
    
    function history() {
        $result = array();
        $data = array();
        $data['api_version'] = $this->_apiVersion;
        $data['auth_token']  = $this->_authToken;
        $data['limit']       = 30;
        $response = $this->_httpCall('GET', $this->_urlHistory, $data);
        return $response;
    }
    function recording($id) {
        $result = array();
        $data = array();
        $data['api_version'] = $this->_apiVersion;
        $data['auth_token']  = $this->_authToken;
        $response = $this->_httpCall('GET', $this->_urlTemplate($this->_urlRecording, array('id' => $id)), $data);
        return $response;
    }
    function devices() {
        $result = array();
        $data = array();
        $data['api_version'] = $this->_apiVersion;
        $data['auth_token']  = $this->_authToken;
        $response = $this->_httpCall('GET', $this->_urlDevices, $data);
        return $response;
    }
    private function _arrayToUrlString($array) {
        $string = '';
        foreach($array as $k => $v) {
            $string .= urlencode($k).'='.urlencode($v).'&';
        }
        return substr($string,0, -1);
    }
    
    private function _urlTemplate($url, $data) {
        foreach($data as $k => $v) {
            $url = str_replace('{'.$k.'}', $v, $url);
        }
        return $url;
    }
}
Et le 2ème script monexemple.php, qui lui, va faire appel au 1er (ring.php), et qui contient les identifiants ring.com :

Code : Tout sélectionner

<?php
    include "ring.php";
    
    $username = 'YOUR EMAIL ADDRESS HERE';
    $password = 'YOUR RING.COM PASSWORD HERE';
    
    $bell = new Ring();
    print "Authenticating...\n";
    $bell->authenticate($username, $password);
    print "My devices:\n";
    var_dump($bell->devices());
    print "Start polling for motion or dings...\n";
    while(1) {
        $states = $bell->poll();
        if ($states) {
            foreach($states as $state) {
                if ($state['is_ding']) {
                    print "Somebody pushed the button!\n";
                }
                
                if ($state['is_motion']) {
                    print "There's motion in the ocean!\n";
                }
            }
        }
        sleep(5);
    }
Alors du coup, ben dans mon plugin script sur Jeedom, je fais ça comment ? :shock:

J'ai commencé par créer un nouveau script, mais derrière je crée combien de commandes, quel type, ... ?

Quelqu'un pour aider un petit nouveau ? :P

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 08 mars 2017, 15:04

Arf, dommage que personne ne vienne à mon aide...

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: Création script Portier Ring.com

Message par Sshafi » 08 mars 2017, 17:12

Du tel je vais pas pouvoir t'aider beaucoup pour l'instant, mais dis nous aussi comment fonctionne ton 2ème script, il faut qu'il soit exécuté régulièrement ? Si je comprend bien il renvoi une phrase à chaque exécution ?

From Tapatruc...
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 08 mars 2017, 20:08

Salut !

En fait j'ai trouvé ces sources ici : https://github.com/jeroenmoors/php-ring-api

Je t'avoue que je ne suis pas un expert sur le langage PHP mais du peu que j'ai pu comprendre, c'est que oui le fichier ici "monexemple.php" va devoir être exécuté fréquemment, peut être toute les minutes.

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 08 mars 2017, 20:09

Et au passage... merci pour ton aide ! ;)

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: Création script Portier Ring.com

Message par Sshafi » 09 mars 2017, 14:08

Alors du pc on j'y voit un peu plus clair sur le script monexemple.php.
En fait il fait d'abord l'authentification et ensuite il lance une boucle infinie qui interroge le portier, affiche le résultat et attend 5s...

Du coup va falloir faire un peu différemment je pense... On va tester quelque chose déjà :

Donc
- Tu créé un équipement script. (Actif, visible et dans un objet parent)
- Tu met un cron d'auto-actualisation (* * * * *) par exemple pour toutes les minutes.
- Dedans tu créé une commande script de type Info/Autre que tu nomme Etat (par exemple).
- Tu sauvegarde.
- Tu clique sur le bouton nouveau de la commande Etat.
- Nom du script, tu mets ring.php.
- Ca va t'ouvrir un éditeur, tu copie/colle dedans le contenu de ton fichier ring.php
- Tu enregistres.
- Tu re-clique sur le bouton nouveau de la commande Etat.
- Nom du script, tu mets ring_infos.php (par exemple)
- Ca va t'ouvrir un éditeur, et tu colle ça :

Code : Tout sélectionner

    <?php
        include "ring.php";
       
        $username = 'YOUR EMAIL ADDRESS HERE';
        $password = 'YOUR RING.COM PASSWORD HERE';
       
        $bell = new Ring();
        print "Authenticating...\n";
        $bell->authenticate($username, $password);
        print "My devices:\n";
        var_dump($bell->devices());
        print "Start polling for motion or dings...\n";
            $states = $bell->poll();
            if ($states) {
                $result = "";
                foreach($states as $state) {
                    if ($state['is_ding']) {
                        $result = $result . "Ding - ";
                    }
                   
                    if ($state['is_motion']) {
                        $result = $result . "Motion - ";
                    }
                }
               echo $result;
            } else {
               echo "Calme";
           }
?>
Est-ce que tu arrives à avoir quelque chose sur le dashboard dans ton équipement ?
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 10 mars 2017, 09:39

Ah c'est sympa d'avoir pris le temps pour trouver une solution.

Je n'ai pas le pc sous la main avant plusieurs jours et du tel comme pour toi je n'arrive à rien faire.

Je te dirait ce qu'il en est ;)

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: Création script Portier Ring.com

Message par Sshafi » 10 mars 2017, 09:45

Là c'est juste une solution pour voir si le script marche bien et qu'on récupère bien les valeurs sous jeedom....
Pour une solution plus définitive, j'ai une idée mais on verra ça après...
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 14 mars 2017, 10:47

Je pense avoir tout fait comme tu m'as dit.

Je vois bien les valeurs remonter sur le dashboard en brut, seulement je constate à la fin de ces infos une erreur dans le fichier ring.php à la ligne 86.
Bref, ça me rend vert :x

J'ai essayé de le tester en direct sur mon syno avec un serveur apache et php et ça me donne un retour erreur 504...

Ca risque de compliquer le truc...

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: Création script Portier Ring.com

Message par Sshafi » 14 mars 2017, 10:52

Fait un screenshot de ce que ça donne stp et de l'erreur pour voir

From Tapatruc...
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 14 mars 2017, 11:16

Voilà le screenshot, j'ai juste caché l'identifiant


La partie de droite est tronquée par l'affichage de mon écran, désolé
Dernière édition par maxtone le 29 août 2017, 19:53, édité 1 fois.

Avatar de l’utilisateur
Zitoune
Actif
Messages : 697
Inscription : 30 déc. 2014, 12:02

Re: Création script Portier Ring.com

Message par Zitoune » 14 mars 2017, 15:49

maxtone a écrit :Voilà le screenshot, j'ai juste caché l'identifiant
il en reste encore
Béta-Testeur, avec une VM de production Debian 9, sous Proxmox qui tourne sur un fanless I5. Et d'autre VM pour les tests.
Les protocoles >> OpenZWave, RfxCom, Orvibo (Pour l'IR), Xioami

Avatar de l’utilisateur
Zitoune
Actif
Messages : 697
Inscription : 30 déc. 2014, 12:02

Re: Création script Portier Ring.com

Message par Zitoune » 14 mars 2017, 15:50

maxtone a écrit :Voilà le screenshot, j'ai juste caché l'identifiant
il en reste encore
Béta-Testeur, avec une VM de production Debian 9, sous Proxmox qui tourne sur un fanless I5. Et d'autre VM pour les tests.
Les protocoles >> OpenZWave, RfxCom, Orvibo (Pour l'IR), Xioami

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 14 mars 2017, 16:09

Ah bon ? Tu parles des coordonnées GPS peut être ? Ça c'est pas grave

Avatar de l’utilisateur
Zitoune
Actif
Messages : 697
Inscription : 30 déc. 2014, 12:02

Re: Création script Portier Ring.com

Message par Zitoune » 14 mars 2017, 16:38

Première ligne, avant dernière et au milieu >> token is
Béta-Testeur, avec une VM de production Debian 9, sous Proxmox qui tourne sur un fanless I5. Et d'autre VM pour les tests.
Les protocoles >> OpenZWave, RfxCom, Orvibo (Pour l'IR), Xioami

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 14 mars 2017, 16:48

Non ça va, les tokens sont régénérés toutes les minutes [SMILING FACE WITH SMILING EYES] Depuis ils ne sont plus valables

Avatar de l’utilisateur
Zitoune
Actif
Messages : 697
Inscription : 30 déc. 2014, 12:02

Re: Création script Portier Ring.com

Message par Zitoune » 14 mars 2017, 16:54

OK, alors c'est parfait, j'allais justement regarder le code... donc je retourne a mes occupations !! Bon courage a toi
Béta-Testeur, avec une VM de production Debian 9, sous Proxmox qui tourne sur un fanless I5. Et d'autre VM pour les tests.
Les protocoles >> OpenZWave, RfxCom, Orvibo (Pour l'IR), Xioami

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 14 mars 2017, 17:04

Je te remercie mouais le script que j'ai trouvé a l'air bancal...

Si ça remonte une erreur c'est pas top pour l'implémenter dans Jeedom... [PENSIVE FACE]

maxtone
Timide
Messages : 136
Inscription : 06 mars 2017, 16:03

Re: Création script Portier Ring.com

Message par maxtone » 16 mars 2017, 16:20

@Sshafi

Tu me confirmes ce qui m’effraie ? Pô possible ?

Ca paraît chaud à mettre en place avec une erreur de ce type.
Je devrais contacter l'auteur du script et voir avec lui

Avatar de l’utilisateur
Sshafi
Actif
Messages : 3891
Inscription : 01 juil. 2014, 16:08
Localisation : Albi

Re: Création script Portier Ring.com

Message par Sshafi » 16 mars 2017, 16:57

Désolé j'avais pas eu le temps de regarder le message sur un pc.
Mais là j'avoue que je sais pas trop, je ne suis pas dev donc je comprend pas tout, mais oui vu que l'erreur sort du fichier ring.php essaye de contacter l'auteur du script.

Un dernier test que tu peux faire c'est faire un nouveau script php dans ton équipement script (par ex: ring_infos2.php) en mettant le code original du 2eme script de ton premier post. Puis tu essaye d'y accéder en allant dans un navigateur à l'url : http://IP-JEEDOM/plugins/script/core/re ... infos2.php
Et voir ce que ça donne ...
??? Menfin ...
VM ESXi # Aeon Lab Gen5 | RFXtrx433E | ...
Trucs & Astuces

Répondre

Revenir vers « [Plugin officiel] Scripts »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités