Seite 1 von 2

[OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 11. Feb 2021 18:18
von MrCrashy
Hallo Zusammen,

ich habe mich mit OH3 etwas vertraut gemacht und würde mich gerne jetzt mit meiner Nutzeroberfläche auseinandersetzen. Ich habe in zwei Räumen eine Zeitschaltuhr über Selection-Items realisiert. Da OH3 im Interface kein Selection-Widget hat, habe ich etwas gesucht und einen Code für mich gefunden, der eigentlich reicht. Dieses sieht wie folgt aus:

Code: Alles auswählen

uid: Selection Zeitschaltuhren Ein
props:
  parameters:
    - description: Der Titel der Betriebsart
      label: Titel
      name: title
      required: true
      type: TEXT
    - context: item
      description: Das Item für das die Betriebsart eingestellt wird
      label: Betriebsart Item
      name: item
      required: true
      type: TEXT
  parameterGroups: []
timestamp: Feb 11, 2021, 6:01:48 PM
component: oh-list-card
config:
  title: =props.title
slots:
  default:
    - component: oh-list-item
      config:
        title: Aus
        action: command
        actionItem: =props.item
        actionCommand: -1
        icon: "=items[props.item].state === '-1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: Automatik
        action: command
        actionItem: =props.item
        actionCommand: 0
        icon: "=items[props.item].state === '0' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 17 Uhr
        action: command
        actionItem: =props.item
        actionCommand: 1
        icon: "=items[props.item].state === '1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 18 Uhr
        action: command
        actionItem: =props.item
        actionCommand: 2
        icon: "=items[props.item].state === '2' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 19 Uhr
        action: command
        actionItem: =props.item
        actionCommand: 3
        icon: "=items[props.item].state === '3' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 20 Uhr
        action: command
        actionItem: =props.item
        actionCommand: 4
        icon: "=items[props.item].state === '4' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
Um den Automatik-Modus verwenden zu können, muss ich dem Item eine "0" senden. Wenn ich dies aber versuche, dann bekomme ich folgende Meldung in den Logs:

Code: Alles auswählen

2021-02-11 18:04:08.214 [ERROR] [rg.apache.cxf.jaxrs.utils.JAXRSUtils] - No message body reader has been found for class java.lang.String, ContentType: application/octet-stream

2021-02-11 18:04:08.218 [WARN ] [s.impl.WebApplicationExceptionMapper] - javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type

	at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1382)

	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processRequestBodyParameter(JAXRSUtils.java:877)

	at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:822)

	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:214)

	at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:78)

	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)

	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)

	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)

	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)

	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)

	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)

	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:216)

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301)

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:220)

	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276)

	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:852)

	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:544)

	at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)

	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)

	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:536)

	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)

	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)

	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1581)

	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)

	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1307)

	at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:293)

	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)

	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:482)

	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1549)

	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)

	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1204)

	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

	at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)

	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)

	at org.eclipse.jetty.server.Server.handle(Server.java:494)

	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:374)

	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:268)

	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)

	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)

	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)

	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)

	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:367)

	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782)

	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:918)

	at java.base/java.lang.Thread.run(Thread.java:834)
Andere Nummern, wie -1, 1, 2 usw gehen. Nur die 0 nicht. Leider fällt mir keine andere Lösung ein.
Vielleicht kann mir hier jemand helfen?

EDIT: Ich möchte ebenfalls die Items in meiner UI in der Anordnung ändern. Leider finde ich die Möglichkeit dazu nicht. Diese werden einfach nur "stumpf" nebeneinander angeordnet. Wenn die Reihe voll ist, wird die nächste Angefangen. Ich möchte die Items aber lieber "frei" positionieren, so wie es im HABPanel möglich ist.
Dachte eigentlich dass es über "Configure Masonry" möglich ist, doch das Pop-Up ist komplett leer.
Hat hier ebenfalls jemand eine Idee?

MfG

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 11. Feb 2021 21:20
von harteknut
Den Fehler mit der 0 kenne ich nicht. Ich vermeide die 0 als Status, weil die öfter Probleme verursacht. Hast Du mal versucht, den Wert bei „Action Command“ in Anführungsstriche zu setzen?

Zum Thema „freie Anordnung“: So wie bei HABPanel geht es (glaube ich) nicht mehr, und darüber freue ich mich sehr:
Bei HABPanel musste ich die Darstellung immer auf einen bestimmten Screen bzw. eine Auflösung anpassen. Das brauch ich jetzt nicht mehr, OH3 passt das immer an, die Widgets werden inkl. Schrift und icons skaliert.
Arbeitest Du mit Widgets oder Cells?

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 11. Feb 2021 21:43
von MrCrashy
Ich werde es morgen mal mit den Anführungszeichen versuchen.

Ich arbeite hauptsächlich mit Cells. Irgendwie gefällt mir aber die Anordnung nicht so wirklich. Hätte nämlich als Beispiel folgende Anordnung:

Zwei vertikale Slider. Über und unter den Slider jeweils eine Schaltfläche in der Breite von beiden Slidern.
Also so:
_______
|. |
|. |
|. |
_______

Leider werden die Schaltflächen nur daneben und nebeneinander angeordnet.
Mit Widgets in OH3 habe ich leider nicht so die Erfahrung.

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 11. Feb 2021 21:59
von peter-pan
Hast du es schon mit "List-Cards" probiert ?

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 08:24
von MrCrashy
Ich habe mich mal an "List-Cards" probiert. Ein Widget basiert auf darauf. Aber das ist mit mehr Glück als Verstand zusammen gebaut. Also so sehr kenne ich mich nicht damit aus.

Ich blicke allgemein nicht wirklich durch. Ich erstelle eigentlich alles über "Masonry". Die "Blocks" bzw "Cells" nutze ich eigentlich nie. Mir fehlen da einfach die ganzen Widgets.
Ich finde auch irgendwie keine einfache Möglichkeit eine "Schaltfläche" zu erstellen. Also einfach nur einen Knopf, welcher bei einem einem "Druck" das Item einschaltet und bei dem nächsten "Druck" wieder ausschaltet.

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 13:48
von peter-pan
Hab nicht ganz verstanden, was du meinst. Masonry arbeitet doch mit List-Cards, während Block mit Cells arbeitet.

Wenn du einen einfachen Schalter mit Cells machen willst, hier ein YAML-Code dazu.

Code: Alles auswählen

component: oh-cell
config:
  action: toggle
  actionItem: Sonoff_Basic_03
  title: Schreibtischlampe
  icon: oh:siren
  actionCommand: ON
  actionCommandAlt: OFF
  subtitle: =items.Sonoff_Basic_03.displayState
Sonoff_Basic_03 ist ein Switch Item, der zum Schalten einer Schreibtischlampe dient.

Das sieht dann so aus:
switch.jpg
Im Gegensatz dazu kannst du ein List-Card-Widget mit mehreren Items definieren. Der YAML dazu könnte so aussehen:

Code: Alles auswählen

component: oh-list-card
config:
  mediaList: true
slots:
  default:
    - component: oh-player-item
      config:
        title: Sonos Arbeitszimmer
        icon: oh:sonos_play1
        item: AZ_Sonos_Control
        showRewindFFward: false
        artistItem: AZ_Sonos_CurrentArtist
        trackItem: AZ_Sonos_CurrentTitle
    - component: oh-stepper-item
      config:
        title: Lautstärke
        item: AZ_Sonos_Volume
        fill: false
        raised: true
        icon: oh:soundvolume
    - component: oh-toggle-item
      config:
        title: Mute
        item: AZ_Sonos_Mute
        iconUseState: true
        icon: oh:soundvolume_mute
        color: red
    - component: oh-label-item
      config:
        item: AZ_Sonos_CurrentTitle
        title: "Es läuft:"
und das sieht dann so aus:
list-card.jpg

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 14:19
von peter-pan
Hab grad noch eine andere Möglichkeit mit "Label-Cell" getestet. Hier der YAML dazu.

Code: Alles auswählen

