FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Pati_Alpha am 14 Oktober 2016, 19:05:18

Titel: Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 14 Oktober 2016, 19:05:18
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
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 16 Oktober 2016, 19:53:40
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.
Titel: Antw:Separate Befehle für an und aus
Beitrag von: justme1968 am 16 Oktober 2016, 20:04:28
schau dir readingsProxy an. im besondern dieses beispiel: http://www.fhemwiki.de/wiki/ReadingsProxy#Shellkommando_zum_Schalten_verwenden (http://www.fhemwiki.de/wiki/ReadingsProxy#Shellkommando_zum_Schalten_verwenden).

gruss
  andre
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 16 Oktober 2016, 20:08:57
Das scheint zu sein was ich suche!! :)
Probiere es baldmöglichst aus und melde mich zurück. :)
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 16 Oktober 2016, 20:49:14
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?
Titel: Antw:Separate Befehle für an und aus
Beitrag von: justme1968 am 16 Oktober 2016, 20:54:32
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>
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 16 Oktober 2016, 21:40:56
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') .'"') }
Titel: Antw:Separate Befehle für an und aus
Beitrag von: justme1968 am 16 Oktober 2016, 23:07:28
ersteres.
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 19 Oktober 2016, 10:26:08
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.
Titel: Antw:Separate Befehle für an und aus
Beitrag von: justme1968 am 19 Oktober 2016, 10:36:20
gib mal in der fhem kommandozeile ein: "send 11111 1 1" was siehst du im log? vorher verbose 5 setzen.

gruss
  andre
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 19 Oktober 2016, 11:03:59
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!
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 19 Oktober 2016, 23:02:13
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. :)
Titel: Antw:Separate Befehle für an und aus
Beitrag von: Pati_Alpha am 20 Oktober 2016, 18:15:28
Der Weisheit letzter Schluss hierzu steht jetzt hier:
https://forum.fhem.de/index.php/topic,59320.msg507156.html#msg507156

:P