[Gelöst] Anwesenheitserkennung mit FritzBox an 3 Standorten

Begonnen von webdandy, 18 Oktober 2019, 20:05:31

Vorheriges Thema - Nächstes Thema

webdandy

Guten Abend zusammen, Hallo Otto  :)

ich betreibe an 3 Standorten Fritzboxen und möchte jeweils nur an diesem einen Standort die Anwesenheit überwachen.
Erst sah es alles super aus, doch als ich heute bei meinen Eltern war und sich mein Telefon in deren WLAN angemeldet hat, wurde mein Telefon zu Hause als present erkannt, obwohl bei dem DOIF das jeweilige FRITZBOX Device angegeben wird.

sub
checkAllFritzMACpresent($) {
  # Benötigt: nur die zu suchende MAC ($MAC),
  # Es werden alle Instanzen vom Type FRITZBOX abgefragt
  #
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($MAC) = @_;
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my $Status = 0;
  $MAC =~ tr/:/_/;
  $MAC = "mac_".uc($MAC);
  my @FBS = devspec2array("TYPE=FRITZBOX");
    foreach( @FBS ) {
my $StatusFritz = ReadingsVal($_, $MAC, "weg");
if ($StatusFritz eq "weg") {
} elsif ($StatusFritz eq "inactive") {
} else {
  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
  $Status = 1;
}
    }
  return $Status
}


Check bei mir zu Hause
define monitor.FritzBox.MAC.presence DOIF ([Minkemau_FritzBox:?lastReadout.*]) (set Fabian_iPhone [monitor.FritzBox.MAC.presence:D11], set Steffi_Android [monitor.FritzBox.MAC.presence:D12], set osmc_Wohnzimmer [monitor.FritzBox.MAC.presence:D13], set osmc_Schlafzimmer [monitor.FritzBox.MAC.presence:D14], set SmartHome_Pi3 [monitor.FritzBox.MAC.presence:D15], set SmartHome_Pi2 [monitor.FritzBox.MAC.presence:D16], set SmartHome_Pi2_LAB [monitor.FritzBox.MAC.presence:D17], set Drucker [monitor.FritzBox.MAC.presence:D18], set Fabian_MB [monitor.FritzBox.MAC.presence:D19], set Steffi_Lappy [monitor.FritzBox.MAC.presence:D20], set Webcam [monitor.FritzBox.MAC.presence:D21], set Minkemau_Repeater_dummy [monitor.FritzBox.MAC.presence:D22], set Fabian_iPhone_dummy [monitor.FritzBox.MAC.presence:D23])
setuuid monitor.FritzBox.MAC.presence 5c4486e6-f33f-88c1-263d-3ed79334aa23a317
attr monitor.FritzBox.MAC.presence do always
attr monitor.FritzBox.MAC.presence userReadings D11 {checkAllFritzMACpresent("F0:99:B6:1E:2C:66")}, D12 {checkAllFritzMACpresent("A0:C9:A0:EB:D4:45")}, D13 {checkAllFritzMACpresent("B8:27:EB:EC:09:C6")}, D14 {checkAllFritzMACpresent("7C:DD:90:B7:68:9A")}, D15 {checkAllFritzMACpresent("b8:27:eb:e1:6b:6d")}, D16 {checkAllFritzMACpresent("B8:27:EB:89:45:AE")}, D17 {checkAllFritzMACpresent("b8:27:eb:86:aa:2b")}, D18 {checkAllFritzMACpresent("00:1e:8f:94:d3:bb")}, D19 {checkAllFritzMACpresent("78:4F:43:60:59:D3")}, D20 {checkAllFritzMACpresent("9C:AD:97:AA:4F:43")}, D21 {checkAllFritzMACpresent("28:10:7B:14:DA:A6")}, D22 {checkAllFritzMACpresent("3a:31:c4:ca:02:4b")}, D23 {checkAllFritzMACpresent("44:18:FD:8C:5A:42")}
attr monitor.FritzBox.MAC.presence wait 2


Check bei meiner Schwester
define monitor.FritzBox.MAC.Katrin DOIF ([FritzBox_Katrin:?lastReadout.*]) (set osmc_Katrin_Wohnzimmer [monitor.FritzBox.MAC.Katrin:D11], set osmc_Katrin_Schlafzimmer [monitor.FritzBox.MAC.Katrin:D12])
setuuid monitor.FritzBox.MAC.Katrin 5da7090c-f33f-88c1-34f5-82fe306d562636a9
attr monitor.FritzBox.MAC.Katrin do always
attr monitor.FritzBox.MAC.Katrin userReadings D11 {checkAllFritzMACpresent("b8:27:eb:fa:4d:8f")}, D12 {checkAllFritzMACpresent("24:05:0f:5b:8e:8d")}
attr monitor.FritzBox.MAC.Katrin wait 2


