[GELÖST] Ein Schalter, mehrere Funktionen durch Bedingungen. Aber wie?

Begonnen von LeoSum, 16 März 2014, 22:20:25

Vorheriges Thema - Nächstes Thema

LeoSum

Hallo Zusammen,
ich habe mittlerweile drei Philips Hue Lampen und drei 2-Fach-Homematic Taster an einem raspberry Pi mit HM-USB Konfigurationsstick erfolgreich in Betrieb genommen. Über die Taster kann ich die Lampen mit kurzem Druck ein bzw. ausschalten und mit langem Druck dimmen. So sehen meine Notifies dazu aus:


define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.* set Schlafzimmer_Decke bri 254 : transitiontime 4
define Schalter_Schlafzimmer_Tuer_2_Notify notify Schalter_Schlafzimmer_Tuer_2:Short.* set Schlafzimmer_Decke off : transitiontime 4

define Schalter_Schlafzimmer_Tuer_1long_Notify notify Schalter_Schlafzimmer_Tuer_1:Long.* set Schlafzimmer_Decke dimUp : transitiontime 3
define Schalter_Schlafzimmer_Tuer_2long_Notify notify Schalter_Schlafzimmer_Tuer_2:Long.* set Schlafzimmer_Decke dimDown : transitiontime 3

define Schalter_Schlafzimmer_Bett_1_Notify notify Schalter_Schlafzimmer_Bett_1:Short.* set Schlafzimmer_Decke bri 254 : transitiontime 4
define Schalter_Schlafzimmer_Bett_2_Notify notify Schalter_Schlafzimmer_Bett_2:Short.* set Schlafzimmer_Decke off : transitiontime 4

define Schalter_Schlafzimmer_Bett_1long_Notify notify Schalter_Schlafzimmer_Bett_1:Long.* set Schlafzimmer_Decke dimUp : transitiontime 3
define Schalter_Schlafzimmer_Bett_2long_Notify notify Schalter_Schlafzimmer_Bett_2:Long.* set Schlafzimmer_Decke dimDown : transitiontime 3

define Schalter_Wohnzimmer_Tuer_1_Notify notify Schalter_Wohnzimmer_Tuer_1:Short.* set Wohnzimmer_Decke bri 254 : transitiontime 4
define Schalter_Wohnzimmer_Tuer_2_Notify notify Schalter_Wohnzimmer_Tuer_2:Short.* set Wohnzimmer_Decke off : transitiontime 4

define Schalter_Wohnzimmer_Tuer_1long_Notify notify Schalter_Wohnzimmer_Tuer_1:Long.* set Wohnzimmer_Decke dimUp : transitiontime 3
define Schalter_Wohnzimmer_Tuer_2long_Notify notify Schalter_Wohnzimmer_Tuer_2:Long.* set Wohnzimmer_Decke dimDown : transitiontime 3


Nun würde ich gerne erreichen, dass wenn man widerholt Taster 1 drückt und die zugehörige Lampe bereits an ist, die Lampe ihren Weißton variiert. Wie sieht so ein notify aus, in dem ich in Abhängikeit vom aktuellen Lampenstatus unterschiedliche Aktionen durchführe? (Quasi wie der case switch in Matlab, falls das jemand kennt).

Desweiteren würde ich gerne bei einem schnellen doppeltippen eine andere Farbe einstellen können. Wie würde man soetwas abfragen? Über einen timer?

Bin für Hinweise dankbar, oder auch weiterführende Links um in die fhem Programmierung einsteigen zu können.

Gruß
Leo

Rince

In der commandref wird ein helper Modul "sequence" beschrieben. Das macht genau das. Auf eine bestimmte Reihenfolge von in einer bestimmten Zeit eintretender Ereignisse warten :)

Allerdings wird es so, wie du es willst, nicht ohne große Klimmzüge gehen:

Du willst bei schnellem drücken einen anderen Weißton, sollte die Lampe an sein, und
bei wiederholtem Drücken eine andere Farbe

Sobald du aber das erste mal auf on drückst, ist die Lampe immer an. Damit kannst du das nicht abfragen, es wird immer zutreffen.


