Internorm Jalousien über http-Binding
-
- Beiträge: 49
- Registriert: 17. Jul 2022 23:34
Re: Internorm Jalousien über http-Binding
Moin Udo,
hättest du denn dazu Lust und Zeit?
hättest du denn dazu Lust und Zeit?
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Internorm Jalousien über http-Binding
Also, der JSON Ausschnitt von oben (Mediola Konfig) lässt mich vermuten, dass es sich um 9 Rollläden bzw. Jalousien handelt. Korrekt?
Ich gehe von folgenden Voraussetzungen aus:
Die Rule triggert, wenn eines der Items in der Gruppe gMediola einen Befehl empfängt. Das geschieht gewöhnlich, wenn man in der UI hoch/runter/stop oder eine Position auswählt. Genauso könnte man aber auch gezielt in einer anderen Rule ein Kommando an ein (oder mehrere) Item(s) senden.
Die Variable strData wird als leerer String initialisiert. Die lokale Konstante strAdr wird mit der Adresse aus dem Namen des Items befüllt, welches die Rule ausgelöst hat.
Die lokale Variable strCommand wird als leerer String initialisiert.
Abhängig vom empfangenen Befehl wird einer von 103 konkreten Werten in strCommand gespeichert.
Aus strAdr und strCommand wird ein konkretes Data-Paket geschnürt.
Zur Information werden die ermittelten Daten in das log geschrieben.
Die Daten werden über das Item mediolaOut an den Channel gesendet, der den Weg zum Gateway darstellt.
Ehrlich gesagt dachte ich zunächst, es sei viel komplizierter...
Nun die Empfangsrichtung:
Ebenfalls erschreckend einfach.
Die Rule triggert jedes Mal, wenn das Item mediolaIn seinen Status ändert (dies geschieht, wenn das http Binding den Channel für den Empfang abfragt und sich eine Position geändert hat.)
Anschließend durchläuft die Rule die Gruppe gMediola und liest anhand der aktuellen Adresse die einzelnen Status jedes Rollladens aus. Nachdem es den Wert in einen Dezimalwert umgerechnet hat, vergleicht es den mit dem aktuellen Status. Weichen die beiden Werte voneinander ab, so schreibt es den neuen Wert per postUpdate ins entsprechende Item.
So, diese beiden Rules sind aber nur graue Theorie
Für einen ersten Test empfehle ich, in Rule 1 die Zeile mediolaOut.sendcommand(...) auszukommentieren, in Rule 2 das i.postUpdate(...).
Schau, was das log meldet, wenn Du einen Befehl an einen Rollladen schickst, ebenso, was (zyklisch empfangen, aber nur bei einer Änderung auch mit Auswirkungen in openHAB) vom Gateway in openHAB ankommt.
Falls es wider Erwarten auf Anhieb super gut aussieht (also ein passender Data-String generiert wird und eine Liste aller aktuellen Status der Rollläden ausgegeben wird), kannst Du testweise die beiden auskommentierten Zeilen einschalten und schauen, ob die Steuerung auch tatsächlich funktioniert.
Falls es zu Problemen in der Kommunikation kommt, brauche ich mindestens einmal einen "echten" Status von mediolaIn und evtl. ausgegebene Fehlermeldungen bezüglich der Rules.
(Den Status findest Du im events.log, mediolaIn changed from ... to ..., die Beschreibung des JSON ist in der Dokumentation nicht ganz eindeutig.
Ich gehe von folgenden Voraussetzungen aus:
- Eg gibt für jede Jalousie/Rollladen ein Rollershutter Item
- Die Items folgen alle einem Namensschema, welches so aussieht: Stockwerk_RaumUndArt_Adr, also z.B. EG_WohnRoll_01 (kann natürlich auch anders aussehen, wichtig ist aber, dass die Adresse als Hex-Wert abgegrenzt an einer festen Stelle steht, hier nach dem zweiten Unterstrich)
- All diese Items befinden sich in einer Gruppe gMediola. Die Gruppe ist nicht weiter spezifiziert, es ist KEINE Rollershutter Group
- Ein String Item mediolaIn, verknüpft mit dem In-Channel (also Empfangsrichtung, nach openHAB hinein)
- Ein String Item mediolaOut, verknüpft mit dem Out-Channel (also Senderichtung, nach Mediola Gateway)
Code: Alles auswählen
Rule "Sende Befehl an Internorm Rollläden"
when
Member of gMediola received command
then
var strData = ""
val strAdr = triggeringItem.name.split("_").get(2)
var strCommand = ""
switch(receivedCommand) {
case UP : strCommand = "000C"
case DOWN: strCommand = "000D"
case STOP: strCommand = "0007"
default : strCommand = "18"+Long.toHexString((receivedCommand as Number).intValue)
}
strData = strAdr + strCommand
logInfo("mediola","Sende Befehl {} an Adresse {}",strCommand,strAdr)
mediolaOut.sendCommand(strData)
end
Die Variable strData wird als leerer String initialisiert. Die lokale Konstante strAdr wird mit der Adresse aus dem Namen des Items befüllt, welches die Rule ausgelöst hat.
Die lokale Variable strCommand wird als leerer String initialisiert.
Abhängig vom empfangenen Befehl wird einer von 103 konkreten Werten in strCommand gespeichert.
Aus strAdr und strCommand wird ein konkretes Data-Paket geschnürt.
Zur Information werden die ermittelten Daten in das log geschrieben.
Die Daten werden über das Item mediolaOut an den Channel gesendet, der den Weg zum Gateway darstellt.
Ehrlich gesagt dachte ich zunächst, es sei viel komplizierter...
Nun die Empfangsrichtung:
Code: Alles auswählen
rule "Empfange Position von Internorm Rollläden"
when
Item mediolaIn changed
then
val strJSON = mediolaIn.state.toString
gMediola.members.forEach[i|
val strAdr = i.name.split("_").get(2)
val strHEXpos = transform("JSONPATH","$[?(@.adr=='"+strAdr+"')].state",strJSON).subStr(4,2)
val pos = Integer.parseInt(strHEXpos, 16)
logInfo("mediola","In - Item {} - Status {} - gemeldet: {}",i.name,i.state,pos)
if((i.state as Number).intValue != pos) {
i.postUpdate(pos)
}
]
end
Die Rule triggert jedes Mal, wenn das Item mediolaIn seinen Status ändert (dies geschieht, wenn das http Binding den Channel für den Empfang abfragt und sich eine Position geändert hat.)
Anschließend durchläuft die Rule die Gruppe gMediola und liest anhand der aktuellen Adresse die einzelnen Status jedes Rollladens aus. Nachdem es den Wert in einen Dezimalwert umgerechnet hat, vergleicht es den mit dem aktuellen Status. Weichen die beiden Werte voneinander ab, so schreibt es den neuen Wert per postUpdate ins entsprechende Item.
So, diese beiden Rules sind aber nur graue Theorie

Für einen ersten Test empfehle ich, in Rule 1 die Zeile mediolaOut.sendcommand(...) auszukommentieren, in Rule 2 das i.postUpdate(...).
Schau, was das log meldet, wenn Du einen Befehl an einen Rollladen schickst, ebenso, was (zyklisch empfangen, aber nur bei einer Änderung auch mit Auswirkungen in openHAB) vom Gateway in openHAB ankommt.
Falls es wider Erwarten auf Anhieb super gut aussieht (also ein passender Data-String generiert wird und eine Liste aller aktuellen Status der Rollläden ausgegeben wird), kannst Du testweise die beiden auskommentierten Zeilen einschalten und schauen, ob die Steuerung auch tatsächlich funktioniert.
Falls es zu Problemen in der Kommunikation kommt, brauche ich mindestens einmal einen "echten" Status von mediolaIn und evtl. ausgegebene Fehlermeldungen bezüglich der Rules.

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 49
- Registriert: 17. Jul 2022 23:34
Re: Internorm Jalousien über http-Binding
perfekt! wird nachher ausprobiert! Feedback folgt. Danke Udo
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Internorm Jalousien über http-Binding
Immer gerne 

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 49
- Registriert: 17. Jul 2022 23:34
Re: Internorm Jalousien über http-Binding
Ok, dann habe ich gleich mal die beiden GW definiert und die items..
slso
ebenso die rules natürlich angepasst..
nun brauche ich doch aber noch items die die kommandos auf-stop-ab annehmen bzw. anklickbar sind..oder wie kriege ich das dann in die sidemap?
Oder sind das die in gMeiola1 etc. definierten items nur muss ich sie anders darstellen/definieren?
slso
Code: Alles auswählen
gMediola1
Rollershutter P2_RL9_09 (gMediola1)
Rollershutter P2_RL10_010 (gMediola1)
Rollershutter P2_RL11_011 (gMediola1)
String mediolaIn2 (gMediola1) {channel=“http:url:mediola:ch1in1”}
String mediolaOut2(gMediola1) {channel=“http:url:mediola:ch1out1”}
nun brauche ich doch aber noch items die die kommandos auf-stop-ab annehmen bzw. anklickbar sind..oder wie kriege ich das dann in die sidemap?
Oder sind das die in gMeiola1 etc. definierten items nur muss ich sie anders darstellen/definieren?
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Internorm Jalousien über http-Binding
Nein, die Adressen stimmen nicht, die sind zweistellig, 00 bis FF. Die im Namen angegebene Adresse muss exakt der Form entsprechen, wie sie in der Rule verwendet wird (sonst wird die Rule unnötigerweise komplizierter).
Du brauchst keine weiteren Items, das sind ja schon die drei Rollershutter Items. Diese packst Du in die Sitemap (Site -> Grundstück, Standort, das hat nichts mit Side zu tun)
Wichtig auch: Die In- und Out-Items dürfen keinesfalls in der Gruppe gMediola1 sein, die ist exklusiv für die Rollershutter Items. Die Gruppe wird ja durchlaufen, um postUpdates oder sendCommands auf ihre Member zu erzeugen, da gibt es mit den inkompatiblen Items heftiges Durcheinander.
Ich habe natürlich das zweite Gateway vergessen... bekommen wir aber auch noch gelöst (macht die Rules allerdings etwas komplizierter, weil sie ja auch noch das Gateway berücksichtigen muss. Natürlich kannst Du die Rules auch doppelt anlegen (Achtung - die Namen aller Rules müssen eindeutig sein) und auch das Group Item doppelt anlegen (wie Du es schon oben angedeutet hast).
Ganz wichtig: Die Rules in der Form, in der ich sie hier gepostet habe, müssen über ein (oder auch mehrere) rules-File angelegt werden.
Alternativ kannst Du die Rules auch über die UI anlegen, dann musst Du den Trigger jeweils passend zum Ausdruck zwischen when und then wählen, also für die eine Rule When Item gMediola1 had a member receive a command und für die andere When Item mediolaIn1 changed.
Der Rules Code steht zwischen then und end, diese beiden Schlüsselworte sind nicht Bestandteil des Codes. In der UI wählst Du als Action Run Script aus und dort Rule DSL.
Du brauchst keine weiteren Items, das sind ja schon die drei Rollershutter Items. Diese packst Du in die Sitemap (Site -> Grundstück, Standort, das hat nichts mit Side zu tun)
Wichtig auch: Die In- und Out-Items dürfen keinesfalls in der Gruppe gMediola1 sein, die ist exklusiv für die Rollershutter Items. Die Gruppe wird ja durchlaufen, um postUpdates oder sendCommands auf ihre Member zu erzeugen, da gibt es mit den inkompatiblen Items heftiges Durcheinander.
Ich habe natürlich das zweite Gateway vergessen... bekommen wir aber auch noch gelöst (macht die Rules allerdings etwas komplizierter, weil sie ja auch noch das Gateway berücksichtigen muss. Natürlich kannst Du die Rules auch doppelt anlegen (Achtung - die Namen aller Rules müssen eindeutig sein) und auch das Group Item doppelt anlegen (wie Du es schon oben angedeutet hast).
Ganz wichtig: Die Rules in der Form, in der ich sie hier gepostet habe, müssen über ein (oder auch mehrere) rules-File angelegt werden.
Alternativ kannst Du die Rules auch über die UI anlegen, dann musst Du den Trigger jeweils passend zum Ausdruck zwischen when und then wählen, also für die eine Rule When Item gMediola1 had a member receive a command und für die andere When Item mediolaIn1 changed.
Der Rules Code steht zwischen then und end, diese beiden Schlüsselworte sind nicht Bestandteil des Codes. In der UI wählst Du als Action Run Script aus und dort Rule DSL.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 49
- Registriert: 17. Jul 2022 23:34
Re: Internorm Jalousien über http-Binding
So, alles drin, aber tuts noch nicht!
Things:
items:
rules:
Habe dann mal üner ui-widget probiert und auch über die items direkt in Einstellungen - da kann man ja auch die Buttons betätigen... passiertr leider nicht, ich bekomme diese Fehlermeldung im log:
der event-log:
Wo ist wieder mein Dulli-Fehler...
Things:
Code: Alles auswählen
Thing http:url:mediola1 "Mediola SC1" [
baseURL="http://192.168.0.5/command?XC_FNC=",
refresh=60,
timeout=5000
] {
Channels:
Type string : ch1out1 [
commandExtension="SendSC&type=IN&data="
]
Type string : ch1in1 [
stateExtension="GetStates"
]
}
Thing http:url:mediola2 "Mediola SC2" [
baseURL="http://192.168.0.6/command?XC_FNC=",
refresh=60,
timeout=5000
] {
Channels:
Type string : ch1out2 [
commandExtension="SendSC&type=IN&data="
]
Type string : ch1in2 [
stateExtension="GetStates"
]
}
Code: Alles auswählen
String mediolaIn1 {channel="http:url:mediola1:ch1in1"}
String mediolaOut1 {channel="http:url:mediola1:ch1out1"}
String mediolaIn2 {channel="http:url:mediola2:ch1in2"}
String mediolaOut2 {channel="http:url:mediola2:ch1out2"}
Group gMediola1
Rollershutter P4RL1_01 <rollershutter> (gMediola1)
Rollershutter P4RL2_02 <rollershutter> (gMediola1)
Rollershutter P4RL3_03 <rollershutter> (gMediola1)
Rollershutter P4RL4_04 <rollershutter> (gMediola1)
Rollershutter P4RL5_05 <rollershutter> (gMediola1)
Rollershutter P4RL8_08 <rollershutter> (gMediola1)
Rollershutter P4RL9_09 <rollershutter> (gMediola1)
Rollershutter P4RL10_10 <rollershutter> (gMediola1)
Rollershutter P4RL11_11 <rollershutter> (gMediola1)
Group gMediola2
Rollershutter P2RL9_09 (gMediola2)
Rollershutter P2RL10_10 (gMediola2)
Rollershutter P2RL11_11 (gMediola2)
Code: Alles auswählen
rule "Sende Befehl an Internorm Rollläden SC1"
when
Member of gMediola1 received command
then
var strData = ""
val strAdr = triggeringItem.name.split("_").get(2)
var strCommand = ""
switch(receivedCommand) {
case UP : strCommand = "000C"
case DOWN: strCommand = "000D"
case STOP: strCommand = "0007"
default : strCommand = "18"+Long.toHexString((receivedCommand as Number).intValue)
}
strData = strAdr + strCommand
logInfo("mediola","Sende Befehl {} an Adresse {}",strCommand,strAdr)
mediolaOut1.sendCommand(strData)
end
rule "Empfange Position von Internorm Rollläden SC1"
when
Item mediolaIn1 changed
then
val strJSON = mediolaIn1.state.toString
gMediola1.members.forEach[i|
val strAdr = i.name.split("_").get(2)
val strHEXpos = transform("JSONPATH","$[?(@.adr=='"+strAdr+"')].state",strJSON).subStr(4,2)
val pos = Integer.parseInt(strHEXpos, 16)
logInfo("mediola","In - Item {} - Status {} - gemeldet: {}",i.name,i.state,pos)
if((i.state as Number).intValue != pos) {
i.postUpdate(pos)
}
]
end
rule "Sende Befehl an Internorm Rollläden SC2"
when
Member of gMediola2 received command
then
var strData = ""
val strAdr = triggeringItem.name.split("_").get(2)
var strCommand = ""
switch(receivedCommand) {
case UP : strCommand = "000C"
case DOWN: strCommand = "000D"
case STOP: strCommand = "0007"
default : strCommand = "18"+Long.toHexString((receivedCommand as Number).intValue)
}
strData = strAdr + strCommand
logInfo("mediola","Sende Befehl {} an Adresse {}",strCommand,strAdr)
mediolaOut2.sendCommand(strData)
end
rule "Empfange Position von Internorm Rollläden SC2"
when
Item mediolaIn2 changed
then
val strJSON = mediolaIn2.state.toString
gMediola2.members.forEach[i|
val strAdr = i.name.split("_").get(2)
val strHEXpos = transform("JSONPATH","$[?(@.adr=='"+strAdr+"')].state",strJSON).subStr(4,2)
val pos = Integer.parseInt(strHEXpos, 16)
logInfo("mediola","In - Item {} - Status {} - gemeldet: {}",i.name,i.state,pos)
if((i.state as Number).intValue != pos) {
i.postUpdate(pos)
}
]
end
Code: Alles auswählen
2023-03-13 22:11:50.074 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'internorm-1' failed: Index 2 out of bounds for length 2 in internorm
Code: Alles auswählen
2023-03-13 22:12:00.753 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'P4RL5_05' received command UP
2023-03-13 22:12:00.758 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'P4RL5_05' changed from NULL to 0
2023-03-13 22:12:02.731 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'P4RL5_05' received command STOP
2023-03-13 22:12:03.511 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'P4RL5_05' received command DOWN
2023-03-13 22:12:03.513 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'P4RL5_05' changed from 0 to 100
2023-03-13 22:12:05.399 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'P4RL5_05' received command STOP
- udo1toni
- Beiträge: 15241
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Internorm Jalousien über http-Binding
Ja, da kommt ein großer Fehler von mir und ein kleiner Fehler von Dir zum Tragen 
Mein Fehler betrifft die Definition der Channel, genauer des Sende-Channels. hier fehlt ein Platzhalter in der URL Extension:
Das %2$s ist der Platzhalter für das gesendete Kommando, das könnte ja überall in der URL stehen...
Dein Fehler betrifft die Itemnamen. Ich hatte recht deutlich darauf hingewiesen, dass die Adresse nach dem 2. Unterstrich folgt. Wenn Du nun den Itemnamen mit nur einem Unterstrich gestaltest, gibt es keinen Teilstring nach dem 2. Unterstrich.
Ist aber kein Problem, Du musst lediglich überall, wo in den Rules ein get(2) steht, die 2 in eine 1 ändern, so dass dann get(1) da steht. Alternativ kannst Du natürlich die Items noch mal löschen und neu anlegen

Mein Fehler betrifft die Definition der Channel, genauer des Sende-Channels. hier fehlt ein Platzhalter in der URL Extension:
Code: Alles auswählen
Thing http:url:mediola "Mediola" [
baseURL="http://http://192.168.0.5/command?XC_FNC=",
refresh=60,
timeout=5000
] {
Channels:
Type string : ch1out [
commandExtension="SendSC&type=IN&data=%2$s"
]
Type string : ch1in [
stateExtension="GetStates"
]
}
Dein Fehler betrifft die Itemnamen. Ich hatte recht deutlich darauf hingewiesen, dass die Adresse nach dem 2. Unterstrich folgt. Wenn Du nun den Itemnamen mit nur einem Unterstrich gestaltest, gibt es keinen Teilstring nach dem 2. Unterstrich.
Ist aber kein Problem, Du musst lediglich überall, wo in den Rules ein get(2) steht, die 2 in eine 1 ändern, so dass dann get(1) da steht. Alternativ kannst Du natürlich die Items noch mal löschen und neu anlegen

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 49
- Registriert: 17. Jul 2022 23:34
Re: Internorm Jalousien über http-Binding
Moin,
habe ich angepasst. Den zweiten Unterstrich hatte ich vorher, aber hatte nicht richtig gelesen und das auch in der Rule nicht richtig gelesen..
Ist jetzt angepasst, aber es scheint mir, das er die rule nun nicht mehr ausführt, weil ich keine events mehr bekomme...
In den mediola strings finde ich dies:

ich restarte mal den container... mal schauen...
habe ich angepasst. Den zweiten Unterstrich hatte ich vorher, aber hatte nicht richtig gelesen und das auch in der Rule nicht richtig gelesen..
Ist jetzt angepasst, aber es scheint mir, das er die rule nun nicht mehr ausführt, weil ich keine events mehr bekomme...
In den mediola strings finde ich dies:

ich restarte mal den container... mal schauen...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
-
- Beiträge: 302
- Registriert: 7. Mär 2021 14:49
Re: Internorm Jalousien über http-Binding
Hallo,
habe das Mediola V4+ Gateway und etliche Funkschalter Rev, Intertechno, FS20 daran.
kann da zwar kein Zustand abfragen aber zum senden immer noch gut!
hier noch ein Beilspiel wie meine Things Datei mit Channels aussieht,
das dazu gehörende Item mit dem Chanel verknüpft.
wie man sieht stehen im Channel die vollständigen Commando´s und mit Parameter "%2$s" wird der Befehl übergeben.
vielleicht hilft es bei den Internorm Rolladen?
habe das Mediola V4+ Gateway und etliche Funkschalter Rev, Intertechno, FS20 daran.
kann da zwar kein Zustand abfragen aber zum senden immer noch gut!
hier noch ein Beilspiel wie meine Things Datei mit Channels aussieht,
Code: Alles auswählen
Thing http:url:0de4fe720f "Aio Gateway http" [baseURL="http://192.168.178.23/command?", authMode= "BASIC", commandMethod="GET", ignoreSSLErrors = true , bufferSize = "2048", timeout = "3000", refresh=60 ]
{
Channels:
Type switch : http_IT_Sch_4 "IT Schalter 4 http" [mode = "WRITEONLY", onValue = "XC_FNC=SendSC&type=IT&data=30E", offValue = "XC_FNC=SendSC&type=IT&data=306", commandExtension = "%2$s" ]
Type rollershutter: http_IT_Ro_1 "IT Rolladen 1 http" [mode = "WRITEONLY", upValue = "XC_FNC=SendSC&type=IT&data=F0E", downValue = "XC_FNC=SendSC&type=IT&data=F06", stopValue = "XC_FNC=SendSC&type=IT&data=F06",commandExtension = "%2$s" ]
Type rollershutter: http_IT_Ro_3 "IT Rolladen 2 http" [mode = "WRITEONLY", upValue = "XC_FNC=SendSC&type=IT&data=F2E", downValue = "XC_FNC=SendSC&type=IT&data=F26", stopValue = "XC_FNC=SendSC&type=IT&data=F26", commandExtension = "%2$s" ]
}
wie man sieht stehen im Channel die vollständigen Commando´s und mit Parameter "%2$s" wird der Befehl übergeben.
vielleicht hilft es bei den Internorm Rolladen?
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux