DOIF neues Feature: Wiederholende Ausführung mit Zeitangabe

Begonnen von Damian, 06 November 2015, 22:05:57

Vorheriges Thema - Nächstes Thema

moonsorrox

Zitat von: Ellert am 28 Januar 2016, 09:31:59
Für diese Dauer ist AUS rand(1800)+600 und für diese EIN rand(600)+600.

OK, dann gehe ich davon aus das bei meiner Einstellung unten für
AUS: die minimum Zeit 11min. und die maximum Zeit 40min. sein könnte und natürlich alles dazwischen
und für
EIN: die minimum Zeit 11min. und die maximum Zeit 70min. (war zufällig auch bei mir einmal der Fall) sein könnte. Weil für rand(x)macht er wohl in jedem Fall 1 Minute.

Das sind die Ergebnisse des letzten Testzeitraumes
Einstellung
repeatcmd: 1
wait: 0,rand(1800)+600,rand(3600)+600
Für AUS rand(1800)+600 und für EIN rand(3600)+600.

Zeit EIN ist von minimum 19 min. bis maximal 1 h 10 min.
Zeit AUS ist minimum 14 min. bis maximal 37 min.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: Ellert am 28 Januar 2016, 10:27:59
@Damian: Ich habe es mit "timerWithWait" probiert. Das Verhalten hat sich nur wenig geändert.

Die 1. Runde funktioniert, wie erwartet.
ab der 2. Runde wird der 1. berechnete wait-Timer ignoriert.

Benutztes DOIF-Modul: Testversion 0.6
Untersuchtes DOIF:([09:41:45]) (({Log 1,"DOIF anaus: Einschalten"})) (({Log 1,"DOIF anaus: Ausschalten"}))

wait (rand(5)+5),(rand(5)+5)
repeatcmd 1
timerWithWait


Das Logging dazu:
Ergänzt: Testversion 0.7 zeigt das gleiche Verhalten

ja, es ist so programmiert, dass die Angabe bei repeatcmd sich auf die letzte Ausführung bezieht, dabei wird wait nicht mehr berücksichtigt.

Bei wait 5,5 und repeatcmd 10

bedeutet es:

00:00 trigger  +5
00:05 cmd1_1 +5
00:10 cmd1_2 +10
00:20 cmd1_1 +5
00:25 cmd1_2 +5
00:35 cmd1_1 +10
...

Gruß

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

Ellert

#62
@Damian: Danke, für die Erläuterung.

@moonsorrox: Du hast jetzt zwar ein funktionierendes DOIF, aber es könnte (ohne leere Klammer) formuliert werden.

([<Zeitspanne>]) (set Dachlicht_03 on ) (set Dachlicht_03 off)
DOELSE  (set Dachlicht_03 off) damit das Licht zum Schluss auch wirklich ausgeht.

wait rand(t_ein_zufall)+t_ein_fix, rand(t_aus_zufall)+t1_aus_fix
repeatcmd rand(t_ein_zufall)+t_ein_fix
timerWithWait

moonsorrox

so ich habe das auch mal getestet und dieses ist meine DEF. damit ich das später so einbauen kann.

