NEWS
WebService der einen MQTT Befehl sendet und auf Antwort wartet?
-
Hallo zusammen,
ich bin noch nicht so unglaublich tief im Thema drin, habe aber durchaus schon gut was zum laufen gebracht und soviel Zeit investiert, dass ich mir denke "Einmal kurz die Profis fragen ist schon ok.".
Kurz das vereinfachte Problem: Ich brauche am besten einen MQTT Node welcher einen Eingang hat und einen Ausgang.
Ich habe ein kleines IoT Szenario mit einer Waage aufgebaut, hier ist eine NodeMcu an der RS232 Schnittstelle, welcher das Gewicht dauerhaft ausliest und in einer temporären Variable speichert (Dieses soll nicht permanent an den MQTT gesendet werden, um den Traffic klein zu halten).
Wird in der Topic "Waage1_GW" der Befehl "WEIGH" gepublished, dann schreibt die NodeMcu das aktuelle Gewicht in die Topic "Waage1".
Das ganze möchte ich jetzt als WebService konsumieren. Das habe ich auch schon zum laufen gebracht, aber wie ich finde nicht ganz sauber.
Wenn ich den WebService aufrufe, dann wird der Befehl in Waage1_GW gesendet. Parallel habe ich einen Flow, der auf die Topic Waage1 lauscht und das Ergebnis in einer Flow Variable speichert:
flow.set('weight', msg.payload);
Wieder in dem Flow des WebService habe ich nun ein Delay eingebaut (Das finde ich eigentlich nicht schön) und dann lese ich die Variable aus und gebe diese als Response zurück und mache Sie leer, damit beim nächsten mal nicht der alte Wert gefunden wird.
var x= flow.get('weight'); flow.set('weight', ''); msg.payload = x; return msg;
Theoretisch geht es, ich verliere aber ja Zeit mit dem Delay. Kann ich irgendwie eine Do-While Schleife aufbauen, damit er in der Function wartet, bis das Ergebnis da ist?
Habe auch schon einen Switch mit "msg.payload is null" und "is not null" eingebaut aber der will auch nicht so recht. Er wartet zwar auf das Ergebnis, aber sendet den HTTP Response einfach sofort.
Oder hat noch jemand eine bessere Idee? MQTT Node mit Input und Output wäre halt perfekt.
Danke für eurer HIlfe!
Gruß Eissbear
-
Hi,
also ehrlich gesagt, hab ich nicht alles verstanden, was du geschrieben hast. Wenn ich es aber richtig interpretiere, brauchst du vlt. eine asynchrone Funktion?
https://nodered.org/docs/writing-functions
https://github.com/Raynerv/node-red-contrib-async
Loopen mit functions-node geht auch. Sollte dann eigentlich auch asynchron sein.
-
Hi rewenode,
Asynchron klingt erstmal gut. Ich checke das mal nachher.
Webservice wird aufgerufen
=> Sendet Befehl an MQTT && läuft in einen 1 Sekunden Delay
=> Fragt Variable aus dem Flow Speicher ab
=> füllt den Message Payload
=> sendet HTTP Response
Parallel läuft ein MQTT Input der die Variable in den Flow Speicher legt, das sollte während des 1 Sekunde Delays passiert sein.
Gruß Eissbear