@cpt-pommes sagte in Thermostat Automatisierung mit mehreren Bedingungen:
Die folgende Funktion würde also jeden einzelnen Wert mit allen übrigen vergleichen und sobald eine dieser Kombinationen/Verknüpfungen aus dem kompletten array true ist, true herausgeben? Damit könnte man also auch noch mehr Personen zur Anwesenheitskontrolle hinzufügen und es würde immer die Heizung eingeschaltet werden, sobald mindestens eine Person da ist?
Ja - Du kannst das um beliebige Personen erweitern - funktioniert immer sobald eine Person da ist. Ich denke, dass das auch so gewünscht ist.
Nochmal:
myfunc($accumulator, $value[, $index[, $array]])
Die function innerhalb der reduce function definiert die Bedeutung der Variablen in der Reihenfolge, in der sie bei der Definition definiert werden. Der 1. Wert ist der akkumulierte Wert (egal ob der $i,$j,$A, $accumulator oder $Ergebnis heißt), der 2. Wert ist der Wert ist der Wert mit dem durch das Array gegangen wird (egal ob der $i,$j,$A, $value oder $wert heißt). Insofern ist es egal wie die Variable heißt (in JSONATA müssen nur alle Variablen mit einem $-Zeichen beginnen). Die Bedeutung der jeweiligen Variablen ergibt sich aus der Position bei der Definition der Funktion
$reduce(function($accumulator,$value){$accumulator or $value})
Noch eine andere Frage: Was bewirkt beim "Zeitfenster Heizen" an Wochentagen die erste change Regel? Also "Setze msg.payload auf/nach []" Wird dadurch soetwas wie ein Vektor erstellt, der dann mit den folgenden Regeln gefüllt wird und für [0],[1],[2],[3] usw wird eine neue Variable hinzugefügt?
Die Payload wird als leeres Array definiert. Normalerweise ist die payload ein skalarer Wert und durch die Definition eines leeren Arrays - kann ich in den anschließenden Regeln auf die Positionen des Arrays setzen. Wenn Du die erste Regel wegschmeisst, dann wirst Du sehen, dass es eine Fehlermeldung gibt, dass ein skalarer Wert nicht in ein Objekt gewandelt werden kann. Deshalb wird die payload am Anfang als leeres Array definiert. Sobald Du also diese Fehlermeldung bekommst, kannst Du durch ein leeres Objekt oder leeres Array diesen Fehler umgehen. Wenn Du die payload nicht als leeres Array definierst und dann versuchst mit payload[0] etc. ein Element eines Arrays definieren willst - erhälst Du folgende Fehlermeldungen:
665fc587-73fb-4b65-8aa9-18bce0284172-image.png
Also wenn Du solche Fehlermeldungen hast, dann weißt Du zukünftig, wie Du sie vermeiden kannst. 😉
Diese ist super um das ganze mit der CHange Node zu lösen. Wird hier 'minute' dafür herangezogen um den Abgleich anhand der Minuten zu machen? Wenn zB "08:05" dort stehen würde anstatt "08:00" und 'hour' am Ende, dann würde bereits ab 08:01 Uhr false herausgegeben werden?
08:00 ist ein schlechtes Beispiel weil wir es schon exkludiert haben. Sprich um 08:00 wird schon auf false umgeschaltet (s. Klammern). Gesetzt den Fall Du würdest es inkludieren, dann wird mit hour nur die Stunden betrachtet. Es handelt sich also um die Angabe der Granularität - wenn Du auf hour machen würdest wird nur geschaut ob es 08:xx ist - das heisst es ist true egal ob es 08:10 oder 08:30 ist. Wenn dieser Parameter nicht definiert wird, wird bis auf Millisekunden-Ebene überprüft.
Hier mal die Originialdoku: https://momentjs.com/docs/#/query/is-between/
Wichtig ist dass die Ränder der Zeiträume per Default ausgeschlossen werden, wenn Du die Klammern nicht angibst. Der letzte Satz in diesem Kapitel:
c5746119-16d2-4ff8-a599-5162d9b3b6ae-image.png
So nun zur Granularität:
d8accd74-0307-4339-87dc-a9e97c7f065a-image.png
Wenn man dieses Beispiel also verstehen will, sieht man im 1. Beispiel dass ein false rauskommt obwohl der 20. Oktober 2010 ja zwischen dem 1. Januar 2010 und dem 1.Januar 2012 liegt. Das liegt daran - dass ohne Angaben der Klammern die Ränder ausgeschlossen werden. Da wir als Granulariät das Jahr haben ist das ganze Jahr 2010 und das ganze Jahr 2012 ausgeschlossen und deshalb ergibt das 1. Beispiel false - weil das ganze Jahr 2010 ausgeschlossen wird, AUCH wenn der 20.Oktober 2010 dazwischen liegt.
Im unteren Beispiel ist der Bereich 20.10.2010 zwischen dem 31.12.2009 und 1.1.2012 ist true, weil die kompletten Jahre 2010 und 2011 gültig sind.