Seite 1 von 1
[GELÖST] EXEC-Binding: Parameter übergeben
Verfasst: 28. Nov 2022 09:08
von nw378
Hallo,
die Befehle, die über das exec Binding ausgeführt werden, müssen ja 1:1 so auch in der whitelist stehen, also bspw.
Code: Alles auswählen
Thing exec:command:Heizung_AUS "Viessmann Betriebswahl 'AUS'" [command="vclient -h 192.168.178.60:3002 -c setBetriebsartTo0"]
Jetzt möchte ich gerne einen variablen Parameter übergeben, bspw. ein Temp.delta. Der Befehl dafür sieht so aus:
(inkl. Hochkommata).
Statt dem Wert "2" möchte ich gerne einen Item-Wert einfügen.
Meine zwei Fragen:
* wie muss das entsprechende Thing aussehen?
* was mache ich mit der whitelist?
Re: EXEC-Binding: Parameter übergeben
Verfasst: 28. Nov 2022 13:01
von udo1toni
Ja, das ist nicht sehr prominent beschrieben, steht aber dennoch in der Doku. Als Platzhalter für den variablen Teil gibst Du %2$s an, was dem aktuellen Inhalt des Input Channels entspricht. %1 enthält aktuelle Zeit und Datum, man kann also z.B. mit %1$tY-%1$tm-%1$td das Datum mit übergeben (im Beispiel dann im Format 2022-11-28), das kann hilfreich sein, wenn man z.B. Dateinamen kreieren will, die eindeutig sein sollen.
Die whitelist enthält immer exakt das angegebene Kommando, also auch mit dem Platzhalter. Du kopierst einfach die Zeile aus der Konfiguration und fügst sie in die whitelist ein.
Re: EXEC-Binding: Parameter übergeben
Verfasst: 28. Nov 2022 15:47
von nw378
Hallo Udo,
und wie immer danke für die schnelle Hilfe!
Wenn man es weiß, kann man das Vorgehen in die Doku hereinlesen.
Leider funktioniert es noch nicht (ganz). Folgendes habe ich gemacht:
.Things
Code: Alles auswählen
Thing exec:command:Heizung_Niveau [command="vclient -h 192.168.178.60:3002 -c 'setNiveauM2 %2$s'"]
.items
Code: Alles auswählen
Number NiveauM2 "Niveau [%s K]" {channel="exec:command:Heizung_Niveau"}
.whitelist
mittels setpoint änder ich den item-Wert. im Logfile wird es korrekt angezeigt. Leider wird's nicht ans Gerät übermittelt.
Ich vermute die Hochkommata als Fehler? Ohne geht es leider nicht...
Re: EXEC-Binding: Parameter übergeben
Verfasst: 28. Nov 2022 17:56
von udo1toni
Eventuell musst Du die Hochkommas escapen, also \'
Das Item muss mit dem input Channel gekoppelt sein.
Re: [GELÖST] EXEC-Binding: Parameter übergeben
Verfasst: 29. Nov 2022 14:56
von nw378
danke, jetzt klappt's!
Es war ein Dreiklang an Änderungen nötig:
1.: dass "den Input zu koppeln" bedeutet. den Item-Wert an den Parameter %2$s zu übermitteln, hatte ich nicht auf dem Schirm.
Ich hatte stattdessen gehofft, dass bei Änderung des Items (mittels Setpoint) automatisch der Befehl gesendet würde.
2.: Escapen \'
3. müssen input und Ausführen des Befehls zwingend in zwei verschiedene rules (ich hatte es zunächst in einer versucht).
So geht's:
Code: Alles auswählen
String Niveau_txt {channel="exec:command:Heizung_Niveau:input"}
Switch Niveau_aendern {channel="exec:command:Heizung_Niveau:run", autoupdate="false"}
String Niveau_Out {channel="exec:command:Heizung_Niveau:output"}
Code: Alles auswählen
rule "Heizung: Niveauänderung iOS App"
when Item NiveauM2 changed
then
Niveau_txt.sendCommand(NiveauM2.state.toString)
end
rule "Heizung: Niveauänderung senden"
when Item Niveau_txt received command then
Niveau_aendern.sendCommand(ON)
end
Code: Alles auswählen
Thing exec:command:Heizung_Niveau [command="vclient -h 192.168.178.60:3002 -c \"setNiveauM2 %2$s\""]
Re: [GELÖST] EXEC-Binding: Parameter übergeben
Verfasst: 29. Nov 2022 15:17
von udo1toni
Nein, Du brauchst nur eine Rule.
Streng genommen brauchst Du gar keine Rule
Punkt eins: Du musst im exec Thing lediglich
autorun auf
aktiv setzen, damit wird der Befehl automatisch ausgeführt, sobald der Input Channel einen Wert zugewiesen bekommt.
Punkt zwei: Da Du den
unveränderten Wert aus dem Item
NiveauM2 übernehmen willst, reicht es, einen Link vom Input Channel zum Item
NiveauM2 anzulegen und in diesem Link das
Profile auf
follow zu setzen.
Fortan wird jede Änderung im Item NiveauM2 sofort als Befehl an den Input Channel weitergeleitet, der wiederum wegen autorun den hinterlegten Befehl ausführt.
Re: [GELÖST] EXEC-Binding: Parameter übergeben
Verfasst: 29. Nov 2022 16:37
von nw378
So hatte ich es auch angedacht. Die Lösung mit zwei rules habe ich aus der Doku. Wie gesagt, beide Befehle in einer funktionierte - wieso auch immer - nicht.
"profile" kannte ich noch nicht.
So siehts jetzt aus:
Code: Alles auswählen
Number NiveauM2 "Niveau [%.1f]" {channel="exec:command:Heizung_Niveau:input" [profile="follow"]}
Code: Alles auswählen
Thing exec:command:Heizung_Niveau [command="vclient -h 192.168.178.60:3002 -c \"setNiveauM2 %2$s\"", autorun=true]
So klappt's leider nicht. Und es liegt wohl daran, dass das item eine Number ist. Die Doku sagt:
Attention: Linking input to any other item type than String will result in erroneous behavior. If needed, please use a rule to convert your item's state to a string. Also note that only commands (e.g. sendCommand) to the input channel are recognized, updating the item's state will not work (e.g. postUpdate).
Also muss doch zumindest eine Regel her, die aus der Zahl einen String macht. Damit läuft's dann aber.
Re: [GELÖST] EXEC-Binding: Parameter übergeben
Verfasst: 29. Nov 2022 19:28
von udo1toni
Das sollte aber nicht so sein. das Profile "follow" sorgt dafür, dass des Status als Command gewertet wird. openHAB sollte eigentlich automatisch nach String wandeln... Nun ja... eine Rule ist besser als zwei Rules
