dblog Value enthält nicht nur Wert

Begonnen von MarkusEd, 26 Juni 2019, 19:13:52

Vorheriges Thema - Nächstes Thema

MarkusEd

Hallo,

meinen Strommesser CM160 logge ich in FHEM in die MariaDB. Leider werden die Werte für cumHour (eigentlich alle cum*) in der Spalte Value falsch (nicht nur der Zahlenwert) abgespeichert.
Warum ist das Reading "state" und nicht "cumHour" und Value sollte auch nur der Zahlenwert (0.4506) sein?

in der DB sieht das Ergebnis so aus:
TIMESTAMP DEVICE TYPE          EVENT                         READING             VALUE                    UNIT
26.06.2019 15:00 CM160 CM160 W: 412.09                     W               412.09
26.06.2019 15:00 CM160 CM160 W: 426.3                     W               426.3
26.06.2019 15:00 CM160 CM160 cumHour 0.4506 kWh          state            cumHour 0.4506 kWh
26.06.2019 14:58 CM160 CM160 W: 412.09                     W               412.09


hier die Raw Definition des Devices:
defmod CM160 CM160 /dev/serial/by-id/usb-Silicon_Labs_OWL_Wireless_Electricity_Monitor_USB_version_is_connected_00CAA07E-if00-port0
attr CM160 DbLogInclude W,cumDay,cumHour,cumMonth,cumYear,MODE
attr CM160 event-on-change-reading W,Watt,cumDay,cumHour,cumMonth,lastcumYear

setstate CM160 W: 568.4
setstate CM160 2019-06-26 16:14:46 CumStd 0.0532 kWh
setstate CM160 2019-06-26 18:51:49 W 568.4
setstate CM160 2019-06-26 16:14:46 Watt 198.94
setstate CM160 2019-06-26 18:51:49 cumDay 7.3703 kWh
setstate CM160 2019-06-26 18:51:49 cumHour 0.5045 kWh


im Device in den Readings sieht alles normal aus:
W       568.4  2019-06-26 19:04:13
cumDay  7.4781 kWh  2019-06-26 19:03:13
cumHour  0.0330 kWh  2019-06-26 19:03:13

Wie baue ich das um, also ich möchte im Reading "cumHour" und in Value nur den Zahlenwert?
Danke für den Schups in die richtige Richtung.

DS_Starter

Guten Abend,

das grundlegende Problem hierbei ist, dass es sich hierbei um das Reading "state" handelt, was im Normalfall nicht als Name mitgeliefert wird.
Wäre es das Reading "cumHour" , würde dort hinter dem Reading ein ":" stehen wie es beim Reading "W:" ist, also zum Beispiel  "cumHour: 0.4506 kWh".

Du könntest versuchen im DbLog das Attribut "addStateEvent = 0" zu setzen. Vergleiche dazu die Commandref.
Leider ist das List vom DbLog Device nicht dabei. Aber versuche es zunächst wie beschrieben.

Grüße,
Heiko
ESXi@NUC+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

MarkusEd

Danke, leider löst das mein Problem nicht aber es hat mich in die richtige Richtung geführt. Der Doppelpunkt machts!

im CM160.pm ist der Fehler. sub CM160_processCumValues($) {
        my ($hash) = @_;
        my $name =      $hash->{NAME};

        my %eventsCum = (
                'cumHour'       => 'h',
                'cumDay'        => 'd',
                'cumMonth'      => 'm',
                'cumYear'       => 'y',
        );

        # fetch last power value and actual time of new readings
        my @lastw = split(' ', $hash->{READINGS}{lastW}{VAL});
        my $timeNow = $hash->{READINGS}{lastW}{TIME};
        my @timeNowArray = split('[ :-]', $timeNow);


        # fetch timestamp of last cum values (all cum readings has the same time)
        my $lastCumTime = $hash->{READINGS}{'cumHour'}{TIME};
        my @lastCumTimeArray = split('[ :-]', $lastCumTime);

        # calculate time since last cum calculation
        my $diffTime = str2time($timeNow) - str2time($lastCumTime);

        #calculate consumed energy, assume what since the last received value the power until the new value was constant
        my $consEnergy = (($diffTime) * ($lastw[0])) / (60*60*1000);

        # add new consumption to all cum values
        foreach my $cumKey (keys %eventsCum) {
                # set value and time to default if reading not actual defined
                $hash->{READINGS}{$cumKey}{VAL} = '0.0000 kWh' if (!defined($hash->{READINGS}{$cumKey}{VAL}));
                $hash->{READINGS}{$cumKey}{TIME} = $timeNow if (!defined($hash->{READINGS}{$cumKey}{TIME}));

                # fetch value of last cum reading
                my @cumVals = split(' ', $hash->{READINGS}{$cumKey}{VAL});
                my $actCumVal = $cumVals[0];

                my $timeIdx = 0;        # Default for year
                if ($eventsCum{$cumKey} eq 'h') {
                        $timeIdx = 3;
                } elsif ($eventsCum{$cumKey} eq 'd') {
                        $timeIdx = 2;
                } elsif ($eventsCum{$cumKey} eq 'm') {
                        $timeIdx = 1;
                }

                # reset value if time range has changed, write to 'last' reading
                if ($lastCumTimeArray[$timeIdx] ne $timeNowArray[$timeIdx]) {
                        $hash->{CHANGED}[0] = $cumKey . ': ' . $hash->{READINGS}{$cumKey}{VAL};
                        DoTrigger($hash->{NAME}, undef);

                        my $lastcumReading = 'last' . $cumKey;
                        $hash->{READINGS}{$lastcumReading}{TIME} = $timeNow;
                        $hash->{READINGS}{$lastcumReading}{VAL} = sprintf('%.4f %s', $actCumVal, 'kWh');

                        $actCumVal = 0;
                }

                my $nextCumVal = $actCumVal + $consEnergy;

                $hash->{READINGS}{$cumKey}{TIME} = $timeNow;
                $hash->{READINGS}{$cumKey}{VAL} = sprintf('%.4f %s', $nextCumVal, 'kWh');

        }
}
Wenn icht die %eventsCUM um den Doppelpunkt erweitere my %eventsCum = (
                'cumHour:'      => 'h',
                'cumDay'        => 'd',
                'cumMonth'      => 'm',
                'cumYear'       => 'y',
   
oder auch wenn ich unten beim Schreiben des Werts einen ":" einfüge # reset value if time range has changed, write to 'last' reading
                if ($lastCumTimeArray[$timeIdx] ne $timeNowArray[$timeIdx]) {
                        $hash->{CHANGED}[0] = $cumKey . ': ' . $hash->{READINGS}{$cumKey}{VAL};
                        DoTrigger($hash->{NAME}, undef);

$hash->{CHANGED}[0] = $cumKey . ': '
bekomme ich zwar den richtigen Reading/Value Eintrag. Leider funktioniert die Routine zur Erkennung der @lastCumTimeArray nicht mehr richtig (wahrscheinlich der split) weil dort jetzt der Doppelpunkt im alt-Wert jetzt stört. # fetch timestamp of last cum values (all cum readings has the same time)
        my $lastCumTime = $hash->{READINGS}{'cumHour'}{TIME};
        my @lastCumTimeArray = split('[ :-]', $lastCumTime);

Der Split müsste erst auf den zweiten Doppelpunkt splitten, hier fehlt mir aber das Wissen wie ich sowas machen könnte.

Wenn man mir sagt ob und wie ich den Entwickler des Moduls  CM160 selbst kontaktieren kann.....würde ich auch gerne diesen Weg gehen.

DS_Starter

Also das Modul CM160 sagt mir persönlich jetzt auch nichts, aber den Entwickler anzusprechen wäre der richtige Weg.
In der offiziellen FHEM-Auslieferung ist das Modul auch nicht enthalten wenn ich nichts übersehen habe.
Vielleicht erinnerst du dich noch woher du es bezogen hast und schaust mal in diese Richtung.

Grüße,
Heiko
ESXi@NUC+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

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MarkusEd

Habe es letztendlich hinbekommen.

Die Einträge in der DB sind jetzt sauber. d.h. die Readings beinhalten cumHour und cumDay und Value nur noch den Wert.

Naja, da das Modul anscheinend seit 2012 praktisch nicht mehr weiterentwickelt worden ist, werde ich hier meine Version anhängen. Vielleicht verwendet ja jemand die OWL USB noch zur Strommessung und kann was davon brauchen.

Danke dass Ihr mich in die richtige Richtung geschoben habt.

CIAO Markus