Node-Red – Geofence

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

Teilbereich des Node-red Flows

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.

Überblick Node pollstate
Überblick Node change

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
}
Überblick Node filter

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.

Überblick Node geofence mit Zone Work

Eine weitere Zone wäre Way Home from Work

Überblick Node geofence mit Zone Way from home
Überblick Node change

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

Überblick Node filter
Überblick Node switch

Über einen Switchnode wird das Ergebnis nach true and false aufgeteilt.

Mittels eines function Nodes wird das Ergebnis in eine Variable geschrieben.

Überblick Node function

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;
Überblick Node function

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

Überblick Node inject

Ü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

Überblick Node function
// 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;
Überblick Node function

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

Überblick Node function
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;
Überblick Node function

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert