Hauptmenü

Stromverbrauch per DOIF?

Begonnen von gestein, 14 Februar 2022, 16:47:37

Vorheriges Thema - Nächstes Thema

Damian

Du verwechselt da was. Die Daten werden nicht in der cfg-Datei gespeichert, sondern in der save-Datei. Das eine ist die Konfiguration, das andere sind die Inhalte der Readings und dort sind die gesammelten Daten gespeichert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Die Trennung verstehe ich schon - aber den Zusammenhang (noch) nicht.
Wird also das Device aus der fhem.cfg nicht angelegt, wenn keine entsprechenden Daten im fhem.save stehen?

Und wird fhem.save nicht auch abgespeichert, wenn man die Konfiguration manuell speichert?

lg, Gerhard


Damian

ZitatWenn ich den Code aus fhem.cfg kopiere und per "+" in FHEM einfüge, bekomme ich wieder die altbekannte Fehlermeldung.
- Import mit "\" am Zeilenende -> Fehlermeldung "di_counter_new2 DOIF: :energy_total_kWh: subs {"
  Dann folgt der Code der Definition. Leider aber im Dialogfenster abgeschnitten, da zu lang
- Import ohne "\" am Zeilenende -> Fehlermeldung "di_counter_new DOIF: Perlblck: no right bracket: {"
  Das ist aber klar.

Das Backslash-Zeichen wird beim Einfügen einer RAW-Definition über Plus-Symbol direkt vom FHEM-Interpreter als Fortsetzungszeichen erkannt und herausgefiltert. Danach darf es dort nicht mehr drinstehen. Wenn sich DOIF über \ beschwert, dann stimmt vorher schon was nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#108
Zitat von: gestein am 15 Februar 2023, 11:19:14
Die Trennung verstehe ich schon - aber den Zusammenhang (noch) nicht.
Wird also das Device aus der fhem.cfg nicht angelegt, wenn keine entsprechenden Daten im fhem.save stehen?

Und wird fhem.save nicht auch abgespeichert, wenn man die Konfiguration manuell speichert?

lg, Gerhard

Die Definition wird natürlich in der cfg gespeichert und dort musst du sie auch sehen können. Sie save-Datei wird beim Drücken auf save gespeichert, beim DOIF wird auch beim shutdown save mit den gesammelten Daten ausgeführt (autosave muss auf 1 stehen).

Zu Problemen beim Einlesen der Definition hatte ich vorhin schon etwas geschrieben. Das sieht so aus, als wenn jemand über den DEF-Knopf die RAW-Daten aus dem Beispiel oder aus der cfg-Datei einlesen wollte.

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

gestein

Daran versuche ich mich mal.
Das autosave ist "0", weil ein Fehler beim Start erkannt wurde.

Im Internal vom global "init_errors" steht bei mir:
Messages collected while initializing FHEM:configfile: di_counter_new DOIF: :energy_total_kWh: subs {

sub CalculateSums {
  my $Reading=::AttrVal("di_counter_new","EnergyReading","");
  my $Prefix=::AttrVal("di_counter_new","SummaryPrefix","");
  my ($DefFilterName,$DefFilter)=split /;/, ::AttrVal("di_counter_new","SummaryFilter","");

   my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");

  if (@Categories > 0) {
    foreach my $Category (@Categories) {
  my ($Name,$Filter)=split /;/, $Category;
    $Filter =~s/$DefFilterName/$DefFilter/ig;
  my @Devices = ::devspec2array($Filter);
      my $counter_temp=0;
      my $hour_temp=0;
      my $hour_counter_temp=0;
      my $quarter_temp=0;
      my $quarter_counter_temp=0;
 
  set_Reading("test_$Name","$Filter; $DefFilterName, $DefFilter",0);

      foreach my $Device (@Devices) {
        $counter_temp+=get_Reading("$Device\.$Reading\_counter",0);
        $hour_temp+=get_Reading("$Device\.$Reading\_hour",0);
        $hour_counter_temp+=get_Reading("$Device.$Reading\_hour_counter",0);
        $quarter_temp+=get_Reading("$Device\.$Reading\_quarter",0);
        $quarter_counter_temp+=get_Reading("$Device\.$Reading\_quarter_counter",0);
  }
      set_Reading($Prefix."$Name\_counter",$counter_temp);
      set_Reading($Prefix."$Name\_hour",$hour_temp);
      set_Reading($Prefix."$Name\_hour_counter",$hour_counter_temp);
      set_Reading($Prefix."$Name\_quarter",$quarter_temp);
      set_Reading($Prefix."$Name\_quarter_counter",$quarter_counter_temp);
  }
  }
}

sub SumUpCategories {
  my ($device,$reading,$diff)=@_;
  my ($DefFilterName,$DefFilter)=split /;/, ::AttrVal("di_counter_new","SummaryFilter","");
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");
 
    return if (@Categories == 0);

foreach my $Category (@Categories) {
  my ($Name,$Filter)=split /;/, $Category;
    $Filter =~s/$DefFilterName/$DefFilter/ig;
  my @Devices = ::devspec2array($Filter);
if(grep(/^$device$/, @Devices )) {
  my $alias=::AttrVal("$device","alias","");
set_Reading("test.$device","gefunden in $Name ($alias): $diff",0);
::Log 1, "SumUpCategories; $diff; $device; $Name ($alias); ".get_Reading("$Name.$reading.day",0);
        set_Reading("$Name.$reading.day",get_Reading("$Name.$reading.day",0)+$diff,1);
      set_Reading("$Name.$reading.month",get_Reading("$Name.$reading.month",0)+$diff,1);
      set_Reading("$Name.$reading.year",get_Reading("$Name.$reading.year",0)+$diff,1);
}
}   
}

sub midnight {    my ($device,$reading,$mday,$yday,$newval)=@_;
  set_Reading("$device.$reading.day_counter",$newval);
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);
  set_Reading("$device.$reading.day",0,1);
  set_Reading("$device.$reading.month",int(($newval-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);
  set_Reading("$device.$reading.year",int(($newval-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);

  if ($mday == 1) {
    set_Reading("$device.$reading.month_counter",$newval);
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);
    set_Reading("$device.$reading.month",0,1);
    if ($yday == 0) {
      set_Reading("$device.$reading.year_counter",$newval);
      set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);
      set_Reading("$device.$reading.year",0,1);
}
  }
}

sub init_readings {
  my ($device,$reading,$newval)=@_;
  my $alias=::AttrVal($device, "alias","");
 
  if($alias ne "") {set_Reading("$device.$reading",$alias);}
  if (get_Reading("$device.$reading.day_counter","") eq "") {             set_Reading("$device.$reading.last_counter",$newval);
    set_Reading("$device.$reading.day_counter",$newval);
    set_Reading("$device.$reading.month_counter",$newval);
    set_Reading("$device.$reading.year_counter",$newval);
 
    set_Reading ("$device.$reading.day",0);                set_Reading ("$device.$reading.month",0);              set_Reading ("$device.$reading.year",0);               set_Reading ("$device.$reading.last_day",0);           set_Reading ("$device.$reading.last_month",0);         set_Reading ("$device.$reading.last_year",0);     
fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log di_counter_new:$device.$reading.last_(day|month|year):.*");
    fhem ("attr log.counter.$device.$reading room Filelogs");
}
}

resetAllEnergyData {
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {
if(ReadingsVal("$Device","relay_0_energy_total","err") ne "err") {
fhem("setreading $Device relay_0_energy_total 0");
fhem("setreading $Device energy_total 0");
fhem("setreading $Device energy_total_kWh 0");
fhem("setreading $Device energy_total_reset done");
} elsif(ReadingsVal("$Device","relay_1_energy_total","err") ne "err") {
fhem("setreading $Device relay_1_energy_total 0");
fhem("setreading $Device energy_total 0");
fhem("setreading $Device energy_total_kWh 0");
fhem("setreading $Device energy_total_reset done");
} elsif(ReadingsVal("$Device","light_0_energy_total","err") ne "err") {
fhem("setreading $Device light_0_energy_total 0");
fhem("setreading $Device energy_total 0");
fhem("setreading $Device energy_total_kWh 0");
fhem("setreading $Device energy_total_reset done");
}
  }
}

get_data {                                my $reading=::AttrVal("di_counter_new","EnergyReading","");

  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {
    ::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_day","bar1month",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_day"));
    ::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_month","bar2year",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_month"));
::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_year","bar2decade",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_year"));
}
}

