UniFi-basierte Anwesenheitserkennung

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

L.N.
Beiträge: 23
Registriert: 28.04.2018, 14:28
System: CCU
Wohnort: Hannover
Hat sich bedankt: 6 Mal
Danksagung erhalten: 9 Mal

UniFi-basierte Anwesenheitserkennung

Beitrag von L.N. » 25.10.2020, 16:37

Nachdem ich vor einiger Zeit mein Netzwerk fast komplett auf UniFi-Komponenten (Security Gateway, PoE-Switch, WLAN Access Points) umgestellt und die Fritzbox de facto zum WAN-Modem degradiert habe, funktionierte das CCU-Addon zur FRITZ!Box-basierten Anwesenheitserkennung von Jens Maus (viewtopic.php?f=41&t=23907) natürlich nicht mehr. Meine Fritzbox stellt jetzt nur noch die Internetverbindung her, ist ansonsten aber durch das UniFi-Security-Gateway von den Details des restlichen Netzes getrennt. Der Fritzbox sind damit die eingerichteten WLANs und die im (W)LAN hängenden Geräte nicht mehr bekannt, da alles über den UniFi-Controller gesteuert wird.

Es musste also eine Alternative für die Anwesenheitserkennung her. Bei der Recherche nach fertigen Lösungen wurde ich nicht so richtig fündig (ioBroker nutze ich nicht, Python-Programmierung war nicht im Lösungsraum, ...). Also habe ich selbst angefangen, etwas mit HomeMatic-/CUxD-Bordmitteln zu basteln. Hilfreich waren dabei u. a. folgende Links:
- https://ubntwiki.com/products/software/ ... roller/api
- https://bartsimons.me/playing-around-wi ... ontroller/

Herausgekommen ist eine relativ simple, aber ihren Zweck erfüllende Lösung, die ich hier kurz vorstellen möchte.

Grundidee:
Meine Lösung basiert (wie z. B. auch die von Jens Maus) darauf, regelmäßig die im (W)LAN eingebuchten Geräte über ihre MAC-Adresse abzufragen und darüber zu ermitteln, wer zu Hause (bzw. im heimischen WLAN) ist und wer nicht. Dazu wird die API-Schnittstelle des UniFi-Controllers angezapft. Die prinzipbedingten Einschränkungen dieser Methode (Verlassen des WLANs wird erst mit einigen Minuten Verzögerung erkannt) bleiben natürlich bestehen - für mich ist die Genauigkeit völlig akzeptabel.

Voraussetzungen:
  • CCU3 mit installiertem CUxD Daemon (inkl. eines in der CCU3 konfigurierten System.Exec-Devices sowie eines System.Timer-Devices, welches alle 60 Sekunden auslöst)
  • UniFi-Controller (für die hier vorgestellte Lösung habe ich im Controller einen zusätzlichen Account mit minimalen Admin-Rechten angelegt)
Umsetzung:
Zuerst habe ich einige Parameter, die sich ggf. später ändern können, über Systemvariablen in der CCU3 konfigurierbar gemacht. Folgende Systemvariablen habe ich angelegt:

Für den Anwesenheitsstatus einzelner Familienmitglieder (Name1...Name3 können natürlich individuell angepasst werden):
  • Anwesenheit.Name1 --> Logikwert (wahr = anwesend, falsch = abwesend)
  • Anwesenheit.Name2 --> Logikwert (wahr = anwesend, falsch = abwesend)
  • Anwesenheit.Name3 --> Logikwert (wahr = anwesend, falsch = abwesend)
Für die MAC-Adressen der Smartphones der einzelnen Familienmitglieder (falls Name1...Name3 angepasst werden, dann bitte genauso wie oben):
  • Smartphone_Name1.mac_address --> Zeichenkette (Format "aa:bb:cc:dd:ff")
  • Smartphone_Name2.mac_address --> Zeichenkette (Format "aa:bb:cc:dd:ff")
  • Smartphone_Name3.mac_address --> Zeichenkette (Format "aa:bb:cc:dd:ff")
Für den UniFi-Controller:
  • UniFi-Controller.ip_address_port --> Zeichenkette (Format "xxx.xxx.xxx.xxx:xxxx")
Wenn das erledigt ist und Ihr die Systemvariablen für die MAC-Adressen sowie den UniFi-Controller mit den korrekten Inhalten gefüllt habt, kommt das Zentralenprogramm:
Zentralenprogramm v0.1.jpg

Im dort verwendeten Script müsst Ihr die Variablen "usr" [= "your_username";] und "pwd" [= "your_passwort";] mit Euren individuellen Werten für den UniFi-Controller belegen. Falls Ihr zuvor in den Systemvariablen Name1...Name3 verändert habt, müsst Ihr außerdem die Variable "phone_list" [= "Name1:Name2:Name3";] ebenfalls entsprechend anpassen.

Code: Alles auswählen

!--- Version: v0.1 --- Smartphones checken ---------------------------------------------
! Zyklisch (z. B. 1x pro Minute) über den UniFi-Controller ermitteln, ob definierte Smartphones
! im WLAN eingebucht sind und jeweiligen Status in entsprechenden Systemvariablen speichern
! --------------------------------------------------------------------------------------
! Bekannte/zu prüfende Smartphones:
string phone_list = "Name1:Name2:Name3";

! --------------------------------------------------------------------------------------
! IP-Adresse/Port des UniFi-Controllers aus Systemvariablen auslesen:
string sysvar        = "UniFi-Controller.ip_address_port";
string unifi_ip_port = dom.GetObject(sysvar).State().ToString();

! --------------------------------------------------------------------------------------
! UniFi-Controller-Username/-Password sollen NICHT in einer Systemvariable gespeichert werden, um Kompromittierung zu erschweren, daher hier fest definiert:
string usr     = "your_username";
string pwd     = "your_passwort";

! --------------------------------------------------------------------------------------
! An UniFi-Controller anmelden und XML-Liste der verbundenen Geräte abfragen:

string url_login = "https://" # unifi_ip_port # "/api/login";
string cmd_login = " --data-binary '{\"username\":\"" # usr # "\",\"password\":\"" # pwd # "\",\"strict\":true}' --compressed --insecure -c cookies.txt";

string url_dev_list = "https://" # unifi_ip_port # "/api/s/default/stat/sta";
string cmd_dev_list = " --compressed --insecure -b cookies.txt -c cookies.txt";

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/usr/local/addons/cuxd/curl -X POST '"#url_login#"'" #cmd_login#" --next '"#url_dev_list#"'" #cmd_dev_list#"");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string xml_result = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

! vorher gesetztes Cookie wieder löschen:
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("rm /usr/local/addons/cuxd/cookies.txt");

! --------------------------------------------------------------------------------------
! XML-Ergebnis (UniFi-Controller-Abfrage) auswerten:

string  phone;
string  mac_adr;
boolean status;
boolean letzter_status;

! für jedes Element der Smartphone-Liste:
foreach (phone, phone_list.Split(":"))
    {
    ! MAC-Adresse ermitteln:
    mac_adr        = dom.GetObject("Smartphone_" # phone # ".mac_address").State().ToString();
    ! Letzten Anwesenheitsstatus ermitteln:
    letzter_status = dom.GetObject("Anwesenheit." # phone).State();
    ! MAC-Adresse in xml_result suchen:
    status         = xml_result.Contains(mac_adr);
    if (status != letzter_status) 
        { dom.GetObject("Anwesenheit." # phone).State(status); }
    }

!---------------------------------------------------------------------------------------
Den funktionierenden API-Aufruf des UniFi-Controllers habe ich z. T. durch trial & error hinbekommen - die Profis schaffen das bestimmt deutlich eleganter. Vielen Dank für Eure Verbesserungsvorschläge.

Jetzt sollten alle 60 Sekunden (entsprechend den Einstellungen des verwendeten CUxD-System.Timer-Devices) über den UniFi-Controller die im (W)LAN aktiven Smartphones abgefragt und die entsprechenden Systemvariablen (Anwesenheit.Name1...3) gesetzt werden.

Viel Spaß beim Nachbauen!

L.N.
238 Programme, 233 Variablen, 93 Aktoren, 785 Kanäle

Fonzo
Beiträge: 6688
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 478 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von Fonzo » 25.10.2020, 17:20

L.N. hat geschrieben:
25.10.2020, 16:37
Grundidee:
Meine Lösung basiert (wie z. B. auch die von Jens Maus) darauf, regelmäßig die im (W)LAN eingebuchten Geräte über ihre MAC-Adresse abzufragen und darüber zu ermitteln, wer zu Hause (bzw. im heimischen WLAN) ist und wer nicht.
Nun abgesehen davon, das die Anwesenheit über WLAN versuchen festzustellen durchaus seine Tücken hat, das WLAN kann man ja auch mal absichtlich am Handy ausschalten und ist dennoch zu Hause, ist es aus meiner persönlichen Sicht deutlich einfacher, einfach das Handy selber die Anwesenheit melden zu lassen und einfach eine Variable vom Handy zu setzten, also ständig zyklisch von der CCU Anfragen zu schicken. Das geht einfach bei Android mit so was wie Tasker bzw. ich selber nutzte da eine Automation der Kurzbefehls App unter iOS, mit der bei An- bzw. Abwesenheit eine Variable vom Handy gesetzt wird.

Luxtra
Beiträge: 452
Registriert: 13.12.2014, 07:00
Danksagung erhalten: 1 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von Luxtra » 27.10.2020, 10:36

Und wie meldest du mit dem Handy bei ausgeschaltetem WLAN die Anwesenheit?

Fonzo
Beiträge: 6688
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 478 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von Fonzo » 27.10.2020, 11:17

Luxtra hat geschrieben:
27.10.2020, 10:36
Und wie meldest du mit dem Handy bei ausgeschaltetem WLAN die Anwesenheit?
Ich selber nutze dazu eine Automation der Kurzbefehlsapp unter iOS auf meinem iPhone, da kannst Du Dir grundsätzlich jede Anwesenheit über ein Geofence registrieren lassen, unabhängig von WLAN oder dem Standort an dem Du Anwesenheit erfassen willst.

Luxtra
Beiträge: 452
Registriert: 13.12.2014, 07:00
Danksagung erhalten: 1 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von Luxtra » 27.10.2020, 12:44

Ich meinte nicht dich persönlich.

Wenn man WLAN abgeschaltet hat, wie soll man dann per Tasker die Anwesenheit melden?

onkel_peter
Beiträge: 90
Registriert: 08.12.2014, 22:16
Wohnort: Erfurt

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von onkel_peter » 14.11.2020, 21:16

Hallo L.N.

vielen Dank für Deine Lösung der Anwesenheitserkennung mit UniFi Komponenten.
Das wäre bei mir aber erst der zweite Schritt.

Zuerst suche ich auch nach einer Lösung die Fritzbox gemeinsam mit dem Security Gateway in meinem Netzt zu verwenden.
Evtl. hast Du auch das Problem von doppelten NAT gelöst.
Da das Thema aber nicht hier in das Forum passt, könntest Du mir evtl. per PN weiterhelfen, wie Du das realisiert hast.

Danke !
Gruß Peter

Fonzo
Beiträge: 6688
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 478 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von Fonzo » 14.11.2020, 21:43

onkel_peter hat geschrieben:
14.11.2020, 21:16
Da das Thema aber nicht hier in das Forum passt, könntest Du mir evtl. per PN weiterhelfen, wie Du das realisiert hast.
Je nachdem was Du denn für einen Anschluss hast schaltest Du einfach ein passendes Gerät vor das Security Gateway und die Fritzbox ist dann halt nur noch Telefonanlage. Also entweder ein Kabelmodem oder ein VDSL Modem vor das Security Gateway installieren.

L.N.
Beiträge: 23
Registriert: 28.04.2018, 14:28
System: CCU
Wohnort: Hannover
Hat sich bedankt: 6 Mal
Danksagung erhalten: 9 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von L.N. » 15.11.2020, 01:23

Hallo Peter,

bei mir gibt's auch noch doppeltes NAT - die Fritzbox hängt als WAN-Modem (und für's Festnetz-Telefon) zwischen DSL-Anschluss und Security Gateway. Damit habe ich bisher keine Probleme und brauche keine aus dem Internet erreichbaren Server oder Online-Spiele. Daher gab es für mich noch nicht die Notwendigkeit, das Doppel-NAT zu beseitigen.

Gruß L.N.
238 Programme, 233 Variablen, 93 Aktoren, 785 Kanäle

onkel_peter
Beiträge: 90
Registriert: 08.12.2014, 22:16
Wohnort: Erfurt

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von onkel_peter » 19.11.2020, 20:01

Hallo L.N.
Hallo Fonzo,

Ja ich habe auch eine Fritzbox 7590 an einem Supervectoring Anschluß und dahinter alles Unifi Komponenten (Switche, AP, Cloud KEy, Unifi Protect etc)
Die Fritzbox sollte schon die Telefonaufgaben weiterhin übernehmen.
Bei dem was ich so bisher gelesen habe wird empfohlen, das doppelte NAT zu vermeiden.
Allerdings war ein Beitrag dabei, der einen Softwareeingriff in das Security GW nötig macht, um das NAT darin zu deaktiveren.
Soll zwar recht einfach sein, aber da hab ich mich bisher nicht getraut.

Dennoch vielen Dank für Eure Info.
Gruß Peter

L.N.
Beiträge: 23
Registriert: 28.04.2018, 14:28
System: CCU
Wohnort: Hannover
Hat sich bedankt: 6 Mal
Danksagung erhalten: 9 Mal

Re: UniFi-basierte Anwesenheitserkennung

Beitrag von L.N. » 19.11.2020, 21:57

Gern, keine Ursache.

Sicher ist Doppel-NAT höchstens semi-elegant. Aber solange es einerseits keine (Performance)-Probleme macht und andererseits die Beseitigung nicht ganz trivial ist, kann ich damit leben.

Gruß L.N.
238 Programme, 233 Variablen, 93 Aktoren, 785 Kanäle

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“