Hauptmenü

DOIF - Rolladensteuerung

Begonnen von Toto1973, 05 März 2015, 11:53:35

Vorheriges Thema - Nächstes Thema

Toto1973

Hallo!
Ein Problem jagt das nächste...
Zur Rolladensteuerung habe ich mir auch eine DOIF gebastelt. Das Ganze sieht so aus:
Internals:
   DEF        ([?Schicht_dummy:state] eq "Frueh" and [{wz_b_randomtime("07,15,30")}|8]) (set wz_rol_Balkon pct 0) DOELSEIF ([?Schicht_dummy:state] eq "Mittel" and [{wz_b_randomtime("08,00,30")}|8]) (set wz_rol_Balkon pct 0) DOELSEIF ([{wz_b_randomtime("09,00,30")}|7]) (set wz_rol_Balkon pct 0)
   NAME       wz_Rolladen_Balkontuer_auf
   NR         120
   NTFY_ORDER 50-wz_Rolladen_Balkontuer_auf
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-03-03 09:16:45   cmd_event       timer_3
     2015-03-03 09:16:45   cmd_nr          3
     2015-03-03 09:16:45   state           cmd_3
     2015-03-05 07:35:15   timer_1_c1      06.03.2015 07:16:37|8
     2015-03-05 08:28:18   timer_2_c2      06.03.2015 08:15:14|8
     2015-03-05 09:11:08   timer_3_c3      06.03.2015 09:01:06|7
   Condition:
     0          ReadingValDoIf('Schicht_dummy','state','') eq "Frueh" and DOIF_time_once($hash->{timer}{0},$wday,"8")
     1          ReadingValDoIf('Schicht_dummy','state','') eq "Mittel" and DOIF_time_once($hash->{timer}{1},$wday,"8")
     2          DOIF_time_once($hash->{timer}{2},$wday,"7")
   Days:
     0          8
     1          8
     2          7
   Devices:
   Do:
     0          set wz_rol_Balkon pct 0
     1          set wz_rol_Balkon pct 0
     2          set wz_rol_Balkon pct 0
   Helper:
     last_timer 3
     sleeptimer -1
   Internals:
   Readings:
   Realtime:
     0          07:16:37
     1          08:15:14
     2          09:01:06
   State:
   Time:
     0          {wz_b_randomtime("07,15,30")}
     1          {wz_b_randomtime("08,00,30")}
     2          {wz_b_randomtime("09,00,30")}
   Timecond:
     0          0
     1          1
     2          2
   Timer:
     0          0
     1          0
     2          0
   Timerfunc:
   Timers:
     0           0
     1           1
     2           2

Die Sub in 99_MyUtils.pm:
sub
wz_b_randomtime($) {
  my ($MeH,$MeM,$MeB) = split(",", shift);
  my $ZtA = int($MeH*3600 + $MeM*60 + rand($MeB*60));
  my $ZtH = int($ZtA/3600);
  my $ZtM = int(($ZtA-$ZtH*3600)/60);
  my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
  return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);
}


Das Ganze hat anfangs mal sehr gut funktioniert. Seit 2 Tagen ungefähr geht es aber nicht mehr.
Was mir aufgefallen ist, diese DOIF wurde das letzte mal am 03.03.2015 ausgeführt.
Was mir noch aufgefallen ist, das Datum für das nächste Öffnen wurde schon bevor die Zeit zum öffnen erreicht war, umgestellt. Wie kann das sein?
cmd_event timer_3 2015-03-03 09:16:45
cmd_nr 3 2015-03-03 09:16:45
state cmd_3 2015-03-03 09:16:45
timer_1_c1 06.03.2015 07:16:37|8 2015-03-05 07:35:15
timer_2_c2 06.03.2015 08:15:14|8 2015-03-05 08:28:18
timer_3_c3 06.03.2015 09:01:06|7 2015-03-05 09:11:08

Die Uhrzeit für Timer3 wurde bereits um 09:11 neu gesetzt. Ich bin mir aber zu 100% sicher, das der Zeitpunkt für Heute für Timer3 09:24 Uhr war!
Die 7 stimmt natürlich auch. Ich habe im holiday krank drin stehen ;-)
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

Toto1973

So da ich mir einen Helligkeitssensor basteln werde, mal eine andere Frage:

Wie kann ich es denn umsetzten, das wenn der Sensor unterhalb eines bestimmten Wertes fällt, dann eine Art RandomTimer startet, der mir innerhalb von 15 Minuten den Rolladen herunterfährt?
Alles was ich bis jetzt an Ideen gefunden habe, funktioniert nur in Verbindung mit Sunset. Die Idee war auch mal, eine Sleep Befehl mit einem {int(rand(600))} zu kombinieren, um die Sekunden als Zufall berechnen zu lassen. Das geht wohl so aber auch nicht!
Hat da jemand eine Idee, wie man das umsetzen könnte?
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

Damian

Zitat von: Toto1973 am 05 März 2015, 13:54:20
So da ich mir einen Helligkeitssensor basteln werde, mal eine andere Frage:

Wie kann ich es denn umsetzten, das wenn der Sensor unterhalb eines bestimmten Wertes fällt, dann eine Art RandomTimer startet, der mir innerhalb von 15 Minuten den Rolladen herunterfährt?
Alles was ich bis jetzt an Ideen gefunden habe, funktioniert nur in Verbindung mit Sunset. Die Idee war auch mal, eine Sleep Befehl mit einem {int(rand(600))} zu kombinieren, um die Sekunden als Zufall berechnen zu lassen. Das geht wohl so aber auch nicht!
Hat da jemand eine Idee, wie man das umsetzen könnte?
Beispiel:

define di_test DOIF (...)(set bla on, attr di_test wait {(int(rand(600)))})
attr di_test wait 300
attr di_test do always


Hier wird der wait-timer für die nächste Ausführung per Zufall vorbereitet.

Gruß

Damian


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

Toto1973

#3
Dankeschön für die Antwort!
Das werde ich mal testen. Ich muss nur morgen mal den Sensor zusammen löten.

Ich habe das jetzt mal mit einem Test dummy ausgiebig getestet!
Das ist genial!
Ich wäre nie auf die Idee gekommen...
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

Damian

Zitat von: Toto1973 am 05 März 2015, 18:28:33
Dankeschön für die Antwort!
Das werde ich mal testen. Ich muss nur morgen mal den Sensor zusammen löten.

Ich habe das jetzt mal mit einem Test dummy ausgiebig getestet!
Das ist genial!
Ich wäre nie auf die Idee gekommen...

ja, viele andere FHEM-Jünger wahrscheinlich auch nicht, denn attr di_test wait {(int(rand(600)))} funktioniert nur innerhalb eines DOIFs ;)

Gruß

Damian


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

Toto1973

Da das bestimmt auch andere interessieren könnte, hier mein funktionierender Code.
Ich habe noch den Befehl save hinzugefügt, damit der "Timer" auch einen Neustart überlebt.
define sz_Rolladen_zu DOIF ([sonne_unter:state] eq "on") (set sz_Fenster pct 100,attr sz_Rolladen_zu wait {(int(rand(600)))},save)
attr sz_Rolladen_zu do always
attr sz_Rolladen_zu wait 150
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

Damian

Zitat von: Toto1973 am 06 März 2015, 14:45:44
Da das bestimmt auch andere interessieren könnte, hier mein funktionierender Code.
Ich habe noch den Befehl save hinzugefügt, damit der "Timer" auch einen Neustart überlebt.
define sz_Rolladen_zu DOIF ([sonne_unter:state] eq "on") (set sz_Fenster pct 100,attr sz_Rolladen_zu wait {(int(rand(600)))},save)
attr sz_Rolladen_zu do always
attr sz_Rolladen_zu wait 150


Ich finde auch, dass es eine einfache und elegante Lösung für Zufallsverzögerung ist, daher werde ich es mal in die Doku aufnehmen.

Gruß

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