Neues Modul 98_FileLogConvert.pm - FileLog Import in DbLog und mehr

Begonnen von DeeSPe, 04 Februar 2017, 12:20:07

Vorheriges Thema - Nächstes Thema

JimKnopf

Hi!

Dann muss ich mir ja nicht nur Gedanken über das Einlesen der Logdatei machen, sondern mich auch wieder mit SQL in c++ beschäftigen.
Ich guck mir das Perl Modul mal an, vielleicht kapiere ich ja wie das aufgebaut ist, dann bau ich das da direkt ein.

Gruß,
Burkhard
FHEM,LaCrosse,PCA301,Revolt,MAX!,HM,FS20, MQTT2, ebusd 3.4.v3.4-96-g96d5623, ebus Adapter 3.0 mit 20201219-offset , Wolf  CGB (-K)-20, Wolf ISM7, Wolf Solar SM, Speicher/WR E3DC S10, eGolf, Keba P30, Phoenix Contact EV, OpenWB

Otto123

Ne guck Dir lieber mein SQL Script (#80) an, dass ist einfacher. Aber ja vielleicht hast Du recht, mach einfach andere Logs :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

JimKnopf

#92
So Leute,
ich hab mich mal ein wenig mit Perl beschäftigt und die Funktion zum konvertieren abgeändert wie folgt:
1. Ein paar Variablen hinzugefügt (Reading 2 - 5, Value 2-5, event 2-5)
2. einen Abschnitt, wo die Logline analysiert wird, wie viele Elemente enthalten sind, 4 mal kopiert und abgeändert, so das zusätzlich auf 2 bis 5 reading: value Pärchen geprüft wird
3. wurden in den neuen Abschnitten weitere Werte in der Zeile erkannt, wird für diese nochmals ein Datensatz mit diesen Werten in die Datenbank geschrieben.

hier die vollständige Subroutine mit den Änderungen (mit # Komentaren):

sub FileLogConvert_FileRead($)
{
#noch original, erste Änderunge weiter unten
  my ($string) = @_;
  return unless (defined $string);
  my @a       = split /\|/,$string;
  my $name    = $a[0];
  my $hash    = $defs{$name};
  my $cmd     = $hash->{helper}{filedata}{cmd};
  my $dir     = $hash->{helper}{filedata}{dir};
  my $source  = $hash->{helper}{filedata}{source};
  my $dblog   = $hash->{helper}{filedata}{dblog};
  my $eventregex = $hash->{helper}{filedata}{eventregex} ? $hash->{helper}{filedata}{eventregex} : ".*";
  my $stateregex = $hash->{helper}{filedata}{stateregex} ? $hash->{helper}{filedata}{stateregex} : ".*";
  $stateregex =~ s/:/|/g;
  delete $hash->{helper}{filedata};
  my $fname   = "$dir/$source";
  my @events;
  if (!open FH,$fname)
  {
    close(FH);
    my $err = encode_base64("could not read $fname","");
    return "$name|''|$err";
  }
  my $arows = 0;
  my $crows = 0;
  my $dest = $source;
  $dest =~ s/log$/csv/ if ($cmd eq "convert2csv");
  $dest =~ s/log$/sql/ if ($cmd eq "convert2sql");
  $dest =~ s/log$/$dblog/ if ($cmd eq "import2DbLog");
  if ($cmd =~ /^(convert2(csv|sql)|import2DbLog)$/)
  {
    if (!open WH,">>$dir/$dest")
    {
      close WH;
      my $err = encode_base64("could not write $dir/$dest","");
      return "$name|''|$err";
    }
  }
  while (my $line = <FH>)
  {
    $arows++;
    chomp $line;
    $line =~ s/\s{2,}/ /g;
    if ($cmd eq "fileEvents")
    {
      next unless ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s([A-Za-z0-9\.\-_]+):\s(\S+)(\s.*)?$/
        || $line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s([A-Za-z0-9\.\-_]+)$/);
      push @events,$4 if (!grep(/^$4$/,@events));
    }
    else
    {
      my $i_date;
      my $i_time;
      my $i_device;
      my $i_type;
      my $i_event;
      my $i_reading;
      my $i_value;
#hier die ersten Änderungen
     my $i_reading2;
      my $i_value2;
      my $i_reading3;
      my $i_value3;
      my $i_reading4;
      my $i_value4;
      my $i_reading5;
      my $i_value5;
      my $i_unit = ""; # diese Zeile ist noch orignial
      $i_reading2=undef; #bei jedem Durchlauf zurücksetzen um prüfen zu können ob sie genutzt wurden
      $i_reading3=undef;
      $i_reading4=undef;
      $i_reading5=undef;
      $i_value2=undef;
      $i_value3=undef;
      $i_value4=undef;
      $i_value5=undef;
     
#Abfrage der Logstruktur erweitert um 4 x \s([A-Za-z0-9\.\-_]+):\s(\S+)(\s.*)
      if    ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        $i_reading2 = $6;
        $i_value2 = $7;
        $i_reading3 = $8;
        $i_value3 = $9;
        $i_reading4 = $10;
        $i_value4 = $11;
        $i_reading5 = $12;
        $i_value5 = $13;
my $rest = $12 if ($12);
       
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
        $i_event2 = "$i_reading: $i_value";
        $i_event2 .= " $rest" if ($rest);
        $i_event3 = "$i_reading: $i_value";
        $i_event3 .= " $rest" if ($rest);
        $i_event4 = "$i_reading: $i_value";
        $i_event4 .= " $rest" if ($rest);
        $i_event5 = "$i_reading: $i_value";
        $i_event5 .= " $rest" if ($rest);
      }
      elsif    ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        $i_reading2 = $6;
        $i_value2 = $7;
        $i_reading3 = $8;
        $i_value3 = $9;
        $i_reading4 = $10;
        $i_value4 = $11;
        my $rest = $12 if ($12);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
        $i_event2 = "$i_reading: $i_value";
        $i_event2 .= " $rest" if ($rest);
        $i_event3 = "$i_reading: $i_value";
        $i_event3 .= " $rest" if ($rest);
        $i_event4 = "$i_reading: $i_value";
        $i_event4 .= " $rest" if ($rest);
      }
      elsif    ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        $i_reading2 = $6;
        $i_value2 = $7;
        $i_reading3 = $8;
        $i_value3 = $9;
        my $rest = $10 if ($10);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
        $i_event2 = "$i_reading: $i_value";
        $i_event2 .= " $rest" if ($rest);
        $i_event3 = "$i_reading: $i_value";
        $i_event3 .= " $rest" if ($rest);
      }
      elsif    ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        $i_reading2 = $6;
        $i_value2 = $7;
        my $rest = $8 if ($8);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
        $i_event2 = "$i_reading: $i_value";
        $i_event2 .= " $rest" if ($rest);
      }
      elsif    ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s+([A-Za-z0-9\.\-_]+):\s+(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        my $rest = $6 if ($6);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
      }
     
     
# ab hier erst mal wieder original weiter     
     
      elsif ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s([A-Za-z0-9\.\-_]+):\s(\S+)(\s.*)?$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_reading = $4;
        $i_value = $5;
        my $rest = $6 if ($6);
        next if ($i_reading !~ /^($eventregex)$/);
        $i_unit = $rest ? (split " ",$rest)[0] : "";
        $i_unit = "" if ($i_unit =~ /^[\/\[\{\(]/);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_event = "$i_reading: $i_value";
        $i_event .= " $rest" if ($rest);
      }
      elsif ($line =~ /^(\d{4}-\d{2}-\d{2})_(\d{2}:\d{2}:\d{2})\s([A-Za-z0-9\.\-_]+)\s([A-Za-z0-9\.\-_]+)$/)
      {
        $i_date = $1;
        $i_time = $2;
        $i_device = $3;
        $i_value = $4;
        next if ($i_value !~ /^($eventregex)$/);
        $i_type = IsDevice($i_device) ? uc $defs{$i_device}->{TYPE} : "";
        $i_reading = "state";
        $i_event = $i_value;
      }
      else
      {
        next;
      }
      $crows++;
      my $ret;
     
 
      { # in Klammern gesetzt zur besseren lesbarkeit, der Code in dieser Klammer ist original
$ret = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$i_date $i_time','$i_device','$i_type','$i_event','$i_reading','$i_value','$i_unit');" if ($cmd =~ /^(import2DbLog|convert2sql)$/);
$ret = '"'.$i_date.' '.$i_time.'","'.$i_device.'","'.$i_type.'","'.$i_event.'","'.$i_reading.'","'.$i_value.'","'.$i_unit.'"' if ($cmd eq "convert2csv");
DbLog_ExecSQL($defs{$dblog},$ret) if ($cmd eq "import2DbLog");
print WH $ret,"\n" if ($cmd =~ /^convert2(csv|sql)$/);
  }
# jetzt prüfen ob weitere readings gefunden wurden
  if (defined $i_reading2)# hatten wir ja zu Beginn auf undef gesetzt, wurde sie neu beschrieben? Dann die SQL Funktion mit reading2/value2 ausführen
      {
$ret = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$i_date $i_time','$i_device','$i_type','$i_event','$i_reading2','$i_value2','$i_unit');" if ($cmd =~ /^(import2DbLog|convert2sql)$/);
$ret = '"'.$i_date.' '.$i_time.'","'.$i_device.'","'.$i_type.'","'.$i_event.'","'.$i_reading2.'","'.$i_value2.'","'.$i_unit.'"' if ($cmd eq "convert2csv");
DbLog_ExecSQL($defs{$dblog},$ret) if ($cmd eq "import2DbLog");
print WH $ret,"\n" if ($cmd =~ /^convert2(csv|sql)$/);
  }
  if (defined $i_reading3)# usw.
      {
$ret = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$i_date $i_time','$i_device','$i_type','$i_event','$i_reading3','$i_value3','$i_unit');" if ($cmd =~ /^(import2DbLog|convert2sql)$/);
$ret = '"'.$i_date.' '.$i_time.'","'.$i_device.'","'.$i_type.'","'.$i_event.'","'.$i_reading3.'","'.$i_value3.'","'.$i_unit.'"' if ($cmd eq "convert2csv");
DbLog_ExecSQL($defs{$dblog},$ret) if ($cmd eq "import2DbLog");
print WH $ret,"\n" if ($cmd =~ /^convert2(csv|sql)$/);
  }
  if (defined $i_reading4)
      {
$ret = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$i_date $i_time','$i_device','$i_type','$i_event','$i_reading4','$i_value4','$i_unit');" if ($cmd =~ /^(import2DbLog|convert2sql)$/);
$ret = '"'.$i_date.' '.$i_time.'","'.$i_device.'","'.$i_type.'","'.$i_event.'","'.$i_reading4.'","'.$i_value4.'","'.$i_unit.'"' if ($cmd eq "convert2csv");
DbLog_ExecSQL($defs{$dblog},$ret) if ($cmd eq "import2DbLog");
print WH $ret,"\n" if ($cmd =~ /^convert2(csv|sql)$/);
  }
  if (defined $i_reading5)
      {
$ret = "INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('$i_date $i_time','$i_device','$i_type','$i_event','$i_reading5','$i_value5','$i_unit');" if ($cmd =~ /^(import2DbLog|convert2sql)$/);
$ret = '"'.$i_date.' '.$i_time.'","'.$i_device.'","'.$i_type.'","'.$i_event.'","'.$i_reading5.'","'.$i_value5.'","'.$i_unit.'"' if ($cmd eq "convert2csv");
DbLog_ExecSQL($defs{$dblog},$ret) if ($cmd eq "import2DbLog");
print WH $ret,"\n" if ($cmd =~ /^convert2(csv|sql)$/);
  }
#ab hier wieder original
    }
  }
  close WH if ($cmd =~ /^(convert2(csv|sql)|import2DbLog)$/);
  close FH;
  my $events = @events ? encode_base64(join(" ",@events),"") : "";
  my $regex = $eventregex ? encode_base64($eventregex,"") : "";
  return "$name|$cmd,$source,$arows,$dest,$crows,$events,$regex";
}


Ich prüfe erst auf das 5. reading:value Pärchen, dann 4.,3.,2.,1. weil 4 ja in 5 enthalten wäre usw.. Ich habe die Leerstellentoleranz erhöt, es dürfen auch mehr als eine zwischen den Werten sein.
Danach wird dann das Original mit my $rest ausgeführt.


Das Ergebnis im logdb:
Date             Time              Device                       Type        Event        Reading   Value
2020-03-27 04:25:06    EM_Kuehlschrank    CUL_EM    CNT: 88    CNT            88    
2020-03-27 04:25:06    EM_Kuehlschrank    CUL_EM    CNT: 88    CUM    79.815    
2020-03-27 04:25:06    EM_Kuehlschrank    CUL_EM    CNT: 88    5MIN    0.080    
2020-03-27 04:25:06    EM_Kuehlschrank    CUL_EM    CNT: 88    TOP            0.080    

Für mich funktioniert das jetzt.
Gruß,
Burkhard
FHEM,LaCrosse,PCA301,Revolt,MAX!,HM,FS20, MQTT2, ebusd 3.4.v3.4-96-g96d5623, ebus Adapter 3.0 mit 20201219-offset , Wolf  CGB (-K)-20, Wolf ISM7, Wolf Solar SM, Speicher/WR E3DC S10, eGolf, Keba P30, Phoenix Contact EV, OpenWB

Speedy

Zitat von: DeeSPe am 01 November 2019, 09:30:02
Hallo ddw,

das ist ja interessant, könntest Du mir bitte die komplette geänderte Moduldatei von Dir zukommen lassen?

Danke.

Gruß
Dan

Hallo Dan,

ich weiss, das ist schon ein paar Tage her... - ich wollte aber trotzdem mal fragen, ob Du Dir den Vorschlag von ddw mal angeschaut hattest. Ich möchte derzeit auch eine Menge an Logfiles in meine MariaDB mittels Deines Tools importieren. Allerdings ist es auch bei mir so langsam, dass das Vorgehen so nicht praktikabel ist.

Oder gibt es noch andere Möglichkeiten den Import zu beschleunigen?

Danke und viele Grüße


- Speedy
FHEM auf Intel NUC mit Proxmox, Grafana, DbLog mit MariaDB, ZWave-/EnOcean-/HomeMatic-USB-Dongle, KNX IP-Bridge, HUE Bridge, Sonos, Avanta Gastherme, Presence via Unifi, Rolladensteuerung, Raumtemperatur-/Fussbodenheizung-Steuerung

ahlermi

Hallo Zusammen,
hat einer ein Script gebaut um alle Logfiles eines FileLog zu importieren?
Gruß Michael
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Beta-User

Zitat von: ahlermi am 02 Oktober 2025, 10:17:10Hallo Zusammen,
hat einer ein Script gebaut um alle Logfiles eines FileLog zu importieren?
Gruß Michael
Alle nicht, aber vielleicht hilft https://forum.fhem.de/index.php?msg=990144
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ahlermi

Danke, habe es jetzt mit ner liste gelöst die ich füttern kann.
Wird immer eins abgebaut.

Ein Dummy zum starten.

Internals:
   CFGFN     
   FUUID      68de370b-f33f-6442-678a-2e2fe2336b00b8b4
   NAME       d_FileLogConvertImport
   NR         9619
   STATE      on
   TYPE       dummy
   eventCount 31
   Helper:
     DBLOG:
       logList:
         LogDB:
           TIME       1759402488.5771
           VALUE      Wechselrichter-2022-41.logWechselrichter-2022-42.logWechselrichter-2022-43.logWechselrichter-2022-44.logWechselrichter-2022-45.logWechselrichter-2022-46.logWechselrichter-2022-47.logWechselrichter-2022-48.logWechselrichter-2022-49.logWechselrichter-2022-50.logWechselrichter-2022-51.logWechselrichter-2022-52.logWechselrichter-2023-01.logWechselrichter-2023-02.logWechselrichter-2023-03.logWechselrichter-2023-04.logWechselrichter-2023-05.logWechselrichter-2023-06.logWechselrichter-2023-07.logWechselrichter-2023-08.logWechselrichter-2023-09.logWechselrichter-2023-10.logWechselrichter-2023-11.logWechselrichter-2023-12.logWechselrichter-2023-13.logWechselrichter-2023-14.logWechselrichter-2023-15.logWechselrichter-2023-16.logWechselrichter-2023-17.logWechselrichter-2023-18.logWechselrichter-2023-19.logWechselrichter-2023-20.logWechselrichter-2023-21.logWechselrichter-2023-22.logWechselrichter-2023-23.logWechselrichter-2023-24.logWechselrichter-2023-25.logWechselrichter-2023-26.logWechselrichter-2023-27.logWechselrichter-2023-28.logWechselrichter-2023-29.logWechselrichter-2023-30.logWechselrichter-2023-31.logWechselrichter-2023-32.logWechselrichter-2023-33.logWechselrichter-2023-34.logWechselrichter-2023-35.logWechselrichter-2023-36.logWechselrichter-2023-37.logWechselrichter-2023-38.logWechselrichter-2023-39.logWechselrichter-2023-40.logWechselrichter-2023-41.logWechselrichter-2023-42.logWechselrichter-2023-43.logWechselrichter-2023-44.logWechselrichter-2023-45.logWechselrichter-2023-46.logWechselrichter-2023-47.logWechselrichter-2023-48.logWechselrichter-2023-49.logWechselrichter-2023-50.logWechselrichter-2023-51.logWechselrichter-2023-52.logWechselrichter-2024-01.logWechselrichter-2024-02.logWechselrichter-2024-03.logWechselrichter-2024-04.logWechselrichter-2024-05.logWechselrichter-2024-06.logWechselrichter-2024-07.logWechselrichter-2024-08.logWechselrichter-2024-09.logWechselrichter-2024-10.logWechselrichter-2024-11.logWechselrichter-2024-12.logWechselrichter-2024-13.logWechselrichter-2024-14.logWechselrichter-2024-15.logWechselrichter-2024-16.logWechselrichter-2024-17.logWechselrichter-2024-18.logWechselrichter-2024-19.logWechselrichter-2024-20.logWechselrichter-2024-21.logWechselrichter-2024-22.logWechselrichter-2024-23.logWechselrichter-2024-24.logWechselrichter-2024-25.logWechselrichter-2024-26.logWechselrichter-2024-27.logWechselrichter-2024-28.logWechselrichter-2024-29.logWechselrichter-2024-30.logWechselrichter-2024-31.logWechselrichter-2024-32.logWechselrichter-2024-33.logWechselrichter-2024-34.logWechselrichter-2024-35.logWechselrichter-2024-36.logWechselrichter-2024-37.logWechselrichter-2024-38.logWechselrichter-2024-39.logWechselrichter-2024-40.logWechselrichter-2024-41.logWechselrichter-2024-42.logWechselrichter-2024-43.logWechselrichter-2024-44.logWechselrichter-2024-45.logWechselrichter-2024-46.logWechselrichter-2024-47.logWechselrichter-2024-48.logWechselrichter-2024-49.logWechselrichter-2024-50.logWechselrichter-2024-51.logWechselrichter-2024-52.logWechselrichter-2025-01.logWechselrichter-2025-02.logWechselrichter-2025-03.logWechselrichter-2025-04.logWechselrichter-2025-05.logWechselrichter-2025-06.logWechselrichter-2025-07.logWechselrichter-2025-08.logWechselrichter-2025-09.logWechselrichter-2025-10.logWechselrichter-2025-11.logWechselrichter-2025-12.logWechselrichter-2025-13.logWechselrichter-2025-14.logWechselrichter-2025-15.logWechselrichter-2025-16.logWechselrichter-2025-17.logWechselrichter-2025-18.logWechselrichter-2025-19.logWechselrichter-2025-20.logWechselrichter-2025-21.logWechselrichter-2025-22.logWechselrichter-2025-23.logWechselrichter-2025-24.logWechselrichter-2025-25.logWechselrichter-2025-26.logWechselrichter-2025-27.logWechselrichter-2025-28.logWechselrichter-2025-29.logWechselrichter-2025-30.logWechselrichter-2025-31.logWechselrichter-2025-32.logWechselrichter-2025-33.logWechselrichter-2025-34.logWechselrichter-2025-35.logWechselrichter-2025-36.logWechselrichter-2025-37.logWechselrichter-2025-38.logWechselrichter-2025-39.logWechselrichter-2025-40.log
       state:
         LogDB:
           TIME       1759727573.12723
           VALUE      on
   OLDREADINGS:
   READINGS:
     2025-10-06 07:12:53   logList         Wechselrichter-2023-03.log
