Perlmodus: Setmodus löst nach einem Neustart kein update eines set_readings aus

Begonnen von cwagner, 30 Oktober 2022, 09:38:34

Vorheriges Thema - Nächstes Thema

cwagner

Ich benutze - sehr dankbar für den Aufschlag von Damian - meine Zähler für Strom und PV mit diesem DOIF aus, das ich aus diesem Forum kopiert habe:
Internals:
   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
   DEF        subs {
##                     device, reading       
  push (@{$_counter},["Strom","Zaehlerstand"]); ## Strom-Zähler
  push (@{$_counter},["Solar","Zaehlerstand"]); ## Einspeise-Zähler
  push (@{$_counter},["PV","etotal"]);          ## Solarzähler des PV

sub midnight {                   ## Diese Funktion wird um Mitternacht ausgeführt
  my ($device,$reading,$mday,$yday)=@_;
  set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0),1);
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0));
  set_Reading("$device.$reading.day",0);
  if ($mday == 1) {
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0));
    set_Reading("$device.$reading.month",0);
  }
  if ($yday == 1) {
    set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));
    set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0));
    set_Reading("$device.$reading.year",0);
  }
}

sub init_readings {
  my ($device,$reading)=@_;
  if (!get_Reading("$device.$reading.day_counter","")) {   ## Initialisierung der Readings
                                                           ## aktuellen Zählerstand initialisieren
    set_Reading ("$device.$reading.day_counter",ReadingsVal($device,$reading,0));
    set_Reading ("$device.$reading.month_counter",ReadingsVal($device,$reading,0));
    set_Reading ("$device.$reading.year_counter",ReadingsVal($device,$reading,0));

    set_Reading ("$device.$reading.day",0);           ## aktueller Tagesverbrauch
    set_Reading ("$device.$reading.month",0);         ## aktueller Monatsverbrauch
    set_Reading ("$device.$reading.year",0);          ## aktueller Jahresverbrauch
    set_Reading ("$device.$reading.last_day",0);      ## Verbrauch des letzten Tages
    set_Reading ("$device.$reading.last_month",0);    ## Verbrauch des letzten Monats
    set_Reading ("$device.$reading.last_year",0);     ## Verbrauch des letzten Jahres
  }
}
} ## Ende subs-Block

mid {[23:59:59];                          ## Sicherung der Daten um Mitternacht
for (my $i=0;$i<@{$_counter};$i++) {   
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday); ## Für jeden Zähler wird die Funktion midnight aufgerufen
  }
}

init {                                   ## initialisierung aller Readings
  for (my $i=0;$i<@{$_counter};$i++) {   ## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert
    init_readings($_counter[$i][0],$_counter[$i][1]);
  }
}

DEF TPL_stat (
  day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten
                    ##  $1 Zählerdevice, $2 Zählerreading
    set_Reading ("$1.$2.day",int(([$1:$2,0]-get_Reading("$1.$2.day_counter",1))*1000)/1000);
    set_Reading ("$1.$2.month",int(([$1:$2,0]-get_Reading("$1.$2.month_counter",0))*1000)/1000);
    set_Reading ("$1.$2.year",int(([$1:$2,0]-get_Reading("$1.$2.year_counter",0))*1000)/1000);
  }
)

## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading

   FUUID      621259ad-f33f-e1df-6aad-fa75b1679f248329
   MODEL      Perl
   NAME       DI_CN_Strom
   NOTIFYDEV  PV,Strom,DI_CN_Strom,Solar,global
   NR         248
   NTFY_ORDER 50-DI_CN_Strom
   STATE      initialized
   TYPE       DOIF
   VERSION    26444 2022-09-25 16:29:19
   eventCount 985
   .attraggr:
   .attrminint:
   CHANGED:
     Netto: -508.14
   CHANGEDWITHSTATE:
     Netto: -508.14
   DOIF_Readings:
     Netto      ::ReadingValDoIf($hash,'Strom','grid_power','','d')-::ReadingValDoIf($hash,'Solar','Einspeisung','','d')
   Helper:
     DBLOG:
       Eigenverbrauch:
         logdb:
           TIME       1667118189.83712
           VALUE      98.8679245283019
       Netto:
         logdb:
           TIME       1667118129.56798
           VALUE      -335.57
   READINGS:
     2022-10-28 22:30:42   .col_72_DI_CN_Strom_Netto_168_times 1666398478,1666405491,1666409745,1666425020,1666432190,1666438322,1666444043,1666451109,1666461306,1666468301,1666476696,1666488815,1666494853,1666506987,1666517719,1666524349,1666528559,1666534803,1666549036,1666554031,1666560861,1666572242,1666582830,1666590419,1666600326,1666606395,1666613088,1666624217,1666635370,1666636283,1666651638,1666657863,1666667697,1666673700,1666685946,1666689174,1666698937,1666708691,1666716223,1666721300,1666735724,1666740920,1666744834,1666760600,1666768857,1666774522,1666786402,1666790547,1666802144,1666809599,1666814387,1666820578,1666828919,1666844450,1666853972,1666858038,1666866446,1666870955,1666879457,1666888434,1666896955,1666908333,1666918493,1666924268,1666935668,1666946397,1666952861,1666957705,1666968506,1666972284,1666981205,1666988467
     2022-10-28 22:30:42   .col_72_DI_CN_Strom_Netto_168_values 62,435,1510,-599.14,1106,-1722.29,1408,-106.47,2168,145,850,74,526,1514,-542.83,1680,-1072.43,1460,44,1490,46,544,60,1600,-1037.17,1630,-1917.41,767,85,907,42,419,31,1612,-703.84,723,-1757.58,2042,46,1394,82,382,775,1574,-245,1340,-1675.37,0,818,1687,100,846,72,1515,90,1370,-1277.47,1560,-487.73,927,116,806,70,557,1655,-671.94,669.44,-1391,1526,84.22,860.22,99.22
     2022-10-30 09:23:45   Device          Solar
     2022-10-30 09:23:09   Eigenverbrauch  98.8679245283019
     2022-10-30 09:23:49   Netto           -508.14
     2022-10-30 09:23:09   PV.etotal.day   0.01
     2022-10-30 09:22:22   PV.etotal.day_counter 2544.425
     2022-10-30 09:22:22   PV.etotal.last_day 0.022
     2022-10-16 11:45:01   PV.etotal.last_month 0
     2022-10-16 11:45:01   PV.etotal.last_year 0
     2022-10-30 09:23:09   PV.etotal.month 86.927
     2022-10-16 11:45:01   PV.etotal.month_counter 2457.509
     2022-10-30 09:23:09   PV.etotal.year  86.927
     2022-10-16 11:45:01   PV.etotal.year_counter 2457.509
     2022-10-30 09:23:45   Solar.Zaehlerstand.day 0.011
     2022-10-30 09:22:22   Solar.Zaehlerstand.day_counter 5068.041
     2022-10-30 09:22:22   Solar.Zaehlerstand.last_day 0.009
     2022-10-01 23:59:59   Solar.Zaehlerstand.last_month 220.662
     2022-10-30 09:23:45   Solar.Zaehlerstand.month 132.393
     2022-10-01 23:59:59   Solar.Zaehlerstand.month_counter 4935.6596
     2022-10-30 09:23:45   Solar.Zaehlerstand.year 2080.1
     2022-03-03 08:02:51   Solar.Zaehlerstand.year_counter 2987.9523
     2022-07-16 23:59:59   Strom.Zaehlerstand 1201.755
     2022-10-30 09:22:22   Strom.Zaehlerstand.day 0
     2022-10-30 09:22:22   Strom.Zaehlerstand.day_counter 13316.8328477
     2022-10-30 09:22:22   Strom.Zaehlerstand.last_day 0.002
     2022-10-01 23:59:59   Strom.Zaehlerstand.last_month 72.813
     2022-10-30 09:22:22   Strom.Zaehlerstand.month 80.086
     2022-10-01 23:59:59   Strom.Zaehlerstand.month_counter 13236.7462975
     2022-10-30 09:22:22   Strom.Zaehlerstand.year 2027.343
     2022-03-03 08:07:24   Strom.Zaehlerstand.year_counter 11289.4894939
     2022-10-30 09:23:09   block_day_count_PV_etotal executed
     2022-10-30 09:23:45   block_day_count_Solar_Zaehlerstand executed
     2022-10-30 09:22:22   block_day_count_Strom_Zaehlerstand executed
     2022-10-30 09:17:51   block_init      executed
     2022-10-30 09:22:22   block_mid       executed
     2022-10-30 09:23:09   e_PV_etotal     2544.436
     2022-10-30 09:23:45   e_Solar_Zaehlerstand 5068.0527
     2022-10-30 09:22:22   e_Strom_Zaehlerstand 13316.8328477
     2022-10-30 09:20:34   mode            enabled
     2022-10-30 09:23:09   stat_EigenverbrauchDay Min: -5647.2222222222199 Avg: -102.9759457573388 Max: 100.0000000000000
     2022-10-29 23:59:55   stat_EigenverbrauchDayLast Min: 39.8981603153745 Avg: 99.9972174752168 Max: 100.0000000000000
     2022-10-30 09:23:09   stat_EigenverbrauchHour Min: -618.9368770764120 Avg: -355.8385419079656 Max: 100.0000000000000
     2022-10-30 08:59:55   stat_EigenverbrauchHourLast Min: -5647.2222222222199 Avg: -1831.9237752292263 Max: 100.0000000000000
     2022-10-30 09:23:09   stat_EigenverbrauchMonth Min: -57162.2779519331016 Avg: -147.4001230738250 Max: 100.0000000000000
     2022-09-30 23:59:55   stat_EigenverbrauchMonthLast Min: 22.6587052168448 Avg: 44.0773390971354 Max: 97.6190476190476 (since: 2022-09-11_13:48:49 )
     2022-10-30 09:23:09   stat_EigenverbrauchYear Min: -57162.2779519331016 Avg: -71.3148400115134 Max: 100.0000000000000 (since: 2022-09-11_13:48:49 )
     2022-10-18 12:08:04   state           initialized
     2022-10-30 00:00:00   timer_01_c01    31.10.2022 23:59:59
   Regex:
     DOIF_Readings:
       Solar:
         Netto:
           Einspeisung ^Solar$:^Einspeisung:
       Strom:
         Netto:
           grid_power ^Strom$:^grid_power:
     accu:
     collect:
       DI_CN_Strom:
         collect:
           Netto      ^DI_CN_Strom$:^Netto:
     cond:
       PV:
         0:
         1:
         2:
         3:
         4:
           etotal     ^PV$:^etotal:
       Solar:
         0:
         1:
         2:
         3:
           Zaehlerstand ^Solar$:^Zaehlerstand:
         4:
       Strom:
         0:
         1:
         2:
           Zaehlerstand ^Strom$:^Zaehlerstand:
         3:
         4:
     event_Readings:
       DI_CN_Strom:
         Eigenverbrauch:
           Solar.Zaehlerstand.day ^DI_CN_Strom$:^Solar.Zaehlerstand.day:
       PV:
         Eigenverbrauch:
           etoday     ^PV$:^etoday:
     uiTable:
       DI_CN_Strom:
         DI_CN_Strom_uiTable_c_0_0_0_0:
           Netto      ^DI_CN_Strom$:^Netto:
   card:
   collect:
     DI_CN_Strom Netto:
       168:
         animate    0
         dim        72
         hours      168
         last       -504.28
         last_v     1572.22
         last_value -542.83
         max_value  2042
         max_value_slot 22
         max_value_time 1666708691
         min_value  -1917.41
         min_value_slot 11
         min_value_time 1666613088
         name       DI_CN_Strom
         reading    Netto
         time       1667118229
         value      -508.14
         times:
           1666524349
           1666528559
           1666534803
           1666549036
           1666554031
           1666560861
           1666572242
           1666582830
           1666590419
           1666600326
           1666606395
           1666613088
           1666624217
           1666635370
           1666636283
           1666651638
           1666657863
           1666667697
           1666673700
           1666685946
           1666689174
           1666698937
           1666708691
           1666716223
           1666721300
           1666735724
           1666740920
           1666744834
           1666760600
           1666768857
           1666774522
           1666786402
           1666790547
           1666802144
           1666809599
           1666814387
           1666820578
           1666828919
           1666844450
           1666853972
           1666858038
           1666866446
           1666870955
           1666879457
           1666888434
           1666896955
           1666908333
           1666918493
           1666924268
           1666935668
           1666946397
           1666952861
           1666957705
           1666968506
           1666972284
           1666981205
           1666991215
           1666997819
           1667005200
           undef
           undef
           undef
           undef
           undef
           1667061001
           1667067084
           1667078521
           1667088515
           1667093199
           1667103462
           1667107697
           1667118229
         values:
           1680
           -1072.43
           1460
           44
           1490
           46
           544
           60
           1600
           -1037.17
           1630
           -1917.41
           767
           85
           907
           42
           419
           31
           1612
           -703.84
           723
           -1757.58
           2042
           46
           1394
           82
           382
           775
           1574
           -245
           1340
           -1675.37
           0
           818
           1687
           100
           846
           72
           1515
           90
           1370
           -1277.47
           1560
           -487.73
           927
           116
           806
           70
           557
           1655
           -671.94
           669.44
           -1391
           1526
           84.22
           860.22
           45.22
           400.22
           48.22
           undef
           undef
           undef
           undef
           undef
           966.22
           92.22
           846.22
           113.22
           576.22
           80.22
           1572.22
           -508.14
   condition:
     0          ::DOIF_time_once($hash,0,$wday);                            for (my $i=0;$i<@{$hash->{var}{counter}};$i++) {   
    midnight($hash->{var}{counter}[$i][0],$hash->{var}{counter}[$i][1],$mday,$yday);    }

     1                                                for (my $i=0;$i<@{$hash->{var}{counter}};$i++) {        init_readings($hash->{var}{counter}[$i][0],$hash->{var}{counter}[$i][1]);
  }

     2                                     set_Reading ("Strom.Zaehlerstand.day",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.day_counter",1))*1000)/1000);
    set_Reading ("Strom.Zaehlerstand.month",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.month_counter",0))*1000)/1000);
    set_Reading ("Strom.Zaehlerstand.year",int((::ReadingValDoIf($hash,'Strom','Zaehlerstand','0')-get_Reading("Strom.Zaehlerstand.year_counter",0))*1000)/1000);
 
     3                                     set_Reading ("Solar.Zaehlerstand.day",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.day_counter",1))*1000)/1000);
    set_Reading ("Solar.Zaehlerstand.month",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.month_counter",0))*1000)/1000);
    set_Reading ("Solar.Zaehlerstand.year",int((::ReadingValDoIf($hash,'Solar','Zaehlerstand','0')-get_Reading("Solar.Zaehlerstand.year_counter",0))*1000)/1000);
 
     4                                     set_Reading ("PV.etotal.day",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.day_counter",1))*1000)/1000);
    set_Reading ("PV.etotal.month",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.month_counter",0))*1000)/1000);
    set_Reading ("PV.etotal.year",int((::ReadingValDoIf($hash,'PV','etotal','0')-get_Reading("PV.etotal.year_counter",0))*1000)/1000);
 
   days:
   defs:
     tpl:
       TPL_stat   
  day_count_$1_$2 {                           set_Reading ("$1.$2.day",int(([$1:$2,0]-get_Reading("$1.$2.day_counter",1))*1000)/1000);
    set_Reading ("$1.$2.month",int(([$1:$2,0]-get_Reading("$1.$2.month_counter",0))*1000)/1000);
    set_Reading ("$1.$2.year",int(([$1:$2,0]-get_Reading("$1.$2.year_counter",0))*1000)/1000);
  }

   event_Readings:
     Eigenverbrauch 100/::ReadingValDoIf($hash,'PV','etoday')*(::ReadingValDoIf($hash,'PV','etoday')-::ReadingValDoIf($hash,'DI_CN_Strom','Solar.Zaehlerstand.day'))
   helper:
     NOTIFYDEV  PV,Strom,DI_CN_Strom,Solar,global
     _98_statistics Statistik
     event      Einspeisung: 508.14
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev Solar
     triggerEvents:
       Einspeisung: 508.14
     triggerEventsState:
       Einspeisung: 508.14
   internals:
   interval:
   intervalfunc:
   localtime:
     0          1667257199
   perlblock:
     0          mid
     1          init
     2          day_count_Strom_Zaehlerstand
     3          day_count_Solar_Zaehlerstand
     4          day_count_PV_etotal
   readings:
     all         Strom:Zaehlerstand Solar:Zaehlerstand PV:etotal
   realtime:
     0          23:59:59
   time:
     0          23:59:59
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   trigger:
   triggertime:
     1667257199:
       localtime  1667257199
       hash:
   uiState:
   uiTable:
     dev        DI_CN_Strom
     header     
<table uitabid='DOIF-DI_CN_Strom' class=' block wide uiTabledoif doif-DI_CN_Strom ' style='border-top:none;'>
     package    package ui_Table;
     reading    Netto
     shownodeviceline Aktuell
     table:
       0:
         0:
           0:
             0          package ui_Table;::DOIF_Widget($hash,$reg,'DI_CN_Strom_uiTable_c_0_0_0_0',card(::ReadingValDoIf($hash,'DI_CN_Strom','Netto','','col1w'),undef,undef,970,1030,0,120,"Wh",[(1007,30,1019,120,1030,60)],0,'150,,,','0,0,1,8,',"50,35,45,35,50,35"),"")
     tc:
     td:
       0:
     tr:
   var:
     counter:
       ARRAY(0x6a64748)
       ARRAY(0x6a64670)
       ARRAY(0x6a64520)
Attributes:
   DOIF_Readings Netto:[Strom:grid_power:d]-[Solar:Einspeisung:d]
   DbLogExclude .*
   DbLogInclude Netto,Strom.Zaehlerstand.day_counter,Solar.Zaehlerstand.day_counter,PV.etotal.day_counter,Eigenverbrauch
   event_Readings Eigenverbrauch:100/[PV:etoday]*([PV:etoday]-[$SELF:Solar.Zaehlerstand.day])
   room       Energie
   uiTable    {
package ui_Table;
$SHOWNODEVICELINE = "Aktuell";
}
card([$SELF:Netto:col1w],undef,undef,970,1030,0,120,"Wh",[(1007,30,1019,120,1030,60)],0,'150,,,','0,0,1,8,',"50,35,45,35,50,35")

Da ich gelernt habe, dass setReading nur ein event auslöst, habe ich in der Mitternachtsfunktion in der Zeile für das Erzeugen der Daycounter den Paramater "1" angehängt.
Darauf lauert ein Filelog, dass mir die Werte in ein log schreibt. Das funktioniert sehr gut, doch nach unterschiedlich vielen Tagen wird nicht mehr gelogt, obwohl ein Event geschrieben wird, die das Listing zeigt. Da habe ich das sub "mid" von Hand ausgelöst um 9:22 Uhr.
Ich vermute einen Zusammenhang mit shutdown restart, der nach einem Update notwendig wurde. Nach Tagen kriege ich durch Neudefinition des FileLogs immer irgendwie das Logging wieder "scharf", aber die Ursache verstehe ich nicht.
Das dazugehörige FileLog:
Internals:
   DEF        ./log/Strom-%Y.log DI_CN_Strom:Strom.Zaehlerstand.day_counter:.*|DI_CN_Strom:Solar.Zaehlerstand.day_counter:.*|DI_CN_Strom:PV.etotal.day_counter:.*
   FD         17
   FUUID      6212aff6-f33f-e1df-1dc5-b2ed5bd8a41eafe3
   NAME       FL_Strom
   NOTIFYDEV  DI_CN_Strom
   NR         249
   NTFY_ORDER 50-FL_Strom
   REGEXP     DI_CN_Strom:Strom.Zaehlerstand.day_counter:.*|DI_CN_Strom:Solar.Zaehlerstand.day_counter:.*|DI_CN_Strom:PV.etotal.day_counter:.*
   STATE      active
   TYPE       FileLog
   currentlogfile ./log/Strom-2022.log
   eventCount 1
   logfile    ./log/Strom-%Y.log
   READINGS:
     2022-10-27 23:59:59   linesInTheFile  502
Attributes:
   room       Energie
   verbose    3



Any idea?


Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

betateilchen

Zitat von: cwagner am 30 Oktober 2022, 09:38:34
habe ich in der Mitternachtsfunktion in der Zeile für das Erzeugen der Daycounter den Paramater "1" angehängt.
Darauf lauert ein Filelog, dass mir die Werte in ein log schreibt.

Werte zu einem bestimmten Zeitpunkt in ein Log zu schreiben, löse ich immer per at und addLog().
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Am Listing kann man nur sehen, dass das Reading um 09:22:22 geschrieben wurde, ob ein Event erzeugt wurde, kann man am Listing nicht sehen.

Grundsätzlich sollte set_Reading immer ein Event erzeugen, wenn es mit eins aufgerufen wurde (event-on-change-reading sehe ich bei dir nicht), daher gehe ich davon aus, dass ein Event erzeugt wird. Das kannst man ja im Event-Monitor sehen, wenn du den Block ausführst.

Wenn also ein Event kommt, dieses aber nicht geloggt wird, dann stimmt etwas mit dem Logging nicht.

In der aktuellen Version im Wiki wird im init-Block auch das Logging aufgesetzt - das ist bei dir nicht der Fall. Du benutzt offenbar dbLog.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Danke Euch beiden für die Hinweise, denen ich heute um Mitternacht ;-) nachgehe...

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Was mir noch aufgefallen ist.

Du hast den Aufruf der Mitternachtsroutine auf 23:59:59 vorgezogen. Damit kann sie nicht richtig funktionieren, weil dort geschaut wird, ob ein neuer Monat beginnt ($mday == 1) bzw. ein neues Jahr ($yday == 1).

Das hat vermutlich nichts mit deinem Problem zu tun, aber du wirst heute (31.10) ein weiteres bekommen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF