JSON Textformatierung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Mic91
Beiträge: 15
Registriert: 15. Jan 2021 21:48
Answers: 0

JSON Textformatierung

Beitrag von Mic91 »

Hallo,

von meinem Rollladencontroller erhalte ich folgende Daten (nur ein Auszug):

Code: Alles auswählen

{"XC_SUC":[{"type":"EVENT","adr":"FF","state":"0"},{"type":"CM","sid":"01","adr":"007FCC9B","cid":"00","deviceType":"00","eType":"16","state":{"state":0,"flags":"0040","timeout":0}},
{"type":"CM","sid":"02","adr":"0001DB63","cid":"01","deviceType":"00","eType":"5","state":{"position":70,"run_state":0,"flags":"0000","timeout":0},"group":"1315"},
{"type":"CM","sid":"03","adr":"000239B9","cid":"02","deviceType":"00","eType":"5","state":{"position":0,"run_state":0,"flags":"0000","timeout":0},"group":"131416"}]}
So wie ich das sehe sollte das doch JSON sein oder bin ich falsch? Denn bei dem Punkt "position" ist die Prozentangabe wie weiter der Rolladen geschlossen ist.

Kann mir jemand sagen wie ich die positionsangabe für jeden rolladen abfragen kann?

http.cfg bei services:

Code: Alles auswählen

rollladenjson.url=http://IP Rollladencontroller/cmd?XC_FNC=GetStates&at=Passwort
rollladenjson.updatenintercvall=10
rollladen.items bei items:

Code: Alles auswählen

Group rollladeninfo
Number rollladen1 "Value [%.1f]" (rollladeninfo) {http="<[rollladenjson:10:JSONPATH($.vars[3].position)]"}
Number rollladen2 "Value [%.1f]" (rollladeninfo) {http="<[rollladenjson:10:JSONPATH($.vars[5].position)]"}
Number rollladen3 "Value [%.1f]" (rollladeninfo) {http="<[rollladenjson:10:JSONPATH($.vars[7].position)]"}
Auszug Sitemap:

Code: Alles auswählen

    Frame label="Rollladen Info"{
        Group item=rollladeninfo label="Alle Werte anzeigen" icon=""}
JSONPATH und das HTTP Binding V3.0.0 ist installiert auf dem Raspberry mit OH3.

Danke!

Gruß Michael

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

Re: JSON Textformatierung

Beitrag von udo1toni »

Auf welcher Version von openHAB bist Du denn nun unterwegs? eine http.cfg gibt es nur für das http1-Binding, welches nur bis einschließlich openHAB2.5.12 funktioniert.

Auch die Konfiguration in der rollladen.items deutet auf ein http1 Binding hin. das http3 (bzw. http2...) Binding und die Aussage OH3 deuten aber auf openHAB3.x hin. Dann kann Deine Konfiguration aber genau gar nichts liefern.

Gesetzt den Fall, Du bist mit openHAB3 unterwegs, musst Du zwingend ein http Thing anlegen, entweder über eine http.things Datei (im passenden Ordner...) oder direkt über die UI. Dabei gibt es zwei Optionen. Erstens, ein Channel pro Wert:

Code: Alles auswählen

Thing http:url:shutter "Rollladencontroller" [ 
    baseURL="http://IP.des.ger.aets/Rollladencontroller/cmd?XC_FNC=GetStates&at=Passwort",
    refresh=10,
    timeout=5000
    ] {
    Channels: 
        Type number : ch1pos "Position CH1" [stateTransformation="JSONPATH:$.XC_SUC[?(@.sid=='01')].state.state"]
        Type number : ch2pos "Position CH2" [stateTransformation="JSONPATH:$.XC_SUC[?(@.sid=='02')].state.state"]
        Type number : ch3pos "Position CH3" [stateTransformation="JSONPATH:$.XC_SUC[?(@.sid=='03')].state.state"]
}
Die IP muss natürlich angepasst werden.

Nun hast Du drei Channel für die drei Items, welche natürlich auch verlinkt werden müssen:

Code: Alles auswählen

Group rollladeninfo
Number rollladen1 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:ch1pos"}
Number rollladen2 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:ch2pos"}
Number rollladen3 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:ch3pos"}
Zweite Möglichkeit: Ein Channel pro JSON Objekt:

Code: Alles auswählen

Thing http:url:shutter "Rollladencontroller" [ 
    baseURL="http://IP.des.ger.aets/Rollladencontroller/cmd?XC_FNC=GetStates&at=Passwort",
    refresh=10,
    timeout=5000
    ] {
    Channels: 
        Type string : json "JSON Objekt" []
}
Nun muss die Transformation im Profile erfolgen:

Code: Alles auswählen

Group rollladeninfo
Number rollladen1 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:json"[profile="Transform:JSONPATH" function="$.XC_SUC[?(@.sid=='01')].state.state"]}
Number rollladen2 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:json"[profile="Transform:JSONPATH" function="$.XC_SUC[?(@.sid=='02')].state.state"]}
Number rollladen3 "Value [%.1f]" (rollladeninfo) {channel="http:url:shutter:json"[profile="Transform:JSONPATH" function="$.XC_SUC[?(@.sid=='03')].state.state"]}
Der angegebene JSONPATH sucht übrigens im JSON Objekt den Zweig heraus, dessen Parameter sid mit dem angegebenen Wert übereinstimmt. JSON garantiert keine Reihenfolge der Einträge, auch wenn das evtl. von einigen Geräte so umgesetzt wird. Es ist also guter Stil, sich nicht darauf zu verlassen, dass die Reihenfolge der Einträge im JSON Objekt immer gleich ist.

Die Konfiguration kann genauso auch komplett über die UI vorgenommen werden, die einzelnen Parameter sollten einigermaßen selbsterklärend sein.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Mic91
Beiträge: 15
Registriert: 15. Jan 2021 21:48
Answers: 0

Re: JSON Textformatierung

Beitrag von Mic91 »

Das hat so gepasst.

Vielen Dank!

Ich kämpfe noch mit der Anzeige, dass diese im Rollershutter Item angezeigt wird.

Rule für Up/Stop/Down:

Code: Alles auswählen

rule "rolladen_Buro"
        when
            Item rolladen_Buro received command
        then
        switch(receivedCommand){
            case UP:{
                executeCommandLine("python", "/etc/openhab/scripts/rolladenfahren.py", "08", "moveUp")                
            }
            case DOWN:{
                executeCommandLine("python", "/etc/openhab/scripts/rolladenfahren.py", "08", "moveDown")                
            }
            case STOP:{
                executeCommandLine("python", "/etc/openhab/scripts/rolladenfahren.py", "08", "stop") 
            }
        }
end
Rollershutter item:

Code: Alles auswählen

Rollershutter rolladen_Buro "Rolladen Büro"
Ich habe den Namen um den Platzhalter "%.1f" ergänzt zum Schluss noch den Channel ergänzt aber es kommt ein "Err".

Weißt du da zufällig auch Rat?

Gruß Michael

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: JSON Textformatierung

Beitrag von int5749 »

in der Regel sind es ja Zahlen die angezeigt werden und ggfs noch %.
Um z.B. 30% darzustellen, lautet der Eintrag

Code: Alles auswählen

"Rollladen ist auf [%d %%]"
%.1f ist z.B. für Temperaturen
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: JSON Textformatierung

Beitrag von udo1toni »

Außerdem ist ein Number Channel nicht kompatibel mit einem Rollershutter Item. Ich vermute, Du hast mehrere Rollläden. dann böte es sich an, zwei Rules zu programmieren, die sich um alle Rollläden kümmern. Die eine Rule nimmt die Steuerbefehle des Rollershutter Items entgegen und sendet die passenden Befehle, die andere Rule nimmt die Status Updates entgegen und setzt die passenden Rollershutter Items Status passend.
Voraussetzung: Du benennst die Items so, dass man Namen der anderen Items und Befehlsteile vom Namen ableiten kann. Weiterhin sind die Items in zwei Gruppen zusammengefasst, die eine Gruppe für die Rollershutter Items, die andere Gruppe für die Number Items. z.B.:
rollladen_Buro_08 und RollStat_Buro, die Gruppen heißen z.B. gRoll und gRollStat.

Code: Alles auswählen

rule "Rollladen command"
when
    Member of gRoll received command
then
    val strChan = triggeringItem.name.split("_").get(2) // ergibt z.B. "08" bei Buro
    var strCom = ""
    switch(receivedCommand) {
        case UP  : strCom = "moveUp"
        case DOWN: strCom = "moveDown"
        case STOP: strCom = "stop"
    }
    executeCommandLine("python", "/etc/openhab/scripts/rolladenfahren.py", strChan, strCom)
end

rule "Rollladen status"
when
    Member of gRollStat changed
then
    val strTrigger = triggeringItem.name.split("_").get(1) // z.B. "Buro"
    val myItem = gRoll.members.filter[i|i.name.contains(strTrigger)].head
    myItem.postUpdate(newState)
end
Wenn die Items den Gruppen zugeordnet sind und die Namenskonvention eingehalten wird, reichen diese beiden Rules, um beliebig viele Rollläden zu steuern und die Status zurückzumelden.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten