DOIF Zeitschaltuhr triggert falsch

Begonnen von Spartacus, 06 März 2015, 10:00:01

Vorheriges Thema - Nächstes Thema

Toto1973

Ob es nun hier rein passt, weis ich jetzt nicht ganz genau!

Ich habe auch eine Frage zu DOIF:
Wie bekomme ich es hin, das etwas jede Stunde, zur vollen Stunde, getriggert wird?
Meine Idee wäre:
define test DOIF ([10:00-21:00]) ({WandUhr()})
attr test do always
attr test wait 3600


Es soll also jede Stunde die Sub Wanduhr() aufgerufen werden.
Oder würde es so gehen?
define test DOIF ([10:00] or [+01:00]) ({WandUhr()})
attr test do always

Für den 2. fall müsste man dann aber noch ein dummy und eine DOIF bauen, die das erste DOIF (test) zu einem bestimmten Zeitpunkt abschaltet.
Hat da jemand eine Idee?
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

flurin

Steve Jobs wird sich sicher im Grab umdrehen aber es funktioniert:


define at_hour10 at 10:00 {WandUhr()}
define at_hour11 at 11:00 {WandUhr()}
define at_hour12 at 12:00 {WandUhr()}
...
define at_hour21 at 21:00 {WandUhr()}


Gruss
flurin

Damian

Zitat von: Toto1973 am 13 März 2015, 11:59:48
Ob es nun hier rein passt, weis ich jetzt nicht ganz genau!

Ich habe auch eine Frage zu DOIF:
Wie bekomme ich es hin, das etwas jede Stunde, zur vollen Stunde, getriggert wird?
Meine Idee wäre:
define test DOIF ([10:00-21:00]) ({WandUhr()})
attr test do always
attr test wait 3600


Es soll also jede Stunde die Sub Wanduhr() aufgerufen werden.
Oder würde es so gehen?
define test DOIF ([10:00] or [+01:00]) ({WandUhr()})
attr test do always

Für den 2. fall müsste man dann aber noch ein dummy und eine DOIF bauen, die das erste DOIF (test) zu einem bestimmten Zeitpunkt abschaltet.
Hat da jemand eine Idee?

So wird es nicht funktionieren.

DOIF kann noch keine Wiederholungen zu festen Zeiten, kommt später mal.

Solange kannst du aber at nehmen:

Zitat aus der Commandref zu at:

ZitatalignTime
Nur für relative Definitionen: Stellt den Zeitpunkt der Ausführung des Befehls so, dass er auch zur alignTime ausgeführt wird. Dieses Argument ist ein timespec. Siehe oben fü die Definition
Beispiel:
# Stelle sicher das es gongt wenn eine neue Stunde beginnt.
define at2 at +*01:00 set Chime on-for-timer 1
attr at2 alignTime 00:00


Gruß

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

Brockmann

Mit einem DOIF und einem Dummy könnte man es vermutlich so machen (ungetestet):


define test DOIF ([[Uhrzeit]])
    (
    {WandUhr()},
    {my $t=sprintf("%02d",$hour+1);;fhem("set Uhrzeit $t:00")},
    IF([Uhrzeit] eq "22:00")(set Uhrzeit "10:00"),
    )


Vorher müsste man Uhrzeit einmal auf einen halbwegs sinnvollen Wert setzen (z. B. die nächste volle Stunde)

flurin

#19
Zitat von: Brockmann am 13 März 2015, 16:35:34
Mit einem DOIF und einem Dummy könnte man es vermutlich so machen (ungetestet):


define test DOIF ([[Uhrzeit]])
    (
    {WandUhr()},
    {my $t=sprintf("%02d",$hour+1);;fhem("set Uhrzeit $t:00")},
    IF([Uhrzeit] eq "22:00")(set Uhrzeit "10:00"),
    )


Vorher müsste man Uhrzeit einmal auf einen halbwegs sinnvollen Wert setzen (z. B. die nächste volle Stunde)

Einen ähnlichen Ansatz hatte ich auch  :)


define clock dummy

define di_hour DOIF ([[clock]])
({WandUhr();;
if($hour >= 10 and $hour <= 21)
{my $t = sprintf("%02d:00",$hour+1);; fhem("set clock $t")}
else {fhem("set clock 10:00")}
})


Puschel74

#20
Hallo,

so wie von Damian vorgeschlagen würde ich das mit einem at lösen:

define Zeitschaltuhr at +*01:00:00 {WandUhr()}
attr Zeitschaltuhr alignTime 00:00
attr Zeitschaltuhr disabledForIntervals 21:01-08:59


Ich meine mich dunkel zu erinnern das Rudi das disabledForIntervals über Mitternacht gefixt hat.
Wenn nicht sollte sowas evtl. klappen:
attr Zeitschaltuhr disabledForIntervals 21:01-24:00 00:00-08:59

Grüße
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.

Toto1973

Vielen dank für die Antworten.
Ich hatte eigentlich gehofft, man würde hier mit wenig Code auskommen.
Weil dann kann ich auch eine DOIF nehmen, bei der ich jede Stunde angebe und mit or verbinde ;-)
Beispiel:
define test DOIF ([09:00] or [10:00] or [11:00] or...) ({WandUhr()})
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

flurin

