Presence und iPhone / Android

Begonnen von JoWiemann, 07 September 2017, 11:58:59

Vorheriges Thema - Nächstes Thema

Master_Nick

Willst du wirklich mit BT arbeiten? Die Reichweite ist soviel naja.... :-)

Ich würde dem mal auf den Grund gehen was da los ist. Klingt als wäre bei dir was faul im Netz oder in der Konfiguration.

Aber klar wenn alles nix bringt bau ich dir das locker ein. Ist jetzt kein Hexenwerk.


Würde halt nur empfehlen es anders zu schaffen  8) 8)
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Martin Fischer

Moin Zusammen...

ich werfe auch mal ein Script in die Runde.. vielleicht kann es wer verwenden..  ;)

Meine Anwesenheitserkennung erfolgt über mehrere Stufen, die dann letztlich in einem Status enden. :)

Für solch eine Verwendung lieferte ich seinerzeit die Grundlage für das structure Device, welches dann in FHEM integriert wurde.

Folgende Methoden verwende ich um das Smartphone zu prüfen:

  • durch ISC DHCP Daemon ausgelöstes Event bei "Commit"
  • durch Abfrage ob Smartphone in WLAN eingebucht ist
  • durch ping (hier kommt das anhängige Skript zum Einsatz)
  • durch lan-bluetooth mit PRESENCE Device sowie collectord und presenced auf mehreren "Satelliten" (RasPi)
  • durch ein platziertes Beacon (RasPi) und der Erkennung des Beacons auf dem Smarthone (EgiGeozone) und einer Rückmeldung an FHEM

Da Smarthones aber auch mal ausgeschaltet werden (können ;) ), kommt zusätzlich noch die Anwesenheitserkennung via G-Tag Beacon am Schlüsselbund eines jeden Bewohners mittels collectord_lepresence und lepresenced auf mehrere "Satelliten" (RasPi) zum Einsatz. Seit heute wurde es um stationäre G-Tag Beacons in den Fahrzeugen erweitert ;)

Ein Smartphone wird demnach als structure-Device angelegt:

Internals:
   ATTR       smartphone
   CFGFN      /etc/fhem/conf.d/60_presence.cfg
   CHANGEDCNT 59753
   DEF        smartphone user.martin.phone.01.beacon user.martin.phone.01.bluetooth user.martin.phone.01.dhcpd user.martin.phone.01.ping user.martin.phone.01.wlan
   NAME       user.martin.phone.01.grp
   NR         2162
   NTFY_ORDER 50-user.martin.phone.01.grp
   STATE      absent
   TYPE       structure
   CONTENT:
     user.martin.phone.01.beacon absent
     user.martin.phone.01.bluetooth absent
     user.martin.phone.01.dhcpd absent
     user.martin.phone.01.ping absent
     user.martin.phone.01.wlan absent
   READINGS:
     2018-01-17 13:40:55   LastDevice      user.martin.phone.01.wlan
     2018-01-17 13:40:55   LastDevice_Abs  user.martin.phone.01.wlan
     2018-01-17 13:40:55   state           absent
Attributes:
   alias      Samsung Galaxy S7
   attendance user.martin.presence.01.grp
   clientstate_behavior relative
   clientstate_priority present absent
   devStateIcon present:HM-OU-LED16.green .*:HM-OU-LED16.off
   event-on-change-reading state
   event-on-update-reading state
   group      Martins Smartphone
   icon       it_smartphone
   room       Bewohner
   userattr   attendance attendance_map structexclude


Die Struktur setzt sich dann aus folgende Devices zusammen:








DeviceTypDefinitionBemerkung
user.martin.phone.01.beaconPRESENCEevent user.martin.phone.01.egigeozone:absent user.martin.phone.01.egigeozone:present 10 60Überwacht ein dummy Device, das direkt von extern durch das Smartphone gesetzt wird.
user.martin.phone.01.bluetoothPRESENCElan-bluetooth d8:5b:2a:xx:xx:xx 127.0.0.1:5222 10 30Anbindung an collectord
user.martin.phone.01.dhcpdPRESENCEevent user.martin.phone.01.dhcpd2fhem:absent user.martin.phone.01.dhcpd2fhem:present 10 60Überwacht ein dummy Device, das direkt von extern durch den ISC DHCP Daemon gesetzt wird.
user.martin.phone.01.pingPRESENCEevent user.martin.phone.01.hping:absent user.martin.phone.01.hping:present 60 60Überwacht ein dummy Device, das direkt von extern durch das anhängige Script gesetzt wird.
user.martin.phone.01.wlanPRESENCEfunction {checkUserPhoneWlan("user.martin")} 10 30Überprüft ob sich das Smartphone in eine Fritzbox bzw. Fritzrepeater (ge"meshed") eingebucht hat.

