FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: uron am 21 November 2013, 10:28:43

Titel: Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 21 November 2013, 10:28:43
Hallo zusammen,
als absoluter Neuling in der FHEM-Programmierung habe ich mit der Forumshilfe einen Blinkbefehl einer Leuchte hinbekommen.
Aufgabenstellung war, dass die Lampe ab 6:30 Uhr bis 23:00 Uhr alle 5 Minuten je 3x blinken soll.

Zitatdefine Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}

Nun taucht das Problem auf, dass wenn die Lampe vorher eingeschaltet war, das Blinken nicht ausgeführt werden soll, der Zähler (204 mal) aber weiterlaufen soll damit das Ende des Blinkens tätsächlich zu einem definierten Zeitpunkt (23:00 Uhr) beendet wird (auch wenn die Lampe zwischenzeitlich über eine Fernbedienung ausgeschaltet wird).
In der jetzigen Lösung schaltet die Lampe nach einem Blinken auf "off", auch wenn sie vorher eingeschaltet war.
Mir ist klar, dass man vor dem Blinkbefehl den Status der Lampe nicht ohne weiteres abgefragt werden kann, da der Aktor keine Statusbefehle versenden kann. Dies gilt natürlich insbesondere auch, wenn die Lampe über "toggle" geschaltet wurde.

Da nun aber FHEM per CUL (an USB der Fritz!Box 7390) die jeweiligen Aktionen (ON/OFF) protokolliert, müsste es doch möglich sein, den Status (ON/OF/TOGGLE) aus FHEM auszulesen (zunächst mit all den Synchronisationsproblemem).

Bevor ich mich nun auf den Weg mache, den m.E. zweckmäßigen Befehl "UntoggleIndirect" an meine Bedürfnisse zu adaptieren (was mir schwer genug fallen wird), meine Frage an euch: Bin ich auf dem richtigen Weg unterwegs?
M.E. müsste ich in o.g. Syntax vor jedem "Versuch on-for-timer 1" abfragen, ob die Lampe eingeschaltet ist, vielleicht eine Variable definiereun und nach dem Blinke wieder zurücksetzen!?.

Könnt ihr mir einen Schritt weiterhelfen?


Mittlerweile bin ich nun selbst darauf gekommen, dass {Value("DeviceName")} den Status ausliest. Das ginge mit "ON/OFF" ja auch gut, jetzt kommt das Problem des Status "toggle".
Bekommt man das mit dem "UntoggleIndirect" hin, dass ich einen ON oder OFF definiert bekomme?
Kann mir jemand Mut machen?
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 21 November 2013, 21:40:38
Hm. Ich hab deinen Text jetzt 3x durchgelesen und trotzdem noch nicht ganz verstanden.


define Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}


Sieht aus wie Betateilchen-Notation.  :o

Schon die Anforderung "die Lampe ab 6:30 Uhr bis 23:00 Uhr alle 5 Minuten je 3x blinken" zu lassen würde ich vermutlich anders lösen als 204 mal hintereinander 3x alle 5 Minuten blinken zu lassen.

Ich denke, ich würde eher die Lampe alle 5 Minuten 3x blinken lassen, WENN es nach 6:30 und vor 23 Uhr ist. (Beachte den Unterscheid in der Logik, in meinem Fall musst du nicht mitzählen) Ich habe das noch nicht genau durchdacht, ist jetzt erstmal nur ein Gefühl.

(Nebenbei: hier könnte man vermutlich Code sparen, wenn man auf volle Stunden prüfen könnte. also z.b. ab 6 oder 7 Uhr bis 23 Uhr.)

Aber ganz habe ich das gewünschte Verhalten der Lampe noch nicht kapiert, ich frag mal eine bisschen:

- du willst das die Lampe zwischen x und y Uhr alle 5 Minuten 3x blinkt, WENN sie vor x Uhr aus war. (Blinken heisst 3x  ein Sekunde an und eine aus, also 1 Hz? Legt dein Codebeilspiel nahe.)
- wenn sie vor X Uhr jedoch an war, soll sie nicht blinken
- wenn sie sie vor X Uhr  an war, und nach X Uhr ausgeschaltet wird, soll sie bis y Uhr blinken.

So richtig?

Wenn ja, ist das meiner Meinung nach ganz gut machbar, wenn das Ausschalten nicht an Fhem vorbei passiert, die Fernbedienung also nicht auf die Lampe direkt wirkt, sondern über Fhem. Anders geht's vermutlich auch, speziell wenn der Aktor und die Fernbedienung FS20 ist, aber z.b. je nach Funkschnittstelle nicht wenn's Intertechno ist.

Ich entnehme aus Detailes deines Textes, dass du FS20 Aktoren verwendest? Stimmt das? Was setzt du ansonten ein, CUL?

Also ich kann dir Mut machen: Lösbar ist das vermutlich schon. Ich glaube zur Zeit aber noch, das dein Weg komplizierter ist als nötig, kann aber auch daran liegen, dass ich die Anforderung noch nicht ganz verstehe.

EDIT: inzwischen hab ich den anderen Thread gefunden, in dem die von dir präsentierte Schaltung erarbeitet wurde. Ich bin der Aufassung, dass die von Notation und auch Logik her komplexer ist als sie sein müsste und habe im andern thread schon

Zitatdefine Blinkerstart at *06:25:00 {fhem("define blink205x at +*{205}00:05:00 define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1") }

als Ersatz vorgeschlagen.

Aber auch diese veränderte Schreibweise hat den Nachteil, dass sie im Grunde nur eine Umgehung der eigentlichen Anforderung ist, die ja offenabr nicht war "ab 6:30 204x alle 5 Minuten 3 mal blinken" sondern "zwischen 6:30 Uhr und 23:00 Uhr alle 5 Minuten 3x blinken"

Das ergebniss ist einfacher als die eigentliche Anforderung aber die Erweiterung zu deiner neuen Forderung die du in diesem Thread stellst ist komplizierter.


Zuletzt:
Je nach Funkprotokoll ist das ganze Geblinke in jedem Falle eine erhebliche Belastung der 1% Regel. Hm... vielleicht sogar zu viel, ich rechne mal eben und melde mich wieder.

Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 21 November 2013, 21:50:17
Okay, noch mal gerechnet. Angenommen du benutzt FS20, dann kannst du bis zur 1% Grenze 163 FS20 Befehle je Stunde absetzen. Deine Blinkmimik verbraucht 36 Befehle pro Stunde, wenn du Geräte verwendest, die on-for-timer können (konnen alle FS20, aber z.b. IT nicht), sonst 72.

D.H. bei FS20 verbrätst du mit der Blinklampe fast 25% der gesamten Funkkapazität.
Geht, aber man muss sich darüber im Klaren sein. Wenn du jetzt noch FHT zur Heizungssteuerung einsetzt, dann ist die Anzahl der nutzbaren FHT80 schon deutlich eingeschränkt.
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 21 November 2013, 23:10:14
Hallo Zrrronggg,
da hast du dir aber wirklich Mühe gemacht:
Dass man meine Aufgabenstellung nicht sofort versteht habe ich befürchtet, sie liegt aber auch abseits üblicher Bedürfnisses. Also fange ich noch einmal andersherum an.

Zunächst zu mir: Ich bin wirklich blutiger Anfänger, interessiere mich aber für FHEM und die Steuerung im Heimbereich.
Um anzufangen habe ich mir eine für mich naheliegende Anwendungsmöglichkeit gesucht, um erste Schritte zu unternehmen: Meinen neuen Garten in dem ich die Leuchten und Wasserpumpen (Bachlauf+Teich) per FS20-Module und 2 Fernbedienungen geschaltet habe.
Später kam dann die Steuerung per FHEM über CUL an der FB 7390 dazu.
Nun versuche ich mich an Ein- und Ausschaltbefehlen per Zeit- oder Sonnenstandsbefehlen und bin dabei erfolgreich (du wirst müde lächeln, aber die erste Schritte gänzlich ohne Vorkenntnisse sind mir schon schwer gefallen).

O.k. nun zur Sache bzw. Aufgabenstellung:
ZitatAber ganz habe ich das gewünschte Verhalten der Lampe noch nicht kapiert, ich frag mal eine bisschen:
Eine der Gartenleuchten ist ein mittelgroßer Leuchtturm (60 cm) mir eingebauter Lampe. Verspielt wie ich bin, möchte ich ihn auch ein wenig blinken lassen - ja o.k. vielleicht ein bischen wirr!!
3x alle fünf Minuten wäre o.k. öfter wäre besser aber das kann ich ja einstellen wenn ich mir weitere Gedanken über LOVF mache. Ob das nun ab 6.30 oder 7.00 Uhr losgeht ist egal!

ZitatSieht aus wie Betateilchen-Notation.  :o
Die Notation ist nicht von Betateilchen!

ZitatSchon die Anforderung "die Lampe ab 6:30 Uhr bis 23:00 Uhr alle 5 Minuten je 3x blinken" zu lassen würde ich vermutlich anders lösen als 240 mal hintereinander 3x alle 5 Minuten blinken zu lassen.
Hatte ich ursprünglich auch gedacht, der Lösungsvorschlag kam aber anders, was ich keinesfalls kritisieren möchte, die Folgen waren mir zu diesem Zeitpunkt nicht klar.

ZitatIch denke, ich würde eher die Lampe alle 5 Minuten 3x blinken lassen, WENN es nach 6:30 und vor 23 Uhr ist. (Beachte den Unterscheid in der Logik, in meinem Fall musst du nicht mitzählen) Ich habe das noch nicht genau durchdacht, ist jetzt erstmal nur ein Gefühl. (Nebenbei: hier könnte man vermutlich Code sparen, wenn man auf volle Stunden prüfen könnte. also z.b. ab 6 oder 7 Uhr bis 23 Uhr.)
Die Spielerei kann natürlich auch zu vollen Stunden beginnen und enden, also sagen wir mal zwischen 7.00 und 23.00 Uhr!

Ich hoffe, die Erläuterung der Ist-Situation ist mir diesmal besser gelungen - ansonsten bitte nochmals nachfragen.

So, und jetzt zu meinem Problem:
Wenn die "Leuchtturm-Leuchte" hin und wieder als Wegbeleuchtung im Dauerbetrieb genutzt werden soll, wird sie per FS20-Fernbedienung oder FS20-Schalter im Garten ein- oder ausgeschaltet.
Jetzt kommt es: Wird die "Leuchtturmlampe" per Fernbedienung z.B. am frühen Abend um 18.00 Uhr eingeschaltet (liegt ja im Zeitfenster des Blinkens), so sorgt der bisherige Code dafür, dass nach dem nächsten Blinkrhythmus die Lampe auf OFF geschaltet wird und nichts ist mehr mit der Wegbeleuchtung.
Richtig wäre, wenn sie nach dem Einschalten (dauerhaft als Wegleuchte) nicht mehr blinken würde.
Zu allem Übel kommt noch dazu, dass ich dieses Einschalten als toggle-Befehl sende. Eine reine STATE-Abfrage vor dem Blinken mit {Value("DeviceName")} hilft mir beim toggle-Zustand ja nicht weiter. Deshalb auch meine Frage der möglichen Verwendung und Einbindung des "UntoggleIndirect"-Befehls und danach, ob das ein möglicher Weg ist.
Ich dachte mir dass es doch möglich sein muss, den Satus des Leuchtturmes aus der mitprotokollierenden FHEM zu ermitteln als Variable abzuspeichern und Blinken oder Nichtblinken über IF/ELSE-Befehle zu steuern.

In der jetzigen Syntax mit dem Zähler muss also m.E. vor dem SET-Befehl abgefragt werden, ob die Lampe mittlerweile dauerhaft eingeschaltet wurde wenn ja, kein Blinken. Wird die Wegleuchte wieder ausgeschaltet sollte das Blinken wieder beginnen, spätestens aber um 23.00 Uhr enden.

ZitatD.H. bei FS20 verbrätst du mit der Blinklampe fast 25% der gesamten Funkkapazität.
Geht, aber man muss sich darüber im Klaren sein. Wenn du jetzt noch FHT zur Heizungssteuerung einsetzt, dann ist die Anzahl der nutzbaren FHT80 schon deutlich eingeschränkt.
Im Moment kein Problem, vielleicht komme ich ja auch irgendwann über meine Spielphase hinaus und mache mich an wirkliche Probleme, dann würde ich nochmals über die Häufigkeit des Blinkens und ob überhaupt nachdenken.
FHT-Einsatz ist derzeit nicht angesagt.

So, ich hoffe ich habe alle Fragen beantwortet!
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 21 November 2013, 23:15:59
So, hab noch bisschen Zeit, daher mal unter Annahme, dass ich die Anforderung richtig verstanden habe, erstmal eine schnelle Lösung für das eigentliche Problem, dass die Aufgabe versucht direkt zu lösen:

