Erweiterung des PRESENCE Moduls um OpenWRT Abfrage

Begonnen von JanLo, 09 Februar 2015, 00:07:18

Vorheriges Thema - Nächstes Thema

JanLo

OpenWRT nutzt den hostapd als Authenticator. Dieser hat im OpenWRT ein ubus Interface. Ubus ist der OpenWRT-System-RPC. Darüber kann man mit einer Methode get_clients() die authentifizierten Wlan-Clients abfragen.

Dies scheint auch zuverlässig bei mobilen Geräten im Standby zu funktionieren, da sich diese vor dem Standby nicht deauthentifizieren.

Wenn FHEM firekt auf einem OpenWRT-Router läuft kann somit via
# ubus call hostapd.wlan0 get_clients
eine Json-formatierte Ausgabe erzeugt werden, welche die verbundenen Clients listet.

Interessanter ist aber, dass mit http://wiki.openwrt.org/doc/techref/ubus#access_to_ubus_over_http das ubus-Interface auch per HTTP bedienbar ist. Hierfür habe ich in Python einen Proof-of-Concept zusammengebaut: https://github.com/janLo/OpenWRT-Wifi-Clients-POC

Leider ist Perl nicht meine Stärke. Daher "wünsche" ich mir, das jemand, der diese Lösung auch für nützlich empfindet, das PRESENCE-Modul um die OpenWRT-Abfrage erweitert.

Mr. P

Hej JanLo,

ich bin gerade über deinen schon etwas älteren Beitrag gestolpert und da ich seit Ewigkeiten schon diese Möglichkeit verwende, wollte ich dich fragen, ob du für dich schon eine Lösung gefunden hast oder noch immer daran interessiert bist.
Ich bin damals allerdings genau den anderen Weg gegangen... Ich wollte FHEM möglichst nicht damit belasten und schaue daher immer alle paar Sekunden am OpenWRT-Router selbst nach, ob eine der gewünschten MAC-Adressen dazu gekommen oder verschwunden ist und triggere dann über eine telnet-Session an meinen Raspberry mit FHEM drauf, dass sich der Zustand von x geändert hat.
Hatte das alles schon vor den ganzen "neuen" Modulen implementiert gehabt, da aber eigentlich auch nur ein dummy-Device angesprochen wird, könnte man das genauso 1:1 nutzen. ;-)
Greetz,
   Mr. P

justme1968

oder man nimmt die function variante von PRESENCE. da kann man beliebigen eigenen code verwenden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Mr. P

Hast du grundsätzlich recht. Bedeutet aber auch, dass es wieder von FHEM ausgehen muss. Ich kenne den Code dahinter nicht, aber die Erfahrung hat gezeigt, dass div. Module gerne die Eigenheit haben, schnell einmal in FHEM einen unschönen Delay zu "erzeugen" - vorallem wenn Netzwerk/Internet ins Spiel kommt.
Deswegen habe ich mich für ein Push anstelle von einem Pull an der Stelle entschieden. ;-)
Greetz,
   Mr. P

Markus Bloch

PRESENCE führt alle Prüfungen non-blocking aus. Du kannst in deiner eigenen Funktion oder Shellskript das Timing also vernachlässigen. Nach 90 Sekunden wird allerdings hart abgebrochen.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Gizmoh

Hat das evtl jemand schon eingebunden oder mal als Function in presence umgesetzt?

Danke :-)

timtom

Hallo zusammen,

vor Kurzem habe ich mich doch dazu entschieden FHEM zu nutzen und habe die letzten Wochen mehr Zeit im Forum und Wiki verbracht, also sonst wo ;) Damit möchte ich auch noch einmal allen aktiven Helfern hier im Forum danken.

Die Pflicht (überwiegend HM Thermostate) läuft schon mal bei mir. Jetzt geht es an die "Kür". Zunächst möchte ich den Ablauf gerne über einen Zentralen "Home Status" verbessern. Da ich zunächst auf einen Hardwarebutton verzichten möchte, möchte ich mich hier an den Thread anhängen.

Wie bereits erwähnt, wurde der Zugriff über PRESENCE an den openWRT Router angesprochen (1). Alternativ habe ich überlegt, bestimmten Geräten in OpenWRT eine feste IP zuzuweisen und dann PRESENCE-Abfrage über lan-ping durchzuführen (2).
Auch wenn mir zu (1) leider die Kenntnisse fehlen, was wären den die Vor- bzw. Nachteile der beiden Möglichkeiten? Gibt es für (1) irgendwo ein Beispiel?

Danke schon mal
der Tim

Mr. P

Hej Tim,

also im grossen und ganzen würde ich sagen: es ist Geschmackssache.
Ich persönlich hab damals auf OpenWRT gesetzt, weil es flexibler war und ich nicht alles direkt in FHEM machen wollte. Außerdem kann man die Werte aus OpenWRT auch im PRESENCE-Modul eintragen.
Solltest du dich für die OpenWRT-Variante entscheiden, kann ich dir die notwendigen Scripte und entsprechende Hilfestellung gerne zukommen lassen bzw. bin auch für entsprechende Wünsche und Erweiterungen zu haben. ;-)
Greetz,
   Mr. P

timtom

Hey P.

da doch die Feste-IP-Ping-Variante von vielen Leuten genutzt wird und ich möchglichst wenige Baustellen aufmachen möchte, probier ich das erst einmal aus. Ich hoffe nur, dass die Handys nicht durch jeden Ping aus dem Deep Sleep aufgeweckt werden. Daher wäre es cool, wenn du mir auch deine Infos zur OpenWRT Variante schicken könntest.

der Tim

sf.fhem

#9
Hallo,

zur Vollständigkeit eine kompakter Guide für die Einrichtung vom OpenWRT und dem Script "wifi_clients.py".

OpenWRT

1.) Pakete installieren


# opkg update
(..)
# opkg install luci-mod-rpc rpcd-mod-file
(..)
#


2.) den User "fhem" für den 'rpcd' einrichten

/etc/config/rpcd:

[..]
config login
option username 'fhem'
        #
        # '$p$<username> => reference to user passowrd on /etc/shadow
        # '$1$<hash>' => crypt() hash, using SHA1. generate via 'uhttpd -m fhem'
        #
        # password: fhem
        #
option password '$1$$xEODf2fNSQ0ArfkJu4L2i1'
list read 'fhem_acl'
list write ''



3.) ACL für den User "fhem" definieren

/usr/share/rpcd/acl.d/fhem.json:

{
        "fhem_acl": {
                "description": "Super user access role",
                "read": {
                        "ubus": {
                                "hostapd.wlan0": [ "get_clients" ],
                                "hostapd.wlan1": [ "get_clients" ]
                        }
                }
        }
}


4.) 'rpcd' config übernehmen


# uci commit rpcd



5.) 'wifi_clients.py' => https://github.com/janLo/OpenWRT-Wifi-Clients-POC

Das Script benötigt "python2" und muss noch angepasst werden.


--- wifi_clients.py.orig 2018-06-28 23:23:40.216987147 +0200
+++ wifi_clients.py 2018-06-28 23:25:12.857047734 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2

import urllib2
import json
@@ -36,7 +36,7 @@
             response = json.load(stream)

         if not response or "error" in response:
-            raise str(response)
+            raise Exception(str(response))

         return response["result"][1]


Das Script ausführen..


$ python2 wifi_clients.py 192.168.1.71 fhem fhem wlan0 wlan1
c8:f6:50:e1:a9:10, 2c:f0:a2:e2:c0:15, 8c:a9:82:f1:9c:2a, 7c:c3:a1:b8:d2:1e, 64:9a:be:6a:6c:13, 00:1d:63:a3:8f:4a
$