WeekDayTimer - Problem mit variabler Zeitberechnung

Begonnen von Cluni, 03 April 2017, 09:57:45

Vorheriges Thema - Nächstes Thema

Cluni

sub 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);




Büddäschön! :)

Übrigens ist bei den zweiten Timern nichts passiert. Ich hatte die Rollladen extra vorher auf einen willkürlichen Wert gesetzt, damit man es sieht, wenn nochmal gefahren wurde...

Dietmar63

#16
Bin gestern nicht dazu gekommen, etwas auszuprobieren.

Aber:
Es ist gewollt, dass drei timer pro Tag erzeugt werden. Du hast im WDT schliesslich drei timer definiert - jeder timer wird für jeden Tag eingestellt.
Der dann generiert Code sorgt dafür, dass die Nebenbedingungen (definierte Tage + sonst. if) bei der Schaltung berücksichtigt werden.

Der Code wird zum Schaltzeitpunkt generiert und sieht im verbose 4/5 dann etwas so aus:
var1 = "xx" var2="yyy" ... fhem("set dummy Luft") if(... {my $days={};;map{$days->{$_}=1}(0,1,2,3,4,5,6);;;;( 1 && (defined $days->{$wday}))} ) )
Der Code wird dann mit eval ausgeführt

Versuche mal zu prüfen, ob die Bedingungen des Codes korrekt sind.

2017.04.04 01:30:00 3:  21598 04.04.2017 07:08:21  Timer.Rol.Bad_1                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21599 04.04.2017 08:36:08  Timer.Rol.Bad_2                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21600 04.04.2017 19:48:55  Timer.Rol.Bad_3                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21601 05.04.2017 00:00:05  Timer.Rol.Bad_SetTimerOfDay         WeekdayTimer_SetTimerOfDay       
 
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

#17
Hallo Dietmar,

ich habe die Timer gestern gelöscht, weil mir das ein wenig zu unsicher war - da wäre ja was los, wenn im Kinderzimmer oder Schlafzimmer plötzlich der Rollladen während der Schlafenszeit los ginge. Ich habe mir nun in Perl eine eigene Funktion geschrieben, die auch die am Aktor eingestellten UserAttribute ausliest und direkt berücksichtigt. Die Funktion wird nun kurz nach Mitternacht für jeden Aktor über ein at aufgerufen und erzeugt mir die beiden at für die entsprechenden Aktionen. Gleichzeitig wird am Aktor in UserReadings eingetragen, wann die Aktionen ausgeführt werden. So habe ich das auch direkt alles an der richtigen Stelle stehen und finde es übersichtlicher. Ich muss mir nun nur noch überlegen, wie ich die Funktion direkt ausführen kann, sobald ich eine Änderung an den entsprechenden UserAttributen vornehme. Gibt es da eine Möglichkeit wie ein notify, welches bei der Änderung von Attributen ausgeführt wird? Oder geht das nur bei readings? Aber jetzt wird es offtopic...

Ich danke dir vielmals für deine Hilfe zum WDT! Sorry, dass ich jetzt hier so kurzfristig diesen Schwenk gemacht habe und mir selber was programmiert habe. Aber vielleicht nutzt der Thread ja noch jemandem, der auch diese Probleme hat.  ;)

Beta-User

@cluni,
Zitat von: Cluni am 05 April 2017, 09:46:17
...nun in Perl eine eigene Funktion geschrieben, die auch die am Aktor eingestellten UserAttribute ausliest und direkt berücksichtigt. Die Funktion wird nun kurz nach Mitternacht für jeden Aktor über ein at aufgerufen...
die von Dir hier umrissene Funktionalität entspricht in etwa dem, was wir hier erst mal nur theoretisch angedacht haben. Könntest Du den Code (vielleicht in dem verlinkten Thread) mal posten, würde mich interessieren.

Da Änderungen von userattr auch als Event im Monitor angezeigt werden, sollte es kein Problem sein, damit ein notify zu triggern.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Cluni

Hi Beta-User,

das hatte ich eh bereits vor - ich war ja auch bereits aktiv in diesem Thread und hatte meine Ideen ja auch bereits gepostet. Ich feile aber noch an der einen oder anderen Stelle und wollte den Post erst machen, wenn es etwas ausgereifter und ggf. verständlicher für andere ist. Ich werde auf jeden Fall meine Lösung dort vorstellen - im Groben läuft es auch schon fast so wie gewünscht. ;)

Gruß, Bernd

Beta-User

Hi Bernd,

sorry, hatte den Quervergleich nicht gemacht ::).
Ist aber erst mal schön zu hören, dass das Konzept mit dem Auslesen der userattr an sich zu funktionieren scheint.

Anmerkung noch zu der notify-Sache:
Es dürfte einfacher sein, wenn man das in 2 Subfunktionen teilt, nämlich einen "Rahmenpart", der alle Rolläden dann einzeln an die eigentliche "Mache mir at's"-Funktion (für den einzelnen Rolladen) schickt. Dann sollte man diese Teilfunktion nämlich einfacher vom notify aus direkt mit Angabe des betreffenden Rolladens aufrufen können. Aber wie gesagt: bin auch nur am Experimentieren...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Dietmar63

ZitatIch muss mir nun nur noch überlegen, wie ich die Funktion direkt ausführen kann, sobald ich eine Änderung an den entsprechenden UserAttributen vornehme. Gibt es da eine Möglichkeit wie ein notify, welches bei der Änderung von Attributen ausgeführt wird? Oder geht das nur bei readings?

Mir sind notify nur im Zusammenhang mit readings bekannt.
Ich habe mit dem Attribut userReadings ein reading erstellt, das mit notify abgefragt werden kann. Vielleicht hilft das.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni


Cluni

Zitat von: Dietmar63 am 05 April 2017, 10:35:48
Ich habe mit dem Attribut userReadings ein reading erstellt, das mit notify abgefragt werden kann. Vielleicht hilft das.

Ich denke eher nicht - ich möchte ja das Attribut z.B. für den Öffnen-Zeitpunkt ändern. Dabei hätte ich dann gerne, dass automatisch nach der Änderung die Funktion für die Berechnung aufgerufen wird...