deleteAllReadings {
fhem("deletereading di_counter_new .*");
}

mid {[00:01];                             my $newval=ReadingsVal($device, $reading,0);
  my $reading=::AttrVal("di_counter_new","EnergyReading","");
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {      midnight($Device,$reading,$mday,$yday,$newval);
  }
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");
    foreach my $Category (@Categories) {
  my ($Name,$Filter)=split /;/, $Category;
  $newval=get_Reading("$Name.$reading.day",0);
  midnight($Name,$reading,$mday,$yday,$newval);
}
}

init {                                   my $reading=::AttrVal("di_counter_new","EnergyReading","");
  my $newval=0;
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {     $newval=ReadingsVal($Device, $reading,0);
init_readings($Device,$reading,$newval);
  }
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");
    foreach my $Category (@Categories) {
  my ($Name,$Filter)=split /;/, $Category;
  my ($DefFilterName,$DefFilter)=split /;/, ::AttrVal("di_counter_new","SummaryFilter","");
    $Filter =~s/$DefFilterName/$DefFilter/ig;
  my @Devices = ::devspec2array($Filter);
  set_Reading("$Name.members","@Devices");
  $newval=0;
  foreach my $Device (@Devices) {
    $newval+=ReadingsVal("$Device","$reading",0);
  }
  init_readings($Name,$reading,$newval);
}
}



CalculateQuarterSums { [([+:15]+[00:01])];
  }
CalculateHourSums { [:01];
  }


   
  day_count__energy_total_kWh {                       
    my $diff = int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.last_counter",0)))*1000)/1000;
      set_Reading (".energy_total_kWh.last_counter",[:energy_total_kWh,0]);
      set_Reading (".energy_total_kWh.day",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.day_counter",0)))*1000)/1000,1);
      set_Reading (".energy_total_kWh.month",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.month_counter",0)))*1000)/1000,1);
      set_Reading (".energy_total_kWh.year",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.year_counter",0)))*1000)/1000,1);
 
  if ($diff>0) {
  SumUpCategories("","energy_total_kWh",$diff);
  }
  }


setuuid: Please define di_counter_new first


Leider steht keine Fehlermeldung, da die definition anscheinend zu lange ist.
Zumindest wird di_counter_new nicht bei Neustart angelegt.

Ich lege das jetzt nochmal an und setze autosave auf "1".
Und dann starte ich fhem nochmal neu.

lg, Gerhard

gestein

Hallo,

also auch der neuerliche Versuch hat nicht geklappt.

So bin ich vorgegangen:
1) autosave auf "1" gestellt.
2) mein Device do_counter_new erstellt (zuerst mit leerer Definition und dann die Definiton geändert)
    Die Readings wurden richtig erstellt und die Diagramme sind zu sehen
3) die Konfig über "save config" gespeichert.
4) fhem.cfg und log/fhem.save überprüft. In beiden Dateien ist di_counter_new drinnen.
5) "shutdown restart"
6) di_counter_new wurde nicht als Device angelegt.
   Im Internal "init_errors" steht wieder die u.a. Fehlermeldung

Ist die Definition zu lange bzw. zu komplex?

lg, Gerhard

