Hallo,
ich habe ein Problem ich habe folgende notify abfrage
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set KaffeAn toggle ;; !!!+5 sekunden dann!!! set KaffeLichtAus toggle")\
}\
else {\
fhem("set KaffeAus toggle ;; !!!+5 sekunden dann!!! set KaffeLichtAn toggle")\
}\
}
Wie kann ich das realisieren??
kann man mit at ne Art Countdown realisieren der nur einmal bei Aufruf ausgeführt wird?
Gruß
Dennis
http://fhem.de/commandref.html#at (//fhem.de/commandref.html#at)
irgendwie so was:
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set KaffeAn toggle");\
define at_KaffeLichtAus at +00:00:05 set KaffeLichtAus toggle \
}\
else {\
fhem("set KaffeAus toggle");\
define at_KaffeAus at +00:00:05 set KaffeLichtAn toggle \
}\
}
Danke für die Antwort ja so in der art würde ich das in c++ schreiben.
Aber perl ist mir noch ganz neu und die schei.... Spätschicht hindert mich noch 2 wochen lang am studieren.
Ich habe deins mal so übernommen resultat:
2013.01.16 09:01:32 2: FS20 Taster_1_wohn toggle
2013.01.16 09:01:32 3: act_on_Taster_1_wohn return value: Unknown command {\
, try help
Wahrscheinlich muss das at in einer klammer mit vorrangestellter anweisung???
else {\
fhem("set KaffeAus toggle");\
[b]ANWEISUNG([/b] define at_KaffeAus at +00:00:05 set KaffeLichtAn toggle [b])[/b]\
}\
Habe gerade mal im commandref geschaut aber noch nichts sinnvolles für meinen fall entdeckt.
muss gleich nach dem Einkauf noch mal schauen.
Gruß
Dennis
sorry, das muss natürlich {fhem ("define ...")} heissen
Probier mal "set KaffeLichtAn on-for-timer 5".
Ist auch in der commandref dokumentiert.
on for time übersetzt eigentlich an für zeit x
Also nicht das was ich will ich will nicht 5 sekunden an dann aus sondern saeco vollautomat aus dann 5-10 sekunden warten und dessen tassen beleuchtung ausschalten.
habe mir in dem Automat die FS20 4 Kanal Bausatz Schaltung eingebaut und schalte damit 2 Tasten (Tasse groß und Tasse mittel) und 2 Relais (Stromzufuhr Automat und Strom für selbst eingebaute LED's) funktioniert soweit auch gut nur hat der Automat leider niergens abgreifbare Gleichspannung und der muss starke elektromagnetische Felder während des Ausschaltvorgangs erzeugen da nach dem ausschalten min. 4 Sekunden keine Schaltbefehle mehr am fs20 Schaltaktor ankommen. daher Zeitverzögert schalten
Danke an Alle
Gruß
Dennis
Ihr seid alle auf der richtigen Sput, es fehlt nur an Details in Bezug auf Klammern und Semicolon Escapen.
Modulo Tippfehler müsste Folgendes gehen;
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set KaffeAn toggle ;; define KaffeLichtAus_spater at +00:00:50 set KaffeLichtAus toggle")\
}\
else {\
fhem("set KaffeAus toggle ;; define KaffeLichtAus_an at +00:00:50 set KaffeLichtAn toggle")\
}\
}
KaffeLichtAus_spater etc. ist frei benannt, kann man auch Gummibarchen nennen.
Danke das werd ich nach meiner Schicht direkt mal testen.
Dann nimm bitte
+00:00:05
anstatt
+00:00:50
;-)
So habe jetzt alles mal getestet und folgendes funktioniert am zuverlässigsten.
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set FernsehSteckdoseAn toggle");;\
fhem("define at_FernsehSteckdoseAus at +00:00:05 set FernsehSteckdoseAus toggle")\
}\
else {\
fhem("set FernsehSteckdoseAus toggle");;\
fhem("define at_FernsehSteckdoseAn at +00:00:05 set FernsehSteckdoseAn toggle")\
}\
}
Ist jetzt zwar für ne nicht fs20 funksteckdose die ich auch schalte aber egal es funktioniert.
Danke an jhohn und Zrrronggg!
Dann eröffne ich morgen gleich mal ne weitere Frage jetzt erstmal entspannen.
Gruß
Dennis
Trotzdem noch eine Anmerkung am Rande:
fhem("set FernsehSteckdoseAn toggle") ;; fhem("define at_FernsehSteckdoseAus at +00:00:05 set FernsehSteckdoseAus toggle")
ist echt nur eine besonders umständliche Form von
fhem("set FernsehSteckdoseAn toggle ;; define at_FernsehSteckdoseAus at +00:00:05 set FernsehSteckdoseAus toggle")
Funktional kann das nicht "besser" funktionieren.
Ja ich weiß ist aber übersichtlicher ;-)
Gruß
Dennis
Zitat von: thestealth schrieb am Di, 15 Januar 2013 23:53Hallo,
ich habe ein Problem ich habe folgende notify abfrage
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set KaffeAn toggle ;; !!!+5 sekunden dann!!! set KaffeLichtAus toggle")\
}\
else {\
fhem("set KaffeAus toggle ;; !!!+5 sekunden dann!!! set KaffeLichtAn toggle")\
}\
}
Wie kann ich das realisieren??
einfach mit "sleep xx"
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "off") {\
fhem("set KaffeAn toggle ;; sleep 5;; set KaffeLichtAus toggle")\
}\
else {\
fhem("set KaffeAus toggle ;; sleep 5;; set KaffeLichtAn toggle")\
}\
}
Gruß
wow das ist ja supi das hilft mir bei weiteren Programmierungen danke
Mooooooment.
Diese Methode ist gefährlich, weil man sehr genau aufpassen muss, wo man das Sleep einsetzt.
An der falschen Stelle wird FHEM für die Zeit blockiert und reagiert also nicht mehr auf einkommende Funksignale.
bauernregel: sleep in FHEM ->Okay, Sleep ausserhalb FHEM in perl teil -> könnte blockieren.
Daher würde ich das gerade als Anfänger lieber nicht verwenden.
besonders in Kombination mit hier vielfach gerne verwendeten Konstruktionen, wie z.b.
fhem("set FernsehSteckdoseAn toggle") ;; fhem("define at_FernsehSteckdoseAus at +00:00:05 set FernsehSteckdoseAus toggle")
anstatt
fhem("set FernsehSteckdoseAn toggle ;; define at_FernsehSteckdoseAus at +00:00:05 set FernsehSteckdoseAus toggle")
kann man sich besonders schnell mal vertun, weil man nicht weiss, ob man nun "in FHEM" oder "ausserhalb FHEM" im Perl-Teil ist.
Dennis ist genau der Kandidat der in das Problem reinlaufen wird (sorry!)
Warum?
Ich sagte ihm, er soll folgendes schreiben:
else {fhem("set KaffeAus toggle ;; define KaffeLichtAus_an at +00:00:50 set KaffeLichtAn toggle")}
Er formuliert aber um in
else { fhem("set FernsehSteckdoseAus toggle");;fhem("define at_FernsehSteckdoseAn at +00:00:05 set FernsehSteckdoseAn toggle") }
weil das angeblich übersichtlicher ist (ich habe da bereits erhebliche Zweifel, aber egal).
Wenn er das analog mit
else { fhem("set KaffeAus toggle ;; sleep 5;; set KaffeLichtAn toggle")}
macht, könnte da ja mit etwas Pech
else { fhem("set KaffeAus toggle") ;; sleep 5 ;; fhem("set KaffeLichtAn toggle")}
draus werden.
Und dann hat er sich schon ein prima Ei gelegt und wird in 5 Tagen hier stehen und meinen sein FHEM geht manchmal nicht mehr richtig.
Also liebe Anfänger: Finger weg von Sleep, besonders wer kreativ Klammerebenen einführt die eigentlich nicht nötig sind.
LOL Okay sorry aber ich programmiere seid 10 Jahren in c#,c++, php und im Microcontroller bereich ganz so blöde bin ich nicht ich bin nur noch nicht so vertraut mit Fhem und Perl.
Jetzt nach diesem Thread habe ich begriffen das ich fhem( vor den FHEM befehlen setzen muss.
Ich beschäftige mich jetzt erst seid rund 20 Stunden mit Fhem und FS20 also 20 stunden aus den einzelnen Zeiten über die Tage verteilt und da ging eigentlich am meisten zeit bei rum die für mich benötigten FS20 Hardware raus zu suchen, zu kaufen, und zu programmieren bzw. binden.
Da ich momentan auch Zeitgleich neben dem ausbau meiner Haussteuerung Arbeite, Familie habe und an der Entwicklung einer neuer Firmware für meinen 3 Achsen Gyroskop arbeite hat man manchmal mal bei einfachsten dingen einen Knoten in den Gehirnwindungen.
Trotzdem danke für die Warnung ich werde aber das Sleep benutzen und zu dem übersichtlicher ja ist es wenn man sich das CFG über Putty anschaut da es so keinen Zeilen Umbruch giebt!!!!!!!
Und ja ich mache alles immer und am liebsten per Console da ich so egal ob am Handy , Laptop, oder Desktop egal von wo auch immer das 100 identische zus ehen bekomme und ich mit Konsole schneller arbeiten kann als mit einem Browser oder Notepad usw.
Gruß
Dennis
Wollte dir bestimmt nicht zu nahe treten.
ZitatJetzt nach diesem Thread habe ich begriffen das ich fhem( vor den FHEM befehlen setzen muss.
Naja, eigentlich genau NICHT, denn dafür gibt's ja Klammern.
Was du ja machst ist FHEM sagen, dass das was jetzt kommt alles perl ist
Indem du eine { Klammer aufmachst.
Und dann sagst du perl es möge doch an FHEM eine Reihe von Befehle übergeben:
indem du fhem("Befehl 1 ;; Befehl 2 ;; Befehl 3 ") schreibts.
Jeden dieser Befehle einzeln an FHEM zu übergeben ist ... möglich. ;-)
Zitat... wenn man sich das CFG über Putty anschaut da es so keinen Zeilen Umbruch giebt
Verstehe ich ehrlich gesagt trotzdem nicht, da der Code ja erheblich länger wird.
Aber das ist natürlich egal. Wenn dir das besser gefällt, dann mach es so.
Es gibt eben nur so 3-4 "Klassiker" was mit FEHM schnell mal schief gehen kann, und sleep an falscher Stelle gehört dazu.
Wenn du das im Griff hast, ist alles chic!
Ja habe alles im griff und jetzt das ganze noch verbessert jetzt reagiert Fhem endlich auf jeden tastendruck des blöden aufputz senders.
#If Bedinungen
#alle Heizungen: mode auto richtig setzen
define act_on_Wohnzimmer_Schnell_heizen notify Wohnzimmer_Schnell_heizen {\
if ("%" ne "off") {\
fhem("set Thermostat_Wohn mode auto desired-temp 30")\
}\
else {\
FHTnominal("Thermostat_Wohn")\
}\
}
#taster wohn if
define act_on_Taster_1_wohn notify Taster_1_wohn {\
if ("%" ne "on") {\
if(OldValue('TV_Steckdose_Status') eq 'Aus') {\
fhem 'set FernsehSteckdoseAn An';;\
fhem 'sleep 3';;\
fhem 'setstate TV_Steckdose_Status An';;\
fhem 'set FernsehSteckdoseAus Aus'\
}\
else {\
fhem 'set FernsehSteckdoseAn Aus';;\
fhem 'sleep 3';;\
fhem 'setstate TV_Steckdose_Status Aus';;\
fhem 'set FernsehSteckdoseAus An'\
}\
}\
}
define act_on_Taster_2_wohn notify Taster_2_wohn {\
if ("%" ne "on") {\
if(OldValue('SteckdoseSchreibtisch_Status') eq 'Aus') {\
fhem 'set SteckdoseSchreibtisch An';;\
fhem 'setstate SteckdoseSchreibtisch_Status An'\
}\
else {\
fhem 'set SteckdoseSchreibtisch Aus';;\
fhem 'setstate SteckdoseSchreibtisch_Status Aus'\
}\
}\
}
define act_on_Taster_3_wohn notify Taster_3_wohn {\
if ("%" ne "on") {\
if(OldValue('SchreibtischLicht_Status') eq 'Aus') {\
fhem 'set SchreibtischLicht An';;\
fhem 'setstate SchreibtischLicht_Status An'\
}\
else {\
fhem 'set SchreibtischLicht Aus';;\
fhem 'setstate SchreibtischLicht_Status Aus'\
}\
}\
}
define act_on_Taster_4_wohn notify Taster_4_wohn {\
if ("%" ne "on") {\
if(OldValue('SchreibtischLicht_Status') eq 'An') {\
fhem 'set SchreibtischLicht Aus';;\
fhem 'setstate SchreibtischLicht_Status Aus'\
}\
if(OldValue('SteckdoseSchreibtisch_Status') eq 'Aus') {\
fhem 'set SteckdoseSchreibtisch An';;\
fhem 'setstate SteckdoseSchreibtisch_Status An'\
}\
else {\
fhem 'set SteckdoseSchreibtisch Aus';;\
fhem 'setstate SteckdoseSchreibtisch_Status Aus'\
}\
if(OldValue('TV_Steckdose_Status') eq 'Aus') {\
fhem 'set FernsehSteckdoseAn An';;\
fhem 'sleep 3';;\
fhem 'setstate TV_Steckdose_Status An';;\
fhem 'set FernsehSteckdoseAus Aus'\
}\
else {\
fhem 'set FernsehSteckdoseAn Aus';;\
fhem 'sleep 3';;\
fhem 'setstate TV_Steckdose_Status Aus';;\
fhem 'set FernsehSteckdoseAus An'\
}\
}\
}
Kann mir mal einer sagen warum die blöden tasten nur toogle'n ich mein ja es giebt untoogle aber aber da kommt wieder ein modul mehr zum einsatz plus bei indirekter steuerung ein notify.
Ist ELV zu blöd eine If schleife im 6 Tasten programm des senders ein zu bauen? das der taster abwechselnd on off sendet?
zudem ist mir aufgefallen das dieser Aufputz 6 Tasten Sender wenn er direkt über eine Stromleitung die unterputz verlegt ist montiert wird nur jeden 2-3 befehl bis zum COC bringt.
Ziemlich blöd wenn man den über einen gewöhnlichen Lichtschalter montiert.
Gruß
Dennis