pb Command not received by node (Domoticz+raspberry+arduino)

Bonjour a tous,
J’ai pour projet de domotiser un peu ma maison. Jusque la je me servais d’un serveur web sur Arduino et de plusieurs cartes relais connectées, J’avais des problemes de lenteur et on m’avait conseillé de passer sur raspberry et domoticz et de regarder la librairie Mysensor.
Chose faite, cepandant j’ai quand meme besoin d’avoir des relais directement sur la carte arduino et non en sans fil.

J’en suis à faire des essais : Domoticz tourne, il reconnait ma passerelle et mes capteurs et actionneurs (une sonde temp, la led 13 de l’Arduino et 4 relais sur 4 sorties de l’arduino).
Lorsque je clique sur l’interrupteur:

  • le relais change bien d’état
  • La lampe est bien allumée sur Domoticz (icone)
    mais Domoticz me dit :
    "Erreur d’envoi de la commande à l’interrupteur, vérifiez le dispositif/matériel "
    et dans le log :
    2019-08-21 19:58:30.043 (Arduino uno) Light/Switch (Relai 1)
    2019-08-21 19:58:30.061 Error: MySensors: Repeating previous command (2/2)
    2019-08-21 19:58:30.161 Error: MySensors: Command not received by Node !! (node_id: 12, child_id: 5)

Le pb vient du code Arduino j’ai adapter un code ou il n’y avait que la sonde et la Led 13 et ca fonctionnait nickel.

Il y a un truc que je dois pas faire comme il faut avec les serial print ou peut etre les delay mais je ne sais pas quoi!!(ca fait 2 jours que je tente des trucs mais toujours au meme point!)

Voici le code arduino:

#define LED_LIGHT 13
#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 4 // Total number of attached relays

// named constant for the pin the sensor is connected to
const int sensorPin = A0;
const long interval = 30000;           // interval of sensors
const long intervalPublish = 3000000;  // interval of publish
unsigned long previousMillis = 0;      // will store last time LED was updated
unsigned long previousPublish = 0;

const int numReadings = 150;

unsigned readings[numReadings];      // the readings from the analog input
int index = 0;                       // the index of the current reading
unsigned long total = 0;             // the running total
unsigned int average = 0;            // the average



void setup() {
  
  for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
   // digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
  }
  pinMode(LED_LIGHT, OUTPUT);   
  // open a serial connection to display values
  Serial.begin(115200);
  delay(100);
  Serial.println();
  delay(100);
  // MySensors serial protocol:
  // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
  Serial.println("12;1;0;0;17;Arduino UNO\n");
  Serial.println("12;3;0;0;6;Termometro TMP36\n");
  Serial.println("12;4;0;0;3;LED Light\n");
  Serial.println("12;5;0;0;3;Relai 1\n");
  Serial.println("12;6;0;0;3;Relai 2\n");
  Serial.println("12;7;0;0;3;Relai 3\n");
  Serial.println("12;8;0;0;3;Relai 4\n");

}

