Wie wird ein "leerer" Schalter verlinkt?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Norick
Beiträge: 252
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von Norick »

udo1toni hat geschrieben: 7. Okt 2023 20:33 ODER Als Exec Thing. Im Command Parameter wird die gesamte Befehlszeile OHNE trennende Kommata und OHNE Anführungszeichen angegeben.
Ich habe die Zeile exakt wie benötigt im vorigen Post hingeschrieben.
Ich habe das schon gelesen bzw. die Zeile die du geschrieben hast, hat doch keine Parameter welche dem Write.bat mitgegeben werden oder? Ich muss dem Write.bat zwei Paramter mitgeben damit dieses funktioniert. Das sind: "chn3" UND "ON" bzw. "OFF".

Diesen Punkt verstehe ich eben nicht wie ich geschrieben habe. Ich sehe zwar dass hier ein "%2$s" steht aber ich nehme an hier steht nur "ON" oder "OFF" drinnen - oder nicht?

Wenn dann das Thing steht, wie kann ich danach ein Switch-Item erzeugen? Ich habe ein solches Item erstellt kann dann aber mit "Add Link" keine Verbindung auf das Thing erstellen.

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

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von udo1toni »

Das hast Du konfiguriert:

Code: Alles auswählen

command: C:\\Windows\\System32\\cmd.exe /c "D:\\Write.bat", "chn3", %2$s
//                                         ^             ^^ ^    ^^
// keine Anführungszeichen! Keine Kommata!
Die vollständige Zeile mit dem statischen Parameter chn3 muss stattdessen so aussehen:

Code: Alles auswählen

command: C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat chn3 %2$s
Und in die exec.whitelist gehört dann entsprechend diese Zeile

Code: Alles auswählen

C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat chn3 %2$s
Es sei denn, die Batchdatei selbst verlangt Anführungszeichen um den Parameter, dann allerdings müssen die Anführungszeichen escaped werden (was auch der Grund ist, warum die Backslashes doppelt angegeben werden müssen - der Backslash ist das Excape-Zeichen). Das sähe dann so aus:

Code: Alles auswählen

command: C:\\Windows\\System32\\cmd.exe /c D:\\Write.bat \"chn3\" \"%2$s\"
Die whitelist müsste entsprechend angepasst werden.

Anschließend musst Du den Input Channel mit einem Switch Item verlinken.

Aber noch mal einen Schritt zurück (auch auf die Gefahr hin, wieder Verwirrung zu stiften...) chn3 klingt für mich danach, als gäbe es noch mehr Channel, die identisch gesteuert werden. Da wäre vermutlich die Rule tatsächlich die bessere Option, denn man kann es so drehen, dass man einen Teilstring aus dem Itemnamen als Parameter verwenden kann. Wenn Du also z.B. acht Switch Items hast, die die Namen Switch_chn1 bis Switch_chn8 haben, könntest Du diese in einem Group Item zusammenfassen (z.B. gSwitches) und dann diesen Code verwenden (Hier als DSL in einem Textfile):

Code: Alles auswählen

rule "sende an Switches"
when
    Member of gSwitches received command
then
    val strCh = triggeringItem.name.split("_").get(1)
    executeCommandLine(Duration.ofSeconds(2),"C:\\Windows\\System32\\cmd.exe", "/c", "D:\\Write.bat", strCh, receivedCommand.toString)
end
Diese eine Rule kümmert sich ab sofort um ALLE 8 Switch Items.
Zwischen den Schlüsselworten when und then stehen alle Trigger, die diese Rule auslösen, in diesem Fall also "ein Angehöriger der Gruppe gSwitches hat einen Befehl empfangen" (Das Umlegen eines Schalters in der UI wäre so ein Befehl)
Zwischen den Schlüsselworten then und end steht der gesamte auszuführende Code.
In der ersten Zeile wird aus dem Namen des Items, welches die Rule getriggert hat (das ist NICHT gSwitches, sondern der Member) der Teilstring zwischen dem 1. und dem 2. Unterstrich ermittelt und in einer lokalen Konstanten strCh gespeichert. Da es keinen zweiten Unterstrich gibt, ist das also der restliche String bis zum Ende des Namens, also chn1 bis chn8.
In der zweiten Zeile wird die Batchdatei aufgerufen, mit einer Wartezeit von zwei Sekunden, d.h. wenn das Script nicht nach zwei Sekunden fertig ist, wertet openHAB das als Fehler und protokolliert diesen.
Im Aufruf werden die lokale Konstante strCh sowie der empfangene Befehl zusammen mit dem Befehl übergeben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 252
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von Norick »

Danke für die Antwort. Ja es stimmt ich habe am Ende 4 Channels. Ich habe versucht das GroupItem über das UI zu erstellen. Das Item habe ich als GroupItem soweit erstellt aber mit den Detaileinstellung komme ich noch nicht klar.

Kann ich dies über die UI überhaupt machen?

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

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von udo1toni »

Ja, Du kannst alles über die Main UI Administration erledigen. Es gibt tatsächlich nur noch sehr wenige Dinge, die nicht, oder nur mit Abstrichen über die UI erledigt werden können :)
Notwendige Schritte für die Lösung OHNE exec Binding:
  1. Alle Items für die Channel anlegen (das sind vier Items für die einzelnen Schalter, darauf achten, dass die Items vom Typ Switch sind und im Namen jeweils an der gleichen Stelle eineindeutige Kennung enthalten, also z.B. Licht_chn1, Steckdose_chn2, Licht_chn3 und MeinTollesItem_chn4_Master.
  2. Das Group Item anlegen, welches die Items zu einer Gruppe zusammenfasst. Der Typ dieses Items ist egal, es wird lediglich verwendet, um die Items zu gruppieren, z.B. gMeineSwitches
  3. Die Items aus Punkt 1 dem Group Item aus Punkt 2 zuordnen
  4. Eine Rule anlegen und als Trigger auswählen, dass eine Member des Group Items aus Punkt 2 einen Befehl empfangen hat.
    Als Action (also was passieren soll, wenn der Trigger ausgelöst wird), wählst Du Script aus (und achtest darauf, dass Du eine DSL Rule verwenden willst - es gibt da auch andere Optionen)
  5. Als Script gibst Du dann

    Code: Alles auswählen

    val strCh = triggeringItem.name.split("_").get(1)
        executeCommandLine(Duration.ofSeconds(2),"C:\\Windows\\System32\\cmd.exe", "/c", "D:\\Write.bat", strCh, receivedCommand.toString)
    
    ein.
Danach verlinkst Du die Items noch mit Widgets in der UI, anschließend sollte es möglich sein, mit dem jeweiligen Item den Befehl ON bzs. OFF auf den passenden Channel zu senden.
Der Trick besteht wie gesagt darin, dass im Itemnamen (hier an zweiter Stelle) der eigentliche Channelname (also chn1 bis chn4) steht, das Script trennt den Namen des Items passend auf, um den Channelnamen an die Batchdatei senden zu können.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Norick
Beiträge: 252
Registriert: 31. Jan 2022 06:35
Answers: 0

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von Norick »

Vielen Dank für die genaue Erklärung - jetzt habe ich es auch (endlich) geschafft und ich kann wie beschrieben die 4 Items per Rule ein- und ausschalten!!!

Jetzt fehlt nur noch ein "Puzzleteil" mit der Squeezelite-X aber dazu mache ich wohl besser einen neuen Eintrag :)

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

Re: Wie wird ein "leerer" Schalter verlinkt?

Beitrag von udo1toni »

Ja, das ist ein anderes Thema :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten