readings und Events mit datum in der Vergangenheit?

Begonnen von erwin, 03 April 2014, 12:44:31

Vorheriges Thema - Nächstes Thema

erwin

Liebe FHEM Developer!

ich entwickle gerade ein Modul für einen Stromzähler, der von den bisherigen Modulen nicht unterstützt ist. Die Schnittstelle ist über USB ein bidir. IR-Kopf von volkszähler.org.
Die Antwort vom Stromzähler ist ein relativ großer acsii-string (leider), den ich parse. Darin enthalten sind u.a. jede Menge "historische" Werte (z.b. monatsverbrauch der letzten xx Monate, Spitzenverbrauch/Monat, usw... jeweils mit Timestamp.

Anforderung: die "historischen Werte sollen sowohl in den readings, als auch der SQL-datenbank mit dem jeweils "historischen" datum geloggt werden.
Ich hab das durch intensives studieren von readingsUpdate, addevent,.... hinbekommen, das alles bestens funktioniert.
Ich möchte dennoch den code hier zur Diskussion stellen, evtl. gibts ja eine Lösung die die Anforderung "sauberer" erfüllt. Hier der Teil aus der parse Routine:

    my @logarray;
    $hash->{CHANGED} = ();
    $hash->{CHANGETIME} = ();

        @logarray = ISKRAmeter_GetSerialDataParse2($hash, $buf); # returns line by line, values separated by |
        foreach (@logarray) {
            my ($reading, $value, $oldts) = split(/\|/, $_);

            if (defined($oldts)) {
                my $oldtsF = FmtDateTime($oldts);
                if (ReadingsVal($name,$reading,"") ne $value) { # we have an oldtimestamp and need to update
                    setReadingsVal($hash, $reading, $value, $oldtsF);
                    ## mimic addevent + Timestamp setting
                    push(@{$hash->{CHANGED}}, "$reading: $value");   # this is the function of addEvevnt
                    push(@{$hash->{CHANGETIME}}, $oldtsF);   # set old timestamp
                }
                next; # no update necessary

            } else {  # normal update process
                readingsSingleUpdate($hash,$reading,$value,1);
                $hash->{CHANGED} = (); # need to reset here, else everything gets confused...
                $hash->{CHANGETIME} = ();
            }
        } # foreach (@logarray)
        readingsSingleUpdate($hash,"state","valid",1);
        $hash->{CHANGED} = (); # need to reset here, else everything gets confused...
        $hash->{CHANGETIME} = ();
#???            DoTrigger($hash->{NAME}, undef) if ($init_done);

    return undef; #????


l.g. und Danke
erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

justme1968

readings mit altem timestamp erzeugen ist leider etwas problematisch und geht mit dblog z.b. überhaupt nicht wirklich.

schau mal ins withings und netatmo modul. da siehst du wie ich es da gelöst habe.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

erwin

Hi Andre,
danke für den Hinweis, die Module schau ich mir an.

Mit dem geposteten code funktioniert DbLog (mySQL), ich bin mir nur nicht sicher ob das evtl. "Nebeneffekte" hat.

l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

rudolfkoenig

Wenn das mit FileLog auch nicht klappt, wuerde ich es naeher anschauen.
Eigentlich muesste CHANGETIME aber auch mit DbLog funktionieren.

Events mit CHANGETIME muessen bei einem FilLog einen monoton wachsenden Zeitstempel haben. Bei DbLog sollte das kein Problem sein.

betateilchen

Zitat von: rudolfkoenig am 03 April 2014, 14:40:42Bei DbLog sollte das kein Problem sein.

sehe ich auch so, weil dort ein Index auf dem Timestamp Feld liegt, wenn ich mich recht erinnere.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

ja. dblog macht keine probleme.

bei filelog ist je nach datenquelle genau das monoton wachsend das problem. wenn die historischen readings nicht in einem rutsch kommen und so auf einen schlag sortiert werden können geht es gar nicht oder nur mit einschränkungen.

die whitings und netatmo module können z.b. nicht aus mehreren devices ins gleiche file loggen weil es keine (vernünftige) möglichkeit gibt die readings device übergreifend passend zu sortieren.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

erwin

Danke Andre,

Das Problem mit dem monoton ansteigenden datum kann ich lösen (durch filltern/sortieren), solange ich nicht mehr als ein Device in einem FileLog habe. Ein kleines Problem gibts, falls jemand ein device löscht und mit gleichem namen wieder anlegt....., aber Geisterfahrten kann man ja auch nicht wirklich verhindern  ;D

Ich verwende ohnehin DbLog, und da sollte das kein Problem sein.

danke für die Tip's
erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...