Wechselrichter-2023-04.log
Wechselrichter-2023-05.log
Wechselrichter-2023-06.log
Wechselrichter-2023-07.log
Wechselrichter-2023-08.log
Wechselrichter-2023-09.log
Wechselrichter-2023-10.log
Wechselrichter-2023-11.log
Wechselrichter-2023-12.log
Wechselrichter-2023-13.log
Wechselrichter-2023-14.log
Wechselrichter-2023-15.log
Wechselrichter-2023-16.log
Wechselrichter-2023-17.log
Wechselrichter-2023-18.log
Wechselrichter-2023-19.log
Wechselrichter-2023-20.log
Wechselrichter-2023-21.log
Wechselrichter-2023-22.log
Wechselrichter-2023-23.log
Wechselrichter-2023-24.log
Wechselrichter-2023-25.log
Wechselrichter-2023-26.log
Wechselrichter-2023-27.log
Wechselrichter-2023-28.log
Wechselrichter-2023-29.log
Wechselrichter-2023-30.log
Wechselrichter-2023-31.log
Wechselrichter-2023-32.log
Wechselrichter-2023-33.log
Wechselrichter-2023-34.log
Wechselrichter-2023-35.log
Wechselrichter-2023-36.log
Wechselrichter-2023-37.log
Wechselrichter-2023-38.log
Wechselrichter-2023-39.log
Wechselrichter-2023-40.log
Wechselrichter-2023-41.log
Wechselrichter-2023-42.log
Wechselrichter-2023-43.log
Wechselrichter-2023-44.log
Wechselrichter-2023-45.log
Wechselrichter-2023-46.log
Wechselrichter-2023-47.log
Wechselrichter-2023-48.log
Wechselrichter-2023-49.log
Wechselrichter-2023-50.log
Wechselrichter-2023-51.log
Wechselrichter-2023-52.log
Wechselrichter-2024-01.log
Wechselrichter-2024-02.log
Wechselrichter-2024-03.log
Wechselrichter-2024-04.log
Wechselrichter-2024-05.log
Wechselrichter-2024-06.log
Wechselrichter-2024-07.log
Wechselrichter-2024-08.log
Wechselrichter-2024-09.log
Wechselrichter-2024-10.log
Wechselrichter-2024-11.log
Wechselrichter-2024-12.log
Wechselrichter-2024-13.log
Wechselrichter-2024-14.log
Wechselrichter-2024-15.log
Wechselrichter-2024-16.log
Wechselrichter-2024-17.log
Wechselrichter-2024-18.log
Wechselrichter-2024-19.log
Wechselrichter-2024-20.log
Wechselrichter-2024-21.log
Wechselrichter-2024-22.log
Wechselrichter-2024-23.log
Wechselrichter-2024-24.log
Wechselrichter-2024-25.log
Wechselrichter-2024-26.log
Wechselrichter-2024-27.log
Wechselrichter-2024-28.log
Wechselrichter-2024-29.log
Wechselrichter-2024-30.log
Wechselrichter-2024-31.log
Wechselrichter-2024-32.log
Wechselrichter-2024-33.log
Wechselrichter-2024-34.log
Wechselrichter-2024-35.log
Wechselrichter-2024-36.log
Wechselrichter-2024-37.log
Wechselrichter-2024-38.log
Wechselrichter-2024-39.log
Wechselrichter-2024-40.log
Wechselrichter-2024-41.log
Wechselrichter-2024-42.log
Wechselrichter-2024-43.log
Wechselrichter-2024-44.log
Wechselrichter-2024-45.log
Wechselrichter-2024-46.log
Wechselrichter-2024-47.log
Wechselrichter-2024-48.log
Wechselrichter-2024-49.log
Wechselrichter-2024-50.log
Wechselrichter-2024-51.log
Wechselrichter-2024-52.log
Wechselrichter-2025-01.log
Wechselrichter-2025-02.log
Wechselrichter-2025-03.log
Wechselrichter-2025-04.log
Wechselrichter-2025-05.log
Wechselrichter-2025-06.log
Wechselrichter-2025-07.log
Wechselrichter-2025-08.log
Wechselrichter-2025-09.log
Wechselrichter-2025-10.log
Wechselrichter-2025-11.log
Wechselrichter-2025-12.log
Wechselrichter-2025-13.log
Wechselrichter-2025-14.log
Wechselrichter-2025-15.log
Wechselrichter-2025-16.log
Wechselrichter-2025-17.log
Wechselrichter-2025-18.log
Wechselrichter-2025-19.log
Wechselrichter-2025-20.log
Wechselrichter-2025-21.log
Wechselrichter-2025-22.log
Wechselrichter-2025-23.log
Wechselrichter-2025-24.log
Wechselrichter-2025-25.log
Wechselrichter-2025-26.log
Wechselrichter-2025-27.log
Wechselrichter-2025-28.log
Wechselrichter-2025-29.log
Wechselrichter-2025-30.log
Wechselrichter-2025-31.log
Wechselrichter-2025-32.log
Wechselrichter-2025-33.log
Wechselrichter-2025-34.log
Wechselrichter-2025-35.log
Wechselrichter-2025-36.log
Wechselrichter-2025-37.log
Wechselrichter-2025-38.log
Wechselrichter-2025-39.log
Wechselrichter-2025-40.log
     2025-10-06 07:12:53   logListDone     Wechselrichter-2022-41.log
Wechselrichter-2022-42.log
Wechselrichter-2022-41.log
Wechselrichter-2022-42.log
Wechselrichter-2022-43.log
Wechselrichter-2022-44.log
Wechselrichter-2022-45.log
Wechselrichter-2022-46.log
Wechselrichter-2022-47.log
Wechselrichter-2022-48.log
Wechselrichter-2022-49.log
Wechselrichter-2022-50.log
Wechselrichter-2022-51.log
Wechselrichter-2022-52.log
Wechselrichter-2023-01.log
Wechselrichter-2023-02.log
     2025-10-06 07:12:53   state           on
   helper:
     bm:
       dummy_Define:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 10:25:47
         max        3.98159027099609e-05
         tot        3.98159027099609e-05
         mAr:
           HASH(d_FileLogConvertImport)
           d_FileLogConvertImport dummy
       dummy_Set:
         cnt        209
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.10. 07:12:53
         max        0.277354001998901
         tot        2.57273507118225
         mAr:
           HASH(0x55dc9e2cc8e8)
           d_FileLogConvertImport
           on
Attributes:
   alias      FileLogConvertImport
   readingList logList
   room       System->Logs
   setList    on:noArg off:noArg logList:textField-long

Ein Notify dafür

Internals:
   CFGFN     
   DEF        d_FileLogConvertImport.*on {
  my @LogTodo = split /\n/, ReadingsVal($NAME,"logList","");
  my @LogDone = split /\n/, ReadingsVal($NAME,"logListDone","");

  if ((ReadingsVal("flc","state","NONE") =~ m/importing/) || (ReadingsVal("flc","state","NONE") =~ m/active/)){
    fhem("set $NAME off");
    return undef;
  }

  Log 3, $NAME . " logList Einträge: " . @LogTodo ;
  if (@LogTodo > 0){
    my $first_element = shift @LogTodo;   
    push @LogDone, $first_element;
    fhem("setreading " . $NAME . " logList " . join("\n" , @LogTodo));
    fhem("setreading " . $NAME . " logListDone " . join("\n" , @LogDone));
    fhem("setreading flc import2DbLogFile $first_element");
    fhem("set flc import2DbLog $first_element");
  }else{
    fhem("set $NAME off");
  }
}
   FUUID      68de39f6-f33f-6442-fde7-a9d054f2ff8c71f7
   NAME       n_d_FileLogConvertImport
   NR         9721
   NTFY_ORDER 50-n_d_FileLogConvertImport
   REGEXP     d_FileLogConvertImport.*on
   STATE      active
   TRIGGERTIME 1759727573.13071
   TYPE       notify
   eventCount 16
   Helper:
     DBLOG:
       state:
         LogDB:
           TIME       1759728579.16483
           VALUE      active
   READINGS:
     2025-10-06 07:29:39   state           active
     2025-10-06 07:12:53   triggeredByDev  d_FileLogConvertImport
     2025-10-06 07:12:53   triggeredByEvent on
   helper:
     bm:
       notify_Attr:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 10:38:14
         max        6.91413879394531e-06
         tot        6.91413879394531e-06
         mAr:
           set
           n_d_FileLogConvertImport
           userattr
           T2F_places:textField-long T2F_properties:textField-long T2F_rooms:textField-long T2F_types_color:textField-long T2F_types_heating:textField-long T2F_types_info:textField-long T2F_types_switch:textField-long T2F_types_blind:textField-long
       notify_Define:
         cnt        20
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 10:41:39
         max        0.154863119125366
         tot        2.05446791648865
         mAr:
           HASH(n_d_FileLogConvertImport)
           n_d_FileLogConvertImport notify d_FileLogConvertImport.*on {
  my @EVENTS = split / /, ReadingsVal($NAME,"logList","");
  Log 3, $NAME . " logList Einträge: " . @EVENTS;
  fhem("set $NAME off");
}
       notify_Exec:
         cnt        2343184
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.10. 07:12:53
         max        0.219609975814819
         tot        41.4679756164551
         mAr:
           HASH(0x55dca45c87f0)
           HASH(0x55dc9e2cc8e8)
       notify_Set:
         cnt        66
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 10:57:23
         max        5.79357147216797e-05
         tot        0.00110960006713867
         mAr:
           HASH(n_d_FileLogConvertImport)
           n_d_FileLogConvertImport
           ?

ein Notify auf FileLogConvert um zu erkennen das der import durch ist.

Internals:
   CFGFN     
   DEF        flc.*import.done|flc.*has.already.been.imported.into.Dblog.* {

  my $file = ReadingsVal($NAME,"import2DbLogFile","NONE");
  system("tar -zcvf ./log/" . $file . ".gz ./log/" . $file . " --remove-files");

  fhem("set d_FileLogConvertImport on");
}
   FUUID      68de3f4d-f33f-6442-6b00-0f22a9e48b3ad446
   NAME       n_flc_done
   NR         9885
   NTFY_ORDER 50-n_flc_done
   REGEXP     flc.*import.done|flc.*has.already.been.imported.into.Dblog.*
   STATE      active
   TRIGGERTIME 1759727449.85427
   TYPE       notify
   eventCount 9
   Helper:
     DBLOG:
       state:
         LogDB:
           TIME       1759728604.24828
           VALUE      active
   READINGS:
     2025-10-06 07:30:04   state           active
     2025-10-06 07:10:49   triggeredByDev  flc
     2025-10-06 07:10:49   triggeredByEvent import done
   helper:
     bm:
       notify_Attr:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 11:01:01
         max        6.91413879394531e-06
         tot        6.91413879394531e-06
         mAr:
           set
           n_flc_done
           userattr
           T2F_places:textField-long T2F_properties:textField-long T2F_rooms:textField-long T2F_types_color:textField-long T2F_types_heating:textField-long T2F_types_info:textField-long T2F_types_switch:textField-long T2F_types_blind:textField-long
       notify_Define:
         cnt        9
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        06.10. 07:14:28
         max        0.159034013748169
         tot        1.19733190536499
         mAr:
           HASH(0x55dc9934e6b8)
           n_flc_done notify flc.*import.done|flc.*has.already.been.imported.into.Dblog.* {
  fhem("set d_FileLogConvertImport on");
}
       notify_Exec:
         cnt        2330782
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        03.10. 08:32:21
         max        0.145459890365601
         tot        40.2523460388184
         mAr:
           HASH(n_flc_done)
           HASH(flc)
       notify_Set:
         cnt        56
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        02.10. 11:01:02
         max        0.000113010406494141
         tot        0.000883817672729492
         mAr:
           HASH(n_flc_done)
           n_flc_done
           ?
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN