Seite 1 von 1

JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 4. Mai 2023 13:24
von TorstenE
Hallo Mitstreiter,

ich erhalte in einem Channel die Antwort aus einem HTTP-Request als "true/false" Wert.
Wie kann ich dies in ON/OFF umwandeln, damit ein "switch"-Item damit etwas anfangen kann?

Bitte nicht mit "onValue" und "offValue" verwechseln, diese dienen zum SENDEN.

Danke

Torsten

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 4. Mai 2023 16:08
von TorstenE
Im Prinzip suche ich praktisch so etwas:

Code: Alles auswählen

stateTransformation: if (JSONPATH:$.isInScreensaver) ? ON : OFF

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 4. Mai 2023 23:12
von udo1toni
Nein, da hast Du was missverstanden.

onValue und offValue sind für beide Richtungen.

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 5. Mai 2023 09:03
von TorstenE
Guten Morgen,

jetz führe ich mein Challenge doch etwas ausführlicher aus.
Es geht um den "Fully Kiosk"-Browser (https://www.fully-kiosk.com/de)
Dieser lässt sich per REST-Api komplett steuern.
Meine Anforderung im Augenblick ist nur, schalte den Bildschirmschoner aus, wenn sich
jemand dem Display nähert (Bewegungsmelder). Weiter Möglichkeiten
können wir gerne in einem andern Tread besprechen.
D.h. ich nehme ein Switch-Item, welches ich später per Rule
schalten kann.

Nachfolgend ein paar Grundinfos, damit das ganze Thema
verstanden wird.

Mit folgender URL kann der Browser abgefragt werden:

Code: Alles auswählen

http://192.168.20.108.2323/?passwort=MyPassword&type=json&cmd=deviceInfo
Antwort im JSON-Format:

Code: Alles auswählen

{"deviceName":"Tab S7 von MeinTablet","packageName":"de.ozerov.fully","altitude":572.9000244140625,"locationProvide":"network","batteryLevel":14,"isPlugged":false,"SSID":"\"MeineSSID\"","BSSID":"de:21:f9:2e:92:90","Mac":"4A:54:CF:E3:DC:4E","ip4":"192.168.20.108","ip6":"FE80::4854:CFFF:FEE3:DC4E","hostname4":"192.168.20.108","hostname6":"fe80::4854:cfff:fee3:dc4e%wlan0","wifiSignalLevel":9,"isMobileDataEnabled":false,"screenOrientation":90,"screenBrightness":12,"screenLocked":true,"screenOn":false,"batteryTemperature":23,"plugged":false,"keyguardLocked":true,"locale":"de_DE","serial":"unknown","build":"TP1A.220624.014.T870XXU2DWB2","androidVersion":"13","webviewUA":"Mozilla/5.0 (Linux; Android 13; SM-T870 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/112.0.5615.135 Safari/537.36","foregroundActivity":"com.sec.android.app.launcher/com.android.launcher3.uioverrides.QuickstepLauncher","motionDetectorStatus":2,"isDeviceAdmin":true,"isDeviceOwner":false,"internalStorageFreeSpace":65574977536,"internalStorageTotalSpace":114898726912,"ramUsedMemory":3199524864,"ramFreeMemory":2723545088,"ramTotalMemory":5923069952,"appUsedMemory":9815024,"appFreeMemory":527055888,"appTotalMemory":536870912,"timestamp":1683261711047,"scopedStorage":true,"displayHeightPixels":1600,"displayWidthPixels":2560,"isMenuOpen":false,"topFragmentTag":"","isInDaydream":false,"isRooted":false,"isLicensed":false,"isInScreensaver":false,"kioskLocked":false,"isInForcedSleep":false,"maintenanceMode":false,"kioskMode":false,"startUrl":"http://openhabian:8080/habpanel/#/view/Lichter","currentTabIndex":0,"deviceID":"43de72e9-6186e4d9","locationLatitude":47.6028963,"locationLongitude":9.7989675,"appVersionCode":1161,"appVersionName":"1.50.2-play","androidSdk":33,"deviceModel":"SM-T870","deviceManufacturer":"samsung","foregroundApp":"com.sec.android.app.launcher","currentPage":"http://openhabian:8080/habpanel/#/view/Lichter","lastAppStart":"03.05.23 17:15:43"}

Bildschirmschoner eingeschalten:

Code: Alles auswählen

http://192.168.20.108.2323/?passwort=MyPassword&type=json&cmd=startStreensaver
Bildschirmschoner ausschalten:

Code: Alles auswählen

http://192.168.20.108.2323/?passwort=MyPassword&type=json&cmd=stopStreensaver

Mein Thing inkl. Channel schaut wie folgt aus (gekürzt):

Code: Alles auswählen

ID: http:url:wallpanel
label: Wand Display (Samsung Galaxy S7, Fully Kiosk Browser)
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: true
  baseURL: http://192.168.20.108:2323/?password=MyPassword&type=json
  delay: 0
  stateMethod: GET
  refresh: 60
  commandMethod: GET
  contentType: text/plain
  timeout: 3000
  bufferSize: 2048
channels:
  - id: batteryLevel
    channelTypeUID: http:number
    label: batteryLevel
    description: null
    configuration:
      stateExtension: "&cmd=deviceInfo"
      stateTransformation: JSONPATH:$.batteryLevel
      stateContent: "%0f"
  - id: isInScreensaver
    channelTypeUID: http:switch
    label: isInScreensaver
    description: null
    configuration:
      onValue: startScreensaver
      stateExtension: "&cmd=deviceInfo"
      offValue: stopScreensaver
      commandExtension: "&cmd=%2$s"
      stateTransformation: JSONPATH:$.isInScreensaver
Soweit die Infos.

Der Bilschirmschoner kann über das Switch-Item ganz
normal ein-/ausgeschaltet werden. Die oben erwähnten URLs
werden zusammengesetzt aus

Code: Alles auswählen

...
baseURL: http://192.168.20.108:2323/?password=MyPassword
...
      onValue: startScreensaver
      offValue: stopScreensaver
      commandExtension: "&cmd=%2$s"
..
Ergebnis:

Code: Alles auswählen

http://192.168.20.108:2323/?password=MeyPassword&cmd=startScreensaver
http://192.168.20.108:2323/?password=MeyPassword&cmd=stopScreensaver
Wird der Switch NICHT benutzt, führt der Thing alle 60 Sekunden
eine Abfrage aus.
Hier im Beispiel wird der Batteriestatus abgefragt. Die
entsprechende URL wird zusammen gesetzt

Code: Alles auswählen

http://192.168.20.108.2323/?passwort=MyPassword&type=json&cmd=deviceInfo
und aus dem zurückgelieferten JSON-String der Wert "batteryLevel" abgefragt
und als nummerischer Wert an das Item geliefert.

Code: Alles auswählen

...
baseURL: http://192.168.20.108:2323/?password=MyPassword
...
      stateExtension: "&cmd=deviceInfo"
      stateTransformation: JSONPATH:$.batteryLevel
      stateContent: "%0f"
..
Und jetzt wird es spannend:
Es geht um die Abfrage für den ScreenSaver (Bilschirmschoner)
Die Anweisung schaut wie im BatterieStatus wie folgt aus

Code: Alles auswählen

...
baseURL: http://192.168.20.108:2323/?password=MyPassword
...
      stateExtension: "&cmd=deviceInfo"
      stateTransformation: JSONPATH:$.isInScreensaver
..
Nach der "Batterie"-Logik, müsste jetzt "true/false" als
Rückgabe aus der Abfrage kommen. Dieses true/false könnte
in einem ITEM-"transform" in ON/OFF umgewandelt werden.

Der Fehler der hier entsteht ist jedoch, dass im "transform"
Script überhaupt kein Wert ankommt. Gibe ich aus dem
"transform"-Script pauschal "ON" bzw. "OFF" zurück, reagiert
das ITEM entsprechend und ändert seinen Switch-Status.

Nur WIE bekomme ich jetzt praktisch den JSON-Wert
in das "transform"-Script, bzw. wandle das "true/false"
was hoffentlich auch so ankommt in ON/OFF um ?

Man(n) ich hoffe das war verständlich?

Grüße

Torsten

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 5. Mai 2023 22:55
von udo1toni
Der Schlüssel dabei ist immer: Wenn Du einen Channel in beiden Richtungen verwenden willst, müssen Input und Output identisch sein.
Das wird hier nicht ganz einfach werden. Einfacher wäre es, zwei getrennte Channel zu konfigurieren, die jeweils unidirektional arbeiten.

Code: Alles auswählen

ID: http:url:wallpanel
label: Wand Display (Samsung Galaxy S7, Fully Kiosk Browser)
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: true
  baseURL: http://192.168.20.108:2323/?password=MyPassword&type=json
  delay: 0
  stateMethod: GET
  refresh: 60
  commandMethod: GET
  contentType: text/plain
  timeout: 3000
  bufferSize: 2048
channels:
  - id: batteryLevel
    channelTypeUID: http:number
    label: batteryLevel
    description: null
    configuration:
      stateExtension: "&cmd=deviceInfo"
      stateTransformation: JSONPATH:$.batteryLevel
      stateContent: "%0f"
  - id: isOutScreensaver
    channelTypeUID: http:switch
    label: isOutScreensaver
    description: null
    configuration:
      onValue: startScreensaver
      offValue: stopScreensaver
      commandExtension: "&cmd=%2$s"
  - id: isInScreensaver
    channelTypeUID: http:switch
    label: isInScreensaver
    description: null
    configuration:
      onValue: true
      stateExtension: "&cmd=deviceInfo"
      offValue: false
      stateTransformation: JSONPATH:$.isInScreensaver
Du kannst einfach beide Channel mit dem selben Switch Item verlinken, ein gesendeter Befehl geht dann über isOutScreensaver, ein Statusupdate kommt über isInScreensaver als Status (nicht als Command...)
Eine weitere Möglichkeit wäre, einen Channel für die ankommende Richtung zu definieren, und zwar als string Channel ohne stateTransformation. Diue Transformation kann dann direkt im Link passieren und Du brauchst nur einen einzigen Input Channel.

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 6. Mai 2023 11:23
von TorstenE
Woooooowwwwww... was soll ich lagen - KLASSE.
Das mit den beiden Channel ist super. Ich wusste nicht, dass ich 2 Channel auf ein Item verlinken kann.
Das Schöne an dieser Lösung ist, dass alles in den Things eingestellt ist und somit schön übersichtlich.

Ich hatte es in der Zwischenzeit mit einem Switch-Channel und einem String-Channel und dazwischen
mit zwei Rules zusammen gefummelt. Aber das hier ist einfach spitze.

Re: JSONPATH:$.rueckgabe in ON/OFF umwandeln (Thing/Channel)

Verfasst: 6. Mai 2023 16:51
von udo1toni
:D