Seite 1 von 2
WLED Binding Save Preset
Verfasst: 3. Nov 2021 07:43
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
Re: WLED Binding Save Preset
Verfasst: 3. Nov 2021 13:12
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.
Re: WLED Binding Save Preset
Verfasst: 4. Nov 2021 07:38
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
Re: WLED Binding Save Preset
Verfasst: 5. Nov 2021 10:47
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?
Re: WLED Binding Save Preset
Verfasst: 5. Nov 2021 12:33
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.
Re: WLED Binding Save Preset
Verfasst: 6. Nov 2021 01:33
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
Re: WLED Binding Save Preset
Verfasst: 8. Nov 2021 16:11
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
Re: WLED Binding Save Preset
Verfasst: 8. Nov 2021 18:37
von udo1toni
Prima!
Re: WLED Binding Save Preset
Verfasst: 9. Nov 2021 10:04
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.
Re: WLED Binding Save Preset
Verfasst: 14. Dez 2021 14:27
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