void loop() {
   unsigned long currentMillis = millis();
   String ch;
   
   
   total= total - readings[index];        // subtract the last reading:      
   delay(1);                              // delay in between reads for stability    
   readings[index] = analogRead(sensorPin); 
   total= total + readings[index];        // add the reading to the total:     
   index = index + 1;                     // advance to the next position in the array:                   
   if (index >= numReadings)  index = 0;  // if we're at the end of the array...wrap around to the beginning:                   
   average = total / numReadings;         // calculate the average: 

   
   
  if (currentMillis - previousMillis >= interval) 
  {
    // save the last time you blinked the LED
    previousMillis = currentMillis;    
    // convert the ADC reading to voltage
    float voltage = (average / 1024.0) * 5.0;
    float temperature = (voltage - .5) * 100;
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    Serial.print("12;3;1;0;0;");
    Serial.println(temperature);
    if (digitalRead(LED_LIGHT) == HIGH)
    {
      Serial.println("12;4;1;0;2;1");
    }
    else
    {
      Serial.println("12;4;1;0;2;0");
    }
    
    if (digitalRead(4) == HIGH)
    {
      Serial.println("12;5;1;0;2;1");
    }
    else
    {
      Serial.println("12;5;1;0;2;0");
    }
    if (digitalRead(5) == HIGH)
    {
      Serial.println("12;6;1;0;2;1");
    }
    else
    {
      Serial.println("12;6;1;0;2;0");
    }
    if (digitalRead(6) == HIGH)
    {
      Serial.println("12;7;1;0;2;1");
    }
    else
    {
      Serial.println("12;7;1;0;2;0");
    }
    if (digitalRead(7) == HIGH)
    {
      Serial.println("12;8;1;0;2;1");
    }
    else
    {
      Serial.println("12;8;1;0;2;0");
    }  
    
  }

   if (currentMillis - previousPublish >= intervalPublish) 
   {
     previousPublish = currentMillis;
     Serial.println("12;1;0;0;17;Arduino UNO\n");
     Serial.println("12;3;0;0;6;TMP36\n");
     Serial.println("12;4;0;0;3;LED Light\n");  
    Serial.println("12;5;0;0;3;Relai 1\n");
    Serial.println("12;6;0;0;3;Relai 2\n");
    Serial.println("12;7;0;0;3;Relai 3\n");
    Serial.println("12;8;0;0;3;Relai 4\n");
   }

   
  if (Serial.available()) // is there anything to be read from USB?
  {
    ch = Serial.readStringUntil('\n'); // read a single command string
    
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;4;1;0;2;1"
    if(ch.startsWith("12;4;1;0;2;1") || ch.startsWith("12;4;1;1;2;1"))
    {
      digitalWrite(LED_LIGHT,HIGH); 
      Serial.println("12;4;1;0;2;1");
    }
    else if(ch.startsWith("12;4;1;0;2;0") || ch.startsWith("12;4;1;1;2;0"))
    {
      digitalWrite(LED_LIGHT,LOW);
      Serial.println("12;4;1;0;2;0");
    }
  // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;5;1;0;2;1"
    else if(ch.startsWith("12;5;1;0;2;1") || ch.startsWith("12;5;1;1;2;1"))
    {
      digitalWrite(4,HIGH); 
      Serial.println("12;5;1;0;2;1");
    }
    else if(ch.startsWith("12;5;1;0;2;0") || ch.startsWith("12;5;1;1;2;0"))
    {
      digitalWrite(4,LOW);
      Serial.println("12;5;1;0;2;0");
    }
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;6;1;0;2;1"
    else if(ch.startsWith("12;6;1;0;2;1") || ch.startsWith("12;6;1;1;2;1"))
    {
      digitalWrite(5,HIGH); 
      Serial.println("12;6;1;0;2;1");
    }
    else if(ch.startsWith("12;6;1;0;2;0") || ch.startsWith("12;6;1;1;2;0"))
    {
      digitalWrite(5,LOW);
      Serial.println("12;6;1;0;2;0");
    }
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;7;1;0;2;1"
    else if(ch.startsWith("12;7;1;0;2;1") || ch.startsWith("12;7;1;1;2;1"))
    {
      digitalWrite(6,HIGH); 
      Serial.println("12;7;1;0;2;1");
    }
    else if(ch.startsWith("12;7;1;0;2;0") || ch.startsWith("12;7;1;1;2;0"))
    {
      digitalWrite(6,LOW);
      Serial.println("12;7;1;0;2;0");
    }
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;8;1;0;2;1"
    else if(ch.startsWith("12;8;1;0;2;1") || ch.startsWith("12;8;1;1;2;1"))
    {
      digitalWrite(7,HIGH); 
      Serial.println("12;8;1;0;2;1");
    }
    else if(ch.startsWith("12;8;1;0;2;0") || ch.startsWith("12;8;1;1;2;0"))
    {
      digitalWrite(7,LOW);
      Serial.println("12;8;1;0;2;0");
    }
  }
  delay(100);
}

Si une âme charitable pouvait m’aiguiller!
Merci

Personnellement je pratique plutôt DOMOTICS avec MYSENSORS, donc radio.

Je me demande bien de quoi tu t'es inspiré pour écrire ce code.
Un exemple ?
Un lien ?
Une documentation ?

Bonjour,

A vrai dire j’ai trouvé un sketch qui était uniquement avec la LED 13 sur un blog (impossible de remettre la main sur le lien!).
Devant le problème que j’avais, il fallait que je vois ce qui se passait sur le port serie. j’ai recodé un sketch arduino pour afficher la console serie sur un tft afin de voir ce qu’envoyait domoticz et ce que repondait arduino.(mon usb était occupé par le RPI). J’ai trouver des codes en python pour afficher la console dans le terminal mais ca plantait et ne maitrisant ni le python ni linux, j’ai laisser tombé.
J’ai pu comprendre ce que demandait DOMOTICZ et ce qu’il fallait envoyer pour répondre.

De la j’ai recommencé a zero avec un code un peu plus propre (pour un debutant comme moi!).

Et la tout fonctionne, j’ai mis une sonde de temperature et ma carte qui pilote mes 4 relais.

Cela dit au bout d’un moment que ca tournait, j’ai a nouveau la meme erreur mais que sur 1 des 4 inters(alors qu’ils sont codés exactement pareil).
Du coup j’en suis là, je sais pas si c’est un probleme de timing ou de données qui se perdent sur le serie…
J’avoue ne pas comprendre le fait de redéclarer à DOMOTICZ la passerelle et les différents capteurs actionneur toute les 3000000ms

Voici donc le nouveau code

/*
 * Passerelle ARDUINO MEGA pour DOMOTICZ
 * VERSION 1
 */
#include <DHT.h>
#define DHTTYPE DHT11
 
 //--------------------------
 // Declaration des variables
 //---------------------------
const long interval = 10000;           
const long intervalPublish = 3000000;   
unsigned long previousMillis = 0;      
unsigned long previousPublish = 0;    

/*
 * Declaration des Pins
 */
#define DHTPIN 40 // Digital pin connected to the DHT sensor
#define Relai1 22
#define Relai2 24
#define Relai3 26
#define Relai4 28
int numReadings = 150;

 //Init du DHT
 DHT dht(DHTPIN, DHTTYPE);
void setup() {
  /*
 * Affectation des Pins en Sortie
 */
 pinMode(Relai1, OUTPUT);digitalWrite(Relai1,HIGH);
 pinMode(Relai2, OUTPUT);digitalWrite(Relai2,HIGH);
 pinMode(Relai3, OUTPUT);digitalWrite(Relai3,HIGH);
 pinMode(Relai4, OUTPUT);digitalWrite(Relai4,HIGH);
 Serial.begin(115200);
 dht.begin();

 /*
  * Declaration des différents capteurs et actionneurs
  * MySensors serial protocol:
  * node-id;child-sensor-id;message-type;ack;sub-type;payload\n
  */
  Serial.println("13;1;0;0;17;Arduino Mega\n");
  Serial.println("13;2;0;0;3;MegaRelai 1\n");
  Serial.println("13;3;0;0;3;MegaRelai 2\n");
  Serial.println("13;4;0;0;3;MegaRelai 3\n");
  Serial.println("13;5;0;0;3;MegaRelai 4\n");  
  Serial.println("13;6;0;0;6;Sonde Temp\n");
  //Serial.println("13;7;0;0;7;Sonde Humidite\n");
}

void loop() {
  unsigned long currentMillis = millis();
  String ch;
  if (currentMillis - previousMillis >= interval) 
  {
    previousMillis = currentMillis;
    // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  //float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();  

  // Compute heat index in Celsius (isFahreheit = false)
  //float hic = dht.computeHeatIndex(t, h, true);
    Serial.print("13;6;1;0;0;");
    Serial.println(t);Serial.println("");
    //Serial.print("13;7;1;0;1;");
    //Serial.println(h);
    
    if (digitalRead(Relai1) == LOW)
    {
      Serial.println("13;2;1;0;2;1\n");
    }
    else
    {
      Serial.println("13;2;1;0;2;0\n");      
    }
    if (digitalRead(Relai2) == LOW)
    {
      Serial.println("13;3;1;0;2;1\n");
    }
    else
    {
      Serial.println("13;3;1;0;2;0\n");      
    }
    if (digitalRead(Relai3) == LOW)
    {
      Serial.println("13;4;1;0;2;1\n");
    }
    else
    {
      Serial.println("13;4;1;0;2;0\n");      
    }
    if (digitalRead(Relai4) == LOW)
    {
      Serial.println("13;5;1;0;2;1\n");
    }
    else
    {
      Serial.println("13;5;1;0;2;0\n");      
    }    
  }
  if (currentMillis - previousPublish >= intervalPublish) 
   {
     previousPublish = currentMillis;
     Serial.println("13;1;0;0;17;Arduino Mega\n");
    Serial.println("13;2;0;0;3;MegaRelai 1\n");
    Serial.println("13;3;0;0;3;MegaRelai 2\n");
    Serial.println("13;4;0;0;3;MegaRelai 3\n");
    Serial.println("13;5;0;0;3;MegaRelai 4\n");  
    Serial.println("13;6;0;0;6;Sonde Temp\n");
    //Serial.println("13;7;0;0;7;Sonde Humidite\n");
  
   }
if (Serial.available()) // is there anything to be read from USB?
  {
    ch = Serial.readStringUntil('\n'); // read a single command string
    
    // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;2;1;0;2;1"
    if(ch.startsWith("13;2;1;0;2;1") || ch.startsWith("13;2;1;1;2;1"))
    {
      digitalWrite(Relai1,LOW); 
      Serial.println("13;2;1;0;2;1\n");
    }
    else if(ch.startsWith("13;2;1;0;2;0") || ch.startsWith("13;2;1;1;2;0"))
    {
      digitalWrite(Relai1,HIGH);
      Serial.println("13;2;1;0;2;0\n");
    }
 // node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;3;1;0;2;1"
    else if(ch.startsWith("13;3;1;0;2;1") || ch.startsWith("13;3;1;1;2;1"))
    {
      digitalWrite(Relai2,LOW); 
      Serial.println("13;3;1;0;2;1\n");
    }
    else if(ch.startsWith("13;3;1;0;2;0") || ch.startsWith("13;3;1;1;2;0"))
    {
      digitalWrite(Relai2,HIGH);
      Serial.println("13;3;1;0;2;0\n");
    }
// node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;4;1;0;2;1"
    else if(ch.startsWith("13;4;1;0;2;1") || ch.startsWith("13;4;1;1;2;1"))
    {
      digitalWrite(Relai3,LOW); 
      Serial.println("13;4;1;0;2;1\n");
    }
    else if(ch.startsWith("13;4;1;0;2;0") || ch.startsWith("13;4;1;1;2;0"))
    {
      digitalWrite(Relai3,HIGH);
      Serial.println("13;4;1;0;2;0\n");
    }
// node-id;child-sensor-id;message-type;ack;sub-type;payload\n
    // Check message: "12;5;1;0;2;1"
    else if(ch.startsWith("13;5;1;0;2;1") || ch.startsWith("13;5;1;1;2;1"))
    {
      digitalWrite(Relai4,LOW); 
      Serial.println("13;5;1;0;2;1\n");
    }
    else if(ch.startsWith("13;5;1;0;2;0") || ch.startsWith("13;5;1;1;2;0"))
    {
      digitalWrite(Relai4,HIGH);
      Serial.println("13;5;1;0;2;0\n");
    } delay (100);   
    }
}

Je dois avoir le sketch originel mais je ne retrouve pas le lien

En tout cas merci d’avoir pris le temps de lire mon post et de m’avoir répondu (on se sent moins seul tout à coup :wink: !)

Je dois avoir le sketch originel mais je ne retrouve pas le lien

Et dans l'historique du navigateur ?

C'est une façon très peu conventionnelle de travailler avec DOMOTICZ, fait avant tout pour communiquer par radio. Tu obtiendras peu ou pas d'aide.

Chose faite, cepandant j'ai quand meme besoin d'avoir des relais directement sur la carte arduino et non en sans fil.

J'avoue ne pas comprendre le besoin. Des relais pour commander quoi ?

Dans mon salon la prise connectée MYSENSORS la plus proche est à 1m du serveur DOMOTICZ.
Il est possible aussi d'utiliser des prises WIFI du genre SONOFF ou autre.

Il est toujours plus intéressant d'utiliser un module radio plutôt qu'un mètre de câbles qui traînent.

Bonjour
J’ai besoin d’avoir des relais câbles directement pour la simple raison que mes différentes lignes d’eclairage Extérieure (périphérie, allée, arbres, piscines) sont des lignes directes à mon tableau Elec. Actuellement elles sont pilotées par une horloge Astro avec différent programme.
Je me servirai par la suite du sans fil pour le reste (différentes sondes de piscine et arrosage auto(je n’y ai pas encore reflechi)) en montant une deuxième passerelle Mysensors(j’ai fait un test ça a l’air de fonctionner).

Pour ce qui est de mon pb, hier soir j’ai fais une sauvegarde de ma carte sd et en remettant la carte copiée dans le rpi, j’ai le pb sur tous les inters. Je me dit que c’est peut être un pb avec la sauvegarde en bd ou autre qui fait que domoticz a l’impression qu’il n’y a pas de réponse. Je vais commander un sdd externe et réinstaller raspbian et domoticz proprement pour voir le resultat.
Pour l’historique, j’ai tout vider car j’ai rencontrer un problème d’affigage avec domoticz et il préconisait de vider le cache. J’ai pas réfléchit plus et j’ai tout supprimé! Je l’ai quand même retrouvé sur l’historique du téléphone :

(Désolé pour les balises je suis sur le téléphone et je ne les trouves pas!)

Je suis tombé sur ton blog qui est très intéressant!

Une autre question est il possible d’avoir un bureau à distance entre un rpi et Windows? Parce que 2 claviers 2souris et 2 écrans dans mon atelier ça me bouffe de la place sur l'établi!

Je donnerai des nouvelles une fois le test fait avec un sdd!

Merci

J'ai besoin d'avoir des relais câbles directement pour la simple raison que mes différentes lignes d'eclairage Extérieure (périphérie, allée, arbres, piscines) sont des lignes directes à mon tableau Elec. Actuellement elles sont pilotées par une horloge Astro avec différent programme.

Moi aussi j'ai des relais dans mon tableau, pilotés par un ESP8266 et un ARDUINO + NRF24L01, donc par radio :


Télérupteur à deux relais sur rail DIN.

Une autre question est il possible d'avoir un bureau à distance entre un rpi et Windows? Parce que 2 claviers 2souris et 2 écrans dans mon atelier ça me bouffe de la place sur l'établi!

Personnellement j'utilise SSH.
Désolé je ne connais pas Windows. Mais tu trouvera certainement ce qu'il te faut sur le WEB.