Seite 1 von 2

Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 13. Nov 2017 18:13
von chris_007
Hallo liebe Community!

Beschäftige mich jetzt nun seit 3 Tagen mit Openhab 2. Ich ziehe bald um und möchte in der neuen Wohnung gerne ein bischen "Automatisierung". Das dauert noch ein wenig aber ich habe mir gedacht ich kann ja schonmal etwas rumexperimentieren. Es ist komplizierter als erwartet :lol:

Zur Hardware:
Raspberry Pi 3 mit Openhabian
433 Mhz Funksteckdosen
433 Mhz Sender & Empfänger (Beide funktionieren, kann mit 2 Instanzen SSH ein Befehl senden und empfangen)

Nun zu meinem Problem mit diesem Exec-binding

Ich bekomm es einfach nicht auf die Reihe das ich die Funksteckdose über Openhab an und ausschalte. Habe mittlerweile alle Tutorials durch und ich schaffs einfach nicht :D
Die Steckdose lässt sich über die Console mit raspberry-remote einwandfrei an und ausschalten.

Kann mir bitte jemand eine funktionierende Things Items und Sitemap (und evtl script) zeigen so das ich verstehen kann was ich falsch mache?

Danke schonmal im vorraus

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 13. Nov 2017 21:57
von seppy
Hi,
schreib uns doch mal was Du schon gebaut hast. Grüne Wiese ist immer schwierig...
Grüße Seppy


Gesendet von iPhone mit Tapatalk

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 15. Nov 2017 00:01
von chris_007
Habs jetzt mit einem weitern Tutorial lauffähig aber das is ja mal mega aufwendig. Geht das nicht einfacher? Lese immer was von einem alten exec-binding das wesentlicher einfacher aussieht. Kann man das verwenden? Wenn ja wie?Hab ich dadurch dann nachteile


Things

Code: Alles auswählen

Thing exec:command:Licht_Flur [command="/opt/raspberry-remote/send %2$s",interval=0, autorun=true]
Items

Code: Alles auswählen

//Licht Flur Anfang
Switch Licht_Flur <light>
Switch Licht_Flur_run {channel="exec:command:Licht_Flur:run"}
String Licht_Flur_Args {channel="exec:command:Licht_Flur:input"}
String Licht_Flur_Out {channel="exec:command:Licht_Flur:output"}
//Ende
Rules

Code: Alles auswählen

rule "Licht Flur"
	when
Item Licht_Flur received command
	then
if(receivedCommand == ON){
	Licht_Flur_Args.sendCommand("11111 1 1")
	}else{
		Licht_Flur_Args.sendCommand("11111 1 0")
}
//wait
while(Licht_Flur.state !=OFF){
	Thread::sleep(500)
}
end
Sitemap

Code: Alles auswählen

sitemap default label="Home"
{
	Frame label="Wohnung"
	{
	Switch item=Licht_Flur label="Licht Flur"
	}
	Frame label="Garage"
	{
	Switch item=Garage label="Garage" 
	}
}
Ignoriert bitte den Garage Switch bin natürlich am weiterbauen ;)

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 23. Nov 2017 20:53
von aprilia2003
Nabend
Habe deine Skripte bei mir mal eingetragen.
Im PaperUI bekomme ich es unter contol auch angezeigt aber leider lässt sich da nichts schalten.
Die 11111 1 usw habe ich natürlich ersetzt durch meine Adresse der Dosen.
Muss ich sonst noch irgendwas installieren um es zum laufen zu bekommen?

mfg Dennis

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 30. Apr 2018 11:56
von Thunder1973
Hallo Chris,

hast Du es hinbekommen?

Ic hstehe gerade vor dem selben Problem.
Kannst Du ggf. Deine Konfig posten?

Things
Items
Rules
etc?

Ich würde das dann entsprechend anpassen.
Das wäre echt klasse :-)

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 28. Okt 2018 17:02
von Joe
Hi zusammen,
BINGO habe das selbe Problem, wäre auch an Things, Items und Rules interessiert.
VG
Joe

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 9. Nov 2018 14:30
von NicoH
Gibt es hier schon neuigkeiten ? Habe das selbe Problem !

Habe einen Nanacul 433 mhz an USB01 hängen und komme nicht weiter :(

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 11. Dez 2018 15:36
von webguards
Ich hab es einfach so gelöst
Virtueller Schalter (ohne Things)
items

Code: Alles auswählen

Switch	CasSW08	"3. Casa 08[%s]"	<wallswitch>	(gCasa,gNew)
rules

Code: Alles auswählen

rule	"08 Switch ON" 	 when Item CasSW08 received command ON   then  executeCommandLine("bash /etc/openhab2/scripts/casa.sh 08 ON") end
rule	"08 Switch OFF" when  Item CasSW08 received command OFF  then  executeCommandLine("bash /etc/openhab2/scripts/casa.sh 08 OFF") end
Die habe ich mit 20 Aktoren vervielfältigt

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 11. Dez 2018 19:37
von udo1toni
Viele Wege führen nach Rom... ;)

Grundsätzlich braucht man für einen Funkschalter ein Item. Mit dem exec Binding kann man es so drehen, dass der Zustand des Items von der Rückmeldung eines (zyklisch ausgeführen) Scripts gesetzt wird, während ein Schaltbefehl ein (anderes) Script aufruft. Dabei ist das exec2 Binding mächtiger als das exec1 Binding, dafür ist es leider auch grottig zu konfigurieren.

Wer das exec2 Binding verwenden will, kann es direkt installieren. Wer exec1 verwenden will, muss zuerst Legacy Bindings aktivieren, anschließend sollte exec1 in der Liste installierbarer Bindings auftauchen.

Das exec1 Binding wird direkt in der Item Definition konfiguriert, die Konfiguration muss zwingend über Textdatei erfolgen und sieht dann so aus:

Code: Alles auswählen

Switch mySwitch "Mein Exec Switch [%s]" {exec="<[<commandLine to execute>:<refreshintervalinmilliseconds>:(<transformationrule>)] >[ON:<commandLine to execute>] >[OFF:<commandLine to execute>]"}
Wahlweise kann man auch statt ON und OFF ein * mit angeben und muss dann halt im Aufruf einen Platzhalter verwenden, um den Befehl an das Script zu übergeben. Jeder der Parameter ist optional, man muss also nicht zwingend eine Rückmeldung abholen oder einen (oder mehrere) Schaltbefehl(e) senden.
Im vorliegenden Fall könnte man ein Item so definieren:

Code: Alles auswählen

Switch CasSW08 "3. Casa 08[%s]" <wallswitch> (gCasa,gNew) {exec=">[*:bash /etc/openhab2/scripts/casa.sh 08 %2$s]"}
Leider bekommt man aber keine Rückmeldung, es sei denn, man baut das im externen script extra ein und ruft es entsprechend auch extra auf. An dieser Stelle ist das exec2 Binding im Vorteil, denn es kann den Rückgabewert eines Scripts auswerten.
Damit das aber möglichst universell funktioniert, ist hier die Herangehensweise komplett anders.
Bei exec2 wird ein Thing definiert, das enthält das Script. Dazu gibt es definierte Channel, nämlich input, output, exit, run und lastexecution.
Über den input Channel wird der Parameter übergeben, mit dem das Script aufgerufen wird (natürlich kann man mehrere Parameter übergeben, man muss sie aber zuerst zu einem Parameter zusammenfassen, mit Leerzeichen als Trenner)
Über den Output Channel bekommt man die Ausgabe des letzten Aufrufs, falls das Script eine Ausgabe hatte.
Über Exit bekommt man den Exit-Status des letzten Aufrufs, allgemein ist 0 ein OK und alles ungleich 0 ein Fehler.
Mit dem run Channel wird das Script gestartet bzw. kontrolliert, ob es gerade läuft.
Mit dem lastexecution Channel schließlich bekommt man den Zeitstempel des letzten Aufrufs.