Check bei meinen Eltern
define monitor.FritzBox.MAC.Eltern DOIF ([FritzBox_Eltern:?lastReadout.*]) (set Arlo_Basis_Eltern [monitor.FritzBox.MAC.Eltern:D11], set osmc_Eltern_Wohnzimmer [monitor.FritzBox.MAC.Eltern:D12], set osmc_Eltern_Arbeitszimmer [monitor.FritzBox.MAC.Eltern:D13])
setuuid monitor.FritzBox.MAC.Eltern 5da7435b-f33f-88c1-3de3-571dc1ffa96be563
attr monitor.FritzBox.MAC.Eltern do always
attr monitor.FritzBox.MAC.Eltern userReadings D11 {checkAllFritzMACpresent("B0:39:56:E2:DD:D5")}, D12 {checkAllFritzMACpresent("b8:27:eb:69:7b:1f")}, D13 {checkAllFritzMACpresent("24:05:0f:31:34:de")}
attr monitor.FritzBox.MAC.Eltern wait 2


Eigentlich bin ich davon ausgegangen, dass das DOIF jeweils nur für das angegebene Device triggert, scheint aber irgendwie nicht so zu sein, sondern global für alle FRITZBOX Devices?

Ich stehe etwas auf dem Schlauch, könnte mir vielleicht jemand bitte helfen?

Vielen Dank vorab und Gruß
Fabian




Otto123

Hallo Fabian,

Also die sub (von mir) fragt alle Fritzboxen in der FHEM Instanz ab.
my @FBS = devspec2array("TYPE=FRITZBOX");

Den Rest versteh ich noch nicht ;)

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

amenomade

DOIF ([Minkemau_FritzBox:?lastReadout.*])
Wallst willst Du damit genau machen?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

ZitatEreignissteuerung über Auswertung von Events 

Eine Alternative zur Auswertung von Status oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken. Der Suchstring wird als regulärer Ausdruck in Anführungszeichen angegeben. Die Syntax lautet: [<devicename>:"<regex>"]
...
Die alte Syntax [<devicename>:?<regex>] wird aus Kompatibilitätsgründen noch unterstützt, sollte aber nicht mehr benutzt werden.
Also offenbar triggert wenn das FB Device die Werte liest. :-\
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

webdandy

Zitat von: Otto123 am 18 Oktober 2019, 20:44:49
Hallo Fabian,

Also die sub (von mir) fragt alle Fritzboxen in der FHEM Instanz ab.
my @FBS = devspec2array("TYPE=FRITZBOX");

Den Rest versteh ich noch nicht ;)

Gruß Otto
Hallo Otto,
genau, die sub habe ich aus deinem Blog und prüft alle FRITZBOXEN und die DOIFs sind auch aus deinem Blog  ;)
Und ich dachte, wenn ich im jeweiligen DOIF die Fritzbox angebe mit ([Minkemau_FritzBox:?lastReadout.*]) oder ([FritzBox_Katrin:?lastReadout.*]) werden die MACs nur dort geprüft werden.
Aber anscheint, werden in dem jeweiligen DOIF nur die Readings 0/1 gesetzt.

Ich müsste wohl eher 3 subs schreiben, bei denen immer nur eine Fritzbox angegeben wird und dann in den DOIFs auf das jeweilige sub referenzieren mit {checkAllFritzMAC_FRITZBOX1("F0:99:B6:1E:2C:66")} oder {checkAllFritzMAC_FRITZBOX2("F0:99:B6:1E:2C:66")}

Oder ist dies kompletter Müll?  ;D

Gruß
Fabian

amenomade

Zitat von: Otto123 am 18 Oktober 2019, 22:22:26
Also offenbar triggert wenn das FB Device die Werte liest. :-\
Ahja, an diese Syntax bin ich nicht gewohnt, sorry.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

#6
Zitat von: webdandy am 18 Oktober 2019, 22:29:07
Hallo Otto,
genau, die sub habe ich aus deinem Blog und prüft alle FRITZBOXEN und die DOIFs sind auch aus deinem Blog  ;)
Uups - da hab ich aber lange nicht drauf geschaut  :o das war mal von mir - so so...

Naja die Intention war, falls es mehrere Repeater (alle vom TYPE=FRITZBOX) gibt soll die Anwesenheit immer erkannt werden.

Nimm doch einfach die andere sub aus dem Wiki checkFritzMACpresent und übergib dieser den Namen deiner Fritzbox die Du abfragen willst. Das ist doch genau das was Du willst?
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

amenomade

Zitat von: webdandy am 18 Oktober 2019, 22:29:07
Hallo Otto,
genau, die sub habe ich aus deinem Blog und prüft alle FRITZBOXEN und die DOIFs sind auch aus deinem Blog  ;)
Und ich dachte, wenn ich im jeweiligen DOIF die Fritzbox angebe mit ([Minkemau_FritzBox:?lastReadout.*]) oder ([FritzBox_Katrin:?lastReadout.*]) werden die MACs nur dort geprüft werden.
Aber anscheint, werden in dem jeweiligen DOIF nur die Readings 0/1 gesetzt.

