An-/Abwesenheitserkennung mit WLAN und Fritz!Box

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

Vorheriges Thema - Nächstes Thema

Brice

#45
Der Kniff mit dem "Wlan Sync an" kommt aus dem Jahr 2012, also zu Zeiten, in den es das PRESENCE Modul noch nicht gab und die Fritzbox über den WLAN-Namen des Devices abgefragt wurde (FHEM war auf der FB installiert). Und hat schon damals zu unterschiedlichen Ergebnissen geführt. Bei unseren IP4 hat es funktioniert, bei vielen anderen nicht. Die Ursache für das unterschiedliche Verhalten wurde nie gefunden.

Mein System läuft mittlerweile auf einem RPi+ und die Anwesenheit wird korrekt dargestellt. Rein interessehalber werde ich heute Abend mal das Flag "Wlan Sync" beim IP4 meiner Frau deaktivieren.

Zu Lumia etc: hier könnten Energiespar-Einstellungen eine Rolle spielen. Ich hatte das Problem beim Umzug von FHEM@Fritzbox auf FHEM@Pi mit meinem Xperia Z. Die Anwesenheit wurde nur bei deaktiviertem Stamina korrekt dargestellt.

edit: mittlerweile läuft es im erweiterten Stamina-Modus

edit 18:12: Flag "Wlan Sync" ist bei dem iP4 meiner Frau gar nicht gesetzt, ist trotzdem auf "anwesend" gesetzt worden.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

FunkOdyssey

Also, ich habe nun über mehrere Tage viele verschiedene Tests gemacht und dabei auch ne Menge an Logs angelegt. Bei meinen verschiedenen iPhones habe ich sogar das WLAN Sync über iTunes aktiviert. Nichtsdestotrotz verschwinden die Geräte in meiner FritzBox 7390 in unregelmäßigen Abständen.

Es spielt auch (bei mir) keine Rolle, ob iPhone 4S, 5S oder sonstiges.

Ich schaffe es nicht, den Fehler zu finden. Ich habe auch keine Erklärung dafür.
Ich kann sämtlichen Kram wie PRESENCE, DOIFs, etc. ausschließen, da ich gezielt die Mac-Adressen in der FritzBox geloggt habe.

Das ist wirklich schade und es würde mich freuen, wenn irgendwann mal irgendjemand eine Lösung dazu hat. Bis dahin kann ich mich auf die Erkennung über die FritzBox nicht verlassen.

Brice

Zitat von: FunkOdyssey am 15 September 2015, 14:44:21
function {NetDevDa("xx:xx:xx:xx:xx:xx")} 60 60

Steht bei unserem iPhone4 auf 10 60, aber daran sollte es nicht liegen.

Habt ihr mal die Einstellungen (Filter bzw. Kindersicherung) der Fritzbox für jedes Device geprüft? Bei mir sieht das wie folgt aus:

immer die gleiche IPv4-Adresse zuweisen
Internetnutzung: unbeschränkt
Onlinezeit: unbegrenzt
Zugangsprofil: Standard

Ist nur eine Vermutung.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

FunkOdyssey

Zitat von: Brice am 23 September 2015, 13:16:58
Steht bei unserem iPhone4 auf 10 60, aber daran sollte es nicht liegen.
Nee, die Geräte verschwinden (bei mir) ja schon in den Fritzbox-Readings. Da spielt das PRESENCE-Modul dann keine Rolle mehr.

Zitat von: Brice am 23 September 2015, 13:16:58Habt ihr mal die Einstellungen (Filter bzw. Kindersicherung) der Fritzbox für jedes Device geprüft? Bei mir sieht das wie folgt aus:

immer die gleiche IPv4-Adresse zuweisen
Internetnutzung: unbeschränkt
Onlinezeit: unbegrenzt
Zugangsprofil: Standard

Ist nur eine Vermutung.

Dito. Identisch.


borsti67

Bei mir hat die Routine jetzt ein paar Tage lang nicht mehr funktioniert...
Zumindest auf dem Repeater sind die Readings "stehen geblieben" auf dem letzten Wert. Nur am Timestamp kann man dann noch erkennen, dass der Wert gar nicht mehr aktuell ist. :(
Das war sonst eigentlich nicht so, meine ich...?

Jedenfalls habe ich nun einen weiteren Test eingebaut und hoffe, dass es so wieder klappt:
sub AtHomeCheck {
    my $n = 0;
    my @fbs = devspec2array("TYPE=FRITZBOX");
    for( my $i = 0; $i < @fbmacs; $i++ ) {
        foreach( @fbs ) {
            my $mac = "mac_" . $fbmacs[$i];
            $mac =~ tr/:/_/;
            if( (ReadingsVal($_,$mac,"") ne "" ) && ((time() - time_str2num(ReadingsTimestamp($_,$mac,0))) < 600) ) {
#              Log 1,$mac . ": " . ReadingsVal($_,$mac,"") . " @ " . ReadingsTimestamp($_,$mac,0);
               $n++;
            }
        }
    }
    Log 4, "Anwesenheit: " . $n . " aktive Devices.";
[ ... ]
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

FunkOdyssey

#50
Lustig. Jetzt gerade wo ich aufgeben wollte, erschien für meine FB7390 eine Beta-Firmware. Und prompt werden die WLAN-Geräte richtig angezeigt und nicht zu häufig abgemeldet.

Kommando zurück. Ich habe die Logs falsch gelesen. Es ist bei mir immer noch genauso buggy, wie in meinen Post hier zuvor.

erwin

Hi All,
nachdem ich ursprünglich das RemoteFritzBox Modul gebaut habe,
möchte euch eine vereinfachte Version vorstellen, die ohne code in xxUtils... auskommt:

define CLFritzBox FRITZBOX
attr CLFritzBox allowShellCommand 1
attr CLFritzBox allowTR064Command 1
attr CLFritzBox boxUser <fritzboxusername>
attr CLFritzBox event-on-change-reading .*
attr CLFritzBox fritzBoxIP fritz.box
attr CLFritzBox telnetUser <fritzboxusername>

define Erwin_PR readingsProxy CLFritzBox:mac_20_D3_90_77_C8_BE
attr Erwin_PR devStateIcon absent:WLAN_Status.0 present:WLAN_Status.1
attr Erwin_PR stateFormat {(ReadingsVal($name,"state","") eq "Erwin-Galaxy-S4")?"present":"absent"}


So gehts:
1) definieren FRITZBOX
2) definieren readingsproxy
    dabei die MAC-Adresse und den Namen des Devices jeweils anpassen

Damit ist das Resultat sehr, sehr ähnlich dem PRESENCE Modul, bzw. RemoteFritzBox...
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Calle78

#52
Hey zusammen,

ich hab gerade ein Backup eingespielt und seither das Logfile voller Meldungen:
2015.10.25 19:13:43.357 2: PRESENCE (CM.fb) - error while processing check: unexpected function output (expected 0 or 1): Too many arguments for main::NetDevDa at (eval 140) line 1, near ""CM6s")"
von jedem Device :(. Die Verbindung zur Fritzbox steht, die Funktion ist vorhanden, Google kennt es nicht, ich bin ratlos.

EDIT: mit der NetDevDa von http://heinz-otto.blogspot.de/2015/07/die-zeiten-andern-sich.html funktioniert es :)

danke

ciao Carlo

Zitat von: Otto123 am 26 Juli 2015, 23:05:19
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.
######## 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;
    }
}

Im PRESENCE Modul kann man nun mittels "function" das zu überwachende Gerät definieren
define Wlan_Device PRESENCE function {NetDevDa("11:22:33:44:55:66")}  10 30

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

Gruß Otto
6,RPi4,Buster,HMLAN,HMIP,HUE,ZigBee,piVCCU,C868,C433,JEELINK,ESA2000,IRT1500,HMSECSC2,HMCCTC,HMSECSD,HM132030,HMSCI3FM,HMPB2WM55-2,FHT80,FBAHA,WithingsWS50,Jalousien,Siri,HMS100WD,Fritzbox,Harmony,Twilight,Weather,PushBullet,FHT-9998,HM-CC-TC,Trackr,RolloPort

Todo:ZWave(MieleOfen),LEDWIFI

ChristianHH

#53
Hallo Erwin,

ich habe diese Lösung bei mir (FHEM auf einem Raspi, WLAN-Router = Fritzbox) ausprobiert und bin sehr zufrieden. Vielen Dank!

Die Definition des <fritzboxusername> ist vermutlich überflüssig, wenn kein User für den Zugang von aussen (also ausserhalb des heimischen WLANs) eingerichtet ist?
Ich musste aber in meinem Fall noch das Passwort mit

set CLFritzBox password <blabla>

setzen (das sollte man vermutlich nur einmal tun, und nicht etwa im Klartext in der Konfigurationsdatei speichern).

Die MAC-Adressen musste ich in meinem Fall mit Unterstrichen definieren, also etwa so: mac_AA_BB_CC_DD_EE_FF. Hier muss vermutlich die MAC-Adresse des Mobilgerätes, welches man finden möchte, rein (also nicht die MAC-Adresse der FritzBox)?

In meinem Fall musste "devStateIcon" noch in der Konfigurationsdatei definiert werden, also so:

attr global userattr devStateIcon icon webCmd set setList

Danke nochmal,
Christian





Zitat von: erwin am 29 September 2015, 15:06:39
Hi All,
nachdem ich ursprünglich das RemoteFritzBox Modul gebaut habe,
möchte euch eine vereinfachte Version vorstellen, die ohne code in xxUtils... auskommt:

define CLFritzBox FRITZBOX
attr CLFritzBox allowShellCommand 1
attr CLFritzBox allowTR064Command 1
attr CLFritzBox boxUser <fritzboxusername>
attr CLFritzBox event-on-change-reading .*
attr CLFritzBox fritzBoxIP fritz.box
attr CLFritzBox telnetUser <fritzboxusername>

define Erwin_PR readingsProxy CLFritzBox:mac_20_D3_90_77_C8_BE
attr Erwin_PR devStateIcon absent:WLAN_Status.0 present:WLAN_Status.1
attr Erwin_PR stateFormat {(ReadingsVal($name,"state","") eq "Erwin-Galaxy-S4")?"present":"absent"}


So gehts:
1) definieren FRITZBOX
2) definieren readingsproxy
    dabei die MAC-Adresse und den Namen des Devices jeweils anpassen

Damit ist das Resultat sehr, sehr ähnlich dem PRESENCE Modul, bzw. RemoteFritzBox...
l.g. erwin

yogiflop

Zitat von: borsti67 am 26 September 2015, 13:05:43
Bei mir hat die Routine jetzt ein paar Tage lang nicht mehr funktioniert...
Zumindest auf dem Repeater sind die Readings "stehen geblieben" auf dem letzten Wert. Nur am Timestamp kann man dann noch erkennen, dass der Wert gar nicht mehr aktuell ist. :(
Das war sonst eigentlich nicht so, meine ich...?


Hallo,

dieses Problem, das die MAC-Adresse im Repeater stehen bleibt, habe ich auch, gibt es da inzwischen eine Lösung zu ohne den TimeStamp mit abzufragen.

Mfg

Marc
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

borsti67

ich hab's nun mit Timestamp-Kontrolle.
Hat nur leider die "Nebenwirkung", dass die Erkennung deutlich später greift, da ich nicht so oft abfragen will...
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Otto123

War bei mir ein Anfangs / Einrichtungsfehler. Ich habe diese Readings einfach gelöscht. Danach funktioniert das einwandfrei

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

borsti67

Interessant!
Bei mir war das nach löschen der Readings auch eine Zeitlang so, aber dann ging es wieder los.
Otto, setzt Du nur EIN Fritz-Gerät ein? Ich habe das Gefühl, der Zusammenhang ist die Kombination von Box und Repeater.
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Otto123

Ja ich habe aktuell nur ein FB Gerät. Und Du wirst Recht haben, das Problem bei mir damals war, dass es zwei Geräte gab und man der FB nicht mitgeben konnte welche Box gemeint ist. Beide hören ja auf fritz.box oder so.
Tupol hat eine Übergabe der IP beim define eingeführt. Bis dahin hat er sich immer die falschen readings geschnappt.

Wenn man FB und Repeater hat, habe ich auch schon gesehen, dass die Ansicht in der Oberfläche der FB auch blos "fehlerhaft" sprich alt ist.
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

ChristianHH

Hallo Erwin,

Entschuldigung für die Anfängerfrage: wie frage ich den Zustand von Erwin_PR ab?

Beim alten PRESENCE Modul ging das in etwa so:

if (!($Erwin_PR)) {fhem "set Heizung_S mode manual desired-temp 6.0"}

Diese Abfrage funktioniert aber scheinbar bei der von Dir zitierten Definition nicht (Meldung: PERL WARNING: Use of uninitialized value $value{"Erwin_PR"} in string eq at (eval 1696) line 2.)

Danke!





Zitat von: erwin am 29 September 2015, 15:06:39
Hi All,
nachdem ich ursprünglich das RemoteFritzBox Modul gebaut habe,
möchte euch eine vereinfachte Version vorstellen, die ohne code in xxUtils... auskommt:

define CLFritzBox FRITZBOX
attr CLFritzBox allowShellCommand 1
attr CLFritzBox allowTR064Command 1
attr CLFritzBox boxUser <fritzboxusername>
attr CLFritzBox event-on-change-reading .*
attr CLFritzBox fritzBoxIP fritz.box
attr CLFritzBox telnetUser <fritzboxusername>

define Erwin_PR readingsProxy CLFritzBox:mac_20_D3_90_77_C8_BE
attr Erwin_PR devStateIcon absent:WLAN_Status.0 present:WLAN_Status.1
attr Erwin_PR stateFormat {(ReadingsVal($name,"state","") eq "Erwin-Galaxy-S4")?"present":"absent"}


So gehts:
1) definieren FRITZBOX
2) definieren readingsproxy
    dabei die MAC-Adresse und den Namen des Devices jeweils anpassen

Damit ist das Resultat sehr, sehr ähnlich dem PRESENCE Modul, bzw. RemoteFritzBox...
l.g. erwin