WLED Binding Save Preset

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

WLED Binding Save Preset

Beitrag von DerEsdas »

Moin,

ich bin der neue (:

Da ich bei mir im Neubau KNX einsetzen werde habe ich mir für meine VISU Openhab installiert.
Ich stehe hart auf Indirekte Beleuchtung und werde alle Stripes mit WLED steuern.

Dazu habe ich mir in Openhab das WLED Binding installiert und auch schon mein eigenes angepasstes Widget dafür gebaut.
Allerdings würde ich auch gerne die aktuellen Einstellungen als Preset speichern können.
Dafür brauche ich von euch Unterstützung.

Auf der HP steht z.B. folgendes:

In Xtend rules, you can use the Actions like this.
getActions("wled", "wled:wled:XmasTree").savePreset(5)

Aber wie mache ich das konkret? Hat jemand sowas in Openhab schon gemacht und könnte mir seinen Code geben, damit ich wenigstens einen Anhaltspunkt habe? Mit Rules(?) habe ich nämlich noch kein Stück gearbeitet.

MfG
von udo1toni » 3. Nov 2021 13:12
Na, es steht tatsächlich genau so da, wie es angewandt wird.

Du legst eine Rule an und verwendest dabei den DSL-Code. Du kannst die Rule auch direkt in einer Textdatei anlegen, aber vermutlich willst Du lieber über die UI arbeiten :)
Im Codeblock trägst Du dann recht genau die Codezeile ein. Dabei gilt:

Code: Alles auswählen

getActions("wled", "wled:wled:XmasTree").savePreset(5)
"wled:wled:XmasTree" ist die UID des wled Thing.
5 ist der Speicherplatz.

Im Zweifel brauchst Du in der UI eine Schaltfläche zum Speichern, ein Number Item, über das Du den Speicherplatz auswählen kannst und evtl. noch eine Liste der wled Things. Zum Speichern des Presets wählst Du dann zuerst Thing und Speichernummer aus. Mit dem Druck auf Speichern wird die Rule getriggert. Die Rule nutzt dann den Status der beiden Items, in denen die UID sowie der Speicherplatz gespeichert sind. Etwa so:

Code: Alles auswählen

val String strUID = MyThingUID.state.toString
if(strUID == "NULL" || strUID == "") return;
val Number nPreset = if(MyPreset.state instanceof Number) (MyPreset.state as Number) else -1
if(nPreset == -1) return;
getActions("wled", strUID).savePreset(nPreset)
Du brauchst also nun drei Items, eines zum Triggern der Rule, Typ Switch, eines zur Auswahl des Presets (im Beispiel oben MyPreset), Typ Number, und ein drittes zum Speichern der UID (im Beispiel oben MyThingUID), Typ String.
Die UIDs trägst Du in eine Auswahlliste ein, die Du mit dem String Item verbindest, in der UI kannst Du dann die Auswahl nutzen.

Alternativ zur UID (die ist ja nicht unbedingt schick in der UI) kannst Du in der Rule eine Übersetzung vornehmen, z.B. mit einer HashMap.
Gehe zur vollständigen Antwort

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

Re: WLED Binding Save Preset

Beitrag von udo1toni »

Na, es steht tatsächlich genau so da, wie es angewandt wird.

Du legst eine Rule an und verwendest dabei den DSL-Code. Du kannst die Rule auch direkt in einer Textdatei anlegen, aber vermutlich willst Du lieber über die UI arbeiten :)
Im Codeblock trägst Du dann recht genau die Codezeile ein. Dabei gilt:

Code: Alles auswählen

getActions("wled", "wled:wled:XmasTree").savePreset(5)
"wled:wled:XmasTree" ist die UID des wled Thing.
5 ist der Speicherplatz.

Im Zweifel brauchst Du in der UI eine Schaltfläche zum Speichern, ein Number Item, über das Du den Speicherplatz auswählen kannst und evtl. noch eine Liste der wled Things. Zum Speichern des Presets wählst Du dann zuerst Thing und Speichernummer aus. Mit dem Druck auf Speichern wird die Rule getriggert. Die Rule nutzt dann den Status der beiden Items, in denen die UID sowie der Speicherplatz gespeichert sind. Etwa so:

Code: Alles auswählen

