NEWS
Verfügbarkeit von Sensoren über Node Red überwachen
-
@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege Ein Sting, eine Zahl oder ein Boolean - also alles was nicht in irgendwelchen Klammern steht.
Verstehe ich irgendwie trotzdem nicht^^
Ich trigger einfach nur die Change Node um "payload.test" zu erstellen und den Text auszugeben. Der meckert dann aber dass das ein non-object ist.
Wie mache ich das denn zum Object? -
@schmetterfliege Ja weil die payload kein Objekt ist. Wenn gar nichts drin ist oder war - sagt er Dir er kann kein Wert für ein skalaren Wert oder in node red Sprache auf einen non-Object Type setzen. Wenn Du aber vorher die payload auf ein leeres Objekt setzt - dann funktioniert das.
So würde es gehen.
-
@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege Ja weil die payload kein Objekt ist. Wenn gar nichts drin ist oder war - sagt er Dir er kann kein Wert für ein skalaren Wert oder in node red Sprache auf einen non-Object Type setzen. Wenn Du aber vorher die payload auf ein leeres Objekt setzt - dann funktioniert das.
So würde es gehen.
aaaah, jetzt gerafft. Danke!
Ich arbeite sowohl mit dem Payload als Objekt, als auch als non-object, indem ich einfach zb. msg.temperature, msg.timestamp usw nutze.
Gibts irgendein Grund weshalb es besser wäre alles in ein Payload Objekt zu packen, statt wie ich einzelne...keine Ahnung wie man das nennt?... zu machen? -
@schmetterfliege Man kann auch die payload direkt also Objekt mit der Eigenschaft test zu definieren:
Gibts irgendein Grund weshalb es besser wäre alles in ein Payload Objekt zu packen, statt wie ich einzelne...keine Ahnung wie man das nennt?... zu machen?
Kann man nicht allgemein sagen.
msg.temperature, msg.timestamp sind ja auch nur Eigenschaften des Objektes msg.- Wenn Du Dir mal das komplette Nachrichtenobjekt anschaust. Die msg.payload ist genauso eine Eigenschaft, wie msg.topic oder msg.temperature - alles Eigenschaften des msg Objektes. Jede Eigenschaft eines Objektes kann wiederum ein Objekt sein usw.
Manche Nodes zum Beispiel die iobroker- get Node kann zum Beispiel die Werte nicht Eigenschaften einer payload zuweisen. Andere Nodes oder transport zu anderen Systemen gehen nur über eine payload bzw. über einen JSON String. Man bildet also ein payload als Objekt - die eine JSON Node dann in einen String verwandelt und so kannst Du dann ein ganzes Objekt zum Beispiel in einen iobroker Datenpunkt schreiben.
Wenn Du den visuellen Editor eines Objektes benutzt, dann kannst Du ja sehen, dass Du sowohl skalare wie auch nicht skalare Datentypen den Eigenschaften eines Objektes zuweisen kannst.
-
Ich bin gerade etwas überfordert mit den Link Nodes...
I know, du möchtest eigentlich nicht meinen Flow komplett analysieren. Also falls dir das zu doof ist - kein ThemaLong Story short:
die beiden IOB IN Nodes triggern den gleichen Flow. Beide triggern "gleichzeitig" weil die Sensoren immer beide Werte gleichzeitig liefern.
Eine der beiden Call Nodes landet aber immer im Timeout.
In dem Flow in den das ganze rein geht habe ich eine Trigger Node die 500ms wartet.
Ist das das Problem?
Die Werte kommen zwar gleichzeitig, werden aber nacheinander abgearbeitet - logisch.
Wert1 triggert den Flow und damit den 500ms Trigger.
Wert2 möchte den Flow auch triggern, geht aber nicht weil dieser noch beschäftigt ist (500ms Trigger) und wird deshalb verworfen.
-> Call Node landet im Timeout weil sie niemals eine Rückmeldung bekommt.
Ist meine Vermutung richtig?Ich hab bisher nur mit Subflows gearbeitet, und da hat ja jeder "run" seine eigene Instanz - ich kann einen Subflow also gleichzeitig mehrfach triggern. Gilt das für das im Bild oben nicht?
-
@schmetterfliege sagte in Verfügbarkeit von Sensoren über Node Red überwachen:
die beiden IOB IN Nodes triggern den gleichen Flow. Beide triggern "gleichzeitig" weil die Sensoren immer beide Werte gleichzeitig liefern.
Eine der beiden Call Nodes landet aber immer im Timeout.Dann machs halt nicht - langt doch wenn Du in einen Zweig - ich seh auch keinen Wert das überhaupt aus dem Flow rauszunehmen. Wenn der timeout kommt, dann liegt es nur daran, dass Du nicht alles zurück gibst. Da braucht es keine Verzögerung.
Schau Dir mal den Flow - an - der läuft auch parallel ab:
Wie gesagt ich bin der Meinung ist - dass Du keine call Nodes brauchst und Timeout gibts nur, wenn der Flow das ursprüngliche Nachrichtenobjekt nicht wieder zurück gibt. Es geht - aber momentan hast Du doch andere Sorgen, als Dich hier um call Nodes zu kümmern. Im prinzip musst Du doch nur den Zeitstempel speichern und die topic mit ins Objekt aufnehmen.
-
@schmetterfliege Ausserdem am Anfang müssen die timestamps parallel zum Hauptflow machen - da diese nicht Bestandteil der Tabellenobjekte sein müssen.
Bei der Erstinitialisierung mit den Räumen kann ich im Moment nicht mmehr nachvollziehen, wie wir die Initialisierung gemacht haben.
-
@schmetterfliege Damit Du siehst das es kein Timing Problem an sich mit den call Nodes gibt - hier ein kleines Beispiel:
Auch das geht ohne Probleme
Wie gesagt - Du musst halt aufpassen das Du die Originalnachricht behälst - wenn Du es nur in einer Flowvariablen speicherst ohne zurückzugeben, dann hast du das Problem. Bei der call Nodes gibst Identifikationsmerkmale die prüfen, ob die Originalnachricht wieder zurückgegeben wird - ansonsten gibts den timeout.
-
@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege sagte in Verfügbarkeit von Sensoren über Node Red überwachen:
die beiden IOB IN Nodes triggern den gleichen Flow. Beide triggern "gleichzeitig" weil die Sensoren immer beide Werte gleichzeitig liefern.
Eine der beiden Call Nodes landet aber immer im Timeout.Dann machs halt nicht - langt doch wenn Du in einen Zweig - ich seh auch keinen Wert das überhaupt aus dem Flow rauszunehmen. Wenn der timeout kommt, dann liegt es nur daran, dass Du nicht alles zurück gibst. Da braucht es keine Verzögerung.
Schau Dir mal den Flow - an - der läuft auch parallel ab:
Wie gesagt ich bin der Meinung ist - dass Du keine call Nodes brauchst und Timeout gibts nur, wenn der Flow das ursprüngliche Nachrichtenobjekt nicht wieder zurück gibt. Es geht - aber momentan hast Du doch andere Sorgen, als Dich hier um call Nodes zu kümmern. Im prinzip musst Du doch nur den Zeitstempel speichern und die topic mit ins Objekt aufnehmen.
Ich glaube ich bin gerade an einem ganz anderen Punkt als du^^
Ich habe alles was mit den Flowvariablen zu tun hat in einen gesonderten Flow gepackt, weil entweder alles oder gar nichts - ich beziehe mich ja permanent auf die Kontextdaten. Dementsprechend muss alles in einem Flow passieren.
Das Initialisieren funktioniert Problemlos. Die Berechnung der Zeitdiff mache ich dort auch.
Zuerst werden alle Zigbee-Adapter Daten aus IOB geholt, gecheckt ob "Multisensor" im Gerätename ist und der Name sowie der Raum abgespeichert.
Nach 200ms werden dann die Daten für die einzelnen Sensoren (haben ja vorher die Topics rausgesucht) aus IOB geholt und für jedes Gerät abgespeichert.
Die Zeitdiff mache ich dann da wo die Humidity gesetzt wird für jedes Gerät einzeln.
Nach der Initialisierung hat jedes Gerät alle Daten abgespeichert, die ich möchte.
Das funktioniert wie gesagt problemlos.Das Problem ist das Aktualisieren der Tabelle.
Weil da ja dann nur für 1 Gerät ein Update kommt, ich die Zeitdifferenz aber für alle Sensoren neu berechnen möchte.
Also muss ich mir aus den Kontextvariablen alle Timestamps holen und für jedes Gerät die Differenz neu berechnen.
Variablen in Payload packen -> Splitten -> für jeden Payload die Topic anpassen -> Zeit formatieren weil fromNow() nicht mit Unix timestamps klappt -> Differenz abspeichern.
Und weil es 17 Sensoren sind muss ich da irgendwas einbauen das verhindert dass es 17 Rückmeldungen gibt.
Und das pausiert den Flow, auch wenn es nur ganz kurz ist.
Wenn der Teil im unteren roten Kasten nicht in Verwendung ist bekomme ich keinen Timeout.
Also muss da ja irgendwas dafür sorgen dass es keine zweite Rückmeldung gibt... -
@schmetterfliege Wie gesagt - das hat damit nichts zu tun und nein Du musst die nicht in die payload packen. Mach mal den unteren Teil wie er vorher war. Also schmeiss mal das weg was Du im letzten Kästchen eingefügt hast. Meines Erachtens wurde da vorher nur das zigbee Objekt geladen und in ein Array von Objekten überführt . Mach das nochmal.
So war das bei mir:Was Du mit den letzten beiden Nodes machst (function und ui_control ) - weiß ich gerade nicht - aber das sollte nochmal der Ausgangspunkt werden:
Dann würde ich in der fState variable das Datum nach id speichern und nicht nach topic - also 1.Kästchen.
Das Zeitstempel aktualisieren ist das was ich gesagt haben - da langt ein Teil um die fState Variable mit der entspechenden ID zu aktualisieren.
-
@schmetterfliege Was machst du immer mit dem Date/Time Formatter - diese Node ist völlig überflüssig. Ich hatte die auch mal installiert (aber inzwischen runter geschmissen) - aber die ist komplett überflüssig, da die Funktion in den Change Nodes enthalten ist. Ich rate grundsätzlich davon ab - Nodes zu verwenden, deren Funktionalität mit Standardnodes ebenfalls zu erreichen ist.
-
@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege Was machst du immer mit dem Date/Time Formatter - diese Node ist völlig überflüssig. Ich hatte die auch mal installiert (aber inzwischen runter geschmissen) - aber die ist komplett überflüssig, da die Funktion in den Change Nodes enthalten ist. Ich rate grundsätzlich davon ab - Nodes zu verwenden, deren Funktionalität mit Standardnodes ebenfalls zu erreichen ist.
Die hab ich da drin weil ich ständig Probleme mit der Change Node hatte wenn ich der einen UNIX timestamp gegeben habe.
Keine Ahnung warum...@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege Wie gesagt - das hat damit nichts zu tun und nein Du musst die nicht in die payload packen. Mach mal den unteren Teil wie er vorher war. Also schmeiss mal das weg was Du im letzten Kästchen eingefügt hast. Meines Erachtens wurde da vorher nur das zigbee Objekt geladen und in ein Array von Objekten überführt . Mach das nochmal.
So war das bei mir:Was Du mit den letzten beiden Nodes machst (function und ui_control ) - weiß ich gerade nicht - aber das sollte nochmal der Ausgangspunkt werden:
Dann würde ich in der fState variable das Datum nach id speichern und nicht nach topic - also 1.Kästchen.
Das Zeitstempel aktualisieren ist das was ich gesagt haben - da langt ein Teil um die fState Variable mit der entspechenden ID zu aktualisieren.
Ich hab jetzt ne Weile damit zugebracht den Flow wieder so hinzubekommen dass er nicht an 5 Ecken kaputt ist.
Initialisierung ist drin und das Aktualisieren ohne das erneute Berechnen der Zeitdiff. Funktioniert.
Das was im letzten roten Kästchen war (Die Berechnung der Zeitdiff) hab ich jetzt komplett weggeschmissen.
Sowohl das Initialisieren als auch das Aktualisieren der Tabelle liefert mir jetzt jeweils einen Payload mit den gesamten Kontextdaten.
Ab dann ist alles wie vorher auch, da habe ich nichts geändert.
Die Function Node definiert die Tabelle, ui_control bastelt sie (setzt einfach nur das Topic auf das was in der Function Node geliefert wurde, das muss so damit die Tabelle funktioniert soweit ich weiß - selbst ausgedacht hab ich sie mir auf jeden Fall nicht.
Hab die ui_control mal gelöscht - die Tabelle geht immer noch und aktualisiert auch noch. Absolut keinen blassen Schimmer ob das jetzt so soll oder nicht^^
Die Function Node definiert aber wie gesagt wie die Tabelle aussieht - oder wie machst du das? oODen Ausgangspunkt habe ich jetzt auf jeden Fall - außer dass ui_control jetzt ebenfalls draußen ist.
Dann würde ich in der fState variable das Datum nach id speichern und nicht nach topic - also 1.Kästchen.
Ich verstehe ehrlich gesagt nicht was du damit meinst.
Das sind die Daten wie sie abgespeichert sind.
Das Zeitstempel aktualisieren ist das was ich gesagt haben - da langt ein Teil um die fState Variable mit der entspechenden ID zu aktualisieren.
Das verstehe ich auch nicht wirklich.
Kannst du mir visuell zeigen was du damit meinst? Was ist denn die fState Variable? Das was in der "setze msg.payload" bei rum kommt?
Und wie sieht denn dieser eine Teil aus der reicht? Ich möchte den Zeitstempel doch gar nicht nur für ein ID aktualisieren, sondern für alle. Und den Zeitstempel (ich nehme an damit meinst du die Zeitdiff?) hätte ich eben auch gerne als Flowvariable gespeichert. Sofern ich dich richtig verstehe ist genau das der Punkt der für dich keinen Sinn macht, oder?
Für mich macht es jedenfalls Sinn - ich möchte die Daten gerne einigermaßen persistent haben und vor Allem Zugriff drauf haben um sie überprüfen zu können. Ich möchte die nicht nur berechnen, in die Tabelle packen und dann sind sie nirgends mehr zu sehen. Mag sein dass das funktioniell keinen Unterschied macht weil so oder so die Differenz permanent neu berechnet wird. Aber mit dem Hintergrund brauch ich gar nichts in die Flowvariablen packen^^Naja, ich muss in 2,5 Stunden wieder auf der Matte stehen, daher: Vielen Dank für deine Hilfe, gute Nacht und bis morgen Nacht haha
-
@schmetterfliege Doch die Flowvariablen brauchst du immer - da die Daten nicht jederzeit zur Verfügung stehen.
Die Function Node definiert die Tabelle, ui_control bastelt sie (setzt einfach nur das Topic auf das was in der Function Node geliefert wurde, das muss so damit die Tabelle funktioniert soweit ich weiß - selbst ausgedacht hab ich sie mir auf jeden Fall nicht.
Die Funktion Node macht nicht die Tabelle - zumindest in dem ursprünglichen Flow - der ui-control Node - für mich ist es nicht ersichtlich was die machen sollen. Das Objekte-Array ist eigentlich nach der JOIN Node fertig - ich kann mir höchstens vorstellen, dass in der function Node noch Formatierungsanweisungen für die Tabelle enthalten sind. - aber dann interessiert die uns in dem Kontext. nicht. OK - aber mit den Infos kann man schon arbeiten. Und die ui_control ist ja eine Change Node musst halt mal posten - was da drin steht.
Wenn das im Moment die Objekte sind, dann ist trotzdem wichtig, dass Du noch in einer Flow-variablen sowohl die timestamps sammelst - im Einzelnen Objekt sind die unwichtig - falls Du es anzeigen willst ok - aber Du willst ja Differenz haben.
weil fromNow() nicht mit Unix timestamps klappt
Na ja das stimmt halt nicht - aber Du hast Dir wahrscheinlich weder meinen Thread zur Datums und Zeitverarbeitung durchgelesen - noch die Anleitung von der moments library.
Wenn ich also Deinen timestamp aus Deinem Bild nehme
dann funktioniert die Differenzberechnung zum jetzigen Zeitpunkt sehr wohl.
-
@mickym said in Verfügbarkeit von Sensoren über Node Red überwachen:
@schmetterfliege Doch die Flowvariablen brauchst du immer - da die Daten nicht jederzeit zur Verfügung stehen.
Dann verstehe ich in der Tat nicht so ganz was genau du meinst
Ich werde relativ spät heute Nacht frühestens wieder Zuhause sein dann nochmal versuchen nachzuvollziehen wie dein Weg genau funktioniertDie Function Node definiert die Tabelle, ui_control bastelt sie (setzt einfach nur das Topic auf das was in der Function Node geliefert wurde, das muss so damit die Tabelle funktioniert soweit ich weiß - selbst ausgedacht hab ich sie mir auf jeden Fall nicht.
Die Funktion Node macht nicht die Tabelle - zumindest in dem ursprünglichen Flow - der ui-control Node - für mich ist es nicht ersichtlich was die machen sollen. Das Objekte-Array ist eigentlich nach der JOIN Node fertig - ich kann mir höchstens vorstellen, dass in der function Node noch Formatierungsanweisungen für die Tabelle enthalten sind. - aber dann interessiert die uns in dem Kontext. nicht. OK - aber mit den Infos kann man schon arbeiten. Und die ui_control ist ja eine Change Node musst halt mal posten - was da drin steht.
Mit "bastelt" die Tabelle meine ich dass die Funktion Node definiert wie die Tabelle aussieht^^ Wie breit die einzelnen Spalten sind, wie die Überschriften sind, wie deren Inhalt auszusehen hat, usw.
Die ui_control ChangeNode setzt einfach nur msg.ui_control auf msg.topic.
Als ich gerade kurz heim gekommen bin und draufgeschaut habe, sah die Tabelle aber plötzlich so aus:
Nachdem die in Change Node kurz wieder an die Stelle gepackt habe, sag die Tabelle wieder so aus wie sie aussehen sollte.
Wie die das macht - da müsste ich mich mit der table node außeinandersetzen um das vielleicht mal zu verstehen haha.Wenn das im Moment die Objekte sind, dann ist trotzdem wichtig, dass Du noch in einer Flow-variablen sowohl die timestamps sammelst - im Einzelnen Objekt sind die unwichtig - falls Du es anzeigen willst ok - aber Du willst ja Differenz haben.
weil fromNow() nicht mit Unix timestamps klappt
Na ja das stimmt halt nicht - aber Du hast Dir wahrscheinlich weder meinen Thread zur Datums und Zeitverarbeitung durchgelesen - noch die Anleitung von der moments library.
Wenn ich also Deinen timestamp aus Deinem Bild nehme
dann funktioniert die Differenzberechnung zum jetzigen Zeitpunkt sehr wohl.
Doch, hatte ich. Die Nodes sind inzwischen auch raus, aber ich hatte wirklich Probleme damit mit den Timestamps zu arbeiten.
Ich vermute weil ich irgendwie im Laufe des Flows die Timestamps zu Strings gemacht habe, weil in dem Fall kann ich das Problem reproduzieren. Mir wäre aber nicht bewusst dass ich das irgendwo mache, denn in den Flowvariablen stehen die als timestamps und nicht als strings. Naja, sie sind weg und es funktioniert. Also alles gut -
Ich mach mal den Teil mit der Zeitberechnung einzeln, da es ja hauptsächlich darum geht
Wenn das im Moment die Objekte sind, dann ist trotzdem wichtig, dass Du noch in einer Flow-variablen sowohl die timestamps sammelst - im Einzelnen Objekt sind die unwichtig - falls Du es anzeigen willst ok - aber Du willst ja Differenz haben.
Ich bin wahrscheinlich echt einfach zu doof das zu verstehen, aber... die timestamps SIND in den Flowvariablen.
Genau so wie die Differenz.
Das hier ist das was aus der Join-Node rauskommt:
Die Zeitdiff ist aber aktuell nur vom Initialisieren der Tabelle und wird nicht aktualisiert.
Soll die Berechnung nicht in die FlowVariablen sondern nach der Join Node stattfinden? Meinst du das? -
Ehrlich gesagt - verstehe ich im Moment nicht mehr wo Du stehst - aber in der Tabelle schaut es ja so aus, als ob Du nun alles beieinander hast. Das mit der msg.ui_control dient der Tabellenformatierung - habe ich soweit nachvollzogen. Im Prinzip ist mir wie gesagt weder klar, wo Du die Timestamp setzt bzw. in die Objekte aufnimmst, noch wo Du die Zeitdifferenz berechnest.
-
Ich versuche hier mal den Flow der die ganzen Daten sammelt zu erklären.
Am Ende kommt jeweils ein der Payload mit sämtlichen Flowvariablen, mit denen ich dann die Tabelle bastel.
Ich habe hier vergessen zu erwähnen dass nach 500ms die Flowvariablen in den Payload geladen und rausgegeben werden, um die Tabelle dann auch darzustellen.EDIT: ich hab das auf einem kleinen Fernseher den ich als Monitor benutze gemacht, auf dem richtigen Monitor ist das alles leider furchtbar klein... sorry
EDIT2:
Das sieht zwar alles furchtbar aus, funktioniert so aber erstmal.
Was ich halt nicht hinbekomme ist da irgendwo einzubauen dass beim Aktualisieren eines Sensors die Zeitdifferenzen für ALLE Sensoren neu berechnet werden. -
@schmetterfliege sagte in Verfügbarkeit von Sensoren über Node Red überwachen:
Was ich halt nicht hinbekomme ist da irgendwo einzubauen dass beim Aktualisieren eines Sensors die Zeitdifferenzen für ALLE Sensoren neu berechnet werden.
Nun wie gesagt - ich kenne den Flow ja in Grundzügen, den hab ich ja mit entwickelt. Dein Schaubild unten fand ich auch etwas übersichtlicher. Wie gesagt wenn Du es nur um das aktualisieren der anderen Zeitstempel geht und Du alles aktuell hast, wenn ein Gerät triggert - dann zeig einfach die Flow variable wie die Zeitstempel gespeichert sind.
-
@mickym
Last update ist die Differenz aus der Initialisierung, timestamp ist der UNIX timestamp den ich bei jedem Update aktualisiere.
Also genau so abgespeichert wie ich es dann auch für die Berechnung bei der Initialisierung benutze. -
@schmetterfliege Nein nicht die Objekte für die Tabelle - ich sagte doch Du sollst die Zeitstempel in einer eigenen Variable ausserhalb der Tabelle speichern.