Go Down

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

J4l13n

#30
Aug 16, 2019, 12:27 pm Last Edit: Aug 16, 2019, 12:29 pm by J4l13n
Quel est l'intérêt de passer par Ethernet ?
Tu as un téléphone portable ou DECT ou tu es resté sur un téléphone filaire à cadran ?

Bonjour hbachetti,
J'ai un RJ45 qui arrive a cette endroit, et je prefere le câble à la radio. c'est mon choix ....
J'avais pas fait le rapprochement entre vous et votre site...
Je continu mes recherche.

sur le site https://easydomoticz.com/forum/viewtopic.php?f=20&t=8812

on me propose de prendre des ESP8266 mais ca reviens au meme non ?
@+
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

hbachetti

#31
Aug 16, 2019, 01:02 pm Last Edit: Aug 16, 2019, 01:02 pm by hbachetti
@supercc
Il n'y a pas d'intérêt à intégrer le WIFI à MYSENSORS.

Mais il y a moyen dans DOMOTICZ d'intégrer des dispositifs WIFI. Il suffit de lui dire quelles URLs il faut associer à l'action ON et OFF.
Mais cela ne marche que pour des dispositifs récepteurs comme une prise connectée.
Pour un dispositif émetteur comme un thermomètre, il y a certainement moyen en envoyant une requête JSON comme essaie de le faire J4l13n.

Depuis mon PC si j'envoie avec FireFox :
http://192.168.1.134:8080/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=22.4&

J'obtiens bien 22.4° et :
Code: [Select]

status "OK"
title "Update Device"

Ou avec curl :
Code: [Select]

$ curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET "http://192.168.1.134:8080/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=22.3&"
{
   "status" : "OK",
   "title" : "Update Device"
}

J'aurais bien essayé, j'ai une carte Ethernet W5100, mais peu de temps disponible hélas.

@J4l13n
J'y pense un peu tard : il existe une librairie JSON : ArduinoJson
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

J4l13n

@supercc
Il n'y a pas d'intérêt à intégrer le WIFI à MYSENSORS.

Mais il y a moyen dans DOMOTICZ d'intégrer des dispositifs WIFI. Il suffit de lui dire quelles URLs il faut associer à l'action ON et OFF.
Mais cela ne marche que pour des dispositifs récepteurs comme une prise connectée.
Pour un dispositif émetteur comme un thermomètre, il y a certainement moyen en envoyant une requête JSON comme essaie de le faire J4l13n.

Depuis mon PC si j'envoie avec FireFox :
http://192.168.1.134:8080/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=22.4&

J'obtiens bien 22.4° et :
Code: [Select]

status "OK"
title "Update Device"

Ou avec curl :
Code: [Select]

$ curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET "http://192.168.1.134:8080/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=22.3&"
{
   "status" : "OK",
   "title" : "Update Device"
}

J'aurais bien essayé, j'ai une carte Ethernet W5100, mais peu de temps disponible hélas.

@J4l13n
J'y pense un peu tard : il existe une librairie JSON : ArduinoJson

Merci de répondre déja :)
on peut faire cette commande "curl" avec Arduino ?
Code: [Select]
$ curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET "http://192.168.1.134:8080/json.htm?type=command&param=udevice&idx=14&nvalue=0&svalue=22.3&"
{
   "status" : "OK",
   "title" : "Update Device"
}


Sinon je regarde en parallèle  la lib Json ,
cette exemple peut être un point de départ ? :
https://github.com/bblanchon/ArduinoJson/blob/6.x/examples/JsonServer/JsonServer.ino
Code: [Select]
// ArduinoJson - arduinojson.org
// Copyright Benoit Blanchon 2014-2019
// MIT License
//
// This example shows how to implement an HTTP server that sends a JSON document
// in the response.
// It uses the Ethernet library but can be easily adapted for Wifi.
//
// The JSON document contains the values of the analog and digital pins.
// It looks like that:
// {
//   "analog": [0, 76, 123, 158, 192, 205],
//   "digital": [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
// }
//
// https://arduinojson.org/v6/example/http-server/

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(80);

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial) continue;

  // Initialize Ethernet libary
  if (!Ethernet.begin(mac)) {
    Serial.println(F("Failed to initialize Ethernet library"));
    return;
  }

  // Start to listen
  server.begin();

  Serial.println(F("Server is ready."));
  Serial.print(F("Please connect to http://"));
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Wait for an incomming connection
  EthernetClient client = server.available();

  // Do we have a client?
  if (!client) return;

  Serial.println(F("New client"));

  // Read the request (we ignore the content in this example)
  while (client.available()) client.read();

  // Allocate a temporary JsonDocument
  // Use arduinojson.org/v6/assistant to compute the capacity.
  StaticJsonDocument<500> doc;

  // Create the "analog" array
  JsonArray analogValues = doc.createNestedArray("analog");
  for (int pin = 0; pin < 6; pin++) {
    // Read the analog input
    int value = analogRead(pin);

    // Add the value at the end of the array
    analogValues.add(value);
  }

  // Create the "digital" array
  JsonArray digitalValues = doc.createNestedArray("digital");
  for (int pin = 0; pin < 14; pin++) {
    // Read the digital input
    int value = digitalRead(pin);

    // Add the value at the end of the array
    digitalValues.add(value);
  }

  Serial.print(F("Sending: "));
  serializeJson(doc, Serial);
  Serial.println();

  // Write response headers
  client.println(F("HTTP/1.0 200 OK"));
  client.println(F("Content-Type: application/json"));
  client.println(F("Connection: close"));
  client.print(F("Content-Length: "));
  client.println(measureJsonPretty(doc));
  client.println();

  // Write JSON document
  serializeJsonPretty(doc, client);

  // Disconnect
  client.stop();
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
// It begins with a simple example, then adds more features like serializing
// directly to a file or an HTTP client.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


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

