Samstag, 25. Juli 2015

Die Zeiten ändern sich

AVM hat es angekündigt und nun umgesetzt: FRITZ!OS 06.24 ist das letzte Betriebssystem wo Telnet noch aktivierbar ist und die WEBCM CGI Schnittstelle vorhanden ist. Seit ein paar Tagen ist für die FB7490 das neue FRITZ!OS 06.30 offiziell verfügbar.

Beide Schnittstellen wurden aus Sicherheitsgründen entfernt. Als einzige Schnittstelle wird jetzt TR-064 unterstützt.

Damit ist es an der Zeit das Konstrukt mit der FHEM Instanz auf der Fritzbox zu überdenken. Das System soll ja "supported" bleiben. Im Vordergrund steht für mich nach wie vor die Anwesenheitserkennung über Wlan.

Umstellung FHEM auf neues FB Interface

Das FRITZBOX Modul wurde von seinem Entwickler in den letzten Wochen kräftig überarbeitet.

Installation des Fritzbox Moduls

Update FHEM neue Version (FRITZBOX.pm mindestens 8978 2015-07-15)

Eingeleitet wird jede Installation mit Aptitude täglich mit einer Aktualisierung
sudo apt-get update
Wenn man noch mit telnet experimentieren will (macht nur Sinn bis Version 06.24 oder mit Freetz) braucht man telnet
sudo apt-get install libnet-telnet-perl

Auf alle Fälle braucht man folgende perl Module, bei mir waren die alle schon installiert (Basis, Sonos und netatmo)
sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl

Jetzt kann das FRITZBOX Device angelegt werden
define FB7490 FRITZBOX
set FB7490 password xxxx
attr FB7490 allowTR064Command 1

Wenn die Fritzbox nicht über die Namensauflösung fritz.box im Netz erreichbar ist, muss das Attribute fritzBoxIP mit der IP Adresse bestückt werden.
Jetzt spricht FHEM mit der FB über telnet oder/und TR064 und das Device sollte mit Werten gefüllt werden. Es dauert eventuell zwei drei Abfragerunden eh alles komplett ist. In den Internals kann man ablesen ob die FB überprüft ist (APICHECKED) und welche Schnittstellen zur Verfügung stehen (LUAQUERY, TELNET, TR064, WBCM)

Über das Attribute INTERVALL kann man das Abfrageintervall auf 60 sec stellen.

Jetzt spricht FHEM mit der FB über telnet oder/und TR064.

Anwesenheit von WLAN Geräten ermitteln.

Aktive Wlan Geräte werden in den Readings gelistet:
mac_xx_xx_xx_xx_xx_xx Name

Werden Geräte im Wlan abgemeldet, erscheinen sie kurzzeitig mit dem Namen "inactive" und werden später nicht mehr gelistet.
Eine Abfrage liefert den Namen des Gerätes zurück oder nichts, eventuell auch "inactive". Das kann man direkt in der Befehlszeile von FHEM testen:
{ReadingsVal("FB7490","mac_11_22_33_44_55_66","")}

Daraus habe ich nun folgende Abfrage gebaut


Zunächst wird eine Routine in 99_myUtils eingefügt. Ist die 99_myUtils.pm noch nicht vorhanden kann man das Template von FHEM verwenden. War die Datei schon vorhanden, darf man nach dem editieren ein reload 99_myUtils nicht vergessen. Wie es genau geht steht im Wiki 
Das ist meine erste wirklich selbstgeschrieben Perl Routine:

######## Netzwerk Gerät über Fritzbox abfragen ############
sub
NetDevDa($$$)
{
       my ($FB, $Reading, $Device) = @_;
       my $Name = ReadingsVal($FB,$Reading,"");

       if( $Name eq $Device) {
           return 1;
       }
       else {
           return 0;
       }
}

Definition mit dem PRESENCE Modul

Die interne Fritzbox Funktion aus dem Modul können wir derzeit so nicht mehr verwenden. Sie funktioniert nur wenn FHEM lokal auf der Fritzbox läuft.
Die Abfrage im PRESENCE Modul kann auch mit eigenen Funktionen erfolgen. Die Funktion habe ich in der 99_myUtils vorbereitet.

define Wlan_Device PRESENCE function {NetDevDa("FB7490","mac_xx_xx_xx_xx_xx_xx","<Name aus dem Reading>")} 10 30

Das PRESENCE Modul würde nach dieser Definition alle 30 Sekunden zwei Events feuern, man kann sich das gut im "Event monitor" anschauen. Einen Event mit <state> und einen Event mit "presence: <state>". Egal ob sich am Status was geändert hat oder nicht. Das wollen wir nicht, deshalb setzt man noch das Attribute event-on-change-reading auf den Wert state. Damit wird nur ein Event mit dem Inhalt <state> gesendet in dem Moment wo sich der Status ändert. Das ist für die angeschlossene Auswertelogik von Bedeutung.
attr Wlan_Device event-on-change-reading state

Jetzt könnte man noch die Anwesenheit protokollieren:
define FileLog_MobileGeraete FileLog ./log/MobileGeraete-%Y.log Wlan_Device:.*|Wlan_Device2:.* 

Diese Abfrage der Fritzbox funktioniert im Gegensatz zur simplen LAN-PING Methode des PRESENCE Modules auch für Geräte, die die Wlan Schnittstelle bei Inaktivität abschalten (z.B. iPhone).

Etwas mehr Komfort

Die obige Abfrage erfüllt ihren Zweck auf die Schnelle, ist aber etwas unkomfortabel. Eigentlich werden MAC Adressen in der Form 11:22:33:44:55:66 verwendet und eigentlich will man ja nur wissen ob eine bestimmte MAC Adresse im Netzwerk vorhanden ist. Ob eine oder mehrere Fritzboxen oder Fritz Repeater im Netz vorhanden sind, sowie der konkrete Name des Gerätes sollte dabei egal sein.
In Anlehnung an diesen Beitrag im Forum habe ich den Code noch etwas ergänzt. Im Wiki gibt es jede Menge Varianten und Informationen dazu.

######## 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;
    }
}
Damit wird die Definition im PRESENCE Modul einfacher und wesentlich flexibler:
define Wlan_Device PRESENCE function {NetDevDa("xx:xx:xx:xx:xx:xx")} 10 30

Fritzbox auf neues System aktualisieren

Damit ich relativ sicher bin, das die Anwesenheitserkennung reibungslos funktioniert hatte ich Telnet auf der FB deaktiviert und die FHEM Instanz beendet. Nach ein paar Wochen Test ist es an der Zeit die Umstellung durch Update der Fritzbox zu beenden.

Ich habe eine Sicherung der Fritzbox Einstellungen gemacht, die Wiederherstellungsprogramme von AVM für die Version 6.24 und 6.30 heruntergeladen und dann einfach Update gedrückt.
Funktioniert!
Man bekommt über die FRITZ!NAS Funktion immer noch den alten fhem Pfad, der wird nicht gelöscht. Wer also vergessen hat, dass nach dem Update FHEM nicht mehr läuft und auf ein anderes System umziehen will, kann jetzt immer noch alles retten.
Was bleibt ist die Ausschrift auf der Startseite "Vom Hersteller nicht unterstützte Änderungen". Wer also sein System noch ganz sauber machen will, kann jetzt das Recovery Programm starten und anschließend die Sicherung der Einstellung zurückspielen. Dazu unbedingt die Hinweise  von AVM beachten.
Dabei wird der Speicher der Fritzbox komplett gelöscht. Also vorher alle Daten über FRITZ!NAS sichern!

Kommentare:

  1. Hallo,

    meine Fritzbox braucht 10 Minuten bis sie erkennt, dass ein Smartphone nicht mehr imn WLAN aktiv ist. konntest du das auch feststellen?

    AntwortenLöschen
    Antworten
    1. Hallo Christian, die Erkennung (Anmeldung) im WLAN kann zwischen Sekunden und mehreren Minuten dauern, ganz selten auch mal mehr als 5 min. Die Abwesenheit (Verlassen des WLAN) dauert immer einige Minuten. Ich würde fast sagen 10 min sind die Regel. Das ist aber der Fritzbox geschuldet, das war mit der alten Erkennung auch schon so.

      Löschen
    2. Es wäre jetzt noch interessant zu wissen was Du mit dieser Anwesenheitserkennung realisiert hast

      Löschen
    3. Hallo,
      wäre es möglich die Zeit zu verkürzen sodass beim Verlassen des WLANs das Gerät auch innerhalbvon 10 Sekunden auf abwesend steht?

      Löschen
    4. Welche Zeit? WLAN Anmelden und Verlassen regelt der Router, auf den hat man keinen Einfluss.
      Man könnte LAN-Ping verwenden, damit würde das gehen. Ist aber ne völlig andere Methode. Hier ging es darum, den Router und seine Information zu angemeldeten Geräten zu nutzen.

      Löschen
  2. Naja Anwesenheit :-) Also: Einer kommt nach Hause und bestimmte Zustände werden aktiviert, Licht, Heizung usw. Wenn der letzte das Haus verlässt wieder andersherum, Licht aus usw. Das Verlassen ist, aus meiner Sicht, zeit unkritisch. Zur "schnellen" Ankunft setze ich zusätzlich auf Bluetooth.

    AntwortenLöschen
  3. Wenn Du Schlafen gehst und auf Flugmodus stellst, denkt Dein System, dass Du weg bist? Oder wie hast Du das gelöst?

    AntwortenLöschen
    Antworten
    1. Ich habe festgestellt, der Flugmodus funktioniert nicht, das Ding fliegt einfach nicht! :-) Nein, Spaß beiseite: Ich lege mein Smartphone auch schlafen, auf den Qi Lader in der Küche.

      Löschen
  4. Hi,
    habe gerade Fitz!OS 6.50 auf meiner 7490 eingespielt und die Anwesenheitserkennung geht leider nicht mehr :(

    AntwortenLöschen
    Antworten
    1. Hab ich noch nicht probiert, aber sollte gehen wie unter 6.30

      Löschen
  5. Hmmmm, erstmal Danke für den Blog :-)
    Aaaalso , bei meinem Handy funktioniert es tadellos ( iPhone 6s ) , aber das Handy meiner Frau geht regelmäßig auf absend ,obwohl es weiter im Netz ist ...( iPhone 5s )
    Kann es daran liegen ?

    AntwortenLöschen
    Antworten
    1. Das die Eiföner sich aus dem WLAN abmelden wenn sie schlafen gehen, sagen einige Leute. Ich selbst habe keines aber bei Bekannten funktioniert es mit allen Generationen 4 5 6 einwandfrei. Ich vermute es hängt davon ab, ob irgendwelche Apps etwas tun (z.B. synchronisieren) oder nicht.
      Seit einem letzten Update Android 6 habe ich ein ähnliches Verhalten. Offenbar wird WLAN wegen Akku Schonung wirklich irgendwann deaktiviert. Momentan keine Idee.

      Löschen
  6. Hallo Otto!

    Ich würde gerne deinen MyUtils Code in einem meiner Video-Tutorials verwenden und anderen zeigen wenn du nichts dagegen hast.

    Grüße
    Jan

    AntwortenLöschen
    Antworten
    1. Hallo Jan,

      naja der Ursprung des Codes liegt ja im FHEM Forum. Der Code liegt im Netz, wenn Du ne Quellenangabe machst habe ich nichts dagegen. Wie finde ich Deine Tutorials?

      Gruß Otto

      Löschen
  7. Hallo Otto,

    super Blog. Läuft bei mir Newbie ebenso. Allerdings braucht es sehr lange, bis die Information, dass ein Gerät nicht mehr im W-Lan ist sehr lange beim Fhem. (10-15 min). An der Fritzbox 7490 mit 6.5 Update geht das im Sekundenbereich. Liegt das evtl. an der Schnittstelle zum Fhem?
    Hast du noch einen weiteren guten Blog am laufen zum Thema Weiterverarbeiten/ Zusammenschalten FHEM mit Homematic bzw. KNX?

    Besten Dank für deine Unterstützung.
    Grüße
    Axel

    AntwortenLöschen
    Antworten
    1. Hallo Axel,

      die Schnittstelle zu FHEM (FRITZBOX Modul) läuft im Polling. Wenn man das attribute INTERVAL nicht gesetzt hat, pollt das Modul alle 300 sec. Falls die FB wirklich nach Sekunden merken sollte, dass ein Gerät nicht mehr angemeldet ist, kann es also knapp 10 Minuten dauern bis die Info in FHEM ankommt. Ich würde die Polling Frequenz nicht allzu sehr hochdrehen. Ich arbeite mit 60 sec.
      Das hier ist mein einziger Blog, ich setze nur Homematic ein, kein KNX.
      Gruß Otto

      Löschen
  8. Hallo Axel,

    ich habe zwar kein KNX, habe aber z.B. FS20 mit HM kombiniert - da in fhem alles zusammen läuft, fannst Du z.B. mit notify einen FS20-Handsender benutzen, um HM-Heizungssteuerung auf eine andere (feste) Temperatur zu switchen. Oder einen HM-Fenster-Magnetschalter, um mit einer FS20-Steckdose der Feuerstättenverordnung gerecht zu werden und die Dunstabzugshaube vom Fenster schalten lassen ... Der Möglichkeiten sind (fast) unbegrenzt.

    Gruß, Christoph

    AntwortenLöschen
  9. Hallo

    Das funktioniert super.
    Kannst du mir vieleicht sagen wi und wo ich eine pushover Benachrichtigung einbauen kann

    Gruss
    Wolfgang

    AntwortenLöschen
  10. Hi Otto,

    ich kriege die States richtig in FHEM angezeigt. Aber in der Tablet UI bekomme ich es nicht hin die Stati richtig anzuzeigen / auszulesen...


    https://codepaste.net/bh6pat

    http://i.imgur.com/qyAFerX.png

    AntwortenLöschen
    Antworten
    1. Hi soRai,
      sorry, die Frage wirst Du im Forum stellen müssen. Ich verwende die Tablet UI nicht.
      Gruß Otto

      Löschen
  11. Seit dem Update auf die FW 6.83 funktioniert das nicht mehr. In den Readings bei der FritzBox steht keine mac_... mehr. Lediglich an meinem Router mit FW 6.51 klappt es noch. Da hat AVM wohl was geändert. Ist das bekannt, gibt es eine Lösung?
    Die Lösung hat ewig gut funktioniert, sehr schade falls das nicht mehr gehen sollte.

    AntwortenLöschen
    Antworten
    1. Bei mir funktioniert alles nach wie vor ohne Probleme. Ich weiß, viele hatten Probleme, wenn man den Thread im Forum mit liest. Am Ende hatte ich immer verstanden, war ein Neustart auf beiden Seiten die Lösung. Aber eigentlich macht man die ja sowieso?

      Löschen
    2. DANKE. Ein simpler shutdown restart des fhem-Servers hat tatsächlich gereicht.
      Bin irgendwie nicht drauf gekommen, dass es daran liegen könnte.
      Nochmals besten Dank

      Löschen