NEWS
If Funktion ( Gelöst )
-
@liv-in-sky
Danke, das war ein wichtiger Hinweis.
Ich denke ich hab da die Grundlagen der Funktion noch nicht ganz verstanden.@mickym
Tatsächlich habe ich das jetzt komplett grafisch umgesetzt und das funtioniert auch wie gewünscht.
Aber könntest Du mir mal ein funktionierendes Beispiel einer Funktion geben?
Das dient mir dann hauptsächlich zum Verständnis denn ich möchte da fitter werden.
So hab ich das jetzt gelöst und werde es auch so lassen.
Ich hab es noch da hin gehend erweitert das der Vorhang auf geht wenn der Receiver in Standby geht.
Nur möchte ich die Funktionen besser verstehen.
Danke für den Hinweis
-
@dexxter Ok wenn Du es über eine Function Node machen willst, musst Du aber trotzdem die verschiedenen topic in einem Kontext sammeln.
Also entweder Du sammelst alles in einer Flow Variable oder Du sammelst die Eigenschaften in unterschiedlichen Eigenschaften des Nachrichten objektes. Im unteren Fall habe ich der iobroker get Node aus Deiner homematic NOde die Eigenschaft nacht zugewiesen. Damit kannst die payload mit nacht vergleichen.
if (!msg.payload && msg.nacht) msg.payload = true; else msg.payload =false; return msg;
einfacher geht es hier mit der konditionellen Zuweisung:
msg.payload = !msg.payload && msg.nacht ? true : false; return msg;
Wenn Du es in der Function Node sammeln willst, wie ich anhand Deiner Topic entnehmen und im Prinzip das Node Red Konzept ad absurdum führen möchtest geht das auch ....
Ich nehme nur der Einfachheit mal Inject Nodes.
-
-
Ich dachte ernsthaft das es übersichtlicher wäre wenn man das mit einer Funktion realisiert.
Aber so wie es nun ist kann man natürlich auf den ersten Blick sehen was da los ist.Zum Verständnis.....
Wie müsste ich denn die verschiedenen Variablen sammeln und die sieht so eine Flow Variable aus?
Bin da noch nicht soooo lange und tief im Thema und will auf jeden Fall besser werden.
Hab jetzt nochmal den Flow ein wenig geändert aber so kann er bleiben.
-
@dexxter Ich zeig Dir gleich noch die Varianten. Die beiden standby Nodes am Anfang kannst DU auch durch EINE ersetzen.
-
@mickym
ErledigtBin echt gespannt auf die beiden Varianten aber ich danke Dir bis hierhin schon mal sehr.
-
@dexxter So hier die erste Variante mit der Flow Variable - ohne Function Nodes.
Hier holst Du Dir nicht den Status Nacht oder den des Vorhangs zum Zeitpunkt des Triggerns des Standbys ab, sondern lässt zu Beginn bzw. bei Aktualisierung Flow Variablen setzen.
Wichtig für die Initialisierung ist, dass Du das ganze dann auch bei Flowstart Initialisieren lässt:
Ich simuliere das mal mit Inject Nodes - Du solltest aber Deine iobroker IN Nodes nehmen. Um es einigermassen realistisch zu gestalten habe ich mal das topic von Deinem HM Punkt genommen, und bei Vorhang halt vorhang als topic.
Die beiden Inject Nodes - initialisieren also Deine Flow variablen:
im Kontextmenü siehst Du den Wert der Variablen:
Dieser enthält nun zeitunabhängig immer den aktuellen Zustand des Datenpunktes.
Im Flow kann man das nun im Switch nutzen:
und nach dem Inhalt der Flow Variablen fragen:
... so und nun um Node Red wieder ad absurdum zu führen der "vereinfachte Flow" mit einer Function Node. Da solltest Du dann aber versuchen - gleich in JS zu programmieren. Da brauchst NodeRed nicht dafür - aber diese Version werde ich Dir trotzdem zeigen.
-
So nun die übersichtlichste bzw. unübersichtlichste Methode (da man von der Logik nichts mehr sieht) - aber dafür braucht man kein NodeRed. Ich hab nur mal mit den vielen Inject NOdes die Datenpunkte-States simuliert:
Man sieht sehr übersichtlich.
Alles geht in eine Function NOde und es kómmt was raus oder auch nicht. Das Kontextmenü zeigt aber gleich die Variablen des Kontextes der Function Node, die man wieder brauchst um die Nachrichten, die ja nicht zeitgleich auftreffen miteinander zu vergleichen.
Also im Prinzip ersetzt der Kontext der function Node die Flow -Variablen.
Raus kommt dann ein payload mit 0 oder 100 - um Vorhang auf oder zu zumachen:
Als payload kommt dann halt 0 oder 100 raus, um den Vorhang zu schließen oder zu öffnen.
Der code der function Node beinhaltet also den vollständigen Flow der Logik - wie gesagt kann man dann auch im JS machen:
if (msg.topic === 'hm-rega.0.1428'){ context.set('nacht',msg.payload); return null; } if (msg.topic === 'vorhang'){ context.set('vorhang',msg.payload); return null; } //hole aktuellen vorhang und aktuellen tagesstatus var nacht = context.get('nacht'); var vorhang = context.get ('vorhang'); if (nacht === undefined || vorhang === undefined) return null; if (msg.payload){ // StandbyModus if (vorhang < 100) msg.payload = 100; else return null; // wenn nicht Standby und Vorhang nicht auf dann machte Vorhang auf } else { //nicht im Standby if (nacht) msg.payload = 0; else return null; // wenn Nacht mache Vorhang zu, sonst nichts } return msg;
Wie gesagt sehr übersichtlich - nur dafür brauche ich dann NodeRed nicht mehr, wenn ich die Logik in Function Nodes verstecken möchte. Dann sollte man sich ggf. vielleicht noch mir subflows beschäftigen. Function Nodes haben zwar ihre Berechtigung - aber wirklich nur dann, wenn man mit den vorhandenen Nodes nicht mehr klar kommt.
Bei welcher Posi nun 0 oder 100 ist - weiß ich nicht, aber ich hab mal 100 für offen angenommen und im Standby Modus wird alles was kleiner 100 ist aufgemacht (also auch wenn der Vorhang nur halb offen ist.
)
Und nochmals - Nachrichten warten nicht!! - Wenn man verschiedene Nachrichten/States vergleichen oder auswerten will, muss man die zwischenspeichern. Wenn Deine Homematic Node Nacht ausgibt und anschließend eine andere Node - Standby - dann weiß niemand mehr was die Homematic Node ausgegeben hat, wenn man deren Zustand in dem Flow nicht speichert.
-
@mickym
Das ist ja mal mehr als ausführlich.......super, DANKE!
Dann kann ich mich mal damit beschäftigen.
Ich werde auch Deinen Rat beherzigen alles was möglich ist mit den vorhandenen Nodes zu lösen.
Auf jeden Fall habe ich jetzt was womit ich mein Verständnis zu den Funktionen etwas vertiefen kann.
Nachmals Danke.
Dexxter -
@dexxter Wie gesagt - in Function Nodes - kannst Du ganz normales Javascript schreiben. Also Input bekommst Du ein Nachrichtenobjekt (msg) und ausgeben kannst Du an einem oder mehreren Ausgängen wieder ein Nachrichtenobjekt oder nichts.
In der Hilfe zur Function Node - hast ja auch eine genauere Beschreibung mit Beispielen, um mehrere Nachrichten gleichzeitig oder hintereinander aus der function Node auszugeben.
Generell zum Testen und Spielen mit Javascript schlage ich hier in den Tutorial nach: https://www.w3schools.com/js/default.asp