An-/Abwesenheitserkennung mit WLAN und Fritz!Box

Begonnen von borsti67, 25 Juli 2015, 21:21:04

Vorheriges Thema - Nächstes Thema

borsti67

Hallo,

(wenn dies in Codeschnipsel besser aufgehoben ist, bitte verschieben - und ich hoffe ich habe das Rad nicht neu erfunden, GEfunden habe ich jedenfalls nichts in der Art...)

nachdem mit dem Fritz!OS 6.30 nun der Telnet-Zugang endgültig Geschichte ist, musste eine neue Lösung her (in diesem Zusammenhang ein dickes SORRY an @Erwin, dass ich mich nach Deinen letzten Script-Verbesserungen nicht mehr gemeldet habe!). Dabei ist mir aufgefallen, dass man mit dem FRITZBOX-Modul ja auch Info über die aktiven Geräte bekommt. Bei mir kam noch die Problematik dazu, dass ich auch noch einen Repeater im Einsatz habe. Da es aber auch ein AVM-Gerät ist, stellt das mit folgendem Code kein Problem dar:

in der 99_MyUtils.pm passend einfügen:
my @fbmacs = ("00_00_00_00_00_00","11_11_11_11_11_11");
sub AtHomeCheck {
    my $n = 0;
    my @fbs = devspec2array("TYPE=FRITZBOX");
    for( my $i = 0; $i < @fbmacs; $i++ ) {
        foreach( @fbs ) {
            if( ReadingsVal($_,"mac_" . $fbmacs[$i],"") ne "") {
                $n++;
            }
        }
    }
    Log 4, "Anwesenheit: " . $n . " aktive Devices.";
    if(($n == 0) && (Value("HomeStatus") < 2)) {
        fhem("trigger whg_HomeStat3 on")
    } elsif (($n != 0) && (Value("HomeStatus") > 1) && (Value("HomeStatus") < 4)) {
        fhem("trigger whg_HomeStat1 on")
    }
    undef;
}


In das Array kommen die MAC-Adressen all der Geräte, die als Indiz für Anwesenheit dienen sollen. Die ":" müssen durch "_" ersetzt werden.
Es werden alle Devices vom Typ FRITZBOX ausgelesen, man kann also diverse (und eben auch Repeater) im Einsatz haben!

In der fhem.cfg steht dazu bei mir dann noch:
define HomeStatus dummy
attr HomeStatus comment 1=Anwesenheit, 2=Nacht/inaktiv, 3=kurz weg, 4=lange weg (Urlaub)
attr HomeStatus devStateIcon 1:HOME_Status.1 2:HOME_Status.4 3:HOME_Status.0 4:HOME_Status.3
attr HomeStatus room Wohnung
attr HomeStatus setList 1 2 3 4

define whg_HomeStat1 FS20 abcd 00
attr whg_HomeStat1 comment Schalter-Anwesenheit ein
attr whg_HomeStat1 icon HOME_Status.1

define whg_HomeStat2 FS20 abcd 01
attr whg_HomeStat2 comment Schalter-Nacht ein
attr whg_HomeStat2 icon HOME_Status.4

define whg_HomeStat3 FS20 abcd 02
attr whg_HomeStat3 comment Schalter-kurze Abwesenheit ein
attr whg_HomeStat3 icon HOME_Status.0

define whg_HomeStat4 FS20 abcd 03
attr whg_HomeStat4 comment Schalter-Urlaub ein
attr whg_HomeStat4 icon HOME_Status.3

define FritzBox FRITZBOX
attr FritzBox icon it_router

define FritzRep FRITZBOX
attr FritzRep fritzBoxIP fritz.repeater
attr FritzRep icon it_wifi

define at_Anwesenheit at +*00:05:00 {AtHomeCheck()}


(Ich verwende auch (immer noch) einen 4-Kanal-Schalter, um den Zustand manuell zu setzen)

So wird alle 5 min der Status abgefragt und entsprechend reagiert. Die reale Verzögerung kann aber durchaus auch mal bei 10 Minuten liegen, denn

  • die Abfrage der Boxen erfolgt standardmäßig alle 2 min
  • es dauert auch seine Zeit, bis die Box ein Gerät als "nicht (mehr) verbunden" meldet
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Otto123

Ich hatte am Freitag schon die ähnliche Idee. Ich verwende aber das PRESENCE Modul. Ich habe den Code in 99_myUtils mal für das PRESENCE Modul angepasst und dabei auch die üblichere Darstellung der MAC Adressen mit ":" gewählt.
######## Netzwerk Gerät über Fritzbox abfragen ############
sub
NetDevDa($)
{
    my $n = 0;
    my ($Reading) = @_;
    $Reading =~ tr/:/_/;
    my @fbs = devspec2array("TYPE=FRITZBOX");
       foreach( @fbs ) {
          my $Name = ReadingsVal($_,"mac_" . $Reading,"");
          if( ($Name ne "") && ($Name ne "inactive") ) {
              $n++;
          }
       }
    if( $n == 0) {
        return 0;
    } else {
        return 1;
    }
}

Im PRESENCE Modul kann man nun mittels "function" das zu überwachende Gerät definieren
define Wlan_Device PRESENCE function {NetDevDa("11:22:33:44:55:66")}  10 30

Damit hat man einen vollständigen Ersatz für die "fritzbox" Funktion im PRESENCE Modul für FRITZ!OS ab 06.30.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

borsti67

#2
Auch sehr chic!  :)
Allerdings haben wir mehrere Geräte im Einsatz, daher finde 1 Parameter für meinen Bedarf unpraktisch.
Ist der Test auf "inactive" tatsächlich nötig?
Du könntest die 2 Zeilen aber auf jeden Fall so vereinfachen (zumal Du $Name gar nicht nutzt):
if( ReadingsVal($_,"mac_" . $Reading,"inactive") ne "inactive") ) {

Ich mopse mir auf jeden Fall mal die Ersetzung.  ;)
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Otto123

Zitat von: borsti67 am 26 Juli 2015, 23:27:26
Ist der Test auf "inactive" tatsächlich nötig?
Nö, ich habe aber festgestellt, dass beim Abmelden dieser Eintrag für kurze Zeit (keine Ahnung wie lange) kommt. Dadurch wird die Erkennung von abwesend eventuell etwas schneller?

Ich hatte erst eine Variante anders herum, das heißt ich habe den Namen konkret abgefragt bzw. verglichen. Deine Idee finde ich besser, da es ja primär um die MAC Adresse geht und sich der Name in der Fritzbox ja auch ändern könnte.

Ich habe auch mehrere Geräte im Einsatz, mache aber die restliche Logik später. Also erstmal Status der Geräte ermitteln.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

borsti67

ok, dann ändere ich den Part auch - habe auch meinen vorigen Eintrag editiert, hilft Dir evtl. auch noch etwas weiter!
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

FunkOdyssey

@Otto:
Ich finde deine Umsetzung ganz interessant und ich habe das auch direkt ausprobiert.
Nur setzt das PRESENCE-Modul das überwachte Device direkt auf "absent", wenn der Fritzbox-Status auf "inactive" wechselt.

Verlässt das Gerät das Netz, dann ist dieser Zustandwechsel ja korrekt.
Aber wenn das iPhone nur kurzzeitig das WiFi abgeschaltet hat (Standby), so ist der PRESENCE-Status ja fehlerhaft. Das Gerät befindet sich ja noch im Gebäude/WLAN.

Otto123

Ich selber habe gar kein iPhone  8) aber ich habe das woanders probiert da hat es mit dem iPhone funktioniert. Allerdings ist das ein 4er.
Wenn es so ist, das es lediglich auf inactive geht kannst Du die Abfrage ändern und zählst inactive als anwesend.

Bei mir verschwindet der Eintrag gänzlich wenn das Smartphone abgemeldet ist. Das wird generell so sein.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Motivierte linke Hände

@FunkOdyssey:
Zitat von: FunkOdyssey am 28 Juli 2015, 14:46:43Nur setzt das PRESENCE-Modul das überwachte Device direkt auf "absent", wenn der Fritzbox-Status auf "inactive" wechselt.
Verlässt das Gerät das Netz, dann ist dieser Zustandwechsel ja korrekt.
Aber wenn das iPhone nur kurzzeitig das WiFi abgeschaltet hat (Standby), so ist der PRESENCE-Status ja fehlerhaft. Das Gerät befindet sich ja noch im Gebäude/WLAN.

Das ist das generelle Problem einer Anwesenheitsprüfung (nur) über die Fritzbox. Deswegen sollte man das mit anderen Varianten koppeln. Hier ist das (eher aus Basteltrieb) aktuell die Combo aus Fritzbox, Bluetooth und Geofancy. Da keine der Varianten 100%ig zuverlässig funktioniert, arbeiten die aber nett arbeitsteilig zusammen. Ich habe sie in eine Structure eingebracht und steuere damit u.a. (innerhalb der Heizperiode) die Heizung.

@Otto, Borsti: Sehr schön, genau das, woran ich mich auch gerade mal machen wollte - einschließlich Repeater.

@Borsti: Wie hast Du den Repeater definiert? Auch als Fritzbox-Modul? Da funktioniert TR-064 auch?

Danke, Christian
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

borsti67

Zitat von: Motivierte linke Hände am 20 August 2015, 18:17:27
@Borsti: Wie hast Du den Repeater definiert? Auch als Fritzbox-Modul? Da funktioniert TR-064 auch?

Ja, genau wie auch die FB definiert ist, nur musst Du hier natürlich "FritzBoxIP" passend setzen.

@Otto123:
Das mit dem "inactive" funktioniert beides nicht - weder mein Code-Fragment (da wird auf diesem Wege auch bei nicht gewollten Geräten eine "Anwesenheit" gemeldet) und auch sonst scheint dieser Status entweder nur sehr selten oder viel zu lange gesetzt zu sein. Ich bin daher wieder auf die vorige Variante zurück und ignoriere "inactive".
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)


Motivierte linke Hände

Hi Chris - Das Modul ist RemoteFritzbox ist abgekündigt unter Verweis darauf, dass das Fritzbox-Modul das inzwischen auch und - weil nicht die Weboberfläche geparsed werden muss, die immer mal geändert wird - besser kann. Daher versuche ich mich gerade an einer Lösung zur Umstellung.

Gruß, Christian
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

Otto123

#11
@Borsti Ich greife den Post nochmal auf. Ich verstehe das noch nicht so richtig:
Zitat von: borsti67 am 26 Juli 2015, 23:27:26
Du könntest die 2 Zeilen aber auf jeden Fall so vereinfachen (zumal Du $Name gar nicht nutzt):
if( ReadingsVal($_,"mac_" . $Reading,"inactive") ne "inactive") ) {
Ich  mache einen Test ob der Name leer ("") ist oder "inactive"
my $Name = ReadingsVal($_,"mac_" . $Reading,"");
if( ($Name ne "") && ($Name ne "inactive") ) {

Deine vereinfachte Zeile testet doch jetzt nur ob "inactive" - oder?

Zitat von: borsti67 am 21 August 2015, 00:43:41
Ich bin daher wieder auf die vorige Variante zurück und ignoriere "inactive".
Ignorieren bedeutet jetzt genau was?

Name = "" -> abwesend
Name = "inactive" -> abwesend (könnte man auch zu anwesend rechnen, aber bei mir funktioniert das prima)
Name = "WlanDeviceName" -> anwesend

@Chris Ich weiß nicht was an myUtils schlecht ist, aber die Lösung über das FRITZBOX Modul ist aus meiner Sicht viel eleganter, zukunftsicherer und einfacher als die verlinkte Lösung im Wiki. Genau weil dort die Variante 1 ja gar nicht mehr geht!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

borsti67

Zitat von: chris1284 am 21 August 2015, 07:16:24
ihr macht das in myutils??? nehmt doch das modul http://www.fhemwiki.de/wiki/Anwesenheitserkennung_-_Remote_Fritzbox

Da ich dort keinen Hinweis erkennen konnte, dass es ohne TELNET funktioniert (seit dem aktuellen Fritz!OS zwingende Voraussetzung), gab es keine Veranlassung, das auch nur zu versuchen.
Zudem kommt die TR-064-Methode gänzlich ohne Modifikationen/Shellscripte auf der Box aus...

Sind im übrigen ja auch nur ziemlich genau 20 Zeile Code, die sehr viel Spielraum bieten.

@Otto123:
            $mac =~ tr/:/_/;
            if( ReadingsVal($_,$mac,"") ne "" ) {
                $n++;
            }
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

juergen012

Hallo, bisher habe ich das Modul Fritzbox_Remote genutzt. Da dies aber nicht mehr weiter verfolgt wird, habe ich versucht das Presence Modul über die MAC-Adresse einzubinden. Leider ohne Erfolg. Ich habe den Code von Otto123 in die 99_my_Utils eingefügt. Dann das define Wlan_Device auf meine MAC-Adresse angepasst. Das Device wir aber immer als "present" angezeigt. Habe das Forum  schon durchforstet, aber keine Lösung gefunden. Ein Neustart des RPI bracht auch keinen Erfolg. Hat jemand noch ne Idee, was ich falsch mache??  Muss ich noch die Adresse der Fritzbox irgendwo bekannt machen?
Beste Grüße
Jürgen K.
Fhem unter Proxmox

Motivierte linke Hände

Du hast die Fritzbox mit dem FRITZBOX-Modul definiert? Gibt es ein Reading zu der MAC des Geräts, dessen Anwesenheit Du prüfen möchtest?
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.