Homegear als Gateway zwischen KNX und Homematic (ohne openhab)

Hallo sathya,

hättest Du eine Idee, wie ich Homegear als reines Gateway zwischen KNX und Homematic benutzen könnte?
Die Logik ist bei mir über KNX abgebildet (Stichwort: EDOMI).

Ich fänd’s nun cool, wenn jeder HM-Datenpunkt z.B. einfach eine KNX Gruppenadresse darstellen würde.
Könnte man dazu etwas für die XML RPC Schnittstelle bauen, das das Ganze automatisiert?
Indem ich zum Beispiel den ersten Teil der Gruppenadresse angebe und für jeden gefunden HM-Datenpunkt eine KNX Gruppenadresse erzeugt wird.
Die könnte man sammeln und dann als Liste exportieren, um sie in der ETS wieder zu importieren für die “Homematic”-Linie.

Ich bin mit der Homegear-Skripterei noch nicht vertraut und möchte zunächst gerne wissen, ob die Architektur von Homegear so etwas überhaupt zulässt.

In der Doku habe ich gelesen, dass ich eine .knxproj Datei einlesen lassen kann, die dann die KNX Geräte bzw. Gruppenadressen erzeugt.
Könnte man den Weg auch anders herum gehen? Also wie oben beschrieben, nur mit Homematic-Geräten eine Liste von Gruppenadressen pro HM-Datenpunkt erzeugen lassen, die ich dann in die ETS wieder importieren kann.

Hallo nanosonde,

zunächst einmal ist es nicht das Ziel KNX-Moduls, Geräte in der KNX-Welt verfügbar zu machen, sondern die KNX-Welt in Homegear. Aber wir können ja mal etwas rumspinnen. Trennen wir einmal Sensorik und Aktorik. Für die Sensorik könntest du in ETS Gruppenadressen anlegen, welchen du KNX-Aktoren zuweisen könntest. Dann kannst du über eine einfache Logik in Homegear einen eingehenden HomeMatic-Sensorwert auf diese Gruppenadresse schreiben. Für die HomeMatic-Aktorik kannst du ebenfalls in ETS Gruppenadressen anlegen, welchen du KNX-Sensoren zuweist. Die Eingehenden Sensordaten kannst du dann ebenfalls über eine einfache Logik in Homegear verarbeiten und an einen HomeMatic-Aktor weitergeben. Ich denke also, dass dein Vorhaben prinzipiell möglich ist. Das 1-zu-1 Mapping müsste manuell erfolgen und kostet ein bisschen Zeit, sollte aber auch nicht viel aufwändiger sein, als die ETS-Konfiguration.

Viele Grüße

Sathya

Danke für die Antwort.

Mir ist noch nicht so ganz klar, wie ich dann quasi die Gruppenadressen in Homegear verfügbar mache, ohne die .knxproj-Datei einzulesen.
Muss ich da mit virtuellen Geräten arbeiten oder wie erzeuge ich die?

Hättest Du mal einen Skript-Schnipsel, der z.B. von einem Homematic-Temperatursensor auf eine KNX Gruppenadresse schreibt?

Hi nanosonde,

um die .knxproj-Datei kommst du nicht herum. Das wäre zwar nicht unmöglich aber zu kompliziert. Du legst in ETS einfach Gruppenadressen an, in welche du dann über Homegear schreiben kannst. Dann musst du irgendwie auf Ereignisse von KNX-Gruppenadressen und HomeMatic-Geräten reagieren. Da Homegear noch keine wirkliche Logikschicht besitzt (wir arbeiten daran), geht das aktuell entweder über Ereignisse oder Skripte. Letzteres ist in diesem Fall zunächst etwas komplizierter aber vermutlich die schönere Lösung. Und zwar würde ich das Ganze tatsächlich über ein virtuelles Gerät realisieren. Alternativ kannst du auch Logiksoftware wie zum Beispiel Node-RED verwenden.

Anbei findest du den Codeschnipsel für das virtuelle Gerät. Einfach nach “/etc/homegear/devices/254” kopieren, die peer IDs anpassen und in der Familie “Miscellaneous” ein neues Gerät im CLI mittels “peers create” anlegen.

Viele Grüße

Sathya

Der Anhang: KNX_Proxy.xml (2.1 KB)

Danke für die Info und die XML-Datei.

Wo finde ich denn Infos darüber, was ich in einer XML-Datei so alles anstellen kann?
Zum Beispiel die Zeile im enthaltenen Skript: $peerId = (integer)$argv[0];

Welche Argumente werden denn noch bei einem “peers create” übergeben?

Ich antworte mir mal selbst:

UPDATE:
https://github.com/Homegear/Homegear/blob/master/homegear-miscellaneous/misc/Device%20Description%20Files/Template.xml

An das Skript wird nur die Peer-ID des eigenen Gerätes übergeben. Das wars.

Welche Parameter “peers create” benötigt, hängt von der Gerätefamilie ab. Für die Miscellaneous-Familie sieht der Aufruf so aus:

peers add DEVICETYPE SERIALNUMBER

“DEVICETYPE” wird in der XML-Datei definiert. Darüber erfolgt die Auswahl der korrekten XML-Datei. “SERIALNUMBER” kannst du dir selbst wählen. Diese muss nur einzigartig sein.

Das Schema hast du ja schon gefunden ;-). Stell gerne Fragen zu den einzelnen Elementen. Diese sind aktuell noch schlecht dokumentiert.

Viele Grüße

Sathya

Hi Sathya,

wie in einem anderen Thread schon beschrieben, möchte ich in Homegear KNX-Gruppenadressen und Homematic-Geräte miteinander verbinden.
Ich wollte dazu die Hinweise aus diesem Thread hier verwenden, scheitere aber schon relativ früh, bei der peers create in der family 254:

Meint peers add aus dem Zitat oben peers create?
In der XML-Date KNX_Proxy.xml finde ich keinen DEVICETYPE-Tag, nur device ID oder type number.

Wie/wo muss ich den DEVICETYPE in der Datei eintragen, den ich auch im peers create verwende?

Wie lautet das korrekte Kommando? Laut Hilfe
The 2 byte device type of the peer to add in hexadecimal format. Example: 0192

Hexadezimal wäre für mich ein Ausdruck in der Form 0xc0- was kommt in die Kommandozeile?

Welche Bedeutung hat das DEVICETYPE-Element? Was wähle ich damit aus?

Und für die spätere Zuordnung von KNX-GAs und Homematic-Datenpunkten: Wie sieht das Mapping genau aus, brauche ich für jedes MApping eine XML-Datei, oder kann ich alle in eine reinschreiben? Uder brauchts für jede Kommunikationsrichtung eine DAtei?

Sorry, aber bisher seh ich den Wald vr lauter Bäumen nicht.

Grüße,
Gunnar

Hallo @junibart,

Ja.

Damit ist typeNumber gemeint. Der Aufruf im CLI sieht also wie folgt aus (ich hoffe, das stimmt - ist gerade aus dem Kopf):

peers create 0x9000 KNXPROXY01

Darüber wird die korrekte XML-Datei ermittelt. In diesem Fall möchtest du, dass die KNX_Proxy.xml genommen wird.

Nein.

Ja. Für die Übersicht kannst du aber auch mehrere Dateien anlegen.

Nein. Beide Richtungen können über die gleiche Datei realisiert werden. Theoretisch kannst du in der Datei auch mehrere Threads anlegen (siehe https://github.com/Homegear/Homegear-OpenWeatherMap/blob/master/OpenWeatherMap.xml). Das ist an dieser Stelle aber aus meiner Sicht nicht notwendig. Das Mapping sieht so aus: Beide Seiten (KNX-Gruppenvariable und HomeMatic-Gerät) generieren Ergeignisse bei Variablenänderungen. Diese werden mit $hg->pollEvent() abgefangen und können dann an ein anderes Gerät mit Hilfe von setValue() weitergeleitet werden. Damit pollEvent() Ereignisse von einem Peer erhält, müssen diese zunächst mit $hg->subscribePeer(PEER_ID); abonniert werden. Eine Beschreibung der Methoden findest du auf https://ref.homegear.eu (neue, aktuelle, aber noch nicht ganz vollständige Referenz) und https://www.homegear.eu/index.php/XML_RPC_Method_Reference.

Viele Grüße

Sathya

Hallo Sathya,

besten Dank für Deine Infos- das Einrichten des virtuellen Gerätes klappt nun.

Leider ist nun in dem Script, das in der XML-Datei steckt, noch der Wurm drin- auch die unveränderte Datei KNX_Proxy.xml aus diesem Thread führt zu einem Fehler:

   01/07/17 21:49:32.628 Script Engine (3884): Info: Server is calling RPC method: executeScript
01/07/17 21:49:32.653 Info: Starting PHP script of peer 85.
01/07/17 21:49:32.657 Scriptengine (/etc/homegear/devices/254/KNX_Proxy.xml): PHP Parse error:  syntax error, unexpected '}' in /etc/homegear/devices/254/KNX_Proxy.xml on line 21
01/07/17 21:49:32.671 Info: PHP script of peer 85 exited with code 255.

Nun, ich kann kein PHP… schwierig. Vor allem, weil in Zeile 21 kein ‘}’ steht…

Falls Du eine Idee hast, würde es mich freuen.

Grüße,
Gunnar

Hinter

$hg->setValue(15, 1, "VALUE", $result["VALUE"])

fehlt ein ; - Dadurch ist das } “unexpected” :slight_smile:
Ist natürlich jetzt untested…

Damit die Zeilennummern stimmen, musst du alles innerhalb des CDATA's in eine neue Datei kopieren. PHP bekommt ja nur das in die Finger und zählt entsprechend die Zeilen durch.

so long,
p

Hallo, danke für den Tipp… damit komme ich weiter, aber nur ein kleines Stück Der nächste Fehler lauert schon…

01/08/17 15:19:44.530 Scriptengine (/etc/homegear/devices/254/KNX_Proxy.xml): PHP Fatal error:  Uncaught Error: Using $this when not in object context in /etc/homegear/devices/254/KNX_Proxy.xml:6
Stack trace:
#0 {main}
  thrown in /etc/homegear/devices/254/KNX_Proxy.xml on line 6

Ich weiss nur nicht, ob das für mich einen Sinn hat, hier weiterzumachen. Meine Programmiererfahrung ist äußerst beschränkt… und ich will Euch hier auch nicht zu sehr auf die Nerven fallen…

Aber vielleicht versuchen wir nochmal, diesen Fehler zu beheben.

Hat jemand Tipps?

Grüße,
Gunnar

Hallo @Gunnar,

das kommt davon, wenn man ein Skript schnell zusammenkopiert. Da habe ich einen Fehler eingebaut. Statt

$hg->subscribePeer($this->sharedData->peerId);

muss es heißen

$hg->subscribePeer($peerId);

Viele Grüße

Sathya

Nachtrag: Das gleiche gilt für Zeile 12. Statt

while(!$hg->shuttingDown() && $hg->peerExists($this->sharedData->peerId))

muss die Zeile so aussehen:

while(!$hg->shuttingDown() && $hg->peerExists($peerId))

Nachtrag 2: Hier die korrigierte Datei: KNX_Proxy.xml (2.1 KB)

Nachtrag 3: Noch ein kleiner Hinweis: Nach Änderungen an der Datei reicht folgender Aufruf, um diese zu laden:

homegear -e mrl mod_miscellaneous.so

Damit wird das Miscellaneous-Modul neu geladen.

Hey, Ihr seid Klasse!

Mit der neuen Version der KNX_Proxy.xml klappt es (auch wenn da das Semikolon wieder fehlt :wink:
Besten Dank! Dann werde ich mir mal alle Verbindungen zwischen KNX und homematic einrichten, wie ich sie brauche.

Ein kleiner Fehler ist mir noch aufgefallen… im Logging wird allen Variablen eines Ereignisses derselbe Wert zugewiesen, in diesem Fall 0x11.

01/08/17 18:24:05.150 HomeMatic BidCoS packet received (My-CUL, RSSI: -70 dBm): 0B49A6404BCB09FD03220111
01/08/17 18:24:05.161 Module HomeMatic BidCoS: Info: INSTALL_TEST on channel 1 of HomeMatic BidCoS peer 80 with serial number NEQ0752993 was set to 0x11.
01/08/17 18:24:05.162 Module HomeMatic BidCoS: Info: PRESS_SHORT on channel 1 of HomeMatic BidCoS peer 80 with serial number NEQ0752993 was set to 0x11.
01/08/17 18:24:05.163 Module HomeMatic BidCoS: Info: TEST_COUNTER on channel 1 of HomeMatic BidCoS peer 80 with serial number NEQ0752993 was set to 0x11.
01/08/17 18:24:05.163 Module HomeMatic BidCoS: Info: SIM_COUNTER on channel 1 of HomeMatic BidCoS peer 80 with serial number NEQ0752993 was set to 0x11.

Tatsächlich müsste sie bei INSTALL_TEST und PRESS_SHORT True lauten:

<__main__.MyFuncs instance at 0xb674bd28>
test
NEQ0752993:0
RSSI_DEVICE
-70
192.168.122.37 - - [08/Jan/2017 18:24:05] "POST /RPC2 HTTP/1.1" 200 -
<__main__.MyFuncs instance at 0xb674bd28>
test
NEQ0752993:1
INSTALL_TEST
True
<__main__.MyFuncs instance at 0xb674bd28>
test
NEQ0752993:1
PRESS_SHORT
True
<__main__.MyFuncs instance at 0xb674bd28>
test
NEQ0752993:1
TEST_COUNTER
17
<__main__.MyFuncs instance at 0xb674bd28>
test
NEQ0752993:1
SIM_COUNTER
17

Scheint sich aber nur aufs Logging auszuwirken.

Danke nochmls, beste Grüße

Gunnar

Hallo @junibart,

klasse, dass es jetzt klappt!

Im Log sind die Rohwerte aufgeführt, welche im Paket kodiert sind. Diese haben nicht unbedingt etwas mit den logischen Werten zu tun. In diesem Fall kommen die Daten für alle 4 Variablen aus dem gleichen Byte - daher die gleiche Zahl -, welches für PRESS_SHORT und INSTALL_TEST in true umgewandelt wird.

Viele Grüße

Sathya

Hallo zusammen,

ich habe hier mal ein paar PHP-Skripte gebaut, die ein HM-KNX Gateway mit HG ermöglichen.
Siehe Anhang.
Die drei PHP-Files nach /var/lib/homegear/scripts kopieren.
Das XML-File nach/etc/homegear/devices/254 kopieren.

Die Idee dahinter ist, dass zuerst alle HM(IP)-Geräte an HG angelernt werden.
(Ich nutze aktuell nur das HG-CCU2-Modul wegen HMIP. Die anderen Gerätefamilien BidCos und Wired sind nicht implementiert. Also HM-Geräte, die direkt an HG angelernt sind. Es sollte aber einfach sein, diese noch einzubinden, wenn der Code an ein paar wenigen Stellen um diese Familien erweitert wird.)

Danach wird das Skript “genGaXmlImportFile.php” aus HG heraus gestartet.
Es generiert ein XML-File mit Gruppenaddressen, die für jedes HM(IP)-Gerät angelegt wurden.
Dieses File sollte nun in der ETS5 importiert werden. Es enthält auch die speziellen JSON-Strings in den Beschreibungsfeldern der Gruppenadresse.

Nun die Gruppenadresse in der ETS wie gewünscht verarbeiten.

Danach dann das ETS-Projekt (*.knxproj) exportieren und wieder in Homegear einlesen lassen, um die entsprechenden KNX-Peers erzeugen zu lassen.

Nun noch das virtuelle Device Skript “HM-KNX_Gateway.xml” instanziieren und schon läuft im Hintergrund die automatische Vermittlung von HM(IP)-Events zu KNX-Aktionen und umgekehrt.

fs 254
peers create 0x9001 HMKNXGW001

Das Skript “setDeviceNamesFromCcu.php” dient dazu, VOR dem Generieren der Gruppenadressen (mit Hilfe des Skripts “genGaXmlImportFile.php”) die Namen der Peers automatisch anhand der in der CCU2 vergebenen Namen setzen zu lassen.

Viel Spass damit!

PS: Das ist ein erster Schuss, der bei mir schon sehr lange lief. Das Error-Handling ist noch verbesserungsbedürftig hinsichtlich des Löschen von Peers zum Beispiel während das virtuelle Device-Skript läuft.

PPS: Achja, für Edomi wird auch noch passend ein ESF-File erzeugt, so dass die Gruppenadressen auch sofort in Edomi zur Verfügung stehen. :wink:

HM-KNX-GW.zip (7.6 KB)

2 Likes