93_DbLog - Überlegungen zur Optimierung (RPI und andere Systeme)

Begonnen von JoeALLb, 27 Januar 2017, 22:16:19

Vorheriges Thema - Nächstes Thema

DS_Starter

Naja, gibt es schon. Am einfachsten wäre die DbLog_addCacheLine. Da wird einfach eine Zeile dem Cache hinzugefügt und mit den normalen Events in die DB eingefügt. Geht aber nur im asynchronen Modus.

Ansonsten gibt es ja noch die normale Routine DbLog_Push die auch für Events im synchronen Mode verwendet wird.
Der wird einfach ein Array der Werte übergeben:


my $row = ($timestamp."|".$dev_name."|".$dev_type."|".$event."|".$reading."|".$value."|".$unit);
push(@row_array, $row);
...
if(@row_array) {
    # return wenn "reopen" mit Ablaufzeit gestartet ist
     return if($hash->{HELPER}{REOPEN_RUNS});  
     my $error = DbLog_Push($hash, @row_array);
}

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

r26r26

Hallo zusammen,

ich nutze DBLog erst seit einigen Wochen. Im Grunde läuft alles reibungslos. Nur bei meinem ZWAVE Geräten wird das übergebene Reading nicht korrekt aufgelöst, sodass die Einheit trotzdem im Attribut "Value" gespeichert und Minus-Werte ohne Minus - also positiv - gespeichert werden.

Hier ein Auszug aus der DBLog DB:
1. Zeile... man betrachte das % Zeichen
2. Zeile... man betrachte die positive Temperatur


"2018-02-06 20:18:22" "AU.Multisensor" "ZWAVE" "humidity: 62 %" "humidity" "62 %" "%"
"2018-02-06 20:18:21" "AU.Multisensor" "ZWAVE" "temperature: -1.5 C" "temperature" "1.5" "C"



Ich steige bei den regulären Ausdrücken nicht durch. Die Syntax macht mir zu schaffen. Habt ihr eine Idee, wie man das lösen könnte?

In der 93_DBLog.pm sollte die Besonderheit für ZWAVE Geräte ja eigentlich abgebildet sein:


  # FBDECT or ZWAVE
  elsif (($type eq "FBDECT") || ($type eq "ZWAVE")) {
    if ( $value=~/([\.\d]+)\s([a-z].*)/i ) {
     $value = $1;
     $unit  = $2;
    }
  }

DS_Starter

Hallo,

ja ZWAVE Parsing hat schon in der Vergangenheit immer mal wieder für Schwierigkeiten in DbLog gesorgt.
Grundsätzlich ist zu sagen dass die Subroutine "DbLog_ParseEvent", die du zitiert hast , von mir nicht aktiv weiterentwickelt wird. Das hat den Grund dass die Modulmaintainer möglichst die Funktion "DbLog_splitFn" (siehe Wiki dazu) in ihren Modulen implementieren um das Wertesplitting direkt in den Modulen durchzuführen. Das ist am elegantesten, denn die Developer wissen am besten welche Readings die Module erzeugen usw.

Im Fall von ZWAVE ist das aber bisher nicht passiert. Deswegen ist hier der Nutzer etwas gefordert.
Man kann als User über das Attribut valueFn Perl-Ausdrücke einbauen um selbst die Aufbereitung / das Splitting vorzunehmen. Lies dir dazu mal die commandref im DbLog durch.

Wenn du damit nicht klarkommst, kannst du dich gern nochmal melden. Ich selbst habe momentan wenig Zeit für Support, aber es helfen bestimmt noch mehr Mitstreiter.

Grüße
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

r26r26

Hallo Heiko,

vielen Dank für deine schnelle Reaktion. Deinen Lösungsansatz finde ich auch nachhaltiger, als dass die Besonderheiten für jedes Modul in die DBLog Config ausgelagert werden. Ich schaue mal, ob ich deinen Workaround umsetzen kann.

Viele Grüße


René

DeeSPe

Zitat von: DS_Starter am 05 Februar 2018, 23:25:42
Naja, gibt es schon. Am einfachsten wäre die DbLog_addCacheLine. Da wird einfach eine Zeile dem Cache hinzugefügt und mit den normalen Events in die DB eingefügt. Geht aber nur im asynchronen Modus.

Ansonsten gibt es ja noch die normale Routine DbLog_Push die auch für Events im synchronen Mode verwendet wird.
Der wird einfach ein Array der Werte übergeben:


my $row = ($timestamp."|".$dev_name."|".$dev_type."|".$event."|".$reading."|".$value."|".$unit);
push(@row_array, $row);
...
if(@row_array) {
    # return wenn "reopen" mit Ablaufzeit gestartet ist
     return if($hash->{HELPER}{REOPEN_RUNS});  
     my $error = DbLog_Push($hash, @row_array);
}



Danke für den Hinweis Heiko.
Ich werde mal ein bisschen was probieren. Habe leider die nächsten Tage wenig Zeit.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

abc2006

Hi,
ich habe weitere Dateien mit FileLogImport importiert.
Dabei stelle ich fest, dass der Import hängt. Fehlermeldung :

2018.02.06 22:55:12.744 4: Executing INSERT INTO history (TIMESTAMP,DEVICE,TYPE,EVENT,READING,VALUE,UNIT) VALUES ('2018-02-01 00:43:16','OWX_1D_22DC84000003','','memory: ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@','memory','^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@','');
DBD::SQLite::db do failed: unrecognized token: "'memory: " at ./FHEM/93_DbLog.pm line 2388, <FH> line 181991.


useCharfilter ist bei DbLog gesetzt (der laut commandref in diesem fall eh nichts machen würde).
Ich würde diese Zeilen jetzt aus den Filelogs löschen.
ich weiss nicht, ob das ein "insert"-Fehler ist oder das Problem woanders liegt. Falls insert-Fehler,
könnte man die Zeile nicht in ein "nicht importiert"-Reading stecken und mit dem Rest weitermachen?

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

DS_Starter

#636
Hallo Stephan,

habe in DbLog die Funktion die Dan hier benutzt jetzt gekapselt (auch wegen einer anderen Meldung bzgl. usercommand).
Ggenüber solchen fehlerhaften Sätzen ist die Funktion jetzt resistent. Fehlermitteilung kommt im Log, aber der Import von FilelogConvert bricht nicht mehr ab (wenn ich alles richtig gemacht habe).

V3.8.4 hier angehängt.

Grüße
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DeeSPe

Hallo Heiko,

mir ist heute früh FHEM "abgeraucht":
DBD::mysql::db selectrow_array failed: fetch() without execute() at ./FHEM/93_DbLog.pm line 817.

Das passierte beim Ausführen von:
set logdb userCommand delete from history where READING="state"

Hast Du eine Ahnung was dort passiert sein könnte?
FHEM ist aktuell.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DS_Starter

Hi Dan,

ja, das Statement war nicht korrekt, hat ein ";" gefehlt.
Die userCommand-Funktion war noch nicht mit eval gekapselt.
Habe ich jetzt mit der obigen V3.8.4 noch nachgeholt.
Setz die mal ein und wiederhole das SQL. Der Fehler erscheint dann im Reading, aber FHEM bleibt unberührt.

Grüße
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DeeSPe

Hab jetzt die Version von oben mal eingespielt und das "falsche" Kommando nochmal abgesetzt.
Jetzt ist nichts abgeschmiert.  ;)

Aber dann nochmal mit dem "richtigen" Kommando und es wird wieder ein Fehler geworfen:
ZitatuserCommand delete from history where READING="state"; 2018-02-07 21:07:56
userCommandResult DBD::mysql::db selectrow_array failed: fetch() without execute() at ./FHEM/93_DbLog.pm line 820. 2018-02-07 21:08:53

Ich hatte gehofft damit alle "state" Einträge in der DB zu löschen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DS_Starter

#640
was ist denn das für ein Date String ?

Zitatdelete from history where READING="state"; 2018-02-07 21:07:56

delete from history where READING="state";   wäre doch richtig

EDIT: selectrow_array wird verwendet... nimm DbRep für selektives löschen.

Grüße
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

abc2006

Hi,
ich habe einen Dummy, der mir die Leistung berechnet:

Internals:
   NAME       D_WMZ_Heizung_main
   NR         756
   STATE      4582 W
   TYPE       dummy
   Helper:
     DBLOG:
       power:
         logdb:
           TIME       1518707885.22366
           VALUE      4582 W
       work:
         logdb:
           TIME       1518707885.22366
           VALUE      12.73 Wh
   READINGS:
     2018-02-15 16:18:05   RL              25.75 °C
     2018-02-15 16:18:05   VL              29.25 °C
     2018-02-15 16:08:15   literproh       0.32 liter/h
     2018-02-15 16:18:05   literprosec     0.31 liter/s
     2018-02-15 16:18:05   power           4582 W
     2018-02-15 16:18:05   rate            16.3
     2018-02-15 16:18:05   work            12.73 Wh
Attributes:
   DbLogInclude power,work
   room       FHEM2FHEM,Heizung,_dummy
   stateFormat power
   userReadings VL {sprintf("%.2f °C",ReadingsNum("RE_TEMP_VorlaufHK","temperature",0))},
RL {sprintf("%.2f °C",ReadingsNum("RE_TEMP_RuecklaufHK","temperature",0))},
power:rate.* {sprintf("%.0f W",ReadingsNum($name,"rate",0)/52*3600*1.16*(ReadingsNum($name,"VL",0)-ReadingsNum($name,"RL",0)))},
work:rate.* {sprintf("%.2f Wh",ReadingsNum($name,"rate",0)/52*1.16*ReadingsAge($name,"work",0)*(ReadingsNum($name,"VL",0)-ReadingsNum($name,"RL",0)))},
literprosec:rate.* {sprintf("%.2f liter/s",ReadingsNum($name,"rate",0)/52)}


wie man sieht, wird die Arbeit (work) mit Value in das Reading geschrieben, so dass da "10.45 Wh" rauskommt. Ohne ists ziemlich kryptisch.
Leider erzeugt mir das Datenbankeinträge, bei denen Wh mit im Feld "Value" steht.
Wie kann ich das ändern?
so werden nämlich die Abfragen schwierig... ganz zu schweigen davon, dass ich nicht weiss, wie ichs reparieren soll... aber das werd ich schon noch schaffen ..
Grüße,
Stephan

FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

DS_Starter

Hallo Stephan,

reparieren kannst du es ganz einfach mit dem neuen DbRep Kommando changeValue.
Damit es erst garnicht so in der DB landet kannst du das Attribut valueFn in dblog verwenden.
Mach dir ein kleines Split wenn du dieses Device/Reading loggst.

LG
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

abc2006

Zitat von: DS_Starter am 15 Februar 2018, 16:32:08
Mach dir ein kleines Split wenn du dieses Device/Reading loggst.

Muss ich für jedes Device prüfen, ob die Werte richtig geloggt werden, und ggf ein "kleines Split" bauen?

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

DS_Starter

Ich verstehe die Frage nicht wirklich. Du prüfst ob VALUE eine Zahl und irgendwas ist, ob DEVICE dein Dummy ist und READING dein reading. Wenn es so ist splittest du VALUE auf und gibst die Zahl als VALUE und den Rest als UNIT zurück. Schau mal in die commandref dazu.
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter