An-/Abwesenheitserkennung mit WLAN und Fritz!Box

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

Vorheriges Thema - Nächstes Thema

lusche800

Hallo Otto123.
Sorry für die späte Rückmeldung.
Gestern Abend war es von der Uhrzeit zu spät um noch zu testen. Und heute war mal wieder die Hölle los.
Ich versuche es die nächsten Tage ausgiebig zu testen.
Was ich schon sagen kann ist, das alle Fritzboxen überprüft werden.
Auf jedenfall werde ich mich nochmals melden und Rückmeldung geben.

lusche800

So, ich werde mal versuchen so verständlich wie möglich zu schreiben.

Ich besitze zwei Fritzboxen, die per LAN-Kabel verbunden sind.

In FHEM: FritzBox -> FB 6360 ( Hauptrouter )
                                                                            > über LAN-Kabel verbunden
In FHEM: FritzBox2 -> FB 4020 ( als Repeater )

Durch Versuche mit unseren Handys, hat sich folgender Code ( ohne MAC-Adresse Zuweisung ) bewährt:

######## Wer ist online
sub DeviceImWlan($) {
  # 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
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my ($mac_) = @_;
  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/) {
} else {
  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
  $Status = 1;
}
         Log 1, "Abfrage Fritzbox: $_  Reading:  $StatusFritz Status: $Status";
}
    return $Status
}


Es werden sämtliche Fritzboxen durchsucht.

2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox  Reading:  Handy01 (LAN3) Status: 1
2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox2  Reading:  Handy01 (WLAN, 72 / 8 Mbit/s, -41)


Als Device in FHEM gibt es zwei Möglichkeiten:

define Handy01 PRESENCE function {DeviceImWlan("A1:B1:C1:D1:E1:F1")} 10 30

Hierbei wird die MAC-Adresse in beiden Fritzboxen gesucht. Da das Handy aber nur auf einer Fritzbox mit "Verbrauch" angezeigt wird, dauert es ewig, bis das Handy abgemeldet ist. Der "Verbrauch" ist zwar 0, allerdings steht die MAC-Adresse als aktiv in den Fritzboxen. Somit ist diese Methode für mich nicht brauchbar.

oder

define Handy01 PRESENCE function {checkFritzMACpresent("FritzBox2","A1:B1:C1:D1:E1:F1")} 10 30

Hierbei wird der "Verbrauch" auf einer vorgewählten Fritzbox gesucht. Hier habe ich An- und Abmeldezeiten unter 1 min.. Der Nachteil, es wird nur die voreingestellte Fritzbox beobachtet. Sollte sich das Handy in die andere Fritzbox einloggen, hab ich auch hier hohe An- und Abmeldezeiten.
Also muss ich für die zweite Fritzbox einen zusätzlichen Device anlegen.

define Handy01b PRESENCE function {checkFritzMACpresent("FritzBox","A1:B1:C1:D1:E1:F1")} 10 30

Je nachdem wo sich das Handy einloggt, wird entweder das erste oder das zweite Device als Anwesend gemeldet.

Wie ich jetzt aus zwei Anwesenheitsabfragen eine Anwesenheitsanzeige mache, weiß ich noch nicht. Eventuell über ein notify mit schaltbarem Dummy.

Wenn jemand einen Verbesserungsvorschlag hat, nur her damit. Ich bin zum testen bereit, allerdings bitte ich um etwas Zeit für die Versuche.

Otto123

Moin,

interessant wäre etwas mehr Log gewesen:
2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox  Reading:  Handy01 (LAN3) Status: 1
2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox2  Reading:  Handy01 (WLAN, 72 / 8 Mbit/s, -41)

hier ist das Handy01 online, der Wechsel nach offline (Abmeldung) würde mich ja auch interessieren.
Was mich wundert ist: Warum ist die zweite Zeile unvollständig? Warum fehlt hinten der Status? Copy&Paste Fehler?