component: oh-label-cell
config:
  header: Schreibtischlampe
  icon: oh:siren
  item: Sonoff_Basic_03
  action: toggle
  actionCommand: ON
  actionCommandAlt: OFF
  color: lightblue
  actionItem: Sonoff_Basic_03

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 15:04
von MrCrashy
Hallo, danke für deine Zeit. Ich habe gerade mal deine erste Möglichkeit mit den Cells probiert und es funktioniert wunderbar. Leider bin ich bei dieser YAML - Geschichte nicht ganz dabei. Ich hätte nämlich lieber anstatt den Item-State einfach eine farbliche Kennzeichnung der Schalterstellung. Also z.B. wenn das Licht an ist, dann soll der Button "Blau" sein. Wenn das Licht aus ist, soll der Button "normal" sein.

Außerdem habe ich mal ein anderes "List-Item" geschrieben.
Das sieht jetzt so aus:
Unbenannt.PNG
Das Problem ist jetzt aber, dass es zwei Listen untereinander sind. Ich hätte diese aber lieber nebeneinander. Es sind nämlich einmal "Einschaltzeit" und "Ausschaltzeit". Also bis 20 Uhr ist die Einschaltzeit. Danach ist wieder ausschaltzeit.

So sieht der YAML-Code jetzt aus:

Code: Alles auswählen

component: oh-list-card
config:
  title: Küche Spotlight
slots:
  default:
    - component: oh-toggle-item
      config:
        title: Ein/Aus
        item: HUE_Kitchen_Spotlight1
        iconUseState: true
        icon: oh:lightbulb
        color: red
    - component: oh-list-item
      config:
        title: Aus
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: -1
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '-1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: Automatik
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: -2
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '-2' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 17 Uhr
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: 1
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 18 Uhr
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: 2
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '2' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 19 Uhr
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: 3
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '3' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 20 Uhr
        action: command
        actionItem: Kitchen_Spotligh1_Timer_On
        actionCommand: -1
        icon: "=items.Kitchen_Spotligh1_Timer_On.state === '4' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: Aus
        action: command
        actionItem: Kitchen_Spotlight1_Timer_Off
        actionCommand: -1
        icon: "=items.Kitchen_Spotligh1_Timer_Off.state === '-1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 21 Uhr
        action: command
        actionItem: Kitchen_Spotlight1_Timer_Off
        actionCommand: 1
        icon: "=items.Kitchen_Spotligh1_Timer_Off.state === '1' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 22 Uhr
        action: command
        actionItem: Kitchen_Spotlight1_Timer_Off
        actionCommand: 2
        icon: "=items.Kitchen_Spotligh1_Timer_Off.state === '2' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red
    - component: oh-list-item
      config:
        title: 22 Uhr
        action: command
        actionItem: Kitchen_Spotlight1_Timer_Off
        actionCommand: 3
        icon: "=items.Kitchen_Spotligh1_Timer_Off.state === '3' ? 'f7:circle_fill' : 'f7:circle'"
        iconColor: red

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 16:05
von peter-pan
MrCrashy hat geschrieben: 12. Feb 2021 15:04 Ich hätte nämlich lieber anstatt den Item-State einfach eine farbliche Kennzeichnung der Schalterstellung.
Das geht mit dem zweiten YAML (Label-Cell). "item" und "actionItem" sind dein Schalter und da habe ich die "color:lightblue" eingestellt. Wenn du nun auf die Zelle klickst, wird sie auch "blau" ;) und bei aus(OFF) wieder "normal". Es kann aber sein, dass das im "Run-Mode" nicht funktioniert. In diesem Falle abspeichern und die richtige Page aufrufen.

Das mit dem List-Widget schaue ich mir nachher noch einmal an. Vielleicht fällt mir was ein. Muss aber jetzt noch schnell was für die "Chefin" erledigen ;) .

Re: [OH3] Main-UI Selection Widget sendet keine 0

Verfasst: 12. Feb 2021 17:22
von MrCrashy
Vielen Dank, das wäre freundlich!

Kenne ich, wir sind gerade am Umbauen und bin ständig am hin und her rennen :D

EDIT: Die "Label-Cell" habe ich ausprobiert. Die Farbe UND der Status "On" oder "Off" ändert sich beim Statuswechsel. Dennoch funktioniert er nicht als Button. Beim "Drücken" passiert leider nichts.