OpenHAB-kleinere Widgets
Die folgenden kleineren Widgets sind weniger zur direkten Nutzung gedacht, als mehr zum Darstellen von Möglichkeiten. Diese Punkte sind mir untergekommen beim Erstellen meines Widget OpenHAB Animation zur Sun2000. Sie sind teilweise mit englischen Texten versehen, dann habe ich sie auch in der OpenHAB Community veröffentlicht.
Animationen in OpenHAB
uid: ud_animation_widget
tags:
- Animation Widget V 2.0
props:
parameters:
- default: 1;0
description: Direction of animation
name: direction
required: false
type: TEXT
limitToOptions: true
options:
- label: forward
value: 0;1
- label: backwards
value: 1;0
- default: 8s
description: duration of animation
label: Animationsdauer
name: duration
required: false
type: TEXT
options:
- label: 1 second
value: 1s
- label: 4 seconds
value: 4s
- label: 8 seconds
value: 8s
- label: 16 seconds
value: 16s
parameterGroups: []
timestamp: Mar 28, 2024, 12:27:25 PM
component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
height: auto
text-align: center
width: 200px
title: Watch animation!
footer: =props.duration+((props.direction=='0;1')?' forward':' backwards')
slots:
content:
- component: svg
config:
style:
width: 200px
height: 110px
xmlns: http://www.w3.org/2000/svg
slots:
default:
- component: path
config:
d: M0,15 h20 q60,0 60,45 t60,45 h20
fill: none
id: examplepath
stroke: orange
stroke-width: 1
- component: circle
config:
fill: orange
r: 6
visible: true
slots:
default:
- component: animateMotion
config:
dur: =props.duration
keyPoints: =props.direction
keyTimes: 0;1
repeatCount: indefinite
calcMode: linear
slots:
default:
- component: mpath
config:
xlink:href: "#examplepath"
Die Animation besteht aus vier Komponenten innerhalb eines übergeordneten Elements.
- Die erste Komponente beschreibt den Pfad (component: path)
- die zweite Komponente beschreibt das Objekt, das bewegt wird (component: circle)
- die dritte Komponente beschreibt die Bewegung (component: animateMotion)
- die vierte Komponente bindet die Animation an den Pfad (component: mpath) über die id: examplepath
Die erwähnten Schlüsselwörter in der Auflistung sind SVG-Elemente. Die Dokumentation zu SVG-Elementen finden Sie auf der Mozilla-Website: SVG-Attribut-Referenz.
Eine kurze Beschreibung des Pfades, hier wird die Linienzeichnung beschrieben:
d: M0,15 h20 q60,0 60,45 t60,45 h20
Konkret wird hier folgendes definiert (das Komma steht immer zwischen den Komponenten eines Punktes)
- Bewegen zu Punkt (0,15)
- Linie horizontal 20 Punkte
- Quadratische Bézierkurve zum Punkt (60,45) mit dem Kontrollpunkt (60,0)
- Quadratische Bézierkurve wie oben, aber gespiegelt am Punkt (60,45)
- Horizontale Linie 20 Punkte
Sie können die Bewegungsrichtung und die Geschwindigkeit über die props settings anpassen, aber die Animation sollte auch ohne weitere Eingaben funktionieren.
Mich interessierte vor allem die Möglichkeit, mit BOOLEAN-Parametern zu arbeiten und die Optionen für TEXT-Parameter.
Widget mit PupUp aus dem gleichen widget
uid: ud_popup_widget_text
tags: []
props:
parameters: []
parameterGroups: []
timestamp: Mar 20, 2024, 10:16:53 PM
component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
text-align: center
width: 200px
title: Klick text in box to test
slots:
default:
- component: oh-link
config:
action: popover
popoverOpen: ="#infopopup"
style:
font-size: 22px
text: Klick here
- component: f7-popover
config:
id: infopopup
closeByBackdropClick: true
closeByOutsideClick: true
closeOnEscape: true
style:
color: blue
height: auto
width: 250px
slots:
default:
- component: oh-list
config:
simpleList: false
slots:
default:
- component: oh-list-item
config:
title: You did it ;-)
- component: oh-list-item
config:
title: Bravo!
Die Auflistung besteht aus zwei Teilen
- die erste Hälfte erzeugt einen klickbaren Text
- die zweite Hälfte generiert das Popup
Die beiden Hälften sind über den Klassenbezeichner infopopup verbunden
Ich habe alle Parameter im Listing weggelassen, damit es direkt im Entwicklungsfenster getestet werden kann.
Man kann auch ein Icon anklickbar machen, aber das Problem dabei ist, dass der oh-link nur f7-Icons zulässt. Aber oh-link hat einen Slot, durch den man andere Elemente, wie z.B. ein oh-icon, integrieren kann.
uid: ud_popup_widget_icon
tags: []
props:
parameters: []
parameterGroups: []
timestamp: Mar 20, 2024, 10:45:43 PM
component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
text-align: center
width: 200px
title: Klick icon in box to test
slots:
default:
- component: oh-link
config:
action: popover
popoverOpen: ="#infopopup"
slots:
default:
- component: oh-icon
config:
height: 70px
icon: if:game-icons:push
- component: f7-popover
config:
id: infopopup
closeByBackdropClick: true
closeByOutsideClick: true
closeOnEscape: true
style:
color: blue
height: auto
width: 250px
slots:
default:
- component: oh-list
config:
simpleList: false
slots:
default:
- component: oh-list-item
config:
title: You did it ;-)
- component: oh-list-item
config:
title: Bravo!
Arbeiten mit Variablen oder genauer Konstanten in widgets
Basierend auf mehreren Beiträgen von @JustinG habe ich eine Liste von verschiedenen Möglichkeiten zusammengestellt, mit Variablen bzw. Konstanten in Widgets zu arbeiten:
Parameter
Die Verwendung von Parametern ist ein einfacher Weg:
uid: ud_constant_widget_props
tags: []
props:
parameters:
- default: ="This is "+"the first line"
name: mytext
required: false
type: TEXT
parameterGroups: []
timestamp: Mar 23, 2024, 5:43:07 PM
component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
width: 200px
slots:
default:
- component: oh-list
config:
simpleList: false
slots:
default:
- component: oh-list-item
config:
title: =props.mytext
- component: oh-list-item
config:
title: This is the second line
Es gibt einige Nachteile:
- die Werte können nicht berechnet werden (siehe Screenshot)
- mindestens 4 Zeilen Code
oh-repeater
Der von @JustinG mehrfach beschriebene Weg verwendet oh-repeater:
uid: ud_constant_widget_repeater
tags: []
props:
parameters: []
parameterGroups: []
timestamp: Mar 23, 2024, 5:38:55 PM
component: oh-repeater
config:
for: dummy
sourceType: array
in:
- mytext1: ="This is "+"the first line"
mytext2: ="This is "+"the second line"
fragment: true
slots:
default:
- component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
text-align: center
width: 200px
color: black
slots:
default:
- component: oh-list
config:
simpleList: false
slots:
default:
- component: oh-list-item
config:
title: =loop.dummy.mytext1
- component: oh-list-item
config:
title: =loop.dummy.mytext2
Vorteile:
- die Werte können berechnet werden
- weniger Code auch bei mehreren Daten
oh-link
Der Beitrag Multiple Widget Actions hat mich dazu inspiriert, einen dritten Ansatz zu versuchen.
Allerdings erfordert dieser Ansatz, dass die Konstanten in einem Popup oder einem ähnlichen Konstrukt verwendet werden, da ein Mausklick notwendig ist.
uid: ud_constant_widget_oh-link
tags: []
props:
parameters: []
parameterGroups: []
timestamp: Mar 23, 2024, 5:36:12 PM
component: oh-link
config:
action: variable
actionVariable: mytext
actionVariableValue: ="This is "+"the second line"
style:
pointer-events: none
slots:
default:
- component: f7-card
config:
style:
border: 3px solid green
border-radius: 20px
text-align: center
width: 200px
color: black
title: Klick text in box to test
slots:
default:
- component: oh-link
config:
action: popover
popoverOpen: ="#infopopup"
style:
font-size: 22px
pointer-events: auto
text: Klick here
- component: f7-popover
config:
id: infopopup
closeByBackdropClick: true
closeByOutsideClick: true
closeOnEscape: true
style:
color: blue
height: auto
width: 250px
slots:
default:
- component: oh-list
config:
simpleList: false
slots:
default:
- component: oh-list-item
config:
title: This ist the first line
- component: oh-list-item
config:
title: =vars.mytext
Die Auflistung ist etwas umfangreicher, da ich ein Popup benötige, damit dies Sinn macht.