#22
Zitat von: Toto1973 am 14 März 2015, 00:33:26
Vielen dank für die Antworten.
Ich hatte eigentlich gehofft, man würde hier mit wenig Code auskommen.
Weil dann kann ich auch eine DOIF nehmen, bei der ich jede Stunde angebe und mit or verbinde ;-)
Beispiel:
define test DOIF ([09:00] or [10:00] or [11:00] or...) ({WandUhr()})

Klar! KISS (keep it simple stupid) ist immer gut  :)

Eine Variante habe ich noch:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({if ($hour >= 10 and $hour <= 21)
{WandUhr()}},attr di_hour wait 3600)
attr di_hour do always


if ($hour >= 10 and $hour <= 21) könntest Du noch in WandUhr() einfügen, dann sieht es so aus:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({WandUhr()},attr di_hour wait 3600)
attr di_hour do always

Damian

Zitat von: flurin am 14 März 2015, 07:31:12
Klar! KISS (keep it simple stupid) ist immer gut  :)

Eine Variante habe ich noch:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({if ($hour >= 10 and $hour <= 21)
{WandUhr()}},attr di_hour wait 3600)
attr di_hour do always


if ($hour >= 10 and $hour <= 21) könntest Du noch in WandUhr() einfügen, dann sieht es so aus:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}]) ({WandUhr()},attr di_hour wait 3600)
attr di_hour do always


Wozu das wait?

Das sollte schon ausreichen:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and [?09:00-21:00]) ({WandUhr()})
attr di_hour do always


Gruß

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

flurin

Zitat von: Damian am 14 März 2015, 07:58:32
Wozu das wait?

Das sollte schon ausreichen:

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and [?09:00-21:00]) ({WandUhr()})
attr di_hour do always


Gruß

Damian

Ja, richtig! ich war noch am üben  :)
Aber jetzt ist das Kind geboren. Ich denke, diese Lösung kann man generell verwenden.

Gruss
flurin

Brockmann

Zitat von: flurin am 14 März 2015, 08:10:23
Aber jetzt ist das Kind geboren. Ich denke, diese Lösung kann man generell verwenden.
Ich hatte doch eine Ahnung, dass es noch kürzer geht.  :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).

Und wem das nun noch zuviel Code für diese Aufgabe ist, der sollte sich überlegen, ob FHEM das richtige für ihn ist.  ;)

Damian

Zitat von: Brockmann am 14 März 2015, 09:00:46
Ich hatte doch eine Ahnung, dass es noch kürzer geht.  :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).

Und wem das nun noch zuviel Code für diese Aufgabe ist, der sollte sich überlegen, ob FHEM das richtige für ihn ist.  ;)

Wenn es sich bewährt, dann kommt das in die Commandref. Diese Lösung dürfte noch mehr Möglichkeiten bieten als  alignTime bei at.

Weiß denn überhaupt jemand was denn alignTime 01:01 bedeutet?

Und wenn man es mit DOIF macht, dann sollte man auch gleich die Vorteile des Moduls nutzen ;)

define di_hour DOIF ([{sprintf("%02d:00",$hour+1)}] and ([?10:00-22:01|7] or [?07:00-21:01|8])) ({WandUhr()})
attr di_hour do always


So kann man am Wochenende länger schlafen ;)

Gruß

Damian

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

Toto1973

#27
Ich wusste, das ich in diesem Thread die Experten finden würde :-D
Vielen Dank, das gefällt mir weitaus besser und wird jetzt direkt eingebaut!

So lässt sich die WandUhr nun auch über ein dummy schalten, das z.B. erst auf on gesetzt wird, wenn der Wecker geklingelt hat.
Hab mir da nämlich auch einen für FHEM zusammen gebastelt.
Der simuliert erst ein WackupLight und weckt mich dann mit Ansage der Uhrzeit, Datum und Wetterbericht und spielt dann für 10 Minuten Radio.
FHEM ist einfach genial!
Raspberry PI2, Rademacher DuoFern Stick, CUL, 2 x SCC,  JeeLink 868 Mhz, JeeLink 433 Mhz, 3x Magic UFO LED WiFi Controller, 4x MAX BC-RT-TRX-CyG, 2x MAX Fensterkontakt, 5x Rademacher Gurtwickler, 6x TX29DTH-it, 2x TX25-it als Helligkeitssensor, 1X HM-ES-PM, 6x Sonoff, 7x G-Homa, PIR-1000

Brockmann

Zitat von: Damian am 14 März 2015, 09:10:16
Weiß denn überhaupt jemand was denn alignTime 01:01 bedeutet?

Alle die Leute, die wissen, was waitdel 0:2 bedeutet! *duckundweg*  ;)

flurin

#29
Zitat von: Brockmann am 14 März 2015, 09:00:46
Ich hatte doch eine Ahnung, dass es noch kürzer geht.  :)
Wobei ich die at-Variante für diesen speziellen Einsatzzweck eleganter finde, weil sie "sparsamer" und auch für Laien besser durchschaubar ist (IMHO).

Geschmacksache, ich finde DOIF diesbezüglich flexibler.

Meine imaginäre Wanduhr beispielsweise hat noch einen Viertelstunden-Gong:

define di_quarter DOIF ([{sprintf("%02d:%02d",$hour,$min+1)}] and ($min == 15 or $min == 30 or $min == 45)) ({Clock("quarter")})

Gruss
flurin