Und:
Worin liegt der Unterschied in schnellen und im wiederholten Drücken?
Ist letztlich das gleiche.


Ich fürchte, mit 1 Taster sind die Möglichkeit Farbe und Helligkeit auszuwerten, begrenzt.

Mit 2 Tastern sähe es schon besser aus. Wenn du also Tuer_2 noch mit ins Boot holst z.B.

Sequence:
define lampeWeisstonseq sequence Schalter_Schlafzimmer_Tuer_1:Short.* 1.0 Schalter_Schlafzimmer_Tuer_2:Short.* 1.0 Schalter_Schlafzimmer_Tuer_1:Short.*
define lampeWeisston notify lampeWeisstonseq:trigger set <was immer bei Hue den Weißton ändert>

Und für die Farbe:

define lampeRotseq sequence Schalter_Schlafzimmer_Tuer_1:Short.* 1.0 Schalter_Schlafzimmer_Tuer_2:Short.* 1.0 Schalter_Schlafzimmer_Tuer_2:Short.*
define lampeRot notify lampeRotseq:trigger set <was immer bei Hue dazu bringt, rotes Licht zu machen>

Würde also bedeuten:
Oben, unten, oben=> anderer Weißton
Oben, unten, unten => rotes Licht


Jetzt müsste man das soweit zum Laufen bekommen.

Dann kann überlegen, wie man entweder eine Art Farbwahl definiert, oder ob es besser ist mehrere Sequences zu basteln, um einzelne Farben an zu steuern.


Aber sehr intuitiv ist das nimmer...


Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

LeoSum

Hallo Rince,
danke für deine ausführliche Antwort!
Du hast Recht, das wird vielleicht ein bisschen viel für einen Schalter.
Ich möchte jetzt doch erstmal lieber den Wechsel zwischen zwei Weißtönen hinbekommen. Irgendwas stimmt an meinem Code aber noch nicht. Könntest du da mal drüber gucken und mir erklären was ich falsch mache?

define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.* {\
  my $sz_hue_ct ==ReadingsVal("Schlafzimmer_Decke","ct","300")\
  if ($sz_hue_ct == 300) {\
    fhem(set Schlafzimmer_Decke bri 254 : ct 500 : transitiontime 4)}\
  if ($sz_hue_ct != 300) {\
    fhem(set Schlafzimmer_Decke bri 254 : ct 300 : transitiontime 4)}\
}


Und wie gehe ich beim "Programmieren" am Besten vor?
Über das webinterface bekommt man ja recht wenig Rückmeldung für debugging Zwecke, was das Hantieren mit einer mir unbekannten Programmiersprache nicht unbedingt vereinfacht. Mein geposteter Code wird beispielsweise ohne Meckern angenommen. Nur der Schalter macht dan nix mehr :)

LeoSum


Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: LeoSum am 22 März 2014, 16:38:10
define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.* {\
  my $sz_hue_ct ==ReadingsVal("Schlafzimmer_Decke","ct","300")\
  if ($sz_hue_ct == 300) {\
    fhem(set Schlafzimmer_Decke bri 254 : ct 500 : transitiontime 4)}\
  if ($sz_hue_ct != 300) {\
    fhem(set Schlafzimmer_Decke bri 254 : ct 300 : transitiontime 4)}\
}


oder so:

define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.*
IF ([Schlafzimmer_Decke:ct] == 300)
  (set Schlafzimmer_Decke bri 254 : ct 500 : transitiontime 4)
ELSE
  (set Schlafzimmer_Decke bri 254 : ct 300 : transitiontime 4)


Bei Fragen hier schauen: http://forum.fhem.de/index.php/topic,17895.msg118503.html#msg118503

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

LeoSum

Danke für die Hilfe! Das ist ja genau was ich suche.
Aber leider klappt das mit deinem Code nicht.

Wenn ich die Zeile
define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.* set Schlafzimmer_Decke bri 254 : ct 340 : transitiontime 4
durch
define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.*
IF ([Schlafzimmer_Decke:ct] == 340)
  (set Schlafzimmer_Decke bri 254 : ct 500 : transitiontime 4)
