Arduino Uno W5100 et Domoticz

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:

#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

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

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 :

#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

@+

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.

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

@+

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) :

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

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 ...

Et le point 2 ?

supercc:
Et le point 2 ?

Pardon je n'ai pas mis le code :

#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()
{



}

@+

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....

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 ...

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).

La classe client HTTP.

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

j'ai tester le client HTTP :

#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?

Oui, jusqu'à ce qu'on me montre l'inverse :wink:

Bonsoir

j'ai baisser mis le niveau de sécurité de la livebox en personnalisé en autorisant le 8080 ( au cas où ce serait ça) idem...
j'ai taper :
http://192.168.1.200:8080/json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=-22

sur une tablette qui n'a pas eu acces et la T° a changer.
je ne comprends pas le probleme entre le client.get (); et le faites de taper le message dans une page web ....

@+

sur une tablette qui n'a pas eu acces et la T° a changer.

Donc il n'y a pas que ton programme qui n'y arrive pas. C'est ça ?

Une histoire de couple utilisateur/mot de passe nécessaire et enregistré dans les ordis qui y arrivent ?

je n'est jamais taper de mdp sur la tablette

Ok, je n'avais pas compris. Bon la seconde voie c'est de générer ta requète à la main, comme tu faisais avec client.println, mais là il va falloir que tu injectes une requête http bien formée. Regardes peut-être cet exemple :

https://www.fontenay-ronan.fr/wifi-light-sensor-using-a-wemos-d1-and-domoticz/