Separate Befehle für an und aus

Begonnen von Pati_Alpha, 14 Oktober 2016, 19:05:18

Vorheriges Thema - Nächstes Thema

Pati_Alpha

Hey Leute,

mein FHEM Projekt läuft bisher gut dank euch! :) Aber hier kommt eine echte Neulingsfrage!

Ich habe jetzt per pilight-debug die raw-codes meiner eher schlecht steuerbaren Steckdosen von REV und TOOM herausgefunden und die entsprechenden raw-codes gespeichert, sodass ich meine Dosen zB über
pilight-send -p raw -c "123 123 123" einschalten und über
pilight-send -p raw -c "456 456 456" ausschalten kann, wobei die Zahlen repräsentativ für den entsprechenden (länglichen) raw-code stehen.

Mein Problem ist jetzt folgendes:
Andere Dosen definiere ich in FHEM zB so:
define RegalLampe GenShellSwitch /usr/bin/send 11111 4 1 0
attr RegalLampe group Licht
wobei hier 11111 ein Hauscode wäre, 4 mein Unitcode und 1 und 0 die entsprechenden Anhängsel an den Befehl fürs Ein- und Ausschalten.

Ich frage mich aber nun, wie ich es integrieren kann, für das Ein- und Ausschalten jeweils einen SEPARATEN Kommandozeilenbefehl auszuführen wie eben oben beschrieben.
Ich habe auch mal nach pilight-FHEM-plugins gesucht, die unterstützen zwar raw, aber erklären mir auch nicht wie ich fhem sagen kann:
Wenn BettLampe ein: pilight-send -p raw -c "123 123 123"
Wenn BettLampe aus: pilight-send -p raw -c "456 456 456"
.

Ich bin mir sicher, dass die Lösung einfach ist, aber ich finde es grade einfach nicht heraus.

Danke euch!! :)

Viele Grüße,
Patrick

Pati_Alpha

Ich hatte grade selbst eine Idee:

Kann ich nicht einen Lichtschalter-Dummy erzeugen, den ich mit HomeKit steuern kann und dann per Automatisierung sowas machen wie:
define einschalten { if (fhem.lichtdummy eq on) { pilight-send -p raw -c "123 123 123" }}
Von der Logik her müsste das doch gehen!

Wobei diese Bedingung falsch sein wird, sowohl vom Code als auch von der Logik her.
Es müsste eher etwas sein wie "Lichtdummy.status change from 0 to 1", sonst würde er den Befehl wohl  ununterbrochen ausführen, wenn der Schalter auf an ist, dabei soll er es ja nur einmal machen.

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Pati_Alpha

Das scheint zu sein was ich suche!! :)
Probiere es baldmöglichst aus und melde mich zurück. :)

Pati_Alpha

Habe doch direkt eine Frage dazu:
attr <name> setFn { fhem('"<shell command to execute> '. ($CMD eq 'on' ?'<on>':'<off>') .'"') }
Ich bin mir mit den . ? und : nicht so klar.
Könnte mir jemand, der gut Perl-Kundig ist diese Syntax kurz erklären?

justme1968

du musst nur alle <...> teile ersetzen. und alle andere 1:1 übernehmen. keine ? und keine . ändern. das sind hier keine regex teile sondern if bzw. string operationen.

<bedingung>?<wenn true>:<sonst>
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Pati_Alpha

Ah, ok.
Muss ich denn die drei <> Felder mit teilen des Befehls oder dem ganzen Befehl ersetzen?

Also zb
attr <name> setFn { fhem('"send 11111 4 '. ($CMD eq 'on' ?'1':'0') .'"') }
oder
attr <name> setFn { fhem('"send 11111 4 '. ($CMD eq 'on' ?'send 11111 4 1':'send 11111 4 0') .'"') }

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Pati_Alpha

Ich hab es heute getestet und es nicht zum Laufen gekriegt. :/

Es scheint, als würde das Shell-Kommando nichtmal ausgeführt.
Ich habe es erst wie oben besprochen versucht, dabei ist nichts passiert:

define BettLampe dummy
attr BettLampe alias Bett
attr BettLampe group Licht
attr BettLampe room Homekit
attr BettLampe setList on off

define BettLampeProxy readingsProxy BettLampe:state
attr BettLampeProxy setList on off
attr BettLampeProxy setFn { fhem('"send 11111 1 '. ($CMD eq 'on' ?'1':'0') .' " ') }


Im Log steht auch garnichts von meinen Versuchen.

Dann wollte ich zum Test einfach mal eine Text-Datei erzeugen um zu sehen, ob es überhaupt zum Ausführen des Shellkommandos kommt:

define BettLampe dummy
attr BettLampe alias Bett
attr BettLampe group Licht
attr BettLampe room Homekit
attr BettLampe setList on off

define BettLampeProxy readingsProxy BettLampe:state
attr BettLampeProxy setList on off
attr BettLampeProxy setFn { fhem('"echo data > '. ($CMD eq 'on' ?'~/an.txt':'~/aus.txt') .' " ') }


aber es passiert auch hier einfach nichts.
Uff, sowas ist frustrierend.

justme1968

gib mal in der fhem kommandozeile ein: "send 11111 1 1" was siehst du im log? vorher verbose 5 setzen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Pati_Alpha

Ich habe es jetzt statt mit dem Proxy eher so wie ich es vorher andachte gelöst: mit notify und if.

Generell funktioniert es so:
# Schlafzimmer Funksteckdosen
define BettLampe dummy
attr BettLampe alias Bett
attr BettLampe group Licht
attr BettLampe room Homekit
attr BettLampe setList on off

define BettLampeAn notify BettLampe {\
if ( Value ("BettLampe") eq "on") {system("send 11111 1 1")}\
else {system("send 11111 1 0")}\
}


Da ich jetzt aber eigentlich ausführen will zB fürs einschalten:
pilight-send -p raw -c "123 123 123"
(wobei 123 123 123 natürlich nur Beispielzahlen sind) hat man noch zusätzlich das Problem, dass in dieser Codezeile wieder Anführungsstriche sind, was dann den obigen if-else-code kaputt macht.
Also hab ich überlegt und kam auf den Schluss "Was macht man, wenn man einen Befehl verkürzen will? => Shell-Skript"
Hab mir in /home/pi/ zwei Skripte gemacht "rev-a-1.sh" und "rev-a-0.sh", dort jeweils einfach nur den pilight-send Befehl mit allen Anführungszeichen die brauche für an bzw. ausschalten eingefügt und nun in FHEM folgendes stehen:

define BettLampe dummy
attr BettLampe alias Bett
attr BettLampe group Licht
attr BettLampe room Homekit
attr BettLampe setList on off

define BettLampeAn notify BettLampe {\
if ( Value ("BettLampe") eq "on") {system("bash /home/pi/rev-a-1.sh")}\
else {system("bash /home/pi/rev-a-0.sh")}\
}


Nun schaltet die Lampe ENDLICH ein und aus über SEPARATE Befehle! :)
Und die Befürchtung, dass er den Befehl unendlich oft ausführen würde trifft bei dieser Lösung mit Notify auch nicht zu, denn notify greift, soweit ich das verstehe nur einmalig wenn sich der Zustand des Dummys ändert. Dann schaut er eben, ob er sich auf "on" oder "off" geändert hat und tut per shell-skript wie ihm geheißen. ;)

Entschuldigt das Chaos, aber vielleicht hilft das hier ja noch dem ein oder anderen!

Pati_Alpha

Ich habe in dem Zuge noch etwas herausgefunden:
definiere ich zB einen normalen Schalter, der über "send 11111 1 0" geschaltet werden kann über GenShellSwitch wie im ersten Post gezeigt wird der Status nicht korrekt in der Richtung FHEM => HomeKit übertragen, andersrum aber schon.
Heißt: Schalte ich den Schalter im Webinterface, schaltet er in HomeKit NICHT.
Mache ich es mit "meiner" Methode über notify wie in den letzten Posts gezeigt funktioniert es aber. :)

Hilft vielleicht auch Suchenden. :)

Pati_Alpha