Inhalt von global:init_errors
Messages collected while initializing FHEM:configfile: di_counter_new DOIF: :energy_total_kWh: subs {

sub CalculateSums {
  my $Reading=::AttrVal("di_counter_new","EnergyReading","");;
  my $Prefix=::AttrVal("di_counter_new","SummaryPrefix","");;
  my ($DefFilterName,$DefFilter)=split /;;/, ::AttrVal("di_counter_new","SummaryFilter","");;

   my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");;

  if (@Categories > 0) {
    foreach my $Category (@Categories) {
          my ($Name,$Filter)=split /;;/, $Category;;
            $Filter =~s/$DefFilterName/$DefFilter/ig;;
          my @Devices = ::devspec2array($Filter);;
      my $counter_temp=0;;
      my $hour_temp=0;;
      my $hour_counter_temp=0;;
      my $quarter_temp=0;;
      my $quarter_counter_temp=0;;
         
          set_Reading("test_$Name","$Filter;; $DefFilterName, $DefFilter",0);;

      foreach my $Device (@Devices) {
        $counter_temp+=get_Reading("$Device\.$Reading\_counter",0);;
        $hour_temp+=get_Reading("$Device\.$Reading\_hour",0);;
        $hour_counter_temp+=get_Reading("$Device.$Reading\_hour_counter",0);;
        $quarter_temp+=get_Reading("$Device\.$Reading\_quarter",0);;
        $quarter_counter_temp+=get_Reading("$Device\.$Reading\_quarter_counter",0);;
          }
      set_Reading($Prefix."$Name\_counter",$counter_temp);;
      set_Reading($Prefix."$Name\_hour",$hour_temp);;
      set_Reading($Prefix."$Name\_hour_counter",$hour_counter_temp);;
      set_Reading($Prefix."$Name\_quarter",$quarter_temp);;
      set_Reading($Prefix."$Name\_quarter_counter",$quarter_counter_temp);;
  }
  }
}

sub SumUpCategories {
  my ($device,$reading,$diff)=@_;;
  my ($DefFilterName,$DefFilter)=split /;;/, ::AttrVal("di_counter_new","SummaryFilter","");;
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");;
 
    return if (@Categories == 0);;

        foreach my $Category (@Categories) {
          my ($Name,$Filter)=split /;;/, $Category;;
            $Filter =~s/$DefFilterName/$DefFilter/ig;;
          my @Devices = ::devspec2array($Filter);;
                if(grep(/^$device$/, @Devices )) {
                  my $alias=::AttrVal("$device","alias","");;
                        set_Reading("test.$device","gefunden in $Name ($alias): $diff",0);;
                        ::Log 1, "SumUpCategories;; $diff;; $device;; $Name ($alias);; ".get_Reading("$Name.$reading.day",0);;
                 set_Reading("$Name.$reading.day",get_Reading("$Name.$reading.day",0)+$diff,1);;
                set_Reading("$Name.$reading.month",get_Reading("$Name.$reading.month",0)+$diff,1);;
                set_Reading("$Name.$reading.year",get_Reading("$Name.$reading.year",0)+$diff,1);;
                }
        }   
}

sub midnight {    my ($device,$reading,$mday,$yday,$newval)=@_;;
  set_Reading("$device.$reading.day_counter",$newval);;
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;
  set_Reading("$device.$reading.day",0,1);;
  set_Reading("$device.$reading.month",int(($newval-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);;
  set_Reading("$device.$reading.year",int(($newval-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);;

  if ($mday == 1) {
    set_Reading("$device.$reading.month_counter",$newval);;
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);;
    set_Reading("$device.$reading.month",0,1);;
    if ($yday == 0) {
      set_Reading("$device.$reading.year_counter",$newval);;
      set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;
      set_Reading("$device.$reading.year",0,1);;
        }
  }
}

sub init_readings {
  my ($device,$reading,$newval)=@_;;
  my $alias=::AttrVal($device, "alias","");;
 
  if($alias ne "") {set_Reading("$device.$reading",$alias);;}
  if (get_Reading("$device.$reading.day_counter","") eq "") {             set_Reading("$device.$reading.last_counter",$newval);;
    set_Reading("$device.$reading.day_counter",$newval);;       
    set_Reading("$device.$reading.month_counter",$newval);;
    set_Reading("$device.$reading.year_counter",$newval);;
 
    set_Reading ("$device.$reading.day",0);;                set_Reading ("$device.$reading.month",0);;              set_Reading ("$device.$reading.year",0);;               set_Reading ("$device.$reading.last_day",0);;           set_Reading ("$device.$reading.last_month",0);;         set_Reading ("$device.$reading.last_year",0);;     
                 fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log di_counter_new:$device.$reading.last_(day|month|year):.*");;
    fhem ("attr log.counter.$device.$reading room Filelogs");;
}
}

resetAllEnergyData {
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {
        if(ReadingsVal("$Device","relay_0_energy_total","err") ne "err") {
                fhem("setreading $Device relay_0_energy_total 0");;
                fhem("setreading $Device energy_total 0");;
                fhem("setreading $Device energy_total_kWh 0");;
                fhem("setreading $Device energy_total_reset done");;
        } elsif(ReadingsVal("$Device","relay_1_energy_total","err") ne "err") {
                fhem("setreading $Device relay_1_energy_total 0");;
                fhem("setreading $Device energy_total 0");;
                fhem("setreading $Device energy_total_kWh 0");;
                fhem("setreading $Device energy_total_reset done");;
        } elsif(ReadingsVal("$Device","light_0_energy_total","err") ne "err") {
                fhem("setreading $Device light_0_energy_total 0");;
                fhem("setreading $Device energy_total 0");;
                fhem("setreading $Device energy_total_kWh 0");;
                fhem("setreading $Device energy_total_reset done");;
        }
  }
}

get_data {                                my $reading=::AttrVal("di_counter_new","EnergyReading","");;

  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {
    ::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_day","bar1month",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_day"));;
    ::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_month","bar2year",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_month"));;
        ::DOIF_set_card_data ("di_counter_new","di_counter_new","$Device.$reading.last_year","bar2decade",-300,fhem("get log.counter.$Device.$reading ./log/counter.$Device.$reading.log - 2000 3000 4:last_year"));;
        }
}

deleteAllReadings {
        fhem("deletereading di_counter_new .*");;
}

mid {[00:01];;                             my $newval=ReadingsVal($device, $reading,0);;
  my $reading=::AttrVal("di_counter_new","EnergyReading","");;
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {      midnight($Device,$reading,$mday,$yday,$newval);;
  }
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");;
    foreach my $Category (@Categories) {
          my ($Name,$Filter)=split /;;/, $Category;;
          $newval=get_Reading("$Name.$reading.day",0);;
          midnight($Name,$reading,$mday,$yday,$newval);;
         }
}

init {                                   my $reading=::AttrVal("di_counter_new","EnergyReading","");;
  my $newval=0;;
  foreach my $Device (::devspec2array(::AttrVal("di_counter_new","UsedDevFilter",""))) {     $newval=ReadingsVal($Device, $reading,0);;
        init_readings($Device,$reading,$newval);;
  }
  my @Categories=split /,/, ::AttrVal("di_counter_new","SummaryList","");;
    foreach my $Category (@Categories) {
          my ($Name,$Filter)=split /;;/, $Category;;
          my ($DefFilterName,$DefFilter)=split /;;/, ::AttrVal("di_counter_new","SummaryFilter","");;
            $Filter =~s/$DefFilterName/$DefFilter/ig;;
          my @Devices = ::devspec2array($Filter);;
          set_Reading("$Name.members","@Devices");;
          $newval=0;;
          foreach my $Device (@Devices) {
            $newval+=ReadingsVal("$Device","$reading",0);;
          }
          init_readings($Name,$reading,$newval);;
         }
}



CalculateQuarterSums { [([+:15]+[00:01])];;
  }
CalculateHourSums { [:01];;
  }


   
  day_count__energy_total_kWh {                       
    my $diff = int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.last_counter",0)))*1000)/1000;;
      set_Reading (".energy_total_kWh.last_counter",[:energy_total_kWh,0]);;
      set_Reading (".energy_total_kWh.day",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.day_counter",0)))*1000)/1000,1);;
      set_Reading (".energy_total_kWh.month",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.month_counter",0)))*1000)/1000,1);;
      set_Reading (".energy_total_kWh.year",int(([:energy_total_kWh,0]-(get_Reading(".energy_total_kWh.year_counter",0)))*1000)/1000,1);;
         
          if ($diff>0) {
                SumUpCategories("","energy_total_kWh",$diff);;
          }
          }


setuuid: Please define di_counter_new first
./log/fhem.save: Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.day, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.day_counter, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.last_counter, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.last_day, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.last_month, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.last_year, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.month, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.month_counter, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.year, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.energy_total_kWh.year_counter, try help.
Unknown command <default>:FILTER=group=Haushaltsgeräte.members, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.day, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.day_counter, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.last_counter, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.last_day, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.last_month, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.last_year, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.month, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.month_counter, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.year, try help.
Unknown command <default>:FILTER=group=IT.energy_total_kWh.year_counter, try help.
Unknown command <default>:FILTER=group=IT.members, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.day, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.day_counter, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.last_counter, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.last_day, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.last_month, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.last_year, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.month, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.month_counter, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.year, try help.
Unknown command <default>:FILTER=group=Licht.energy_total_kWh.year_counter, try help.
Unknown command <default>:FILTER=group=Licht.members, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.day, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.day_counter, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.last_counter, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.last_day, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.last_month, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.last_year, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.month, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.month_counter, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.year, try help.
Unknown command <default>:FILTER=group=Multimedia.energy_total_kWh.year_counter, try help.
Unknown command <default>:FILTER=group=Multimedia.members, try help.

Damian

wenn ich zuhause bin, werde ich in meinem Testsystem deine Definition versuchen einzuspielen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Deine gepostete Definition klappt bei mir auch nicht. es liegt an dieser Zeile:

FOR(::devspec2array(::AttrVal("$SELF","UsedDevFilter","")), TPL_stat ($_,energy_total_kWh))

Die FOR-Schleife soll die DOIF-Blöcke definieren, das geschieht als erstes, zu dem Zeitpunkt sind aber die Attribute noch nicht gesetzt, die Definitionen der Attribute kommt erst danach.

Wenn das System bereits läuft und du die Definition anpasst, dann klappt es offenbar, weil die Attribute dann schon bekannt sind.



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

gestein

Darauf wäre ich nie gekommen.
Vielen Dank für Deine Hilfe!

Dann müsste ich das Anlegen der Readings in den Init-Block verlegen.
Der wird ja aufgerufen, wenn das Device vollkommen definiert ist. Oder?

Lg, Gerhard

Damian

#114
Zitat von: gestein am 15 Februar 2023, 20:44:56
Darauf wäre ich nie gekommen.
Vielen Dank für Deine Hilfe!

Dann müsste ich das Anlegen der Readings in den Init-Block verlegen.
Der wird ja aufgerufen, wenn das Device vollkommen definiert ist. Oder?

Lg, Gerhard

mit TPL_stat werden die DOIF-Blöcke definiert, das kommt unmittelbar nach der Definition der Subroutinen und ist ziemlich elementar. Die Definition eines DOIF-Blocks macht viele Dinge im Hintergrund, wie z. B. das Aufsetzen der Trigger-Mechanismen. Es ist ein Teil der Definition des Devices und da kann man nicht warten bis das System komplett initialisiert ist.

Das funktioniert dagegen in meiner Definition, weil ich bereits im subs-Block das interne Array mit den Readings definiere. Man kann schon eine ganze Menge dynamisch machen, allerdings kann sich das Device nicht selbst dynamisch definieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gestein

Wenn ich den FOR-Block rausnehme, dann wird das Device wirklich angelegt.

Soweit ich das verstehe, wird mit jedem Aufruf in der FOR-Schleife über das Template eine Funktion mit dem Namen "day_count_$1_$2" ($1 = Device-Name; $2 = Reading-Name) angelegt.
Getriggert wird auf eine der Angaben [$1:$2,0] in der Funktion. Richtig?

lg, Gerhard

Damian

Zitat von: gestein am 16 Februar 2023, 09:47:10
Wenn ich den FOR-Block rausnehme, dann wird das Device wirklich angelegt.

Soweit ich das verstehe, wird mit jedem Aufruf in der FOR-Schleife über das Template eine Funktion mit dem Namen "day_count_$1_$2" ($1 = Device-Name; $2 = Reading-Name) angelegt.
Getriggert wird auf eine der Angaben [$1:$2,0] in der Funktion. Richtig?

lg, Gerhard

Richtig. Entscheidend ist, dass man pro Reading einen DOIF-Block hat mit dem entsprechenden Trigger - das geschieht während der Definitionsphase bevor das System hochgefahren ist (init_done), d. h. bevor Attribute und gesicherte Readings geladen sind - das sind FHEM-Mechanismen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dennis_n

Ich glaube ich habe meinen Fehler gefunden.
Bei mir führt der Timer, der die Werte nachts schreiben soll nicht ordnungsgemäß aus.

*{at_ultimo(23,59,55)} setreading Stromzaehler Bezug180 [MQTT2_DVES_74ED88:MT681_Bezug]; setreading Stromzaehler Einspeisung280 [MQTT2_DVES_74ED88:MT681_Einspeisung]

Ich sammele ja alle Werte in einem dummy und hole mir dann mit dem DOIF von Damian die Werte aus dem dummy.
Aber dort wird nichts reingeschrieben. Im log steht:
at_ultimo: Unknown command (setreading, try help.

Kann  ich ein reading meines dummys nicht per setreading füllen?
Wenn nein, wie sonst?

Danke
Gruss
Dennis

cwagner

#118
Zitat von: dennis_n am 18 Februar 2023, 20:06:29
Iat_ultimo: Unknown command (setreading, try help.

Kann  ich ein reading meines dummys nicht per setreading füllen?

Bei AT bist Du außerhalb der Welt von DOIF und da "setzt" man einen Wert mit set.
Es sollte also gehen mit set Stromzaehler [Wert]

Mein Beitrag war leider falsch - siehe nachfolgende Korrektur durch Damian.
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

Zitat von: cwagner am 19 Februar 2023, 08:23:54
Bei AT bist Du außerhalb der Welt von DOIF und da "setzt" man einen Wert mit set.
Es sollte also gehen mit set Stromzaehler [Wert]

Christian

setreading geht genauso gut - es ist ein FHEM-Befehl. Bei set musst du readingsList und setList im Dummy setzen. Bei mir funktioniert jedenfalls setreading im at - aber das ist ja eine andere Baustelle. Bei at-Fragen ist man im Automatisierungs-Board besser aufgehoben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF