Dubbio uso node red mqtt

image

posso capire perche anche se seguo alla lettera le istruzioni del sito continua a farmi questa cosa?!
[{“id”:“bc4e0f21.0d239”,“type”:“tab”,“label”:“Flow 2”,“disabled”:false,“info”:""},{“id”:“638a0761.43fa38”,“type”:“mqtt in”,“z”:“bc4e0f21.0d239”,“name”:“89”,“topic”:“v1/mqtt-user/things/client/cmd/89”,“qos”:“1”,“datatype”:“auto”,“broker”:"",“x”:155,“y”:166,“wires”:[[“5950f30d.cfd86c”]]},{“id”:“5950f30d.cfd86c”,“type”:“function”,“z”:“bc4e0f21.0d239”,“name”:“Send Back Received Value”,“func”:“msg.payload = msg.payload.slice(-1);\n\nreturn msg;”,“outputs”:1,“noerr”:0,“x”:401.5,“y”:177,“wires”:[[“936feda8.7e42c”,“1e37e44a.bbe2cc”]]},{“id”:“1e37e44a.bbe2cc”,“type”:“mqtt out”,“z”:“bc4e0f21.0d239”,“name”:"",“topic”:“v1/mqtt-user/things/client/cmd/89”,“qos”:"",“retain”:"",“broker”:"",“x”:247,“y”:356,“wires”:},{“id”:“936feda8.7e42c”,“type”:“debug”,“z”:“bc4e0f21.0d239”,“name”:“fedback”,“active”:true,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“true”,“targetType”:“full”,“x”:804,“y”:229,“wires”:}]

we are aware of this issue and looking into it.

speriamo di risolvere. collegare node red a cayenne è fantastico perche risolve il problema della mancata connessione e derivanti problemi di comunicazione erraa anche ai fini della sicurezza delle regole, ma se non riusciamo a risolvere questi problemi di comunicazione l’unica srada rimane solo la dashboard di cayenne

risolto
, bastava creare un processo di response manuale, basta creare delle funzioni per rispondere alla dashboard con un response

1 Like

glad to hear it is solved. can you share it here.

[{“id”:“9bef5e63.98ea9”,“type”:“mqtt out”,“z”:“4485dc12.039304”,“name”:“mqtt cameretta”,“topic”:“comando verso mqtt”,“qos”:“0”,“retain”:“true”,“broker”:"",“x”:759,“y”:214,“wires”:},{“id”:“b3dc9ed9.b909d”,“type”:“mqtt in”,“z”:“4485dc12.039304”,“name”:"",“topic”:“conferma4 daldispositivo”,“qos”:“2”,“datatype”:“auto”,“broker”:"",“x”:151,“y”:315,“wires”:[[“5f3292d9.44149c”,“242103c1.4845bc”]]},{“id”:“8a417b45.5b1e18”,“type”:“mqtt in”,“z”:“4485dc12.039304”,“name”:“Cameretta”,“topic”:“pulsante cayenne”,“qos”:“2”,“datatype”:“auto”,“broker”:"",“x”:119,“y”:225,“wires”:[[“70145693.a34b68”,“dc0e624c.da56f”]]},{“id”:“70145693.a34b68”,“type”:“function”,“z”:“4485dc12.039304”,“name”:“Send Back Received Value”,“func”:"\n\n\nmsg.payload = msg.payload.slice(-1);\n\nreturn msg;",“outputs”:1,“noerr”:0,“x”:337,“y”:219,“wires”:[[“ef6d4a86.fee378”]]},{“id”:“dc0e624c.da56f”,“type”:“function”,“z”:“4485dc12.039304”,“name”:“response”,“func”:“var msgarray =msg.payload.split(’,’);\n//var rele1;\nvar prova=msgarray[0];\nflow.set(‘variabile funzinoe response’,prova)|| {};\nmsg.payload=prova;\nreturn msg;”,“outputs”:1,“noerr”:0,“x”:286,“y”:259,“wires”:[]},{“id”:“ef6d4a86.fee378”,“type”:“change”,“z”:“4485dc12.039304”,“name”:"",“rules”:[{“t”:“change”,“p”:“payload”,“pt”:“msg”,“from”:“1”,“fromt”:“num”,“to”:“on”,“tot”:“str”},{“t”:“change”,“p”:“payload”,“pt”:“msg”,“from”:“0”,“fromt”:“num”,“to”:“off”,“tot”:“str”}],“action”:"",“property”:"",“from”:"",“to”:"",“reg”:false,“x”:563,“y”:216,“wires”:[[“9bef5e63.98ea9”]]},{“id”:“5f3292d9.44149c”,“type”:“delay”,“z”:“4485dc12.039304”,“name”:"",“pauseType”:“delay”,“timeout”:“1”,“timeoutUnits”:“seconds”,“rate”:“1”,“nbRateUnits”:“1”,“rateUnits”:“second”,“randomFirst”:“1”,“randomLast”:“5”,“randomUnits”:“seconds”,“drop”:false,“x”:343,“y”:358,“wires”:[[“9b25c057.595aa”]]},{“id”:“9b25c057.595aa”,“type”:“mqtt out”,“z”:“4485dc12.039304”,“name”:“feedback pulsante cameretta”,“topic”:“feedback data verso cayenne”,“qos”:“0”,“retain”:“true”,“broker”:“ef0583b7.4d41f”,“x”:572,“y”:321,“wires”:},{“id”:“242103c1.4845bc”,“type”:“function”,“z”:“4485dc12.039304”,“name”:“allego response”,“func”:“var local=flow.get(‘variabile funzinoe response’)|| {};\nvar msgarray=local;\n msg.payload=“ok,”+msgarray;\nreturn msg;\n”,“outputs”:1,“noerr”:0,“x”:533,“y”:271,“wires”:[[“9fd7c842.06d0e8”]]},{“id”:“9fd7c842.06d0e8”,“type”:“mqtt out”,“z”:“4485dc12.039304”,“name”:“response Pulsane”,“topic”:“response verso cayenne”,“qos”:“0”,“retain”:“true”,“broker”:“ef0583b7.4d41f”,“x”:782,“y”:272,“wires”:},{“id”:“ef0583b7.4d41f”,“type”:“mqtt-broker”,“z”:"",“name”:“Convettori”,“broker”:“mqtt.mydevices.com”,“port”:“1883”,“clientid”:“28652a60-1078-11ea-a38a-d57172a4b4d4”,“usetls”:false,“compatmode”:false,“keepalive”:“60”,“cleansession”:true,“birthTopic”:"",“birthQos”:“0”,“birthPayload”:"",“closeTopic”:"",“closeQos”:“0”,“closePayload”:"",“willTopic”:"",“willQos”:“0”,“willPayload”:""}]

provo a spiegare,
dal mqtt cameretta ricere da dashboard cayenne che invia al disposiivo mqtt, dal dispositivo riceviamo la conferma di avvenuto recapito e cambio stato del dispositivo,in modo che ce un riscontro sul dispositivo nel caso non dovesse funzionare o non essere collegato, e invia il messaggio response alla dashboard di cayenne per far cambiare stato al pulsane e ne aggiorna i dati.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define mqtt_user ""
#define mqtt_password ""

const char* ssid = "";
const char* password = "";
#define PUBLISH_DELAY   15000
#define relayPin1  16
#define relayPin2 5
#define relayPin3 4
#define relayPin4 0
#define antifurto 14

#include <OneWire.h> 
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
float T0;
float T1;
float T2;
int zero=0;
int ANTIFURTO=14;
bool relaystate1 = LOW;
bool relaystate2 = LOW;
bool relaystate3 = LOW;
bool relaystate4 = LOW;
bool startsend = HIGH;

long previousMillis;

String ip = "";
const char* mqtt_server = "";

WiFiClient Convettori;
PubSubClient client(Convettori);

const int lamp = 1;

bool state = false;

void setup_wifi() {
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected - ESP IP address: ");
  Serial.println(WiFi.localIP());
  ip = String (WiFi.localIP()[0]);
  ip = ip + ".";
  ip = ip + String (WiFi.localIP()[1]);
  ip = ip + ".";
  ip = ip + String (WiFi.localIP()[2]);
  ip = ip + ".";
  ip = ip + String (WiFi.localIP()[3]);
  
}

void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
   
  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message
  if (topic == "Casa/convettori/ip") {
    if (messageTemp == "ip") {
      client.publish("Casa/convettori/ip", ip.c_str());
    }
    
  }
  if (topic == "Casa/convettori/1") {
   
    if (messageTemp == "on") {
      digitalWrite(relayPin1, HIGH);
      client.publish("Casa/convettori/conferma1", "1");
    }
    else if (messageTemp == "off") {
      digitalWrite(relayPin1, LOW);
      client.publish("Casa/convettori/conferma1", "0");
    }
  
  }
  if (topic == "Casa/convettori/2") {
   
    if (messageTemp == "on") {
      digitalWrite(relayPin2, HIGH);
      client.publish("Casa/convettori/conferma2", "1");
    }
    else if (messageTemp == "off") {
      digitalWrite(relayPin2, LOW);
      client.publish("Casa/convettori/conferma2", "0");
    }
  
  }

  if (topic == "Casa/convettori/3") {
   
    if (messageTemp == "on") {
      digitalWrite(relayPin3, HIGH);
      client.publish("Casa/convettori/conferma3", "1");
    }
    else if (messageTemp == "off") {
      digitalWrite(relayPin3, LOW);
      client.publish("Casa/convettori/conferma3", "0");
    }
  
  }

  if (topic == "Casa/convettori/4") {
   
    if (messageTemp == "on") {
      digitalWrite(relayPin4, HIGH);
      client.publish("Casa/convettori/conferma4", "1");
    }
    else if (messageTemp == "off") {
      digitalWrite(relayPin4, LOW);
      client.publish("Casa/convettori/conferma4", "0");
    }
  
  }
  Serial.println();
  Serial.print("ciclo callback");
   Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    /*
      YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
      To change the ESP device ID, you will have to give a new name to the ESP8266.
      Here's how it looks:
       if (client.connect("ESP8266Client")) {
      You can do it like this:
       if (client.connect("ESP1_Office")) {
      Then, for the other ESP:
       if (client.connect("ESP2_Garage")) {
      That should solve your MQTT multiple connections problem
    */
    if (client.connect("Convettori", mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Subscribe or resubscribe to a topic
      // You can subscribe to more topics (to control more LEDs in this example)
      client.subscribe("Casa/convettori");
      client.subscribe("Casa/convettori/ip");
      client.subscribe("Casa/convettori/1");
      client.subscribe("Casa/convettori/2");
      client.subscribe("Casa/convettori/3");
      client.subscribe("Casa/convettori/4");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void setup() {
  Serial.begin(9600);
  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);
  pinMode(relayPin3, OUTPUT);
  pinMode(relayPin4, OUTPUT);
  pinMode(antifurto, INPUT);
  digitalWrite(relayPin1, HIGH);
  digitalWrite(relayPin2, HIGH);
  digitalWrite(relayPin4, HIGH);
  digitalWrite(relayPin3, HIGH);
  
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
 
}
void loop() {
  long state = digitalRead(antifurto);
  if (!client.connected()) {
    reconnect();
  }
  if (!client.loop())
    client.connect("Convettori");
    
   relaystate1 = digitalRead(relayPin1);// Reads the state of a relay
   relaystate2 = digitalRead(relayPin2);// Reads the state of a relay
   relaystate3 = digitalRead(relayPin3);// Reads the state of a relay
   relaystate4 = digitalRead(relayPin4);// Reads the state of a relay
   
if (millis() - previousMillis > PUBLISH_DELAY) {
    
    previousMillis = millis();
     Serial.print(" Requesting temperatures..."); 
   sensors.requestTemperatures(); // Send the command to get temperature readings 
 Serial.println("DONE"); 
/********************************************************************/
 Serial.print("Temperature is: "); 
 Serial.println(sensors.getTempCByIndex(0));
 Serial.print("Temperature is: "); 
 Serial.println(sensors.getTempCByIndex(1));
 Serial.print("Temperature is: "); 
 Serial.println(sensors.getTempCByIndex(2));
 T0=sensors.getTempCByIndex(0);
 T1=sensors.getTempCByIndex(1);
 T2=sensors.getTempCByIndex(2);
  char msgBuffer[20];
  
  Serial.print("Relay 1 is: ");
  Serial.println((relaystate1 == LOW) ? "OPEN" : "CLOSED");
  Serial.print("Relay 2 is: ");
  Serial.println((relaystate2 == LOW) ? "OPEN" : "CLOSED");
  Serial.print("Relay 3 is: ");
  Serial.println((relaystate3 == LOW) ? "OPEN" : "CLOSED");
  Serial.print("Relay 4 is: ");
  Serial.println((relaystate4 == LOW) ? "OPEN" : "CLOSED");
   client.publish("Casa/convettori/onewire1", dtostrf(T0,0,2, msgBuffer));
   client.publish("Casa/convettori/onewire2", dtostrf(T1,0,2, msgBuffer));
   client.publish("Casa/convettori/onewire3", dtostrf(T2,0,2, msgBuffer));
   
   Serial.println("invio dati onewire");
   
  if(digitalRead(ANTIFURTO) == HIGH){
   
      
      state = true;
      Serial.println("BECCATO");
      client.publish("antifurto","1");
      
      
    }
  
  if(digitalRead(ANTIFURTO) == LOW){
   
      
      state = false;
      client.publish("antifurto","0");
      Serial.println("libero");
    }
  }

}

allego anche il codice di arduino nel caso qualcuno ci voglia capire o aiutarmi a migliorarlo

thank you @Massimotruglio83 for sharing this important information.

è un piacere aiutale la comunità e risparmiare tempo a chi ne vuole imparare, e sopratutto aiutare voi a sviluppare meglio e piu velocemente

1 Like

Un appunto.
Il codice di Arduino manda in mqtt la temperatura, ma nn so perché la invia con lo spazio davanti e quindi se ci aggiungi l unita di misura va in crash la dasboard.
In parole povere se invii a cayenne la stringa “temp,c= 20.12” va in errore.
Quindi sono stato costretto a creare una funzione che tagli lo spazio e tutto funziona.
Ho riscontrato lo stesso problema con i nodi di mikejac. Se invii i dati con lo spazio va in errore la dashboard

if you send the string "temp, c = 20.12" to cayenne, it goes wrong. which space are you referring to?
check this https://developers.mydevices.com/cayenne/docs/cayenne-mqtt-api/#cayenne-mqtt-api-manually-publishing-subscribing-send-sensor-data-to-cayenne

Non intendo un errore da parte vostra. Ma da parte mia e del mio codice. Che inviando in mqtt a nodered il valore richiesto anteponendo uno spazio, io col il flow postato prendevo il valore,gli aggiungevo “temp,c=” + spazio + “valore” e mandava in errore la dashboard cayenne, mentre inviando solo il valore senza specificare l unita di misura funzionava tutto.
Ho solo voluto condividere il problema del mio codice, come risolverlo e condividere con voi sviluppatori la scoperta.

2 Likes