supercc

En ce moment @manubis_sanchez avance sur le même projet que toi. Regardes peut-être son post.

On peut regretter que l'équipe domoticz ne fournisse pas une classe Arduino pour s'interfacer simplement... Beaucoup galèrent...

hbachetti

Quote
on peut faire cette commande "curl" avec Arduino ?
Non, sur Linux uniquement, peut-être trouvable pour Windows ?

Quote
JsonServer.ino
J'aurais plutôt vu un exemple client.
Qui est serveur à ton avis ? L'ARDUINO ou DOMOTICZ ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

manubis_sanchez

Salut, j'ai vu que tu étais passé sur mon post :)

Voici mon code pour envoyer des données d'Arduino vers Domoticz :
Code: [Select]
char server[] = "192.168.1.xx"; // Serveur Domoticz
WiFiClient client;
    Serial.println("Requête température");
    Serial.println("\nConnexion au serveur Domoticz ...");
    if (client.connect(server, port)) {
      Serial.println("Connecté au serveur");
      client.print("GET /json.htm?type=command&param=udevice&idx=63&nvalue=0&svalue=");
      client.print(temp());
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.xx"); // IP du serveur Domoticz
      Serial.print("Température envoyée : ");
      Serial.println(temp());
      client.println("Connexion terminée");
      client.println();
      delay(1);
    }
    boolean incomingData = false;
    while (client.available() && status == WL_CONNECTED) {
      if (incomingData == false) {
        Serial.println();
        Serial.println("--- Incoming data Start ---");
        incomingData = true;
        }
      char c = client.read();
      Serial.write(c);
      }
    client.flush();
    client.stop();
    Serial.println("Déconnecté du serveur Domoticz");


Mon code n'est peut-être pas très propre, ce sont des bouts de codes glanés et adaptés.
Pour toi ça ne sera pas WifiClient mais EthernetClient ;)
Si tu as des questions, n'hésite pas.

J4l13n

Merci :)
Code: [Select]


#include <SPI.h>
#include <Ethernet.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);
int temperature = 22;



char server[] = "192.168.1.200"; // Serveur Domoticz
char port[] = "8080";

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 !");

}


void loop()
{


HttpClient client;



    Serial.println("Requête température");
    Serial.println("\nConnexion au serveur Domoticz ...");
    if (client.connect(server, port)) {
      Serial.println("Connecté au serveur");
      client.print("GET /json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=");
      client.print("22.33");
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.200"); // IP du serveur Domoticz
      Serial.print("Température envoyée : ");
      Serial.println("22.33");
      client.println("Connexion terminée");
      client.println();
      delay(1);
    }
    boolean incomingData = false;
    while (client.available() && status == WL_CONNECTED) {
      if (incomingData == false) {
        Serial.println();
        Serial.println("--- Incoming data Start ---");
        incomingData = true;
        }
      char c = client.read();
      Serial.write(c);
      }
    client.flush();
    client.stop();
    Serial.println("Déconnecté du serveur Domoticz");

}

 
J'ai adpater pour le code mais le :
if (client.connect(server, port)) {
et
 while (client.available() && status == WL_CONNECTED)

Ne sont pas dan la lib EthernetClient .

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

supercc

Pour la connexion au wifi, vire...

Pour l'absence de HttpClient ce n'est pas  grave je pense, remplace là par EthernetClient() qui est un client TCP, suffisant puisque le code de manubis_sanchez n'utilise pas la méthode get.


J4l13n




Code: [Select]


#include <SPI.h>
#include <Ethernet.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);
int temperature = 22;



char server[] = "192.168.1.200"; // Serveur Domoticz
char port[] = "8080";

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 !");


EthernetClient client;


    Serial.println("Requête température");
    Serial.println("\nConnexion au serveur Domoticz ...");
    if (client.connect(server, port)) {
      Serial.println("Connecté au serveur");
      client.print("GET /json.htm?type=command&param=udevice&idx=1&nvalue=0&svalue=");
      client.print("22.33");
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.200"); // IP du serveur Domoticz
      Serial.print("Température envoyée : ");
      Serial.println("22.33");
      client.println("Connexion terminée");
      client.println();
      delay(1);
    }
    boolean incomingData = false;
    while (client.connect(server, port)) {
      if (incomingData == false) {
        Serial.println();
        Serial.println("--- Incoming data Start ---");
        incomingData = true;
        }
      char c = client.read();
      Serial.write(c);
      }
   client.flush();
    client.stop();
    Serial.println("Déconnecté du serveur Domoticz");


}


void loop()
{



}





Code: [Select]
demarrage
Init...
Pret !
Requête température

Connexion au serveur Domoticz ...
Déconnecté du serveur Domoticz






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

supercc

C'est comme si la carte n'arrivait pas à communiquer. Tu as un autre exemple de programme "réseau" sous la main pour tester ?

Comment est-elle connectée ?




J4l13n

Elle est connecté sur un CPL 

j'ai tester le code d'eskimon a l'instant :

https://eskimon.fr/tuto-arduino-803-arduino-et-ethernet-serveur

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

supercc

Ok, pas d'autres idées (pour l'instant). A ce stade (et même avant), perso, je lance sur mon PC wireshark et j'observe ce qui se passe. Wireshark est un analyseur réseau, tu verras tout passer.

Mais il y a peut être une bête coquille dans le code...

J4l13n

Bon ça fonctionne il fallait mettre le port 

client.println("Host: 192.168.1.200:8080");


sur cette ligne 


@+



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

supercc

Pffff... Bravo pour ta persévérance !

J4l13n

Plutôt Bravo!!!  à vous tous de m'aider et de me supporter ^^

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

Go Up