Die "Hilfesdevices" für EgiGeozone, ping und dhcp werden wie bereits erwähnt, direkt von aussen gesetzt. Zusätzlich werden diese jeweils durch ein eigenes watchdog Device überwacht, das nach 7 Minuten ohne eine neue Statusmeldung, den Status des Hilfsdevice automatisch auf absent setzt. Dies dient als Fallback, falls mal eins der "externen Melder" ausfällt.

Diese Konstellation ist nun mit den Bewohnern gekoppelt und in eine Alarmanlage (eigene, sehr umfangreiche Funktion in 99_myUtils.pm mit diversen Sensoren, Aktoren, etc.) eingebunden. Das Haus erkennt automatisch ob jemand anwesend ist bzw. nach Hause kommt oder ob niemand zu Hause ist.

Auf den Smartphones kommt die App EgiGeozone zum Einsatz. Mittels geofancy Device meldet die App direkt an das entsprechende RESIDENTS Device in FHEM. Edmund hat in den letzten Releases von EgiGeozone einige von mir vorgeschlagene und gemeinsam getesteten Features übernommen. Danke nochmal!

Die Alarmanlage wird (mit einem Puffer) automatisch scharf geschaltet, sobald sich keiner mehr in einem gewissen Radius ("Home") aufhält und weder die G-Tags am Schlüsselbund noch das Smartphone "physisch" in der Nähe ist und erkannt wurde. Ein Besuch bei den Nachbarn ist dann also durchaus möglich, ohne das gleich die Alarmanlage scharf geht. ;)

Ist keiner mehr anwesend, wird die "innere" als auch die "äußere" Sicherheit überwacht. Ist jemand anwesend, wird ab einer bestimmten Uhrzeit nur die Überwachung der "äußeren" Sicherheit bis in den Morgen getriggert.

Umgekehrt wird die Alarmanlage ausgeschaltet, wenn

  • obiges structure Device durch ein oder mehrere "untergeordnete" Devices (beacon, bluetooth, dhcpd, ping, wlan) den Status "present" bekommt,
  • Über geofancy gemeldet wird, das der "Home" Radius betreten wird oder
  • ein Auto mit G-Tag erkannt wird.

Letzteres setzt jedoch voraus, das die Alarmanlage vorher auch scharf war. Ansonsten hat das "Auto" keine weitere Relevanz bei der Anwesenheitsüberwachung. Und natürlich kann man die Alarmanlage auch vollkommen losgelöst von der Anwesenheitserkennung steuern.

Das mal als "Kurzform" meiner Umsetzung ;)

Nun zum anhängigen Skript bzgl. der Erkennung via ping:
Ich habe das Skript vor einiger Zeit umgesetzt und aktiv im Einsatz. Es versucht die Anwesenheit eines Smartphones, das sich im lokalen Netz befindet, über mehrere Stufen (ping, nmap, hping3) zu ermitteln und direkt an FHEM zu melden. Der Aufruf erfolgt minütlich aus einem Cron-Job; der Status wird nur an FHEM gemeldet, wenn sich der Zustand ändert.

Da ich mehrere getrennte Netze betreibe ("IoT-Netz", "Heimnetz", "Hausautomationnetz") und sich dadurch FHEM und die zu überwachenden Smartphones nicht im selben Netz befinden, bilde ich die Anwesenheit in FHEM dann in einen Dummy Device ab, siehe oben ("Hilfedevice" "user.martin.phone.01.hping"). Dieses Device wird - wie beschrieben - von einem PRESENCE Device überwacht. Dies muss dann jeder für sich umsetzen, wie er meint.

root@abe:~# check-host-alive3 -h
Usage: check-host-alive3.sh [-h] [-v] -H <fhemserver> -P <port> -d <fhem_device> <ip-adresse>


Das Skript befindet sich im Anhang. Es erfordert also die Angabe der FHEM relevanten Adressen (IP, Port) als auch das entsprechende Device (bei mir ein dummy Device) und die IP-Adresse des Smartphones (feste IP Adresse zuweisen!).

Im folgenden noch meine FHEM interne Funktion "checkUserPhoneWlan($)" (99_myUtils.pm) zur Abfrage der Fritzbox Infrastruktur. Aufgerufen wird sie mit einem Devicenamen als Parameter. Bei mir ist das das RESIDENTS Device "user.martin".

Dieses Device hat zusätzliche Attribute "spendiert" bekommen (userattr "my_eMail my_phoneAlias my_phoneIP my_phoneMacBt my_phoneMacWlan my_telegramUsername"), wo ich z.B. die entsprechenden Infos hinterlege, z.B. die MAC Adresse für die WLAN Abfrage. So muss ich diese nur an einer Stelle in FHEM pflegen und kann sie überall wo sie gebraucht werden, aus diesem Device auslesen.

Die Funktion wird von dem entsprechenden PRESENCE Device (siehe oben) aufgerufen und prüft in allen FRITZBoxen bzw. Repeatern ob das Smartphone über WLAN eingebucht ist. Diese Funktion prüft sowohl Devices vom Typ FRTIZBOX als auch cloneDummy. Letzteres ist der Tatsache geschuldet, das ich - wie bereits geschrieben - ein kaskadiertes Netz mit getrennten Segmenten betreibe und in jedem Segment zumindest ein FHEM Server habe, der via FHEM2FHEM an den "Hauptserver" angebunden ist. Somit sind die Netze untereinander abgeschottet und keiner kann Unfung treiben ;)  Aber: wo ein Wille da ein Weg ;)

Viel Spaß...


########################################
# WLAN Überwachung (PRESENCE)
sub checkUserPhoneWlan($) {
  my $name = ( caller(0) )[3];    # get name of subroutine
  $name =~ s/^.*:://;             # remove package name
  my ( $user ) = @_;

  return _ERROR( $name, 1, "Please define $user first." )
      if ( !$defs{$user} );
  return _ERROR( $name, 1, "Please set attribute 'my_phoneMacWlan' for user '$user' first." )
      if ( !AttrVal( $user, "my_phoneMacWlan", "" ) );

  my $debug = ( AttrVal( $user, "verbose", 0 ) >= 1 ) ? 1 : undef;

  my $count = 0;
  my ($mac) = AttrVal( $user, "my_phoneMacWlan", "" );
  $mac =~ tr/:/_/;
  $mac =~ tr/a-z/A-Z/;
  Log3 $name, 0, "DEBUG $name: user:$user mac:$mac" if ($debug);
  my $inactive = "WLAN, 0 / 0 Mbit/s, 0";

  my @fbs = devspec2array("TYPE=FRITZBOX,TYPE=cloneDummy");
  foreach my $fb ( @fbs ) {
    Log3 $name, 0, "DEBUG $name: search for mac:$mac (user:$user) on fb:$fb" if ($debug);

    my $phone = ReadingsVal($fb, "mac_" . $mac,"absent");
    next if ( $phone eq "absent" || $phone eq "inactive" );
    next if ( $phone =~ /$inactive/ );
    if ( $phone =~ /WLAN/ ) {
      $count++;
      Log3 $name, 0, "DEBUG $name: found phone:$phone (user:$user, mac:$mac) on fb:$fb" if ($debug);
    }
  }
  return ( $count == 0 ) ? 0 : 1;
}

--
Admin, Developer, Gründungsmitglied des FHEM e.V.

kjmEjfu

Zitat von: Master_Nick am 16 Januar 2018, 21:09:25
Ich würde dem mal auf den Grund gehen was da los ist. Klingt als wäre bei dir was faul im Netz oder in der Konfiguration.

Aber klar wenn alles nix bringt bau ich dir das locker ein. Ist jetzt kein Hexenwerk.

Ich finde keinen Fehler :-(
Wobei mir auch der Ansatzpunkt fehlt. Verwunderlich ist, dass es vom Zero aus scheinbar problemlos funktioniert, der normale Pi (mit FHEM drauf) aber Probleme hat. Wo und wie man damit jetzt einen Fehler suchen könnte ... don't know.

Von daher wäre es natürlich cool, wenn du einen BT Ping mit einbauen würdest.
Ein
nmap -sU -sT $IP -p U:5353,T:62078
scheint auch nochmal irgendwie anders zu pingen und kriegt manchmal ein positives Ergebnis, wenn die anderen Pings nichts finden.
Migriere derzeit zu Home Assistant

Master_Nick

Das klingt als würde das aufwecken bei dir nicht gehen.
Ansonsten als würden einige Geräte bei dir das Netzwerk beschneiden und jegliche ICMP Echo abschneiden. Sehr seltsam  :o


Welches Kommando brauchst du denn dann als 3. Stufe?

Auch wenn ich empfehle nicht einfach den leichtesten Weg zu gehen sondern das Problem zu finden *g*
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

kjmEjfu

Zitat von: Master_Nick am 21 Januar 2018, 15:15:17
Das klingt als würde das aufwecken bei dir nicht gehen.
Ansonsten als würden einige Geräte bei dir das Netzwerk beschneiden und jegliche ICMP Echo abschneiden. Sehr seltsam  :o


Welches Kommando brauchst du denn dann als 3. Stufe?

das wäre
sudo l2ping -t3 -c1 $Bluetooth-MAC

Zitat von: Master_Nick am 21 Januar 2018, 15:15:17
Auch wenn ich empfehle nicht einfach den leichtesten Weg zu gehen sondern das Problem zu finden *g*

da bin ich komplett bei dir. Aber ich nicht die geringste Idee, woran es happert. Von daher ist es schwierig dieses Problem zu lösen
Migriere derzeit zu Home Assistant

Wernieman

Wenn der "kleine" Pi es kann, warum setzt Du Dir da nicht die Erkennung drauf, welche dann FHEM aktuallisiert? z.B. durch nc?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

kjmEjfu

Zitat von: Wernieman am 21 Januar 2018, 16:47:51
Wenn der "kleine" Pi es kann, warum setzt Du Dir da nicht die Erkennung drauf, welche dann FHEM aktuallisiert? z.B. durch nc?

genau das habe ich jetzt auch gemacht :-)
scheint zu funktionieren
Migriere derzeit zu Home Assistant

