SOLVED: Node-Blue: Triggern eines PHP Skripts beim Öffnen eines Fensters

Hallo,

ich möchte in Node-Blue ein PHP Skript in einem Function-Node beim Öffnen eines Fensters ausführen d.h. genau dann, wenn der STATE des Tür-Fensterkontakts von FALSE auf TRUE wechselt.

Allerdings sendet der Tür-Fensterkontakt nicht nur dann ein Update an Homegear, wenn sich der STATE ändert, sondern unabhängig davon immer ca. einmal pro Stunde.
Wenn das Fenster offen ist, wird also in regelmäßigen Abständen erneut ein TRUE gesendet und das Skript wird wieder ausgeführt.

Ich suche einen Flow in Node-Blue, der den Function-Node nur einmal bei einem Wechsel des STATE von FALSE auf TRUE triggert.
In allen anderen Fällen, also wenn der STATE unverändert bleibt oder bei einem Wechsel von TRUE auf FALSE soll nichts passieren.

Ich denke, das könnte mit einem Switch-Node gehen, aber bis jetzt hatte ich noch keinen Erfolg.

Bis jetzt habe ich das über Events gelöst, aber ich habe im Homegear-Logfile gelesen, dass der Event-Server in künftigen Versionen abgeschafft werden soll und wollte schon mal die Migration nach Node-Blue beginnen.

Vielen Dank !

Mit freundlichen Grüßen

FiveEights

Hey,

in node-red gibt es dafür den RBE-Node… in node-blue habe ich aber leider nichts gefunden, was das “out of the box” tut. @sathya, hast du einen Vorschlag?

Ansonsten könntest du das hier mal in einem function-node testen:

$myState = getFlowData('state');
if(empty($myState)){
    $myState = false;
}

setFlowData('state', $message['payload']);

if(
    $message['payload'] === true && 
    $message['payload'] != $myState
){
    return ['payload' => true];    
}

Hab ich gerade nur, ohne zu testen, zusammengetippt…

Eine switch-node mit “only If Output Changes” (hab den genauen Wortlaut jetzt nicht im Kopf) zwischen den Input und die function-node setzen? Klingt nach Overkill, tut aber seinen Dienst … bt;dt :wink:

– Micha

1 Like

Hallo,

vielen Dank für das schnelle Feedback, das ist wirklich sehr hilfreich !
Jetzt habe ich schon zwei Ansätze, die ich weiterverfolgen kann.

Ich probiere es erst Mal mit einem Switch Node. Aus Gründen der Übersichtlichkeit versuche ich immer, so viel Logik wie möglich in Nodes unterzubringen und PHP-Code im Function-Node nur für die schwierigen Fälle zu verwenden.

Der Switch-Node bietet eine Regel “not equal (Operator !=) previous value”, die sieht schon sehr vielversprechend aus. Damit könnte ich vermutlich das Issue lösen, dass regelmäßig der gleiche STATE gesendet wird.

Ich setze mal einen Flow zum Testen auf und beobachte das einige Tage.

@PMayer: Vielen Dank für den PHP-Code. Die Dokumentation zu Node-Blue ist ja immer noch ziemlich überschaubar und ich bin dankbar für jeden “Schnipsel” Code, den
ich irgendwo als Beispiel finden kann.

Wenn ich ein paar brauchbare Ergebnisse vorweisen kann, melde ich mich wieder.

Viele Grüße

FiveEights

1 Like

Hallo,

nach einigen Tests habe ich mich jetzt für folgenden Ansatz entschieden:

  1. Die STATE-Variable des Tür-Fenster-Kontakts ist mit einem Switch Node verbunden
  2. In dem Switch Node wird message.payload überprüft. Als einzige Regel ist erfasst „ != previous value“, wobei der Operator für „not equal“ steht. Es werden also nur Änderungen der payload weitergegeben.
    So werden nur dann weitere Nodes getriggert, wenn sich der Wert des STATE wirklich geändert hat und nicht bei den regelmäßigen Updates, die der TFK sendet.
  3. Die Ausgabe des Switch-Node ist mit einem Risingedge-Node verbunden. Dieser leitet nur TRUE weiter (also Fenster offen)
  4. Nach dem Risingedge-Node kann man dann einen Function-Node einbauen und hier das gewünschte Skript ausführen lassen.
    Die ID des Tür-Fenster-Kontakts, der das Skript getriggert hat, kann dann in PHP über die Variable $message[„PeerId“] abgefragt werden (Groß-/ Kleinschreibung beachten, das hat mich schon mal ganz schön Zeit gekostet…)

Ich hoffe, das hilft Euch weiter.

FiveEights

1 Like