Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Anwesenheit, Präsenz über NodeRed und Ping
#1
Hallo zusammen,

da ich ein paar Dinge gerne automatisch bei Abwesenheit, also "außer Haus" steuern möchte, habe ich mich mit diesem Thema beschäftigt.
Die normalen Lösungen über Bluetooth und RFID-Chips habe ich verworfen. Bei Bluetooth müssen zusätzliche Geräte und evtl. Repeater eingesetzt werden, RFID-Chips werden bei uns nicht konsequent immer am Schlüsselbrett abgelegt.
Ausserdem könnte man ja gemeinsam das Haus verlassen und ein Schlüssel bleibt zu Hause.

Die beste Lösung über Ping auf die Handys funktioniert anscheinend nicht bei allen Geräten, da die neueren Android-Versionen die WLAN-Verbindung in einen PowerSaveMode legen und das Gerät dann nicht mehr auf Pings antwortet.

Nachdem ich es mit normalen Pings versucht habe, hatte ich nur eine 50% Quote, bei 1 Gerät funktionierts, bei meinem Gerät leider nicht.

Ich habe nun versucht diesen PowerSaveMode irgendwie auszutricksen und nach den Ergebnissen der letzten Tage bin ich damit ganz zufrieden.
Ich verliere zwar zeitweise mal 1 Ping, allerdings liegt das eher daran, wenn ich mich durchs Haus bewege und das Handy zwischen den AccessPoints wechselt. Der nächste Ping geht dann wieder durch.

Im Node-Red-Flow habe ich das so gelöst, dass vor dem eigentlichen Ping ein UDP-Paket an das Handy gesendet wird, nach einer einstellbaren Zeit (ping_delay) in Millisekunden, wird dann der eigentliche Ping ausgeführt.
Meine Theorie dazu: Das UDP-Paket wird vom AccessPoint "gepuffert", alle 100ms(oder je nach Hersteller 150, 200, usw) prüft das Handy im PowerSaveMode am AccessPoint ob Daten vorliegen, es stellt fest es gibt Daten. Das Handy stellt die WLAN-Verbindung wieder her und holt die Daten ab (UDP-Paket). Mit dem UDP-Paket kann das Handy nichts anfangen, ist aber auch egal, da die WLAN-Verbindung nun wieder steht, ist der anschliessende Ping erfolgreich.

Bei mir funktionierts und ich habe zumindest in unserer Konstellation eine sehr verlässliche Anwesenheitskontrolle über die Handys, ob das wirklich bei anderen Modellen, bzw. beim IPhone auch funktioniert, kann ich leider nicht testen, da ich keines besitze.

Könnte man jetzt noch erweitern mit anderen Logiken oder einen entsprechenden KNX-Wert auf den Bus senden, bzw. einen HTTP-Endpoint bereitstellen, damit sich der Gekko den Präsenzwert abholen kann.

Wäre aber schön wenn mir dazu jemand Rückmeldung geben könnte.

Nun zum Flow:

Im Function-Node "Config - alle Geraete" sind die zu pingenden Geräte hinterlegt. Ich habe hier auch noch mein TV-Gerät mit aufgenommen, da die LG-Geräte nur eine WLAN-Verbindung haben, wenn Sie an sind.
Folgende Konfigurationskeys:

name = Der Klartextname des Geräts
type = die Kategorie des Geräts
host = der zu pingende Host als DNS-Name oder IP
udp_packet = true|false (soll ein UDP-Paket verschickt werden?)
udp_port = zu welchem Zielport soll das UDP-Paket geschickt werden? ich verwende einfach 1234 -> die Daten werden eh nicht verarbeitet
ping_delay = Zeit in Millisekunden bis zum Ping nach dem UDP-Paket

Sollte eigentlich fast selbsterklärend sein.

Das ganze Ergebnis wird dann im globalen Kontext abgespeichert, in einem Objekt "presence" und gegliedert nach den Typen und Namen der Geräte.
Mit dem aktuellen Status (state), wobei true=anwesend, false=abwesend
dem Zeitstempel des letzten Tests (lastStored)
und dem Zeitstempel des letzten Statuswechsels (lastChanged)

Ausserdem gibts dazu eine kleine Übersicht im Node-Red-Dashboard mit einer Tabelle und ein paar Status-LEDs, der Bereich "Ausgabe im Dashboard" kann aber einfach weggelassen werden.