ELSE
  (set Schlafzimmer_Decke bri 254 : ct 340 : transitiontime 4)

ersetze bekomme ich nach dem Speichern der Config File folgende Meldung:
ERROR:
Usage: define notify Unknown command IF, try help. Unknown command (set, try help. Unknown command ELSE, try help. Unknown command (set, try help. Please define Schalter_Schlafzimmer_Tuer_1_Notify first


Was läuft hier falsch?

Damian

#7
Das hatten wir gerade schon hier: http://forum.fhem.de/index.php/topic,21754.msg152690.html#msg152690

Die Eingaben immer in der DEF-Zeile des notifys eingeben und bitte nicht! in der cfg-Datei. Es werden nämlich Sonderzeichen (hier: \) vom DEF-Editor in der cfg-Datei eingefügt, die der User nicht kennt.

Also zuerst in der Kommandozeile eingeben:

define Schalter_Schlafzimmer_Tuer_1_Notify notify Schalter_Schlafzimmer_Tuer_1:Short.* IF

und dann auf DEF bei Schalter_Schlafzimmer_Tuer_1_Notify klicken und den restlichen IF-Befehl (wie oben) eingeben.

Die cfg-Datei braucht NIEMALS manuell editiert werden.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

LeoSum

Ah ok, das wusste ich nicht. Gibt es denn irgendwo generelle "Programmierrichtlinien" nachzulesen, dass ich sowas in Zukunft vermeide?

Und gehe ich richtig in der Annahme, dass das / hier nur die fortführung des Codes in der nächsten Zeile ankündigt und das ganze auch ohne / klappen würde wenn ich keine Zeilenumbrüche mache?

Damian

Zitat von: LeoSum am 25 März 2014, 16:31:28
Ah ok, das wusste ich nicht. Gibt es denn irgendwo generelle "Programmierrichtlinien" nachzulesen, dass ich sowas in Zukunft vermeide?

Und gehe ich richtig in der Annahme, dass das / hier nur die fortführung des Codes in der nächsten Zeile ankündigt und das ganze auch ohne / klappen würde wenn ich keine Zeilenumbrüche mache?

ja.

Es ist aber ein Backslash \ und nicht Slash /, aber wie gesagt, mache alles über die Weboberfläche, dann brauchst dich nicht um die Interna zu kümmern.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

LeoSum

Mit der von dir beschriebenen Methode nimmt der den Code ohne zu murren an. Keine Fehlermeldungen mehr. Leider passiert nun aber bei einem kurzen Druck auf Taster 1 gar nichts mehr. Woran kann das liegen?

Wenn ich den ganzen IF ELSE Kram rausschmeiße und wieder nur einen Befehl unter DEF eintrage funktioniert es wieder.

Damian

Zitat von: LeoSum am 26 März 2014, 10:58:54
Mit der von dir beschriebenen Methode nimmt der den Code ohne zu murren an. Keine Fehlermeldungen mehr. Leider passiert nun aber bei einem kurzen Druck auf Taster 1 gar nichts mehr. Woran kann das liegen?

Wenn ich den ganzen IF ELSE Kram rausschmeiße und wieder nur einen Befehl unter DEF eintrage funktioniert es wieder.

Du kannst in der Kommandozeile einfach testen:

IF ([Schlafzimmer_Decke:ct] == 340) (set Schlafzimmer_Decke bri 254 : ct 500 : transitiontime 4) ELSE (set Schlafzimmer_Decke bri 254 : ct 340 : transitiontime 4)

Dann siehst du, ob dein IF korrekt funktionert.

Gruß
Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

LeoSum

#12
Gerade gemacht, dann kam die Meldung dass IF nicht bekannt sei. Nach einem Update funktioniert es nun ...  :-\


Dummer Fehler, hätte ich ja mal früher drauf kommen können. Aber ist die Funktion denn so neu? Ich danke Dir jedenfalls für deine Geduld!

Schönen Abend noch,
Leo