RappaSan

#82
Ich hab mal Spaßeshalber das script aus #46 Edit 2 in /opt/fhem/FHEM/presence.sh eingegeben und das CheckiPhone von Seite 1 in 99_myUtils.pm.

Anschließend wird das Log zugemüllt mit folgenden Meldungen:
---
sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben

Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat.  Normalerweise läuft es auf drei Regeln hinaus:

    #1) Resprektieren Sie die Privatsphäre anderer.
    #2) Denken Sie nach bevor Sie tippen.
    #3) Mit großer Macht kommt große Verantwortung.
---

Hab ich da irgendwo etwas überlesen?

Master_Nick

Hi RappaSan,

ich denke das hat nichts mit dem Script zu tun sondern mit der Nutzung von "sudo" auf deinem System :-)
Hatte ich nach dem Update auf Strecht auf einem Pi von mir auch mal - ich meine hier findet man die Lösung (Antwort 17): https://stackoverflow.com/questions/21659637/how-to-fix-sudo-no-tty-present-and-no-askpass-program-specified-error
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Wernieman

Solange Du nicht den dortigen Tipp verwendest: "NOPASSWD: ALL" ist es O.K.

Denn genau mit DEM Eintrag wird fhem = superuser und damit "böse" ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Master_Nick

 ;D immer wieder gut wenn mehere drauf schauen! :-D
Da muss ich ja mal prüfen wie ich es vor Monaten fixte....
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Wernieman

Bei Sudo IMMER expliziete Programme freischalte und darauf achten, das diese NUR für root bearbeitbar (oder eigentlich überhaupt keine Schreibrechte).

Ansonsten ist es eine der ältesten bekannten Unix-Sicherheitslücke ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

RappaSan

ok, visudo war der Freund, der alles gerichtet hat.
Da mein Raspbian aber das "let" Kommando nicht mochte (das war doch mal 'n gaanz alter BASIC-Befehl...), habe ich das script noch etwas angepasst:

Zeile 46:
PRECOUNT=$(($PRECOUNT+1))
Zeile 65:
COUNT=$(($COUNT+1))

Nu läuft's. :)

Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Master_Nick

#89
@Wernieman da hast du absolut Recht! Und solche Hinweise sind gut - Code darf ruhig an Qualität gewinnen und es merzt auch Fehlerquellen aus. :-)
Wobei man natürlich sagen muss nativ Bash ist es mit let eh nicht mehr gewesen. Portierbar wäre es anders. Hab es nun ohne let gestaltet.

Ich glaub das hatte ich tatsächlich einfach kopiert und umbenannt statt es schön zu machen im Gesamten ;-)

Zitat von: RappaSan am 23 Januar 2018, 14:20:13
ok, visudo war der Freund, der alles gerichtet hat.
Da mein Raspbian aber das "let" Kommando nicht mochte (das war doch mal 'n gaanz alter BASIC-Befehl...), habe ich das script noch etwas angepasst:

Zeile 46:
PRECOUNT=$(($PRECOUNT+1))
Zeile 65:
COUNT=$(($COUNT+1))

Nu läuft's. :)

Was sagt er denn bei dir bei let? Eigentlich müsste das voll und ganz gehen wundert eher das er da meckert. Alt mag sein aber nicht outdated oder ersetzt (meines Wissens nach).

Aus gegebenem Anlass daher:

EDIT 4 meiner Version des Scriptes aus diesem Thread ohne let (versuch es nativ mit bash zu machen - wenn noch weitere nicht native bash Funktionen genutzt werden, immer her damit):

*EDIT*
Neuste Version: https://forum.fhem.de/index.php/topic,76342.msg769242.html#msg769242

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)