Damit werde ich mir jetzt eine Gesamt-An-Abwesenheit bauen nach dem Motto:

Hat sich der Status der Handys zuletzt vor mehr als 30 Minuten auf "false" geändert, sind die Lichter alle aus und ist der TV ebenfalls seit mindestens 30 Minuten aus, dann Abwesenheit=true.
Lass den Staubsauber fahren.
Ist irgendein Präsenzstatus == true dann Abwesenheit=false, Staubsauger zurück auf die Ladestation.

Irgendwie so nach dem Motto, es könnte ja mal sein, dass man gemütlich TV schaut und die Handys sind aus, dann würde auch das mit einfließen.

Vielleicht könnte das mal jemand probeweise bei sich laufen lassen, ob es auch bei anderen Modellen und Geräten funktioniert.

Flow findet ihr im Anhang in der Flow.txt


Angehängte Dateien Thumbnail(s)
       

.jpg   NR3.JPG (Größe: 27,4 KB / Downloads: 160)
.txt   Flow.txt (Größe: 14,05 KB / Downloads: 22)
#2
Hallo Bluescreen,

danke für deine Lösung. Ich habe hier zu Hause zwei iPhones, mit denen ich das testen werden. Ich stehe nämlich vor einem ähnlichen Problem wie du. Die Lösung sieht gut aus, ich hoffe die iPhones können damit gut erreicht werden.

Ich halte dich auf dem laufenden.

Viele Grüße
Frank
#3
Wenn du nur iPhones zu Hause hast, kannst du in Home eine Automation erstellen, dass ein Gerät eingeschaltet wird, wenn jemand nach Hause kommt und/oder wenn die erste Person nach Hause kommt etc..

Ich habe mir dazu einen Dummy Schalter gebaut, der dann aktiviert wird und so weiß ich ob jemand daheim ist oder nicht.
#4
Hallo Bluescreen,

Schöne Idee und sauber umgesetzt. Werde mir das mal anschauen.
Ich hab auch schon überlegt wie man sowas ähnliches machen kann. Danke für deine Arbeit.

Kannst du, statt der Flow-Zeichenkette, eine Zipdatei anhängen? Macht den Post vll etwas übersichtlicher.
An oder Aus … Geht oder geht nicht … Strom fließt oder nicht ... 1 oder 0 ....  [Bild: dodgy.png]
#5
(12.10.2021, 14:06)SaschaD schrieb: Wenn du nur iPhones zu Hause hast, kannst du in Home eine Automation erstellen, dass ein Gerät eingeschaltet wird, wenn jemand nach Hause kommt und/oder wenn die erste Person nach Hause kommt etc..

Ich habe mir dazu einen Dummy Schalter gebaut, der dann aktiviert wird und so weiß ich ob jemand daheim ist oder nicht.

Hi SaschaD,

das klingt interessant. Bin bei iPhones aber nicht ganz so im Bilde, kannst du da ggf einmal eine Mini Anleitung in den Raum werfen. Mit Home komme ich nicht wirklich zurecht. ?

@Bluescreen
Bei mir ist es leider so, dass Nachts die Geräte nicht erkannt werden, d.h. das System würde denken, dass niemand zu Hause ist, obwohl alle nur schlafen ?
#6
Hallo Frank,

ich gehe mal davon aus, dass du an deinen IPhones keine speziellen Energiesparoptionen oder Profile für Nachts eingerichtet hast? nicht dass die Nachts komplett das WLAN abschalten, gibts ja auch.
Auch dein WLAN zu Hause können so eine Option haben oder konfiguriert sein.

Du erhältst aber nachts Benachrichtigungen, also WhatsApp oder Push-Benachrichtigungen?

Die Handys sind vermutlich am Ladegerät?

Ich würde aber als erstes mal versuchen, die ping_delay Zeit zu verändern.
Evtl. brauchen Sie Nachts einfach länger bzw. kürzer.

Wie funktionierts denn tagsüber so? Ist da die Erkennung zufriedenstellend?
#7
(14.10.2021, 09:10)Bluescreen schrieb: Hallo Frank,

ich gehe mal davon aus, dass du an deinen IPhones keine speziellen Energiesparoptionen oder Profile für Nachts eingerichtet hast? nicht dass die Nachts komplett das WLAN abschalten, gibts ja auch.
Auch dein WLAN zu Hause können so eine Option haben oder konfiguriert sein.

