FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: The-Holgi am 13 September 2025, 20:53:51

Titel: Doif mit Berechnung der Differenz aus 2 Werten
Beitrag von: The-Holgi am 13 September 2025, 20:53:51
Hallo,
ich versuche gerade ein doif zu basteln.
Jeden Tag um 00:01 soll die Gesamternte KWh abgerufen werden und anschließend alle 5 min von dem aktuellen Wert abgezogen werden. Es geht darum den aktuellen Tagesertrag einer pv Anlage zu sehen.
Das ganze soll in einem dummy gespeichert werden und per mqtt an ein display gesendet werden. Hier meine bisherigen Bemühungen:
Internals:
   CFGFN     
   DEF        ([21:23]) ({
  my $val = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",0);;
  fhem("setreading FritzDECT_Tageswerte KWh_0h $val");;
}) DOELSEIF ([+00:01]) ({
  my $now  = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",0);;
  my $base = ReadingsVal("FritzDECT_Tageswerte","KWh_0h",0);;
  my $diff = $now - $base;;
  fhem("setreading FritzDECT_Tageswerte KWh_today $diff");;
  my $kwh = sprintf("%.2f",$diff);;
  fhem("setreading FritzDECT_Tageswerte KWh_today_fmt $kwh");;
  fhem("set myBroker2 publish /display/fritzdect_tagesertrag/ $kwh");;
})

   FUUID      68c5c35d-f33f-6571-31de-52e1feb6400771c2
   MODEL      FHEM
   NAME       doifFritzKWh
   NOTIFYDEV  global
   NR         538
   NTFY_ORDER 50-doifFritzKWh
   STATE      cmd_2
   TYPE       DOIF
   VERSION    29460 2024-12-29 20:25:48
   eventCount 7
   READINGS:
     2025-09-13 21:23:43   cmd             2
     2025-09-13 21:23:43   cmd_event       timer_2
     2025-09-13 21:23:43   cmd_nr          2
     2025-09-13 21:21:43   mode            enabled
     2025-09-13 21:23:43   state           cmd_2
     2025-09-13 21:23:00   timer_01_c01    14.09.2025 21:23:00
     2025-09-13 21:24:43   timer_02_c02    13.09.2025 21:25:43
   Regex:
     accu:
     bar:
     barAvg:
     collect:
   attr:
     cmdState:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday)
   days:
   do:
     0:
       0          {   my $val = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",0);;   fhem("setreading FritzDECT_Tageswerte KWh_0h $val");; }
     1:
       0          {   my $now  = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",0);;   my $base = ReadingsVal("FritzDECT_Tageswerte","KWh_0h",0);;   my $diff = $now - $base;;   fhem("setreading FritzDECT_Tageswerte KWh_today $diff");;   my $kwh = sprintf("%.2f",$diff);;   fhem("setreading FritzDECT_Tageswerte KWh_today_fmt $kwh");;   fhem("set myBroker2 publish /display/fritzdect_tagesertrag/ $kwh");; }
     2:
   helper:
     NOTIFYDEV  global
     event      timer_2
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: timer_2
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: timer_2
       state: cmd_2
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       timer_2
     triggerEventsState:
       timer_2
   hmccu:
   interval:
   intervalfunc:
   localtime:
     0          1757877780
     1          1757791543
   realtime:
     0          21:23:00
     1          21:25:43
   time:
     0          21:23:00
     1          +00:01
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1757791543:
       localtime  1757791543
       hash:
     1757877780:
       localtime  1757877780
       hash:
   uiState:
   uiTable:
Attributes:
   room       Photovoltaik

KWh_0 wird nicht ausgelesen. Vielleicht kann mir jemand helfen.

Gruß Holger
Titel: Aw: Doif mit Berechnung der Differenz aus 2 Werten
Beitrag von: Gisbert am 14 September 2025, 10:02:42
Hallo Holger,

bevor du selbst etwas neues konstruierst, schau dir das Statistik-Modul ElectricityCalculator (https://fhem.de/commandref.html#ElectricityCalculator (https://fhem.de/commandref.html#ElectricityCalculator)) an. Das Modul bilanziert alle möglichen Daten basierend auf einem Zählerstand, den man in der Definition angibt. Ich benutze das vglw. häufig bei meiner Fhem-Installation.

Viele Grüße Gisbert

PS: Das Senden an ein Display muss dann eine Automatisierung übernehmen - vielleicht geht das aber auch in einem userReading im ElectricityCalculator-Device.
Titel: Aw: Doif mit Berechnung der Differenz aus 2 Werten
Beitrag von: The-Holgi am 14 September 2025, 14:04:48
Danke für den Tipp, das sehe ich mir mal an, obwohl es jetzt funktioniert.
so sieht es jetzt aus:

([00:01]) ({
  my $val = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",undef);
  if (defined $val) {
    fhem("setreading FritzDECT_Tageswerte KWh_0h $val");
  }
}) DOELSEIF ([+00:05]) ({
  my $now  = ReadingsVal("FBDECT_Fritzbox_grp5180A9_3E983A0FB","KWh",undef);
  my $base = ReadingsVal("FritzDECT_Tageswerte","KWh_0h",undef);

  if (defined $now && defined $base) {
    my $diff = $now - $base;

    fhem("setreading FritzDECT_Tageswerte KWh_today $diff");

    my $kwh = sprintf("%.2f",$diff);
    fhem("setreading FritzDECT_Tageswerte KWh_today_fmt $kwh");
    fhem("set myBroker2 publish /display/fritzdect_tagesertrag/ $kwh");
  } else {
    fhem("setreading FritzDECT_Tageswerte KWh_today N/A");
    fhem("setreading FritzDECT_Tageswerte KWh_today_fmt N/A");
  }
})