Internorm Jalousien über http-Binding

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ollyins
Beiträge: 49
Registriert: 17. Jul 2022 23:34
Answers: 0

Re: Internorm Jalousien über http-Binding

Beitrag von ollyins »

Moin Udo,
hättest du denn dazu Lust und Zeit?

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Internorm Jalousien über http-Binding

Beitrag von udo1toni »

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:
  • 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)
Die Rule zum Senden:

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 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:

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
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ollyins
Beiträge: 49
Registriert: 17. Jul 2022 23:34
Answers: 0

Re: Internorm Jalousien über http-Binding

Beitrag von ollyins »

perfekt! wird nachher ausprobiert! Feedback folgt. Danke Udo

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Internorm Jalousien über http-Binding

Beitrag von udo1toni »

Immer gerne :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ollyins
Beiträge: 49
Registriert: 17. Jul 2022 23:34
Answers: 0

Re: Internorm Jalousien über http-Binding

Beitrag von ollyins »

Ok, dann habe ich gleich mal die beiden GW definiert und die items..
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”}
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?

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Internorm Jalousien über http-Binding

Beitrag von udo1toni »

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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ollyins
Beiträge: 49
Registriert: 17. Jul 2022 23:34
Answers: 0

Re: Internorm Jalousien über http-Binding

Beitrag von ollyins »

So, alles drin, aber tuts noch nicht!

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"
        ]
}
items:

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)
rules:

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
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:

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
der event-log:

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
Wo ist wieder mein Dulli-Fehler...

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Internorm Jalousien über http-Binding

Beitrag von udo1toni »

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:

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"
        ]
}
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 :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ollyins
Beiträge: 49
Registriert: 17. Jul 2022 23:34
Answers: 0

Re: Internorm Jalousien über http-Binding

Beitrag von ollyins »

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:

Bild

ich restarte mal den container... mal schauen...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

oh73
Beiträge: 302
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Internorm Jalousien über http-Binding

Beitrag von oh73 »

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,

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" ]
	
	}
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?
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

Antworten