Du erhältst aber nachts Benachrichtigungen, also WhatsApp oder Push-Benachrichtigungen?

Die Handys sind vermutlich am Ladegerät?

Ich würde aber als erstes mal versuchen, die ping_delay Zeit zu verändern.
Evtl. brauchen Sie Nachts einfach länger bzw. kürzer.

Wie funktionierts denn tagsüber so? Ist da die Erkennung zufriedenstellend?


Hallo Bluescreen,

ich bin zwar nicht Frank, aber vielleicht kann ich dennoch helfen.

Ich habe etwas mit deinem Flow und meinem iPhone und einer AppleWatch gespielt. 
Erst einmal musste ich unter WLAN die Option "Private WLAN-Adresse" deaktivieren.

Die Delay-Zeit habe ich auf 300ms angehoben.

Dennoch kommt es dazu das die Geräte mal nicht erreichbar sind. 
Irgendwelche Energie- o. Datensparoptionen habe ich nicht aktiviert.

Ich plotte das mal eine Nacht mit und stell dir das Log dann gern mal zur Verfügung

Edit: Siehe Anhang

Abgesehen davon habe ich noch Fragen:
Was mich verwirrt ist die Art wie die Tabelle befüllt wird, besonders der oberer Teil.


.jpg   tabelle.jpg (Größe: 24,87 KB / Downloads: 114)

Kannst du mich da etwas erleuchten. Ist vermutlich schon etwas zu spät ...


Angehängte Dateien
.txt   Erreichbarkeit.txt (Größe: 13,59 KB / Downloads: 4)
An oder Aus … Geht oder geht nicht … Strom fließt oder nicht ... 1 oder 0 ....  [Bild: dodgy.png]
#8
Hallo Strabbit,

ein Log wäre mal ganz interessant.
Ich kann und will einfach nicht glauben, dass ich unsere Handys und anderen Geräte nicht zur Anwesenheitserkennung nutzen kann, ohne zusätzliche Apps zu installieren oder Geofencing zu betreiben.
Das hat irgendwie meinen Ehrgeiz geweckt.

Das mit dem Intervall von 300ms macht Sinn, könnte mir durchaus vorstellen, dass Nachts oder am Ladegerät die Intervalle evtl. etwas länger sind.
Man könnte vorher auch anstatt der UDP-Daten evtl. TCP/IP-Daten versenden, evtl. macht das einen Unterschied?
Wegen der Intervalle (bei dir 300ms) bin ich am überlegen, ob man evtl. 2 Pakete versendet in unterschiedlichen Zeitfenstern, so dass man mit hoher Wahrscheinlichkeit eine aktive Verbindung für den Ping provoziert.

Dass auch bei mir hin und wieder ein Handy mal für 1-2 Pings nicht erkannt wird, habe ich bereits erwähnt, ich denke das wird immer wieder mal vorkommen -> AccessPoints, schlechter Empfang, Roaming zwischen den APs usw.
Grundsätzlich funktionierts aber...

Ich werde meine Logik noch erweitern, um die bereits erwähnte Mindestzeit, also z.B.
kein Ping-Erfolg seit 30 Minuten -> abwesend
sobald Ping-Erfolg -> anwesend

Bei der Übersicht handelt es sich einfach nur um eine kleine Spielerei in der UI, es werden einfach die Werte aus dem globalen "presence"-Objekt angezeigt, hab mal ein kleines Bild mit angehängt.


Angehängte Dateien Thumbnail(s)
   
#9
Hallo Bluescreen,


Das Log hängt bereits am vorherigen Post.

Eventuell ist ein TCP dann doch sinnvoller, da es ja zielgerichtet ist und der Empfänger den 3 Weghandshake aktiv mitmachen muss.
An oder Aus … Geht oder geht nicht … Strom fließt oder nicht ... 1 oder 0 ....  [Bild: dodgy.png]
#10
Hallo Strabbit,

danke für dein Log, aber das sieht ja sehr ernüchternd aus.
Da hätte ich mir mehr erwartet :-( schade

Aber so ist es nun mal, das geht aber mit Sicherheit noch besser.
Hab den Flow nun etwas erweitert.

Beim Versenden des UDP-Pakets werden nun 2 Pakete gesendet.
1x sofort
1x nach der Hälfte der eingestellten Verzögerung

Ich erhoffe mir dadurch, die Wachzeiten des WLAN-Interfaces besser zu erwischen, könnte mir vorstellen, dass bei 300ms das Interface bereits wieder im PowerSaveMode ist.

Wäre jetzt mal mein nächster Versuch, die Lösung mit TCP/IP kann ich ja auch noch mal bauen und erstmal antesten, mein Favorit wäre aber diese Lösung mit UDP.

Ausserdem habe ich eine Art Threshold mit eingebaut, d.h. das globale "presence"-Objekt hat jetzt 2 Status-Angaben:

state: das Ergebnis des letzten Tests
lastChanged: der Zeitstempel der letzten Statusänderung in state
lastStored: der Zeitstempel des letzten Speicherns bzw. Prüfens
presence: die bereinigte Anwesenheit (nach eingestellter Threshold-Zeit)

Der neue Wert "presence" wird folgendermaßen ermittelt:

War der Test erfolgreich => dann presence = true (es kann keinen versehentlichen Erfolg geben, also muss das Gerät anwesend sein)
War der Test nicht erfolgreich und das schon seit eingestellter Threshold, dann presence = false

Für meinen Anwendungszweck reicht das aus, da ich ja nicht sofort bei Abwesenheit eine Aktion starten möchte, sondern erst nach ca. 30 Minuten.
Könnte ja nur unterwegs zum Briefkasten sein, kurz einen Ping verloren haben, gerade für ein paar Minuten Frühstück holen sein oder was auch immer...

Nun zum Flow:

Im Function-Node "Config - alle Geraete" sind die zu pingenden Geräte hinterlegt. Ich habe hier auch noch mein TV-Gerät mit aufgenommen, da die LG-Geräte nur eine WLAN-Verbindung haben, wenn Sie an sind.

Folgende Konfigurationskeys:

name = Der Klartextname des Geräts
type = die Kategorie des Geräts
host = der zu pingende Host als DNS-Name oder IP
udp_packet = true|false (soll ein UDP-Paket verschickt werden?)
udp_port = zu welchem Zielport soll das UDP-Paket geschickt werden? ich verwende einfach 1234 -> die Daten werden eh nicht verarbeitet
ping_delay = Zeit in Millisekunden bis zum Ping nach dem UDP-Paket
threshold = Zeit in Minuten für das Festlegen des presence-Wertes => also nach wie vielen Minuten wird in presence = abwesend gesetzt


Das ganze Ergebnis wird dann im globalen Kontext abgespeichert, in einem Objekt "presence" und gegliedert nach den Typen und Namen der Geräte.
Mit dem aktuellen Status (state), wobei true=anwesend, false=abwesend
dem Zeitstempel des letzten Tests (lastStored)
dem Zeitstempel des letzten Statuswechsels (lastChanged)
und der bereinigten Anwesenheit (presence) nach eingestellter Threshold-Zeit.


Angehängte Dateien Thumbnail(s)
       

.jpg   NR7.JPG (Größe: 28,28 KB / Downloads: 97)
.txt   Flow.txt (Größe: 15,72 KB / Downloads: 5)
#11
Bringt leider nicht sehr viel...

hatte gehofft die Uhr als Indiz meiner An- Abwesenheit zu verwenden, jedoch sit schon alleinig ein PING an diese sehr ernüchternd...

   


Auch ein Auslösen via UDP bringt da nicht sonderlich viel
An oder Aus … Geht oder geht nicht … Strom fließt oder nicht ... 1 oder 0 ....  [Bild: dodgy.png]
#12
Wie sich da eine Smart-Watch mit eigenem WLAN verhält ist ja noch einmal ein größeres Mysterium.
Hast du denn den neuen Flow ausprobiert oder nur einen direkten Ping?
Einen direkten Ping hab ich bei mir nie durchbekommen.
#13
Das Internet ist voll mit dem „Problem“ bezüglich der Apple-Geräte. Ich hab diverse Anleitungen jetzt durch, jedoch ohne Erfolg.
An oder Aus … Geht oder geht nicht … Strom fließt oder nicht ... 1 oder 0 ....  [Bild: dodgy.png]


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Zisternenfüllstand über Nodered an MyGekko Matthias 12 11.831 01.05.2023, 19:55
Letzter Beitrag: Matthias

Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste