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"
.... bin grade auf den DbLog Befehl "set ... addCacheLine" gestoßen. Hier kann man einen Zeitstempel angeben .. .den werde ich benutzen ...
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
Genial. Super. Danke Dir. Werde das entsprechend abändern und testen.
:) :)
Tom
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 ;-)
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
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