Page 1 sur 1

Utilisation de JSON pour s'interfacer avec appli homemade Arduino

Publié : 30 juil. 2016, 23:21
par raymi
Salut la compagnie !

J'ai des questions aux spécialistes du JSON et tout et tout avec Domoticz.

D'abord, un rapide rappel de mon projet:
J'ai un réseau d'Arduino qui communiquent en RS485, ce qui me permet d'avoir des Arduinos disséminés partout avec un simple fil RJ45 (qui envoie le 12V et fait le lien RS485) sur de longues distances.
Maintenant, j'ai un Arduino principal doté d'un Ethernet Shield et je souhaite l'interfacer avec Domoticz. C'est là où j'en viens à vous
J'ai déjà fait une présentation de mon installation ici : viewtopic.php?f=8&t=1446

Là où j'en suis:
Mon Arduino principal (MCP - Maitre contrôle principal (référence culturelle!)) fonctionne avec une application basé sur le WebServer.
En me connectant à mon MCP, je peux envoyer une requête qui est traduite et transférée sur le réseau RS485 et réciproquement.
Tout ceci fonctionne à merveille, je peux aussi voir les statuts de tous mes équipements dans un navigateur web, mais tout ça c'est du texte et je peux pas automatiser comme ça.
D'après mes lectures, c'est de JSON que j'ai besoin, mais je ne comprends pas tout ça très bien.

Je me suis farci cette lecture: https://www.domoticz.com/wiki/Domoticz_API/JSON_URL's mais je comprends que c'est surtout destiné à des équipements "commerciaux" et j'ai du mal à en tirer profit pour mon application.
Je comprend le principe de JSON, mais je ne sais pas comment faire parler mon MCP avec mon serveur Domoticz. La lecture de la doc sur l'API ne m'a pas aidé beaucoup.

J'ai suivi et réalisé ceci : https://www.raywenderlich.com/38841/ard ... ure-sensor (mais sans l'application iOS qui va avec).

Je sais que je ne choisi pas l'option facile, peut être que j'aurai pu (ou pourrai) m'inspirer de MySensor, mais étant pourtant assez expérimenté dans le développement, il est souvent plus difficile d'embarquer dans du code inconnu que de repartir de 0 (et en plus on apprend bien plus en repartant de 0).

Au secours !
Après avoir longuement réfléchit je me pose ces questions, et je vous demande votre aide pour me guider là dedans:
- Mon MCP ne devrait il pas plutôt être un client plutôt qu'un serveur ? Puisque c'est Domoticz le serveur web ?
- Je veux que mon MCP envoie des statut à Domoticz aussi souvent que nécessaire, sans attendre que Domoticz l'interroge
- Pouvez-vous m'aider à comprendre JSON, par exemple, je ne comprend pas le format des messages JSON:

Code : Tout sélectionner

http://<username:password@>domoticz-ip<:port>/json.htm?api-call
est ce que json.htm?api-call correspond à l'interpéteur de Domoticz ?
Si oui, je ne sais pas comment faire ça avec mon Arduino (à part utiliser en mode client ?)

Exemple réalisé (Domoticz vers MCP):

J'ai créé un sélecteur à 3 niveaux et j'ai renseigné une adresse "http" pour le Action On qui envoie la requête à mon MCP. Mais cette adresse est statique et n'est pas paramétrable:

Code : Tout sélectionner

http://192.168.0.177?RNETcmd=1&dest=106&com=61&p1=*****Niveau*****&p2=0&p3=0
et je voudrais que "Niveau" soit remplacé par la valeur correspondante au niveau.
MCP vers Domoticz:
J'ai fait un essai avec ce programme:

Code : Tout sélectionner

