Domitcz mqtt arduino

Forum dédié au protocole MQTT : fonctionnement, intégration ...
Pour les questions concernant le plugin de FlyingDomotic, merci d'utiliser le sous-forum dédié.
loidailen
Messages : 19
Inscription : 24 nov. 2016, 21:21

Domitcz mqtt arduino

Message par loidailen »

Bonjour,

je tente faire fonctionner ce script en bas de page. Il s'agit d'un script arduino permettant de contrôler 4 leds avec des boutons poussoirs et de faire remonter l'information sur l'état de ces leds.

En l'état, il fonctionne nickel, j'ai juste fait un ajout pour qu'il indique à Domoticz l'état de la led (dans le void loop, ligne 181)

Code : Tout sélectionner

if (bouncer1.update()) {
    if (bouncer1.read() == HIGH) {
      if (led1Value == LOW) {
        led1Value = HIGH;
        client.publish("led","1on");
        client.publish("domoticz/in","{\"idx\": 624, \"nvalue\": 1}");								
      } else {
        led1Value = LOW;
        client.publish("led","1off");
        client.publish("domoticz/in","{\"idx\": 624, \"nvalue\": 0}");
      }
    }
  }  
Un appui sur un BP allume bien la led et change l'état de celle-ci dans Domoticz.
Mosquitto est installé sur le même Raspberry que Domoticz.
Si j'envoie "mosquitto_pub -h 192.168.0.249 -t "led" -m "1on"" ou "mosquitto_pub -h 192.168.0.249 -t "led" -m "1off"", la led s'allume et s'éteint correctement.

Seul problème, dans ce cas, Domoticz ne sait pas si la led est allumée ou éteinte.
J'ai essayé de placer un autre "client.publish("domoticz/in","{\"idx\": 624, \"nvalue\": 1}");" en divers endroits mais j'obtiens toujours une erreur.
Je tourne un peu en rond

Qui aurait une idée comment incruster cette commande et où ?

Par avance merci.

Code : Tout sélectionner

/*
 Example MQTT-switch-relay-node with 4 buttons and 4 leds 
 
  - connects to an MQTT server
  - publishes "hello world" to the topic "led"
  - subscribes to the topic "led"
  - controls 4 leds on pins 2,3,5 and 6 - leds can be replaced with relays
  - reads 4 button on pins 7,8,9 and 10
  - turns on/off a specific led when it receives a specific "on"/"off" from the "led" topic
  - sends a specific "on"/"off" to the "led" topic a specific button is pressed
  - multiple arduino's with same generic sketch can run parallel to each other
  - multiple arduino's need each to have a unique ip-addres, unique mac address and unique MQTT client-ID

  - tested on arduino-uno with W5100 ethernet shield
  - Ethernet Shield W5100 uses pins 4,10,11,12,13
  - availbale digital pins: 1,2,3,5,6,7,8,9,10 
*/

//------------------------------------------------------------------------------

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

// Set led variables to Arduino digital pins
int led1 = 2;
int led2 = 3;
int led3 = 5;                             // pin 4 used by ethernet shield
int led4 = 6;


// Set button variables to Arduino digital pins
int button1 = 7;
int button2 = 8;
int button3 = 9;
int button4 = 10;                         // pins 11,12,13 used by ethernetshield

// Set variables to act as virtual switches
// Set variable values initially to LOW (and not HIGH)
int led1Value = LOW;             
int led2Value = LOW;
int led3Value = LOW;
int led4Value = LOW;


//---------------------------------------------------------------------------

// Arduino MAC address is on a sticker on your Ethernet shield
// must be unique for every node in same network
// To make a new unique address change last letter

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

// Unique static IP address of this Arduino - change to adapt to your network
IPAddress ip(192,168,0,238);

// IP Address of your MQTT broker - change to adapt to your network
byte server[] = { 192, 168, 0, 20 };

// Handle and convert incoming MQTT messages ----------------------------------------

void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
  String content="";
  char character;
  for (int num=0;num<length;num++) {
      character = payload[num];
      content.concat(character);
  }   
  Serial.println(topic);
  Serial.println(content); // message sent out by button actions is returned from broker and serial printed


// Set specific virtual switches on basis of specific incoming messages ----------------------------
  
  if (content == "1on") {
    led1Value = HIGH;
  }
  
  if (content == "1off") {
    led1Value = LOW;
  }
  
  if (content == "2on") {
    led2Value = HIGH;
  }
  
  if (content == "2off") {
    led2Value = LOW;
  }

  
  if (content == "3on") {
    led3Value = HIGH;
  }
  
  if (content == "3off") {
    led3Value = LOW;
  }
  
  if (content == "4on") {
    led4Value = HIGH;
  }
  
  if (content == "4off") {
    led4Value = LOW;
  }
  
    
  // Set digital pin states according to virtual switch settings
    
  digitalWrite(led1,led1Value);
  digitalWrite(led2,led2Value);
  digitalWrite(led3,led3Value);
  digitalWrite(led4,led4Value);

}

// Initiate instances -----------------------------------

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Initiate a bouncer instance for each button
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();
Bounce bouncer3 = Bounce();
Bounce bouncer4 = Bounce();

//-------------------------------------------------------

void setup()

{

  // setup led, button, bouncer 1 -----------------------
  pinMode(led1, OUTPUT);
  pinMode(button1,INPUT);
  digitalWrite(button1,HIGH);
  bouncer1 .attach(button1);
  bouncer1 .interval(5);

  // setup led, button, bouncer 2 -----------------------
  pinMode(led2, OUTPUT);
  pinMode(button2,INPUT);
  digitalWrite(button2,HIGH);
  bouncer2 .attach(button2);
  bouncer2 .interval(5);

  // setup led, button, bouncer 3 -----------------------
  pinMode(led3, OUTPUT);
  pinMode(button3,INPUT);
  digitalWrite(button3,HIGH);
  bouncer3 .attach(button3);
  bouncer3 .interval(5);

  // setup led, button, bouncer 4 -----------------------
  pinMode(led4, OUTPUT);
  pinMode(button4,INPUT);
  digitalWrite(button4,HIGH);
  bouncer4 .attach(button4);
  bouncer4 .interval(5);

  // setup serial and ethernet communications -------------------------------

  // Setup serial connection
  Serial.begin(9600);

  // Setup ethernet connection to MQTT broker
  Ethernet.begin(mac);
  if (client.connect("arduino-ip-238")) {  							// change as desired - clientname must be unique for MQTT broker
    client.publish("led","hello world - here arduino ip 239");
    Serial.println("connected");
    client.subscribe("led");										// subscribe to topic "led"
  }
}

//----------------------------------------------

void loop()
{

// Listen for button interactions and take actions ----------------------------------------  
// Note: Button actions do send MQTT message AND do set led(x)Value to HIGH or LOW

  if (bouncer1.update()) {
    if (bouncer1.read() == HIGH) {
      if (led1Value == LOW) {
        led1Value = HIGH;
        client.publish("led","1on");								
      } else {
        led1Value = LOW;
        client.publish("led","1off");
      }
    }
  }  

//-----------------------------------------------
  
  if (bouncer2.update()) {
    if (bouncer2.read() == HIGH) {
      if (led2Value == LOW) {
        led2Value = HIGH;
        client.publish("led","2on");
      } else {
        led2Value = LOW;
        client.publish("led","2off");
      }
    }
  }  
  
//------------------------------------------------  

  if (bouncer3.update()) {
    if (bouncer3.read() == HIGH) {
      if (led3Value == LOW) {
        led3Value = HIGH;
        client.publish("led","3on");
      } else {
        led3Value = LOW;
        client.publish("led","3off");
      }
    }
  }  

//-----------------------------------------------
  
  if (bouncer4.update()) {
    if (bouncer4.read() == HIGH) {
      if (led4Value == LOW) {
        led4Value = HIGH;
        client.publish("led","4on");
      } else {
        led4Value = LOW;
        client.publish("led","4off");
      }
    }
  }  
  
//------------------------------------------------  
  
  client.loop();
}

// End of sketch ---------------------------------
Doume
Messages : 550
Inscription : 28 déc. 2014, 10:27
Localisation : Nord (59)
Contact :

Re: Domitcz mqtt arduino

Message par Doume »

Dans domoticz, tu as déclaré un matériel 'MQTT client gateway' ?
Ceci permet à Domoticz de voir passer tous les messages de mosquitto
loidailen
Messages : 19
Inscription : 24 nov. 2016, 21:21

Re: Domitcz mqtt arduino

Message par loidailen »

Merci pour ta réponse.

Oui j'ai déclaré un matériel mqtt dans domoticz et j'ai ajouté un dispositif "Arduino Led 1"
Donc quand j'actionne un BP, la vraie led s'allume et la led de domoticz également.

Quand j'utilise "mosquitto_pub -h 192.168.0.249 -t "led" -m "1on", la led physique s'allume correctement mais je voudrais que la led de domoticz s'allume également.
J'ai bien pensé mettre dans un script pour le BP virtuel les 2 commandes, à savoir :
"mosquitto_pub -h 192.168.0.249 -t "led" -m "1on"
"client.publish("domoticz/in",""idx" : 624, "nvalue" : 1");

mais ca me donne pas l'état réel de la led physique, comme pour le BP, il faut que ce soit l'arduino qui transmette l'état LOW ou HIGH.

J'ai essayé à cet endroit qui commute suivant les messages reçus, mais je n'arrive pas à me débrouiller avec les multiples messages d'érreur :

Code : Tout sélectionner

// Set specific virtual switches on basis of specific incoming messages ----------------------------
  
  if (content == "1on") {
    led1Value = HIGH;
  }
  
  if (content == "1off") {
    led1Value = LOW;
  }
Je pense qu'il faut mettre les infos sur le broker avant mais il y a toujours un truc non déclaré.
Je suis perdu
Doume
Messages : 550
Inscription : 28 déc. 2014, 10:27
Localisation : Nord (59)
Contact :

Re: Domitcz mqtt arduino

Message par Doume »

Je pense que le message à publier, c'est plutôt du type :
{"idx":624, "nvalue":1, "svalue":"On"}
loidailen
Messages : 19
Inscription : 24 nov. 2016, 21:21

Re: Domitcz mqtt arduino

Message par loidailen »

J'ai corrigé mais le problème reste qu'il faut que je trouve où mettre cette ligne dans le script arduino.

Dans l'état actuel, l'information vers Domoticz ne se fait que lorsque j'appuie sur un bouton.

Maintenant, je voudrais commander le led avec Domoticz et avoir le retour d'état de la part de la carte arduino
Je fais :

Code : Tout sélectionner

mosquitto_pub -h 192.168.0.249 -t "led" -m "1on"
L'arduino commute en fonction de ce qu'elle lit :
if (content == "1on") {
led1Value = HIGH;
}
Ca fonctionne également mais c'est dans ces lignes qu'il faudrait que j'insère à nouveau

Code : Tout sélectionner

client.publish("domoticz/in","{\"idx\": 624, \"nvalue\": 1, \"svalue\": \"on\"}");
pour que l'arduino indique à Domoticz que le led est bien allumée.

Je sais pas si je suis bien clair :D
Doume
Messages : 550
Inscription : 28 déc. 2014, 10:27
Localisation : Nord (59)
Contact :

Re: Domitcz mqtt arduino

Message par Doume »

Je n'ai hélas pas d'expérience avec la librairie mosquitto sur Arduino....
loidailen
Messages : 19
Inscription : 24 nov. 2016, 21:21

Re: Domitcz mqtt arduino

Message par loidailen »

Merci quand même ;)
Antori91

Re: Domitcz mqtt arduino

Message par Antori91 »

Bonjour,
J'ai publié ici le script Arduino pour ESP8266 que j'utilise pour une gestion de l'éclairage. L'éclairage s'allume soit via un appui sur un des boutons-poussoirs ou soit depuis Domoticz. Si tu allumes via un bouton poussoir, Domoticz en est informé (Domoticz est toujours synchronisé avec l'éclairage). Les échanges avec Domoticz se font via MQTT. Tu peux peut-être t'en inspirer.
https://easydomoticz.com/forum/viewtopi ... 335#p48335
loidailen
Messages : 19
Inscription : 24 nov. 2016, 21:21

Re: Domitcz mqtt arduino

Message par loidailen »

Merci pour ton exemple, je vais essayer de le décortiquer et l'adapter à l'arduino.
Doume
Messages : 550
Inscription : 28 déc. 2014, 10:27
Localisation : Nord (59)
Contact :

Re: Domitcz mqtt arduino

Message par Doume »

Pour info, l'ESP8266 est 'full compatible' Arduino. Il suffit de configurer le type de carte dans l'Arduino IDE.
Ce qui est différent, c'est seulement la taille de la flash et de la RAM.
Et la fréquence du processeur, ce qui n'affecte en rien la programmation.
Répondre