val String strUID = MyThingUID.state.toString
if(strUID == "NULL" || strUID == "") return;
val Number nPreset = if(MyPreset.state instanceof Number) (MyPreset.state as Number) else -1
if(nPreset == -1) return;
getActions("wled", strUID).savePreset(nPreset)
Du brauchst also nun drei Items, eines zum Triggern der Rule, Typ Switch, eines zur Auswahl des Presets (im Beispiel oben MyPreset), Typ Number, und ein drittes zum Speichern der UID (im Beispiel oben MyThingUID), Typ String.
Die UIDs trägst Du in eine Auswahlliste ein, die Du mit dem String Item verbindest, in der UI kannst Du dann die Auswahl nutzen.

Alternativ zur UID (die ist ja nicht unbedingt schick in der UI) kannst Du in der Rule eine Übersetzung vornehmen, z.B. mit einer HashMap.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Moin,

ich bedanke mich recht Herzlich (:
Ich werde es direkt heute Abend ausprobieren.

Falls weitere Fragen aufkommen sollten, werde ich dann schreiben


MfG

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Moin,

so nach anfänglichen Schwierigkeiten klappt es zu 90% schon.
Ein Problem besteht aber:

Er übernimmt leider nicht den Presetslot. Wenn ich in der getAction bei "nPreset" manuell z.B. eine 1 rein schreibe dann kann ich mit dem Save Button in der UI das Preset auf Slot 1 Speichern.
Wenn ich den Presetslot auswähle zeigt das Item auch die passende Zahl an. Dies ist auch auf Number eingestellt.

Code: Alles auswählen

val String strUID = SavePreset_Saveuid.state.toString 
if(strUID == "NULL" || strUID == "") return; 
val Number nPreset = if( SavePreset_Presetnumber.state instanceof Number) (SavePreset_Presetnumber.state as Number) else -1 
if(nPreset == -1) return;
getActions("wled", strUID).savePreset(nPreset)
Evtl. doch noch ein Fehler im Code?

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Der Fehler könnte auch an der Formatierung der Zahl liegen. Wenn ich das Number Item ändere zeigt der mir anstatt eine 1 eine 1.0 an

EDIT: Habe das Item mal auf Number:Dimensionless gestellt. Leider auch nicht der Fehler gewesen.

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

Re: WLED Binding Save Preset

Beitrag von udo1toni »

Nein, Dimensionles ist nicht gut. Du kannst aber in der Rule erzwingen, dass die Zahl als Integer verwendet wird, mit .intValue

Diese Zeile:

Code: Alles auswählen

val Number nPreset = if( SavePreset_Presetnumber.state instanceof Number) (SavePreset_Presetnumber.state as Number) else -1 
kannst Du also so abändern:

Code: Alles auswählen

val Integer nPreset = if( SavePreset_Presetnumber.state instanceof Number) (SavePreset_Presetnumber.state as Number).intValue else -1 
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Moin,

ich wollte mich noch bedanken! Funktioniert jetzt alles so wie es soll (:
Werde die Tage hier auch noch einmal paar Bilder reinstellen, damit andere es direkt verstehen und umsetzen können.



MfG Stefan

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

Re: WLED Binding Save Preset

Beitrag von udo1toni »

Prima!
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Als erstes legt Ihr 3 Items an:

1) Switch Item (In meinem Beispiel SavePreset)
2) Number Item (In meinem Beispiel SavePreset_Presetnumber)
3) String Item (In meinem Beispiel SavePreset_Saveuid)

When Rule

Ein Switch Item anlegen (SavePreset) und diesen in der Rule unter "When" Configurieren. Die Bedingung auf "an Item receives a command" stellen.
Als Command habe ich "safe" genommen.

Then Rule

Hier den Reiter "Run Script" auswählen und dann auf Rule DSL klicken.

Diesen Code rein kopieren:

Code: Alles auswählen

val String strUID = SavePreset_Saveuid.state.toString 
if(strUID == "NULL" || strUID == "") return; 
val Integer nPreset = if( SavePreset_Presetnumber.state instanceof Number) (SavePreset_Presetnumber.state as Number).intValue else -1 
if(nPreset == -1) return;
getActions("wled", strUID).savePreset(nPreset)
Ihr müsst hier die Namen eurer Items dementsprechend anpassen.


Item SavePreset_Presetnumber

Unter Add Metadata folgendes Einfügen:

Code: Alles auswählen

1=Preset 1
2=Preset 2
3=Preset 3
4=Preset 4
5=Preset 5
6=Preset 6
7=Preset 7
8=Preset 8
9=Preset 9
10=Preset 10
11=Preset 11
12=Preset 12
13=Preset 13
14=Preset 14
15=Preset 15
16=Preset 16
Nach dem "=" könnt ihr Irgendetwas hin schreiben. Dies ist das Label, welches beim drauf klicken angezeigt wird.


Item SavePreset_Saveuid

Hier das gleiche Spiel wie bei beim Presetnumber. Allerdings tragt Ihr hier die UID von euren WLED Things ein.



Widget Code


Code: Alles auswählen

    - component: f7-card-content
      config:
        style:
          width: 150px
          top: 50px
      slots:
        default:
          - component: oh-button
            config:
              style:
                height: 40px
                text-align: left
              iconF7: square_stack_3d_down_right
              iconSize: 30px
              text: Save Preset
              large: true
              popupOpen: .myPopupOpensave
            slots:
              default:
                - component: f7-popup
                  config:
                    push: true
                    style: background-color:rgba(0, 0, 0, 0.5
                    class: myPopupOpensave
                  slots:
                    default:
                      - component: oh-label-card
                        config:
                          text: Speichern
                          label: Speichern
                          action: rule
                          actionCommand: safe
                          actionRule: WLED_SavePreset
                          actionItem: =props.SavePresetItem
                          class: popup-close
                      - component: oh-button
                        config:
                          action: options
                          text: Presetslot
                          actionItem: =props.PresetslotItem
                          item: =props.PresetslotItem
                          style:
                            top: 50px
                      - component: oh-button
                        config:
                          action: options
                          text: UID
                          actionOptions: wled:wled:e8db84dcfeaf
                          actionItem: =props.UIDItem
                          style:
                            top: 50px
                          item: =props.UIDItem
                      - component: oh-button
                        config:
                          action: options
                          text: Presets
                          actionItem: =props.EffektItem
                          style:
                            top: 50px

Bei Fragen könnt Ihr gerne auf diesen Post antworten.

DerEsdas
Beiträge: 12
Registriert: 3. Nov 2021 07:32

Re: WLED Binding Save Preset

Beitrag von DerEsdas »

Moin udo1toni,

ich habe noch ein interessantes Problem.

Wenn ich das gleiche Widget z.B. zwei mal auf der selben Page anlege, funktioniert es nicht richtig.

Ich habe im Widget einen kleinen Button, der ein Popup erscheinen lässt wo ich folgendes machen kann:

- Eine Liste für die vorgefertigten WLED Presets
- Eine Liste für die UID Auswahl der WLED Things
- Eine Liste auf welchen Slot ich das Preset speichern möchte
- Ein Button zum abspeichern des Presets

Wenn ich nun zwei Widgets auf der gleichen Page anlege und bei einem Widget alle Items dementsprechend Verlinke und das Popup öffne, dann kann ich weder die Liste für die vorgefertigten Presets noch den Presetslot öffnen. Erst wenn ich beim zweiten Widget alles verlinke (Natürlich mit anderen Items, oder auch die selben <- beides probiert) geht es.

Allerdings hier das kuriose:
Wenn ich das Popup des ersten Widgets öffne, dann zeigt er mir den Inhalt des zweiten popups an. Beim Zweiten Widget zeigt er mir auch nur den Inhalt des zweiten Widgets an.

Ich denke, dass er mit dem popups auf der Page durcheinander kommt, da die popup "Funktion" im Widget gleich heißt.

Code: Alles auswählen

uid: WLED_Widget
props:
  parameters:
    - label: Title
      name: switchTitle
      required: true
      type: TEXT
    - context: item
      description: Switch
      label: Item
      name: switchItem
      required: true
      type: TEXT
    - context: item
      description: Preset
      label: Item
      name: presetItem
      required: true
      type: TEXT
    - context: item
      description: colorwheel
      label: Item
      name: colorwheelItem
      required: false
      type: TEXT
    - context: item
      description: Speed
      label: Item
      name: SpeedItem
      required: false
      type: TEXT
    - context: item
      description: intens
      label: Item
      name: IntensItem
      required: false
      type: TEXT
    - context: item
      description: Solid
      label: Item
      name: SolidItem
      required: false
      type: TEXT
    - context: item
      description: Speichern
      label: Item
      name: SavePresetItem
      required: true
      type: TEXT
    - context: item
      description: Auswahl Presetslot
      label: Item
      name: PresetslotItem
      required: true
      type: TEXT
    - context: item
      description: Auswahl UID
      label: Item
      name: UIDItem
      required: true
      type: TEXT
    - context: item
      description: Brightness
      label: Item
      name: brightnessItem
      required: true
      type: TEXT
    - context: item
      description: Standard Preset Auswahl
      label: Item
      name: EffektItem
      required: true
      type: TEXT
timestamp: Dec 14, 2021, 1:37:02 PM
component: f7-card
config:
  title: '=(props.switchTitle) ? props.switchTitle : (props.switchItem) ? props.switchItem : ""'
  style:
    border-radius: 13px
    --f7-card-bg-color: rgba(0, 0, 0, 0.2)
    height: 400px
slots:
  default:
    - component: oh-toggle
      config:
        style:
          position: absolute
          top: 17px
          right: 30px
        item: =props.switchItem
    - component: f7-card-content
      config:
        style:
          position: absolute
          top: -9px
          right: 60px
      slots:
        default:
          - component: oh-button
            config:
              noBorder: true
              noShadow: true
              action: options
              actionItem: =props.presetItem
              text: Presets
              actionPageTransition: f7-fade
    - component: f7-card-content
      config: {}
      slots:
        default:
          - component: oh-button
            config:
              style:
                height: 40px
                text-align: left
              iconF7: square_stack_3d_down_right
              iconSize: 30px
              text: ColorPicker
              large: true
              action: command
              actionCommand: Solid
              actionItem: =props.SolidItem
              popupOpen: .myPopupOpen
            slots:
              default:
                - component: f7-popup
                  config:
                    push: true
                    style:
                      background: transparent
                      padding-top: 50%
                    class: myPopupOpen popup-close
                  slots:
                    default:
                      - component: oh-colorpicker
                        config:
                          style:
                            height: 100%
                            width: 100%
                          item: =props.colorwheelItem
                          modules:
                            - wheel
    - component: Label
      config:
        text: Speed
        style:
          margin-left: 20px
    - component: f7-block
      config:
        style:
          position: absolute
          width: 100%
          top: 140px
          text-align: left
      slots:
        default:
          - component: oh-slider
            config:
              min: 0
              style:
                width: 100%
              max: 100
              item: =props.SpeedItem
    - component: Label
      config:
        text: Intense
        style:
          margin-left: 20px
          margin-top: 40px
    - component: f7-block
      config:
        style:
          position: absolute
          width: 100%
          height: 100px
          top: 200px
          text-align: left
      slots:
        default:
          - component: oh-slider
            config:
              min: 0
              style:
                width: 100%
              max: 100
              item: =props.IntensItem
    - component: Label
      config:
        text: Brightness
        style:
          margin-left: 20px
          margin-top: 38px
    - component: f7-block
      config:
        style:
          position: absolute
          width: 100%
          height: 100px
          top: 260px
          text-align: left
      slots:
        default:
          - component: oh-slider
            config:
              min: 0
              style:
                width: 100%
              max: 100
              item: =props.brightnessItem
    - component: f7-card-content
      config: {}
      slots:
        default:
          - component: oh-button
            config:
              style:
                height: 40px
                top: 50px
                font-size: 15px
                text-align: left
              text: Save Preset
              large: true
              popupOpen: .myPopupOpensave
            slots:
              default:
                - component: f7-popup
                  config:
                    push: true
                    style: background-color:rgba(0, 0, 0, 0.5
                    class: myPopupOpensave
                  slots:
                    default:
                      - component: oh-label-card
                        config:
                          text: Speichern
                          label: Speichern
                          action: rule
                          actionCommand: safe
                          actionRule: WLED_SavePreset
                          actionItem: =props.SavePresetItem
                          class: popup-close
                      - component: oh-button
                        config:
                          action: options
                          text: Presetslot
                          actionItem: =props.PresetslotItem
                          style:
                            top: 50px
                      - component: oh-button
                        config:
                          action: options
                          text: UID
                          actionItem: =props.UIDItem
                          style:
                            top: 50px
                      - component: oh-button
                        config:
                          action: options
                          text: Presets
                          actionItem: =props.EffektItem
                          style:
                            top: 50px

Antworten