Ich müsste wohl eher 3 subs schreiben, bei denen immer nur eine Fritzbox angegeben wird und dann in den DOIFs auf das jeweilige sub referenzieren mit {checkAllFritzMAC_FRITZBOX1("F0:99:B6:1E:2C:66")} oder {checkAllFritzMAC_FRITZBOX2("F0:99:B6:1E:2C:66")}

Oder ist dies kompletter Müll?  ;D

Gruß
Fabian
Oder Du nimmst https://wiki.fhem.de/wiki/FRITZBOX#Anwesenheitserkennung_per_regelm.C3.A4.C3.9Figer_Abfrage_.C3.BCber_das_PRESENCE_Modul

statt https://wiki.fhem.de/wiki/FRITZBOX#Anwesenheitserkennung_.C3.BCber_mehrere_Fritzboxen_oder_AVM_Repeater_und_Fritzbox

Die erste nimmt 2 Parameter: die betroffene Fritzbox, und die MAC Adresse
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

webdandy

Zitat von: Otto123 am 18 Oktober 2019, 22:48:07
Uups - da hab ich aber lange nicht drauf geschaut  :o das war mal von mir - so so...

Naja die Intention war, falls es mehrere Repeater (alle vom TYPE=FRITZBOX) gibt soll die Anwesenheit immer erkannt werden.
Vom Prinzip macht es ja auch Sinn alle Devices vom Typ Fritzbox zu prüfen.
Bloß blöd, wenn ich die Alarmanlage dadurch schärfe/entschärfe.
So war es nämlich vorhin als ich im WLAN meiner Eltern war, wurde die Alarmanlage entschärft obwohl ich nicht zu Hause war, sondern nur durchs auslesen der Mac aus der Fritzbox meiner Eltern.

Wo müsste ich denn hier den Namen der Fritzbox angeben?


sub checkFritzMACpresent($$) {
  # Benötigt: Name der zu testenden Fritzbox ($Device),
  #           zu suchende MAC ($MAC),
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($Device, $MAC) = @_;
  my $Status = 0;
  $MAC =~ tr/:/_/;
  $MAC = "mac_".uc($MAC);
  my $StatusFritz = ReadingsVal($Device, $MAC, "weg");
  if ($StatusFritz eq "weg") {
    Log 1, ("checkFritzMACpresent ($Device): $MAC nicht gefunden, abwesend.");
    $Status = 0;
  } elsif ($StatusFritz eq "inactive") {
    Log 1, ("checkFritzMACpresent ($Device): $MAC ist >inactive<, also abwesend.");
    $Status = 0;
  } else {
    # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät per WLAN angemeldet.
    Log 4, ("checkFritzMACpresent ($Device): $MAC gefunden, Gerät heißt >$StatusFritz<.");
    $Status = 1;
  }
  return $Status
}



Gruß Fabian

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Du tauschst das einfach bei den userReadings aus?!
Steht doch auch so im Wiki?{checkFritzMACpresent("Fritzbox","AA:BB:CC:DD:EE:FF")} ::)
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

webdandy

Zitat von: Otto123 am 18 Oktober 2019, 23:13:50
Du tauschst das einfach bei den userReadings aus?!
Steht doch auch so im Wiki?{checkFritzMACpresent("Fritzbox","AA:BB:CC:DD:EE:FF")} ::)
Ahh, so einfach  :o
In etwa so dann oder?

attr monitor.FritzBox.MAC.Eltern userReadings D11 {checkAllFritzMACpresent(" FritzBox_Eltern","B0:39:56:E2:DD:D5")}

Gruß Fabian

amenomade

#12
Hast Du die (für dich neue) Funktion checkFritzMACpresent aus dem Wiki in myUtils übernommen? Dann heisst sie checkFritzMACpresent und nicht checkAllFritzMACpresent

Edit: und am besten kein Leerzeichen zwischen " und FritzBox_Eltern
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

webdandy

Zitat von: amenomade am 18 Oktober 2019, 23:47:44
Hast Du die (für dich neue) Funktion checkFritzMACpresent aus dem Wiki in myUtils übernommen? Dann heisst sie checkFritzMACpresent und nicht checkAllFritzMACpresent

Edit: und am besten kein Leerzeichen zwischen " und FritzBox_Eltern
Jetzt hab ich es verstanden, danke! :)
Ich nehme die sub ,,checkFritzMACpresent" aus dem wiki und ändere die Readings ab:

attr monitor.FritzBox.MAC.Eltern userReadings D11 {checkFritzMACpresent("FritzBox_Eltern","B0:39:56:E2:DD:D5")}

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus