NEWS
MQTT Zahl in Variable ESP8266
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
Ich bin bestimmt in der falschen Rubrik
sonst würde ich nicht fragen
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
Hatte schon fast überlegt damit ins Arduino Forum zu gehen
wäre für die Arduino Seite sinnvoll, aber da bekommst du auch hier Hilfe.
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
Vielleicht muss ich nur im Blockly die Variable anders konvertieren
dann schieb ich das mal dahin, bitte Blockly zeigen!
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
was der MQTT Adapter Iobroker seitig genau an Daten ansendet im Payload und wovon das abhängt
das was du im client definierst.
@homoran Danke dir.
So sieht der Datenpunkt aus:
{ "common": { "name": "Aussentemperatur", "desc": "Manuell erzeugt", "role": "state", "type": "number", "read": true, "write": true, "def": 0, "min": -20, "max": 39 }, "type": "state", "_id": "mqtt.0.Thermometer.Aussentemperatur", "acl": { "object": 1636, "state": 1636, "file": 1632, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1678306757957 }so schreibe ich Ihn:

Im Debugmodus wird hier der Sub und die 6 korrekt gesendet:
2024-01-22 10:03:06.407 - debug: mqtt.0 (14618) Client [esp8266-9c8f93] send to this client "Thermometer/Aussentemperatur": 6Aber ab und zu - insbesondere jetzt wo auch mal -1,0,1 gesendet wird - erhalte ich dann 10 Grad statt 1 Grad.
-
@homoran Danke dir.
So sieht der Datenpunkt aus:
{ "common": { "name": "Aussentemperatur", "desc": "Manuell erzeugt", "role": "state", "type": "number", "read": true, "write": true, "def": 0, "min": -20, "max": 39 }, "type": "state", "_id": "mqtt.0.Thermometer.Aussentemperatur", "acl": { "object": 1636, "state": 1636, "file": 1632, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1678306757957 }so schreibe ich Ihn:

Im Debugmodus wird hier der Sub und die 6 korrekt gesendet:
2024-01-22 10:03:06.407 - debug: mqtt.0 (14618) Client [esp8266-9c8f93] send to this client "Thermometer/Aussentemperatur": 6Aber ab und zu - insbesondere jetzt wo auch mal -1,0,1 gesendet wird - erhalte ich dann 10 Grad statt 1 Grad.
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
So sieht der Datenpunkt aus:
bitte als Text in code-tags posten.
https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1 -
@homoran Danke dir.
So sieht der Datenpunkt aus:
{ "common": { "name": "Aussentemperatur", "desc": "Manuell erzeugt", "role": "state", "type": "number", "read": true, "write": true, "def": 0, "min": -20, "max": 39 }, "type": "state", "_id": "mqtt.0.Thermometer.Aussentemperatur", "acl": { "object": 1636, "state": 1636, "file": 1632, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1678306757957 }so schreibe ich Ihn:

Im Debugmodus wird hier der Sub und die 6 korrekt gesendet:
2024-01-22 10:03:06.407 - debug: mqtt.0 (14618) Client [esp8266-9c8f93] send to this client "Thermometer/Aussentemperatur": 6Aber ab und zu - insbesondere jetzt wo auch mal -1,0,1 gesendet wird - erhalte ich dann 10 Grad statt 1 Grad.
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
wo auch mal -1,0,1 gesendet wird
was 7st das für ein Wert?
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
wo auch mal -1,0,1 gesendet wird
was 7st das für ein Wert?
@homoran Die aktuelle gerundete Aussentemperatur :)
-
@homoran Die aktuelle gerundete Aussentemperatur :)
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
@homoran Die aktuelle gerundete Aussentemperatur :)
mit 2 Kommata?
btw: benötigt dein esp per mqtt number oder Text?
komma oder Dezimalpunkt? -
@homoran Die aktuelle gerundete Aussentemperatur :)
Die Frage ist also, müsste hier die Funktion:
T = atoi((char*)payload);die Daten korrekt verarbeiten, oder muss man hier die länge des Payload manuell zerlegen?
Die Varible T ist im Programm als int definiert. Sollte somit den Zahlenumfang und das (-)minus Zeichen abbilden können.
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
@homoran Die aktuelle gerundete Aussentemperatur :)
mit 2 Kommata?
btw: benötigt dein esp per mqtt number oder Text?
komma oder Dezimalpunkt?Nein, ich meinte die aktuellen Aussentemperaturen.
Es wird immer nur eine - auf ein Ganzes - gerundete Zahl über mittelt.
also
-1
0
1
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer. -
Nein, ich meinte die aktuellen Aussentemperaturen.
Es wird immer nur eine - auf ein Ganzes - gerundete Zahl über mittelt.
also
-1
0
1
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer.@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer.
ich vermute mal, dass du nicht weisst, ob der Wert nicht, oder falsch, v8n iobroker übermittelt wird, ob das WLAN in dem Moment spinnt, oder ob dein ESP daraus Mist baut.
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer.
ich vermute mal, dass du nicht weisst, ob der Wert nicht, oder falsch, v8n iobroker übermittelt wird, ob das WLAN in dem Moment spinnt, oder ob dein ESP daraus Mist baut.
@homoran
Im seriellen Monitor vom ESP sehe ich in dem Moment dann auch falsche Werte. Ob diese jetzt falsch konvertiert werden kann ich nicht sagen. Dazu müsste ich mir wahrscheinlich den unveränderten PAYLOAD anzeigen lassen?
Ich würde jetzt mal probieren den ESP auszuschließen, wenn du sagt das es von der Programmierung her passt. Das WLAN ist stabil, meine Daten die ich von den anderen Sensoren (Garage) zum Iobroker sende kommen immer fehlerfrei an.
Desweiteren habe ich QoS auf 2 gesetzt, somit sollte ein Datenverlust im WLAN eigentlich ausgeschlossen sein. -
Hallo zusammen,
vielleicht könnt Ihr mir helfen. Ich habe ein ESP8266 wemos mini der via MQTT verbunden ist und je nach variable eine LED leuchten lässt (Thermometer - Min, Max Temp und aktuelle Temp).
Ich setze im IOBROKER jetzt unter der Rubrik die Datenpunkte für Tmin, Tmax usw.
Das Problem ist, das ich aus meinen Zahlen -20 bis 39 ( entspricht dann den LEDS 0-59 am Thermometer) nicht immer das richtige Ergebnis erhalte.Wie versendet IOBROKER hier die Werte? Wie muss ich den Payload verändern?
Danke schon mal für Hinweise.
Auf dem Arduino versuche ich jetzt die Payloads so umzuwandeln, aber das klappt nur bedingt. Habt Ihr eine bessere Lösung für mich?
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { Serial.println("Publish received."); Serial.print(" topic: "); Serial.println(topic); if (strcmp(topic,"Thermometer/Aussentemperatur")==0){ if (atoi((char*)payload) > -20 and atoi((char*)payload) < 40){ T = atoi((char*)payload); } T = atoi((char*)payload); Serial.print("Variabel-T "); Serial.println(T); }@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
Serial.println(T);
Den Arduino mal mit dem PC verbinden und mit einem Terminal schauen was überhaupt übertragen wird.
edit: Ok, du warst schneller
-
@homoran
Im seriellen Monitor vom ESP sehe ich in dem Moment dann auch falsche Werte. Ob diese jetzt falsch konvertiert werden kann ich nicht sagen. Dazu müsste ich mir wahrscheinlich den unveränderten PAYLOAD anzeigen lassen?
Ich würde jetzt mal probieren den ESP auszuschließen, wenn du sagt das es von der Programmierung her passt. Das WLAN ist stabil, meine Daten die ich von den anderen Sensoren (Garage) zum Iobroker sende kommen immer fehlerfrei an.
Desweiteren habe ich QoS auf 2 gesetzt, somit sollte ein Datenverlust im WLAN eigentlich ausgeschlossen sein. -
@smallfeuer ,
evtl. erst in String umwandeln ?payload[length] = '\0'; int T = atoi((char *)payload);@wal sagte in MQTT Zahl in Variable ESP8266:
evtl. erst in String umwandeln ?
da warte ich noch auf fie Antwort
@homoran sagte in MQTT Zahl in Variable ESP8266:
benötigt dein esp per mqtt number oder Text?
-
Die Frage ist also, müsste hier die Funktion:
T = atoi((char*)payload);die Daten korrekt verarbeiten, oder muss man hier die länge des Payload manuell zerlegen?
Die Varible T ist im Programm als int definiert. Sollte somit den Zahlenumfang und das (-)minus Zeichen abbilden können.
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
Die Varible T ist im Programm als int definiert
Dementsprechend eine Zahl.
Ich habe jetzt das Thermometer am MAC hängen und wie es dann so ist werden alle Werte auf dem seriellen Monitor korrekt ausgegeben und auch angezeigt. Ich muss also jetzt warten bis der Fehler auch mal auftritt. -
@smallfeuer ,
evtl. erst in String umwandeln ?payload[length] = '\0'; int T = atoi((char *)payload);@wal sagte in MQTT Zahl in Variable ESP8266:
wandeln
Für mich hier die Frage was erwartet die Funktion zu bekommen?
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total)Also ich sende ja eine Zahl vom Iobroker, aber geht "char* payload" auch richtig damit um?
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
payload
In
payloadsteht nicht zwingend das, was du erwartest, da es nur ein Pointer auf eine Zeichenkette ist und nicht "Null terminiert".Versuch mal:
char payload2[len+1]; payload2[len] = '\0'; strncpy(payload2, payload, len);und arbeite dann mit "payload2" weiter.
EDIT: das ist eine ähnliche Lösung wie die von @Wal, nur dass eine neue Variable angelegt wird. Entscheidend ist das "\0" zum sauberen Terminieren der Zeichenkette.
-
@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
payload
In
payloadsteht nicht zwingend das, was du erwartest, da es nur ein Pointer auf eine Zeichenkette ist und nicht "Null terminiert".Versuch mal:
char payload2[len+1]; payload2[len] = '\0'; strncpy(payload2, payload, len);und arbeite dann mit "payload2" weiter.
EDIT: das ist eine ähnliche Lösung wie die von @Wal, nur dass eine neue Variable angelegt wird. Entscheidend ist das "\0" zum sauberen Terminieren der Zeichenkette.
-
@marc-berg ,
das das Gleiche habe ich oben schon gepostet, schau es dir nochmal an.@wal sagte in MQTT Zahl in Variable ESP8266:
@marc-berg ,
das das Gleiche habe ich oben schon gepostet, schau es dir nochmal an.Sorry, ich habe nur bis "String umwandeln" gelesen. Du hast natürlich recht.
-
@wal sagte in MQTT Zahl in Variable ESP8266:
@marc-berg ,
das das Gleiche habe ich oben schon gepostet, schau es dir nochmal an.Sorry, ich habe nur bis "String umwandeln" gelesen. Du hast natürlich recht.
Danke euch, ich werde das terminieren der Zeichenkette mal integrieren.
-
Danke euch, ich werde das terminieren der Zeichenkette mal integrieren.
Ich habe jetzt mal folgendes geladen:
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { int length if (strcmp(topic,"Thermometer/Aussentemperatur")==0) payload[length] = '\0'; T = atoi((char*)payload); Serial.print("Variabel-T "); Serial.println(T); } }Hier kommt jetzt für alle Werte aber eine 0 als Ergebnis. Was fehlt da?
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { Serial.println("Publish received."); Serial.print(" topic: "); Serial.println(topic); if (strcmp(topic,"Thermometer/Aussentemperatur")==0){ char payload2[len+1]; payload2[len] = '\0'; strncpy(payload2, payload, len); T = atoi((char*)payload2); Serial.print("Variabel-T "); Serial.println(T);So funktioniert es :) Danke, hoffe auch fehlerfrei - werde berichten...
-
Nein, ich meinte die aktuellen Aussentemperaturen.
Es wird immer nur eine - auf ein Ganzes - gerundete Zahl über mittelt.
also
-1
0
1
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer.@smallfeuer sagte in MQTT Zahl in Variable ESP8266:
dementsprechend rechnet jetzt der ESP +20 und es gehen bei 0 -> 20 LED's an -> was dann 0 Grad sind. bei -1 sollten es 19 sein, sind es aber leider nicht immer.
Und warum überträgst du nicht direkt die Anzahl der LED die leuchten sollen? Vielleicht macht ja auch der negative Wert Probleme?