An-/Abwesenheitserkennung mit WLAN und Fritz!Box

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

Vorheriges Thema - Nächstes Thema

micky0867

Spannend wäre, was bei
{(ReadingsVal("FritzName","mac_MacAddr","inactive")}
rauskommt.

Name der Box und Mac müssen natürlich angepasst werden.
Ich habe bei mir tatsächlich mal ein "inactive" gesehen, obwohl im ReadingsVal ein anderer Alternativwert stand.

Otto123

#241
Moin,

das ist ein falsch positives Ergebnis! Oder: ein falsches Ergebnis wird nicht richtig nur weil man es falsch interpretiert. :)

Wenn Du mit dem falschen Suchen/Ersetzen einen Wert der nicht existiert ausliest steht da im Ergebnis inactive drin.
Damit ist das Resultat von dieser falschen Routine bei egal was Du abfragst immer absent.

Wenn Die MAC als Reading existiert (mit der richtige Routine) und es steht eben nicht inactive sondern "Airplane Mode" drin ist es present.

Die alte Routine ging davon aus, dass das Reading aus der Fritzbox entweder korrekt auf inactive gesetzt wurde oder komplett weg war. Irgendwann hatte sich die Firmware von AVM geändert.

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

Manos


Oh Mist!

das WiFi von meinem Handy ist an, aber meine Formel "ohne g" bestreitet das  >:(

Also, zusammenfassend: Nur die erste Formel funktioniert.
(ich werde meine ursprüngliche Post korrigieren).

Schoene Gruesse
Manos
HP Microserver GEN8 XEON, Ubuntu 22.04, FHEM, ConBee II, CCU2, CUL433, Tradfri, Luxtronik2, Volkszaehler (und wenig Ahnung...)

micky0867

Zitat von: Otto123 am 03 Dezember 2020, 09:30:36
Moin,

das ist ein falsch positives Ergebnis! Oder: ein falsches Ergebnis wird nicht richtig nur weil man es falsch interpretiert. :)

Wenn Du mit dem falschen Suchen/Ersetzen einen Wert der nicht existiert ausliest steht da im Ergebnis inactive drin.
Damit ist das Resultat von dieser falschen Routine bei egal was Du abfragst immer absent.

Öhhh...neee!
ReadingsVal("FritzBox","mac_xy..","weg")
ergab "inactive".
"inactive" scheint bei der Fritze nur unter ganz bestimmten Umständen zu erscheinen. Vermutlich testete das 1. Script deshalb auf "weg" und "inactive"


Tsturm

Hallo Zusammen,

da mich das MAC-Wechseln bei den iphones für Presence genervt hat, gehe ich jetzt auf die Gerätenamen. Sieht man auch in der FB, aber ändern sich typischerweise nicht. Verbesserungen gerne jederzeit..

VG Timmo

sub checkFritzNamePresent($$) {
  # Benötigt: Name der zu testenden Fritzbox ($d),
  #           zu suchende String im Reading ($m),
  # Rückgabe: 1 = Gerät gefunden
  #           0 = Gerät nicht gefunden
  my ($d,$m) = @_;
  my $gefunden = 0;
  my $devhash = $defs{$d}; #name des devices
  my $testreading = $devhash ->{READINGS};
  my @areadings = ( keys %{$testreading} ); # enthält alle readings des devices
  # Log 1,"FB Name ".$d;
  # Log 1,"Name ".$m;
  foreach my $einzel_read (@areadings)   # nacheinander die readings durchgehen
{
if (index($einzel_read,"mac_") >= 0)  # wenn ein reading eine mac-adresse hat - i.e. ein Gerät ist, dann weiter
  {
$gefunden = 1 if (index(ReadingsVal($d, $einzel_read, "no"),$m) >= 0); # wenn in dem Reading der Suchstring vorhanden ist, dan wahr
# Log 1,"reading ".$einzel_read;
# Log 1,"wert ".ReadingsVal($d, $einzel_read, "no");
# Log 1,"gefunden ".$gefunden;
}
}
  return $gefunden;
}


