Ich habe lange gesucht, viel zu Geofence gefunden, leider nicht das was ich gesucht habe. Aus diesem Grund seit langer Zeit mal wieder einen Beitrag von mir.
Hinweis: Die Zonen, gerade die, die auf dem Heimweg liegen, sollten nicht zu klein bemessen werden
Folgendes sollte realisiert werden: Wenn ich die Arbeit verlasse und einen bestimmten Weg nehme ich die Chance groß, das ich auf dem Weg nach Hause bin. In diesem Fall soll zum Beispiel das Heizungsthermostat im Wohnzimmer in den Boost Modus gehen oder sich das Garagentor öffnen oder oder oder.
Das ganze habe ich wie folgt gelöst:
Die Funktionsweise anhand dieses Teils
Mittels eines Poll State Nodes (Poll Qli Location) wird alle 5 Sekunden der Standort meines Smartphones bestimmt. Dazu ist auf meinen Handy die Homeassistant App installiert und mit der Nabu Casa Cloud verbunden. Die Cloud ist nicht unbedingt notwendig, erleichtert allerdings so einiges. Alternativ wäre zum Beispiel die Nutzung eines VPNs möglich.
Weiter geht es mit einem Change Node (get lat, lon) der die aktuellen Koordinaten in den Payload schreibt.
Hier der verwendete JSONata String
{
"lat": data.attributes.latitude,
"lon": data.attributes.longitude
}
Weiter geht es mit einem Filter Node der den Rest des Flows nur triggert, wenn sich die Location meines Smartphones geändert hat.
Mittels verschiedener geofence Nodes wir nun geprüft in welcher Zone sich mein Smartphone befindet. Hier als Beispiel mein Arbeitsplatz.
Eine weitere Zone wäre Way Home from Work
Mitteles eine Change Nodes (get in or out) wird nun für jede Zone geprüft ob sich das Smartphone innerhalb oder außerhalb der Zone befindet.
Das Ergebnis läuft erneut in durch einen Filter Node
Über einen Switchnode wird das Ergebnis nach true and false aufgeteilt.
Mittels eines function Nodes wird das Ergebnis in eine Variable geschrieben.
Die Funktion für den Zweig Work lautet:
var f_at_work = flow.get('f_at_work') ||false;
f_at_work = msg.payload;
flow.set('f_at_work', f_at_work);
msg.payload = f_at_work;
return msg
Für den Zweig WayHome from Work sieht sie so aus:
var f_wayhome = flow.get('f_wayhome') || false;
f_wayhome = msg.payload;
flow.set('f_wayhome', f_wayhome);
msg.payload = f_wayhome; return msg;
Eine weitere Funktion setzt das Aktuelle Datum und die Uhrzeit ist eine Variable
if (msg.payload === false) {
var f_timestamp = flow.get('f_timestamp') || 0;
f_timestamp = new Date();
flow.set('f_timestamp', f_timestamp);
msg.payload = f_timestamp;
return msg;
}
Über einen Vergleich wird jetzt bestimmt ob die Zone Work verlassen wurde und die Zone WayHome from work innerhalb von 10 Minuten erreicht wurde.
Da ich nicht nur von der Arbeit nach Hause fahre, sondern mich auch öfters bei Freuenden aufhalte gibt es den obrigen Teil durchaus öfters. Entsprechende Zonen angelegt und die Variablen Namen angepasst und in dem nun beschriebenen Vergleichsteil aufgenommen
Über Inject Node wird alle 15 Sekunden der Vergleichsflow angestoßen
Überblick Node function
Mittels Function Node wird geprüft ob das Verlassen der Zone maximal 10 Minuten her ist und der Payload auf true oder false gesetzt
// Zeitstempel aus dem Flusskontext abrufen
var storedTimestamp = flow.get("f_timestamp");
// Aktuellen Zeitstempel holen
var currentTimestamp = Date.now();
if (storedTimestamp && (currentTimestamp - storedTimestamp >= 1000) && (currentTimestamp - storedTimestamp <= 600000)) {
node.status({ fill: "green", shape: "dot", text: "Innerhalb von 1 Sekunde - 10 Minuten" });
msg.payload = true;
}
else {
node.status({ fill: "red", shape: "ring", text: "Außerhalb des Zeitfensters" });
msg.payload = false;
}
return msg;
Das Ergebnis des Vergleichs wird in eine Vairable geschrieben
var f_zoneintime = flow.get('f_zoneintime') || true;
f_zoneintime = msg.payload;
flow.set('f_zoneintime', f_zoneintime);
msg.payload = f_zoneintime;
return msg;
Mit einer weiteren Function werden die Variablen miteinander verglichen und der Payload je nach dem was die Prüfung ergint auf true oder false gesetzt
var f_zoneintime = flow.get('f_zoneintime');
var f_at_work = flow.get('f_at_work');
var f_wayhome = flow.get('f_wayhome');
if (f_at_work === false && f_zoneintime === true && f_wayhome === true)
{
// Alle Bedingungen erfüllt
msg.payload = true;
msg.topic = "fromWork"
} else {
// Eine oder mehr Bedingungen nicht erfüllt
msg.payload = false;
msg.topic = "fromWork"
return msg;
Da ich mehrere Vergleiche durchführe folgt ein logischer oder Vergleich mitteles BooleanLogicUltimate Note.
Zum Abschluß noch ein Filter Note. Hinter diesem Filter können weitere Aktionen angebunden werden. Zum Beispiel kann eine Nachricht über Alexa gesprochen werden, damit die Frau Bescheid weiß, das man auf dem Weg nach hause ist, oder die Heizungsthermostate geboostert werden.