An-/Abwesenheitserkennung mit WLAN und Fritz!Box

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

Vorheriges Thema - Nächstes Thema

Dirk070

Mit der Abfrage auf das Vorhandensein des WLAN-Eintrags funktioniert es jetzt bei mir reibungslos.
Als netter Nebeneffekt wird ein "Abwesend" schneller erkannt. Hier mal die komplette Funktion, falls jemand davon etwas brauchen kann.


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, $iPhone, $PresState) = @_;
  # 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") {
            # Dieser Zweig testet ob das Reading vorhanden ist
            } elsif ($StatusFritz eq "inactive") {
            # Dieser Zweig testet ob im Reading inactive steht
            } elsif ($StatusFritz =~ /(.*)s, 0/) {
          # Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)"
  } elsif ($StatusFritz !~ /(.*)WLAN/) {
#Log 1, ">>> DEBUG FB:$_ iPhone:$iPhone MAC:$MAC Reading:$StatusFritz";
          # Dieser Zweig testet auf "<geraetename> OHNE (WLAN"
  # in der FB taucht das iPhone ohne WLAN auf, führt zu fehlerhafter Erkennung
        }
else {
$Status = 1
}
if ($Status == 1 and $PresState eq 'absent')
{
if ($StatusFritz eq 'weg')
{
Log 1, ">>> iPhone-Presence iPhone:$iPhone MAC:$MAC nicht in FB:$_ aktiv";
}
else
{
Log 1, ">>> iPhone-Presence FB:$_ iPhone:$iPhone MAC:$MAC Reading:$StatusFritz von PresState:$PresState auf present";
}
}
    }
# Nach dem Loop über die FritzBoxen, wenn dann Status 0, dann iPhone in keiner FB gefunden
if ($Status == 0 and $PresState eq 'present')
{
Log 1, ">>> iPhone-Presence iPhone:$iPhone MAC:$MAC von PresState:$PresState auf absent";
}
  return $Status
}

Jens_B

Hallo zusammen,
Vielleicht mal als Tipp (ich hoffe es passt so einigermassen in diesen Thread)
da bei mir lepresence und auch das Wlan presence in Verbindung mit den IPhone bei uns nicht mehr zuverlässig funktioniert habe ich folgende Lösung :
Ich habe mir dummies erstellt, welche den Presence Status enthalten: (absent/present) die dummy sind per Homebridge mit dem Homekit von Apple verbunden.
In Homekit habe ich eine Automation erstellt, welche diese dummies ein/ausschaltet. ,Wenn xxx das haus verlässte deaktivre ,xxx anwesenheit''
,Wenn xxx zu Hause ankommt aktiviere ...'

Das funktioniert einwandfrei. Und ich brauche mich nicht mehr mit bluetooth oder wlan Problemen an den Raspberries rumärgern ;-).

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

Fredi69

Zitat von: Dirk070 am 04 Juli 2023, 12:32:55Mit der Abfrage auf das Vorhandensein des WLAN-Eintrags funktioniert es jetzt bei mir reibungslos.
Als netter Nebeneffekt wird ein "Abwesend" schneller erkannt. Hier mal die komplette Funktion, falls jemand davon etwas brauchen kann.


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, $iPhone, $PresState) = @_;
  # 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") {
            # Dieser Zweig testet ob das Reading vorhanden ist
            } elsif ($StatusFritz eq "inactive") {
            # Dieser Zweig testet ob im Reading inactive steht
            } elsif ($StatusFritz =~ /(.*)s, 0/) {
          # Dieser Zweig testet auf "<geraetename> (WLAN, 0 / 0 Mbit/s, 0)"
  } elsif ($StatusFritz !~ /(.*)WLAN/) {
#Log 1, ">>> DEBUG FB:$_ iPhone:$iPhone MAC:$MAC Reading:$StatusFritz";
          # Dieser Zweig testet auf "<geraetename> OHNE (WLAN"
  # in der FB taucht das iPhone ohne WLAN auf, führt zu fehlerhafter Erkennung
        }
else {
$Status = 1
}
if ($Status == 1 and $PresState eq 'absent')
{
if ($StatusFritz eq 'weg')
{
Log 1, ">>> iPhone-Presence iPhone:$iPhone MAC:$MAC nicht in FB:$_ aktiv";
}
else
{
Log 1, ">>> iPhone-Presence FB:$_ iPhone:$iPhone MAC:$MAC Reading:$StatusFritz von PresState:$PresState auf present";
}
}
    }
# Nach dem Loop über die FritzBoxen, wenn dann Status 0, dann iPhone in keiner FB gefunden
if ($Status == 0 and $PresState eq 'present')
{
Log 1, ">>> iPhone-Presence iPhone:$iPhone MAC:$MAC von PresState:$PresState auf absent";
}
  return $Status
}

Mit welchen Werten wird die Routine aufgerufen?
$MAC ist die Mac Adresse, oder?
$iPhone ?
$PresState ?
fhem auf Raspberry Pi 3
FRITZ!Box7490, Fritz!Box 3270 AP, 3xHMLAN, CUL868, nanoCUL 433 für IT, JeeLink für LaCrosse, HUE Bridge 2.0, Samsung UE46C8790 (STV), mehrere Homematic, Intertechno, Shelly und LaCrosse Komponenten