([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and ([[du_Anfang_Zufall]]-[[du_Ende_Zufall]])) ()(set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"}))

Einstellung
repeatcmd: rand(3600)+600
wait: rand(3600)+600, rand(900)+300
timerWithWait (hierzu muss ich sagen, da macht er mir immer eine 1 hinter)

Zeit EIN ist von minimum 5 min. bis maximal 20 min.
Zeit AUS ist minimum 22 min. bis maximal 57 min.
Irgendwie sind jetzt die Zeiten alle wieder viel kürzer...! ich habe mal verscuht hier unter es für mich zu verstehen, evtl. liege ich aber falsch.. bitte berichtigen falls ja..!

wenn ich jetzt mal diese von dir zu Grunde lege
wait rand(t_ein_zufall)+t_ein_fix, rand(t_aus_zufall)+t1_aus_fix
repeatcmd rand(t_ein_zufall)+t_ein_fix


sollte bei meinen Zeiten oben die zufällige Zahl von rand(t_ein_zufall) entweder als kleinste 1min. und als größte 60min. sein plus den fixen Wert für ein t_ein_fix 10min. sein.
Das kann so nicht stimmen, denn die kleinste Zeit ist immer 1min + 10min= 11min. und die größte sollte minimum 60+10min=70min. dieses ist aber nie passiert, denn schon die kleinste Zahl stimmt nicht die ist nämlich 5 gewesen und die größte bisher nur 20

Ebenso die ganze Sache bei der Auszeit, denn die größte Pausen ist nie eingetreten, nämlich t_aus_zufall + t1_aus_fix in Zahlen 15+5=20min. die ist größer gewesen bis viel größer.
Nun verstehe ich die ganze Logik überhaupt nicht mehr..!

Momentan läuft noch ein weiterer Test, denn er hat auch meine Ausschaltzeit ignoriert (du_Ende_Zufall) eingeschaltet hat er aber eben nicht mehr AUS.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Ellert

Hier steht was rand leistet: http://perldoc.perl.org/functions/rand.html , rand(x) erzeugt Zahlen Z, für die gilt 0 <= Z < x.

Beispiel: rand(600), kleinste Zahl 0, grösste Zahl etwa 599,999999

Du beobachtest immer nur wenige erzeugte Zahlen. Damit kannst Du keine Grenzen ermitteln.

Für rand(600)+300 wird irgendwann eine Zahl 300 und eine  Zahl 899.999999, Du konntest das bei 20 Versuchen zufällig nicht beobachten.

Zitatals kleinste 1min. und als größte 60min
das kann rand nicht leisten, das geht nur mit rand(540)+60

ZitatDas kann so nicht stimmen, denn die kleinste Zeit ist immer 1min + 10min= 11min. und die größte sollte minimum 60+10min=70min. dieses ist aber nie passiert, denn schon die kleinste Zahl stimmt nicht die ist nämlich 5 gewesen und die größte bisher nur 20

Ebenso die ganze Sache bei der Auszeit, denn die größte Pausen ist nie eingetreten, nämlich t_aus_zufall + t1_aus_fix in Zahlen 15+5=20min. die ist größer gewesen bis viel größer.
Nun verstehe ich die ganze Logik überhaupt nicht mehr..!

Mit diesem Beispiel:
ZitatEinstellung
repeatcmd: rand(3600)+600
wait: rand(3600)+600, rand(900)+300
ergeben sich folgende Grenzen:

1. Runde
kleinste Wartezeit 600 s (10 min) längste Wartezeit 4199,999999 s (~70 min), dann Einschalten
kleinste Wartezeit 300 s (5 min) längste Wartezeit 1199,999999 s (~20 min), dann Ausschalten
2. Runde
kleinste Wartezeit 600 s (10 min) längste Wartezeit 4199,999999 s (~70 min), dann Einschalten
kleinste Wartezeit 300 s (5 min) längste Wartezeit 1199,999999 s (~20 min), dann Ausschalten
.
.
.

Ich habe es im kleineren Masstab nachgestellt:

repeatcmd rand(360)+60
wait rand(360)+60,rand(90)+30
timerWithWait 1

Zitat17:29:00 Start
2016.01.29 16:34:50 1: DOIF anaus: Einschalten nach 350 s (min 60 s, max 420 s)
2016.01.29 16:36:26 1: DOIF anaus: Ausschalten nach 96 s (min 30 s, max 120 s)
2016.01.29 16:37:58 1: DOIF anaus: Einschalten nach 92 s  (min 60 s, max 420 s)
2016.01.29 16:39:42 1: DOIF anaus: Ausschalten nach 104 s (min 30 s, max 120 s)
2016.01.29 16:42:01 1: DOIF anaus: Einschalten nach 139 s  (min 60 s, max 420 s)
2016.01.29 16:43:27 1: DOIF anaus: Ausschalten nach 86 s (min 30 s, max 120 s)
2016.01.29 16:45:51 1: DOIF anaus: Einschalten nach 144 s  (min 60 s, max 420 s)
2016.01.29 16:46:42 1: DOIF anaus: Ausschalten nach 51 s (min 30 s, max 120 s)
2016.01.29 16:50:44 1: DOIF anaus: Einschalten nach 242 s  (min 60 s, max 420 s)
2016.01.29 16:51:18 1: DOIF anaus: Ausschalten nach 51 s (min 30 s, max 120 s)
2016.01.29 16:53:00 1: DOIF anaus: Einschalten nach 102 s  (min 60 s, max 420 s)
2016.01.29 16:54:52 1: DOIF anaus: Ausschalten nach 112 s (min 30 s, max 120 s)

Ich kann keine unzulässige Abweichung erkennen.



moonsorrox

#65
Zitat von: Ellert am 29 Januar 2016, 16:59:07
Hier steht was rand leistet: http://perldoc.perl.org/functions/rand.html , rand(x) erzeugt Zahlen Z, für die gilt 0 <= Z < x.

Beispiel: rand(600), kleinste Zahl 0, grösste Zahl etwa 599,999999

OK, dann lag ich gar nicht so falsch ich hatte immer angenommen die kleinste Zahl ist "1" also nun ist sie "0"
Ich wollte damit auch nur sagen das die Zeiten für mich bei rand(600) zufällig eben jetzt minimal 0min. und dann eben 10min (9,9xxxx) sind.

Was ich damit sagen wollte für mich sah das nach umgekehrter EIN/AUS Schaltung aus, die Beleuchtung war länger AUS als sie EIN war..!

Nach dem Beispiel hier:
wait rand(t_ein_zufall)+t_ein_fix, rand(t_aus_zufall)+t1_aus_fix
repeatcmd rand(t_ein_zufall)+t_ein_fix


Ich werde das morgen nochmal mit kurzen Zeiten laufen lassen so wie du es getan hast, denn nach meinen Zeiten war die Beleuchtung immer nur kurz EIN aber lang AUS.

Kannst du mir etwas zu der Abschaltung sagen, denn diese hat bei mir nicht funktioniert mit meinem DEF.
EINschalten ging aber die ganze Simulation lief einfach weiter über die eingestellte Zeit.

Ich habe diese Variante jetzt mal im Einsatz
([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Anfang_Zufall]-[du_Ende_Zufall]]) (set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"})) DOELSE (set Dachlicht_03 off, ({Log 1, "ZeitAus"}))

Das war der letzte Stand, hier funktionierte es nicht, aber mal schauen ob das mit der jetzigen Version geht:
([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Anfang_Zufall]]-[[du_Ende_Zufall]]) (set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"})) DOELSE (set Dachlicht_03 off, ({Log 1, "ZeitAus"}))


Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Ellert

#66
ZitatWas ich damit sagen wollte für mich sah das nach umgekehrter EIN/AUS Schaltung aus, die Beleuchtung war länger AUS als sie EIN war..!
Da haben wir uns missverstanden:
Bei
repeatcmd: rand(3600)+600
wait: rand(3600)+600, rand(900)+300
ist
rand(3600)+600 die Wartezeit bis zum Einschalten und
rand(900)+300  die Wartezeit bis zum Ausschalten

Wenn das
([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Anfang_Zufall]-[du_Ende_Zufall]])
   (set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"}))
DOELSE (set Dachlicht_03 off, ({Log 1, "ZeitAus"}))

nicht klappt, dann versuch
([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Anfang_Zufall]-[du_Ende_Zufall]])
    (set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"}))

das hat bei mir funktioniert oder
([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Anfang_Zufall]])
    (set Dachlicht_03 on, ({Log 1, "Einschalten"})) (set Dachlicht_03 off, ({Log 1, "Ausschalten"}))
DOELSEIF ([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and [[du_Ende_Zufall]])
   (set Dachlicht_03 off, ({Log 1, "Ausschalten"}))

habe ich nicht ausprobiert.
   

moonsorrox

#67
Zitat von: Ellert am 30 Januar 2016, 09:40:32
Da haben wir uns missverstanden:
Bei
repeatcmd: rand(3600)+600
wait: rand(3600)+600, rand(900)+300
ist
rand(3600)+600 die Wartezeit bis zum Einschalten und
rand(900)+300  die Wartezeit bis zum Ausschalten

Ok, dann ist das klar und ich muss es nur anpassen, da sage ich mal Danke  ;)
Die Abschaltung funktioniert nun mit meiner letzten Variante, ich darf nicht doppelt um die Zeit eckig klammern..! Das war mein Fehler..!
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

moonsorrox

nun muss ich doch nochmal etwas fragen.

Zitat von: Ellert am 30 Januar 2016, 09:40:32
wait: rand(3600)+600, rand(900)+300
ist
rand(3600)+600 die Wartezeit bis zum Einschalten und
rand(900)+300  die Wartezeit bis zum Ausschalten
da mir dieses EIN/AUS schalten nun mittlerweile klar ist gibt es aber dann noch "repeatcmd"
repeatcmd: rand(3600)+600
dieses spielt natürlich auch eine gehörige Rolle, kann ich das komplett weglassen, ich habe es jetzt noch nicht probiert, was ich gemacht habe:

diese wait Zeiten sind beides mal gleich geblieben
rand(90)+30, rand(360)+60

und repeatcmd habe ich jeweils mal geändert, das gibt komplett andere Zeiten
1. Variante - rand(360)+60
2. Variante - rand(90)+30

Habe schon gemerkt wenn dieses nicht da wäre gibt es keine Wiederholung...!
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

gloob

Hallo,

Hat sich an der Funktion etwas seit dem letzten Update getan?

Ich bekomme leider einen Fehler bei folgendem Code:


define water1start dummy
attr water1start room Pflanzen
attr water1start setList state:time
attr water1start userReadings Stunde {()},Minute {()},
attr water1start webCmd state

define water1repeat dummy
attr water1repeat room Pflanzen
attr water1repeat setList state:slider,0,1,10
attr water1repeat webCmd state

define water1interval dummy
attr water1interval room Pflanzen
attr water1interval setList state:slider,10,5,100
attr water1interval webCmd state

define Bewaesserung_doif DOIF ([[water1start]] and [water1repeat] > 0) (set Switch01 on-for-timer 60)
attr Bewaesserung_doif do always
attr Bewaesserung_doif repeatcmd [water1interval]
attr Bewaesserung_doif repeatsame [water1repeat]
attr Bewaesserung_doif room Pflanzen


Fehlermeldung:
2016.02.22 14:58:00 1: PERL WARNING: Argument "[water1repeat]" isn't numeric in numeric lt (<) at ./FHEM/98_DOIF.pm line 885.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

moonsorrox

diese Meldungen bekomme ich auch habe dazu auch schon gefragt, aber bisher noch keine Antwort  bekommen...!
Ich denke er erwartet einen numerischen Code, deshalb die Warnung
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

gloob

Ich weiß aber, dass es schon einmal funktioniert hat. Ich wollte die Elemente jetzt nur noch über FTUI einstellbar machen und habe gemerkt, dass es nicht mehr geht.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Damian

Zitat von: gloob am 22 Februar 2016, 15:05:57
Ich weiß aber, dass es schon einmal funktioniert hat. Ich wollte die Elemente jetzt nur noch über FTUI einstellbar machen und habe gemerkt, dass es nicht mehr geht.

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

moonsorrox

ich habe diese "98_DOIF.pm 10899 2016-02-21 12:41:29Z damian-s "

hatte diese Warnung schon hier geschildert
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

#74
@gloob

Also bei repeatsame sowie repeatcmd kann man nur Zahlen angeben. Nur bei wait kann man Dummys auswerten lassen, das steht auch so in der Commandref. Mir ist keine DOIF-Version bekannt, wo es für repeatsame oder repeadcmd ausprogrammiert wäre.

@moonsorrox

Wenn man einen nicht numerischen Wert mit größer oder kleiner vergleicht, dann gibt es eine Warnung vom Perl-Interpreter, denn dieser wertet die Bedingung aus. Ich habe es mit der jetzigen Version, wie auch mit einer vom Mai getestet und in beiden Fällen kommt diese Warnung. Es ist also immer schon so gewesen.

Gruß

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