Man müsste jetzt einfach verhindern, dass ein Handy01 (LAN3) als erkannt gilt. Muss ich noch etwas nachdenken. Ob mir das zeitnah gelingt kann ich nicht versprechen.

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

lusche800

Ups. Hast recht.

2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox  Reading:  Handy01 (LAN3) Status: 1
2018.05.17 22:39:39 1: Abfrage Fritzbox: FritzBox2  Reading:  Handy01 (WLAN, 72 / 8 Mbit/s, -41) Status: 1


und dies:

2018.05.17 22:41:39 1: Abfrage Fritzbox: FritzBox  Reading:  Handy01 (LAN3) Status: 1
2018.05.17 22:41:39 1: Abfrage Fritzbox: FritzBox2  Reading:  weg Status: 1


Mach Dir wegen der Zeit keinen Streß. Ich bin ja schon froh, das wenigstens einer versucht zu helfen. Und das ohne irgendwelche unangebrachten Kommentare ( wieso, weshalb, warum, nutze doch Google ). Dies ist mittlerweile ein Volkssport geworden. Entweder ich gebe Hilfestellung oder ich lasse es. Meine Meinung.

Deshalb: Vielen Dank für die Unterstützung.

Frank_Huber



Zitat von: lusche800 am 18 Mai 2018, 09:13:22
Wie ich jetzt aus zwei Anwesenheitsabfragen eine Anwesenheitsanzeige mache, weiß ich noch nicht. Eventuell über ein notify mit schaltbarem Dummy.

Wenn jemand einen Verbesserungsvorschlag hat, nur her damit. Ich bin zum testen bereit, allerdings bitte ich um etwas Zeit für die Versuche.

Das geht recht einfach über DOIF. Da brauchst auch keinen dummy dafür.
(Handy an fb1 oder fb2 present) ()
DOELSEIF (Handy an fb1 und fb2 absent) ()
Den Ausführungsteil lässt leer
Attribut cmdState present|absent
Dein doif bekommt dann den jeweiligen state.

Gesendet von meinem S60 mit Tapatalk


Otto123

Bei Vorhandensein von LANx gilt der Status nicht, also vielleicht einfach noch eine Bedingung:

sub DeviceImWlan($) {
  # 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
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
  my ($MAC) = @_;
  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/) {
} elsif ($StatusFritz !~ /LAN./) {
} else {
  # Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
  $Status = 1;
}
}
    return $Status
}



Ich habe das Gefühl man kann das alles verkürzen durch einfaches umkehren, aber versuch doch mal so.

Ich habe das jetzt nicht probiert, ich habe das WLAN der FB derzeit nicht in Betrieb.

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

lusche800

Tja, entweder bin ich zu blöd oder es geht halt einfach nicht.
Auch mit dem Zusatz gehts nicht. In der Logfile wird nix registriert.
Was mich wundert ist:
beim suchen nach "Verbrauch" steht: elsif ($StatusFritz =~ /(.*)s, 0/)
beim suchen nach LAN steht:              elsif ($StatusFritz !~ /LAN./)
Warum bei dem einen ein "=" und beim anderen ein "!" ?
Liegt vielleicht hier das Problem ?

Ich habe für jede Fritzbox ein notify mit Dummy erstellt ( zum testen ). An der Fritzbox, wo das Handy eingeloggt ist, geht das An- und Abmelden innerhalb von Sekunden. Bei der anderen dauerts.

FritzBox:mac_A1_B1_C1_D1_E1_F1:.* {
  if (ReadingsVal("FritzBox", "mac_A1_B1_C1_D1_E1_F1", "inactive") eq "inactive")
  {
    fhem("set Handy01 absent");
  }
  else
  {
    fhem("set Handy01 present");
  }
}


So auch für die zweite Box. Funktioniert, aber mit einem Problem:

Wenn das Handy sich aus der zweiten Box ausloggt, wird der Dummy auf Abwesend gesetzt, da über das notify dies geschieht. Da das andere notify immer noch auf Anwesend steht und sich durch das einloggen auf der ersten Box sich nichts ändert ( Handy ist dort ja immer noch als Anwesend registriert ), ändert sich der Dummy nicht. Somit bin ich immer noch Abwesend.

Mal sehen, vielleicht kann ich den "Verbrauch" irgendwie mit einbauen und somit das Ganze hinbiegen. Wenn das soweit funktioniert, kann ich mich dann mal an das DOIF heranwagen.

Es ist aber interessant, an was man alles denken muss, um das System so hinzugekommen, wie man es möchte.

Otto123

Moin,

ZitatWarum bei dem einen ein "=" und beim anderen ein "!" ?
=~ bedeutet: Bedingung wird war wenn der String vorhanden ist
!~ bedeutet: Bedingung wird war wenn der String nicht enthalten ist

Ja vielleicht hatte ich einen Denkfehler, probier es einfach und ersetze !~ durch =~

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

lusche800

Du hattest keinen Denkfehler.
! durch = erstetzt -> Abwesend

Trotzdem danke.

Otto123

es wäre gut wenn Du noch logs liefern könntest von dem kompletten Wechsel von Abwesend - anwesend - abwesend.

Damit ich mitdenken kann  ;D
Allerdings morgen ist Mühlentag und dann bin ich erstmal ein paar Tage auf Radtour  8)

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

Frank_Huber



Zitat von: Otto123 am 20 Mai 2018, 17:27:24
Allerdings morgen ist Mühlentag und dann bin ich erstmal ein paar Tage auf Radtour  8)

Gruß Otto
Viel Spass Otto!

Gesendet von meinem Doogee S60 mit Tapatalk


lusche800

#146
Auch von mir viel Spaß und erhol Dich gut.
Wegen der Anwesenheit mach Dir keine Sorgen.
Ich mach da auch mal eine Pause.

ragnarok

gabs da mit der Fritzbox 7590 bzw. allgemein aktuellem FritzOS noch ne Änderung, was die Anzeige der Readings angeht ?

bei mir spuckt er bei WLAN-Devices immer nur den Namen aus ohne RSSI.

wenn ich mir in der Fritzbox.pm die Methode FRITZBOX_Readout_Run_Web anschaue, ca. Zeile 1574, nahe dem Kommentar "Create a reading if a landevice is connected", wo die mac_* Readings aufgebaut werden und da ein Log reinsetze, ist sowohl $_->{ethernet}, $_->{wlan} und $_->{ethernet_port} nicht definiert für LAN-Devices.

Wenn ich das folgende Coding

if ( (!$_->{ethernet} && $_->{wlan}) ) {

So erweitere

if ( (!$_->{ethernet} && $_->{wlan}) || $wlanList{$mac} ) {

Kriege ich auch meinen RSSI Wert.

Warum ist das Coding an der Stelle nicht gleich so aufgebaut ? Ein paar Zeilen obendrüber wird die WLAN-List doch allgemeingültig ausgelesen.

Jens_B

#148
... irgendwas muß bei der 7590 anders sein, Du hast mir meine Anwesenheitskennung wieder repariert mit der Änderung im Modul :-)

Danke Dafür.

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

sannnuser86

Hallo kann mir evtl einer Helfen ich möchte gerne das TelegramBot mir eine nachricht sendet sobald sich jemand per Lan-Ping ins WLAN einbindet. Habe ein Notify eingerichtet mit diesen Werten aber wenn sich der Status geändert hat passiert leider nix

Anwesenheit:presence.* { if ($EVTPART1 eq "present") { fhem("set teleBot msg 'Anwesenheit' 'anwesend'"); } elsif ($EVTPART1 eq "absent") { fhem("set teleBot msg 'Anwesenheit' 'abwesend'"); } }

Gesendet von meinem LYA-L29 mit Tapatalk