define tower_blink at *00:05:00 { if($hour > 5 & $hour <= 23)  { fhem ("set versuch blink 3 1")}}


Ich habe da allerdings eine kleines "twisting" deiner Anforderung vorgenommen. Um den simplen Check nach "hour" vornehmen zu können, habe ich das Blinken ab 6 Uhr vorgesehen, du schreibst ja, das sei keine echtes Problem (Tests gegen 6:30 sind auch möglich, aber eben ein bisschen aufwändiger). Ausserdem habe ich den simplen Befehl "blink" genommen. Der hat aber VERMUTLICH den Nachteil, das er die Funklast erhöht, denn soweit ich VERMUTE löst er das Blinken durch Senden von on/off Befehlen. Dadurh steigt die Funklast um das Doppelte. Wenn du du HM verwendest ist das vermutlich egal, bei FS20 wäre aber vermutlich folgendes besser:


define tower_blink at *00:05:00 { if($hour > 5 & $hour <= 23)  { fhem ("define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1")}}


Beachte, dass hier eine andere Logik realisiert ist. Und zwar wird alle 5 Minuten geprüft, ob es zwischen 6 und 23 Uhr ist und wenn ja, DANN wird geblinkt.

So, jetzt angenommen, du kannst mit der Einschränkung leben, dass das Licht schon um 6 Uhr angeht anstatt um 6:30 Uhr, dann kannst du deine Anforderung mit dem "Licht darf vorher nicht an sein" so lösen:

define tower_blink at *00:05:00 { if($hour > 5 & $hour <= 23 & (Value("Versuch") ne "on") )  { fhem ("define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1")}}


Fertig.

(Also alles aus dem Kopf ungetestet hingeschrieben, und vielleicht hab ich irgendwas in deinen Anforderungen übersehen oder nicht ganz kapiert)

(EDIT: kleine korrekturen)



Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 21 November 2013, 23:26:37
Aha, jetzt schnall ich gerade, dass du toggle sendest.

Das würde ich in Fhem untoggeln. D.H. mit Fernbedienung Toggle nicht die Lampe direkt schalten, sondern mit der Fernbedienung einen anderen Kanal (ich gehe immer noch von FS20 aus) nehmen und dann in Fhem irgendwas der Art:

define Leuchtturm_an_aus notify Fernbedienung1:toggle {if(Value("Versuch") ne "on") { fhem ("set Versuch on")} else{ fhem ("set Versuch off") }}

Die Fernbedienung muss natürlich vorher in Fhem angelegt sein.


Zitat
ZitatSieht aus wie Betateilchen-Notation. 
Die Notation ist nicht von Betateilchen!

Ja, okay er ist nicht der Einzige hier der so schreibt, aber mit der, der diese Notation am deutlichsten vertritt. Ich persönlich finde diese Schreibweise unübersichtlich und gerade für Anfänger wenig verständlich, zusätzlich wird der Code dadurch in der Regel deutlich aufgebläht.

Betateilchen denkt sich noch was dabei, viele andere schreiben aber einfach ab und verballhornen das immer mehr, bis Sachen rauskommen die nur noch zufällig funktionieren.

Beachte, das auf deine Frage im anderen Thread nach dem Sinn der Semikolons u.ä. keiner geantwortet hat, weil es zumindest einige selber nicht wissen, warum sie da (überflüssige) Semikolons hin machen.

Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 21 November 2013, 23:33:29
SUUPER!!
Das mit dem Twisting habe ich verstanden und danke für diesen gelungenen Ansatz.

Das Toggleproblem muss ich erste einmal durchdringen. Das Ziel des Sendens über FHEM habe ich verstanden, muss mich allerdings ersteinmal mit dem anderen "Kanal" und dem Anlegen der Fernbedienung in FHEM befassen, ist mir bisher noch nicht begegnet. Aber ich möchte ja auch sehr gerne einen Teil zur Lösung beitragen. Nur dann habe ich dazugelernt und nicht nur "abgeschrieben".

Sollte es Probleme geben, weiß ich ja, dass ich hier gut aufgehoben bin.

Vielen Dank bis hier hin!
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 21 November 2013, 23:40:03
Die Lampe ist doch sicher irgendwie so angelegt:

Zitatdefine Versuch FS20 11114322 de

Wobei 11114322 dein Hauscode ist und "de" die Kanaladresse.
Genauso legst du jetzt die Fernbedienung an. Du stellst an der Fernbedienung einfach eine andere Kanaladresse ODER einen anderen Hauscode ein.  Z.B  11114422

Dann legst du die so an:
Zitatdefine Fernbedienung1 FS20 11114422 de

Oh... hätte ich das nicht sagen dürfen:

ZitatAber ich möchte ja auch sehr gerne einen Teil zur Lösung beitragen. Nur dann habe ich dazugelernt und nicht nur "abgeschrieben".


Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 22 November 2013, 08:20:32
Ist schon o.k.
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 22 November 2013, 16:56:45
So, jetzt hangele ich mich so langsam durch die Vorschläge von Zrrronggg:

Zunächst fange ich mal mit der einfachen Version eingegeben im WebFrontend an:
Zitatdefine tower_blink at *00:05:00 { if($hour > 5 & $hour <= 23)  { fhem ("define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1")}}
.
Als Ergebnis erhalte ich den "at"-Status tower_blink    Next: 00:05:00. Das bedeutet doch nicht mehr oder weniger als dass das Blinken um 5 Minuten nach Mitternacht beginnen soll.
In meinem Ursprungscode wurde ja zunächst eine Startzeit für das Blinken gesetzt und danach alle 5 Minuten erneut.

Lese ich in der commandref nach
Zitatdefine a4 at *17:00:00 set lamp on      # every day
dürfte dieser set-Befehl tatsächlich auch nur einmal täglich ausgeführt werden.
Da 5 Minuten nach Mitternacht außerhalb des Gültigkeitsbereiches der IF-Zeiten liegt, wird der SET-Befehlt m.E. gar nicht ausgeführt!
War der "Start-Impuls" im Ursprungscode doch nicht so verkehrt?
Zitatdefine Blinkerstart at *06:30:00 { \
        fhem("define blink3x at +*{3}00:00:02 set Versuch on-for-timer 1");; \
        fhem("define blink3x_neu at +*{204}00:05:00 { fhem(\"define blink3x_neu1 at +*{3}00:00:02 set Versuch on-for-timer 1\") }");; \
}

Bevor ihr mich steinigt bin ich selbst drauf gekommen.
Das "+" fehlte ... und noch eine Kleinigkeit und der Vollständigkeit halber: Damit die Aktionen nicht bis 24.00 Uhr laufen muss das "=" weg.
Zitatdefine tower_blink at +*00:05:00 { if($hour > 5 & $hour < 23)  { fhem ("define blink3Hz at +*{3}00:00:02 set Versuch on-for-timer 1")}}
;D
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: Zrrronggg! am 22 November 2013, 17:19:49
Okay...

ZitatAls Ergebnis erhalte ich den "at"-Status tower_blink    Next: 00:05:00. Das bedeutet doch nicht mehr oder weniger als dass das Blinken um 5 Minuten nach Mitternacht beginnen soll.

Nein. Das bedeutet, das als nächstes um 00:05:00 gestest werden soll, ob es  die Stunde grösser 5 und kleiner 23 Uhr ist und wenn ja DANN wird geblinkt. (also natürlich: es wird NICHT geblinkt)

Aber tatsächlich hab ich da auch einen Flüchtigkeitsfehler drin, es muss natürlich heissen:

define tower_blink at +*00:05:00 { if($ho...

at +*00:05:00  = immer wieder alle 5 Minuten
at *00:05:00 = immer wieder um 00:05:00 Uhr


ZitatBevor ihr mich steinigt bin ich selbst drauf gekommen.
Das "+" fehlte:

Genau. So Kram passiert leider, wenn man so Dinger aus'm Kopp schnell hintippt. Sorry.
Aber  hast den Fehler entdeckt...   ;-)
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: koldomon am 22 November 2013, 17:42:47
Hi,

spannendes Thema, ein bischen verspielt, ich mag auch mitbasteln.  ;D

Ich hab so ne ähnliche Zeitsteuerung mit meinem Zimmerbrunnen gemacht. Das würde ich dir nahelegen mit deinem Leuchtturm auch zu machen. Da ich dir die Freude des selbstimplementieren nicht nehmen möchte (bin ja selbst auch noch anfänger) poste ich dir hier nur meine funktionierende Lösung.

Anforderung: Zimmerbrunnen bei Sonnenaufgang anschalten (das kommt mit einem Leuchtturm natürlich noch wesentlich besser - so mach ich meine Weihnachtsbeleuchtung hehe)

#erstmal ein Notify, der das Device ansteuert
#02_OG_Wohn_Brunnen NOTIFY
define 02_OG_Wohn_Brunnen_Notify notify 02_OG_Wohn_Brunnen_Notify {\
fhem "set FS20_2e $EVENT";;\
}
attr 02_OG_Wohn_Brunnen_Notify disable 0

#AT zum täglichen Einschalten
#02_OG_Wohn_Brunnen AT On
define 02_OG_Wohn_Brunnen_AT_On at *05:00:00 {\
fhem "trigger 02_OG_Wohn_Brunnen_Notify on";;\
}

#AT zum täglichen Ausschalten
#02_OG_Wohn_Brunnen AT Off
define 02_OG_Wohn_Brunnen_AT_Off at *18:00:00 {\
fhem "trigger 02_OG_Wohn_Brunnen_Notify off";;\
}

Das ist das "Grundgerüst". Als weitere Anforderung wollte ich natürlich, dass am WE, an Feiertagen und im Urlaub nicht um 5:46 Uhr der Brunnen loslegt, wenn man nicht aufstehen muss. Daher hab ich für die 3 Bedingungen jeweil ein "dummy" definiert, welche täglich aktualisiert werden und einfach 0 oder 1 liefern.
#FunctionDummies
define isFeiertag dummy
attr isFeiertag setList state:1,0

define isWeekend dummy
attr isWeekend setList state:1,0

define isHoliday dummy
attr isHoliday setList state:1,0

Und jetzt kommt *trommelwirbel" der Magic-Hint. Ich lass einfach täglich einen AT nach 0:00 Uhr laufen, der mir die Zeitwerte in den On bzw Off at's aktualisiert. Das sieht so aus:

#den update der at's in ein Notify gepackt erleichtert das "debugging"
#02_OG_Wohn_Brunnen_Update_Notivy
define 02_OG_Wohn_Brunnen_Update_Notify notify 02_OG_Wohn_Brunnen_Update_Notify {\
if (Value("isFeiertag")==1 || Value("isHoliday")==1 || Value("isWeekend")==1)\
{\
fhem "modify 02_OG_Wohn_Brunnen_AT_On *{sunrise_abs(7200)}";;\
fhem "modify 02_OG_Wohn_Brunnen_AT_Off *{sunset_abs()}";;\
}\
else\
{\
fhem "modify 02_OG_Wohn_Brunnen_AT_On *05:00:00";;\
fhem "modify 02_OG_Wohn_Brunnen_AT_Off *{sunset_abs()}";;\
}\
#täglich den Update_Notify triggern
#02_OG_Wohn_Brunnen_Update_AT
define 02_OG_Wohn_Brunnen_Update_AT at *03:05:00 {\
fhem "trigger 02_OG_Wohn_Brunnen_Update_Notify";;\
}


Was das für deine Lösung bedeuten kann. Das ganze Jahr immer pünktlich zum Sonnenaufgang (oder -untergang) geht dein Leuchtturm an. Dein Leuchtturmwächter hat am WE frei und 30 Urlaubstage *schenkelklopf*. Du kannst deine Anforderung für das manuelle schalten leicht integrieren.

Ich hoffe dir eine kreative Anregung gegeben zu haben. Viel Spass damit
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 22 November 2013, 18:02:31
Hallo koldomon,
ich bin beeindruckt. Deine Logik erschließt sich mir schon beim Drüberlesen ... und das freut mich erst einmal. Die Logik ist gut und übersichtlich!
Frage, wo kommt denn dein isHoliday her? Greifst du auf einen Kalender zu - sicher ist das ein Schulferienkalender deines Bundeslandes und du bist Lehrer *grins*
Deshalb vielleicht die verständliche Form *nochmalgrins*

Ich würde zu deinem Code doch noch gerne eine Frage stellen:
Zitatdefine 02_OG_Wohn_Brunnen_Notify notify 02_OG_Wohn_Brunnen_Notify {\
   fhem "set FS20_2e $EVENT";;\
}
Was ist denn das "FS20_2e" ?

Übrigens, der Tipp mit dem Urlaub und Wochenende des Leuchtturmwärters ist gut, ein Leuchtturm orientiert Seeleute aber das ganze Jahr. Das bedeutet, ich muss Schichtbetrieb organisieren  ;)
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: koldomon am 22 November 2013, 18:18:31
Hi uron,

ZitatFrage, wo kommt denn dein isHoliday her?
#Calendar
define myFeiertageBayern Calendar ical url http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Bayern_2013.ics 2592000

#Calendar_Update_Notify
define myFeiertageBayern_Update_Notify notify myFeiertageBayern:mode(Start|End|Started|Ended).* {\
fhem "trigger isFeiertag_Notify";;\
}

#Holiday
define myHoliday holiday

#FunctionDummies_Notify
define isFeiertag_Update_Notify notify isFeiertag_Update_Notify {\
if (!ReadingsVal("myFeiertageBayern","modeAlarmOrStart","") eq "")\
{\
fhem "set isFeiertag 1";;\
}\
else\
{\
fhem "set isFeiertag 0";;\
}\
}

define isWeekend_Update_Notify notify isWeekend_Update_Notify {\
if ($we)\
{\
fhem "set isWeekend 1";;\
}\
else\
{\
fhem "set isWeekend 0";;\
}\
}

define isHoliday_Update_Notify notify isHoliday_Update_Notify {\
if (!Value("myHoliday") eq "none")\
{\
fhem "set isHoliday 1";;\
}\
else\
{\
fhem "set isHoliday 0";;\
}\
}

define glbDummyState_Update_Notify notify glbDummyState_Update_Notify {\
fhem "trigger isFeiertag_Update_Notify";;\
fhem "trigger isHoliday_Update_Notify";;\
fhem "trigger isWeekend_Update_Notify";;\
}

#FunctionDummy_AT
define glbDummyState_Update_AT at *03:03:00 {\
fhem "trigger glbDummyState_Update_Notify";;\
}




So, das ist erstmal das "Drumherum". Jetzt zu der Frage
ZitatWas ist denn das "FS20_2e"
Das ist meine FS20 schaltsteckdose, die den Brunnen schaltet. An der Stelle musst du deinen Code reinsetzen, also den "blink"

Schichtarbeit, da werd ich doch mal deinen Leuchtturmwärtern nahelegen sich an die Gewerkschaft zu wenden  ;D

Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: koldomon am 22 November 2013, 18:24:04
Mir fällt grad nochwas ein.

Wenn du für deine "HandSteuerung" einfach ein "dummy" definierst, das erfasst, ob du den Taster gedrückt hast, kannst du das in deinem "at" prüfen und das blinken abbrechen und den at deaktivieren. mit dem "daily-update-at" kannst du notfalls den dummy reseten. nur so ne idee
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 23 November 2013, 15:01:19
Ich befürchte, das mit den dummy ist zu unsicher bzw. ungenau, da ich nicht ausschließen kann, dass vielleicht 2x die Fernbedienung gedrückt wurde.
Ich denke, ich brauche des tatsächlichen Status.
Danke aber trotzdem für den Hinweis!
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: koldomon am 23 November 2013, 15:21:36
Das kannst du im "dummy" aber abfangen. Der "dummy" soll ja auch nur als Prüfvariable dienen, ob Manuell geschalten wurde. Das eigentliche Problem besteht in der verwendung des "toggle". Das führt (erfahrungsgemäß) bei FS20 immer wieder mal zu Fehlern, wenn zwar der FHEM das toggle empfangen hat, aber der Aktor nicht schaltet. Dann würde der Dummy "true" liefern und der Leuchtturm ist aber real aus. Auch deine FS20 im FHEM zeigt "on". Ich hab bei mir wieder alles auf "on/off" umgestellt um nicht in dieses Problem zu laufen. Das war mir auch nochmal 2 FS20 Fernbedienungen wert.

Halt uns auf dem laufenden, ein Bildchen deines Leuchtturm wäre der "overkill" ;-)
Titel: Antw:Statusabfrage: Lampe nur einschalten, wenn sie vorher aus war
Beitrag von: uron am 24 November 2013, 10:53:22
Na damit diene ich doch gerne als Dank für eure Mühe!
Hier das Foto von dem gerade blinkenden Turm mit einer Höhe von ca. 70 cm.