Aufruf:
{checkFritzNamePresent("Fritzbox_name","Gerätename (oder teilstring)")}

kjmEjfu

Zitat von: Tsturm am 06 Dezember 2020, 12:51:47
da mich das MAC-Wechseln bei den iphones für Presence genervt hat, gehe ich jetzt auf die Gerätenamen. Sieht man auch in der FB, aber ändern sich typischerweise nicht. Verbesserungen gerne jederzeit..

du kannst das MAC-Wechseln für die Familien-Iphone im hauseigenen WLAN doch einfach abstellen, dann fehlt das Thema weg ;-)
Migriere derzeit zu Home Assistant

Manos

#246
Hallo,
ich wollte nach ein paar Wochen mein Feedback geben:

Die Version von Christian (siehe unten) funktioniert perfekt.

Zitat von: ch.eick am 30 Juli 2020, 09:31:37
In der aktuellen Version fuer die Abwesenderkennung steht schon seit langem beides drin.

###################################################
###     Presence Erkennung
###################################################
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") {
                } elsif ($StatusFritz =~ /(.*)s, 0/) {
                        # Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)"
                } else {
                  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
                  $Status = 1;
                }
    }
  return $Status
}


Mit einer einfachen Funktion kann ich den Status sehen (siehe Bild):
defmod P_Manos PRESENCE function {checkAllFritzMACpresent("xx:xx:xx:xx:xx:xx")} 60 60
attr P_Manos devStateIcon present:user_available@green absent:status_away_1@red

attr P_Manos comment "60 60" sagt, dass der Anwesenheitsstatus im 60-Sekunden-Takt abgefragt wird. Das macht natürlich nur Sinn, wenn ihr mit attr Fritzbox INTERVAL 60 den Abfrageinterval bei der Fritzbox auch entsprechend hochgesetzt habt. Der Standard ist 300.\


Da jede 60 Sek. eine Aktualisierung passiert, hatte ich Probleme ein NOTIFY zu schreiben.
Das Problem wurde geloescht mit Hilfe einer DUMMY Variable wo ich das Status meine vier Handys speichern kann:

defmod Fritz_Presence_Dummy dummy
setstate Fritz_Presence_Dummy 2021-01-17 23:35:54 P_Basti absent
setstate Fritz_Presence_Dummy 2021-01-18 09:59:27 P_Manos present
setstate Fritz_Presence_Dummy 2021-01-17 17:56:18 P_USER3 present
setstate Fritz_Presence_Dummy 2021-01-18 12:31:33 P_USER4 present


Dadurch konnte ich ein NOTIFY schreiben, dass nach jeder Aktualisierung (jede 60 Sek) die Werte der PRESENCE  mit der Dummy Werte vergleicht und falls eine Aenderung identifiziert wurde, eine Mitteilung schickt + den neuen Status in die Dummy schreibt.

defmod notify_Fritz_Present notify (P_Manos|P_USER3|P_USER4|P_Basti):(present|absent) { \
if ( ReadingsVal($NAME,"state","error") ne  ReadingsVal("Fritz_Presence_Dummy",$NAME,"error") ) \
{ fhem ("setreading Fritz_Presence_Dummy $NAME $EVENT");;;; fhem ("set myTelegramBot message $NAME $EVENT");;;; } \
}



Ich postiere meine Loesung hier, falls jemand Gebrauch davon machen kann.
Es gibt bestimmt effizientere Loesungen als mein Beispiel, ich habe keine Ahnung weder von Perl, noch von FHEM.

Schoene Gruesse
Manos

