Unterstützung von Busch-free@home von Busch-Jaeger

Begonnen von mk007, 23 Oktober 2015, 15:07:29

Vorheriges Thema - Nächstes Thema

mk007

Hallo liebes FHEM-Forum,

unterstützt FHEM auch das Busch-free@home-System von Busch-Jaeger. Oder gibt es Pläne das System zukünftig zu unterstützen?

Vielen Dank für Eure Antworten.

zernima

Hallo,
dafür würde ich mich auch sehr interessieren.
Gibt es irgendwelche Ansätze wo man ansetzen kann.
Das Webinterface scheint mit Javascript zu laufen. Gibt´s da irgendwelche Möglichkeiten? Wäre sehr gern bereit bei der Entwicklung zu helfen. :)

Das System wäre so nämlich schon super. Mit FHEM wäre es der absolute Bringer und richtig genial.

Gruß Zernima

opium07

Hallo,

Ich würde mich ebenfalls dafür interessieren ein schon vorhandenes Busch Jäger free@home System samt SystemAccesPoint in FHEM zu integrieren, damit das zu Hause dann auch wirklich ein SmartHome ist.

Bis jetzt habe ich herausgefunden, dass free@home auf einen XMPP Server basiert. Weiterhin kann man sich auch mit einem XMPP Client einloggen und eine XML Datei mit dem Befehlssatz senden (Bsp: Licht an/aus).
Jetzt habe ich gesehen, dass FHEM auch XMPP unterstützt und da stellt sich mir die Frage ob man das nicht irgendwie nutzen kann, um auch das Busch-Jäger System in FHEM zu integrieren.
Weiterhin habe ich auf dieser Seite https://gathering.tweakers.net/forum/list_messages/1645760) ein Python Script gefunden, welches zum einloggen und schalten der Lampen genutzt werden kann.

Leider bin ich, was FHEM und Perl betrifft auch noch ein Anfänger und arbeite mich gerade erst ein wenig ein.

Bei der Entwicklung einer Lösung für das Problem würde ich gerne helfen.

Gruß Opium07

BlauesLicht

Würde mich auch sehr interessieren :)
Habe hier auch ein fast komplettes free@home System und würde es gerne mit FHEM verbinden.
Helfe gerne mit :)

opium07

Es freut mich, dass auch noch andere ihr Busch-Jäger free@home System in FHEM integrieren wollen.

In meinem vorigen Post hatte ich schon erwähnt, dass die Kommunikation mit dem free@home SystemAccessPoint auf XMPP basiert und entsprechenden einen Quelllink in ein Niederländisches Forum angefügt.
Auch wenn ich dem Niederländischen nicht mächtig bin, aber Google-Translate sei Dank ::), habe ich mich mal ein wenig durch den Forenbeitrag gearbeitet.
Folgende 2 Beiträge sind dabei wohl die wichtigsten (Mit Hilfe von Google-Translate frei übersetzt):


  • Um mit dem SystemAccessPoint (SysAP) zu kommunizieren wird von einer Web-Oberfläche oder der App eine XMPP über Bosh Sitzung erstellt und dann mittels XML-Daten kommuniziert.
    Außerdem ist eine Authentifzierung üner DIGEST-MD5 notwendig um auch wirklich mit dem SysAP zu kommunizieren.

  • Wie in 1. schon erwähnt kann man mit XMPP direkt mit dem SysAP über den Port 5222 sprechen. Mit Hilfe von Python und xmpppy konnte der niederländische Threadersteller eine Verbindung zum XMPP-Server herstellen. Allerdings hatte er dann wieder Problem mit der MD5 Authentifizierung. Der SysAP lieferte immer wieder die Fehlermeldung "Authentifizierung fehlgeschlagen".
    Also kam Plan B.
    Die Verwendung der Standard-Web-Obefläche mit XMPP über Bosch auf Port 5280. Dabei wird anscheinend die JavaScript Jabber-Client-Bibliothek verwendet (https://github.com/sstrigler/JSJaC/).
    In Chrome konnte dann der Code von jsjac.js so verändert werden, dass der Web-Client gezwungen wurde die PLAIN-Authentifizierung zu nutzen. Die Authentifizierungs-Zeichenfolge konnte dann mit Wireshark abgefangen werden.

Damit hat der Themenersteller schon Pionierarbeit geleistet und auch wohl dem schwierigsten Schritt in der ganzen Angelegenheit vollzogen. 
Mit Hilfe von folgendem PythonScript konnte dann eine Lampe wieder an und ausgeschaltet werden. Immerhin ein Anfangt worauf sich aufbauen lässt.

In dem Script sind nur IP, Kennwort und Hardware-Adresse der Lampe verborgen.

#!/usr/bin/python
import requests
import time
import xml.etree.ElementTree as ET

ip='IP_ADRES_VAN_HET_SYSTEM_ACCESS_POINT'
authstring="ONDERSCHEPTE_AUTHENTICATION_STRING"

def send(msg,url,command):
    print "{}\n".format(msg)
    print "command  >>> {}".format(command)
    response=requests.post(url, data=command)
    print "response <<< {}".format(response.text)
    return response.text

rid=777095
newkey="a12cf8bedec7947d8cb2355d12f397d1991abfa5"

# send hello
hello="<body content='text/xml; charset=utf-8' hold='1' xmlns='http://jabber.org/protocol/httpbind' to='busch-jaeger.de' wait='300' rid='{}' newkey='{}' xml:lang='en' ver='1.10' xmlns:xmpp='urn:xmpp:xbosh' xmpp:version='1.0'/>".format(rid,newkey)
url="http://{}:5280/http-bind".format(ip)
response=send("HELLO",url,hello)

# get authid/sid parameters from response
xml=ET.fromstring(response)
authid=xml.get('authid')
sid=xml.get('sid')

#authenticate
rid=rid+1
authentication="<body rid='{}' sid='{}' xmlns='http://jabber.org/protocol/httpbind' key='{}'><auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>{}</auth></body>".format(rid,sid,authid,authstring)
send("AUTHENTICATE",url,authentication)

#restart session
rid=rid+1
restart="""
<body rid='{}' sid='{}' xmlns='http://jabber.org/protocol/httpbind' key='{}' xml:lang='en' xmpp:restart='true' xmlns:xmpp='urn:xmpp:xbosh' to='busch-jaeger.de'/>""".format(rid,sid,authid)
send("RESTART",url,restart)

#bind
rid=rid+1
bind="""<body rid='{}' sid='{}' xmlns='http://jabber.org/protocol/httpbind' key='{}'><iq xmlns="jabber:client" type="set" id="bind_1"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>31cfab</resource></bind></iq></body>""".format(rid,sid,authid)
send("BIND",url,bind)

#turn light on
rid=rid+1
light_on="""
<body rid='{}' sid='{}' xmlns='http://jabber.org/protocol/httpbind' key='{}'><iq xmlns="jabber:client" to="mrha@busch-jaeger.de/rpc" type="set" id="1439217080270"><query xmlns="jabber:iq:rpc"><methodCall><methodName>RemoteInterface.setDatapoint</methodName><params><param><value><string>ABB700xxxxxx/ch0003/idp0000</string></value></param><param><value><string>1</string></value></param></params></methodCall></query></iq></body>
""".format(rid,sid,authid)
send("LIGHT ON",url,light_on)

#pause
time.sleep(2)

#turn light off
rid=rid+1
light_off="""
<body rid='{}' sid='{}' xmlns='http://jabber.org/protocol/httpbind' key='{}'><iq xmlns="jabber:client" to="mrha@busch-jaeger.de/rpc" type="set" id="1439217080270"><query xmlns="jabber:iq:rpc"><methodCall><methodName>RemoteInterface.setDatapoint</methodName><params><param><value><string>ABB700xxxxxx/ch0003/idp0000</string></value></param><param><value><string>0</string></value></param></params></methodCall></query></iq></body>
""".format(rid,sid,authid)
send("LIGHT OFF",url,light_off)


Ich hoffe damit ist schonmal ein erster Anfange geschaffen.
Ich würde mich über jede weitere Idee freuen.

Gruß Opium07