addDbLog() -> DbLog.pm Fehlermeldung

Begonnen von Hackstall, 08 Mai 2021, 10:34:33

Vorheriges Thema - Nächstes Thema

Hackstall

Hallo,

ich würde gerne die unten aufgeführte Routine (hier aus dem Forum) verwenden um gezielt (zyklisch) Readings ins Log zu schreiben
und nicht immer bei Änderung.Hat sich in DbLog.pm irgendetwas geändert?

Leider erhalte ich im fhem.log immer folgende Fehlermeldung:

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.

2021.05.07 23:50:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: Table 'fhem.HISTORY' doesn't exist at ./FHEM/93_DbLog.pm line 1020.



###############################################################################
sub addDbLog($$) {
my ($dev,$reading) = @_;
my $dbLogDevice = 'DBLogging';
   
if ( $defs{$dev} ) {
if ( defined $defs{$dev}->{READINGS}->{$reading} ) {
my $sqlValues = "'".TimeNow()."','"
                            .$dev."','"
                            .uc($defs{$dev}->{TYPE})
                            ."','".(($reading eq 'state') ? '' : $reading.": ").$defs{$dev}->{READINGS}->{$reading}->{VAL}."','"
                            .$reading."','"
                            .$defs{$dev}->{READINGS}->{$reading}->{VAL}."',''";
CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO HISTORY VALUES ('.$sqlValues.');');
}else { Log 1, "addDbLog(): Reading '$reading' not found on device '$dev'"; }
}else { Log 1, "addDbLog(): Device '$dev' is not defined"; }
}

Hackstall

Vielleicht noch ein Hinweis:

Wenn ich

CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO HISTORY VALUES ('.$sqlValues.');');

folgendermassen ändere:
CommandSet(undef, $dbLogDevice.' userCommand INSERT INTO history VALUES ('.$sqlValues.');');

bekomme ich folgende Fehlermeldung:


2021.05.08 11:00:00 1: DbLog DBLogging: DBLog_Set - DBD::mysql::db selectrow_array failed: fetch() without execute() at ./FHEM/93_DbLog.pm line 1020.

DS_Starter

Moin,

nein, hat sich nichts geändert.
Die userCommand Implementierung ist rudimentär. Für manuelle Datenbankmanipilationen benutzt man besser DbRep.

Aber für deinen Fall brauchst du keine externen Subs. Benutze doch einfach das eingebaute Set-Kommando "addLog".

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

Hackstall

Hallo danke für die Auskunft aber das hatte ich ursprünglich erfüllt aber meine Anforderunge nicht:

So wie ich addLog verstehe passiert folgendes:
1) addLog initiiert einen Trigger Event um das per DbLogInclude eingeplante und per AddLog benannte Reading zu loggen. Den Trigger möchte ich nicht.
2) addLog funktioniert nur in Verbindung mit DBLogInclude Readings

Ich möchte eigentlich alles auf DBLogExcude .+ per Device stellen und dann nur zyklisch loggen.
Gibt es da ene andere Möglichkeit?

Danke Andreas

DS_Starter

Hallo Andreas,

Zitat
So wie ich addLog verstehe passiert folgendes:
1) addLog initiiert einen Trigger Event um das per DbLogInclude eingeplante und per AddLog benannte Reading zu loggen. Den Trigger möchte ich nicht.
2) addLog funktioniert nur in Verbindung mit DBLogInclude Readings

Das hast du komplett falsch verstanden. Auszug aus der Commandref:

set <name> addLog <devspec>:<Reading> [Value] [CN=<caller name>] [!useExcludes]

    Fügt einen zusätzlichen Logeintrag einer Device/Reading-Kombination in die Datenbank ein. Die eventuell im Attribut "DbLogExclude" spezifizierten Readings (im Quelldevice) werden nicht geloggt, es sei denn sie sind im Attribut "DbLogInclude" enthalten bzw. der addLog-Aufruf erfolgte mit der Option "!useExcludes".

        <devspec>:<Reading> - Das Device kann als Geräte-Spezifikation angegeben werden.
        Die Angabe von "Reading" wird als regulärer Ausdruck ausgewertet. Ist das Reading nicht vorhanden und der Wert "Value" angegeben, wird das Reading in die DB eingefügt wenn es kein regulärer Ausdruck und ein valider Readingname ist.
        Value - Optional kann "Value" für den Readingwert angegeben werden. Ist Value nicht angegeben, wird der aktuelle Wert des Readings in die DB eingefügt.
        CN=<caller name> - Mit dem Schlüssel "CN=" (Caller Name) kann dem addLog-Aufruf ein String, z.B. der Name des aufrufenden Devices (z.B. eines at- oder notify-Devices), mitgegeben werden. Mit Hilfe der im Attribut "valueFn" hinterlegten Funktion kann dieser Schlüssel über die Variable $CN ausgewertet werden. Dadurch ist es möglich, das Verhalten des addLogs abhängig von der aufrufenden Quelle zu beeinflussen.
        !useExcludes - Ein eventuell im Quell-Device gesetztes Attribut "DbLogExclude" wird von der Funktion berücksichtigt. Soll dieses Attribut nicht berücksichtigt werden, kann das Schüsselwort "!useExcludes" verwendet werden.

    Das Datenbankfeld "EVENT" wird automatisch mit "addLog" belegt.
    Es wird KEIN zusätzlicher Event im System erzeugt !

Das erfüllt alle deine Anforderungen soweit ich das sehe.

Ansonsten schlage ich dir vor, die SQL's  eigener Scripte mit DbRep "sqlCmd" auszuführen falls dir das AddLog im DbLog trotzdem nicht reichen sollte.

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