PS. Ich hatte viele Probleme die zwei Befehle { fhem ("setreading Fritz_Presence_Dummy $NAME $EVENT");;;; fhem ("set myTelegramBot message $NAME $EVENT");;;; } in eine fhem ( ".... zu schreiben  >:(   
Ein Beispiel habe ich gefunden im Forum:
{ fhem ("set EG_Eingang_Licht_innen on-for-timer 30;; sleep 1;; set EG_Vorraum_Licht on-for-timer 48");; }\
}

aber es hat bei mir nicht  nicht funktioniert ::)
Am Ende habe ich die zwei Befehle getrennt eingegeben.
Falls jemand eine Erklaerung dafuer geben kann, waere ich dankbar!
HP Microserver GEN8 XEON, Ubuntu 22.04, FHEM, ConBee II, CCU2, CUL433, Tradfri, Luxtronik2, Volkszaehler (und wenig Ahnung...)

Otto123

Man darf nicht unbedingt beliebig viele ; nehmen  ;) so sollte es gehen mit zwei Befehlen

defmod notify_Fritz_Present notify (P_Manos|P_USER3|P_USER4|P_Basti):(present|absent) { \
if ( ReadingsVal($NAME,"state","error") ne  ReadingsVal("Fritz_Presence_Dummy",$NAME,"error") ) \
{ fhem ("setreading Fritz_Presence_Dummy $NAME $EVENT;;set myTelegramBot message $NAME $EVENT") } \
}

den Teil (P_Manos|P_USER3|P_USER4|P_Basti):(present|absent)solltest Du so schreiben: (Erklärung dazu gibt es hier https://forum.fhem.de/index.php?topic=115414.0)
P_Manos:present|P_USER[34]:present|P_Basti:present|P_Manos:absent|P_USER[34]:absent|P_Basti:absent
oder so:
P_Manos:[absentpr]+|P_USER[34]:[absentpr]+|P_Basti:[absentpr]+
Zum Testen: https://regex101.com/
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

pcbastler

Sorry fürs "Ausgraben".
Seit dem Update auf 7.50 hat sich das Verhalten leider geändert. Sowohl das IPhone (IOS 16.1.2) als auch das Pixel 4a (Android 13) werden nur kurz als aktive Netzwerkgeräte in der FB angezeigt, damit ist die Anwesenheitserkennung auf diesem Weg echt schwierig.

JoWiemann

Zitat von: pcbastler am 05 Dezember 2022, 18:56:29
Sorry fürs "Ausgraben".
Seit dem Update auf 7.50 hat sich das Verhalten leider geändert. Sowohl das IPhone (IOS 16.1.2) als auch das Pixel 4a (Android 13) werden nur kurz als aktive Netzwerkgeräte in der FB angezeigt, damit ist die Anwesenheitserkennung auf diesem Weg echt schwierig.

Hier werden ja einige Möglichkeiten beschrieben. Welche nutzt Du? Ich habe das Problem bisher nicht.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Otto123

ich vermute das liegt am Stromsparmodus der Smartphones und ist gefühlt schon ewig so? Aber kann sein die Version 7.5 unterstützt den Stromspar Modus nochmal mehr.
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

pcbastler

aktuell teste ich mit
function {NetDevDa("MAC-Adresse")
das hat bis zum FB-Update (7590, OS 7.29 -> 7.50) reibungslos funktioniert.

Otto123

Schreibt die neue Firmware andere Dinge ins Reading? Die Funktion testet ja auf bestimmte Werte.
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

JoWiemann

Zitat von: Otto123 am 05 Dezember 2022, 20:23:57
Schreibt die neue Firmware andere Dinge ins Reading? Die Funktion testet ja auf bestimmte Werte.

Nein, es werden weiterhin Readings mit der MAC als Reading Name erzeugt.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Otto123

naja aber der Inhalt ist entscheidend und natürlich die konkrete Funktion in der myUtils. Es gab da gefühlt 100 Varianten.
Für die Wlan Geräte gab es ja unterschiedliche Geschwindigkeitsangaben, oder inactive ...
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