Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitserkennung über FritzBox

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Anwesenheitserkennung über FritzBox

    Nabend zusammen,

    ich bin während ich mit dem Netzwerk-Plugin und meinem Android-Phone rumprobiert habe um über ne App ("Trigger") beim Einloggen ins WLAN den Alarm auszuschalten auf die Idee gekommen das ganze über die FritzBox zu lösen.
    Vorteil dabei ist, dass ich der werten Dame im Haus nicht erklären muss wie Sie welche App zu konfigurieren hat, sondern ich einfach ihr Handy in die Prüfung einbeziehe ;-)

    Grundlage dafür war ist ein Fundstück vom FHEM-Wiki:

    Anwesenheitserkennung - Remote Fritzbox ? FHEMWiki


    Einige Schritte aus dieser Anleitung müssen auch für die Smarthome Integration ausgeführt werden:

    1. Telnet auf der FritzBox aktivieren.

    2. perl NET::Telnet Modul auf dem Host installieren. Beim Raspberry-PI geht das so:

    Code:
    sudo apt-get install libnet-telnet-perl
    3. kopieren von Rpresence.sh in die Fritzbox z.B. mittels FTP in folgendes Verzeichnis:

    Code:
    /var/media/ftp/FRITZ/bin # Der Verzeichnispfad muß angepaßt werden! In diesem Beispiel ist das eine FB7390 im Internen Speicher.
    chmod +x Rpresence.sh # shell script ausführbar machen.

    Ab hier variiert die Anleitung dann:

    4. RFritzBoxScan.pl + configuration in ein Verzeichnis kopieren. (z.B. "/usr/local/remoteFritzBox/", ggf. User und Berechtigungen anpassen)

    5. RFritzBoxScan.pl ausführbar machen
    Code:
    chmod +x RFritzBoxScan.pl
    6. credentials.cfg erstellen / anpassen (Quelle: s.o.)
    Code:
    # PRESENCE credentials (only required for function RemoteFritzBox)
    $credentials{RemoteFritzBox}{ipadress} = "192.168.1.254"; # FB LAN Adress
    $credentials{RemoteFritzBox}{username} = "FritzBoxusername";
    $credentials{RemoteFritzBox}{password} = "FritzboxPasswort";
    $credentials{RemoteFritzBox}{shellcmd} = "/var/media/ftp/FRITZ/bin/Rpresence.sh"; # pfad anpassen!
    $credentials{RemoteFritzBox}{serverhost} = "localhost";  #  RFritzBoxScan.pl provides this service
    $credentials{RemoteFritzBox}{serverport} = 7777;
    $credentials{RemoteFritzBox}{serverbin} = "RFritzBoxScan.pl"; # Fritzbox daemon

    7. Logic-Script im Smarthome Verzeichnis anlegen

    Code:
    #!/usr/bin/env python
    
    import socket
    import subprocess
    import time
    
    # define binary and config file
    fritzboxScanBin = "/usr/local/remoteFritzBox/RFritzBoxScan.pl"
    fritzboxScanCfg = "/usr/local/remoteFritzBox/credentials.cfg"
    
    # define devices to scan for
    devices = ["Lars-Handy", "Sarah-Handy"]
    
    # ensure that RFritzBoxScan is running
    if subprocess.check_output("ps -e | grep RFritzBoxScan | grep -v grep | wc -l", shell = True) == b'0\n':
        logger.info("Startig RFritzBoxScan...")
        subprocess.Popen(fritzboxScanBin + " " + fritzboxScanCfg + " 1>/dev/null", shell = True)
        time.sleep(1)
    
    presence = False
    # check if at least one of the devices is currently logged in
    for deviceName in devices:
        # open socket
        # change ip and / or port if it differs from fritzboxScanCfg
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect(("127.0.0.1", 7777))
        sock.send(bytes(deviceName, "UTF-8"))
        data = sock.recv(1024)
    
        if data == b'1':
            presence = True
            break;
        
        # close socket
        sock.close()
    
    # do some logic with presence information (or set an item value)
    if presence == True:
        # alarm off
        logger.info("Alarm ausgeschaltet")
        sh.zentral.alarm.gesamt(0)
    elif sh.eg.fenster.gesamt() == 0 and sh.og.fenster.gesamt() == 0 and sh.kg.fenster.gesamt() == 0:
        logger.info("Alarm eingeschaltet")
        # alarm on, if windows are closed
        sh.zentral.alarm.gesamt(1)
    else:
        # notify me about absence with open windows. Maybe it's okay, but otherwise we could close windows
        sh.nma("Warnung", "Abwesenheit festgestellt, Fenster noch offen. Alarm wurde nicht aktiviert.")
    Folgende Teile müssen an Eure Gegebenheiten angepasst werden:

    - Pfade zur Binary & Config [Zeile 8 & 9]
    - Zu prüfende Gerätenamen (WICHTIG: Das sind die Namen der Geräte die man im FB-Interface findet) [Zeile 12]
    - ggf. Socket / Port aus der "configuration" [Zeile 26]
    - Den Item-Teil ab Zeile 38.


    8. Datei ausführbar machen und in "smarthome/etc/logic.conf" anlegen. (z.B. cycle = 300)


    Das ganze ist so ohne große Python-Kentniss (außer Google und ein paar Blicke in SH.py) entstanden, daher versuche ich bei Fragen so gut es geht zu helfen und Verbesserungsvorschläge werden gerne angenommen.


    PS: der Socket wird für jedes Gerät neu aufgebaut, da der "FritzBoxRemote-Server" die Verbindung nach einem "send" wieder schließt. Ich vermute das hat n Grund, daher habe ich das Perl-Script (das kann ich noch weniger als Python ) nicht angepasst und mach einfach mehrmals die Socket-Read-Close Schleife. :-)

    Grüße,

    Lars

    PS: den Download der benötigten Datein gibt es auch hier:
    PRESENCE-RemoteFritzbox
    Angehängte Dateien

    #2
    Hi Lars,

    danke für Deinen Beitrag.

    Ich bin gerade dabei das Fritzbox Plugin grundlegend zu überarbeiten.
    Ein zukünftiges Feature wird dabei auch die Abfrage der verfügbaren Geräte sein.

    Bis bald

    Marcus

    Kommentar


      #3
      Zitat von mknx Beitrag anzeigen
      Ich bin gerade dabei das Fritzbox Plugin grundlegend zu überarbeiten.
      Ein zukünftiges Feature wird dabei auch die Abfrage der verfügbaren Geräte sein.
      Hi Markus,

      hast Du mit dem Überarbeiten im "develop"-Branch schon angefangen?
      Das Feature würde mich nämlich auch interessieren

      Grüße

      boecko

      Kommentar


        #4
        Hallo zusammen,
        ich finde das ein sehr gute Lösung für die Anwesenheitserkennung. Gibt es einen Logikbaustein für den HS, welcher das umsetzen kann?
        Besteht evtl. die Möglichkeit das in das QCFritzPro PlugIn (Gebaeudeautomation Grot) zu implemtieren, indem die MAC-Adressen im QCConfig eingegeben werden können?
        Ein zusätzlicher Rechner ist für mich keine Option, da die Visi nur noch auf Smartphone/Tablets benutzt wird.
        Für Eure Antworten vielen Dank im Voraus!

        Kommentar


          #5
          Hallo,

          probier es doch mal im Hauptforum.
          Dort treiben sich die HS-Experten rum.

          In diesem Subforum geht es primär um SmartHome.py.

          Bis bald

          Marcus

          Kommentar


            #6
            Danke für den Tipp - ich werden mein Glück dort versuchen.

            Kommentar


              #7
              Super!
              Ich finde eine MAC-Adressen-Auswertung auch zielführender. Die Gerätenamen unterliegen doch nicht selten einem Wandel :/
              Werde es aber auch so antesten

              Gruß

              Kommentar

              Lädt...
              X