Go Down

Topic: Arduino Uno W5100 et Domoticz (Read 871 times) previous topic - next topic

J4l13n

Bonjour à toutes et a tous,

Je sais pas si le site arduino est le bon pour poser la question ...

J'ai installé Domoticz sur un raspberry pi, et j'essaye de lui envoyer une valeur lambda "22.33" avec un arduino UNO avec un shield ethernet W5100 sur le même réseau:

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>

byte mac[] =
{
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 1, 201);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);

EthernetClient client;

char DomoticzServer[] = "logon:123456@192.168.1.200";

float temperature = 22.33;

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
}



void loop()
{
  delay(1000);
  if (client.connect(DomoticzServer, 8080))
  {
    client.println("logon:123456@192.168.1.200:8080/json.htm?type=command&param=sensor&idx=2&temperature");
    client.println();
  }
}



sur Domoticz j'ai indiquer le matériel :




Mais la valeur 22.33 ne remonte pas 

Mon code est surement pas bon ...

Une idée ?


Merci
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

supercc

#1
Aug 15, 2019, 05:45 pm Last Edit: Aug 15, 2019, 05:47 pm by supercc
Bonsoir,

d'après la doc le mot de passe doit être codé en "Base64" . La doc donne un lien vers un encodeur en base64.

Sans garantie.

EDIT : le nom d'utilisateur aussi doit être en  base64

J4l13n

Bonjour

j'ai avancer avec de l'aide j'ai compris qu'il faut envoyer la commande dans le navigateur :

http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=14

et la valeur est mise a jour dans domoticz.

donc :



Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
byte mac[] =
{
0x10, 0x11, 0x12, 0x13, 0x14, 0x15
};

IPAddress ip(192, 168, 1, 201);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);
EthernetClient client;
char DomoticzServer[] = "192.168.1.200";

float temperature = 22.33;


void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
}

void loop()
{
delay(1000);
if (client.connect(DomoticzServer, 8080))
{
delay(100);
client.println("http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");
client.println();
}
}


Là logiquement le code est bon ? 

si le DomoticzServer répond sur le port 8080;


on écrit http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16

@+
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

hbachetti

D'après cette doc : Domoticz_API/JSON_URL%27s#Temperature

/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP

Cela me semble OK.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

J4l13n

Oui oui 
quand je tape en changeant le 16


192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16 


dans un navigateur la valeur est bien prise en compte par domoticz


mais le code dans le poste #2 ne fonctionne pas 


@+
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

supercc

Essaye peut-être :

1. Afficher en plus l'url généré par ton programme sur la console:
    Serial.println("http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");

Si tu constates quel est bonne essaye peut-être ceci ( sans certitude, pas d'expérience avec domoticz) :

2. Après avoir fini de poster ta requête, force le vidage du flux client.flush(); attend un peu (delay(200);) puis ferme la connexion client.stop();. Sans certitude (pas d'expérience avec domoticz).

J4l13n

J'ai bien le Serial.print qui apparait dans la console signe qu'il est envoyé, mais la valeur n'est pas actualisée dans domoticz, si je la copie et  colle la syntaxe  dans chrome il est bien actualisé sur domoticz ...

while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

supercc


J4l13n

Et le point 2 ?
Pardon je n'ai pas mis le code :
Code: [Select]


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15  };
IPAddress ip(192, 168, 1, 201);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);
EthernetClient client;

char DomoticzServer[] = "192.168.1.200";

float temperature=22.33;

void setup()
{

 
  Serial.begin(9600);
Serial.println("demarrage");
  char erreur = 0;
  // On démarre le shield Ethernet SANS adresse IP (donc donnée via DHCP)
  erreur = Ethernet.begin(mac);

  if (erreur == 0) {
    Serial.println("Parametrage avec ip fixe...");
    // si une erreur a eu lieu cela signifie que l'attribution DHCP
    // ne fonctionne pas. On initialise donc en forçant une IP
    Ethernet.begin(mac, ip);
  }
  Serial.println("Init...");
  // Donne une seconde au shield pour s'initialiser
  delay(1000);
  Serial.println("Pret !");



  delay(1000);

if (client.connect(DomoticzServer, 8080))
 {
 delay(100);
    client.println("192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");
       Serial.println("192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");                                         
    client.println();
    client.flush();
    delay(200);
    client.stop();
  }

 
}

void loop()
{



}

@+
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

supercc

Une dernière piste et après je suis à court d'idée. Peut-être que le serveur domticz est sensible au retour à la lignes.

Il y en a 2 par requètes pour toi :
println("...");
println();

Retire le second pour voir,

Si cela ne fonctionne par garde le second retiré  et remplace le premier par

print("...");

Un peu à l'aveuglette....


J4l13n

Non toujours pas 

j'ai essayer également :
client.print("/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");
et
client.print("json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");

sans succes ...
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

supercc

Bon je crois que c'est n'importe quoi ce qu'on fait. Si le serveur domotizc est un serveur http normal, on est en train de lui balancer des URL alors qu'il s'attend à des requêtes HTTP de la forme GET....HTML... composées de plusieurs lignes... Il doit exister une classe Client HTTP sous arduino qui doit avoir une méthode du style get. A cette méthode tu devrais pouvoir passer ton URL et elle se chargera de former la requête (les bonnes lignes).


supercc


Charly26

Salut, as tu regardé domoticz et les serveur mqtt ?
C'est vraiment très efficace er simple à mettre en place

En gros sa permet de communiquer entre plusieurs périphériques ( ou même plusieurs script sur la même machine), en duplex.

Il faut activer le serveur mqtt de domoticz.

Ensuite l'arduino se connecte au serveur mqtt et peut mettre à jour la valeur de la température.


Il y a de nombreux tutoriels pour activer le mqtt sur domoticz.
Il y en a aussi pour utiliser la librairie sur arduino.


En gros la requête http que tu essaye d'envoyer,
Tu l'envoi vers le serveur mqtt

mettre à jour un capteur par mqtt

Si ce protocol t'intéresse n'hésites pas.

J'avais eu quelques difficultés à mettre en place la bonne  requête mqtt pour la température. Ou c'était pour l'humidité je ne le souviens plus.
N'hésites pas à me demander ma requête.


Autre avantage, c'est que sur le pc ou rpi tu peux aussi te mettre en écoute sur le mqtt de domoticz voir ce qu'il se trame lors de tes essais !
Bonne soirée

J4l13n

j'ai tester le client HTTP :

Code: [Select]


#include <SPI.h>
#include <Ethernet.h>
#include <Bridge.h>
#include <HttpClient.h>


byte mac[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15  };
IPAddress ip(192, 168, 1, 201);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);


HttpClient client;

void setup()
{

 
  Serial.begin(9600);
Serial.println("demarrage");
  char erreur = 0;
  // On démarre le shield Ethernet SANS adresse IP (donc donnée via DHCP)
  erreur = Ethernet.begin(mac);

  if (erreur == 0) {
    Serial.println("Parametrage avec ip fixe...");
    // si une erreur a eu lieu cela signifie que l'attribution DHCP
    // ne fonctionne pas. On initialise donc en forçant une IP
    Ethernet.begin(mac, ip);
  }
  Serial.println("Init...");
  // Donne une seconde au shield pour s'initialiser
  delay(1000);
  Serial.println("Pret !");

  delay(1000);

   client.get("http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");
   Serial.println("192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=16");                                         
}

void loop()
{
}


Sans succes , on est d'accord que le client.get (); est l'équivalent de taper la commande dans la barre d'adresse d'un navigateur?

while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

Go Up