...
IPAddress ip(192, 168, 0, 177);
EthernetServer server(80);
EthernetClient client;
char DomoticzServer[] = "raymi-pc";    // name address for Google (using DNS)
...
void setup(){
...
void loop() {
...
    if (client.connect(DomoticzServer, 8080)) {
      Serial.println("connected to Domoticz");
      // Make a HTTP request:
      //client.println("http://raymi-pc:8080/json.htm?type=command&param=addlogmessage&message=MESSAGE");
      
      client.println("/json.htm?type=command&param=getSunRiseSet"); // j'interroge avec n'importe quoi pour espérer obtenir une réponse
      client.println();
      Serial.println("Done - disconnect");
    }
    delay (100);
    if (client.available()) {	// est-ce que Domoticz a répondu ?
      char c = client.read();
      Serial.print(c);
    }

Dans ce cas-ci, je m'attend à ce que Domoticz me retourne quelque chose, mais... niet...


Bref, je crois que je manque quelque chose mais je ne parviens pas à mettre le doigt dessus.

Merci pour votre temps et pour votre aide !

Re: Utilisation de JSON pour s'interfacer avec appli homemade Arduino

Publié : 04 août 2016, 14:20
par pchatill
Bonjour.
Pour resumer, tu veux pouvoir:
Envoyer une requete http de domoticz vers arduino et inversement.
C'est ce que je fais et cela marche tres bien.
Donnes moi quelques precisions et je pourrai peut-etre t'aider

Patrick

Re: Utilisation de JSON pour s'interfacer avec appli homemade Arduino

Publié : 05 août 2016, 16:43
par raymi
Merci Patrick pour ta réponse.

Voilà un scénario typique:
1. un de mes arduino détecte un mouvement sur un PIR
2. Il envoie ça au MCP via une commande sur mon réseau RS485
3. Le MCP reçoit le message
4. Le MCP transcris et retransmet au serveur Domoticz qui logge cet évènement

En faisant des recherches j'ai réussi à faire fonctionner l'envoie du MCP vers Domoticz en me basant sur l'exemple webclient et des choses trouvées à droite et à gauche. (notamment ça : http://www.touteladomotique.com/forum/v ... 50&t=15234)
Je transmet une commande GET en invoquant json.html et en passant des paramètres tel que décris dans la doc de l'API.
C'est pas encore parfait mais au moins j'ai réussi à faire fonctionner quelque chose (qui se contente d'ajouter un message dans le log de Domoticz)

En conclusion:
- j'ai réussi à me débloquer un peu
- mon sketch sur mon arduino MCP est un mix de serveur web et de client
- je dois comprendre maintenant comment utiliser les script domoticz pour envoyer des commandes de domoticz vers le MCP
- je dois comprendre maintenant comment domoticz peut exploiter les messages json reçus pour activer désactiver des switchs et autres dans le board Domoticz.
Je dois travailler encore de mon côté pour aller plus loin :)

Mon application à moi est en fait très proche de MySensor, sauf que je fais pas de sans fil, et que mes arduino ont de l'intelligence (ils peuvent fonctionner en autonomie, le réseau RS485 ne servant qu'à activer à distance différents modes de fonctionnement, par exemple, une lampe qui est en mode AUTO (commandée par un capteur de mouvement) ou toujours ON)

EDIT:
J'ai fait un test en créant un "dummy" interrupteur (Selector) à 3 états de type "Light Switch". Je vais dans Dispositif et je vois que son ID est 1. Mon Arduino envoie une commande comme ceci:

Code : Tout sélectionner

    if (clientD.connect(DomoticzServer, 8080)) {
      Serial.println("connected to Domoticz");
      // Make a HTTP request:
      clientD.print("GET /json.htm?type=command&param=switchlight&idx=1&switchcmd=Set%20Level$Level=20");

      clientD.println(" HTTP/1.1");
      clientD.println("User-Agent: arduino-ethernet");
      clientD.println("Connection: keep-open");
      clientD.println();
Dans la console de mon arduino j'observe cette valeur de retour de Domoticz:

Code : Tout sélectionner

connected to Domoticz
HTTP/1.1 200 OK
Content-Length: 126
Content-Type: application/json;charset=UTF-8
Cache-Control: no-cache
Pragma: no-cache
Access-Control-Allow-Origin: *

{
   "message" : "Error sending switch command, check device/hardware !",
   "status" : "ERROR",
   "title" : "SwitchLight"
}
Est-ce que je manque quelque chose ? Tout à l'air bon, le device ID est OK.
Est-ce que ma commande est bonne ? Pour un interrupteur virtuel, est-ce qu'il faut aussi param=switchlight ?
A noter que j'ai tenté d'ajouter des messages dans le log de Domoticz ou mettre à jour un capteur virtuel Text, et ça marche.

Merci pour l'aide :)

Re: Utilisation de JSON pour s'interfacer avec appli homemade Arduino

Publié : 05 août 2016, 22:01
par raymi
Et bien ça me porte de chance de poster mes questions ici car je viens de trouver.

Il y avait une faute de syntaxe dans ma requête json...

Code : Tout sélectionner

clientD.print("GET /json.htm?type=command&param=switchlight&idx=1&switchcmd=Set%20Level****&****Level=20");