Man kann das Thing so konfigurieren, dass bei Update des input Channels automatisch ein run erfolgt, dann reicht es also, den Switch mit dem input Channel zu verlinken, und das Script wird jedesmal beim Betätigen des Switches entweder mit dem Parameter ON oder mit dem Parameter OFF aufgerufen.
Eines der Probleme dabei ist, dass der Input Channel vom Typ String ist, man kann also den Input Channel gar nicht direkt mit einem Switch Item verbinden. Die Rückmeldung kommt auf einem anderen Channel an, auch das verursacht eventuell Kopfschmerzen. Man wird vermutlich eine openHAB Rule verwenden, um ein ungebundenes Switch Item jeweils auf den korrekten Stand zu bringen (mit .postUpdate) und eine weitere Rule, um bei Betätigen des ungebundenen Items den Input zu setzen und gegebenenfalls auch den run-Befehl zu schicken.

Ich habe selbst bisher exec2 auch gemieden, wie der Teufel das Weihwasser :) aber grundsätzlich funktioniert das schon.

Die Alternative, das Ganze mit Rules und der executeCommandline Action zu erledigen, funktioniert natürlich auch, allerdings sollte man dann zumindest die Rule etwas eleganter gestalten.
Pro Schalter ein Item, die Namen sind dabei so gewählt, dass alle Items den Anfang ihres Namens mit einem _ von einer fortlaufenden Nummer trennen. Alle Items befinden sich in der Gruppe gCasa (der Name ist selbstverständlich frei wählbar), also etwa so:

Code: Alles auswählen

Group gCasa
Switch CasSW_08 "3. Casa 08[%s]" <wallswitch> (gCasa,gNew)
Switch CasSW_09 "4. Casa 09[%s]" <wallswitch> (gCasa,gNew)
Switch nochEiner_10 "5. Casa 10[%s]" <wallswitch> (gCasa)
und eine (1) Rule (!)

Code: Alles auswählen

rule "execute commandlines"
when
    Member of gCasa received command  // Member of gibt es seit OH2.3
then
                                                                 // triggeringItem gibt es schon länger, das Item, welches die Rule getriggert hat
    val String mySwitch = triggeringItem.name.split("_").get.(1) // es darf nur exakt ein _ vorkommen, dafür ist der Code simpel ;)
    val String myCommand = "bash /etc/openhab2/scripts/casa.sh " + mySwitch + " " + receivedCommand.toString
    executeCommandLine(myCommand)
end
Wahlweise kann man das auch auf eine (lange) Zeile bringen ;), der Punkt ist aber, man braucht nur diese eine Rule für alle gleich zu steuernden Funkschalter.

Re: Anfänger am verzweifeln, Funksteckdosen schalten/Exec Binding

Verfasst: 31. Dez 2018 16:11
von littlekenny
Ändere mal die Regel wie folgt ab:

Code: Alles auswählen

rule "Licht Flur"
	when
Item Licht_Flur changed
	then
if(Licht_Flur.state == ON) {
	Licht_Flur_Args.sendCommand('1') //Die 1 durch deinen Code ersetzten
	} else {
	Licht_Flur_Args.sendCommand('2') //Die 2 durch deinen Code ersetzten
}
//wait
while(Licht_Flur.state !=OFF) {
	Thread::sleep(500)
}

//Trigger execution
Licht_Flur.sendCommand('1')

//Logging
logInfo("Your Command Exec", "Result:" + Licht_Flur_Out.state)

end
Die Sitemap sollte dann so aussehen:

Code: Alles auswählen

Switch item=Licht_Flur      label="Licht Flur" mappings=["ON"="ON", "OFF"="OFF"]
Die items Datei so:

Code: Alles auswählen

Switch Licht_Flur "Licht Flur" <light> (PL_Steckdosen)
Switch Licht_Flur_run {channel="exec:command:Licht_Flur:run"}
String Licht_Flur_Args {channel="exec:command:Licht_Flur:input"}
String Licht_Flur_Out {channel="exec:command:Licht_Flur:output"}
die Things Datei:

Code: Alles auswählen

Thing exec:command:Licht_Flur "Licht Flur" [command="/opt/433Utils/RPi_utils/send %2$s", interval=0, autorun=true]
eventuell musst du den Pfad zur "codesend" Datei noch anpassen, wenn es bei dir woanders installiert ist!

Installiert habe ich das neue Exec Binding für 2.4.0

Damit läuft es bei mir ohne Probleme, nachdem ich die rule angepasst hatte.

Gruß, littlekenny