Contrôler la serrure avec la gateway

Gateway


Fonctionnalités


Paramètre réseau

Récupération de l'adresse IP par DHCP.

On ne récupère que les paramètres réseau de base: IP, netmask et gateway.

La gateway ne récupère pas le serveur DNS, ni le proxy si il y en a un.

La gateway ne fonctionne pas si un proxy est utilisé.

Recuperation de l'IP api.the-keys.fr.

On utilise le serveur DNS de google: 8.8.8.8


Taches récurrentes

La gateway scanne en continu les serrures. Si une serrure annonce qu'elle doit se synchroniser (pour envoyer les informations d'ouverture ou fermeture), la gateway synchronise la serrure

Toutes les 5s, elle envoie au serveur les informations sur les serrures qu'elle voit. Le serveur en retour renvoie les informations sur les éventuelles synchronisation à faire

Lors de la synchronisation, si un nouveau firmware est disponible, elle se met à jour

Dans les informations de synchronisation de la serrure, il y a la mise à jour éventuelle du firmware des serrures


Serveur WS


Liste des serrures

curl http://<ip>/lockers

Réponse: 

{"status": "ok", "devices": [{"identifier": 45961123, "rssi": -71, "battery":4065}]}


Synchroniser la gateway

curl http://<ip>/synchronize

Réponse:

{"status": "ok", "code": 0}


Erreurs:

Si la gateway est occupée (autre action en cours): 

{"status": "500", "message": "busy"}


Synchroniser une serrure

curl -d "identifier=<id locker>" http://<ip>/locker/synchronize

Réponse:

{"status": "0", "code": "ok"}


Erreurs:

Si la gateway est occupé (autre action en cours): 

{"status": "500", "message": "busy"}

Serrure non détectée:

status = 1

La serrure n'est pas vue par la gateway


Serrure non compatible:

status = 2

La serrure n'est pas compatible avec la gateway


Données invalides

status = 3

Le serveur api.the-keys.fr a renvoyé des données de synchronisation invalides (c'est un cas possible sur un problème serveur)


Erreur lors de la synchronisation

status = 4

Erreur de connexion avec la serrure


Mise à jour de la gateway

La gateway sera mise à jour, même si le firmware est déjà à jour.

curl http://<ip>/update


Erreurs:

Si la gateway est occupé (autre action en cours): 

{"status": "500", "message": "busy"}


Firmware invalide

status = 1

Le cas standard est une erreur de téléchargement


Erreur générique

status = 2

Si le serveur ne renvoie pas le firmware.



Mise à jour d'une serrure

curl -d "identifier=<id locker>" http://<ip>/locker/update


Ouvrir une serrure

Création du partage

Pour utiliser la gateway depuis une box domotique, il faut d'abord créer un partage entre la serrure et la gateway. 

Chaque gateway a un id unique que vous pouvez retrouver sur sa notice


Il faut ensuite créer le partage en utilisant le WS "createWithAccessory":

    def createShare(self, name, locker, gateway):


        data = {}

        data["partage_accessoire[description]"] = "" 

        data["partage_accessoire[nom]"] = name


        headers={"Authorization": "Bearer %s"%self.token}


        r = requests.post("https://%s/fr/api/v2/partage/create/%s/accessoire/%s"%(self.host, locker, gateway), headers=headers, data=data)

        data = json.loads(r.text)

        code=data["data"]["code"]


Le WS renvoie en retour le code du partage.


Génération du hmac

On utilise un timestamp pour générer le hmac. Le timestamp est unique par requête et on ne peut pas utiliser un timestamp plus ancien que le précédent. 

Exemple en python de la génération du hmac:

ts = str(int(time.time()))

hm = hmac.new(code, ts.encode("ascii"), "sha256")

hash = hm.digest()


Ouverture

Pour l'ouverture, on envoie le timestamp et le hash:

curl -d "identifier=<id locker>&hash=<hash>&ts=<ts>" http://<ip>/open

Réponse:

{"status": "0", "code": "ok"}


Erreur:

Paramètre manquant: 

status = 400

Le code contient les informations sur le paramètre manquant (timestamp, hash ou identifier)


La serrure n'est pas partagée

status = 32

La gateway ne peut pas valider le hmac si il n'y a pas de partage avec elle.


Hmac invalide

status = 33


La serrure n'est pas detectée

status = 34


La serrure n'est pas compatible

status = 35


Clé invalide

status = 36

La gateway a essayé d'ouvrir, mais la serrure a refusé la clef. 

Vérifier que le partage existe et que la serrure est synchronisé dans ce cas.

Autre erreur

status = 37

Tous les cas d'erreurs non identifiés: 

  - La connexion à la serrure a échoué

  - La connexion s'est coupé

  - La serrure renvoie un timeout


Fermer une serrure

La fermeture se fait comme l'ouverture. il n'y a que l'url qui change:

curl -d "identifier=<id locker>&hash=<hash>&ts=<ts>" http://<ip>/close


Status de la gateway

A partir de la version 17

curl http://<ip>/status

reponse: 

{"version": "16", "current_status": "Scanning..."}


Status d'une serrure

La récupération du statut se fait comme pour l'ouverture. il n'y a que l'url qui change:

curl -d "identifier=<id locker>&hash=<hash>&ts=<ts>" http://<ip>/locker_status

Il y a 3 codes possibles en réponse:

Etat inconnue (code 0x30)

Ce cas se produit quand la serrure vient de démarrer (après une mise à jour par exemple).

Porte fermée (code 0x31)

Porte ouverte (code 0x32)


Test rapide

Ci joint les 2 fichiers python qui permettent d'interagir avec la gateway

 ./test.py --help

usage: test.py [-h] [-d] [-i IDENTIFIER] [--host HOST] [-c CODE] action


positional arguments:

  action                open, close, search, synchronize, update,

                        synchronize_locker, update_locker


optional arguments:

  -h, --help            show this help message and exit

  -d, --debug

  -i IDENTIFIER, --identifier IDENTIFIER

                        locker identifier

  --host HOST           host

  -c CODE, --code CODE  code

Par exemple, pour ouvrir:

./test.py --host 192.168.0.26 -i 45961123 -c 'Zmo1sps2OVyCFtl1' open


Cela vous a-t-il aidé à résoudre votre problème ?