Zeitserie in die Datenbank schreiben: Wie?

Begonnen von tomleitner, 15 September 2020, 17:00:06

Vorheriges Thema - Nächstes Thema

tomleitner

Hallo,

Ich habe einen Stromprovider der stundengenau abrechnet und mir am Ende des Monats genau verrechnet was ich in der jeweiligen Stunde zum jeweilig gültigen Preis verbraucht habe.

Vom Provider bekomme ich den Strompreis für jede Stunde für den nächsten Tag via API zur Verfügung gestellt. Ich würde nun gerne den Preis plotten zusammen mit meinem Verbrauch in einem Diagramm. Dazu würde ich die Daten vom nächsten Tag abholen und IRGENDWIE (??) in die Datenbank (Postgresql im Einsatz hier) schreiben wollen um sie über einen normalen Plot benutzen zu können. Natürlich nicht die Strompreise von morgen aber die von heute (die Strompreise von morgen sind ja morgen die von heute! :).

Ein Weg wäre ein externes Script das einfach in die "History" Tabelle schreibt. Scheint mir aber etwas viel Aufwand. Gibt es einen einfacheren Weg?  Kann ich das über fhem irgendwie erledigen?  Im Prinzip will ich eine Zeitserie in die Datenbank schreiben ...

Danke // Tom

P.S: Hier ein Datensatz für die Strompreise. Ich habe kein Problem das via Bash Script zu parsen ... aber was ist der beste Weg das in die DbLog zu kriegen?

{
  "object": "list",
  "data": [
    {
      "start_timestamp": 1600178400000,
      "end_timestamp": 1600182000000,
      "marketprice": 70.01,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600182000000,
      "end_timestamp": 1600185600000,
      "marketprice": 82.71,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600185600000,
      "end_timestamp": 1600189200000,
      "marketprice": 130.59,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600189200000,
      "end_timestamp": 1600192800000,
      "marketprice": 189.25,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600192800000,
      "end_timestamp": 1600196400000,
      "marketprice": 148.18,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600196400000,
      "end_timestamp": 1600200000000,
      "marketprice": 77.68,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600200000000,
      "end_timestamp": 1600203600000,
      "marketprice": 63.44,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600203600000,
      "end_timestamp": 1600207200000,
      "marketprice": 51.51,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600207200000,
      "end_timestamp": 1600210800000,
      "marketprice": 50.12,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600210800000,
      "end_timestamp": 1600214400000,
      "marketprice": 46.3,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600214400000,
      "end_timestamp": 1600218000000,
      "marketprice": 45.1,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600218000000,
      "end_timestamp": 1600221600000,
      "marketprice": 43.12,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600221600000,
      "end_timestamp": 1600225200000,
      "marketprice": 44,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600225200000,
      "end_timestamp": 1600228800000,
      "marketprice": 46.35,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600228800000,
      "end_timestamp": 1600232400000,
      "marketprice": 59.98,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600232400000,
      "end_timestamp": 1600236000000,
      "marketprice": 76.39,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600236000000,
      "end_timestamp": 1600239600000,
      "marketprice": 86.53,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600239600000,
      "end_timestamp": 1600243200000,
      "marketprice": 75,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600243200000,
      "end_timestamp": 1600246800000,
      "marketprice": 63.84,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600246800000,
      "end_timestamp": 1600250400000,
      "marketprice": 57.77,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600250400000,
      "end_timestamp": 1600254000000,
      "marketprice": 51.14,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600254000000,
      "end_timestamp": 1600257600000,
      "marketprice": 51.9,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600257600000,
      "end_timestamp": 1600261200000,
      "marketprice": 53.91,
      "unit": "Eur/MWh"
    },
    {
      "start_timestamp": 1600261200000,
      "end_timestamp": 1600264800000,
      "marketprice": 54,
      "unit": "Eur/MWh"
    }
  ],
  "url": "/at/v1/marketdata"


tomleitner

.... bin grade auf den DbLog Befehl "set ... addCacheLine" gestoßen. Hier kann man einen Zeitstempel angeben .. .den werde ich benutzen ...


ch.eick

Moin,
na das nenne ich mal Glück...
Ich habe sowas für meinen PV-Forecast bereits gemacht

in einer Funktion in der 99_myUtils.pm können solche Beispielzeilen verwendet werden. Das ist kein fertiger Code!

# Für welche Zeit soll der Eintrag erzeugt werden
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1;
my $timestring = time_str2num($year."-".$mon."-".$mday." 07:00:00") ;                        # initialisiert für 7 Uhr

$fc    0 = heute, 1 = morgen, 2 = übermorgen, ....
$timestring = time_str2num($year."-".$mon."-".$mday." ".$i.":00:00") ;   # in einer for Schleife z.B. mit $i die Stunden weiter zählen
my $timestamp  = POSIX::strftime("%Y-%m-%d %H:00:00",localtime($timestring+$fc*24*60*60)) ;  # hier wird der Tag verschoben

# Das fügt eine Zeile in die Datenbank ein
                   Funktion
$logdb              Datenbank Devices
$logdevice         für welches Device
$reading            welches reading
$logentry           und den Wert

fhem "set ".$logdb." addCacheLine ".$timestamp."|".$logdevice."|addlog|".$reading.": ".$logentry."|".$reading."|".$logentry."|";

######### Hier bitte Vorsichtig sein, das SQL sollte getestet sein!!!! ################
# Bei Forecast zuerst die bisherigen Einträge in der Datenbank für den Tag löschen
fhem "set ".$logdbrep." sqlCmd DELETE FROM history WHERE DEVICE='".$logdevice."' AND READING='".$reading."' AND TIMESTAMP>='".$timestamp."'" ;


Es werden somit zwei DbLog devices benötigt.
- Das Basis Device, was die Datenbank Verbindung herstellt
- Das Device, was ein "sqlCmd" mit Delete Erlaubnis ausführen darf, wenn man auch aufräumen möchte.

Gruß
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

tomleitner

Genial. Super. Danke Dir. Werde das entsprechend abändern und testen.

:) :)

Tom

ch.eick

Zitat von: tomleitner am 15 September 2020, 18:46:18
Genial. Super. Danke Dir. Werde das entsprechend abändern und testen.

:) :)

Tom
Gerne, das spart eine Woche Arbeit ;-)
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

DS_Starter

Kleiner Korrekturhinweis ...

Es werden somit zwei DbLog devices benötigt.
- Das Basis Device, was die Datenbank Verbindung herstellt
- Das Device, was ein "sqlCmd" mit Delete Erlaubnis ausführen darf, wenn man auch aufräumen möchte.

Das letztere ist ein DbRep und kein DbLog Device.  ;)

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

ch.eick

Zitat von: DS_Starter am 15 September 2020, 20:07:23
Kleiner Korrekturhinweis ...

Es werden somit zwei DbLog devices benötigt.
- Das Basis Device, was die Datenbank Verbindung herstellt
- Das Device, was ein "sqlCmd" mit Delete Erlaubnis ausführen darf, wenn man auch aufräumen möchte.

Das letztere ist ein DbRep und kein DbLog Device.  ;)
Da hast Du mich mal wieder erwischt :-) Du findest meine Fehler aber auch in allen Threads....
Viele Grüße
      Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick