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
[{“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
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 Cayenne Docs
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.