Shelly Trigger in Text rule

Geflasht oder ungeflasht ...

Moderator: seppy

Antworten
mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Shelly Trigger in Text rule

Beitrag von mad-mike »

Hallo zusammen. ;)

Ich habe in den letzten tagen noch ein paar shelly verbaut und mittels rule verknüpft.

Ich frage mich: Wie kann ich in einer Text Rule ein When: ""Shelly LONG_PRESSED"" abfragen?

Ich habe derzeit das über die Oberfläche gemacht und mit DSL dann verknüpft..: Hier mal ein Beispiel:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      event: LONG_PRESSED
      channelUID: shelly:shellydevice:483fda9440a9:relay#button
    type: core.ChannelEventTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: HTTPURLThing_km1.sendCommand(if(HTTPURLThing_km1.state != ON) ON else
        OFF)
    type: script.ScriptAction
Ich möchte gerne alles in eine DSL rule schreiben.


Kann mir einer einen Tipp geben? :?:

Danke und Gruss 8-)
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 402
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Shelly Trigger in Text rule

Beitrag von mad-mike »

Habe es nach langem Suchen hinbekommen. Problem ist auch, das ich nicht so richtig wusste nach was ich suchen muss... :oops:

Code: Alles auswählen

rule "X Außenlampe"
when
    Channel "shelly:shellydevice:483fda9440a9:relay#button" triggered LONG_PRESSED
then
HTTPURLThing_km1.sendCommand(if(HTTPURLThing_km1.state != ON) ON else OFF)
end
Jetzt noch 2 Fragen: Spielt es eine Rolle, ob man die Rule SO oder SO schreibt?? (Unterschied Beitrag 1 und Beitrag 2 in diesem Thema)

2te frage:
Sollte ich für jede Rule eine Datei anlegen? habe nun mehrere Lampen ""Verknüpfungen"" in einer Rule Datei.
Gruss mad-mike

openHABian 4.1.1 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Shelly Trigger in Text rule

Beitrag von udo1toni »

Zur Frage "spielt es eine Rolle" kann man eine ganz klare Antwort geben: Das kommt darauf an. :D

Grundsätzlich sollte es erst mal keinen Unterschied machen, ob Du eine Rule über UI oder über Text generierst. Wenn Du eine DSL Rule in der UI anlegst, definierst Du den when-Teil der Rule über den When-Block in der UI, der Then-Block der UI-Rule (mit DSL als Sprache) enthält dann exakt die Befehle, welche im then-Teil der Rule definiert wurden-

Allerdings gibt es eine Sache, die in der UI nicht zur Verfügung steht, das sind globale Variablen. Und es gibt bestimmte Rules, welche darauf angewiesen sind, globale Variablen zu nutzen. Ein Workaraound für einen Teil dieser Rules kann sein, zum Speichern und einlesen jeweils Items zu nutzen, das kann sogar von Vorteil sein, weil man ein Item leicht persistieren kann und so der Wert einer Variablen sogar über einen Programm Neustart hinaus erhalten bleiben kann. Aber durch das asynchrone Design handelt man sich auch Nachteile ein, weil man z.B. nicht einfach ein Item zum Speichern und anschließendem Auslesen verwenden darf z.B.:

Code: Alles auswählen

Item.postUpdate((Item.state as Number) + 10)
if((Item.state as Number) > 100)
    // mach was bestimmtes
Außerdem ist ein globale Variable viel einfacher nutzbar. Funktionsgleicher Code:

Code: Alles auswählen

i += 10
if(i > 100)
    // mach was bestimmtes
Und bei der Verwendung von Timern gibt es keine Möglichkeit, die globale Variable zu vermeiden. Wenn Du also eine Zeitverzögerung einbauen willst, musst Du entweder auf expiration ausweichen oder eine DSL Rule in einer Textdatei definieren.
Und die expration arbeitet mit fixen Zeiten, es gibt keinen einfachen Weg, die Verzögerung zu manipulieren (also z.B. warte tagsüber 15 Sekunden, aber abends 10 Minuten, oder: beim ersten Mal direkt, danach für eine halbe Stunde alle 5 Minuten, danach alle 30 Minuten, oder, oder, oder)

Du kannst beliebig viele Rules in einer Datei anlegen - das wird auch durch den Dateinamen angedeutet... *.rules <-
Wenn Du Rules über mehrere Dateien verteilst, musst Du bei Verwendung globaler Variablen darauf achten, dass alle Rules, die eine globale Variable nutzen gemeinsam in einer Datei definiert sind, das hängt mit der strikten Definition der Variablen zusammen (der Interpreter wird meckern, weil er keine Definition der Variablen innerhalb der Datei findet - andererseits darf die Variable aber auch nicht mehrfach definiert werden...)

Eine ganz wichtige Sache: DSL Rules bieten mächtige Funktionen, um sich viel Arbeit zu ersparen, insbesondere, wenn man mehrere fast identische Rules hat, die sich nur durch Itemnamen unterscheiden. Ich habe z.B. Raumtemperaturregler, welche leider beim Setzen des Modus einen anderen Wert benötigen als beim Lesen geliefert wird (geschrieben wird ein Wert i = 1 bis 4, gelesen wird ein Wert 32 + 2^i, also 33, 34, 36 oder 40). Ich habe neun gleichartige RTR und müsste nun neun Rules schreiben, um beim Hochfahren des Systems (oder wenn ich die Bedienung lokal am Gerät vornähme) in openHAB jeweils den Status passend umzurechnen. Es reicht aber eine einzige Rule, in der nicht mal ein konkreter Itemname verwendet wird :).
In der UI sind solche Rules aber genauso möglich, das ist kein Alleinstellungsmerkmal der DSL Text Rules.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten