FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Toto1973 am 05 März 2015, 11:53:35

Titel: DOIF - Rolladensteuerung
Beitrag von: Toto1973 am 05 März 2015, 11:53:35
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 ;-)
Titel: Antw:DOIF - Rolladensteuerung
Beitrag 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?
Titel: Antw:DOIF - Rolladensteuerung
Beitrag von: Damian am 05 März 2015, 18:06:11
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


Titel: Antw:DOIF - Rolladensteuerung
Beitrag 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...
Titel: Antw:DOIF - Rolladensteuerung
Beitrag von: Damian am 05 März 2015, 19:56:39
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


Titel: Antw:DOIF - Rolladensteuerung
Beitrag 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
Titel: Antw:DOIF - Rolladensteuerung
Beitrag von: Damian am 06 März 2015, 15:45:37
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