FHEM > Automatisierung

An-/Abwesenheitserkennung mit WLAN und Fritz!Box

(1/53) > >>

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:

--- Code: ---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;
}

--- Ende Code ---

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:

--- Code: ---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()}

--- Ende Code ---

(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

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.

--- Code: ---######## 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;
    }
}

--- Ende Code ---
Im PRESENCE Modul kann man nun mittels "function" das zu überwachende Gerät definieren

--- Code: ---define Wlan_Device PRESENCE function {NetDevDa("11:22:33:44:55:66")}  10 30
--- Ende Code ---

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

Gruß Otto

borsti67:
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):

--- Code: ---if( ReadingsVal($_,"mac_" . $Reading,"inactive") ne "inactive") ) {
--- Ende Code ---

Ich mopse mir auf jeden Fall mal die Ersetzung.  ;)

Otto123:

--- Zitat von: borsti67 am 26 Juli 2015, 23:27:26 ---Ist der Test auf "inactive" tatsächlich nötig?

--- Ende Zitat ---
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

borsti67:
ok, dann ändere ich den Part auch - habe auch meinen vorigen Eintrag editiert, hilft Dir evtl. auch noch etwas weiter!

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln