FHEM Forum

FHEM - Energiemanagement und Energieerzeugung => Verbrauchsmessung => Thema gestartet von: hyper2910 am 20 November 2022, 10:27:31

Titel: Tibber & Tibber Pulse
Beitrag von: hyper2910 am 20 November 2022, 10:27:31
Hallo zusammen,

Bei dem Stromanbieter Tibber gibt eine API um z.b. Strompreise, Verbrauch etc. abzufragen.  Das ganze geht per Graphql.

Irgendwie verstehe ich das ganze nicht.

Unter https://developer.tibber.com/ Kann man Demodaten abrufen und das Query generieren.

Nur bekomme ich das ganze nicht hin.

Ich würde gerne die Realtimesubscription als Reading haben.

Könnte mir jemand helfen?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 21 November 2022, 21:23:45
Schade das keiner der Programmierer ein Modul dafür macht. Openhab, in roter oder homebridge bieten schon was
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 12 Dezember 2022, 12:21:07
Zitat von: hyper2910 am 21 November 2022, 21:23:45
Schade das keiner der Programmierer ein Modul dafür macht. Openhab, in roter oder homebridge bieten schon was
Hallo

Wenn Du ein Login hast könntest Du das über die API mit HTTPMOD in FHEM einbinden.
Es muss nicht immer ein Modul sein.
Bei aWATTar wird es ebenfalls mit HTTPMOD abgefragt.

VG   Christian

EDIT:
Ich habe jetzt mal einen Versuch über das Developer Portal gestartet, jedoch fehlt mit da eine gültige homeid
Das ganze wurde hier ja schon mal bearbeitet. (https://forum.fhem.de/index.php/topic,117104.0.html)


httpbody
{"errors":[{"message":"Home with id \"c70dcbe5-4485-4821-933d-a8a86452737b\" does not exist or does not have matching owner or grid contract owner dcc2355e-6f55-45c2-beb9-274241fe450c.","locations":[{"line":1,"column":10}],"path":["viewer","home"],"extensions":{"code":"HOME_NOT_FOUND"}}],"data":null}


Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 12 Dezember 2022, 22:51:59
Hi,   

Die Preise bekomme ich, aber die Tibber Pulse Daten einfach nicht.

Über die API kannst du ja Demo Daten abfragen

https://developer.tibber.com/explorer

Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 13 Dezember 2022, 10:48:19
Zitat von: hyper2910 am 12 Dezember 2022, 22:51:59
Die Preise bekomme ich, aber die Tibber Pulse Daten einfach nicht.
Über die API kannst du ja Demo Daten abfragen
https://developer.tibber.com/explorer
Genau da fehlt mir die homeid, das Token kann man generieren.

Stellst Du mal bitte Deine Definition hier rein? Natürlich das Token und die homeid ausblenden!
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 15 Dezember 2022, 07:33:37
Hi,

Die HomeID kann auch ausgelesen werden


Demo Token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
homeId:"96a14971-525a-4420-aae9-e5aedaa129ff"

subscription{
  liveMeasurement(homeId:"96a14971-525a-4420-aae9-e5aedaa129ff"){
    timestamp
    power
    accumulatedConsumption
    accumulatedCost
    currency
    minPower
    averagePower
    maxPower
  }
}


Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 Dezember 2022, 12:16:32
Zitat von: hyper2910 am 15 Dezember 2022, 07:33:37
Die HomeID kann auch ausgelesen werden
Ich habe ja keinen Account bei Tibber, wo kann ich die homeid für den Testzugang auslesen?

{"errors":[{"message":"Home with id \"96a14971-525a-4420-aae9-e5aedaa129ffb\" does not exist or does not have matching owner or grid contract owner dcc2355e-6f55-45c2-beb9-274241fe450c.","locations":[{"line":1,"column":10}],"path":["viewer","home"],"extensions":{"code":"HOME_NOT_FOUND"}}],"data":null}

Schickst Du mir noch die FHEM Device definition?

EDIT: Durch copy/past hatte ich am Ende der HomeID noch ein "b" zuviel, jetzt kommt auch eine Antwort :-)


{"data":{"viewer":{"home":{"currentSubscription":{"priceInfo":{"current":{"total":5.6907,"energy":4.4651,"tax":1.2256,"startsAt":"2022-12-15T12:00:00.000+01:00"}}}}}}}
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 Dezember 2022, 13:05:11
Mir ist der Syntax zwischen der Web page und dem Aufruf der API noch nicht wirklich klar.

{ "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }

EDIT: In der API Dokumentation findet man dazu auch etwas, womit die Syntax Frage geklärt wäre.

{
  viewer {
    homes {          <<<<< hier ist nur ein "homes", oben jedoch ein "home" mit der id Angabe.
      currentSubscription{
        priceInfo{
< snip >
            tax
            startsAt
          }
        }
      }
    }
  }
}


EDIT: Wenn man den Syntax angepasst überträgt kommt auch eine Rückmeldung, die jedoch Umfangreicher ist als im WEB Interface

{ "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo{current {total energy tax startsAt} today {total energy tax startsAt} tomorrow {total energy tax startsAt}}}}}}" }


{"data":{"viewer":{"home":{"currentSubscription":{"priceInfo":{"current":{"total":5.5049,"energy":4.3164,"tax":1.1885,"startsAt":"2022-12-15T13:00:00.000+01:00"},"today":[{"total":4.1914,"energy":3.2656,"tax":0.9258,"startsAt":"2022-12-15T00:00:00.000+01:00"},{"total":4.0654,"energy":3.1648,"tax":0.9006,"startsAt":"2022-12-15T01:00:00.000+01:00"},{"total":3.9119,"energy":3.042,"tax":0.8699,"startsAt":"2022-12-15T02:00:00.000+01:00"},{"total":3.7858,"energy":2.9411,"tax":0.8447,"startsAt":"2022-12-15T03:00:00.000+01:00"},
< snip >
{"total":6.095,"energy":4.7885,"tax":1.3065,"startsAt":"2022-12-15T20:00:00.000+01:00"},{"total":5.1129,"energy":4.0028,"tax":1.1101,"startsAt":"2022-12-15T21:00:00.000+01:00"},{"total":4.6942,"energy":3.6678,"tax":1.0264,"startsAt":"2022-12-15T22:00:00.000+01:00"},{"total":4.2648,"energy":3.3243,"tax":0.9405,"startsAt":"2022-12-15T23:00:00.000+01:00"}],"tomorrow":[{"total":4.1461,"energy":3.2294,"tax":0.9167,"startsAt":"2022-12-16T00:00:00.000+01:00"},{"total":4.0346,"energy":3.1402,"tax":0.8944,"startsAt":"2022-12-16T01:00:00.000+01:00"},{"total":3.9266,"energy":3.0538,"tax":0.8728,"startsAt":"2022-12-16T02:00:00.000+01:00"},{"total":3.7923,"energy":2.9463,"tax":0.846,"startsAt":"2022-12-16T03:00:00.000+01:00"},
< snip >
{"total":6.629,"energy":5.2157,"tax":1.4133,"startsAt":"2022-12-16T16:00:00.000+01:00"},{"total":6.9894,"energy":5.504,"tax":1.4854,"startsAt":"2022-12-16T17:00:00.000+01:00"},{"total":6.7873,"energy":5.3424,"tax":1.4449,"startsAt":"2022-12-16T18:00:00.000+01:00"},{"total":6.4826,"energy":5.0986,"tax":1.384,"startsAt":"2022-12-16T19:00:00.000+01:00"},{"total":5.3034,"energy":4.1552,"tax":1.1482,"startsAt":"2022-12-16T20:00:00.000+01:00"},{"total":4.6654,"energy":3.6448,"tax":1.0206,"startsAt":"2022-12-16T21:00:00.000+01:00"},{"total":4.1786,"energy":3.2554,"tax":0.9232,"startsAt":"2022-12-16T22:00:00.000+01:00"},{"total":3.802,"energy":2.9541,"tax":0.8479,"startsAt":"2022-12-16T23:00:00.000+01:00"}]}}}}}}

Das geht dann soweit...
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 Dezember 2022, 14:35:09
Zitat von: hyper2910 am 20 November 2022, 10:27:31
Nur bekomme ich das ganze nicht hin.

Ich würde gerne die Realtimesubscription als Reading haben.
Alle Daten, bis auf die Realtimesubscription werden per HTTPMod abgefragt. Das funktioniert auch soweit.
Wenn Du jedoch live Daten haben möchtest, geht das nur über einen web socket, über den man dann die Daten Streamen kann.
Auf der Developer Seite läuft Java, was den web socket offen hält und darüber die Live Daten anzeigt. Das geht so mit der HTTP API nicht.
Zitat
Subscribing to data with websockets

While queries and mutations are typically handled over HTTP some data are better suited to handled as streams over a persistent connection (web socket). Subscriptions follows the same semantics as queries and mutations - the shape of what is returned/sent from the server is determined by the client when invoking the api:

subscription{
  liveMeasurement(homeId:"96a14971-525a-4420-aae9-e5aedaa129ff") {
    timestamp
    power
    maxPower
  }
}

Since subscriptions are handled over web sockets they can be a bit more challenging to handle from the client's perspective. Many GraphQL client libraries provide good abstractions for this though. Note that the maximum number of open websockets is limited to two.

Jetzt ist die Frage, warum möchtest Du zuerst die Daten zu Tibber senden, was über den Zähler läuft und sie dann anschließend live über das Internet bei Tibber wieder streamen lassen.
Es wäre besser und auch schneller das direkt lokal über ein Smart Meter zu machen, wie es von Wechselrichtern verwendet wird.
Sollte ansonsten mal die Internetverbindung weg sein, würde eine Eigenverbrauchssteuerung zu dem Zeitpunkt keine Werte mehr bekommen.

Für eine tarifliche Steuerung reichen eigentlich die Preise pro Stunde aus, nach denen Du dann die Verbraucher ein/aus schaltest.

Bei der API habe ich nun diese Abfragen identifiziert, die man auch miteinander kombinieren kann, also z.B. nur address oder auch address mit owner zusammen.

{ "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}" }


{ "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt} today {total energy tax startsAt} tomorrow {total energy tax startsAt}}}}}}" }
{ "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt}}}}}}" }

{ "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }


VG  Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: haneub am 02 Februar 2023, 20:21:07
Hallo,
ich verwende im Moment einen eigenen USB IR-Kopf um meinen Stromzähler ca alle 30s auszulesen und damit die Leistung der go-e Wallbox an die Photovoltaikleistung anzupassen.
Funktioniert subba.
Nun möchte ich zu Tibber wechseln um in den energiereichen Zeiten im Winter auch zu laden. Bei Tibber wird der Tibber Kopf aber an die Stelle gesetzt, wo jetzt mein IR Lesekopf ist.

Wie bekomme ich die aktuelle Leistung alle ca. 30s in fhem wenn ein Tibber Pulse installiert ist?

Im Demo Modus von https://developer.tibber.com/explorer sehe ich einen ca. sekündlich aktualisierten "power" Wert. Kann ich den alle 30s bekommen?
Wie? Gibts ein fhem tibber modul?

Herzlichen Dank, Harald
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 02 Februar 2023, 20:25:14
Das hätte ich auch gerne. Habe es aber noch nicht geschafft
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 02 Februar 2023, 20:41:12
Um den Tibber Pulse nutze ich NodeRed und die offiziellen Tibber  +Nodes. Die Daten sende ich einfach per MQTT an FHEM. Aus Erfahrung aber würde ich den Pulse nicht für eine Regelung nutzen, denn Abbrüche kommen gelegentlich vor. Das ist eher nur zum "gucken" und tracken gedacht. Wer sicher ein Wert für eine Regelung benötigt, sollte sich lieber ein Smart Meter einbauen und das dann per Modbus abfragen.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 02 Februar 2023, 20:48:06
 Kannst du erklären wie,du das mit NodeRed machst?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 02 Februar 2023, 20:52:01
Zitat von: hyper2910 am 02 Februar 2023, 20:48:06
Kannst du erklären wie,du das mit NodeRed machst?

Wie NodeRed funktioniert kann man über diverse Tutorials in Erfahrung bringen.
Für Tibber nimmst du dann das hier:
https://github.com/bisand/node-red-contrib-tibber-api
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: haneub am 05 Februar 2023, 10:39:39
Zitat von: xerion am 02 Februar 2023, 20:41:12
Um den Tibber Pulse nutze ich NodeRed und die offiziellen Tibber  +Nodes. Die Daten sende ich einfach per MQTT an FHEM. Aus Erfahrung aber würde ich den Pulse nicht für eine Regelung nutzen, denn Abbrüche kommen gelegentlich vor. Das ist eher nur zum "gucken" und tracken gedacht. Wer sicher ein Wert für eine Regelung benötigt, sollte sich lieber ein Smart Meter einbauen und das dann per Modbus abfragen.
Herzlichen Dank, werde ich dann probieren. Wie viele / häufig sind die Abbrüche? Wenns nur ab und zu nicht geht wäre das egal (ist ja nur ein optimieren der Auto-Ladung anhand des Überschusses) Wenns mal nicht klappt ist das nicht sehr schlimm. Wird dann halt entweder a weng zu viel oder zu wenig vom Netz bezogen.
Aber erst mal herzlichen Dank!
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: hyper2910 am 05 Februar 2023, 10:41:47
Über nodered läuft das ganze, mittlerweile sauber.


Leider bekomme ich die Daten nicht in die OpenWB.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 05 Februar 2023, 11:29:12
Zitat von: haneub am 05 Februar 2023, 10:39:39
Herzlichen Dank, werde ich dann probieren. Wie viele / häufig sind die Abbrüche? Wenns nur ab und zu nicht geht wäre das egal (ist ja nur ein optimieren der Auto-Ladung anhand des Überschusses) Wenns mal nicht klappt ist das nicht sehr schlimm. Wird dann halt entweder a weng zu viel oder zu wenig vom Netz bezogen.
Aber erst mal herzlichen Dank!

Ich bin seit 01.01.23 bei Tibber und habe es schon 4 Mal gehabt. Leider auch immer dann Nachts wenn der Strom günstig war und somit die Abrechnung dann nicht dynamisch lief.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 05 Februar 2023, 11:30:09
Zitat von: hyper2910 am 05 Februar 2023, 10:41:47
Über nodered läuft das ganze, mittlerweile sauber.


Leider bekomme ich die Daten nicht in die OpenWB.
Bei openWB hilft auch das Forum und der Support per Mail.
Wo besteht den da das Problem? Kannst Du es beschreiben?
VG Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 05 Februar 2023, 11:30:14
Zitat von: hyper2910 am 05 Februar 2023, 10:41:47
Über nodered läuft das ganze, mittlerweile sauber.


Leider bekomme ich die Daten nicht in die OpenWB.

Dann teile doch mal mit was du versucht hast damit wir nicht raten brauchen. ;-)
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: TimoD am 20 Februar 2023, 10:02:11
Zitat von: xerion am 02 Februar 2023, 20:41:12
Um den Tibber Pulse nutze ich NodeRed und die offiziellen Tibber  +Nodes. Die Daten sende ich einfach per MQTT an FHEM. Aus Erfahrung aber würde ich den Pulse nicht für eine Regelung nutzen, denn Abbrüche kommen gelegentlich vor. Das ist eher nur zum "gucken" und tracken gedacht. Wer sicher ein Wert für eine Regelung benötigt, sollte sich lieber ein Smart Meter einbauen und das dann per Modbus abfragen.

Hallo xerion,

hast du node-red-contrib-tibber-api um mqtt ergänzt? Sehe kein MQTT in der Konfiguration.

@all Ich bräuchte eigentlich nur die Daten des stündlichen Forecasts zum Strompreis in FHEM. Meine Verbraucher lese ich über meine PV Anlage direkt aus. Gibt es hier die Möglichkeit zur "einfachen" Abfrage durch einen HTTP Post? Steige bei der Ami Dokumentation nicht ganz durch. Über einen Tipp wie ich das Mache würde ich mich sehr freuen :-)

Grüße Timo
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 Februar 2023, 10:15:09
Zitat von: TimoD am 20 Februar 2023, 10:02:11
@all Ich bräuchte eigentlich nur die Daten des stündlichen Forecasts zum Strompreis in FHEM. Meine Verbraucher lese ich über meine PV Anlage direkt aus. Gibt es hier die Möglichkeit zur "einfachen" Abfrage durch einen HTTP Post? Steige bei der Ami Dokumentation nicht ganz durch. Über einen Tipp wie ich das Mache würde ich mich sehr freuen :-)
Hallo Timo,
das hatte ich schon mal geschrieben. Die Tibber Momentanwerte werden wohl über eine Java Session übertragen, für das es im HTTPMOD keine Implementierung gibt.
Node-Red ist da moderner und unterstützt das im Workflow. Somit hält Node-Red die Session und es wird dann mit MQTT zu FHEM weiter geleitet.
Da ich jedoch noch kein Tibber habe kann ich das nicht testen.

@all Ich wäre sehr an aktuellen Preisen, am besten aus dem Raum Rhein Main, interessiert. Wenn ich mir die aWATTar Preise inklusive der Basis Kosten für meinen Netzbetreiber
anschaue, dann komme ich bisher noch nicht unter den Grundversorger. Jedoch rechne ich mit baldiger Preiserhöhung und möchte vorbereitet sein. Tibber gibt mir jedoch erst
nach dem Vertragsabschluss die Netzbetreiber Kosten :-(

VG Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 20 Februar 2023, 10:36:40
Zitat von: ch.eick am 20 Februar 2023, 10:15:09
Hallo Timo,
das hatte ich schon mal geschrieben. Die Tibber Momentanwerte werden wohl über eine Java Session übertragen, für das es im HTTPMOD keine Implementierung gibt.
Node-Red ist da moderner und unterstützt das im Workflow. Somit hält Node-Red die Session und es wird dann mit MQTT zu FHEM weiter geleitet.
Da ich jedoch noch kein Tibber habe kann ich das nicht testen.

@all Ich wäre sehr an aktuellen Preisen, am besten aus dem Raum Rhein Main, interessiert. Wenn ich mir die aWATTar Preise inklusive der Basis Kosten für meinen Netzbetreiber
anschaue, dann komme ich bisher noch nicht unter den Grundversorger. Jedoch rechne ich mit baldiger Preiserhöhung und möchte vorbereitet sein. Tibber gibt mir jedoch erst
nach dem Vertragsabschluss die Netzbetreiber Kosten :-(

VG Christian

Hallo Christian,

wenn du auf der Tibber Seite deine PLZ beim Preisrechner eingibst dann kannst du dort unter "Weitere Preisbestandteile" die Gebühren sehen die bei dem durchschnittlichen Preis drauf kommen. Damit kannst du erstmal grob rechnen um  ein Gefühl dafür zu bekommen, so habe ich das auch am Anfang gemacht. Genauso wie die "Netznutzungs- und Messstellengebühren" die auch unterschiedlich je nach Region sind.

Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 20 Februar 2023, 10:43:18
Zitat von: TimoD am 20 Februar 2023, 10:02:11
Hallo xerion,

hast du node-red-contrib-tibber-api um mqtt ergänzt? Sehe kein MQTT in der Konfiguration.

@all Ich bräuchte eigentlich nur die Daten des stündlichen Forecasts zum Strompreis in FHEM. Meine Verbraucher lese ich über meine PV Anlage direkt aus. Gibt es hier die Möglichkeit zur "einfachen" Abfrage durch einen HTTP Post? Steige bei der Ami Dokumentation nicht ganz durch. Über einen Tipp wie ich das Mache würde ich mich sehr freuen :-)

Grüße Timo

Ich denke das du den Beitrag über die Suche schon gefunden hattest?!:
https://forum.fhem.de/index.php/topic,132188.msg1263918.html#msg1263918
Dort ist ein Beispiel für den aktuellen Preis.
Wenn du dir mal die Tibber API anschaust und den API Explorer benutzt, dann lernst du wie die Request zusammenhängen und was die API bietet.
Dann musst du nur beim HTTPMOD das "requestData", die Readings auf deine Bedürfnisse anpassen und dann solltest du das bekommen was du suchst.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 Februar 2023, 12:00:04
Zitat von: xerion am 20 Februar 2023, 10:43:18
Ich denke das du den Beitrag über die Suche schon gefunden hattest?!:
https://forum.fhem.de/index.php/topic,132188.msg1263918.html#msg1263918
Dort ist ein Beispiel für den aktuellen Preis.
Wenn du dir mal die Tibber API anschaust und den API Explorer benutzt, dann lernst du wie die Request zusammenhängen und was die API bietet.
Dann musst du nur beim HTTPMOD das "requestData", die Readings auf deine Bedürfnisse anpassen und dann solltest du das bekommen was du suchst.
Okay, sorry und danke für den Stubser :-)

Das dürften bei mir jedoch dann nur die Testdaten sein und nicht die realen Preise :-(
Somit kann ich nicht mit der Realität vergleichen und eine eventuelle Ersparnis ermitteln. Es fehlen ja die tatsächlichen Netzbetreiber Kosten.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 20 Februar 2023, 12:02:57
Zitat von: ch.eick am 20 Februar 2023, 12:00:04
Okay, sorry und danke für den Stubser :-)

Das dürften bei mir jedoch dann nur die Testdaten sein und nicht die realen Preise :-(
Somit kann ich nicht mit der Realität vergleichen und eine eventuelle Ersparnis ermitteln. Es fehlen ja die tatsächlichen Netzbetreiber Kosten.

Ich glaube du wirst da was durcheinander. Siehe Beitrag 21 ich meine nicht die API sondern den Preisrechner auch tibber.com
https://tibber.com/de#price-calculator
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 Februar 2023, 12:14:11
Zitat von: xerion am 20 Februar 2023, 12:02:57
Ich glaube du wirst da was durcheinander. Siehe Beitrag 21 ich meine nicht die API sondern den Preisrechner auch tibber.com
https://tibber.com/de#price-calculator
Da wird ein Durchschnittspreis berechnet, der bereits 30 €/Monat über meinem aktuellen Tarif liegt. Selbst mit einem Preis/kWh von 40 ct wäre das immer noch viel zu teuer.
Ich bin von April bis Oktober 100% autark und bräuchte zum vergleichen, ob sich das für den Winter lohnt mal echte Stundendaten von Oktober bis April (oder bis heute).
Mein Haushalt ist 100% elektrisch inklusive E-Auto.
Für 645** sind auch die Netzbetreiber Gebüren ziemlich hoch :-(
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 20 Februar 2023, 13:36:21
Zitat von: ch.eick am 20 Februar 2023, 12:14:11
Da wird ein Durchschnittspreis berechnet, der bereits 30 €/Monat über meinem aktuellen Tarif liegt. Selbst mit einem Preis/kWh von 40 ct wäre das immer noch viel zu teuer.
Ich bin von April bis Oktober 100% autark und bräuchte zum vergleichen, ob sich das für den Winter lohnt mal echte Stundendaten von Oktober bis April (oder bis heute).
Mein Haushalt ist 100% elektrisch inklusive E-Auto.
Für 645** sind auch die Netzbetreiber Gebüren ziemlich hoch :-(

Ja wenn du nur mit dem Durchschnittspreis rechnen kannst, dann ist es schwer das zu simulieren.
Ich bin ähnlich unterwegs wie du...fast alles elektrisch bis auf die Heizung, die kommt (hoffentlich) im Laufe des Jahres. Strom wird dann auch nur hauptsächlich in der "dunklen" Jahreszeit extern zugekauft.
Dadurch das ich mit FHEM und eigene Logiken meine "Stromfresser" in die günstigen Zeiten legen kann, kann man den Durchschnittspreis noch deutlich mit beeinflussen.
Beispiel:
Laut Tibber lag der Durchschnittspreis bei uns im Januar bei 26,3 Cent
Ich selber lag bei 25,5 Cent.
Muss aber dabei sagen, das ich dort noch in der Testphase war, da ich erst seit 01.01 bei Tibber bin. Ich denke da ist noch etwas mehr potenzial.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: TimoD am 20 Februar 2023, 13:40:39
Also ich habe nun heute meinen Tarif bei Tibber abgeschlossen.

Konfiguration, ähnlich PV Anlage mit Speicher, 2x e-Auto und eigentlich auch ziemlich autark. Bei Interesse kann ich gerne über meine Erfahrungen inkl. PULSE stündlicher Abrechnung berichten.

Denn HTTPMOD zur Abfrage habe ich hinbekommen:

HttpUtils:
     NAME       
     addr       https://api.tibber.com:443
     auth       0
     code       200
     compress   1
     conn       
     data       {"query": "{viewer {homes {currentSubscription {priceInfo {today {total startsAt}tomorrow {total startsAt}}}}}}" }
     displayurl https://api.tibber.com/v1-beta/gql
     header     Content-Type: application/json
Authorization: Bearer 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
     host       api.tibber.com
     httpheader HTTP/1.1 200 OK


Folgende Ausgabe:
2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_01_startsAt 2023-02-20T00:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_01_total 0.2446
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_02_startsAt 2023-02-20T01:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_02_total 0.2115
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_03_startsAt 2023-02-20T02:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_03_total 0.2089
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_04_startsAt 2023-02-20T03:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_04_total 0.1912
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_05_startsAt 2023-02-20T04:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_05_total 0.1854
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_06_startsAt 2023-02-20T05:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_06_total 0.1962
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_07_startsAt 2023-02-20T06:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_07_total 0.2368
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_08_startsAt 2023-02-20T07:00:00.000+01:00
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_08_total 0.2437
     2023-02-20 13:36:33   data_viewer_homes_01_currentSubscription_priceInfo_today_09_startsAt 2023-02-20T08:00:00.000+01:00
etc.


Jetzt würde ich gerne mit Regex alle data_viewer_homes_01_currentSubscription_priceInfo_today_08_startsAt.* in die eigentliche Uhrzeit zerlegen. (Zur not wüsste ich wie ich das über userreadings macht) könnt Ihr mir hier weiterhelfen?

Solltet Ihr ein Tibber Einladungscode benötigen: (wo ihr auch 50€ bekommt) https://invite.tibber.com/q4mgvwt3     Damit war mein Pulse bei 50€ mit Versand.

PS, wenn Ihr wollt, würde ich auch temporär mal meinen Token sparen, mit dem Ihr auf die Ist Preise bei der Ami Abfrage kommt. (PM)
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: TimoD am 20 Februar 2023, 13:59:48
Zitat von: xerion am 20 Februar 2023, 10:43:18
Ich denke das du den Beitrag über die Suche schon gefunden hattest?!:
https://forum.fhem.de/index.php/topic,132188.msg1263918.html#msg1263918
Dort ist ein Beispiel für den aktuellen Preis.
Wenn du dir mal die Tibber API anschaust und den API Explorer benutzt, dann lernst du wie die Request zusammenhängen und was die API bietet.
Dann musst du nur beim HTTPMOD das "requestData", die Readings auf deine Bedürfnisse anpassen und dann solltest du das bekommen was du suchst.

Nein bisher nicht, aber jetzt. DANKE
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 Februar 2023, 17:16:05
UPDATE 20230411
Es gibt hier eine aktuellere Definition der Devices. (https://forum.fhem.de/index.php?msg=1271260)


Zitat von: TimoD am 20 Februar 2023, 13:40:39Also ich habe nun heute meinen Tarif bei Tibber abgeschlossen.

Konfiguration, ähnlich PV Anlage mit Speicher, 2x e-Auto und eigentlich auch ziemlich autark. Bei Interesse kann ich gerne über meine Erfahrungen inkl. PULSE stündlicher Abrechnung berichten.

Denn HTTPMOD zur Abfrage habe ich hinbekommen:

Jetzt würde ich gerne mit Regex alle data_viewer_homes_01_currentSubscription_priceInfo_today_08_startsAt.* in die eigentliche Uhrzeit zerlegen. (Zur not wüsste ich wie ich das über userreadings macht) könnt Ihr mir hier weiterhelfen?
Hallo Timo,
hier wäre dann mal meine Definition, jedoch nur mit dem Test Konto ausprobiert.

Es gibt bisher vier get Aufrufe, die man z.B. mit einem DOIF triggern könnte.
01_priceInfo
02_priceall
03_consumption_hourly_100
04_address
Hierbei setzen 01_priceInfo und auch 01_priceInfo beide den aktuellen Preis und Datum, sowie Uhrzeit.

Beim 02_priceall werden die readings für heute und morgen geschrieben.
Ich habe die reading Namen an andere Devices im FHEM angeglichen:
fc0_00_*    ist der Forecast, wobei 0 für heute steht und 00 bis 23 die jeweilige Stunde ist
fc1_00_*    wäre dann für morgen

Eventuell könnte man noch die *startsAt weg lassen, da das ja im reading Namen mit der Stunde enthalten ist. Unter Datum und Uhrzeit wäre der Rest an Information.
Die consumption habe ich noch nicht aufgedröselt, da wären Vorschläge gerne gesehen. Auch die Adresse ist noch nicht eingelesen, falls das jemand haben möchte.

VG  Christian


Um mit den vielen readings klar zu kommen habe ich einen Nummern Code
reading020001JSON

02      gehört zum get02
[0|1]   ist für heute oder morgen
[00-23] ist die Stunde
[1-4]   das jeweilige reading von der Stunde
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: TimoD am 23 Februar 2023, 19:30:02
Zitat von: ch.eick am 20 Februar 2023, 17:16:05
Hallo Timo,
hier wäre dann mal meine Definition, jedoch nur mit dem Test Konto ausprobiert.

Es gibt bisher vier get Aufrufe, die man z.B. mit einem DOIF triggern könnte.

01_priceInfo
02_priceall
03_consumption_hourly_100
04_address

Hierbei setzen 01_priceInfo und auch 01_priceInfo beide den aktuellen Preis und Datum, sowie Uhrzeit.

Beim 02_priceall werden die readings für heute und morgen geschrieben.
Ich habe die reading Namen an andere Devices im FHEM angeglichen:

fc0_00_*    ist der Forecast, wobei 0 für heute steht und 00 bis 23 die jeweilige Stunde ist
fc1_00_*    wäre dann für morgen

Eventuell könnte man noch die *startsAt weg lassen, da das ja im reading Namen mit der Stunde enthalten ist. Unter Datum und Uhrzeit wäre der Rest an Information.

Die consumption habe ich noch nicht aufgedröselt, da wären Vorschläge gerne gesehen. Auch die Adresse ist noch nicht eingelesen, falls das jemand haben möchte.

VG   Christian


defmod EVU_Tibber HTTPMOD https://api.tibber.com/v1-beta/gql 0
attr EVU_Tibber DbLogExclude .*
attr EVU_Tibber comment Version 2022.12.12 17:00 \
https://developer.tibber.com/explorer
attr EVU_Tibber enableControlSet 1
attr EVU_Tibber get01Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get01Header01 Content-Type: application/json
attr EVU_Tibber get01Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get01Name 01_priceInfo
attr EVU_Tibber get01URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get02CheckAllReadings 1
attr EVU_Tibber get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt} today {total energy tax startsAt} tomorrow {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get02Header01 Content-Type: application/json
attr EVU_Tibber get02Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get02Name 02_priceAll
attr EVU_Tibber get02URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr EVU_Tibber get03Header01 Content-Type: application/json
attr EVU_Tibber get03Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get03Name 03_consumption_hourly_100
attr EVU_Tibber get03URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get04Data { "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }
attr EVU_Tibber get04Header01 Content-Type: application/json
attr EVU_Tibber get04Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get04Name 04_address
attr EVU_Tibber get04URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber group PV Steuerung EVU
attr EVU_Tibber icon sani_pump
attr EVU_Tibber reading020001JSON data_viewer_home_currentSubscription_priceInfo_today_01_energy
attr EVU_Tibber reading020001Name fc0_00_energy
attr EVU_Tibber reading020002JSON data_viewer_home_currentSubscription_priceInfo_today_01_startsAt
attr EVU_Tibber reading020002Name fc0_00_startsAt
attr EVU_Tibber reading020003JSON data_viewer_home_currentSubscription_priceInfo_today_01_tax
attr EVU_Tibber reading020003Name fc0_00_tax
attr EVU_Tibber reading020004JSON data_viewer_home_currentSubscription_priceInfo_today_01_total
attr EVU_Tibber reading020004Name fc0_00_total
attr EVU_Tibber reading020011JSON data_viewer_home_currentSubscription_priceInfo_today_02_energy
attr EVU_Tibber reading020011Name fc0_01_energy
attr EVU_Tibber reading020012JSON data_viewer_home_currentSubscription_priceInfo_today_02_startsAt
attr EVU_Tibber reading020012Name fc0_01_startsAt
attr EVU_Tibber reading020013JSON data_viewer_home_currentSubscription_priceInfo_today_02_tax
attr EVU_Tibber reading020013Name fc0_01_tax
attr EVU_Tibber reading020014JSON data_viewer_home_currentSubscription_priceInfo_today_02_total
attr EVU_Tibber reading020014Name fc0_01_total
attr EVU_Tibber reading020021JSON data_viewer_home_currentSubscription_priceInfo_today_03_energy
attr EVU_Tibber reading020021Name fc0_02_energy
attr EVU_Tibber reading020022JSON data_viewer_home_currentSubscription_priceInfo_today_03_startsAt
attr EVU_Tibber reading020022Name fc0_02_startsAt
attr EVU_Tibber reading020023JSON data_viewer_home_currentSubscription_priceInfo_today_03_tax
attr EVU_Tibber reading020023Name fc0_02_tax
attr EVU_Tibber reading020024JSON data_viewer_home_currentSubscription_priceInfo_today_03_total
attr EVU_Tibber reading020024Name fc0_02_total
attr EVU_Tibber reading020031JSON data_viewer_home_currentSubscription_priceInfo_today_04_energy
attr EVU_Tibber reading020031Name fc0_03_energy
attr EVU_Tibber reading020032JSON data_viewer_home_currentSubscription_priceInfo_today_04_startsAt
attr EVU_Tibber reading020032Name fc0_03_startsAt
attr EVU_Tibber reading020033JSON data_viewer_home_currentSubscription_priceInfo_today_04_tax
attr EVU_Tibber reading020033Name fc0_03_tax
attr EVU_Tibber reading020034JSON data_viewer_home_currentSubscription_priceInfo_today_04_total
attr EVU_Tibber reading020034Name fc0_03_total
attr EVU_Tibber reading020041JSON data_viewer_home_currentSubscription_priceInfo_today_05_energy
attr EVU_Tibber reading020041Name fc0_04_energy
attr EVU_Tibber reading020042JSON data_viewer_home_currentSubscription_priceInfo_today_05_startsAt
attr EVU_Tibber reading020042Name fc0_04_startsAt
attr EVU_Tibber reading020043JSON data_viewer_home_currentSubscription_priceInfo_today_05_tax
attr EVU_Tibber reading020043Name fc0_04_tax
attr EVU_Tibber reading020044JSON data_viewer_home_currentSubscription_priceInfo_today_05_total
attr EVU_Tibber reading020044Name fc0_04_total
attr EVU_Tibber reading020051JSON data_viewer_home_currentSubscription_priceInfo_today_06_energy
attr EVU_Tibber reading020051Name fc0_05_energy
attr EVU_Tibber reading020052JSON data_viewer_home_currentSubscription_priceInfo_today_06_startsAt
attr EVU_Tibber reading020052Name fc0_05_startsAt
attr EVU_Tibber reading020053JSON data_viewer_home_currentSubscription_priceInfo_today_06_tax
attr EVU_Tibber reading020053Name fc0_05_tax
attr EVU_Tibber reading020054JSON data_viewer_home_currentSubscription_priceInfo_today_06_total
attr EVU_Tibber reading020054Name fc0_05_total
attr EVU_Tibber reading020061JSON data_viewer_home_currentSubscription_priceInfo_today_07_energy
attr EVU_Tibber reading020061Name fc0_06_energy
attr EVU_Tibber reading020062JSON data_viewer_home_currentSubscription_priceInfo_today_07_startsAt
attr EVU_Tibber reading020062Name fc0_06_startsAt
attr EVU_Tibber reading020063JSON data_viewer_home_currentSubscription_priceInfo_today_07_tax
attr EVU_Tibber reading020063Name fc0_06_tax
attr EVU_Tibber reading020064JSON data_viewer_home_currentSubscription_priceInfo_today_07_total
attr EVU_Tibber reading020064Name fc0_06_total
attr EVU_Tibber reading020071JSON data_viewer_home_currentSubscription_priceInfo_today_08_energy
attr EVU_Tibber reading020071Name fc0_07_energy
attr EVU_Tibber reading020072JSON data_viewer_home_currentSubscription_priceInfo_today_08_startsAt
attr EVU_Tibber reading020072Name fc0_07_startsAt
attr EVU_Tibber reading020073JSON data_viewer_home_currentSubscription_priceInfo_today_08_tax
attr EVU_Tibber reading020073Name fc0_07_tax
attr EVU_Tibber reading020074JSON data_viewer_home_currentSubscription_priceInfo_today_08_total
attr EVU_Tibber reading020074Name fc0_07_total
attr EVU_Tibber reading020081JSON data_viewer_home_currentSubscription_priceInfo_today_09_energy
attr EVU_Tibber reading020081Name fc0_08_energy
attr EVU_Tibber reading020082JSON data_viewer_home_currentSubscription_priceInfo_today_09_startsAt
attr EVU_Tibber reading020082Name fc0_08_startsAt
attr EVU_Tibber reading020083JSON data_viewer_home_currentSubscription_priceInfo_today_09_tax
attr EVU_Tibber reading020083Name fc0_08_tax
attr EVU_Tibber reading020084JSON data_viewer_home_currentSubscription_priceInfo_today_09_total
attr EVU_Tibber reading020084Name fc0_08_total
attr EVU_Tibber reading020091JSON data_viewer_home_currentSubscription_priceInfo_today_10_energy
attr EVU_Tibber reading020091Name fc0_09_energy
attr EVU_Tibber reading020092JSON data_viewer_home_currentSubscription_priceInfo_today_10_startsAt
attr EVU_Tibber reading020092Name fc0_09_startsAt
attr EVU_Tibber reading020093JSON data_viewer_home_currentSubscription_priceInfo_today_10_tax
attr EVU_Tibber reading020093Name fc0_09_tax
attr EVU_Tibber reading020094JSON data_viewer_home_currentSubscription_priceInfo_today_10_total
attr EVU_Tibber reading020094Name fc0_09_total
attr EVU_Tibber reading020101JSON data_viewer_home_currentSubscription_priceInfo_today_11_energy
attr EVU_Tibber reading020101Name fc0_10_energy
attr EVU_Tibber reading020102JSON data_viewer_home_currentSubscription_priceInfo_today_11_startsAt
attr EVU_Tibber reading020102Name fc0_10_startsAt
attr EVU_Tibber reading020103JSON data_viewer_home_currentSubscription_priceInfo_today_11_tax
attr EVU_Tibber reading020103Name fc0_10_tax
attr EVU_Tibber reading020104JSON data_viewer_home_currentSubscription_priceInfo_today_11_total
attr EVU_Tibber reading020104Name fc0_10_total
attr EVU_Tibber reading020111JSON data_viewer_home_currentSubscription_priceInfo_today_12_energy
attr EVU_Tibber reading020111Name fc0_11_energy
attr EVU_Tibber reading020112JSON data_viewer_home_currentSubscription_priceInfo_today_12_startsAt
attr EVU_Tibber reading020112Name fc0_11_startsAt
attr EVU_Tibber reading020113JSON data_viewer_home_currentSubscription_priceInfo_today_12_tax
attr EVU_Tibber reading020113Name fc0_11_tax
attr EVU_Tibber reading020114JSON data_viewer_home_currentSubscription_priceInfo_today_12_total
attr EVU_Tibber reading020114Name fc0_11_total
attr EVU_Tibber reading020121JSON data_viewer_home_currentSubscription_priceInfo_today_13_energy
attr EVU_Tibber reading020121Name fc0_12_energy
attr EVU_Tibber reading020122JSON data_viewer_home_currentSubscription_priceInfo_today_13_startsAt
attr EVU_Tibber reading020122Name fc0_12_startsAt
attr EVU_Tibber reading020123JSON data_viewer_home_currentSubscription_priceInfo_today_13_tax
attr EVU_Tibber reading020123Name fc0_12_tax
attr EVU_Tibber reading020124JSON data_viewer_home_currentSubscription_priceInfo_today_13_total
attr EVU_Tibber reading020124Name fc0_12_total
attr EVU_Tibber reading020131JSON data_viewer_home_currentSubscription_priceInfo_today_14_energy
attr EVU_Tibber reading020131Name fc0_13_energy
attr EVU_Tibber reading020132JSON data_viewer_home_currentSubscription_priceInfo_today_14_startsAt
attr EVU_Tibber reading020132Name fc0_13_startsAt
attr EVU_Tibber reading020133JSON data_viewer_home_currentSubscription_priceInfo_today_14_tax
attr EVU_Tibber reading020133Name fc0_13_tax
attr EVU_Tibber reading020134JSON data_viewer_home_currentSubscription_priceInfo_today_14_total
attr EVU_Tibber reading020134Name fc0_13_total
attr EVU_Tibber reading020141JSON data_viewer_home_currentSubscription_priceInfo_today_15_energy
attr EVU_Tibber reading020141Name fc0_14_energy
attr EVU_Tibber reading020142JSON data_viewer_home_currentSubscription_priceInfo_today_15_startsAt
attr EVU_Tibber reading020142Name fc0_14_startsAt
attr EVU_Tibber reading020143JSON data_viewer_home_currentSubscription_priceInfo_today_15_tax
attr EVU_Tibber reading020143Name fc0_14_tax
attr EVU_Tibber reading020144JSON data_viewer_home_currentSubscription_priceInfo_today_15_total
attr EVU_Tibber reading020144Name fc0_14_total
attr EVU_Tibber reading020151JSON data_viewer_home_currentSubscription_priceInfo_today_16_energy
attr EVU_Tibber reading020151Name fc0_15_energy
attr EVU_Tibber reading020152JSON data_viewer_home_currentSubscription_priceInfo_today_16_startsAt
attr EVU_Tibber reading020152Name fc0_15_startsAt
attr EVU_Tibber reading020153JSON data_viewer_home_currentSubscription_priceInfo_today_16_tax
attr EVU_Tibber reading020153Name fc0_15_tax
attr EVU_Tibber reading020154JSON data_viewer_home_currentSubscription_priceInfo_today_16_total
attr EVU_Tibber reading020154Name fc0_15_total
attr EVU_Tibber reading020161JSON data_viewer_home_currentSubscription_priceInfo_today_17_energy
attr EVU_Tibber reading020161Name fc0_16_energy
attr EVU_Tibber reading020162JSON data_viewer_home_currentSubscription_priceInfo_today_17_startsAt
attr EVU_Tibber reading020162Name fc0_16_startsAt
attr EVU_Tibber reading020163JSON data_viewer_home_currentSubscription_priceInfo_today_17_tax
attr EVU_Tibber reading020163Name fc0_16_tax
attr EVU_Tibber reading020164JSON data_viewer_home_currentSubscription_priceInfo_today_17_total
attr EVU_Tibber reading020164Name fc0_16_total
attr EVU_Tibber reading020171JSON data_viewer_home_currentSubscription_priceInfo_today_18_energy
attr EVU_Tibber reading020171Name fc0_17_energy
attr EVU_Tibber reading020172JSON data_viewer_home_currentSubscription_priceInfo_today_18_startsAt
attr EVU_Tibber reading020172Name fc0_17_startsAt
attr EVU_Tibber reading020173JSON data_viewer_home_currentSubscription_priceInfo_today_18_tax
attr EVU_Tibber reading020173Name fc0_17_tax
attr EVU_Tibber reading020174JSON data_viewer_home_currentSubscription_priceInfo_today_18_total
attr EVU_Tibber reading020174Name fc0_17_total
attr EVU_Tibber reading020181JSON data_viewer_home_currentSubscription_priceInfo_today_19_energy
attr EVU_Tibber reading020181Name fc0_18_energy
attr EVU_Tibber reading020182JSON data_viewer_home_currentSubscription_priceInfo_today_19_startsAt
attr EVU_Tibber reading020182Name fc0_18_startsAt
attr EVU_Tibber reading020183JSON data_viewer_home_currentSubscription_priceInfo_today_19_tax
attr EVU_Tibber reading020183Name fc0_18_tax
attr EVU_Tibber reading020184JSON data_viewer_home_currentSubscription_priceInfo_today_19_total
attr EVU_Tibber reading020184Name fc0_18_total
attr EVU_Tibber reading020191JSON data_viewer_home_currentSubscription_priceInfo_today_20_energy
attr EVU_Tibber reading020191Name fc0_19_energy
attr EVU_Tibber reading020192JSON data_viewer_home_currentSubscription_priceInfo_today_20_startsAt
attr EVU_Tibber reading020192Name fc0_19_startsAt
attr EVU_Tibber reading020193JSON data_viewer_home_currentSubscription_priceInfo_today_20_tax
attr EVU_Tibber reading020193Name fc0_19_tax
attr EVU_Tibber reading020194JSON data_viewer_home_currentSubscription_priceInfo_today_20_total
attr EVU_Tibber reading020194Name fc0_19_total
attr EVU_Tibber reading020201JSON data_viewer_home_currentSubscription_priceInfo_today_21_energy
attr EVU_Tibber reading020201Name fc0_20_energy
attr EVU_Tibber reading020202JSON data_viewer_home_currentSubscription_priceInfo_today_21_startsAt
attr EVU_Tibber reading020202Name fc0_20_startsAt
attr EVU_Tibber reading020203JSON data_viewer_home_currentSubscription_priceInfo_today_21_tax
attr EVU_Tibber reading020203Name fc0_20_tax
attr EVU_Tibber reading020204JSON data_viewer_home_currentSubscription_priceInfo_today_21_total
attr EVU_Tibber reading020204Name fc0_20_total
attr EVU_Tibber reading020211JSON data_viewer_home_currentSubscription_priceInfo_today_22_energy
attr EVU_Tibber reading020211Name fc0_21_energy
attr EVU_Tibber reading020212JSON data_viewer_home_currentSubscription_priceInfo_today_22_startsAt
attr EVU_Tibber reading020212Name fc0_21_startsAt
attr EVU_Tibber reading020213JSON data_viewer_home_currentSubscription_priceInfo_today_22_tax
attr EVU_Tibber reading020213Name fc0_21_tax
attr EVU_Tibber reading020214JSON data_viewer_home_currentSubscription_priceInfo_today_22_total
attr EVU_Tibber reading020214Name fc0_21_total
attr EVU_Tibber reading020221JSON data_viewer_home_currentSubscription_priceInfo_today_23_energy
attr EVU_Tibber reading020221Name fc0_22_energy
attr EVU_Tibber reading020222JSON data_viewer_home_currentSubscription_priceInfo_today_23_startsAt
attr EVU_Tibber reading020222Name fc0_22_startsAt
attr EVU_Tibber reading020223JSON data_viewer_home_currentSubscription_priceInfo_today_23_tax
attr EVU_Tibber reading020223Name fc0_22_tax
attr EVU_Tibber reading020224JSON data_viewer_home_currentSubscription_priceInfo_today_23_total
attr EVU_Tibber reading020224Name fc0_22_total
attr EVU_Tibber reading020231JSON data_viewer_home_currentSubscription_priceInfo_today_24_energy
attr EVU_Tibber reading020231Name fc0_23_energy
attr EVU_Tibber reading020232JSON data_viewer_home_currentSubscription_priceInfo_today_24_startsAt
attr EVU_Tibber reading020232Name fc0_23_startsAt
attr EVU_Tibber reading020233JSON data_viewer_home_currentSubscription_priceInfo_today_24_tax
attr EVU_Tibber reading020233Name fc0_23_tax
attr EVU_Tibber reading020234JSON data_viewer_home_currentSubscription_priceInfo_today_24_total
attr EVU_Tibber reading020234Name fc0_23_total
attr EVU_Tibber reading021001JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_energy
attr EVU_Tibber reading021001Name fc1_00_energy
attr EVU_Tibber reading021002JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_startsAt
attr EVU_Tibber reading021002Name fc1_00_startsAt
attr EVU_Tibber reading021003JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_tax
attr EVU_Tibber reading021003Name fc1_00_tax
attr EVU_Tibber reading021004JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_total
attr EVU_Tibber reading021004Name fc1_00_total
attr EVU_Tibber reading021011JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_energy
attr EVU_Tibber reading021011Name fc1_01_energy
attr EVU_Tibber reading021012JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_startsAt
attr EVU_Tibber reading021012Name fc1_01_startsAt
attr EVU_Tibber reading021013JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_tax
attr EVU_Tibber reading021013Name fc1_01_tax
attr EVU_Tibber reading021014JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_total
attr EVU_Tibber reading021014Name fc1_01_total
attr EVU_Tibber reading021021JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_energy
attr EVU_Tibber reading021021Name fc1_02_energy
attr EVU_Tibber reading021022JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_startsAt
attr EVU_Tibber reading021022Name fc1_02_startsAt
attr EVU_Tibber reading021023JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_tax
attr EVU_Tibber reading021023Name fc1_02_tax
attr EVU_Tibber reading021024JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_total
attr EVU_Tibber reading021024Name fc1_02_total
attr EVU_Tibber reading021031JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_energy
attr EVU_Tibber reading021031Name fc1_03_energy
attr EVU_Tibber reading021032JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_startsAt
attr EVU_Tibber reading021032Name fc1_03_startsAt
attr EVU_Tibber reading021033JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_tax
attr EVU_Tibber reading021033Name fc1_03_tax
attr EVU_Tibber reading021034JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_total
attr EVU_Tibber reading021034Name fc1_03_total
attr EVU_Tibber reading021041JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_energy
attr EVU_Tibber reading021041Name fc1_04_energy
attr EVU_Tibber reading021042JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_startsAt
attr EVU_Tibber reading021042Name fc1_04_startsAt
attr EVU_Tibber reading021043JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_tax
attr EVU_Tibber reading021043Name fc1_04_tax
attr EVU_Tibber reading021044JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_total
attr EVU_Tibber reading021044Name fc1_04_total
attr EVU_Tibber reading021051JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_energy
attr EVU_Tibber reading021051Name fc1_05_energy
attr EVU_Tibber reading021052JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_startsAt
attr EVU_Tibber reading021052Name fc1_05_startsAt
attr EVU_Tibber reading021053JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_tax
attr EVU_Tibber reading021053Name fc1_05_tax
attr EVU_Tibber reading021054JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_total
attr EVU_Tibber reading021054Name fc1_05_total
attr EVU_Tibber reading021061JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_energy
attr EVU_Tibber reading021061Name fc1_06_energy
attr EVU_Tibber reading021062JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_startsAt
attr EVU_Tibber reading021062Name fc1_06_startsAt
attr EVU_Tibber reading021063JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_tax
attr EVU_Tibber reading021063Name fc1_06_tax
attr EVU_Tibber reading021064JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_total
attr EVU_Tibber reading021064Name fc1_06_total
attr EVU_Tibber reading021071JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_energy
attr EVU_Tibber reading021071Name fc1_07_energy
attr EVU_Tibber reading021072JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_startsAt
attr EVU_Tibber reading021072Name fc1_07_startsAt
attr EVU_Tibber reading021073JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_tax
attr EVU_Tibber reading021073Name fc1_07_tax
attr EVU_Tibber reading021074JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_total
attr EVU_Tibber reading021074Name fc1_07_total
attr EVU_Tibber reading021081JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_energy
attr EVU_Tibber reading021081Name fc1_08_energy
attr EVU_Tibber reading021082JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_startsAt
attr EVU_Tibber reading021082Name fc1_08_startsAt
attr EVU_Tibber reading021083JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_tax
attr EVU_Tibber reading021083Name fc1_08_tax
attr EVU_Tibber reading021084JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_total
attr EVU_Tibber reading021084Name fc1_08_total
attr EVU_Tibber reading021091JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_energy
attr EVU_Tibber reading021091Name fc1_09_energy
attr EVU_Tibber reading021092JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_startsAt
attr EVU_Tibber reading021092Name fc1_09_startsAt
attr EVU_Tibber reading021093JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_tax
attr EVU_Tibber reading021093Name fc1_09_tax
attr EVU_Tibber reading021094JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_total
attr EVU_Tibber reading021094Name fc1_09_total
attr EVU_Tibber reading021101JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_energy
attr EVU_Tibber reading021101Name fc1_10_energy
attr EVU_Tibber reading021102JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_startsAt
attr EVU_Tibber reading021102Name fc1_10_startsAt
attr EVU_Tibber reading021103JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_tax
attr EVU_Tibber reading021103Name fc1_10_tax
attr EVU_Tibber reading021104JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_total
attr EVU_Tibber reading021104Name fc1_10_total
attr EVU_Tibber reading021111JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_energy
attr EVU_Tibber reading021111Name fc1_11_energy
attr EVU_Tibber reading021112JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_startsAt
attr EVU_Tibber reading021112Name fc1_11_startsAt
attr EVU_Tibber reading021113JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_tax
attr EVU_Tibber reading021113Name fc1_11_tax
attr EVU_Tibber reading021114JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_total
attr EVU_Tibber reading021114Name fc1_11_total
attr EVU_Tibber reading021121JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_energy
attr EVU_Tibber reading021121Name fc1_12_energy
attr EVU_Tibber reading021122JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_startsAt
attr EVU_Tibber reading021122Name fc1_12_startsAt
attr EVU_Tibber reading021123JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_tax
attr EVU_Tibber reading021123Name fc1_12_tax
attr EVU_Tibber reading021124JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_total
attr EVU_Tibber reading021124Name fc1_12_total
attr EVU_Tibber reading021131JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_energy
attr EVU_Tibber reading021131Name fc1_13_energy
attr EVU_Tibber reading021132JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_startsAt
attr EVU_Tibber reading021132Name fc1_13_startsAt
attr EVU_Tibber reading021133JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_tax
attr EVU_Tibber reading021133Name fc1_13_tax
attr EVU_Tibber reading021134JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_total
attr EVU_Tibber reading021134Name fc1_13_total
attr EVU_Tibber reading021141JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_energy
attr EVU_Tibber reading021141Name fc1_14_energy
attr EVU_Tibber reading021142JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_startsAt
attr EVU_Tibber reading021142Name fc1_14_startsAt
attr EVU_Tibber reading021143JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_tax
attr EVU_Tibber reading021143Name fc1_14_tax
attr EVU_Tibber reading021144JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_total
attr EVU_Tibber reading021144Name fc1_14_total
attr EVU_Tibber reading021151JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_energy
attr EVU_Tibber reading021151Name fc1_15_energy
attr EVU_Tibber reading021152JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_startsAt
attr EVU_Tibber reading021152Name fc1_15_startsAt
attr EVU_Tibber reading021153JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_tax
attr EVU_Tibber reading021153Name fc1_15_tax
attr EVU_Tibber reading021154JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_total
attr EVU_Tibber reading021154Name fc1_15_total
attr EVU_Tibber reading021161JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_energy
attr EVU_Tibber reading021161Name fc1_16_energy
attr EVU_Tibber reading021162JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_startsAt
attr EVU_Tibber reading021162Name fc1_16_startsAt
attr EVU_Tibber reading021163JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_tax
attr EVU_Tibber reading021163Name fc1_16_tax
attr EVU_Tibber reading021164JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_total
attr EVU_Tibber reading021164Name fc1_16_total
attr EVU_Tibber reading021171JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_energy
attr EVU_Tibber reading021171Name fc1_17_energy
attr EVU_Tibber reading021172JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_startsAt
attr EVU_Tibber reading021172Name fc1_17_startsAt
attr EVU_Tibber reading021173JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_tax
attr EVU_Tibber reading021173Name fc1_17_tax
attr EVU_Tibber reading021174JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_total
attr EVU_Tibber reading021174Name fc1_17_total
attr EVU_Tibber reading021181JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_energy
attr EVU_Tibber reading021181Name fc1_18_energy
attr EVU_Tibber reading021182JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_startsAt
attr EVU_Tibber reading021182Name fc1_18_startsAt
attr EVU_Tibber reading021183JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_tax
attr EVU_Tibber reading021183Name fc1_18_tax
attr EVU_Tibber reading021184JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_total
attr EVU_Tibber reading021184Name fc1_18_total
attr EVU_Tibber reading021191JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_energy
attr EVU_Tibber reading021191Name fc1_19_energy
attr EVU_Tibber reading021192JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_startsAt
attr EVU_Tibber reading021192Name fc1_19_startsAt
attr EVU_Tibber reading021193JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_tax
attr EVU_Tibber reading021193Name fc1_19_tax
attr EVU_Tibber reading021194JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_total
attr EVU_Tibber reading021194Name fc1_19_total
attr EVU_Tibber reading021201JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_energy
attr EVU_Tibber reading021201Name fc1_20_energy
attr EVU_Tibber reading021202JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_startsAt
attr EVU_Tibber reading021202Name fc1_20_startsAt
attr EVU_Tibber reading021203JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_tax
attr EVU_Tibber reading021203Name fc1_20_tax
attr EVU_Tibber reading021204JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_total
attr EVU_Tibber reading021204Name fc1_20_total
attr EVU_Tibber reading021211JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_energy
attr EVU_Tibber reading021211Name fc1_21_energy
attr EVU_Tibber reading021212JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_startsAt
attr EVU_Tibber reading021212Name fc1_21_startsAt
attr EVU_Tibber reading021213JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_tax
attr EVU_Tibber reading021213Name fc1_21_tax
attr EVU_Tibber reading021214JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_total
attr EVU_Tibber reading021214Name fc1_21_total
attr EVU_Tibber reading021221JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_energy
attr EVU_Tibber reading021221Name fc1_22_energy
attr EVU_Tibber reading021222JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_startsAt
attr EVU_Tibber reading021222Name fc1_22_startsAt
attr EVU_Tibber reading021223JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_tax
attr EVU_Tibber reading021223Name fc1_22_tax
attr EVU_Tibber reading021224JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_total
attr EVU_Tibber reading021224Name fc1_22_total
attr EVU_Tibber reading021231JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_energy
attr EVU_Tibber reading021231Name fc1_23_energy
attr EVU_Tibber reading021232JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_startsAt
attr EVU_Tibber reading021232Name fc1_23_startsAt
attr EVU_Tibber reading021233JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_tax
attr EVU_Tibber reading021233Name fc1_23_tax
attr EVU_Tibber reading021234JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_total
attr EVU_Tibber reading021234Name fc1_23_total
attr EVU_Tibber reading1JSON data_viewer_home_currentSubscription_priceInfo_current_total
attr EVU_Tibber reading1Name Strompreis
attr EVU_Tibber reading1OExpr $val*100
attr EVU_Tibber reading2-1Name Datum
attr EVU_Tibber reading2-2Name Uhrzeit
attr EVU_Tibber reading2JSON data_viewer_homes_01_currentSubscription_priceInfo_current_startsAt
attr EVU_Tibber reading2Regex startsAt":"([\d+-]+)T(\d\d:\d\d)
attr EVU_Tibber replacement01Mode reading
attr EVU_Tibber replacement01Regex %%token%%
attr EVU_Tibber replacement01Value token
attr EVU_Tibber replacement02Mode reading
attr EVU_Tibber replacement02Regex %%homeID%%
attr EVU_Tibber replacement02Value homeID
attr EVU_Tibber requestData { "query": "{viewer {home(id:\"%%homeID%%b\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
attr EVU_Tibber requestHeader1 Content-Type: application/json
attr EVU_Tibber requestHeader2 Authorization: Bearer %%token%%
attr EVU_Tibber room Strom->Photovoltaik
attr EVU_Tibber showBody 1
attr EVU_Tibber showError 1
attr EVU_Tibber sortby 313
attr EVU_Tibber verbose 0

Um mit den vielen readings klar zu kommen habe ich einen Nummern Code

reading020001JSON

02      gehört zum get02
[0|1]   ist für heute oder morgen
[00-23] ist die Stunde
[1-4]   das jeweilige reading fon der Stunde


Danke für deine Antwort, werde ich zeitnah ausprobieren. Hast du denn eine Lösung zur Visualisierung in FTUI o.ä. gefunden um sich in einem Chart die Daten anzeigen zu lassen?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 24 Februar 2023, 07:57:54
Zitat von: TimoD am 23 Februar 2023, 19:30:02
Danke für deine Antwort, werde ich zeitnah ausprobieren. Hast du denn eine Lösung zur Visualisierung in FTUI o.ä. gefunden um sich in einem Chart die Daten anzeigen zu lassen?
FTUI verwende ich nicht und für die Graphen setze ich Grafana ein.

Das Problem ist nur, dass die readings alle einzeln als fc[0|1]_[01|23]_* entstehen und somit keine kontinuierliche folge von Daten in der datenbank entsteht.
Im Grafana könnte man das eventuell mit MySQL korrigieren.

Für meinen Leistungs Forecast schreibe ich über eine Funktion direkt mit stündlichem TIMESTAMP in die Datenbank. Das wäre auch noch eine Möglichkeit für die fc* Werte, wenn man einen Graphen mit Zeit im Vorraus haben möchte.

Im Nachhinein kann man ja dann den current Strompreis plotten.

VG   Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: decaflo am 02 März 2023, 17:57:43
Zitat von: haneub am 02 Februar 2023, 20:21:07
Hallo,
ich verwende im Moment einen eigenen USB IR-Kopf um meinen Stromzähler ca alle 30s auszulesen und damit die Leistung der go-e Wallbox an die Photovoltaikleistung anzupassen.
Funktioniert subba.
Nun möchte ich zu Tibber wechseln um in den energiereichen Zeiten im Winter auch zu laden. Bei Tibber wird der Tibber Kopf aber an die Stelle gesetzt, wo jetzt mein IR Lesekopf ist.

Wie bekomme ich die aktuelle Leistung alle ca. 30s in fhem wenn ein Tibber Pulse installiert ist?

Bei mir hängt an /dev/ttyUSB0 ein IR-Kopf am Stromzaehler und ein zweiter an /dev/ttyUSB1 ist verbunden mit dem Tibber Pulse. /dev/ttyUSB0 und /dev/ttyUSB1 sind über socat verbunden, das als MITM die übertragenen Daten an fhem ausleitet.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: noanda am 12 März 2023, 23:39:40
Hallo Zusammen,
stelle mich gerde recht blöd an, wie setzte ich den Token? gibt es da ein set befehl ?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: xerion am 13 März 2023, 06:53:53
Zitat von: noanda am 12 März 2023, 23:39:40
Hallo Zusammen,
stelle mich gerde recht blöd an, wie setzte ich den Token? gibt es da ein set befehl ?
Du musst einfach mit "setreading EVU_Tibber  token <dein Token>" den Token setzen.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Butzel am 14 März 2023, 13:11:03
moin,

obwohl ich jetzt alles durchgearbeitet habe, gehe ich davon aus, dass es für tibber und den tibber Pulse noch kein Modul gibt ? Bin ich einfach zu blind ?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 März 2023, 13:20:32
Zitat von: Butzel am 14 März 2023, 13:11:03
obwohl ich jetzt alles durchgearbeitet habe, gehe ich davon aus, dass es für tibber und den tibber Pulse noch kein Modul gibt ? Bin ich einfach zu blind ?
Stimmt, das ist kein Modul, sondern es wird mir HTTPMOD die Tibber API bedient.
Man muss nicht für alles ein eigenes Modul schreiben :-)

VG  Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Butzel am 14 März 2023, 15:44:37
och... so ein Modul direkt mit Graph und Log hat was :-)
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 März 2023, 16:17:01
Zitat von: Butzel am 14 März 2023, 15:44:37
och... so ein Modul direkt mit Graph und Log hat was :-)
Logging geht bei mir immer in DbLog, wenn es sich lohnt aufzuheben und die Graphen in Grafana sind sehr viel schöner.
Leider hat man bei einem Modul oftmals nur einen Maintainer und bei einigen ist der auch nicht mehr im Forum aktiv :-(
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Prof. Dr. Peter Henning am 14 März 2023, 19:46:07
Zitatoch... so ein Modul direkt mit Graph und Log hat was :-)
Bitte mal die Dokumenation zu FHEM lesen. Keines der Gerätemodule erstellt eigene Logs oder Graphen.

LG

pah
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Damian am 14 März 2023, 21:02:58
Zitat von: Butzel am 14 März 2023, 15:44:37
och... so ein Modul direkt mit Graph und Log hat was :-)

Mit mehr oder weniger zwei Zeilen kannst du dir Tibber auch visualisieren:

https://forum.fhem.de/index.php/topic,132188.msg1263950.html#msg1263950
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: TimoD am 15 März 2023, 14:33:48
Zitat von: ch.eick am 20 Februar 2023, 17:16:05
Hallo Timo,
hier wäre dann mal meine Definition, jedoch nur mit dem Test Konto ausprobiert.

Es gibt bisher vier get Aufrufe, die man z.B. mit einem DOIF triggern könnte.

01_priceInfo
02_priceall
03_consumption_hourly_100
04_address

Hierbei setzen 01_priceInfo und auch 01_priceInfo beide den aktuellen Preis und Datum, sowie Uhrzeit.

Beim 02_priceall werden die readings für heute und morgen geschrieben.
Ich habe die reading Namen an andere Devices im FHEM angeglichen:

fc0_00_*    ist der Forecast, wobei 0 für heute steht und 00 bis 23 die jeweilige Stunde ist
fc1_00_*    wäre dann für morgen

Eventuell könnte man noch die *startsAt weg lassen, da das ja im reading Namen mit der Stunde enthalten ist. Unter Datum und Uhrzeit wäre der Rest an Information.

Die consumption habe ich noch nicht aufgedröselt, da wären Vorschläge gerne gesehen. Auch die Adresse ist noch nicht eingelesen, falls das jemand haben möchte.

VG   Christian


defmod EVU_Tibber HTTPMOD https://api.tibber.com/v1-beta/gql 0
attr EVU_Tibber DbLogExclude .*
attr EVU_Tibber comment Version 2022.12.12 17:00 \
https://developer.tibber.com/explorer
attr EVU_Tibber enableControlSet 1
attr EVU_Tibber get01Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get01Header01 Content-Type: application/json
attr EVU_Tibber get01Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get01Name 01_priceInfo
attr EVU_Tibber get01URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get02CheckAllReadings 1
attr EVU_Tibber get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt} today {total energy tax startsAt} tomorrow {total energy tax startsAt}}}}}}" }
attr EVU_Tibber get02Header01 Content-Type: application/json
attr EVU_Tibber get02Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get02Name 02_priceAll
attr EVU_Tibber get02URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr EVU_Tibber get03Header01 Content-Type: application/json
attr EVU_Tibber get03Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get03Name 03_consumption_hourly_100
attr EVU_Tibber get03URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber get04Data { "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }
attr EVU_Tibber get04Header01 Content-Type: application/json
attr EVU_Tibber get04Header02 Authorization: Bearer %%token%%
attr EVU_Tibber get04Name 04_address
attr EVU_Tibber get04URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber group PV Steuerung EVU
attr EVU_Tibber icon sani_pump
attr EVU_Tibber reading020001JSON data_viewer_home_currentSubscription_priceInfo_today_01_energy
attr EVU_Tibber reading020001Name fc0_00_energy
attr EVU_Tibber reading020002JSON data_viewer_home_currentSubscription_priceInfo_today_01_startsAt
attr EVU_Tibber reading020002Name fc0_00_startsAt
attr EVU_Tibber reading020003JSON data_viewer_home_currentSubscription_priceInfo_today_01_tax
attr EVU_Tibber reading020003Name fc0_00_tax
attr EVU_Tibber reading020004JSON data_viewer_home_currentSubscription_priceInfo_today_01_total
attr EVU_Tibber reading020004Name fc0_00_total
attr EVU_Tibber reading020011JSON data_viewer_home_currentSubscription_priceInfo_today_02_energy
attr EVU_Tibber reading020011Name fc0_01_energy
attr EVU_Tibber reading020012JSON data_viewer_home_currentSubscription_priceInfo_today_02_startsAt
attr EVU_Tibber reading020012Name fc0_01_startsAt
attr EVU_Tibber reading020013JSON data_viewer_home_currentSubscription_priceInfo_today_02_tax
attr EVU_Tibber reading020013Name fc0_01_tax
attr EVU_Tibber reading020014JSON data_viewer_home_currentSubscription_priceInfo_today_02_total
attr EVU_Tibber reading020014Name fc0_01_total
attr EVU_Tibber reading020021JSON data_viewer_home_currentSubscription_priceInfo_today_03_energy
attr EVU_Tibber reading020021Name fc0_02_energy
attr EVU_Tibber reading020022JSON data_viewer_home_currentSubscription_priceInfo_today_03_startsAt
attr EVU_Tibber reading020022Name fc0_02_startsAt
attr EVU_Tibber reading020023JSON data_viewer_home_currentSubscription_priceInfo_today_03_tax
attr EVU_Tibber reading020023Name fc0_02_tax
attr EVU_Tibber reading020024JSON data_viewer_home_currentSubscription_priceInfo_today_03_total
attr EVU_Tibber reading020024Name fc0_02_total
attr EVU_Tibber reading020031JSON data_viewer_home_currentSubscription_priceInfo_today_04_energy
attr EVU_Tibber reading020031Name fc0_03_energy
attr EVU_Tibber reading020032JSON data_viewer_home_currentSubscription_priceInfo_today_04_startsAt
attr EVU_Tibber reading020032Name fc0_03_startsAt
attr EVU_Tibber reading020033JSON data_viewer_home_currentSubscription_priceInfo_today_04_tax
attr EVU_Tibber reading020033Name fc0_03_tax
attr EVU_Tibber reading020034JSON data_viewer_home_currentSubscription_priceInfo_today_04_total
attr EVU_Tibber reading020034Name fc0_03_total
attr EVU_Tibber reading020041JSON data_viewer_home_currentSubscription_priceInfo_today_05_energy
attr EVU_Tibber reading020041Name fc0_04_energy
attr EVU_Tibber reading020042JSON data_viewer_home_currentSubscription_priceInfo_today_05_startsAt
attr EVU_Tibber reading020042Name fc0_04_startsAt
attr EVU_Tibber reading020043JSON data_viewer_home_currentSubscription_priceInfo_today_05_tax
attr EVU_Tibber reading020043Name fc0_04_tax
attr EVU_Tibber reading020044JSON data_viewer_home_currentSubscription_priceInfo_today_05_total
attr EVU_Tibber reading020044Name fc0_04_total
attr EVU_Tibber reading020051JSON data_viewer_home_currentSubscription_priceInfo_today_06_energy
attr EVU_Tibber reading020051Name fc0_05_energy
attr EVU_Tibber reading020052JSON data_viewer_home_currentSubscription_priceInfo_today_06_startsAt
attr EVU_Tibber reading020052Name fc0_05_startsAt
attr EVU_Tibber reading020053JSON data_viewer_home_currentSubscription_priceInfo_today_06_tax
attr EVU_Tibber reading020053Name fc0_05_tax
attr EVU_Tibber reading020054JSON data_viewer_home_currentSubscription_priceInfo_today_06_total
attr EVU_Tibber reading020054Name fc0_05_total
attr EVU_Tibber reading020061JSON data_viewer_home_currentSubscription_priceInfo_today_07_energy
attr EVU_Tibber reading020061Name fc0_06_energy
attr EVU_Tibber reading020062JSON data_viewer_home_currentSubscription_priceInfo_today_07_startsAt
attr EVU_Tibber reading020062Name fc0_06_startsAt
attr EVU_Tibber reading020063JSON data_viewer_home_currentSubscription_priceInfo_today_07_tax
attr EVU_Tibber reading020063Name fc0_06_tax
attr EVU_Tibber reading020064JSON data_viewer_home_currentSubscription_priceInfo_today_07_total
attr EVU_Tibber reading020064Name fc0_06_total
attr EVU_Tibber reading020071JSON data_viewer_home_currentSubscription_priceInfo_today_08_energy
attr EVU_Tibber reading020071Name fc0_07_energy
attr EVU_Tibber reading020072JSON data_viewer_home_currentSubscription_priceInfo_today_08_startsAt
attr EVU_Tibber reading020072Name fc0_07_startsAt
attr EVU_Tibber reading020073JSON data_viewer_home_currentSubscription_priceInfo_today_08_tax
attr EVU_Tibber reading020073Name fc0_07_tax
attr EVU_Tibber reading020074JSON data_viewer_home_currentSubscription_priceInfo_today_08_total
attr EVU_Tibber reading020074Name fc0_07_total
attr EVU_Tibber reading020081JSON data_viewer_home_currentSubscription_priceInfo_today_09_energy
attr EVU_Tibber reading020081Name fc0_08_energy
attr EVU_Tibber reading020082JSON data_viewer_home_currentSubscription_priceInfo_today_09_startsAt
attr EVU_Tibber reading020082Name fc0_08_startsAt
attr EVU_Tibber reading020083JSON data_viewer_home_currentSubscription_priceInfo_today_09_tax
attr EVU_Tibber reading020083Name fc0_08_tax
attr EVU_Tibber reading020084JSON data_viewer_home_currentSubscription_priceInfo_today_09_total
attr EVU_Tibber reading020084Name fc0_08_total
attr EVU_Tibber reading020091JSON data_viewer_home_currentSubscription_priceInfo_today_10_energy
attr EVU_Tibber reading020091Name fc0_09_energy
attr EVU_Tibber reading020092JSON data_viewer_home_currentSubscription_priceInfo_today_10_startsAt
attr EVU_Tibber reading020092Name fc0_09_startsAt
attr EVU_Tibber reading020093JSON data_viewer_home_currentSubscription_priceInfo_today_10_tax
attr EVU_Tibber reading020093Name fc0_09_tax
attr EVU_Tibber reading020094JSON data_viewer_home_currentSubscription_priceInfo_today_10_total
attr EVU_Tibber reading020094Name fc0_09_total
attr EVU_Tibber reading020101JSON data_viewer_home_currentSubscription_priceInfo_today_11_energy
attr EVU_Tibber reading020101Name fc0_10_energy
attr EVU_Tibber reading020102JSON data_viewer_home_currentSubscription_priceInfo_today_11_startsAt
attr EVU_Tibber reading020102Name fc0_10_startsAt
attr EVU_Tibber reading020103JSON data_viewer_home_currentSubscription_priceInfo_today_11_tax
attr EVU_Tibber reading020103Name fc0_10_tax
attr EVU_Tibber reading020104JSON data_viewer_home_currentSubscription_priceInfo_today_11_total
attr EVU_Tibber reading020104Name fc0_10_total
attr EVU_Tibber reading020111JSON data_viewer_home_currentSubscription_priceInfo_today_12_energy
attr EVU_Tibber reading020111Name fc0_11_energy
attr EVU_Tibber reading020112JSON data_viewer_home_currentSubscription_priceInfo_today_12_startsAt
attr EVU_Tibber reading020112Name fc0_11_startsAt
attr EVU_Tibber reading020113JSON data_viewer_home_currentSubscription_priceInfo_today_12_tax
attr EVU_Tibber reading020113Name fc0_11_tax
attr EVU_Tibber reading020114JSON data_viewer_home_currentSubscription_priceInfo_today_12_total
attr EVU_Tibber reading020114Name fc0_11_total
attr EVU_Tibber reading020121JSON data_viewer_home_currentSubscription_priceInfo_today_13_energy
attr EVU_Tibber reading020121Name fc0_12_energy
attr EVU_Tibber reading020122JSON data_viewer_home_currentSubscription_priceInfo_today_13_startsAt
attr EVU_Tibber reading020122Name fc0_12_startsAt
attr EVU_Tibber reading020123JSON data_viewer_home_currentSubscription_priceInfo_today_13_tax
attr EVU_Tibber reading020123Name fc0_12_tax
attr EVU_Tibber reading020124JSON data_viewer_home_currentSubscription_priceInfo_today_13_total
attr EVU_Tibber reading020124Name fc0_12_total
attr EVU_Tibber reading020131JSON data_viewer_home_currentSubscription_priceInfo_today_14_energy
attr EVU_Tibber reading020131Name fc0_13_energy
attr EVU_Tibber reading020132JSON data_viewer_home_currentSubscription_priceInfo_today_14_startsAt
attr EVU_Tibber reading020132Name fc0_13_startsAt
attr EVU_Tibber reading020133JSON data_viewer_home_currentSubscription_priceInfo_today_14_tax
attr EVU_Tibber reading020133Name fc0_13_tax
attr EVU_Tibber reading020134JSON data_viewer_home_currentSubscription_priceInfo_today_14_total
attr EVU_Tibber reading020134Name fc0_13_total
attr EVU_Tibber reading020141JSON data_viewer_home_currentSubscription_priceInfo_today_15_energy
attr EVU_Tibber reading020141Name fc0_14_energy
attr EVU_Tibber reading020142JSON data_viewer_home_currentSubscription_priceInfo_today_15_startsAt
attr EVU_Tibber reading020142Name fc0_14_startsAt
attr EVU_Tibber reading020143JSON data_viewer_home_currentSubscription_priceInfo_today_15_tax
attr EVU_Tibber reading020143Name fc0_14_tax
attr EVU_Tibber reading020144JSON data_viewer_home_currentSubscription_priceInfo_today_15_total
attr EVU_Tibber reading020144Name fc0_14_total
attr EVU_Tibber reading020151JSON data_viewer_home_currentSubscription_priceInfo_today_16_energy
attr EVU_Tibber reading020151Name fc0_15_energy
attr EVU_Tibber reading020152JSON data_viewer_home_currentSubscription_priceInfo_today_16_startsAt
attr EVU_Tibber reading020152Name fc0_15_startsAt
attr EVU_Tibber reading020153JSON data_viewer_home_currentSubscription_priceInfo_today_16_tax
attr EVU_Tibber reading020153Name fc0_15_tax
attr EVU_Tibber reading020154JSON data_viewer_home_currentSubscription_priceInfo_today_16_total
attr EVU_Tibber reading020154Name fc0_15_total
attr EVU_Tibber reading020161JSON data_viewer_home_currentSubscription_priceInfo_today_17_energy
attr EVU_Tibber reading020161Name fc0_16_energy
attr EVU_Tibber reading020162JSON data_viewer_home_currentSubscription_priceInfo_today_17_startsAt
attr EVU_Tibber reading020162Name fc0_16_startsAt
attr EVU_Tibber reading020163JSON data_viewer_home_currentSubscription_priceInfo_today_17_tax
attr EVU_Tibber reading020163Name fc0_16_tax
attr EVU_Tibber reading020164JSON data_viewer_home_currentSubscription_priceInfo_today_17_total
attr EVU_Tibber reading020164Name fc0_16_total
attr EVU_Tibber reading020171JSON data_viewer_home_currentSubscription_priceInfo_today_18_energy
attr EVU_Tibber reading020171Name fc0_17_energy
attr EVU_Tibber reading020172JSON data_viewer_home_currentSubscription_priceInfo_today_18_startsAt
attr EVU_Tibber reading020172Name fc0_17_startsAt
attr EVU_Tibber reading020173JSON data_viewer_home_currentSubscription_priceInfo_today_18_tax
attr EVU_Tibber reading020173Name fc0_17_tax
attr EVU_Tibber reading020174JSON data_viewer_home_currentSubscription_priceInfo_today_18_total
attr EVU_Tibber reading020174Name fc0_17_total
attr EVU_Tibber reading020181JSON data_viewer_home_currentSubscription_priceInfo_today_19_energy
attr EVU_Tibber reading020181Name fc0_18_energy
attr EVU_Tibber reading020182JSON data_viewer_home_currentSubscription_priceInfo_today_19_startsAt
attr EVU_Tibber reading020182Name fc0_18_startsAt
attr EVU_Tibber reading020183JSON data_viewer_home_currentSubscription_priceInfo_today_19_tax
attr EVU_Tibber reading020183Name fc0_18_tax
attr EVU_Tibber reading020184JSON data_viewer_home_currentSubscription_priceInfo_today_19_total
attr EVU_Tibber reading020184Name fc0_18_total
attr EVU_Tibber reading020191JSON data_viewer_home_currentSubscription_priceInfo_today_20_energy
attr EVU_Tibber reading020191Name fc0_19_energy
attr EVU_Tibber reading020192JSON data_viewer_home_currentSubscription_priceInfo_today_20_startsAt
attr EVU_Tibber reading020192Name fc0_19_startsAt
attr EVU_Tibber reading020193JSON data_viewer_home_currentSubscription_priceInfo_today_20_tax
attr EVU_Tibber reading020193Name fc0_19_tax
attr EVU_Tibber reading020194JSON data_viewer_home_currentSubscription_priceInfo_today_20_total
attr EVU_Tibber reading020194Name fc0_19_total
attr EVU_Tibber reading020201JSON data_viewer_home_currentSubscription_priceInfo_today_21_energy
attr EVU_Tibber reading020201Name fc0_20_energy
attr EVU_Tibber reading020202JSON data_viewer_home_currentSubscription_priceInfo_today_21_startsAt
attr EVU_Tibber reading020202Name fc0_20_startsAt
attr EVU_Tibber reading020203JSON data_viewer_home_currentSubscription_priceInfo_today_21_tax
attr EVU_Tibber reading020203Name fc0_20_tax
attr EVU_Tibber reading020204JSON data_viewer_home_currentSubscription_priceInfo_today_21_total
attr EVU_Tibber reading020204Name fc0_20_total
attr EVU_Tibber reading020211JSON data_viewer_home_currentSubscription_priceInfo_today_22_energy
attr EVU_Tibber reading020211Name fc0_21_energy
attr EVU_Tibber reading020212JSON data_viewer_home_currentSubscription_priceInfo_today_22_startsAt
attr EVU_Tibber reading020212Name fc0_21_startsAt
attr EVU_Tibber reading020213JSON data_viewer_home_currentSubscription_priceInfo_today_22_tax
attr EVU_Tibber reading020213Name fc0_21_tax
attr EVU_Tibber reading020214JSON data_viewer_home_currentSubscription_priceInfo_today_22_total
attr EVU_Tibber reading020214Name fc0_21_total
attr EVU_Tibber reading020221JSON data_viewer_home_currentSubscription_priceInfo_today_23_energy
attr EVU_Tibber reading020221Name fc0_22_energy
attr EVU_Tibber reading020222JSON data_viewer_home_currentSubscription_priceInfo_today_23_startsAt
attr EVU_Tibber reading020222Name fc0_22_startsAt
attr EVU_Tibber reading020223JSON data_viewer_home_currentSubscription_priceInfo_today_23_tax
attr EVU_Tibber reading020223Name fc0_22_tax
attr EVU_Tibber reading020224JSON data_viewer_home_currentSubscription_priceInfo_today_23_total
attr EVU_Tibber reading020224Name fc0_22_total
attr EVU_Tibber reading020231JSON data_viewer_home_currentSubscription_priceInfo_today_24_energy
attr EVU_Tibber reading020231Name fc0_23_energy
attr EVU_Tibber reading020232JSON data_viewer_home_currentSubscription_priceInfo_today_24_startsAt
attr EVU_Tibber reading020232Name fc0_23_startsAt
attr EVU_Tibber reading020233JSON data_viewer_home_currentSubscription_priceInfo_today_24_tax
attr EVU_Tibber reading020233Name fc0_23_tax
attr EVU_Tibber reading020234JSON data_viewer_home_currentSubscription_priceInfo_today_24_total
attr EVU_Tibber reading020234Name fc0_23_total
attr EVU_Tibber reading021001JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_energy
attr EVU_Tibber reading021001Name fc1_00_energy
attr EVU_Tibber reading021002JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_startsAt
attr EVU_Tibber reading021002Name fc1_00_startsAt
attr EVU_Tibber reading021003JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_tax
attr EVU_Tibber reading021003Name fc1_00_tax
attr EVU_Tibber reading021004JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_01_total
attr EVU_Tibber reading021004Name fc1_00_total
attr EVU_Tibber reading021011JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_energy
attr EVU_Tibber reading021011Name fc1_01_energy
attr EVU_Tibber reading021012JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_startsAt
attr EVU_Tibber reading021012Name fc1_01_startsAt
attr EVU_Tibber reading021013JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_tax
attr EVU_Tibber reading021013Name fc1_01_tax
attr EVU_Tibber reading021014JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_02_total
attr EVU_Tibber reading021014Name fc1_01_total
attr EVU_Tibber reading021021JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_energy
attr EVU_Tibber reading021021Name fc1_02_energy
attr EVU_Tibber reading021022JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_startsAt
attr EVU_Tibber reading021022Name fc1_02_startsAt
attr EVU_Tibber reading021023JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_tax
attr EVU_Tibber reading021023Name fc1_02_tax
attr EVU_Tibber reading021024JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_03_total
attr EVU_Tibber reading021024Name fc1_02_total
attr EVU_Tibber reading021031JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_energy
attr EVU_Tibber reading021031Name fc1_03_energy
attr EVU_Tibber reading021032JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_startsAt
attr EVU_Tibber reading021032Name fc1_03_startsAt
attr EVU_Tibber reading021033JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_tax
attr EVU_Tibber reading021033Name fc1_03_tax
attr EVU_Tibber reading021034JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_04_total
attr EVU_Tibber reading021034Name fc1_03_total
attr EVU_Tibber reading021041JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_energy
attr EVU_Tibber reading021041Name fc1_04_energy
attr EVU_Tibber reading021042JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_startsAt
attr EVU_Tibber reading021042Name fc1_04_startsAt
attr EVU_Tibber reading021043JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_tax
attr EVU_Tibber reading021043Name fc1_04_tax
attr EVU_Tibber reading021044JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_05_total
attr EVU_Tibber reading021044Name fc1_04_total
attr EVU_Tibber reading021051JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_energy
attr EVU_Tibber reading021051Name fc1_05_energy
attr EVU_Tibber reading021052JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_startsAt
attr EVU_Tibber reading021052Name fc1_05_startsAt
attr EVU_Tibber reading021053JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_tax
attr EVU_Tibber reading021053Name fc1_05_tax
attr EVU_Tibber reading021054JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_06_total
attr EVU_Tibber reading021054Name fc1_05_total
attr EVU_Tibber reading021061JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_energy
attr EVU_Tibber reading021061Name fc1_06_energy
attr EVU_Tibber reading021062JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_startsAt
attr EVU_Tibber reading021062Name fc1_06_startsAt
attr EVU_Tibber reading021063JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_tax
attr EVU_Tibber reading021063Name fc1_06_tax
attr EVU_Tibber reading021064JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_07_total
attr EVU_Tibber reading021064Name fc1_06_total
attr EVU_Tibber reading021071JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_energy
attr EVU_Tibber reading021071Name fc1_07_energy
attr EVU_Tibber reading021072JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_startsAt
attr EVU_Tibber reading021072Name fc1_07_startsAt
attr EVU_Tibber reading021073JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_tax
attr EVU_Tibber reading021073Name fc1_07_tax
attr EVU_Tibber reading021074JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_08_total
attr EVU_Tibber reading021074Name fc1_07_total
attr EVU_Tibber reading021081JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_energy
attr EVU_Tibber reading021081Name fc1_08_energy
attr EVU_Tibber reading021082JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_startsAt
attr EVU_Tibber reading021082Name fc1_08_startsAt
attr EVU_Tibber reading021083JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_tax
attr EVU_Tibber reading021083Name fc1_08_tax
attr EVU_Tibber reading021084JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_09_total
attr EVU_Tibber reading021084Name fc1_08_total
attr EVU_Tibber reading021091JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_energy
attr EVU_Tibber reading021091Name fc1_09_energy
attr EVU_Tibber reading021092JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_startsAt
attr EVU_Tibber reading021092Name fc1_09_startsAt
attr EVU_Tibber reading021093JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_tax
attr EVU_Tibber reading021093Name fc1_09_tax
attr EVU_Tibber reading021094JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_10_total
attr EVU_Tibber reading021094Name fc1_09_total
attr EVU_Tibber reading021101JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_energy
attr EVU_Tibber reading021101Name fc1_10_energy
attr EVU_Tibber reading021102JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_startsAt
attr EVU_Tibber reading021102Name fc1_10_startsAt
attr EVU_Tibber reading021103JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_tax
attr EVU_Tibber reading021103Name fc1_10_tax
attr EVU_Tibber reading021104JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_11_total
attr EVU_Tibber reading021104Name fc1_10_total
attr EVU_Tibber reading021111JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_energy
attr EVU_Tibber reading021111Name fc1_11_energy
attr EVU_Tibber reading021112JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_startsAt
attr EVU_Tibber reading021112Name fc1_11_startsAt
attr EVU_Tibber reading021113JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_tax
attr EVU_Tibber reading021113Name fc1_11_tax
attr EVU_Tibber reading021114JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_12_total
attr EVU_Tibber reading021114Name fc1_11_total
attr EVU_Tibber reading021121JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_energy
attr EVU_Tibber reading021121Name fc1_12_energy
attr EVU_Tibber reading021122JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_startsAt
attr EVU_Tibber reading021122Name fc1_12_startsAt
attr EVU_Tibber reading021123JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_tax
attr EVU_Tibber reading021123Name fc1_12_tax
attr EVU_Tibber reading021124JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_13_total
attr EVU_Tibber reading021124Name fc1_12_total
attr EVU_Tibber reading021131JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_energy
attr EVU_Tibber reading021131Name fc1_13_energy
attr EVU_Tibber reading021132JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_startsAt
attr EVU_Tibber reading021132Name fc1_13_startsAt
attr EVU_Tibber reading021133JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_tax
attr EVU_Tibber reading021133Name fc1_13_tax
attr EVU_Tibber reading021134JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_14_total
attr EVU_Tibber reading021134Name fc1_13_total
attr EVU_Tibber reading021141JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_energy
attr EVU_Tibber reading021141Name fc1_14_energy
attr EVU_Tibber reading021142JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_startsAt
attr EVU_Tibber reading021142Name fc1_14_startsAt
attr EVU_Tibber reading021143JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_tax
attr EVU_Tibber reading021143Name fc1_14_tax
attr EVU_Tibber reading021144JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_15_total
attr EVU_Tibber reading021144Name fc1_14_total
attr EVU_Tibber reading021151JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_energy
attr EVU_Tibber reading021151Name fc1_15_energy
attr EVU_Tibber reading021152JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_startsAt
attr EVU_Tibber reading021152Name fc1_15_startsAt
attr EVU_Tibber reading021153JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_tax
attr EVU_Tibber reading021153Name fc1_15_tax
attr EVU_Tibber reading021154JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_16_total
attr EVU_Tibber reading021154Name fc1_15_total
attr EVU_Tibber reading021161JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_energy
attr EVU_Tibber reading021161Name fc1_16_energy
attr EVU_Tibber reading021162JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_startsAt
attr EVU_Tibber reading021162Name fc1_16_startsAt
attr EVU_Tibber reading021163JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_tax
attr EVU_Tibber reading021163Name fc1_16_tax
attr EVU_Tibber reading021164JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_17_total
attr EVU_Tibber reading021164Name fc1_16_total
attr EVU_Tibber reading021171JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_energy
attr EVU_Tibber reading021171Name fc1_17_energy
attr EVU_Tibber reading021172JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_startsAt
attr EVU_Tibber reading021172Name fc1_17_startsAt
attr EVU_Tibber reading021173JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_tax
attr EVU_Tibber reading021173Name fc1_17_tax
attr EVU_Tibber reading021174JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_18_total
attr EVU_Tibber reading021174Name fc1_17_total
attr EVU_Tibber reading021181JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_energy
attr EVU_Tibber reading021181Name fc1_18_energy
attr EVU_Tibber reading021182JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_startsAt
attr EVU_Tibber reading021182Name fc1_18_startsAt
attr EVU_Tibber reading021183JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_tax
attr EVU_Tibber reading021183Name fc1_18_tax
attr EVU_Tibber reading021184JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_19_total
attr EVU_Tibber reading021184Name fc1_18_total
attr EVU_Tibber reading021191JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_energy
attr EVU_Tibber reading021191Name fc1_19_energy
attr EVU_Tibber reading021192JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_startsAt
attr EVU_Tibber reading021192Name fc1_19_startsAt
attr EVU_Tibber reading021193JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_tax
attr EVU_Tibber reading021193Name fc1_19_tax
attr EVU_Tibber reading021194JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_20_total
attr EVU_Tibber reading021194Name fc1_19_total
attr EVU_Tibber reading021201JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_energy
attr EVU_Tibber reading021201Name fc1_20_energy
attr EVU_Tibber reading021202JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_startsAt
attr EVU_Tibber reading021202Name fc1_20_startsAt
attr EVU_Tibber reading021203JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_tax
attr EVU_Tibber reading021203Name fc1_20_tax
attr EVU_Tibber reading021204JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_21_total
attr EVU_Tibber reading021204Name fc1_20_total
attr EVU_Tibber reading021211JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_energy
attr EVU_Tibber reading021211Name fc1_21_energy
attr EVU_Tibber reading021212JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_startsAt
attr EVU_Tibber reading021212Name fc1_21_startsAt
attr EVU_Tibber reading021213JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_tax
attr EVU_Tibber reading021213Name fc1_21_tax
attr EVU_Tibber reading021214JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_22_total
attr EVU_Tibber reading021214Name fc1_21_total
attr EVU_Tibber reading021221JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_energy
attr EVU_Tibber reading021221Name fc1_22_energy
attr EVU_Tibber reading021222JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_startsAt
attr EVU_Tibber reading021222Name fc1_22_startsAt
attr EVU_Tibber reading021223JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_tax
attr EVU_Tibber reading021223Name fc1_22_tax
attr EVU_Tibber reading021224JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_23_total
attr EVU_Tibber reading021224Name fc1_22_total
attr EVU_Tibber reading021231JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_energy
attr EVU_Tibber reading021231Name fc1_23_energy
attr EVU_Tibber reading021232JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_startsAt
attr EVU_Tibber reading021232Name fc1_23_startsAt
attr EVU_Tibber reading021233JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_tax
attr EVU_Tibber reading021233Name fc1_23_tax
attr EVU_Tibber reading021234JSON data_viewer_home_currentSubscription_priceInfo_tomorrow_24_total
attr EVU_Tibber reading021234Name fc1_23_total
attr EVU_Tibber reading1JSON data_viewer_home_currentSubscription_priceInfo_current_total
attr EVU_Tibber reading1Name Strompreis
attr EVU_Tibber reading1OExpr $val*100
attr EVU_Tibber reading2-1Name Datum
attr EVU_Tibber reading2-2Name Uhrzeit
attr EVU_Tibber reading2JSON data_viewer_homes_01_currentSubscription_priceInfo_current_startsAt
attr EVU_Tibber reading2Regex startsAt":"([\d+-]+)T(\d\d:\d\d)
attr EVU_Tibber replacement01Mode reading
attr EVU_Tibber replacement01Regex %%token%%
attr EVU_Tibber replacement01Value token
attr EVU_Tibber replacement02Mode reading
attr EVU_Tibber replacement02Regex %%homeID%%
attr EVU_Tibber replacement02Value homeID
attr EVU_Tibber requestData { "query": "{viewer {home(id:\"%%homeID%%b\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
attr EVU_Tibber requestHeader1 Content-Type: application/json
attr EVU_Tibber requestHeader2 Authorization: Bearer %%token%%
attr EVU_Tibber room Strom->Photovoltaik
attr EVU_Tibber showBody 1
attr EVU_Tibber showError 1
attr EVU_Tibber sortby 313
attr EVU_Tibber verbose 0

Um mit den vielen readings klar zu kommen habe ich einen Nummern Code

reading020001JSON

02      gehört zum get02
[0|1]   ist für heute oder morgen
[00-23] ist die Stunde
[1-4]   das jeweilige reading fon der Stunde


MEGA !

Danke für deine Vorlage, habe es damit zum laufen gebracht :-) Mit der Abfrage der 03_consumption Werte wird aber aktuell noch keine Readings gesetzt, oder? Was ich hier mega finden würde, ist wenn diese der Vergangenen Stunden des Tages zugeordnet werden würden. Bist du bzgl. Extraktion der Konsumtion Daten schon weiter?

Grüße Timo
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 März 2023, 14:55:32
Zitat von: TimoD am 15 März 2023, 14:33:48
MEGA !

Danke für deine Vorlage, habe es damit zum laufen gebracht :-) Mit der Abfrage der 03_consumption Werte wird aber aktuell noch keine Readings gesetzt, oder? Was ich hier mega finden würde, ist wenn diese der Vergangenen Stunden des Tages zugeordnet werden würden. Bist du bzgl. Extraktion der Konsumtion Daten schon weiter?

Grüße Timo
Hallo Timo,
wie gesagt, ich habe noch kein Tibber, würde es mir aber anschauen.

EDIT:
Du hast recht, es werden keine readings geschrieben, da es ein ziemlich langer Report ist.
Hättest Du ein Beispiel mit z.B. Deinen orignal Daten und einem Muster, wie es als readings erscheinen sollte?

EDIT2:
Ich habe damit bereits begonnen, jedoch gibt es noch ein Problem mit dem lesen der JSON Antwort (https://forum.fhem.de/index.php/topic,45176.msg1268319.html#msg1268319).
Wenn das dann fertig wäre, würde man stündlich den von Tibber berechneten Preis abfragen und diesen dann in die DbLog schreiben.
Dadurch könnte man dann eine Auswertung und Graphen erstellen.


VG   Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: octek0815 am 15 März 2023, 17:46:56
Moin,

wo muss ich den Token hinterlegen?

Grüße
Olli
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 März 2023, 18:15:56
Zitat von: octek0815 am 15 März 2023, 17:46:56
wo muss ich den Token hinterlegen?
Das steht schon hier :-) (https://forum.fhem.de/index.php/topic,130407.msg1267979.html#msg1267979)
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: octek0815 am 15 März 2023, 18:17:28
Zitat von: ch.eick am 15 März 2023, 18:15:56
Das steht schon hier :-) (https://forum.fhem.de/index.php/topic,130407.msg1267979.html#msg1267979)

Sorry, war zu schnell mit dem Schreiben, habe ich auch schone gelesen.
Aber wie kann ich die HomeID auslesen?
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 März 2023, 18:21:33
Zitat von: octek0815 am 15 März 2023, 18:17:28
Sorry, war zu schnell mit dem Schreiben, habe ich auch schone gelesen.
Aber wie kann ich die HomeID auslesen?
Ich meine, das wäre auch bereits weiter vorne beschrieben, ich finde es nur gerade nicht ;-)

EDIT: And here we go (https://forum.fhem.de/index.php/topic,130407.msg1251532/topicseen.html#msg1251532)
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Butzel am 15 März 2023, 18:29:57
Zitat von: Prof. Dr. Peter Henning am 14 März 2023, 19:46:07
Bitte mal die Dokumenation zu FHEM lesen. Keines der Gerätemodule erstellt eigene Logs oder Graphen.

LG

pah

Gerne schaue ich mal nach. Ich habe so tolle Module bei mir integriert. Falls es wider Erwarten nicht vorhanden sein sollte, so kann man es gerne als Anregung aufnehmen.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: octek0815 am 15 März 2023, 18:51:23
Zitat von: ch.eick am 15 März 2023, 18:21:33
Ich meine, das wäre auch bereits weiter vorne beschrieben, ich finde es nur gerade nicht ;-)

EDIT: And here we go (https://forum.fhem.de/index.php/topic,130407.msg1251532/topicseen.html#msg1251532)

Habs raus...

Im GraphiQL mit folgendem abfragen


{
  viewer {
    homes {
      id
    }
  }
}


Trotzdem danke.
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: ch.eick am 16 März 2023, 12:24:21
Hallo zusammen,

ich habe hier mal die Device Definition aktualisiert. (https://forum.fhem.de/index.php/topic,130407.msg1264655.html#msg1264655)

Mit einem regelmäßigen start von "get 03_consumption_hour" kann man damit die letzte von Tibber berechnete Stunde abrufen und loggen.
Für DbLog, mit MySQL, wird dabei im userReading direkt mit dem richtigen TIMESTAMP in die Datenbank geschrieben.
Bei FileLog wäre auf das richtige Timing zu achten, damit Ihr den Eintrag dann richtig zuordnen könnt. Nach meiner Meinung macht aber im
Strom Geschäft auf jeden fall eine Datenbank sinn.

Bitte testet den TIMESTAMP, damit ich das noch korrigieren kann, ich denke ich liege da im Moment noch falsch.
Auch für die Berechnung des "Strompreis" bräuchte ich mal eine Rückmeldung, da ich vermute, dass "$val *100" sicherlich nicht korrekt ist.

VG  Christian
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Prof. Dr. Peter Henning am 16 März 2023, 19:05:07
ZitatGerne schaue ich mal nach. Ich habe so tolle Module bei mir integriert. Falls es wider Erwarten nicht vorhanden sein sollte, so kann man es gerne als Anregung aufnehmen.
Nicht doch. Grafiken und Logs werden _nicht_ von den Gerätemodulen erzeugt.

LG

pah
Titel: Antw:Tibber & Tibber Pulse
Beitrag von: Butzel am 17 März 2023, 07:28:08
Guten Morgen,

dann habe ich mich anscheinend falsch ausgedrückt. Die Anregung halte ich aufrecht.

Viele Grüße
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: TimoD am 27 März 2023, 15:37:43
Zitat von: ch.eick am 20 Februar 2023, 17:16:05
Zitat von: TimoD am 20 Februar 2023, 13:40:39Also ich habe nun heute meinen Tarif bei Tibber abgeschlossen.

Konfiguration, ähnlich PV Anlage mit Speicher, 2x e-Auto und eigentlich auch ziemlich autark. Bei Interesse kann ich gerne über meine Erfahrungen inkl. PULSE stündlicher Abrechnung berichten.

Denn HTTPMOD zur Abfrage habe ich hinbekommen:

Jetzt würde ich gerne mit Regex alle data_viewer_homes_01_currentSubscription_priceInfo_today_08_startsAt.* in die eigentliche Uhrzeit zerlegen. (Zur not wüsste ich wie ich das über userreadings macht) könnt Ihr mir hier weiterhelfen?
Hallo Timo,
hier wäre dann mal meine Definition, jedoch nur mit dem Test Konto ausprobiert.

Es gibt bisher vier get Aufrufe, die man z.B. mit einem DOIF triggern könnte.
01_priceInfo
02_priceall
03_consumption_hourly_100
04_address
Hierbei setzen 01_priceInfo und auch 01_priceInfo beide den aktuellen Preis und Datum, sowie Uhrzeit.

Beim 02_priceall werden die readings für heute und morgen geschrieben.
Ich habe die reading Namen an andere Devices im FHEM angeglichen:
fc0_00_*    ist der Forecast, wobei 0 für heute steht und 00 bis 23 die jeweilige Stunde ist
fc1_00_*    wäre dann für morgen

Eventuell könnte man noch die *startsAt weg lassen, da das ja im reading Namen mit der Stunde enthalten ist. Unter Datum und Uhrzeit wäre der Rest an Information.
Die consumption habe ich noch nicht aufgedröselt, da wären Vorschläge gerne gesehen. Auch die Adresse ist noch nicht eingelesen, falls das jemand haben möchte.

VG  Christian

UPDATE 20230316
- Die get Definitionen wurden erweitert und haben sich in der Nummerierung verschoben
- 03_consumtion_hour holt die letzte Preisberechnung. Achtung, bitte prüft mal die Zuordnung der Uhrzeit, wegen der timezone Anzeige.
- im userReading wird die letzte Preisberechnung in die DbLog geschrieben.
  Dafür muss noch ein DbRep Device definiert werden.
  Wenn Ihr kein DbLog mit MySQL verwendet muss das userReading nodes_to_TIMESTAMP gelöscht werden, oder aber auch für andere Datenbanken geändert werden.

DbRep Device
defmod LogDBRep_<Tibber Device Name>_SQL DbRep <DbLog Device Name>
attr LogDBRep_<Tibber Device Name>_SQL DbLogExclude .*
attr LogDBRep_<Tibber Device Name>_SQL room System
attr LogDBRep_<Tibber Device Name>_SQL sqlCmdHistoryLength 5

Tibber Device
defmod EVU_Tibber HTTPMOD https://api.tibber.com/v1-beta/gql 0
attr EVU_Tibber DbLogExclude .*
attr EVU_Tibber comment Version 2023.03.16 12:00 \
https://developer.tibber.com/explorer
attr EVU_Tibber enableControlSet 1
....

Bin gerade an der erneuten Einrichtung, das es bei mir funktioniert benötigen die beiden attr
replacement01 & 02 Mode text
Melde mich wie es weiter geht :-)

Edit1: Also es scheint alles soweit zu funktionieren.

Was die Abfragen angeht.

Allerdings kenne ich mich mit dem dblog nicht aus, kannst du mir erklären, was folgendes macht:
defmod LogDBRep_EVU_Tibber_SQL DbRep logdb
attr LogDBRep_EVU_Tibber_SQL DbLogExclude .*
attr LogDBRep_EVU_Tibber_SQL room System
attr LogDBRep_EVU_Tibber_SQL sqlCmdHistoryLength 5

Und wie ich daraus z.B. in FTUI3 ein Plot erzeugen kann?
Und was folgendes macht:
nodes_to_TIMESTAMP:nodes_cost.* {
my $timestamp =sprintf("%s %s:00",ReadingsVal("$NAME","nodes_to_date","0000-00-00"),
                                                    ReadingsVal("$NAME","nodes_to_hour",0)+ReadingsVal("$NAME","nodes_to_timezone",0) );
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                  INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
                    VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".ReadingsVal("$NAME","nodes_cost","null")."')
                  ON DUPLICATE KEY UPDATE
                    VALUE='".ReadingsVal("$NAME","nodes_cost","null")."';") ;
$timestamp;
}
-> Muss ich diesem Code noch anpassen, wie mein dblog Device heißt?

Was ich zusätzlich gerne hätte, ich würde gerne die zukünftigen Strompreise auch ein einem Plot darstellen, wie muss ich den die Werte fc0_xx_total in ein Plot schreiben, dass ich mir diese anzeigen lassen kann?

Vorab vielen Dank für deine MEGA Arbeit :-)
Grüße Timo

Edit 2:
Und ich würde sagen die Timestamps passen noch nicht, wenn ich get03 mache, bekomme ich um 15:58 die Kostenangezeigt für 17 Uhr, müssten ja aber 14 Uhr sein, oder?

Muss ich denn jetzt eigentlich noch die Abfrage 03 zyklisch einmal in der Stunde aufrufen?

Edit 3: Ich bin nun in der Lage für mein Proplanta Device nach dieser Anleitung LINK (https://forum.fhem.de/index.php?topic=75885.0) die Vorhersage zu plotten, dass dies auch für das Tibber Device möglich ist, wird dann wohl eine Sub-Func benötigt, folgendes habe ich versucht, leider klappt das noch nicht:

sub logProxy_Tibber2Plot($$$$) {
my ($device, $fcValue, $from, $to) = @_;
my @rl;

return undef if( !$device );

if( defined($defs{$device}) ) {
if( $defs{$device}{TYPE} eq "HTTPMOD" ) {
@rl = sort( grep /^fc.*_$..${fcValue}/,keys %{$defs{$device}{READINGS}} );
return undef if( !@rl );
} else {
Log3 undef, 2, "logProxy_proplanta2Plot: $device is not a PROPLANTA device";
return undef;
}
}

my $fromsec = SVG_time_to_sec($from);
my $tosec   = SVG_time_to_sec($to);
my $sec = $fromsec;
my ($h,$fcDay,$mday,$mon,$year);
my $timestamp;
   
my $reading;
my $value;
my $prev_value;
my $min = 999999;
my $max = -999999;
my $ret = "";

# while not end of plot range reached
while(($sec < $tosec) && @rl) {
#remember previous value for start of plot range
$prev_value = $value;

$reading = shift @rl;
                $reading =~ m/^fc([\d]+)_$([\d]+)${fcValue}/;
                $fcDay = $1;
                $h = $2;
$value = ReadingsVal($device,$reading,undef);
       
($mday,$mon,$year) = split('\.',ReadingsVal($device,"fc".$fcDay."_".$h."_startsAt",undef));
$timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $year, $mon, $mday, $h, 0, 0);
$sec = SVG_time_to_sec($timestamp);
       
# skip all values before start of plot range
next if( SVG_time_to_sec($timestamp) < $fromsec );

# add first value at start of plot range
if( !$ret && $prev_value ) {
$min = $prev_value if( $prev_value < $min );
$max = $prev_value if( $prev_value > $max );
$ret .= "$from $prev_value\n";
}

# done if after end of plot range
last if( SVG_time_to_sec($timestamp) > $tosec );

$min = $value if( $value < $min );
$max = $value if( $value > $max );

# add actual controll point
$ret .= "$timestamp $value\n";
}
return ($ret,$min,$max,$prev_value);
}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 28 März 2023, 18:13:50
ZitatEdit1: Also es scheint alles soweit zu funktionieren.

Was die Abfragen angeht.
Das ist schon mal gut.

ZitatAllerdings kenne ich mich mit dem dblog nicht aus, kannst du mir erklären, was folgendes macht:
Das DbLog Device alleine macht erstmal gar nichts, es dient der Kommunikation aus FHEM zur Datenbank.
Das userReading ruft dann aus dem Perlcode dieses DbRep auf und lässt den SQL Code in der Datenbank ausführen.

ZitatMuss ich diesem Code noch anpassen, wie mein dblog Device heißt?
Wenn Du die Devices umbenennst, musst Du auch den Code anpassen.
Ich habe versucht es etwas generischer zu machen. An dieser Stelle wird der Name des DbRep devices generiert.
LogDBRep_".$NAME."_SQL

ZitatUnd wie ich daraus z.B. in FTUI3 ein Plot erzeugen kann?
Die Daten für den Plot befinden sich in der Datenbank.

ZitatWas ich zusätzlich gerne hätte, ich würde gerne die zukünftigen Strompreise auch ein einem Plot darstellen, wie muss ich den die Werte fc0_xx_total in ein Plot schreiben, dass ich mir diese anzeigen lassen kann?
Wenn die Abfrage von Tibber stündlich erfolgt sollte durch das userReading der Wert nodes_cost mit dem korrekten Zeitstempel in die Datenbank geschrieben werden. Das wäre ein Beispiel, wie man sowas machen kann. Dieser Umweg ist erforderlich, damit der Wert in der Datenbank nicht einen automatischen TIMESTAMP bekommt, denn wäre irgendwann in der Folgestunde.

ZitatUnd ich würde sagen die Timestamps passen noch nicht, wenn ich get03 mache, bekomme ich um 15:58 die Kostenangezeigt für 17 Uhr, müssten ja aber 14 Uhr sein, oder?
Das war ja eine meiner Fragen, da ich selber keine Eecht Daten habe :-) Somit muss die Zeitberechnung im userReading geändert werden.
Wir müssen jetzt raus finden, ob der Zeitwert "nodes_to_date" passender wäre und was mit der "nodes_to_timezone" zu tun ist. Das wird dann in dieser Berechnung geändert.
my $timestamp =sprintf("%s %s:00",ReadingsVal("$NAME","nodes_to_date","0000-00-00"),
                                                    ReadingsVal("$NAME","nodes_to_hour",0)+ReadingsVal("$NAME","nodes_to_timezone",0) );

ZitatMuss ich denn jetzt eigentlich noch die Abfrage 03 zyklisch einmal in der Stunde aufrufen?
Ja, um kurz nach der Vollen Stunde wäre wohl passend, wenn da bereits die nodes_cost von Tibber bereit stehen.
Auch die fc0 und fc1 Werte müssen getriggert werden, was aber nicht jede Stunde passieren sollte.
Meisten baue ich ein DOIF im Perl Modus in dem ich soetwas triggere und auch meine Daten im FHEMWEB als Tabelle anzeige. Mit Pull Down Menüs habe ich dann auch die Möglichkeit einzelne Aktionen auch manuell zu starten. Hier im Wiki wären mal Beispielbilder. (https://wiki.fhem.de/wiki/Kostal_Plenticore_10_Plus)

ZitatEdit 3: Ich bin nun in der Lage für mein Proplanta Device nach dieser Anleitung LINK die Vorhersage zu plotten, dass dies auch für das Tibber Device möglich ist, wird dann wohl eine Sub-Func benötigt, folgendes habe ich versucht, leider klappt das noch nicht:
Mit logproxy kenne ich mich nicht aus, ich versuche immer erst die Daten richtig in die Datenbank zu schreiben und hole mir dann alles mit Grafana wieder raus. Bei einer MySQL SELECT abfrage kann man auch noch vieles korrigieren oder anders aufbereiten.
Wenn ich mir Deinen logproxy Code anschaue, wird damit wohl auch der TIMESTAMP entsprechend dem reading Namen korrigiert, was ich bereits vor dem Schreiben in die Datenbank mache. Aus fc0_hh wird bei mir ein "<Datum heute> hh:00:00" in die Datenbank geschrieben. Der Rest wird dann bei der Abfrage aus der Datenbank vom Grafana erledigt, also z.B. der Plot Zeitraum und was ansonsten noch so mit dem Plot zu tun hat.

ZitatWas ich zusätzlich gerne hätte, ich würde gerne die zukünftigen Strompreise auch in einem Plot darstellen, wie muss ich den die Werte fc0_xx_total in ein Plot schreiben, dass ich mir diese anzeigen lassen kann?
Die kannst Du im Tibber Device mit dem Attribut "DbLogInclude" über DbLog in die Datenbank schreiben lassen.
attr EVU_Tibber DbLogInclude fc.*_.*_total
Bei meiner PV-Leistungs Prognose schreibe ich mir jedoch auch die fc1 Werte mit einem Datum vom Folgetag in die Datenbank, wodurch ich dann am aktuellen Tag mit der Prognose vom Vortag vergleichen kann, da sich diese oftmals unterscheiden.
Ob Tibber auch die fc0 Werte im Vergleich zur fc1 Preisauskunft anpasst kann ich nicht sagen. Eigentlich dürfte das nicht sein, da ja die Preise 24h vorher bekannt gegeben werden.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Ollifant am 01 April 2023, 21:12:55
Hi Zusammen,

ich bin seit kurzem auch Tibber Kunde und habe inzwischen den Tibber Pulse in Betrieb genommen. Da dieser nun meinen IR Lesekopf ersetzt, möchte ich gerne den Gesamtverbrauch und die Gesamteinspeisung des Zählers weiterhin als Info abgreiefn und nun aus der Tibber API beziehen.

Im Tibber API Explorer kann ich über das Beispiel der Real Time Subscription diese Infos sehen (lastMeterConsumption, lastMeterProduction), aber verstehe leider nicht wie ich diese über das FHEM HTTPMOD abgreifen könnte.

Sofern ich das richtig verstanden habe, greifen die in diesem Beitrag genannten HTTPMOD Abfragen die Daten in Form von Queries ab. Die oben genannten Infos werden über einen kontinuierlichen Stream bereitgestellt. Kann man die HTTPMOD Abfragen so anpassen, dass sie die von mir gewünschten Infos auslesen können?

In der Tibber Schema Reference habe ich auf Anhieb auch keine alternativen Werte gefunden, die ich über ein Query auslesen könnte.

Wäre das von mir gewünschte möglich und wenn ja wie?

Danke und viele Grüße
Michael
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 03 April 2023, 11:23:18
Zitat von: Ollifant am 01 April 2023, 21:12:55Hi Zusammen,

ich bin seit kurzem auch Tibber Kunde und habe inzwischen den Tibber Pulse in Betrieb genommen. Da dieser nun meinen IR Lesekopf ersetzt, möchte ich gerne den Gesamtverbrauch und die Gesamteinspeisung des Zählers weiterhin als Info abgreiefn und nun aus der Tibber API beziehen.

Im Tibber API Explorer kann ich über das Beispiel der Real Time Subscription diese Infos sehen (lastMeterConsumption, lastMeterProduction), aber verstehe leider nicht wie ich diese über das FHEM HTTPMOD abgreifen könnte.

Sofern ich das richtig verstanden habe, greifen die in diesem Beitrag genannten HTTPMOD Abfragen die Daten in Form von Queries ab. Die oben genannten Infos werden über einen kontinuierlichen Stream bereitgestellt. Kann man die HTTPMOD Abfragen so anpassen, dass sie die von mir gewünschten Infos auslesen können?

In der Tibber Schema Reference habe ich auf Anhieb auch keine alternativen Werte gefunden, die ich über ein Query auslesen könnte.
Moin Michael,
das wurde schon mal weiter zu beginn beantwortet, bisher haben wir noch keinen Weg, um eine Dauer Session aufzubauen.
Somit können wir nicht die aktuellen, gestreamten Werte mitlesen. Mit dem HTTPMOD werden nur Abfragen zur API durchgeführt.

Eventuell könntest Du versuchen die Daten direkt lokal vom Tibber Pulse mit einem eigenen FHEM Device zu holen.

Hier habe ich bereits etwas für node-red gefunden (https://flows.nodered.org/node/node-red-contrib-tibber-api), was man eventuell als "Proxy" dazwischen schalten könnte.

EDIT: Ich habe gerade mal den node-red Flow ausprobiert und man kann darüber eine Session aufbauen, die die aktuellen Tibber Pulse Werte liefert.
Zitatpower,location=test,currency=SEK power=0,lastMeterConsumption=46158.47,accumulatedConsumption=19.684,accumulatedProduction=13.505,accumulatedCost=24.575738,accumulatedReward=18.294575,minPower=0,averagePower=1614.1,maxPower=5385,powerProduction=2066,minPowerProduction=0,maxPowerProduction=4102,lastMeterProduction=6597.485,powerFactor=0,voltagePhase1=228.9,voltagePhase2=228.9,voltagePhase3=230.5,currentL1=1.8,currentL2=5,currentL3=5.8
Mit etwas Geduld müsste man nun den Flow erweitern und z.B. die Werte mit mqtt zum FHEM senden, oder wie in der Demo direkt in eine Datenbank schreiben.
Um es dann ganz sauber zu implementieren würde man dann natürlich auch die jetzigen HTTPMOD API Aufrufe ins Node-Red überführen und dann im FHEM ein mqtt Device verwenden. Somit wäre dann der Node-Red Flow ein Proxy inklusiese der Tibber Pulse Session zum FHEM mqtt.

So, mit etwas clicky,clicky habe ich am ende des Flow mal mqtt verbunden und siehe da, mit autocreate war ein Device im FHEM, was die Tibber Pulse Daten entgegen nimmt. Das geschiet jedoch im Sekundentakt, aber ich habe den Node-Red Modul Schöpfer bereits mal angeschrieben, ob man das auf 1/Minute (konfigurierbar) bremsen könnte.

UPDATE: 20220403 16:30
Ich habe den Node-Red Flow schon etwas modifiziert und die Datenübergabe zum MQTT auf JSON verändert. Das lässt sich dann sehr schön im FHEM wieder entpacken und könnte so aussehen.
   READINGS:
     2023-04-03 15:14:55   IODev           MQTT2_FHEM_Server
     2023-04-03 16:28:56   I_L1            2.6
     2023-04-03 16:28:56   I_L2            3.5
     2023-04-03 16:28:56   I_L3            2.5
     2023-04-03 16:28:56   P_avg           1355.5
     2023-04-03 16:28:56   P_max           5385
     2023-04-03 16:28:56   P_min           0
     2023-04-03 16:28:56   U_L1            227.4
     2023-04-03 16:28:56   U_L2            226.7
     2023-04-03 16:28:56   U_L3            228.5
     2023-04-03 16:28:56   accumulatedConsumption 22.344
     2023-04-03 16:28:56   accumulatedCost 27.794746
     2023-04-03 16:28:56   accumulatedProduction 17.693
     2023-04-03 16:28:56   accumulatedReward 21.963537
     2023-04-03 16:28:56   currency        SEK
     2023-04-03 16:28:56   lastMeterConsumption 46161.13
     2023-04-03 16:28:56   lastMeterProduction 6601.673
     2023-04-03 16:28:56   location        test
     2023-04-03 16:28:56   maxPowerProduction 4102
     2023-04-03 16:28:56   meassurement    power
     2023-04-03 16:28:56   minPowerProduction 0
     2023-04-03 16:28:56   power           1222
     2023-04-03 16:28:56   powerFactor     0.793
     2023-04-03 16:28:56   powerProduction 0
Nur die reading Namen gefallen mir so noch nicht,denn leider macht jeder Hersteller wieder etwas anderes. Hättet Ihr da einen Vorschlag? Das I/P/U habe ich bereits geändert :-)

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 April 2023, 14:45:21
Achtung, all diese Updates sind weiter nach oben gerutscht und auf 5 Teile aufgeteilt. (https://forum.fhem.de/index.php?msg=1273368)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 11 April 2023, 08:59:10
Achtung, all diese Updates sind weiter nach oben gerutscht und auf 5 Teile aufgeteilt. (https://forum.fhem.de/index.php?msg=1273368)

UPDATE 20230411
Ich habe nochmal geringfügig Fehler korrigiert und das RAW ersetzt. (https://forum.fhem.de/index.php?msg=1271260)

Im Moment habe ich festgestellt, dass es bei z.B. 9 ct Einspeisevergütung kaum einen günstigen Preis zum Laden des Speichers geben würde, man könnte natürlich auch selber jede andere Einspeisevergütung eintragen und es damit etwas justieren. Ich denke im Herbst Winter, wo man das dann wirklich braucht,

< snip >

Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 16 April 2023, 13:40:26
Darstellung von Prognosedaten des Tages im Tibber-Device siehe:

https://forum.fhem.de/index.php?topic=132188.msg1272752#msg1272752
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: duu75 am 16 April 2023, 13:57:26
Zitat von: decaflo am 02 März 2023, 17:57:43
Zitat von: haneub am 02 Februar 2023, 20:21:07Hallo,
ich verwende im Moment einen eigenen USB IR-Kopf um meinen Stromzähler ca alle 30s auszulesen und damit die Leistung der go-e Wallbox an die Photovoltaikleistung anzupassen.
Funktioniert subba.
Nun möchte ich zu Tibber wechseln um in den energiereichen Zeiten im Winter auch zu laden. Bei Tibber wird der Tibber Kopf aber an die Stelle gesetzt, wo jetzt mein IR Lesekopf ist.

Wie bekomme ich die aktuelle Leistung alle ca. 30s in fhem wenn ein Tibber Pulse installiert ist?

Bei mir hängt an /dev/ttyUSB0 ein IR-Kopf am Stromzaehler und ein zweiter an /dev/ttyUSB1 ist verbunden mit dem Tibber Pulse. /dev/ttyUSB0 und /dev/ttyUSB1 sind über socat verbunden, das als MITM die übertragenen Daten an fhem ausleitet.
Zitat von: decaflo am 02 März 2023, 17:57:43
Zitat von: haneub am 02 Februar 2023, 20:21:07Hallo,
ich verwende im Moment einen eigenen USB IR-Kopf um meinen Stromzähler ca alle 30s auszulesen und damit die Leistung der go-e Wallbox an die Photovoltaikleistung anzupassen.
Funktioniert subba.
Nun möchte ich zu Tibber wechseln um in den energiereichen Zeiten im Winter auch zu laden. Bei Tibber wird der Tibber Kopf aber an die Stelle gesetzt, wo jetzt mein IR Lesekopf ist.

Wie bekomme ich die aktuelle Leistung alle ca. 30s in fhem wenn ein Tibber Pulse installiert ist?

Bei mir hängt an /dev/ttyUSB0 ein IR-Kopf am Stromzaehler und ein zweiter an /dev/ttyUSB1 ist verbunden mit dem Tibber Pulse. /dev/ttyUSB0 und /dev/ttyUSB1 sind über socat verbunden, das als MITM die übertragenen Daten an fhem ausleitet.

Kannst du das mal etwas näher erläutern?
Welche Hardware genau hast du am T.Pulse hängen um zu senden?
Und wie macht man das mit SOCAT und dem 1:1 Weiterleiten von einem Serial-Port zum anderen?

Habe selber die preiswerteste Version nur mit Phototransistor an einem CP2102 USB/UART dranhängen und logge so die OBIS Daten in FHEM.
Das würde ich gerne so belassen aber gleichzeitig auch Tibber Pulse nutzen können.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 16 April 2023, 22:29:42
Zitat von: duu75 am 16 April 2023, 13:57:26Kannst du das mal etwas näher erläutern?
Welche Hardware genau hast du am T.Pulse hängen um zu senden?
Und wie macht man das mit SOCAT und dem 1:1 Weiterleiten von einem Serial-Port zum anderen?

Habe selber die preiswerteste Version nur mit Phototransistor an einem CP2102 USB/UART dranhängen und logge so die OBIS Daten in FHEM.
Das würde ich gerne so belassen aber gleichzeitig auch Tibber Pulse nutzen können.

Ich will nächsten Monat ebenfalls zu Tibber mit Puls wechseln.

Z. Zt. lese ich meinen Stromzähler mit einer Diode und einem Widerstand am Tasmota aus: https://www.mwinklerblog.de/smarthome/aktoren-sensoren/stromz%C3%A4hler-digital/#Schaltplan

Ich habe heute mit einer weiteren IR-Diode am Steckboard experimentiert. Meine Idee ist das Signal am Fototransistor abzugreifen und mit einer weiteren IR-Diode zum Puls durchzuleiten.

In einem Monat weiß ich mehr. Am Steckboard hat es schon mal funktioniert, ggf. muss man einen Operationsverstärker/Transistor dazwischen hängen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 17 April 2023, 07:28:03
Wenn man Tibber Pulse als Lesekopf hat bekommt man von Tibber über einen Node-Red Stream die aktuellen Messwerte geliefert, das natürlich leider nur mit einer Internet Verbindung und nicht mehr lokal. Damit FHEM nicht sekündlich per MQTT neue readings bekommt habe ich das in Node-Red Flow auf 1/15 Sekunden gebremst.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 17 April 2023, 07:38:46
Zitat von: ch.eick am 17 April 2023, 07:28:03Wenn man Tibber Pulse als Lesekopf hat bekommt man von Tibber über einen Node-Red Stream die aktuellen Messwerte geliefert, das natürlich leider nur mit einer Internet Verbindung und nicht mehr lokal. Damit FHEM nicht sekündlich per MQTT neue readings bekommt habe ich das in Node-Red Flow auf 1/15 Sekunden gebremst.

ja, das habe ich schon gelesen. Dennoch wäre mir eine Unabhängigkeit von Tibber/Internet lieber.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 17 April 2023, 08:22:19
Zitat von: Damian am 17 April 2023, 07:38:46
Zitat von: ch.eick am 17 April 2023, 07:28:03Wenn man Tibber Pulse als Lesekopf hat bekommt man von Tibber über einen Node-Red Stream die aktuellen Messwerte geliefert, das natürlich leider nur mit einer Internet Verbindung und nicht mehr lokal. Damit FHEM nicht sekündlich per MQTT neue readings bekommt habe ich das in Node-Red Flow auf 1/15 Sekunden gebremst.

ja, das habe ich schon gelesen. Dennoch wäre mir eine Unabhängigkeit von Tibber/Internet lieber.
Ich habe ja kein Tibber :-) :-)
Bisher konnte ich noch nicht erkennen, dass ich dadurch etwas sparen würde.
Von April bis Oktober bin ich 100% Autark, im März waren es schon ca. 80%.
Somit bleiben mir im Jahr nur 2600 kWh um die höheren Zählergebüren in 64560 wieder rein zu holen, bevor ich dann sparen könnte.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 17 April 2023, 09:59:20
Zitat von: ch.eick am 17 April 2023, 08:18:53Hallo Damian,
kann ich das Diagramm später auch mit der uiTable kombinieren?  Hättest Du da mal den Beispiel Code?

VG  Christian

Klar, das ist ja noch einfacher. Du kannst direkt das Reading von Tibber in uiTable beim card-Aufruf nutzen, dann brauchst du den Umweg über ein zusätzliches DOIF nicht.

z. B. in uiTable:

card([EVU_Tibber:Strompreis:bar2day],undef,"",0,200,90,0,"SEK",undef,"1",",fixedscaling,,,,halfring")}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 17 April 2023, 10:09:21
Zitat von: ch.eick am 17 April 2023, 08:22:19Ich habe ja kein Tibber :-) :-)
Bisher konnte ich noch nicht erkennen, dass ich dadurch etwas sparen würde.
Von April bis Oktober bin ich 100% Autark, im März waren es schon ca. 80%.
Somit bleiben mir im Jahr nur 2600 kWh um die höheren Zählergebüren in 64560 wieder rein zu holen, bevor ich dann sparen könnte.

Ob sich ein Wechsel lohnt oder nicht, ist individuell zu entscheiden. Ich hatte bisher 40 Cent/kWh, da kann man beim Wechsel bis April 2024 (Preisbremse) nicht viel falsch machen, insb. wenn die monatliche Pauschale niedriger ist. Eine zweiwöchige Kündigungsfrist spricht auch für sich.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 17 April 2023, 14:51:58
Zitat von: Damian am 17 April 2023, 10:09:21
Zitat von: ch.eick am 17 April 2023, 08:22:19Ich habe ja kein Tibber :-) :-)
Bisher konnte ich noch nicht erkennen, dass ich dadurch etwas sparen würde.
Von April bis Oktober bin ich 100% Autark, im März waren es schon ca. 80%.
Somit bleiben mir im Jahr nur 2600 kWh um die höheren Zählergebüren in 64560 wieder rein zu holen, bevor ich dann sparen könnte.

Ob sich ein Wechsel lohnt oder nicht, ist individuell zu entscheiden. Ich hatte bisher 40 Cent/kWh, da kann man beim Wechsel bis April 2024 (Preisbremse) nicht viel falsch machen, insb. wenn die monatliche Pauschale niedriger ist. Eine zweiwöchige Kündigungsfrist spricht auch für sich.
Ich habe noch 26ct im Dezember abgeschlosse und das EVU hat noch nicht gekündigt.
Bei meiner PLZ sind auch recht hohe Netzentgelte, was ich von aWATTar her weiß. Tibber gibt mir da erst eine Aussage, wenn ich wechseln würde.
Aber Vorbereitung ist ja alles :-)

Und hier noch ein Bild der heutigen Weiterentwicklung
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Speedy68 am 19 April 2023, 17:41:55
Zitat von: ch.eick am 11 April 2023, 08:59:10Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten.
Ich habe ein intelligentes Messsystem und brauche daher keinen Pulse. Der Nachteil ist, dass der Netzbetreiber die Daten des Tages erst ab Mitternacht bereitstellt. D. h. ich müsste immer 04_consumtion_hourly_100 nutzen, um die Daten des Vortages korrekt zu bekommen. Die Daten des aktuellen Tages sind immer NULL.
04_consumtion_hourly_100 listet mir auch im httpbody alles völlig korrekt auf, es wird aber leider nichts in die Datenbank geschrieben.
Habe ich da etwas falsch verstanden, oder funktioniert dass dann so gar nicht?
Vielen Dank und Grüße
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 April 2023, 08:17:34
Zitat von: Speedy68 am 19 April 2023, 17:41:55
Zitat von: ch.eick am 11 April 2023, 08:59:10Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten.
Ich habe ein intelligentes Messsystem und brauche daher keinen Pulse. Der Nachteil ist, dass der Netzbetreiber die Daten des Tages erst ab Mitternacht bereitstellt. D. h. ich müsste immer 04_consumtion_hourly_100 nutzen, um die Daten des Vortages korrekt zu bekommen. Die Daten des aktuellen Tages sind immer NULL.
04_consumtion_hourly_100 listet mir auch im httpbody alles völlig korrekt auf, es wird aber leider nichts in die Datenbank geschrieben.
Habe ich da etwas falsch verstanden, oder funktioniert dass dann so gar nicht?
Vielen Dank und Grüße
Moin,
somit hast Du also nicht den stündlichen Tarif, wenn ich das richtig verstehe.

Bisher habe die Massendaten nicht als readings abgelegt, da das das Device geflutet hätte. für diesen durchschnitts Tarif würde dann ja eine Abfrage von 24 Werten ausreichen.


VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Speedy68 am 20 April 2023, 14:07:26
Zitat von: ch.eick am 20 April 2023, 08:17:34
Zitat von: Speedy68 am 19 April 2023, 17:41:55
Zitat von: ch.eick am 11 April 2023, 08:59:10Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten.
Ich habe ein intelligentes Messsystem und brauche daher keinen Pulse. Der Nachteil ist, dass der Netzbetreiber die Daten des Tages erst ab Mitternacht bereitstellt. D. h. ich müsste immer 04_consumtion_hourly_100 nutzen, um die Daten des Vortages korrekt zu bekommen. Die Daten des aktuellen Tages sind immer NULL.
04_consumtion_hourly_100 listet mir auch im httpbody alles völlig korrekt auf, es wird aber leider nichts in die Datenbank geschrieben.
Habe ich da etwas falsch verstanden, oder funktioniert dass dann so gar nicht?
Vielen Dank und Grüße
Moin,
somit hast Du also nicht den stündlichen Tarif, wenn ich das richtig verstehe.

Bisher habe die Massendaten nicht als readings abgelegt, da das das Device geflutet hätte. für diesen durchschnitts Tarif würde dann ja eine Abfrage von 24 Werten ausreichen.


VG  Christian
Hallo Christian,
doch, ich habe den stündlichen Tarif. Der wird bei mir allerdings erst einen Tag später rückwirkend abgerechnet. Der Netzbetreiber speichert den Zählerstand alle 15 min (*:00, *:15, *:30, *:45) und übermittelt den jeweils kurz nach Mitternacht an Tibber. Tibber berechnet dann den stündlichen Verbrauch.
Wenn ich Dein '04_consumtion_hourly_100' in FHEM aufrufe, bekomme ich auch alle Werte richtig angezeigt (nur den aktuellen Tag nicht, da sind die Werte NULL).
Bis auf den aktuellen Tag also (vermutlich) genau wie beim Pulse.
Meine Frage ist jetzt: Wie bekomme ich die stündlichen Werte in die Datenbank. Du schriebst ja "Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten."
Doch das funktioniert bei mir offensichtlich nicht.
Beispiel von heute mit der Zeit um Mitternacht:
...
{"from":"2023-04-19T21:00:00.000+02:00","to":"2023-04-19T22:00:00.000+02:00","cost":0.3149783273,"unitPrice":0.2968693,"unitPriceVAT":0.0473993,"consumption":1.061,"consumptionUnit":"kWh"},{"from":"2023-04-19T22:00:00.000+02:00","to":"2023-04-19T23:00:00.000+02:00","cost":0.2598194235,"unitPrice":0.2814945,"unitPriceVAT":0.0449445,"consumption":0.923,"consumptionUnit":"kWh"},{"from":"2023-04-19T23:00:00.000+02:00","to":"2023-04-20T00:00:00.000+02:00","cost":0.1852918298,"unitPrice":0.2716889,"unitPriceVAT":0.0433789,"consumption":0.682,"consumptionUnit":"kWh"},{"from":"2023-04-20T00:00:00.000+02:00","to":"2023-04-20T01:00:00.000+02:00","cost":null,"unitPrice":0.2699396,"unitPriceVAT":0.0430996,"consumption":null,"consumptionUnit":"kWh"},{"from":"2023-04-20T01:00:00.000+02:00","to":"2023-04-20T02:00:00.000+02:00","cost":null,"unitPrice":0.26299,"unitPriceVAT":0.04199,"consumption":null,"consumptionUnit":"kWh"},
...
Weil das nicht in die Datenbank geschrieben wird, habe ich natürlich dann auch keine Monats-/Jahreswerte.
Hast Du da eine Idee, was da schiefläuft?
Vielen Dank und Grüße
Frank
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 April 2023, 15:03:11
ZitatHallo Christian,
doch, ich habe den stündlichen Tarif. Der wird bei mir allerdings erst einen Tag später rückwirkend abgerechnet. Der Netzbetreiber speichert den Zählerstand alle 15 min (*:00, *:15, *:30, *:45) und übermittelt den jeweils kurz nach Mitternacht an Tibber. Tibber berechnet dann den stündlichen Verbrauch.
Wenn ich Dein '04_consumtion_hourly_100' in FHEM aufrufe, bekomme ich auch alle Werte richtig angezeigt (nur den aktuellen Tag nicht, da sind die Werte NULL).
Bis auf den aktuellen Tag also (vermutlich) genau wie beim Pulse.
Meine Frage ist jetzt: Wie bekomme ich die stündlichen Werte in die Datenbank. Du schriebst ja "Das 04_consumtion_hourly_100 ist für ein Nachtragen bei einer Tibber Störung gedacht und deckt ca. 4 Tage rückwirkend ab. Das SQL INSERT würde nur die fehlenden Einträge in der Datenbank ergänzen und die bereits vorhandenen behalten."
Doch das funktioniert bei mir offensichtlich nicht.
Beispiel von heute mit der Zeit um Mitternacht:
...
{"from":"2023-04-19T21:00:00.000+02:00","to":"2023-04-19T22:00:00.000+02:00","cost":0.3149783273,"unitPrice":0.2968693,"unitPriceVAT":0.0473993,"consumption":1.061,"consumptionUnit":"kWh"},{"from":"2023-04-19T22:00:00.000+02:00","to":"2023-04-19T23:00:00.000+02:00","cost":0.2598194235,"unitPrice":0.2814945,"unitPriceVAT":0.0449445,"consumption":0.923,"consumptionUnit":"kWh"},{"from":"2023-04-19T23:00:00.000+02:00","to":"2023-04-20T00:00:00.000+02:00","cost":0.1852918298,"unitPrice":0.2716889,"unitPriceVAT":0.0433789,"consumption":0.682,"consumptionUnit":"kWh"},{"from":"2023-04-20T00:00:00.000+02:00","to":"2023-04-20T01:00:00.000+02:00","cost":null,"unitPrice":0.2699396,"unitPriceVAT":0.0430996,"consumption":null,"consumptionUnit":"kWh"},{"from":"2023-04-20T01:00:00.000+02:00","to":"2023-04-20T02:00:00.000+02:00","cost":null,"unitPrice":0.26299,"unitPriceVAT":0.04199,"consumption":null,"consumptionUnit":"kWh"},
...
Weil das nicht in die Datenbank geschrieben wird, habe ich natürlich dann auch keine Monats-/Jahreswerte.
Hast Du da eine Idee, was da schiefläuft?
Hallo Frank,
ich bin bereits dran und es läuft wohl auch schon.

- Beim 04_consumtion_hourly_100 muss man sich das INSERT noch selber aus dem JSON zusammen bauen. Dazu hätte ich eine Beschreibung.
- Wenn man den Node-Red Flow verwendet kann man sich dort das INSERT generieren lassen, was dann als reading im FHEM erscheint.
- Bei Dir würde man kurz nach Mitternacht das neue 04_consumtion_hourly_24 aufrufen, was dann 24h als readings ablegt
  und diese auch mit INSERT in die Datenbank schreibt. Ich beschränke mich jedoch jetzt auf "from, cost, consumption", damit
  man nicht von readings erschlagen wird.

Je nach dem wann die Berechnung wirklich bei Tibber erscheint müsste man eventuell noch 2-3 LAST Werte abfragen, aber das wird man dann bei Deinem Test sehen.

Die Statistiken werden mit den userReadings direkt in der datenbank berechnet. Keine Daten, keine Statistiken ;-)

Etwas Zeit brauche ich jedoch noch :-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 12:54:29
Hallo zusammen,
hier mal eine aktuelle Zusammenfassung.

UPDATE 20230421 12:00 Teil 1

Das Umfeld:
Bei Tibber sind mir zwei Varianten bekannt.
1) Intelligentes Messsystem
  Hier wird der EVU Zähler alle 15 Minuten vom Netzbetreiber ausgelsen und die Ergebnisse an Tibber übermittelt.
  Tibber berechnet die Kosten im Stundentarif und stellt die Ergebnisse einmal am Tag nach Mitternacht zur Verfügung.
  Fragt man diese Berechnungen jedoch stündlich ab, so bekommt man den ganzen Tag Null gemeldet.
  Hierzu Dank an Frank für diesen Post (https://forum.fhem.de/index.php?msg=1273181)
  Auf diesen Zähle kann man dann noch zusätzlich einen IR Lesekopf aufsetzen, um die aktuellen Messwerte lokal zu verarbeiten.
 
2) Tibber Pulse
  Dies ist ein Lesekopf, der auf einen digitalen Zähler, auf die IR Schnittstelle kommt. Dort werden dann die OBIS Register
  gelesen und direkt an Tibber gesendet, wo dann der Verbrauch, aber auch die aktuellen Leistungen bereit gestellt werden.
  Die Kosten können in diesem Fall stündlich abgefragt und im SmartHome verarbeitet werden. Natürlich ist es ebenfalls möglich
  das nur einmal am Tag zu machen, wie unter 1) angegeben.
  Die aktuellen Messwerte können mit Tibber Pulse, über das Internet, auch in einer http Session, im Sekundentakt gestreamt werden,
  was somit den eigenen IR Lesekopf ersetzen würde. Ein Manko dabei ist nur, dass dafür permanent die Internetverbindung benötigt wird.
 
  Nun gibt es hier wieder zwei Anwendungsvarianten:
 
  - Tibber Pulse ohne http Session für aktuelle Messwerte
    Sollte man keine aktuellen Messwerte über die http Session streamen wollen, so reicht eine einfache HTTPMOD Abfrage der Statistiken
    von Tibber, sowie die Abfrage der Preise für heute und morgen.
    Dies kann direkt aus FHEM erfolgen und bedarf keinem Umweg über z.B. Node-Red als "Proxy"
 
  - Tibber Pulse mit aktuellen Messwerten
    Für die aktuellen Messwerte wird eine HTTP Session benötigt, die so nicht direkt aus FHEM aufgebaut werden kann. Um dies zu lösen gibt
    es einen Node-Red Flow, der permanent die streaming Session aufrecht erhält.
    Für die Abfrage der Statistiken könnte man nun auch die direkte HTTPMOD Verbindung aus FHEM heraus nutzen, was jedoch über Node-Red ebenfalls
    erfolgen kann. Dies erspart ein Device udn läst das ganze eleganter wirken. Im Node-Red kann man dann auch noch weitere Flows erstellen, die
    zusätzlichen Komfort bereitstellen.
    Diese Implementierung setzt jedoch im FHEM eine bereits laufende MQTT Umgebung vorraus, die hier nicht nochmals beschrieben wird.
   
Vorausetzung:
- DbLog und DbRep mit MySQL
    z.B. im Docker
    Diese Implementierung setzt jedoch zwingend eine MySQL DbLog und ein DbRep Device vorraus, da aus dem userReadings
    direkt mir SQL Statements gearbeitet wird. Achtet bitte auch darauf, dass in der MySQL Datenbank ein
    "ADD PRIMARY KEY (`TIMESTAMP`, `DEVICE`, `READING`);" gesetzt wurde.
   
- MQTT bei Verwendung von Tibber Pulse

- Ein laufendes Node-Red
    z.B. im Docker
   
- Node-Red für Tibber Pulse streaming
    Paletten:
      node-red 3.0.2
      node-red-contrib-cron-plus 1.5.7
      node-red-contrib-tibber-api 5.2.1
    Tibber Flow
      kommt weiter unten

FHEM Devices:

1) Das DbRep Device dient der direkten Kommunikation mit der Datenbank und führt die MySQL Befehle aus dem userReading aus.
defmod LogDBRep_EVU_Tibber_connect_SQL DbRep LogDB
attr LogDBRep_EVU_Tibber_connect_SQL DbLogExclude .*
attr LogDBRep_EVU_Tibber_connect_SQL room System
attr LogDBRep_EVU_Tibber_connect_SQL sqlCmdHistoryLength 5

2) Für das bereitstellen des Vormonats wird dieses DbRep Device benötigt
defmod LogDBRep_Statistic_previous_Month DbRep LogDB
attr LogDBRep_Statistic_previous_Month DbLogExclude .*
attr LogDBRep_Statistic_previous_Month allowDeletion 0
attr LogDBRep_Statistic_previous_Month comment Version 2023.04.21 12:00
attr LogDBRep_Statistic_previous_Month room System
attr LogDBRep_Statistic_previous_Month verbose 0
Darin wird dann von Euch dieses sqlCmd ausgeführt.
Ich verwende das gleiche DbRep, um in einem SELECT für alle Vormonate die Daten bereit zu stellen.
Das DbRep Device muss dann jeweils zum ersten jeden Monats mit dem MySQL SELECT ausgeführt werden.
SELECT max(TIMESTAMP) AS TIMESTAMP,
       'EVU_Tibber_Pulse_nodes_consumption_month' AS READING,
       cast(sum(VALUE) AS DECIMAL(10, 0)) AS VALUE
FROM history
WHERE DEVICE='EVU_Tibber_connect'
  AND READING='nodes_consumption'
  AND TIMESTAMP > DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00')
  AND TIMESTAMP < DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')

3) Nach dem gleichen Muster wird es auch ein DbRep für das Vorjahr geben.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 12:57:33
UPDATE 20230421 12:00 Teil 2

Achtung, im Vergleich zu den bisherigen Device Namen hat sich etwas geändert. Die connect Devices heißen nun beide gleich, also "EVU_Tibber_connect",
da sie wahlweise zu verwenden sind. Dort entfällt auch das stateFormat. Das Device "EVU_Tibber" ist jetzt neu und übernimmt den Status, sowie die Steuerung.

4) EVU_Tibber Device
  Das DOIF Device händelt die Visualisierung mit uiTable und zeigt den Status an.
  Es werden auch Diagramme für die Tages Preise von heute und morgen im FHEMWEB angezeigt.
  Weiterhin erfolgt hier das Scheduling für die Statistikabfragen im HTTPMOD. Wenn man Node-Red verwendet kann man die Abfragen auch dort schedulen.
  Es ist in diesem Konzept angedacht in diesem DOIF auch die aktivierung von Verbrauchern zu triggern, was z.B. das Laden eines Hausspeichers oder
  auch das Signal für das BEV Laden sein könnte. Auch zusätzliches starten von einer Wärmepumpe oder einem Klima Gerät sollten hier platziert werden.

Dieses Device ist für beide EVU_Tibber_connect verwendbar,
Bei der MQTT EVU_Tibber_connect Anbindung kann das Scheduling jedoch direkt im Node-Red erfolgen und sollte deshalb dann hier auskommentiert werden.
Für die, die gerne Device Namen verändern wäre auch innerhalb des Device Codes an einigen Stellen der Device Name zu ändern. Ich habe es zwar versucht
zu zentralisieren, aber an einigen Stellen ist das nicht gelungen.
defmod EVU_Tibber DOIF ################################################################################################################\
## 1 Scheduling für das Abholen von Tibber Daten\
1_EVU_Tibber_PriceInfo\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
    (     [:03]                                                          ## Kurz nach jeder vollen Stunde\
    )\
    or [$SELF:ui_command_1] eq "1_EVU_Tibber_PriceInfo"                  ## Hier wird das uiTable select ausgewertet\
   ) {\
\
  ::CommandGet(undef, "EVU_Tibber_connect 01_priceInfo");;                ## Preis für die aktuelle Stunde\
  ::CommandGet(undef, "EVU_Tibber_connect 03_consumption_hour");;         ## Kosten der letzen drei Stunden\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF cmd_1  : Abfrage von Tibber";;\
    }\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
################################################################################################################\
## 2 Scheduling für das Abholen der Tibber Preise\
2_EVU_Tibber_PriceAll\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
    ([00:03] or [14:03]                                                  ## Ab 14:00 Uhr gibt es die Preise für den nächsten Tag\
    )\
    or [$SELF:ui_command_1] eq "2_EVU_Tibber_PriceAll"                   ## Hier wird das uiTable select ausgewertet\
   ) {\
\
  ::CommandGet(undef, "EVU_Tibber_connect 02_priceAll");;\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF cmd_1  : Abfrage von Tibber für den nächsten Tag";;\
    }\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}\
\
################################################################################################################\
## 2 Erstellen des Diagramms im uiTable\
3_EVU_Tibber_Diagramm\
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled\
    and\
    (     [00:05] or [14:05]                                             ## Kurz nach Mitternacht\
    )\
    or [$SELF:ui_command_1] eq "3_EVU_Tibber_Diagramm"                   ## Hier wird das uiTable select ausgewertet\
   ) {\
\
  my (@out) = ("") x 2;;\
  my $timestamp;;\
\
  for (my $j=0;;$j<=1;;$j++){\
    for (my $i=0;;$i<=23;;$i++){\
      $timestamp = ReadingsVal("EVU_Tibber_connect",sprintf("fc%d_%02d_startsAt",$j,$i),"");;\
      $timestamp =~ s/ /_/g;;\
      $out[$j] .=$timestamp." ".::round(ReadingsVal("EVU_Tibber_connect",sprintf("fc%d_%02d_total",$j, $i),0)*100,1)."\n";;\
      if (    $i == 23\
          and ::ReadingsVal("EVU_Tibber_connect","fc0_00_startsAt","") eq ::ReadingsVal("EVU_Tibber_connect","fc1_00_startsAt","")\
         ) {                                                             ## Der nächste Tag ist noch nicht da\
          if (AttrVal("$SELF","verbose",0) >=3) {\
            Log 3, "$SELF cmd_1  : Tibber Daten von morgen sind noch nicht da";;\
          }\
          $timestamp = POSIX::strftime("%Y-%m-%d",localtime(time+86400));; ## Setze das Datum auf morgen\
          for (my $k=0;;$k<=23;;$k++) {\
            $out[$j] .= sprintf("%s_%02d:00:00 0\n", $timestamp, $k);;    ## Die Daten mit 0 ergänzen\
          }\
          $j = 2;;                                                        ## Aus der Schleife springen\
        }\
    } # End $i\
  } # End $j\
  if (AttrVal("$SELF","verbose",0) >=3) {\
      Log 3, "$SELF cmd_1  : Werte für das Diagramm";;\
      print($out[0]."\n\n");;\
      print($out[1]."\n");;\
    }\
  ## Die readings current_price und current_level dienen hier nur als Trigger Events, und müssen für\
  ## jedes Diagramm unterschiedlich sein, die Daten werden über $out[] bereit gestellt !!\
  ::DOIF_modify_card_data("EVU_Tibber","EVU_Tibber_connect","current_price","bar1day",0,$out[0]);;\
  ::DOIF_modify_card_data("EVU_Tibber","EVU_Tibber_connect","current_level","bar1day",-86400,$out[1]);;\
  ## Mit der Abfrage 03_consumption_hour werden die Trigger erneut ausgelöst\
  ::CommandGet(undef, "EVU_Tibber_connect 03_consumption_hour");;         ## Kosten der letzen drei Stunden\
\
    set_Reading("ui_command_1","---");;                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
                                                                         ## kann das Kommando nicht sofort wiederholt werden\
  }\
}
attr EVU_Tibber DbLogExclude .*
attr EVU_Tibber comment Version 2023.04.24 09:00 \
Dieses Device benötigt EVU_Tibber_connect als Verbindung zu Tibber.
attr EVU_Tibber disable 0
attr EVU_Tibber group PV Steuerung EVU
attr EVU_Tibber icon sani_pump
attr EVU_Tibber room Strom->Photovoltaik
attr EVU_Tibber sortby 315
attr EVU_Tibber uiTable {\
package ui_Table;;\
  $TABLE = "style='width:100%;;'";;\
\
  $TD{0..9}{0}     = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
\
  $TD{0..9}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
  $TD{0..9}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
  $TD{0..9}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
\
sub FUNC_Status {\
    my($value, $min, $colorMin,  $statusMin,  $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
    my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
    return $ret;;\
  }\
\
sub Device {\
    return "$SELF"."_connect";;\
  }\
\
sub Price {\
  my($i)=@_;;\
  my $j;;\
  my $value;;\
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
\
  if ($i == 0) {\
    $value = ::ReadingsVal(Device(),"current_price",0);;\
    $value = ( ::ReadingsVal(Device(),"fc0_trigger","off") eq "on" ) ?\
         "<span style='color:green'>".$value."</span>" :\
         "<span style='color:red'>".$value."</span>" ;;\
    $value .= " ct/kWh";;\
  } else {\
    $j       = $i+$hour;;\
    if ($j < 24) {\
      $value = ::round(::ReadingsVal(Device(),"fc0_".sprintf("%02d",$j)."_total",0)*100,1);;\
    } else {\
      $j = $j - 24;;\
      $value = ::round(::ReadingsVal(Device(),"fc1_".sprintf("%02d",$j)."_total",0)*100,1);;\
    }\
    $value = ( ::ReadingsVal(Device(),"fc0_trigger_price","0") > $value ) ?\
         "<span style='color:green'>".$value."</span>" :\
         "<span style='color:red'>".$value."</span>" ;;\
    $value = sprintf("%02d",$j)." :  ".$value ;;\
  }\
  return  $value;;\
 }\
\
sub Cost {\
  my($i)=@_;;\
  my $currency = (::ReadingsVal(Device(),"current_currency","") eq "EUR")? " €" : "";;\
\
  return ::ReadingsVal(Device(),"total_cost_".$i,0).$currency;;\
}\
\
sub Format {\
  my($i)=@_;;\
\
  my $MonthBefore   = "LogDBRep_Statistic_previous_Month";;\
  my $MonthPrevious = ::ReadingsTimestamp("$MonthBefore","EVU_Tibber_Pulse_nodes_consumption_month","null");;\
       $MonthPrevious = ($MonthPrevious ne "null") ?    POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$MonthBefore","EVU_Tibber_Pulse_nodes_consumption_month","null")))) : "null";;\
\
  my $YearBefore   = "LogDBRep_Statistic_previous_Year";;\
  my $YearPrevious = ::ReadingsTimestamp("$YearBefore",Device()."_nodes_consumption_year","null");;\
       $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(::time_str2num(::ReadingsTimestamp("$YearBefore",Device()."_nodes_consumption_year","null")))) : "null";;\
\
  if ($i eq "day") {\
      return sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_day",0));;\
    } elsif ($i eq "month") {\
      my $evu_em = sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_month",0));;\
      $evu_em .= ($MonthPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal("$MonthBefore","EVU_Tibber_Pulse_nodes_consumption_month",0) ) : "";;\
      return $evu_em;;\
    } elsif ($i eq "year") {\
      my $evu_ey = sprintf("%04d",::ReadingsVal(Device(),"nodes_consumption_year",0));;\
      $evu_ey .= ($YearPrevious ne "null") ? sprintf(" / %04d", ::ReadingsVal("$YearBefore","EVU_Tibber_Pulse_nodes_consumption_month",0) ) : "";;\
      return $evu_ey;;\
    } elsif ($i eq "trigger") {\
      return (    ::ReadingsVal(Device(),"fc0_min",0) > ::ReadingsVal(Device(),"fc0_trigger_price",0)\
                 or ::ReadingsVal(Device(),"fc0_trigger_start","") eq "null" ) ?\
            "<span style='color:red'>Heute kein Trigger <br>mehr unter ".\
                 ::ReadingsVal(Device(),"fc0_trigger_price","null")." ct</span>" :\
            "<span style='color:green'>Trigger von<br>".\
                 ::ReadingsVal(Device(),"fc0_trigger_start","00:00")." bis ".::ReadingsVal(Device(),"fc0_trigger_stop","00:00")."<br>unter ".\
                 ::ReadingsVal(Device(),"fc0_trigger_price","null")." ct</span>" ;;\
    }\
  return "null";;\
}\
\
}\
\
"$SELF"|"Kommando<dd>Auswahl</dd>" |widget([$SELF:ui_command_1],"uzsuDropDown,---,1_EVU_Tibber_PriceInfo,2_EVU_Tibber_PriceAll,3_EVU_Tibber_Diagramm") |""|""|""\
\
|"Statistiken ".::ReadingsVal(Device(),"current_date",0)." in kWh"|"<span style=font-weight:bold>aktuell</span>"|"<span style=font-weight:bold>heute</span>"|"<span style=font-weight:bold>Monat</span>"|"<span style=font-weight:bold>Jahr</span>"\
\
|"Bezug vom Netz"|sprintf("%04d W",::ReadingsVal(Device(),"Pulse_P_act",0))|Format("day")|Format("month")|Format("year")\
\
|"Einspeisung ins Netz"|sprintf("%04d W",::ReadingsVal(Device(),"Pulse_P_act_Prod",0))|""|""|""\
\
|"Strom<dd>Preis / Kosten</dd>"|Price(0)|Cost("day")|Cost("month")|Cost("year")\
\
|"Strompreis<br>".card([EVU_Tibber_connect:current_price:bar1day],undef,undef,0,60,90,0,"fc0  ".::ReadingsVal(Device(),"current_currency",""),undef,"1","130,,,,,,220").card([EVU_Tibber_connect:current_level:bar1day],undef,undef,0,60,90,0,"fc1  ".::ReadingsVal(Device(),"current_currency",""),undef,"1","130,,,,,,220")|"<span style=font-weight:bold>nächste 3h</span><br><br>".Price(1)."<br>".Price(2)."<br>".Price(3)|"<span style=font-weight:bold>Statistik fc0</span><br><br>".::ReadingsVal(Device(),"fc0_avg",0)." avg<br>".::ReadingsVal(Device(),"fc0_min",0)." min<br>".::ReadingsVal(Device(),"fc0_max",0)." max"|"<span style=font-weight:bold>Trigger</span><br>Basis ".widget([EVU_Tibber_connect:compensation_grid],"selectnumbers,0,0.1,12,1,lin")."<br>".Format("trigger")|""\

attr EVU_Tibber verbose 3
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 12:58:40
UPDATE 20230421 12:00 Teil 3

5.1) EVU_Tibber_connect als HTTPMOD
  Das Device dient der Abfrage von Tibber Statistiken und Daten, die dann im EVU_Tibber DOIF als Status aufbereitet werden.
  Hierzu kann man auch ein stateFormat für den Status verwenden, was dann jedoch keine Preis Diagramme beinhaltet, da diese uiTable vom DOIF benötigen.

Defaults
setstate EVU_Tibber_connect 2023-04-21 12:00:00 compensation_grid 0.0
setstate EVU_Tibber_connect 2023-04-21 12:00 homeID 96a14971-525a-4420-aae9-e5aedaa129ff
setstate EVU_Tibber_connect 2023-04-21 12:00 token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
RAW Device
defmod EVU_Tibber_connect HTTPMOD https://api.tibber.com/v1-beta/gql 0
attr EVU_Tibber_connect DbLogExclude .*
attr EVU_Tibber_connect DbLogInclude total_cost_.*,fc0_trigger.*
attr EVU_Tibber_connect comment Version 2023.04.21 12:00 \
https://developer.tibber.com/explorer\
\
homeID 96a14971-525a-4420-aae9-e5aedaa129ff\
token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE\
\
Hierduch kann man einen wirtschaftlicheren trigger_price berechnen lassen:\
setreading EVU_Tibber compensation_grid <Eure Einspeisevergütung>\
\
# Berechnung eines Default Schwellwertes als täglicher Niedrigpreis\
    (fc0_avg - fc0_min)  /2 + fc0_min\
\
# Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird\
# compensation_grid kann auch auf einen für Euch passenden Wert gesetzt werden\
    (fc0_avg - compensation_grid) *0.85
attr EVU_Tibber_connect disable 0
attr EVU_Tibber_connect enableControlSet 1
attr EVU_Tibber_connect get01-1Name current_currency
attr EVU_Tibber_connect get01-2Name current_level
attr EVU_Tibber_connect get01-3Name current_date
attr EVU_Tibber_connect get01-3OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get01-4Name current_price
attr EVU_Tibber_connect get01-4OExpr $val *100
attr EVU_Tibber_connect get01Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total startsAt currency level}}}}}}" }
attr EVU_Tibber_connect get01Header01 Content-Type: application/json
attr EVU_Tibber_connect get01Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get01JSON data_viewer_home_currentSubscription_priceInfo_current
attr EVU_Tibber_connect get01Name 01_priceInfo
attr EVU_Tibber_connect get01URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get02-10Name fc0_03_total
attr EVU_Tibber_connect get02-11Name fc0_04_startsAt
attr EVU_Tibber_connect get02-11OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-12Name fc0_04_total
attr EVU_Tibber_connect get02-13Name fc0_05_startsAt
attr EVU_Tibber_connect get02-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-14Name fc0_05_total
attr EVU_Tibber_connect get02-15Name fc0_06_startsAt
attr EVU_Tibber_connect get02-15OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-16Name fc0_06_total
attr EVU_Tibber_connect get02-17Name fc0_07_startsAt
attr EVU_Tibber_connect get02-17OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-18Name fc0_07_total
attr EVU_Tibber_connect get02-19Name fc0_08_startsAt
attr EVU_Tibber_connect get02-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-1Name current_date
attr EVU_Tibber_connect get02-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-20Name fc0_08_total
attr EVU_Tibber_connect get02-21Name fc0_09_startsAt
attr EVU_Tibber_connect get02-21OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-22Name fc0_09_total
attr EVU_Tibber_connect get02-23Name fc0_10_startsAt
attr EVU_Tibber_connect get02-23OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-24Name fc0_10_total
attr EVU_Tibber_connect get02-25Name fc0_11_startsAt
attr EVU_Tibber_connect get02-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-26Name fc0_11_total
attr EVU_Tibber_connect get02-27Name fc0_12_startsAt
attr EVU_Tibber_connect get02-27OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-28Name fc0_12_total
attr EVU_Tibber_connect get02-29Name fc0_13_startsAt
attr EVU_Tibber_connect get02-29OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-2Name current_price
attr EVU_Tibber_connect get02-2OExpr $val *100
attr EVU_Tibber_connect get02-30Name fc0_13_total
attr EVU_Tibber_connect get02-31Name fc0_14_startsAt
attr EVU_Tibber_connect get02-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-32Name fc0_14_total
attr EVU_Tibber_connect get02-33Name fc0_15_startsAt
attr EVU_Tibber_connect get02-33OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-34Name fc0_15_total
attr EVU_Tibber_connect get02-35Name fc0_16_startsAt
attr EVU_Tibber_connect get02-35OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-36Name fc0_16_total
attr EVU_Tibber_connect get02-37Name fc0_17_startsAt
attr EVU_Tibber_connect get02-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-38Name fc0_17_total
attr EVU_Tibber_connect get02-39Name fc0_18_startsAt
attr EVU_Tibber_connect get02-39OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-3Name fc0_00_startsAt
attr EVU_Tibber_connect get02-3OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-40Name fc0_18_total
attr EVU_Tibber_connect get02-41Name fc0_19_startsAt
attr EVU_Tibber_connect get02-41OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-42Name fc0_19_total
attr EVU_Tibber_connect get02-43Name fc0_20_startsAt
attr EVU_Tibber_connect get02-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-44Name fc0_20_total
attr EVU_Tibber_connect get02-45Name fc0_21_startsAt
attr EVU_Tibber_connect get02-45OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-46Name fc0_21_total
attr EVU_Tibber_connect get02-47Name fc0_22_startsAt
attr EVU_Tibber_connect get02-47OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-48Name fc0_22_total
attr EVU_Tibber_connect get02-49Name fc0_23_startsAt
attr EVU_Tibber_connect get02-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-4Name fc0_00_total
attr EVU_Tibber_connect get02-50Name fc0_23_total
attr EVU_Tibber_connect get02-51Name fc1_00_startsAt
attr EVU_Tibber_connect get02-51OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-52Name fc1_00_total
attr EVU_Tibber_connect get02-53Name fc1_01_startsAt
attr EVU_Tibber_connect get02-53OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-54Name fc1_01_total
attr EVU_Tibber_connect get02-55Name fc1_02_startsAt
attr EVU_Tibber_connect get02-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-56Name fc1_02_total
attr EVU_Tibber_connect get02-57Name fc1_03_startsAt
attr EVU_Tibber_connect get02-57OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-58Name fc1_03_total
attr EVU_Tibber_connect get02-59Name fc1_04_startsAt
attr EVU_Tibber_connect get02-59OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-5Name fc0_01_startsAt
attr EVU_Tibber_connect get02-5OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-60Name fc1_04_total
attr EVU_Tibber_connect get02-61Name fc1_05_startsAt
attr EVU_Tibber_connect get02-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-62Name fc1_05_total
attr EVU_Tibber_connect get02-63Name fc1_06_startsAt
attr EVU_Tibber_connect get02-63OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-64Name fc1_06_total
attr EVU_Tibber_connect get02-65Name fc1_07_startsAt
attr EVU_Tibber_connect get02-65OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-66Name fc1_07_total
attr EVU_Tibber_connect get02-67Name fc1_08_startsAt
attr EVU_Tibber_connect get02-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-68Name fc1_08_total
attr EVU_Tibber_connect get02-69Name fc1_09_startsAt
attr EVU_Tibber_connect get02-69OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-6Name fc0_01_total
attr EVU_Tibber_connect get02-70Name fc1_09_total
attr EVU_Tibber_connect get02-71Name fc1_10_startsAt
attr EVU_Tibber_connect get02-71OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-72Name fc1_10_total
attr EVU_Tibber_connect get02-73Name fc1_11_startsAt
attr EVU_Tibber_connect get02-73OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-74Name fc1_11_total
attr EVU_Tibber_connect get02-75Name fc1_12_startsAt
attr EVU_Tibber_connect get02-75OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-76Name fc1_12_total
attr EVU_Tibber_connect get02-77Name fc1_13_startsAt
attr EVU_Tibber_connect get02-77OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-78Name fc1_13_total
attr EVU_Tibber_connect get02-79Name fc1_14_startsAt
attr EVU_Tibber_connect get02-79OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-7Name fc0_02_startsAt
attr EVU_Tibber_connect get02-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-80Name fc1_14_total
attr EVU_Tibber_connect get02-81Name fc1_15_startsAt
attr EVU_Tibber_connect get02-81OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-82Name fc1_15_total
attr EVU_Tibber_connect get02-83Name fc1_16_startsAt
attr EVU_Tibber_connect get02-83OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-84Name fc1_16_total
attr EVU_Tibber_connect get02-85Name fc1_17_startsAt
attr EVU_Tibber_connect get02-85OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-86Name fc1_17_total
attr EVU_Tibber_connect get02-87Name fc1_18_startsAt
attr EVU_Tibber_connect get02-87OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-88Name fc1_18_total
attr EVU_Tibber_connect get02-89Name fc1_19_startsAt
attr EVU_Tibber_connect get02-89OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-8Name fc0_02_total
attr EVU_Tibber_connect get02-90Name fc1_19_total
attr EVU_Tibber_connect get02-91Name fc1_20_startsAt
attr EVU_Tibber_connect get02-91OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-92Name fc1_20_total
attr EVU_Tibber_connect get02-93Name fc1_21_startsAt
attr EVU_Tibber_connect get02-93OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-94Name fc1_21_total
attr EVU_Tibber_connect get02-95Name fc1_22_startsAt
attr EVU_Tibber_connect get02-95OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-96Name fc1_22_total
attr EVU_Tibber_connect get02-97Name fc1_23_startsAt
attr EVU_Tibber_connect get02-97OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02-98Name fc1_23_total
attr EVU_Tibber_connect get02-9Name fc0_03_startsAt
attr EVU_Tibber_connect get02-9OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total startsAt} today {total startsAt} tomorrow {total startsAt}}}}}}" }
attr EVU_Tibber_connect get02Header01 Content-Type: application/json
attr EVU_Tibber_connect get02Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get02JSON data_viewer_home_currentSubscription_priceInfo
attr EVU_Tibber_connect get02Name 02_priceAll
attr EVU_Tibber_connect get02URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get03-1Name nodes_00_00_from
attr EVU_Tibber_connect get03-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get03-2Name nodes_00_00_cost
attr EVU_Tibber_connect get03-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get03-3Name nodes_00_00_consumption
attr EVU_Tibber_connect get03-4Name nodes_00_01_from
attr EVU_Tibber_connect get03-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get03-50Name nodes_00_01_cost
attr EVU_Tibber_connect get03-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get03-5Name nodes_00_01_cost
attr EVU_Tibber_connect get03-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get03-6Name nodes_00_01_consumption
attr EVU_Tibber_connect get03-7Name nodes_00_02_from
attr EVU_Tibber_connect get03-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get03-8Name nodes_00_02_cost
attr EVU_Tibber_connect get03-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get03-9Name nodes_00_02_consumption
attr EVU_Tibber_connect get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 3) {nodes {from cost consumption }}}}}"}
attr EVU_Tibber_connect get03Header01 Content-Type: application/json
attr EVU_Tibber_connect get03Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get03Name 03_consumption_hour
attr EVU_Tibber_connect get03RegOpt g
attr EVU_Tibber_connect get03Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr EVU_Tibber_connect get03URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get04-10Name nodes_24_03_from
attr EVU_Tibber_connect get04-10OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-11Name nodes_24_03_cost
attr EVU_Tibber_connect get04-11OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-12Name nodes_24_03_consumption
attr EVU_Tibber_connect get04-13Name nodes_24_04_from
attr EVU_Tibber_connect get04-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-14Name nodes_24_04_cost
attr EVU_Tibber_connect get04-14OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-15Name nodes_24_04_consumption
attr EVU_Tibber_connect get04-16Name nodes_24_05_from
attr EVU_Tibber_connect get04-16OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-17Name nodes_24_05_cost
attr EVU_Tibber_connect get04-17OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-18Name nodes_24_05_consumption
attr EVU_Tibber_connect get04-19Name nodes_24_06_from
attr EVU_Tibber_connect get04-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-1Name nodes_24_00_from
attr EVU_Tibber_connect get04-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-20Name nodes_24_06_cost
attr EVU_Tibber_connect get04-20OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-21Name nodes_24_06_consumption
attr EVU_Tibber_connect get04-22Name nodes_24_07_from
attr EVU_Tibber_connect get04-22OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-23Name nodes_24_07_cost
attr EVU_Tibber_connect get04-23OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-24Name nodes_24_07_consumption
attr EVU_Tibber_connect get04-25Name nodes_24_08_from
attr EVU_Tibber_connect get04-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-26Name nodes_24_08_cost
attr EVU_Tibber_connect get04-26OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-27Name nodes_24_08_consumption
attr EVU_Tibber_connect get04-28Name nodes_24_09_from
attr EVU_Tibber_connect get04-28OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-29Name nodes_24_09_cost
attr EVU_Tibber_connect get04-29OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-2Name nodes_24_00_cost
attr EVU_Tibber_connect get04-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-30Name nodes_24_09_consumption
attr EVU_Tibber_connect get04-31Name nodes_24_10_from
attr EVU_Tibber_connect get04-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-32Name nodes_24_10_cost
attr EVU_Tibber_connect get04-32OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-33Name nodes_24_10_consumption
attr EVU_Tibber_connect get04-34Name nodes_24_11_from
attr EVU_Tibber_connect get04-34OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-35Name nodes_24_11_cost
attr EVU_Tibber_connect get04-35OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-36Name nodes_24_11_consumption
attr EVU_Tibber_connect get04-37Name nodes_24_12_from
attr EVU_Tibber_connect get04-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-38Name nodes_24_12_cost
attr EVU_Tibber_connect get04-38OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-39Name nodes_24_12_consumption
attr EVU_Tibber_connect get04-3Name nodes_24_00_consumption
attr EVU_Tibber_connect get04-40Name nodes_24_13_from
attr EVU_Tibber_connect get04-40OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-41Name nodes_24_13_cost
attr EVU_Tibber_connect get04-41OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-42Name nodes_24_13_consumption
attr EVU_Tibber_connect get04-43Name nodes_24_14_from
attr EVU_Tibber_connect get04-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-44Name nodes_24_14_cost
attr EVU_Tibber_connect get04-44OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-45Name nodes_24_14_consumption
attr EVU_Tibber_connect get04-46Name nodes_24_15_from
attr EVU_Tibber_connect get04-46OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-47Name nodes_24_15_cost
attr EVU_Tibber_connect get04-47OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-48Name nodes_24_15_consumption
attr EVU_Tibber_connect get04-49Name nodes_24_16_from
attr EVU_Tibber_connect get04-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-4Name nodes_24_01_from
attr EVU_Tibber_connect get04-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-50Name nodes_24_16_cost
attr EVU_Tibber_connect get04-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-51Name nodes_24_16_consumption
attr EVU_Tibber_connect get04-52Name nodes_24_17_from
attr EVU_Tibber_connect get04-52OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-53Name nodes_24_17_cost
attr EVU_Tibber_connect get04-53OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-54Name nodes_24_17_consumption
attr EVU_Tibber_connect get04-55Name nodes_24_18_from
attr EVU_Tibber_connect get04-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-56Name nodes_24_18_cost
attr EVU_Tibber_connect get04-56OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-57Name nodes_24_18_consumption
attr EVU_Tibber_connect get04-58Name nodes_24_19_from
attr EVU_Tibber_connect get04-58OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-59Name nodes_24_19_cost
attr EVU_Tibber_connect get04-59OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-5Name nodes_24_01_cost
attr EVU_Tibber_connect get04-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-60Name nodes_24_19_consumption
attr EVU_Tibber_connect get04-61Name nodes_24_20_from
attr EVU_Tibber_connect get04-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-62Name nodes_24_20_cost
attr EVU_Tibber_connect get04-62OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-63Name nodes_24_20_consumption
attr EVU_Tibber_connect get04-64Name nodes_24_21_from
attr EVU_Tibber_connect get04-64OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-65Name nodes_24_21_cost
attr EVU_Tibber_connect get04-65OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-66Name nodes_24_21_consumption
attr EVU_Tibber_connect get04-67Name nodes_24_22_from
attr EVU_Tibber_connect get04-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-68Name nodes_24_22_cost
attr EVU_Tibber_connect get04-68OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-69Name nodes_24_22_consumption
attr EVU_Tibber_connect get04-6Name nodes_24_01_consumption
attr EVU_Tibber_connect get04-70Name nodes_24_23_from
attr EVU_Tibber_connect get04-70OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-71Name nodes_24_23_cost
attr EVU_Tibber_connect get04-71OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-72Name nodes_24_23_consumption
attr EVU_Tibber_connect get04-7Name nodes_24_02_from
attr EVU_Tibber_connect get04-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get04-8Name nodes_24_02_cost
attr EVU_Tibber_connect get04-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get04-9Name nodes_24_02_consumption
attr EVU_Tibber_connect get04Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 24) {nodes {from cost consumption}}}}}"}
attr EVU_Tibber_connect get04Header01 Content-Type: application/json
attr EVU_Tibber_connect get04Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get04Name 04_consumption_hour_24
attr EVU_Tibber_connect get04RegOpt g
attr EVU_Tibber_connect get04Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr EVU_Tibber_connect get04URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get05-10Name Adresse_01_Nachname
attr EVU_Tibber_connect get05-1Name Adresse_03_Strasse
attr EVU_Tibber_connect get05-2Name Adresse_05_Ort
attr EVU_Tibber_connect get05-3Name Adresse_06_Land
attr EVU_Tibber_connect get05-4Name Adresse_09_latitude
attr EVU_Tibber_connect get05-5Name Adresse_10_longitude
attr EVU_Tibber_connect get05-6Name Adresse_04_Plz
attr EVU_Tibber_connect get05-7Name Adresse_08_eMail
attr EVU_Tibber_connect get05-8Name Adresse_07_Telefon
attr EVU_Tibber_connect get05-9Name Adresse_02_Vorname
attr EVU_Tibber_connect get05Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr EVU_Tibber_connect get05Header01 Content-Type: application/json
attr EVU_Tibber_connect get05Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get05JSON data_viewer_home
attr EVU_Tibber_connect get05Name 05_consumption_hourly_100
attr EVU_Tibber_connect get05URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get06-10Name Adresse_01_Nachname
attr EVU_Tibber_connect get06-1Name Adresse_03_Strasse
attr EVU_Tibber_connect get06-2Name Adresse_05_Ort
attr EVU_Tibber_connect get06-3Name Adresse_06_Land
attr EVU_Tibber_connect get06-4Name Adresse_09_latitude
attr EVU_Tibber_connect get06-5Name Adresse_10_longitude
attr EVU_Tibber_connect get06-6Name Adresse_04_Plz
attr EVU_Tibber_connect get06-7Name Adresse_08_eMail
attr EVU_Tibber_connect get06-8Name Adresse_07_Telefon
attr EVU_Tibber_connect get06-9Name Adresse_02_Vorname
attr EVU_Tibber_connect get06Data { "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }
attr EVU_Tibber_connect get06Header01 Content-Type: application/json
attr EVU_Tibber_connect get06Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get06JSON data_viewer_home
attr EVU_Tibber_connect get06Name 06_address
attr EVU_Tibber_connect get06URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect get07-10Name nodes_24_03_from
attr EVU_Tibber_connect get07-10OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-11Name nodes_24_03_cost
attr EVU_Tibber_connect get07-11OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-12Name nodes_24_03_consumption
attr EVU_Tibber_connect get07-13Name nodes_24_04_from
attr EVU_Tibber_connect get07-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-14Name nodes_24_04_cost
attr EVU_Tibber_connect get07-14OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-15Name nodes_24_04_consumption
attr EVU_Tibber_connect get07-16Name nodes_24_05_from
attr EVU_Tibber_connect get07-16OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-17Name nodes_24_05_cost
attr EVU_Tibber_connect get07-17OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-18Name nodes_24_05_consumption
attr EVU_Tibber_connect get07-19Name nodes_24_06_from
attr EVU_Tibber_connect get07-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-1Name features_realTimeConsumptionEnabled
attr EVU_Tibber_connect get07-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-20Name nodes_24_06_cost
attr EVU_Tibber_connect get07-20OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-21Name nodes_24_06_consumption
attr EVU_Tibber_connect get07-22Name nodes_24_07_from
attr EVU_Tibber_connect get07-22OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-23Name nodes_24_07_cost
attr EVU_Tibber_connect get07-23OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-24Name nodes_24_07_consumption
attr EVU_Tibber_connect get07-25Name nodes_24_08_from
attr EVU_Tibber_connect get07-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-26Name nodes_24_08_cost
attr EVU_Tibber_connect get07-26OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-27Name nodes_24_08_consumption
attr EVU_Tibber_connect get07-28Name nodes_24_09_from
attr EVU_Tibber_connect get07-28OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-29Name nodes_24_09_cost
attr EVU_Tibber_connect get07-29OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-2Name features_id
attr EVU_Tibber_connect get07-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-30Name nodes_24_09_consumption
attr EVU_Tibber_connect get07-31Name nodes_24_10_from
attr EVU_Tibber_connect get07-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-32Name nodes_24_10_cost
attr EVU_Tibber_connect get07-32OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-33Name nodes_24_10_consumption
attr EVU_Tibber_connect get07-34Name nodes_24_11_from
attr EVU_Tibber_connect get07-34OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-35Name nodes_24_11_cost
attr EVU_Tibber_connect get07-35OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-36Name nodes_24_11_consumption
attr EVU_Tibber_connect get07-37Name nodes_24_12_from
attr EVU_Tibber_connect get07-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-38Name nodes_24_12_cost
attr EVU_Tibber_connect get07-38OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-39Name nodes_24_12_consumption
attr EVU_Tibber_connect get07-3Name nodes_24_00_consumption
attr EVU_Tibber_connect get07-40Name nodes_24_13_from
attr EVU_Tibber_connect get07-40OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-41Name nodes_24_13_cost
attr EVU_Tibber_connect get07-41OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-42Name nodes_24_13_consumption
attr EVU_Tibber_connect get07-43Name nodes_24_14_from
attr EVU_Tibber_connect get07-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-44Name nodes_24_14_cost
attr EVU_Tibber_connect get07-44OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-45Name nodes_24_14_consumption
attr EVU_Tibber_connect get07-46Name nodes_24_15_from
attr EVU_Tibber_connect get07-46OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-47Name nodes_24_15_cost
attr EVU_Tibber_connect get07-47OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-48Name nodes_24_15_consumption
attr EVU_Tibber_connect get07-49Name nodes_24_16_from
attr EVU_Tibber_connect get07-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-4Name nodes_24_01_from
attr EVU_Tibber_connect get07-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-50Name nodes_24_16_cost
attr EVU_Tibber_connect get07-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-51Name nodes_24_16_consumption
attr EVU_Tibber_connect get07-52Name nodes_24_17_from
attr EVU_Tibber_connect get07-52OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-53Name nodes_24_17_cost
attr EVU_Tibber_connect get07-53OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-54Name nodes_24_17_consumption
attr EVU_Tibber_connect get07-55Name nodes_24_18_from
attr EVU_Tibber_connect get07-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-56Name nodes_24_18_cost
attr EVU_Tibber_connect get07-56OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-57Name nodes_24_18_consumption
attr EVU_Tibber_connect get07-58Name nodes_24_19_from
attr EVU_Tibber_connect get07-58OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-59Name nodes_24_19_cost
attr EVU_Tibber_connect get07-59OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-5Name nodes_24_01_cost
attr EVU_Tibber_connect get07-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-60Name nodes_24_19_consumption
attr EVU_Tibber_connect get07-61Name nodes_24_20_from
attr EVU_Tibber_connect get07-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-62Name nodes_24_20_cost
attr EVU_Tibber_connect get07-62OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-63Name nodes_24_20_consumption
attr EVU_Tibber_connect get07-64Name nodes_24_21_from
attr EVU_Tibber_connect get07-64OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-65Name nodes_24_21_cost
attr EVU_Tibber_connect get07-65OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-66Name nodes_24_21_consumption
attr EVU_Tibber_connect get07-67Name nodes_24_22_from
attr EVU_Tibber_connect get07-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-68Name nodes_24_22_cost
attr EVU_Tibber_connect get07-68OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-69Name nodes_24_22_consumption
attr EVU_Tibber_connect get07-6Name nodes_24_01_consumption
attr EVU_Tibber_connect get07-70Name nodes_24_23_from
attr EVU_Tibber_connect get07-70OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-71Name nodes_24_23_cost
attr EVU_Tibber_connect get07-71OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-72Name nodes_24_23_consumption
attr EVU_Tibber_connect get07-7Name nodes_24_02_from
attr EVU_Tibber_connect get07-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr EVU_Tibber_connect get07-8Name nodes_24_02_cost
attr EVU_Tibber_connect get07-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr EVU_Tibber_connect get07-9Name nodes_24_02_consumption
attr EVU_Tibber_connect get07Data { "query": "{viewer {home(id:\"%%homeID%%\") {id features{realTimeConsumptionEnabled} } } }" }
attr EVU_Tibber_connect get07Header01 Content-Type: application/json
attr EVU_Tibber_connect get07Header02 Authorization: Bearer %%token%%
attr EVU_Tibber_connect get07JSON data_viewer_home
attr EVU_Tibber_connect get07Name 07_realTimeConsumptionEnabled
attr EVU_Tibber_connect get07RegOpt g
attr EVU_Tibber_connect get07Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr EVU_Tibber_connect get07URL https://api.tibber.com/v1-beta/gql
attr EVU_Tibber_connect group PV Steuerung EVU
attr EVU_Tibber_connect icon stromzaehler_icon
attr EVU_Tibber_connect replacement01Mode reading
attr EVU_Tibber_connect replacement01Regex %%token%%
attr EVU_Tibber_connect replacement01Value token
attr EVU_Tibber_connect replacement02Mode reading
attr EVU_Tibber_connect replacement02Regex %%homeID%%
attr EVU_Tibber_connect replacement02Value homeID
attr EVU_Tibber_connect requestData { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
attr EVU_Tibber_connect requestHeader1 Content-Type: application/json
attr EVU_Tibber_connect requestHeader2 Authorization: Bearer %%token%%
attr EVU_Tibber_connect room Strom->Photovoltaik
attr EVU_Tibber_connect showBody 1
attr EVU_Tibber_connect showError 1
attr EVU_Tibber_connect sortby 313
attr EVU_Tibber_connect userReadings nodes_TIMESTAMP:nodes_00_00_cost.* {\
my ($timestamp,$value) = 2x0;;\
my $tmp = 0;;\
\
for (my $loop_last = 0;; $loop_last <= 2;; $loop_last++) {\
  $timestamp = ReadingsVal("$NAME","nodes_00_".sprintf("%02d",$loop_last)."_from","null");;\
  $value = ReadingsVal("$NAME","nodes_".sprintf("%02d",$loop_last)."_cost","null");;\
\
  if ( $value ne "null" ) {\
    # Eintragen der Kosten für die Stunde\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
    # Eintragen des Verbrauchs für die Stunde\
    $value = ReadingsVal("$NAME","nodes_00_".$loop_last."_consumption","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_consumption','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
  } else {\
    $tmp = "null";;\
  }\
} # end for\
if ($tmp eq "null") {\
  $timestamp = $tmp\
}\
$timestamp;;\
},\
\
nodes_TIMESTAMP:nodes_24_00_cost.* {\
my ($timestamp,$value) = 2x0;;\
my $tmp = 0;;\
\
for (my $loop_last = 0;; $loop_last <= 23;; $loop_last++) {\
  $timestamp = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_from","null");;\
  $value = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_cost","null");;\
\
  if ( $value ne "null" ) {\
    # Eintragen der Kosten für die Stunde\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
    # Eintragen des Verbrauchs für die Stunde\
    $value = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_consumption","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_consumption','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
  } else {\
    $tmp = "null";;\
  }\
} # end for\
if ($tmp eq "null") {\
  $timestamp = $tmp\
}\
$timestamp;;\
},\
\
nodes_cost_avg:nodes_TIMESTAMP.* {\
## Berechnung des Tages Wertes\
  if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(avg(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
  } else {\
    ReadingsVal("$NAME","nodes_cost_avg","null")\
  }\
},\
\
nodes_cost_min:nodes_TIMESTAMP.* {\
##  Ermittlung des minimal Wertes\
if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
  ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(min(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
} else {\
  ReadingsVal("$NAME","nodes_cost_min","null")\
}\
},\
\
nodes_cost_max:nodes_TIMESTAMP.* {\
## Ermittlung des maximal Wertes\
  if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(max(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
  } else {\
    ReadingsVal("$NAME","nodes_cost_max","null")\
  }\
},\
\
nodes_consumption_day:nodes_TIMESTAMP.* {\
## Berechnung des Tages Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
nodes_consumption_month:nodes_TIMESTAMP.* {\
## Berechnung des Monats Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND YEAR(TIMESTAMP) = YEAR(curdate())\
             AND MONTH(TIMESTAMP) = MONTH(curdate()) ;;") ;;\
},\
\
nodes_consumption_year:nodes_TIMESTAMP.* {\
## Berechnung des Jahres Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND YEAR(TIMESTAMP) = YEAR(curdate()) ;;") ;;\
},\
\
fc0_avg:current_price.* {\
## Berechnung des Tages Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(avg(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_min:current_price.* {\
##  Ermittlung des minimal Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(min(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_max:current_price.* {\
## Ermittlung des maximal Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(max(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_trigger_price:[fc0_avg|compensation_grid].* {\
# Berechnung eines Default Schwellwertes als täglicher Niedrigpreis\
my $price_level = round( (ReadingsVal("$NAME","fc0_avg",0) - ReadingsVal("$NAME","fc0_min",0))/2 + ReadingsVal("$NAME","fc0_min",0) , 1);;\
\
# Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird\
if ( ReadingsVal("$NAME","compensation_grid",0) != 0 ) {\
  my $price_level_battery = round( (ReadingsVal("$NAME","fc0_avg",0) - ReadingsVal("$NAME","compensation_grid",0)) *0.85 , 1) ;;\
  if ( $price_level > $price_level_battery ) {\
    $price_level = $price_level_battery\
  }\
}\
$price_level;;\
},\
\
fc0_trigger_start:fc0_trigger_price.* {\
  my $fc = 0;;\
  my $fc_trigger_price = ReadingsVal("$NAME","fc".$fc."_trigger_price",0) /100;;\
\
  # Ermitteln des nächsten Trigger Fensters\
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
  my $fc_total = 0;;\
\
    for (my $loop_hour = $hour;; $loop_hour <= 23;; $loop_hour++) {\
      $fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);;\
      if ( $fc_total < $fc_trigger_price ) {\
        return(sprintf("%02d:00",$loop_hour)) ;;\
      }\
    } # end  for loop_hour\
\
  return("null");;\
},\
\
fc0_trigger_stop:fc0_trigger_start.* {\
  my $fc = 0;;\
  my $loop_hour = 0;;\
  my $fc_trigger_price = ReadingsVal("$NAME","fc".$fc."_trigger_price",0) /100;;\
\
  # Ermitteln des nächsten Trigger Fensters\
  my $fc_trigger_start = ReadingsVal("$NAME","fc0_trigger_start","null");;\
  my $fc_trigger_stop = $fc_trigger_start;;\
\
  if ( $fc_trigger_start ne "null" ) {\
    $fc_trigger_start =~ /(\d\d):/;; $fc_trigger_start = $1 ;;\
    my $fc_total = 0;;\
\
    for ($loop_hour = $fc_trigger_start;; $loop_hour <= 23;; $loop_hour++) {\
      $fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);;\
      if ( $fc_total < $fc_trigger_price ) {\
        $fc_trigger_stop = sprintf("%02d:00",$loop_hour) ;;\
      } else {\
        return(sprintf("%02d:00",$loop_hour));;\
      }\
\
     # wechsel zum nächsten Tag\
     if ( $loop_hour == 23 and $fc == 0 ) {\
       $fc = 1;;\
       $loop_hour = -1;;\
     }\
\
    } # end for loop_hour\
  }\
 \
  return($fc_trigger_stop);;\
},\
\
fc0_trigger:fc0_trigger_stop.* {\
\
  # Setzen des Triggers für die aktuelle Stunde\
  if ( ReadingsVal("$NAME","current_price",100)  < ReadingsVal("$NAME","fc0_trigger_price",0) ) {\
    return("on")\
  } else {\
    return("off")\
  }\
},\
\
total_cost_day:nodes_TIMESTAMP.* {\
## Berechnung des Tages Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
total_cost_month:nodes_TIMESTAMP.* {\
## Berechnung des monats Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND YEAR(TIMESTAMP) = YEAR(curdate())\
             AND MONTH(TIMESTAMP) = MONTH(curdate()) ;;") ;;\
},\
\
total_cost_year:nodes_TIMESTAMP.* {\
## Berechnung des Jahres Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND YEAR(TIMESTAMP) = YEAR(curdate()) ;;") ;;\
},\
\
fc_DbLog:fc0_00_total.* {\
my ($timestamp,$date,$hour,$value) = 4x0;;\
\
for (my $loop_fc = 0;; $loop_fc <= 1;; $loop_fc++) {\
  $date = ReadingsVal("$NAME","fc".$loop_fc."_00_startsAt","null");;\
  $date =~ /([\d+-]+)/;; $date = $1 ;;\
  for (my $loop_hour = 0;; $loop_hour <= 23;; $loop_hour++) {\
    $hour = sprintf("%02d",$loop_hour);;\
    $timestamp = $date." ".$hour.":00:00";;\
    $value = ReadingsVal("$NAME","fc".$loop_fc."_".$hour."_total","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
                      INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                        VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."')\
                      ON DUPLICATE KEY UPDATE\
                        VALUE='".$value."';;") ;;\
  }\
}\
ReadingsTimestamp("$NAME","fc0_00_startsAt","null");;\
}
attr EVU_Tibber_connect verbose 0

setstate EVU_Tibber_connect 2023-04-21 12:00:00 compensation_grid 0.0
setstate EVU_Tibber_connect 2023-04-21 12:00:00 homeID 96a14971-525a-4420-aae9-e5aedaa129ff
setstate EVU_Tibber_connect 2023-04-21 12:00:00 token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE

stateFormat für EVO_Tibber_connect (kein RAW) wer kein EVU_Tibber DOIF haben möchte.
Also nochmal, das EVU_Tibber übernimmt den Status und die Steuerung, weshalb die EVU_Tibber_connect kein stateFormat mehr haben.
{
 my $DUMMY  = "";
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;
 my $DEVICE            = "EVU_Tibber_connect";

 my $YearBefore      = "LogDBRep_Statistic_previous_Year";
 my $YearPrevious    = ReadingsTimestamp("$YearBefore",$DEVICE."_nodes_consumption_year","null");
   $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore",$DEVICE."_nodes_consumption_year","null")))) : "null";

 my $MonthBefore      = "LogDBRep_Statistic_previous_Month";
 my $MonthPrevious    = ReadingsTimestamp("$MonthBefore",$DEVICE."_nodes_consumption_month","null");
   $YearPrevious = ($YearPrevious ne "null") ? POSIX::strftime("%Y",localtime(time_str2num(ReadingsTimestamp("$YearBefore",$DEVICE."_nodes_consumption_month","null")))) : "null";

 
 my $date  = ReadingsVal($DEVICE,"current_date",0);
 my (@price4h) = (0) x 5 ;

 $price4h[0] = ReadingsVal($DEVICE,"current_price",0);
 $price4h[0] = ( ReadingsVal($DEVICE,"fc0_trigger","off") eq "on" ) ?
       "<span style='color:green'>".$price4h[0]."</span>" :
       "<span style='color:red'>".$price4h[0]."</span>" ;
 $price4h[0] .= " ct/kWh";

 for (my $loop_hour = 1;$loop_hour <= 4;$loop_hour++) {
   $price4h[$loop_hour] = round(ReadingsVal($DEVICE,"fc0_".sprintf("%02d",$loop_hour+$hour)."_total",0)*100,1);
   $price4h[$loop_hour] = ( ReadingsVal($DEVICE,"fc0_trigger_price","0") > $price4h[$loop_hour] ) ?
         "<span style='color:green'>".$price4h[$loop_hour]."</span>" :
         "<span style='color:red'>$price4h[$loop_hour]</span>" ;
   $price4h[$loop_hour] = sprintf("%02d",$loop_hour+$hour)." :  ".$price4h[$loop_hour] ;
 }

  my $evu_act = sprintf("%04d W",ReadingsVal($DEVICE,"Pulse_P_act",0));
  my $evu_act_prod = sprintf("%04d W",ReadingsVal($DEVICE,"Pulse_P_act_Prod",0));

  my $evu_ed = sprintf("%04d",ReadingsVal($DEVICE,"nodes_consumption_day",0));

  my $evu_em = sprintf("%04d",ReadingsVal($DEVICE,"nodes_consumption_month",0));
    $evu_em .= ($MonthPrevious ne "null") ? sprintf(" / %04d", ReadingsVal("$MonthBefore",$DEVICE."_nodes_consumption_month",0) ) : "";

  my $evu_ey = sprintf("%05d",ReadingsVal($DEVICE,"nodes_consumption_year",0));



  my $evu_accumulated_production = ReadingsVal($DEVICE,"Pulse_accumulatedProduction",0)." kWh";
  my $evu_accumulated_consumption = ReadingsVal($DEVICE,"Pulse_accumulatedConsumption",0)." kWh";

 my $fc0_avg = ReadingsVal($DEVICE,"fc0_avg",0)." avg";
 my $fc0_min = ReadingsVal($DEVICE,"fc0_min",0)." min";
 my $fc0_max = ReadingsVal($DEVICE,"fc0_max",0)." max";

 my $trigger = (    ReadingsVal($DEVICE,"fc0_min",0) > ReadingsVal($DEVICE,"fc0_trigger_price",0)
                       or ReadingsVal($DEVICE,"fc0_trigger_start","") eq "null" ) ?
            "<span style='color:red'>Heute kein Trigger <br>mehr unter ".
                 ReadingsVal($DEVICE,"fc0_trigger_price","null")." ct</span>" :
            "<span style='color:green'>Trigger von<br>".
            ReadingsVal($DEVICE,"fc0_trigger_start","00:00")." bis ".ReadingsVal($DEVICE,"fc0_trigger_stop","00:00")."<br>unter ".
                 ReadingsVal($DEVICE,"fc0_trigger_price","null")." ct</span>" ;

 my $total_cost_day = ReadingsVal($DEVICE,"total_cost_day",0)." €";
 my $total_cost_month = ReadingsVal($DEVICE,"total_cost_month",0)." €";
 my $total_cost_year = ReadingsVal($DEVICE,"total_cost_year",0)." €";

"<html><table border=2 bordercolor='darkgreen' cellspacing=0 style='width: 100%'>
 <colgroup>
   <col span='1' style='width: 52%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
   <col span='1' style='width: 12%;'>
 </colgroup>
 <tr><td style='padding-right:5px;padding-left:5px;font-weight:bold'>Statistik ".$date." in kWh</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>aktuell</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Heute</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Monat".(($MonthPrevious ne "null") ? " / Vormonat" : "")."</td><td style='padding-right:5px;padding-left:5px;font-weight:bold;text-align:center'>Jahr</td></tr>

 <tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Bezug vom Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$evu_act."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$evu_ed."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$evu_em."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$evu_ey."</td></tr>
 <tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Einspeisung ins Netz</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$evu_act_prod."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$DUMMY."</td></tr>

 <tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Strom<dd>Preis / Kosten </dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$price4h[0]."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$total_cost_day."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$total_cost_month."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$total_cost_year."</td></tr>
 <tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Strompreis<dd>nächste 3h / Statistik fc0 / Trigger</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$price4h[1]."<br>".$price4h[2]."<br>".$price4h[3]."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$fc0_max."<br>".$fc0_avg."<br>".$fc0_min."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$trigger."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$DUMMY."</td></tr>
 </table></html>"
}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 12:59:48
UPDATE 20230421 12:00 Teil 4

5.2) EVU_Tibber_connect als MQTT mit Tibber Pulse und Node-Red
  Dieses Device empfängt mit MQTT die Tibber Informationen vom Node-Red. Im Node-Red Flow "Tibber" sind einige Nodes zu konfigurieren.
 
  - homeID
  - token
  - Scheduling
  - Aktivieren "tibber/05_consumption_hourly_100" oder "tibber/05_consumption_hourly_history_MySQL"
  - Aktivieren "tibber-feed" für den Tibber Pulse stream
  - Der stream sendes sekündlich Messwerte, die auf 1/30s gebremst werden. Dies kann im Tibber Flow eingestellt werden.
 
  - Durch inject lassen sich die Abfragen manuell starten
  - Insbesondere ein inject "00_consumption_hourly_10000" bietet die Möglichkeit historische Massendaten abzuholen,
    dafür sollte man dann aber im "mqtt out" die Ausgabe "tibber/05_consumption_hourly_history_MySQL" aktivieren,
    was im FHEM ein reading mit einem MySQL INSERT erzeugt. Das kann über eine MySQL Session (manuell) die Daten in die Datenbank schreiben.
 
defmod EVU_Tibber_connect MQTT2_DEVICE Tibber_Pulse
attr EVU_Tibber_connect DbLogExclude .*
attr EVU_Tibber_connect DbLogInclude total_cost_.*,fc0_trigger.*
attr EVU_Tibber_connect IODev MQTT2_FHEM_Server
attr EVU_Tibber_connect alias EVU_Tibber_connect
attr EVU_Tibber_connect comment Version 2023.04.21 12:00 \
https://developer.tibber.com/explorer\
\
Dieses Device verwendet einen Node-Red Flow, in dem die homeID und das token eingetragen werden muss.\
\
homeID 96a14971-525a-4420-aae9-e5aedaa129ff\
token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE\
\
Die folgenden Abfragen werden bereits zyklisch im Flow getriggert:\
  01_priceInfo         1/h um 2 Minuten nach\
  02_priceAll          0 und 14 Uhr um 5 Minuten nach\
  03_consumption_hour  alle 15 Minuten\
\
Hierduch kann man einen wirtschaftlicheren trigger_price berechnen lassen:\
setreading EVU_Tibber_connect compensation_grid <Eure Einspeisevergütung>\
\
# Berechnung eines Default Schwellwertes als täglicher Niedrigpreis\
    (fc0_avg - fc0_min)  /2 + fc0_min\
\
# Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird\
# compensation_grid kann auch auf einen für Euch passenden Wert gesetzt werden\
    (fc0_avg - compensation_grid) *0.85
attr EVU_Tibber_connect devicetopic tibber
attr EVU_Tibber_connect group PV Steuerung EVU
attr EVU_Tibber_connect icon stromzaehler_icon
attr EVU_Tibber_connect readingList $DEVICETOPIC/pulse:.* { json2nameValue($EVENT) }\
\
$DEVICETOPIC/01_priceInfo:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/02_priceAll:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/03_consumption_hour:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/04_consumption_hourly_24:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/05_consumption_hourly_100:.* consumption_hourly_100\
$DEVICETOPIC/05_consumption_hourly_history_MySQL:.* consumption_hourly_history_MySQL\
$DEVICETOPIC/06_address:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/07_realTimeConsumptionEnabled:.* { json2nameValue($EVENT) }\
\

attr EVU_Tibber_connect room Strom->Photovoltaik
attr EVU_Tibber_connect setList 01_priceInfo req/$DEVICETOPIC/01_priceInfo {viewer {homes { currentSubscription {priceInfo {current {total startsAt level}}}  }}}\
02_priceAll req/$DEVICETOPIC/02_priceAll {viewer {homes { currentSubscription { priceInfo {current {total startsAt level} today {total startsAt level} tomorrow {total startsAt level}}}  }}}\
03_consumption_hour req/$DEVICETOPIC/03_consumption_hour {viewer {homes {consumption(resolution: HOURLY, last: 3) {nodes {from cost consumption }} }}}\
04_consumption_hourly_24 req/$DEVICETOPIC/04_consumption_hourly_24 {viewer {homes { consumption(resolution: HOURLY, last: 24) {nodes {from cost consumption }}  }}}\
05_consumption_hourly_100 req/$DEVICETOPIC/05_consumption_hourly_100 {viewer {homes { consumption(resolution: HOURLY, last: 100) {nodes {from cost consumption }}  }}}\
06_address req/$DEVICETOPIC/06_address {viewer {homes { id address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}  }}\
07_realTimeConsumptionEnabled req/$DEVICETOPIC/07_realTimeConsumptionEnabled {viewer {homes { id features{realTimeConsumptionEnabled}}  }}\

attr EVU_Tibber_connect sortby 314
attr EVU_Tibber_connect userReadings nodes_TIMESTAMP:nodes_00_00_cost.* {\
my ($timestamp,$value) = 2x0;;\
my $tmp = 0;;\
\
for (my $loop_last = 0;; $loop_last <= 2;; $loop_last++) {\
  $timestamp = ReadingsVal("$NAME","nodes_00_".sprintf("%02d",$loop_last)."_from","null");;\
  $value = ReadingsVal("$NAME","nodes_".sprintf("%02d",$loop_last)."_cost","null");;\
\
  if ( $value ne "null" ) {\
    # Eintragen der Kosten für die Stunde\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
    # Eintragen des Verbrauchs für die Stunde\
    $value = ReadingsVal("$NAME","nodes_00_".$loop_last."_consumption","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_consumption','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
  } else {\
    $tmp = "null";;\
  }\
} # end for\
if ($tmp eq "null") {\
  $timestamp = $tmp\
}\
$timestamp;;\
},\
\
nodes_TIMESTAMP:nodes_24_00_cost.* {\
my ($timestamp,$value) = 2x0;;\
my $tmp = 0;;\
\
for (my $loop_last = 0;; $loop_last <= 23;; $loop_last++) {\
  $timestamp = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_from","null");;\
  $value = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_cost","null");;\
\
  if ( $value ne "null" ) {\
    # Eintragen der Kosten für die Stunde\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_cost','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
    # Eintragen des Verbrauchs für die Stunde\
    $value = ReadingsVal("$NAME","nodes_24_".sprintf("%02d",$loop_last)."_consumption","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
              INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                VALUES('".$timestamp."','$NAME','Tibber','nodes_consumption','".$value."')\
              ON DUPLICATE KEY UPDATE\
                VALUE='".$value."';;") ;;\
  } else {\
    $tmp = "null";;\
  }\
} # end for\
if ($tmp eq "null") {\
  $timestamp = $tmp\
}\
$timestamp;;\
},\
\
nodes_cost_avg:nodes_TIMESTAMP.* {\
## Berechnung des Tages Wertes\
  if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(avg(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
  } else {\
    ReadingsVal("$NAME","nodes_cost_avg","null")\
  }\
},\
\
nodes_cost_min:nodes_TIMESTAMP.* {\
##  Ermittlung des minimal Wertes\
if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
  ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(min(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
} else {\
  ReadingsVal("$NAME","nodes_cost_min","null")\
}\
},\
\
nodes_cost_max:nodes_TIMESTAMP.* {\
## Ermittlung des maximal Wertes\
  if ( ReadingsVal("$NAME","nodes_TIMESTAMP","null") ne "null" ) {\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(max(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND TIMESTAMP >= curdate() ;;") ;;\
  } else {\
    ReadingsVal("$NAME","nodes_cost_max","null")\
  }\
},\
\
nodes_consumption_day:nodes_TIMESTAMP.* {\
## Berechnung des Tages Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
nodes_consumption_month:nodes_TIMESTAMP.* {\
## Berechnung des Monats Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND YEAR(TIMESTAMP) = YEAR(curdate())\
             AND MONTH(TIMESTAMP) = MONTH(curdate()) ;;") ;;\
},\
\
nodes_consumption_year:nodes_TIMESTAMP.* {\
## Berechnung des Jahres Verbrauches\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(sum(VALUE) AS DECIMAL(10,4)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_consumption'\
             AND YEAR(TIMESTAMP) = YEAR(curdate()) ;;") ;;\
},\
\
fc0_avg:current_price.* {\
## Berechnung des Tages Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(avg(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_min:current_price.* {\
##  Ermittlung des minimal Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(min(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_max:current_price.* {\
## Ermittlung des maximal Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT cast(max(VALUE)*100 AS DECIMAL(4,2)) FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='fc0_total'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
fc0_trigger_price:[fc0_avg|compensation_grid].* {\
# Berechnung eines Default Schwellwertes als täglicher Niedrigpreis\
my $price_level = round( (ReadingsVal("$NAME","fc0_avg",0) - ReadingsVal("$NAME","fc0_min",0))/2 + ReadingsVal("$NAME","fc0_min",0) , 1);;\
\
# Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird\
if ( ReadingsVal("$NAME","compensation_grid",0) != 0 ) {\
  my $price_level_battery = round( (ReadingsVal("$NAME","fc0_avg",0) - ReadingsVal("$NAME","compensation_grid",0)) *0.85 , 1) ;;\
  if ( $price_level > $price_level_battery ) {\
    $price_level = $price_level_battery\
  }\
}\
$price_level;;\
},\
\
fc0_trigger_start:fc0_trigger_price.* {\
  my $fc = 0;;\
  my $fc_trigger_price = ReadingsVal("$NAME","fc".$fc."_trigger_price",0) /100;;\
\
  # Ermitteln des nächsten Trigger Fensters\
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);; $year += 1900;; $mon += 1 ;;\
  my $fc_total = 0;;\
\
    for (my $loop_hour = $hour;; $loop_hour <= 23;; $loop_hour++) {\
      $fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);;\
      if ( $fc_total < $fc_trigger_price ) {\
        return(sprintf("%02d:00",$loop_hour)) ;;\
      }\
    } # end  for loop_hour\
\
  return("null");;\
},\
\
fc0_trigger_stop:fc0_trigger_start.* {\
  my $fc = 0;;\
  my $loop_hour = 0;;\
  my $fc_trigger_price = ReadingsVal("$NAME","fc".$fc."_trigger_price",0) /100;;\
\
  # Ermitteln des nächsten Trigger Fensters\
  my $fc_trigger_start = ReadingsVal("$NAME","fc0_trigger_start","null");;\
  my $fc_trigger_stop = $fc_trigger_start;;\
\
  if ( $fc_trigger_start ne "null" ) {\
    $fc_trigger_start =~ /(\d\d):/;; $fc_trigger_start = $1 ;;\
    my $fc_total = 0;;\
\
    for ($loop_hour = $fc_trigger_start;; $loop_hour <= 23;; $loop_hour++) {\
      $fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);;\
      if ( $fc_total < $fc_trigger_price ) {\
        $fc_trigger_stop = sprintf("%02d:00",$loop_hour) ;;\
      } else {\
        return(sprintf("%02d:00",$loop_hour));;\
      }\
\
     # wechsel zum nächsten Tag\
     if ( $loop_hour == 23 and $fc == 0 ) {\
       $fc = 1;;\
       $loop_hour = -1;;\
     }\
\
    } # end for loop_hour\
  }\
 \
  return($fc_trigger_stop);;\
},\
\
fc0_trigger:fc0_trigger_stop.* {\
\
  # Setzen des Triggers für die aktuelle Stunde\
  if ( ReadingsVal("$NAME","current_price",100)  < ReadingsVal("$NAME","fc0_trigger_price",0) ) {\
    return("on")\
  } else {\
    return("off")\
  }\
},\
\
total_cost_day:nodes_TIMESTAMP.* {\
## Berechnung des Tages Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND date(TIMESTAMP) = curdate() ;;") ;;\
},\
\
total_cost_month:nodes_TIMESTAMP.* {\
## Berechnung des monats Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND YEAR(TIMESTAMP) = YEAR(curdate())\
             AND MONTH(TIMESTAMP) = MONTH(curdate()) ;;") ;;\
},\
\
total_cost_year:nodes_TIMESTAMP.* {\
## Berechnung des Jahres Wertes\
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
           SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE\
           FROM history\
           WHERE DEVICE='".$NAME."'\
             AND READING='nodes_cost'\
             AND YEAR(TIMESTAMP) = YEAR(curdate()) ;;") ;;\
},\
\
fc_DbLog:fc0_00_total.* {\
my ($timestamp,$date,$hour,$value) = 4x0;;\
\
for (my $loop_fc = 0;; $loop_fc <= 1;; $loop_fc++) {\
  $date = ReadingsVal("$NAME","fc".$loop_fc."_00_startsAt","null");;\
  $date =~ /([\d+-]+)/;; $date = $1 ;;\
  for (my $loop_hour = 0;; $loop_hour <= 23;; $loop_hour++) {\
    $hour = sprintf("%02d",$loop_hour);;\
    $timestamp = $date." ".$hour.":00:00";;\
    $value = ReadingsVal("$NAME","fc".$loop_fc."_".$hour."_total","null");;\
    ::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking\
                      INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)\
                        VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."')\
                      ON DUPLICATE KEY UPDATE\
                        VALUE='".$value."';;") ;;\
  }\
}\
ReadingsTimestamp("$NAME","fc0_00_startsAt","null");;\
}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 13:03:19
UPDATE 20230421 12:00 Teil 5

Ablauf Beispiel:

Mit diesen Aufrufen, z.B. aus dem EVU_Tibber DOIF muss das Device zyklisch aufgerufen werden.
Dies sollte z.b. jeweils um [:03] erfolgen.
get EVU_Tibber 01_priceInfo                  <<< das aktualisiert auch den Trigger
get EVU_Tibber 03_consumption_hour

Dies sollte z.b. jeweils um [00:03] or [14:03] erfolgen, da dann die Preise für heute und morgen bereit stehen.
get EVU_Tibber 02_priceAll                   <<< hiermit wird der Preis Forecast von Tibber abgeholt

01_priceInfo
  Das holt den aktuellen Preis für die laufende Stunde und aktualisiert auch den
  Trigger im reading "fc0_trigger [on|off]" , den man dann in anderen Devices nutzen kann.

02_priceAll
  Hiermit wird der Preis Forecast von Tibber abgeholt und anschließend folgende readings berechnet.
fc0_avg 29.86
fc0_max 34.31
fc0_min 27.34
fc0_trigger_price 28.6  <<< Das ist der trigger_price, der unterschritten werden muss (siehe auch "compensation_grid <Einspeisevergütung>")
fc0_trigger_start 14:00 <<< Mit dieser Stunde beginnt das Trigger Fenster
fc0_trigger_stop 17:00  <<< Um diese Stunde endet das Trigger Fenster

compensation_grid <Einspeisevergütung>
  Hierduch kann man einen wirtschaftlicheren trigger_price berechnen lassen.
  Der Wert lässt sich auch im EVU_Tibber GUI im Bereich Trigger Basis verändern.
  Oder durch ein setreading
      setreading EVU_Tibber_connect compensation_grid <Eure Einspeisevergütung>
     
Bei dem Trigger bitte noch etwas vorsichtig sein, denn das ist noch im Test. Die Uhrzeiten sollten zum Ende des Trigger Fensters dann das nächste
Fenster anzeigen und auch über Mitternacht fortschreiten. Im EVU_Tibber DOIF sollte man dann in einem eigenen Perl Block z.B. soetwas angeben können.
[[EVU_Tibber_connect:fc0_trigger_start]-[EVU_Tibber_connect:fc0_trigger_stop]]
     
03_consumption_hour
  Diese Abfrage holt die Kosten der letzten Stunden und den gezählten Verbrauch bei Tibber ab. Es werden die letzten drei Stunden verarbeitet, wodurch die
  Verzögerung in der Berechnung bei Tibber abgefangen werden sollte.
 
In der MySQL Datenbank werden einige readings abgelegt:
  fc*_total ist das reading fc*_**_total was entsprechend der zugehörigen Zeit mit dem passenden Zeitstempel geschrieben wurde.
        Achtung die Werte vom Folgetag werden bereits am laufenden Tag geschrieben.
        Im Grafana kann man somit schon einen Tag vorausschauen, bzw wird der Folgetag auch im EVU_Tibber Diagramm dargestellt. Bis um 14:00 Uhr wird der
        Folgetag noch mit Null dargestellt, da die Daten für fc1 erst zu diesem Zeitpunkt bereitstehen.

  Beispiele aus der Datenbank
    2023-04-06 **:00:00    EVU_Tibber    Tibber        fc*_total    0.2949   

  Tibber Verbrauch und Kosten pro Stunde
    2023-04-06 03:00:00    EVU_Tibber    Tibber        nodes_cost    0.0081   
    2023-04-06 04:00:00    EVU_Tibber    Tibber        nodes_consumption    0.029   

  Und natürlich alle anderen readings, die man gerne loggen möchte
  DbLogInclude total_cost_.*,fc0_trigger.*


Das ganze sollte dann bei Zeiten mal ins Wiki...

VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 13:14:24
UPDATE 20230421 12:00 Teil 6

Für die Demo Umgebung
homeID 96a14971-525a-4420-aae9-e5aedaa129ff
token  5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE

Der Tibber Flow
Im Flow sind auch einige Kommentare, damit man die Stellen zum Ändern besser findet.
Der Flow ist im Anhang

Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Speedy68 am 21 April 2023, 16:12:12
Zitat von: ch.eick am 21 April 2023, 13:14:24UPDATE 20230421 12:00


Hallo Christian,
vielen Dank für die Überarbeitung!
Leider sind im Coding 2 kleine Tippfehler

DEVICE
LogDBRep_EVU_Tibber_SQL
muss
LogDBRep_EVU_Tibber_connect_SQL
sein, sonst funktioniert es nicht mehr.

Im userReading von EVU_Tibber_connect für die 24-Stunden-Werte
statt
$value = ReadingsVal("$NAME","nodes_".$loop_last."_consumption","null");
richtig:
$value = ReadingsVal("$NAME","nodes_24_".$loop_last."_consumption","null");
sonst werden die Verbräuche nicht in die Datenbank geschrieben.

Die Adressdaten sind auch nicht richtig, warum ist mir jetzt auf die Schnelle nicht aufgefallen, in der alten Version ging es noch (brauche ich aber nicht). Da das alte Coding nicht mehr da ist, konnte ich auch nicht vergleichen...
Mal schauen, ob diese Nacht dann alle Werte richtig kommen...

Nochmals Danke und Grüße
Frank



Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 16:30:17
Hallo Frank,

die neuen Devices dürfen natürlich nicht als Delta über das bestehende alte Device, da es diverse Verschiebugen gegeben hat.
Zitat von: Speedy68 am 21 April 2023, 16:12:12Leider sind im Coding 2 kleine Tippfehler

DEVICE
LogDBRep_EVU_Tibber_SQL
muss
LogDBRep_EVU_Tibber_connect_SQL
sein, sonst funktioniert es nicht mehr.
Habe ich korrigiert

ZitatIm userReading von EVU_Tibber_connect für die 24-Stunden-Werte
statt
$value = ReadingsVal("$NAME","nodes_".$loop_last."_consumption","null");
richtig:
$value = ReadingsVal("$NAME","nodes_24_".$loop_last."_consumption","null");
sonst werden die Verbräuche nicht in die Datenbank geschrieben.
Ist auch drin und die zweistellige Formatierung der Stunde war auch falsch.

ZitatDie Adressdaten sind auch nicht richtig, warum ist mir jetzt auf die Schnelle nicht aufgefallen, in der alten Version ging es noch (brauche ich aber nicht).
Bei mir kommt die Adresse, abgesehen von falschen Umlauten.

Manchmal macht das Copy/Past vom Browser in den RAW Editor mucken, insbesondere bei Apple.
Ich hatte aber auch noch im Hintergrung geschrieben und selber schon Fehler beseitigt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 21 April 2023, 17:05:05
Hallo zusammen,

jetzt möchte ich mal zur Diskussion stellen, nach welchen Kriterien auf dem EVU_Tibber DOIF Signale zu Verbrauchern geschickt werden sollen.

Ich sehe da mehrere Fälle:
 - Es gibt eine PV Anlage
 - Es gibt keine PV Anlage
 - Es gibt einen Hausspeicher

Generell gilt:
 - Innerhalb des Trigger Fensters

Speicher Laden:
 Wann macht es Sinn einen Hausspeicher nachzuladen?

 - Wenn der Speicher zum Triggerfenster zuwenig Ladung hat, um bis zum PV Fenster liefern zu können.
     Wird jedoch PV Leistung erwartet, braucht man ihn nicht voll zu machen.
     Ansonsten geht der PV Überschuss wieder ins Netz.
     Bei schlechter fc1 Prognose sollte man jedoch voll machen.
 - Nur in der Nacht
 - Wenn die PV Leistungsprognose für fc1 schlecht ist
 - Nur von November bis Februar
 - Am Tag, wenn die PV Leistungsprognose für fc0 schlecht ist
 - Wenn die Autarkie z.B. kleiner 80% ist

Wärmepumpe:
 - Nur in der Nacht
 - Wenn die PV Leistungsprognose für fc1 schlecht ist
 - Nur von November bis Februar
 - Am Tag, wenn die PV Leistungsprognose für fc0 schlecht ist

Klima Gerät:
 - Nur in der Nacht
 - Wenn die PV Leistungsprognose für fc1 schlecht ist
 - Am Tag, wenn die PV Leistungsprognose für fc0 schlecht ist

BEV Laden:
 - Nur in der Nacht
 - Am Tag, wenn die PV Leistungsprognose für fc0 schlecht ist

Pool Heizung:
 - Nur in der Nacht
 - Am Tag, wenn die PV Leistungsprognose für fc0 schlecht ist

Weitere Ideen sind willkommen :-)

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: PS915 am 23 April 2023, 15:11:53
Moin zusammen,

ich bin kein Kunde bei Tibber, habe mir aber einen Account angelegt sowie eine API Token. Jedoch komme ich nicht weiter, wenn ich meine homeid angebe. Bekommt man als "Nichtkunde" keinerlei Preisinfo zu seiner homeid? (mit "XXX" habe ich lediglich den Token und die homeid unkenntlich gemacht)

Bildschirmfoto 2023-04-23 um 14.43.27.png
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 23 April 2023, 15:42:57
Zitat von: PS915 am 23 April 2023, 15:11:53Moin zusammen,

ich bin kein Kunde bei Tibber, habe mir aber einen Account angelegt sowie eine API Token. Jedoch komme ich nicht weiter, wenn ich meine homeid angebe. Bekommt man als "Nichtkunde" keinerlei Preisinfo zu seiner homeid? (mit "XXX" habe ich lediglich den Token und die homeid unkenntlich gemacht)
Die Preisinfo bekommen wohl nur Kunden, ansonsten gibt es da über die Demo wohl nur etwas mit SEK.
Ich hatte sowas auch schon mal gesucht, weil ich auch kein Tibber Kunder bin, aber vorher schonmal wissen wollte, ob es sich für mich rechnet.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 24 April 2023, 18:18:44
Ich habe inzwischen den Tipper-Puls erhalten. Allerdings gelingt es mir nicht die Installation zu beenden. Die Installation muss ich abbrechen. Die Tibber-Bridge scheint fertig installiert zu sein - blaues Licht bedeutet im Netz und im Internet. Allerdings sehe ich keine Möglichkeit den Puls-IR mit der Bridge zu koppeln. Hat da jemand Erfahrung mit diesem Produkt hier gesammelt?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 24 April 2023, 18:41:47
Zitat von: Damian am 24 April 2023, 18:18:44Ich habe inzwischen den Tipper-Puls erhalten. Allerdings gelingt es mir nicht die Installation zu beenden. Die Installation muss ich abbrechen. Die Tibber-Bridge scheint fertig installiert zu sein - blaues Licht bedeutet im Netz und im Internet. Allerdings sehe ich keine Möglichkeit den Puls-IR mit der Bridge zu koppeln. Hat da jemand Erfahrung mit diesem Produkt hier gesammelt?

In der App gibt es eine Anleitung wie man einen Reset auslöst damit damit die Initialisierung neu gestartet werden kann. Ich glaube das war 3 Mal hintereinander die Bridge in die Steckdose stecken.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 24 April 2023, 18:45:09
Zitat von: Damian am 24 April 2023, 18:18:44Ich habe inzwischen den Tibber-Pulse erhalten.
Ich hoffe Dir gefällt meine Einbindung der fc0 und fc1 Diagramme ;-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 24 April 2023, 19:33:29
Danke für die Antworten. Nach zwei Tagen Suche habe ich es endlich geschafft. Ich musste die Bridge auf Werkszustand resetten (10 Mal einstecken). Dann kam ich endlich bei der Installation zum Punkt, wo man den Puls IR verbinden konnte. Offenbar reifen die Bananen noch beim Kunden. Jetzt gehe ich in den Keller und versuche meine Selbstbauelektronik dazwischenzuschalten, damit ich zum Puls IR noch meinen alten Auslesekopf parallel betreiben kann :)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: PS915 am 24 April 2023, 20:52:23
Zitat von: Damian am 24 April 2023, 19:33:29Jetzt gehe ich in den Keller und versuche meine Selbstbauelektronik dazwischenzuschalten, damit ich zum Puls IR noch meinen alten Auslesekopf parallel betreiben kann :)


Ich bin auch gerade dabei, einen IR SML Lesekopf sowie den Tibber Pulse an einem Smartmeter zu betreiben.

Nachdem ich es mit Toslink Y Adapter, IR Repeater versucht habe, kommt nun ein Prisma aus China, um zu versuchen das IR Signal optisch zu vervielfältigen.

https://de.m.wikipedia.org/wiki/Strahlteiler

Falls das klappen sollte, werde ich dazu einen einfachen 3D druckbaren Adapter entwerfen.

Screenshot_20230424-204329.png


Hat sonst noch jemand eine Idee, wie man zwei Leseköpfe an einem Smartmeter betreiben kann?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 24 April 2023, 21:19:25
In einem anderem Projekt hat jemand das so gelöst:
https://github.com/evcc-io/evcc/discussions/7070#discussioncomment-5687139
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 25 April 2023, 20:50:15
So bei mir laufen jetzt beide Sensoren parallel, siehe Fotos - hat mich nichts gekostet :)


Titel: Aw: Tibber & Tibber Pulse
Beitrag von: gvzdus am 26 April 2023, 18:41:47
Kennt Ihr diese Anleitung, um die Tibber-Bridge dauerhaft in einen Modus mit lokalem (!) Webserver zu versetzen?
https://blog.wyraz.de/allgemein/a-brief-analysis-of-the-tibber-pulse-bridge/ (https://blog.wyraz.de/allgemein/a-brief-analysis-of-the-tibber-pulse-bridge/)

Mein Plan wäre, das 47_OBIS-Modul so anzupassen, dass sich das Modul per HTTP regelmäßig die Daten lokal "zieht". Bin heute dazu gekommen, das in Rohform testweise mit einem statischen Webserver hinzubekommen. Aber wer Lust hat, kann ja schon mal probieren, ob er das lokale HTTP-Interface bei Tibber dauerhaft aktiviert bekommt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 26 April 2023, 20:22:20
Zitat von: gvzdus am 26 April 2023, 18:41:47Kennt Ihr diese Anleitung, um die Tibber-Bridge dauerhaft in einen Modus mit lokalem (!) Webserver zu versetzen?
https://blog.wyraz.de/allgemein/a-brief-analysis-of-the-tibber-pulse-bridge/ (https://blog.wyraz.de/allgemein/a-brief-analysis-of-the-tibber-pulse-bridge/)

Mein Plan wäre, das 47_OBIS-Modul so anzupassen, dass sich das Modul per HTTP regelmäßig die Daten lokal "zieht". Bin heute dazu gekommen, das in Rohform testweise mit einem statischen Webserver hinzubekommen. Aber wer Lust hat, kann ja schon mal probieren, ob er das lokale HTTP-Interface bei Tibber dauerhaft aktiviert bekommt.

Danke fürs Teilen. Da ist ja Cool, bei der Suche habe ich das gerade noch gefunden. Damit kommen die Daten per MQTT ins SmartHome.
https://github.com/micw/tibber-pulse-reader
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: gvzdus am 26 April 2023, 20:52:40
Seit ca. 20 Minuten laufen die Daten bei mir vom Pulse über HTTP in das Modul 47_OBIS rein. Ich muss eigentlich nur noch den Usernamen (HTTP-Authorization) konfigurierbar machen, dann sollte das fertig sein.

Charme ggü. anderen Lösungen: Alles in FHEM, alles ohne Cloud, wenig Speicher nötig, sekündliches Polling scheint kein Problem.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 26 April 2023, 20:57:28
Zitat von: gvzdus am 26 April 2023, 20:52:40Seit ca. 20 Minuten laufen die Daten bei mir vom Pulse über HTTP in das Modul 47_OBIS rein. Ich muss eigentlich nur noch den Usernamen (HTTP-Authorization) konfigurierbar machen, dann sollte das fertig sein.

Charme ggü. anderen Lösungen: Alles in FHEM, alles ohne Cloud, wenig Speicher nötig, sekündliches Polling scheint kein Problem.

Das hört sich gut an, bin  auch gerade dabei die Verbindung mit dem anderen Projekt zu testen. Wenn du was zum testen hast gerne her damit, dann schaue ich mir das auch gerne an.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 26 April 2023, 21:31:59
Zitat von: gvzdus am 26 April 2023, 20:52:40Seit ca. 20 Minuten laufen die Daten bei mir vom Pulse über HTTP in das Modul 47_OBIS rein. Ich muss eigentlich nur noch den Usernamen (HTTP-Authorization) konfigurierbar machen, dann sollte das fertig sein.

Charme ggü. anderen Lösungen: Alles in FHEM, alles ohne Cloud, wenig Speicher nötig, sekündliches Polling scheint kein Problem.

Diese Lösung funktioniert aber nicht mit stündlicher dynamischer Abrechnung, denn die Daten kommen dann nicht mehr bei Tibber an. Ist doch richtig?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 26 April 2023, 21:37:30
Zitat von: Damian am 26 April 2023, 21:31:59
Zitat von: gvzdus am 26 April 2023, 20:52:40Seit ca. 20 Minuten laufen die Daten bei mir vom Pulse über HTTP in das Modul 47_OBIS rein. Ich muss eigentlich nur noch den Usernamen (HTTP-Authorization) konfigurierbar machen, dann sollte das fertig sein.

Charme ggü. anderen Lösungen: Alles in FHEM, alles ohne Cloud, wenig Speicher nötig, sekündliches Polling scheint kein Problem.

Diese Lösung funktioniert aber nicht mit stündlicher dynamischer Abrechnung, denn die Daten kommen dann nicht mehr bei Tibber an. Ist doch richtig?

Nein Die Daten kommen weiter an, es werden die Daten nur Parallel lokal abgefragt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 26 April 2023, 22:55:00
OK. Dann macht es Sinn beim dynamischen Tarif. Aber dann mit Cloud, da die Daten weitergereicht werden.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: gvzdus am 26 April 2023, 23:12:25
Ja, natürlich grundsätzlich weiter mit Cloud, wenn gerade verfügbar, damit die Tibber-Funktionen (und Abrechnung) funktioniert.
Wenn die Cloud oder das Internet aber mal unpässlich sind, funktioniert die Heimautomatisierung (z.B. PV-Überschussladen) dann auch weiterhin.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: gvzdus am 26 April 2023, 23:46:41
Erster Wurf ist fertig zum Testen:
https://forum.fhem.de/index.php?topic=133358.0
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 27 April 2023, 10:26:24
Zitat von: gvzdus am 26 April 2023, 23:46:41Erster Wurf ist fertig zum Testen:
https://forum.fhem.de/index.php?topic=133358.0

Ist auf jeden Fall eine gute Alternative für Leute, die hardwaretechnisch nicht basteln wollen. Dann wollen wir hoffen, dass die Hintertür offen bleibt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 04 Mai 2023, 19:46:41
Ich bin inzwischen Tibber-Kunde mit einem dynamischen Stundentarif. Ernst wird es erst Mitte des Monats, ich habe aber inzwischen alle Voraussetzungen (Puls + Stromzähleranbindung in FHEM + Tibber-ID) um die Tibber-Stromkosten zu berechnen.
Ich habe aufbauend auf ch.eick EVU-Tibber HTTPMOD-Definition ein DOIF-Device zum Berechnen der stündlichen Kosten mit Visualisierung und ein zweites DOIF-Device für die langzeit-Statistik definiert.

Falls jemand es nachbauen möchte:

defmod di_tibber DOIF { [00:00:30];;\
fhem("get EVU_Tibber 02_priceAll");;\
}\
\
{ [00:00:40];;\
my $out;;\
for (my $i=0;;$i<=23;;$i++){\
  $out.=ReadingsVal("EVU_Tibber",sprintf("fc0_%02d_startsAt",$i),"")." ".(ReadingsVal("EVU_Tibber",sprintf("fc0_%02d_total",$i),"")*100)."\n";;\
}\
::DOIF_modify_card_data ("$SELF","EVU_Tibber","Strompreis","bar2day",0,$out);;\
}\
{\
[:00];;\
fhem("get EVU_Tibber 01_priceInfo");;\
set_Reading("cHourCounter",[?MQTT2_DVES_C58DCB:total_c])\
}\
{\
  my $counter=[MQTT2_DVES_C58DCB:total_c];;\
  my $costs=($counter-get_Reading("cCounter",$counter))*-[?EVU_Tibber:Strompreis]/100;;\
  my $costshour=($counter-get_Reading("cHourCounter",$counter))*-[?EVU_Tibber:Strompreis]/100;;\
  set_Reading("costsLastHour",$costshour,1);;\
  set_Reading("costsSum",get_Reading("costsSum")+$costs,1);;\
  set_Reading("cCounter",$counter);;\
}
attr di_tibber room Verbrauch,test->test11
attr di_tibber uiTable {package ui_Table;;}\
card([EVU_Tibber:Strompreis:bar2day],"Stundentarif",undef,0,40,90,0,"Cent",undef,"1",",fixedscaling,,,,halfring")|\
card([$SELF:costsLastHour:bar2day],"Kosten pro Stunde",undef,0,0.4,90,0,"€",undef,"2",",fixedscaling,,,,halfring")

Edit: Definition angepasst


Für die Langzeitdaten wird dann nur noch das Reading [di_tibber:costsSum] verwendet.

siehe dazu auch https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-,_Monats-_und_Jahresstatistik_f%C3%BCr_Strom-,_Gas-,_Wasserz%C3%A4hler_und_andere_Z%C3%A4hler

Ergebnis im Anhang. Da es noch nicht lange läuft, sind erst Daten von gestern und heute berechnet und visualisiert.[/code]
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 05 Mai 2023, 14:03:48
Zitat von: Damian am 04 Mai 2023, 19:46:41Ich bin inzwischen Tibber-Kunde mit einem dynamischen Stundentarif. Ernst wird es erst Mitte des Monats, ich habe aber inzwischen alle Voraussetzungen (Puls + Stromzähleranbindung in FHEM + Tibber-ID) um die Tibber-Stromkosten zu berechnen.
Ich habe aufbauend auf ch.eick EVU-Tibber HTTPMOD-Definition ein DOIF-Device zum Berechnen der stündlichen Kosten mit Visualisierung und ein zweites DOIF-Device für die langzeit-Statistik definiert.

< snip >

Für die Langzeitdaten wird dann nur noch das Reading [di_tibber:costsSum] verwendet.
siehe dazu auch https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-,_Monats-_und_Jahresstatistik_f%C3%BCr_Strom-,_Gas-,_Wasserz%C3%A4hler_und_andere_Z%C3%A4hler
Für die DbLog Verwender könnte man die Statistiken direkt in der DB berechnen, was in meiner Definition bereits erfolgt und im uiTable auch angezegt wird.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 22 Mai 2023, 16:20:15
Falls jemand denkt der ausgewiesener Total-Preis/kWh wäre schon alles, der irrt. Ich habe seit dem 16. Mai den Puls im Einsatz. Die Berechnung meiner Kosten wich um über 30 % von der Berechnung der Kosten bei Tibber, obwohl der stündliche Verbrauch übereinstimmte. Dass man 3,99 € monatlich an Tibber bezahlen muss war mir klar, was mir aber nicht klar war, dass  Netznutzungsgebühren (fix), Messstellengebühr (fix) auch noch dazu kommen und nicht im angegebenen Totalpreis/kWh enthalten sind.

Hier mal die Aufstellung von Tibber auf meine Anfrage:

Welche Preisbestandteile findest du in deiner Preis-Blase?

•   Börsenstrompreis
•   Stromsteuer
•   Offshore Netzumlage
•   KWKG-Umlage
•   Umlage abschaltbarer Lasten
•   Strom NEV Umlage
•   Beschaffungskosten und Herkunftsnachweise
•   Konzessionsabgabe
•   Mehrwertsteuer
•   Netznutzungsgebühren (variabel)

Nicht enthalten: Monatliche Tibber Gebühr (fix), Netznutzungsgebühren (fix), Messstellengebühr (fix)


Sollte man nur wissen, falls man zu Tibber wechselt ;)

Naja, ist aber immer doch günstiger als bei anderen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 23 Mai 2023, 09:34:19
Zitat von: Damian am 22 Mai 2023, 16:20:15Falls jemand denkt der ausgewiesener Total-Preis/kWh wäre schon alles, der irrt. Ich habe seit dem 16. Mai den Puls im Einsatz. Die Berechnung meiner Kosten wich um über 30 % von der Berechnung der Kosten bei Tibber, obwohl der stündliche Verbrauch übereinstimmte. Dass man 3,99 € monatlich an Tibber bezahlen muss war mir klar, was mir aber nicht klar war, dass  Netznutzungsgebühren (fix), Messstellengebühr (fix) auch noch dazu kommen und nicht im angegebenen Totalpreis/kWh enthalten sind.

Hier mal die Aufstellung von Tibber auf meine Anfrage:

< snip >

Sollte man nur wissen, falls man zu Tibber wechselt ;)

Naja, ist aber immer doch günstiger als bei anderen.
Moin,
könntest du dann mal die vollständige Formel ermitteln, damit man das mit dem Totalpreis/kWh als echten Total berechnen kann?
Ziel wäre ja, dass man mit den abgefragten Werten auf den echten Rechnungsbetrag kommt, wobei das sicherlich wieder Regional zu betrachten ist.
Bei mir ist der Netzanbieter immer teurer gewesen, als im Vergleich zu Ballungsgebieten.

Bei aWATTar gibt es da ja auch eine Berechnungsgrundlage, sogar mit einer Deckelung, wenn ich mich recht erinnere.
Es bleibt somit ein Problem, da man im Sommer fast nichts benötigt und im Winter der Preis leider oft nicht niedrig genug ist, um den Jahresschnitt auszugleichen.
Nach meinen Vergleichen mit aWATTar habe ich es wenn überhaupt nur auf eine Nullrunde gebracht. Man muss wirklich sehr tief in den Vergleich einsteugen und den mit seiner eigenen Realität betrachten.
Wann braucht man das Netz, kann man dann den Speicher laden und Starkverbraucher sofort variabel aktivieren? Wie ist die Leistungsprognose der PV-Anlage? Es sind echt viele Fragen.
Für Endverbraucher ohne PV-Anlage ist das sicherlich einfacher zu betrachten. Und mit E-Auto ohne PV-Anlage denke ich wird es sich schon lohnen.

Bei mir mit 100% Autarkie von ca. April bis Oktober bleibt nur der Winter, obwohl bereits das E-Auto mit drin ist. Ich komme nur auf 2600 kWh/a aus dem Netz.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 23 Mai 2023, 09:58:02
Ich habe noch keine monatlich Abrechnung bekommen, die wird wohl erst im Juni kommen.

Tibber rechnet wohl die Fix-Gebühren auf die stündlichen Kosten um.

Auf der Tibberseite kann man die monatlichen Kosten für die eigene Region berechnen lassen. Wenn ich dort meine Postleitzahl eingebe, dann kommen zu den dynamischen (variablen) Kosten folgende Fixkosten hinzu:

Grundpreis (monatlich)
Netznutzungs- und Messstellengebühren*
5,07 €/Monat
Tibber Gebühr
3,99 €/Monat
Summe monatliche Kosten
9,06 €/Monat

Die 9,06 werden dann offenbar in der Tibberapp auf die Stunden verteilt (stündliche Abrechnung)

9,06/30/24=0,0125

D.h. in der stündlichen Kostenberechnung kommen bei mir ca. 1,25 Cent zu den variablen Stundenkosten (Verbrauch * Stundenpreis/kwh) dazu. Das kann man daran erkennen, dass auch wenn ich garkeinen Strom in einer Stunde verbrauche, Kosten von 0,01 € in der Stunde in der Tibberapp ausgewiesen werden.


Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 23 Mai 2023, 10:12:14
Hi Damian,
dann beobachte und analysier das mal noch etwas, bis die erste Rechnung da ist, danach sollten wir die Berechnung im Device dann anpassen oder ergänzen.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Sidey am 28 Mai 2023, 22:05:42
Hi, 

Vielleicht ein bisschen OT:

Das mit Tibber klingt irgendwie zu gut denke ich.

Wenn ich das mit meinem jetzigen Anbieter vergleiche, dann ist Tibber zu jeder Uhrzeit günstiger.

Und mit der Strompreisbremse gibt es es auch kein Risiko oder?


Grüße Sidey
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 28 Mai 2023, 23:47:08
Zitat von: Sidey am 28 Mai 2023, 22:05:42Hi, 

Vielleicht ein bisschen OT:

Das mit Tibber klingt irgendwie zu gut denke ich.

Wenn ich das mit meinem jetzigen Anbieter vergleiche, dann ist Tibber zu jeder Uhrzeit günstiger.

Und mit der Strompreisbremse gibt es es auch kein Risiko oder?


Grüße Sidey

Erstmal nicht, du musst nur beim bisherigen Versorger rauskommen und bevor du wechselt lass dich für 50 Euro einladen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 29 Mai 2023, 10:33:26
Bei mir ist das leider nicht so
- Die Grundkosten sind bei meiner PLZ höher
- Ich zahle nur 26 ct/kWh beim Grundversorger
- Im Winter war es nur recht selten wirklich günstiger, dass es sich gelohnt hätte den Hausspeicher zu laden
- Das E-Auto hätte die Situation etwas verbessert
- Trotz E-Auto und WP komme ich nur auf 2600 kWh aus dem Netz und davon könnte ich nur einen kleinen Teil günstiger bekommen, was jedoch den höheren Grundpreis nur sehr knapp decken würde.

Es ist also sehr individuell zu betrachten.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 29 Mai 2023, 21:02:03
ja, das muss jeder für sich durchrechnen.

Heute und gestern hätte man (auch ohne PV) kurz nach dem Mittag fast umsonst sein Auto laden können.

Im Anhang meine Daten des Monats. Die Grundgebühr von ca. 10 Euro muss man noch dazu rechnen. Natürlich relativiert zu sehen, da wir PV haben.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 29 Mai 2023, 21:08:07
Ja da kann ich nur zustimmen. Man kann es eben nicht pauschal sagen ob es sich Lohnt. Das hängt von vielen Faktoren ab wie z.B. die lokalen Kosten wie Netznutzungsgebühr, Messstellengebühr und der Stromverbrauch mit oder ohne PV. Bei uns war z.B. gestern und heute negative Preise (inklusive Steuern). Das fühlt sich zwar gut an aber wie schon von den anderen erwähnt, im Sommer hilft das eher denen, die keine PV haben. Trotzdem war es bei uns im Winter mit zwei E-Autos doch lukrativer als beim  örtlichen Versorger und ich finde das Konzept sehr gut und dadurch unterstütze ich es auch gerne.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 29 Mai 2023, 21:16:35
ich denke, wenn man keine PV Anlage hat, dann profitiert man noch mehr, weil der Stundenpreis an der Börse dann günstig sind, wenn insb. PV ohnehin Strom produziert hätte.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 02 Juni 2023, 20:30:26
Da ich mit den Tibber-Werten ein wenig weiterrechnen wollte, habe ich ein Hash erzeugt, das die Werte in einer "vorberechneten" Form vorhält. In der Hoffnung, dass es auch für jemanden von euch nützlich ist:

defmod Tibber.device HTTPMOD https://api.tibber.com/v1-beta/gql 300
attr Tibber.device alias Tibber
attr Tibber.device alignTime 00:00:10
attr Tibber.device disable 0
attr Tibber.device enableControlSet 1
attr Tibber.device get01-1Name current_currency
attr Tibber.device get01-2Name current_level
attr Tibber.device get01-3Name current_date
attr Tibber.device get01-3OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get01-4Name current_price
attr Tibber.device get01-4OExpr $val *100
attr Tibber.device get01Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total startsAt currency level}}}}}}" }
attr Tibber.device get01Header01 Content-Type: application/json
attr Tibber.device get01Header02 Authorization: Bearer %%token%%
attr Tibber.device get01JSON data_viewer_home_currentSubscription_priceInfo_current
attr Tibber.device get01Name 01_priceInfo
attr Tibber.device get01Poll 1
attr Tibber.device get01URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get02-10Name fc0_03_total
attr Tibber.device get02-11Name fc0_04_startsAt
attr Tibber.device get02-11OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-12Name fc0_04_total
attr Tibber.device get02-13Name fc0_05_startsAt
attr Tibber.device get02-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-14Name fc0_05_total
attr Tibber.device get02-15Name fc0_06_startsAt
attr Tibber.device get02-15OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-16Name fc0_06_total
attr Tibber.device get02-17Name fc0_07_startsAt
attr Tibber.device get02-17OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-18Name fc0_07_total
attr Tibber.device get02-19Name fc0_08_startsAt
attr Tibber.device get02-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-1Name current_date
attr Tibber.device get02-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-20Name fc0_08_total
attr Tibber.device get02-21Name fc0_09_startsAt
attr Tibber.device get02-21OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-22Name fc0_09_total
attr Tibber.device get02-23Name fc0_10_startsAt
attr Tibber.device get02-23OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-24Name fc0_10_total
attr Tibber.device get02-25Name fc0_11_startsAt
attr Tibber.device get02-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-26Name fc0_11_total
attr Tibber.device get02-27Name fc0_12_startsAt
attr Tibber.device get02-27OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-28Name fc0_12_total
attr Tibber.device get02-29Name fc0_13_startsAt
attr Tibber.device get02-29OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-2Name current_price
attr Tibber.device get02-2OExpr $val *100
attr Tibber.device get02-30Name fc0_13_total
attr Tibber.device get02-31Name fc0_14_startsAt
attr Tibber.device get02-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-32Name fc0_14_total
attr Tibber.device get02-33Name fc0_15_startsAt
attr Tibber.device get02-33OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-34Name fc0_15_total
attr Tibber.device get02-35Name fc0_16_startsAt
attr Tibber.device get02-35OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-36Name fc0_16_total
attr Tibber.device get02-37Name fc0_17_startsAt
attr Tibber.device get02-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-38Name fc0_17_total
attr Tibber.device get02-39Name fc0_18_startsAt
attr Tibber.device get02-39OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-3Name fc0_00_startsAt
attr Tibber.device get02-3OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-40Name fc0_18_total
attr Tibber.device get02-41Name fc0_19_startsAt
attr Tibber.device get02-41OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-42Name fc0_19_total
attr Tibber.device get02-43Name fc0_20_startsAt
attr Tibber.device get02-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-44Name fc0_20_total
attr Tibber.device get02-45Name fc0_21_startsAt
attr Tibber.device get02-45OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-46Name fc0_21_total
attr Tibber.device get02-47Name fc0_22_startsAt
attr Tibber.device get02-47OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-48Name fc0_22_total
attr Tibber.device get02-49Name fc0_23_startsAt
attr Tibber.device get02-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-4Name fc0_00_total
attr Tibber.device get02-50Name fc0_23_total
attr Tibber.device get02-51MaxAge {12*60*60}
attr Tibber.device get02-51MaxAgeReplacementMode delete
attr Tibber.device get02-51Name fc1_00_startsAt
attr Tibber.device get02-51OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-52MaxAge {12*60*60}
attr Tibber.device get02-52MaxAgeReplacementMode delete
attr Tibber.device get02-52Name fc1_00_total
attr Tibber.device get02-53Name fc1_01_startsAt
attr Tibber.device get02-53OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-54Name fc1_01_total
attr Tibber.device get02-55Name fc1_02_startsAt
attr Tibber.device get02-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-56Name fc1_02_total
attr Tibber.device get02-57Name fc1_03_startsAt
attr Tibber.device get02-57OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-58Name fc1_03_total
attr Tibber.device get02-59Name fc1_04_startsAt
attr Tibber.device get02-59OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-5Name fc0_01_startsAt
attr Tibber.device get02-5OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-60Name fc1_04_total
attr Tibber.device get02-61Name fc1_05_startsAt
attr Tibber.device get02-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-62Name fc1_05_total
attr Tibber.device get02-63Name fc1_06_startsAt
attr Tibber.device get02-63OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-64Name fc1_06_total
attr Tibber.device get02-65Name fc1_07_startsAt
attr Tibber.device get02-65OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-66Name fc1_07_total
attr Tibber.device get02-67Name fc1_08_startsAt
attr Tibber.device get02-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-68Name fc1_08_total
attr Tibber.device get02-69Name fc1_09_startsAt
attr Tibber.device get02-69OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-6Name fc0_01_total
attr Tibber.device get02-70Name fc1_09_total
attr Tibber.device get02-71Name fc1_10_startsAt
attr Tibber.device get02-71OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-72Name fc1_10_total
attr Tibber.device get02-73Name fc1_11_startsAt
attr Tibber.device get02-73OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-74Name fc1_11_total
attr Tibber.device get02-75Name fc1_12_startsAt
attr Tibber.device get02-75OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-76Name fc1_12_total
attr Tibber.device get02-77Name fc1_13_startsAt
attr Tibber.device get02-77OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-78Name fc1_13_total
attr Tibber.device get02-79Name fc1_14_startsAt
attr Tibber.device get02-79OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-7Name fc0_02_startsAt
attr Tibber.device get02-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-80Name fc1_14_total
attr Tibber.device get02-81Name fc1_15_startsAt
attr Tibber.device get02-81OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-82Name fc1_15_total
attr Tibber.device get02-83Name fc1_16_startsAt
attr Tibber.device get02-83OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-84Name fc1_16_total
attr Tibber.device get02-85Name fc1_17_startsAt
attr Tibber.device get02-85OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-86Name fc1_17_total
attr Tibber.device get02-87Name fc1_18_startsAt
attr Tibber.device get02-87OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-88Name fc1_18_total
attr Tibber.device get02-89Name fc1_19_startsAt
attr Tibber.device get02-89OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-8Name fc0_02_total
attr Tibber.device get02-90Name fc1_19_total
attr Tibber.device get02-91Name fc1_20_startsAt
attr Tibber.device get02-91OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-92Name fc1_20_total
attr Tibber.device get02-93Name fc1_21_startsAt
attr Tibber.device get02-93OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-94Name fc1_21_total
attr Tibber.device get02-95Name fc1_22_startsAt
attr Tibber.device get02-95OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-96Name fc1_22_total
attr Tibber.device get02-97Name fc1_23_startsAt
attr Tibber.device get02-97OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02-98Name fc1_23_total
attr Tibber.device get02-9Name fc0_03_startsAt
attr Tibber.device get02-9OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get02Data { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total startsAt} today {total startsAt} tomorrow {total startsAt}}}}}}" }
attr Tibber.device get02Header01 Content-Type: application/json
attr Tibber.device get02Header02 Authorization: Bearer %%token%%
attr Tibber.device get02JSON data_viewer_home_currentSubscription_priceInfo
attr Tibber.device get02Name 02_priceAll
attr Tibber.device get02Poll 1
attr Tibber.device get02URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get03-1Name nodes_00_00_from
attr Tibber.device get03-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get03-2Name nodes_00_00_cost
attr Tibber.device get03-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get03-3Name nodes_00_00_consumption
attr Tibber.device get03-4Name nodes_00_01_from
attr Tibber.device get03-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get03-50Name nodes_00_01_cost
attr Tibber.device get03-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get03-5Name nodes_00_01_cost
attr Tibber.device get03-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get03-6Name nodes_00_01_consumption
attr Tibber.device get03-7Name nodes_00_02_from
attr Tibber.device get03-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get03-8Name nodes_00_02_cost
attr Tibber.device get03-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get03-9Name nodes_00_02_consumption
attr Tibber.device get03Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 3) {nodes {from cost consumption }}}}}"}
attr Tibber.device get03Header01 Content-Type: application/json
attr Tibber.device get03Header02 Authorization: Bearer %%token%%
attr Tibber.device get03Name 03_consumption_hour
attr Tibber.device get03RegOpt g
attr Tibber.device get03Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr Tibber.device get03URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get04-10Name nodes_24_03_from
attr Tibber.device get04-10OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-11Name nodes_24_03_cost
attr Tibber.device get04-11OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-12Name nodes_24_03_consumption
attr Tibber.device get04-13Name nodes_24_04_from
attr Tibber.device get04-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-14Name nodes_24_04_cost
attr Tibber.device get04-14OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-15Name nodes_24_04_consumption
attr Tibber.device get04-16Name nodes_24_05_from
attr Tibber.device get04-16OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-17Name nodes_24_05_cost
attr Tibber.device get04-17OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-18Name nodes_24_05_consumption
attr Tibber.device get04-19Name nodes_24_06_from
attr Tibber.device get04-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-1Name nodes_24_00_from
attr Tibber.device get04-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-20Name nodes_24_06_cost
attr Tibber.device get04-20OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-21Name nodes_24_06_consumption
attr Tibber.device get04-22Name nodes_24_07_from
attr Tibber.device get04-22OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-23Name nodes_24_07_cost
attr Tibber.device get04-23OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-24Name nodes_24_07_consumption
attr Tibber.device get04-25Name nodes_24_08_from
attr Tibber.device get04-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-26Name nodes_24_08_cost
attr Tibber.device get04-26OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-27Name nodes_24_08_consumption
attr Tibber.device get04-28Name nodes_24_09_from
attr Tibber.device get04-28OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-29Name nodes_24_09_cost
attr Tibber.device get04-29OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-2Name nodes_24_00_cost
attr Tibber.device get04-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-30Name nodes_24_09_consumption
attr Tibber.device get04-31Name nodes_24_10_from
attr Tibber.device get04-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-32Name nodes_24_10_cost
attr Tibber.device get04-32OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-33Name nodes_24_10_consumption
attr Tibber.device get04-34Name nodes_24_11_from
attr Tibber.device get04-34OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-35Name nodes_24_11_cost
attr Tibber.device get04-35OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-36Name nodes_24_11_consumption
attr Tibber.device get04-37Name nodes_24_12_from
attr Tibber.device get04-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-38Name nodes_24_12_cost
attr Tibber.device get04-38OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-39Name nodes_24_12_consumption
attr Tibber.device get04-3Name nodes_24_00_consumption
attr Tibber.device get04-40Name nodes_24_13_from
attr Tibber.device get04-40OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-41Name nodes_24_13_cost
attr Tibber.device get04-41OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-42Name nodes_24_13_consumption
attr Tibber.device get04-43Name nodes_24_14_from
attr Tibber.device get04-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-44Name nodes_24_14_cost
attr Tibber.device get04-44OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-45Name nodes_24_14_consumption
attr Tibber.device get04-46Name nodes_24_15_from
attr Tibber.device get04-46OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-47Name nodes_24_15_cost
attr Tibber.device get04-47OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-48Name nodes_24_15_consumption
attr Tibber.device get04-49Name nodes_24_16_from
attr Tibber.device get04-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-4Name nodes_24_01_from
attr Tibber.device get04-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-50Name nodes_24_16_cost
attr Tibber.device get04-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-51Name nodes_24_16_consumption
attr Tibber.device get04-52Name nodes_24_17_from
attr Tibber.device get04-52OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-53Name nodes_24_17_cost
attr Tibber.device get04-53OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-54Name nodes_24_17_consumption
attr Tibber.device get04-55Name nodes_24_18_from
attr Tibber.device get04-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-56Name nodes_24_18_cost
attr Tibber.device get04-56OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-57Name nodes_24_18_consumption
attr Tibber.device get04-58Name nodes_24_19_from
attr Tibber.device get04-58OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-59Name nodes_24_19_cost
attr Tibber.device get04-59OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-5Name nodes_24_01_cost
attr Tibber.device get04-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-60Name nodes_24_19_consumption
attr Tibber.device get04-61Name nodes_24_20_from
attr Tibber.device get04-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-62Name nodes_24_20_cost
attr Tibber.device get04-62OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-63Name nodes_24_20_consumption
attr Tibber.device get04-64Name nodes_24_21_from
attr Tibber.device get04-64OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-65Name nodes_24_21_cost
attr Tibber.device get04-65OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-66Name nodes_24_21_consumption
attr Tibber.device get04-67Name nodes_24_22_from
attr Tibber.device get04-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-68Name nodes_24_22_cost
attr Tibber.device get04-68OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-69Name nodes_24_22_consumption
attr Tibber.device get04-6Name nodes_24_01_consumption
attr Tibber.device get04-70Name nodes_24_23_from
attr Tibber.device get04-70OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-71Name nodes_24_23_cost
attr Tibber.device get04-71OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-72Name nodes_24_23_consumption
attr Tibber.device get04-7Name nodes_24_02_from
attr Tibber.device get04-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get04-8Name nodes_24_02_cost
attr Tibber.device get04-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get04-9Name nodes_24_02_consumption
attr Tibber.device get04Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 24) {nodes {from cost consumption}}}}}"}
attr Tibber.device get04Header01 Content-Type: application/json
attr Tibber.device get04Header02 Authorization: Bearer %%token%%
attr Tibber.device get04Name 04_consumption_hour_24
attr Tibber.device get04RegOpt g
attr Tibber.device get04Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr Tibber.device get04URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get05-10Name Adresse_01_Nachname
attr Tibber.device get05-1Name Adresse_03_Strasse
attr Tibber.device get05-2Name Adresse_05_Ort
attr Tibber.device get05-3Name Adresse_06_Land
attr Tibber.device get05-4Name Adresse_09_latitude
attr Tibber.device get05-5Name Adresse_10_longitude
attr Tibber.device get05-6Name Adresse_04_Plz
attr Tibber.device get05-7Name Adresse_08_eMail
attr Tibber.device get05-8Name Adresse_07_Telefon
attr Tibber.device get05-9Name Adresse_02_Vorname
attr Tibber.device get05Data { "query": "{viewer {home(id:\"%%homeID%%\") {consumption(resolution: HOURLY, last: 100) {nodes {from to cost unitPrice unitPriceVAT consumption consumptionUnit}}}}}"}
attr Tibber.device get05Header01 Content-Type: application/json
attr Tibber.device get05Header02 Authorization: Bearer %%token%%
attr Tibber.device get05JSON data_viewer_home
attr Tibber.device get05Name 05_consumption_hourly_100
attr Tibber.device get05URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get06-10Name Adresse_01_Nachname
attr Tibber.device get06-1Name Adresse_03_Strasse
attr Tibber.device get06-2Name Adresse_05_Ort
attr Tibber.device get06-3Name Adresse_06_Land
attr Tibber.device get06-4Name Adresse_09_latitude
attr Tibber.device get06-5Name Adresse_10_longitude
attr Tibber.device get06-6Name Adresse_04_Plz
attr Tibber.device get06-7Name Adresse_08_eMail
attr Tibber.device get06-8Name Adresse_07_Telefon
attr Tibber.device get06-9Name Adresse_02_Vorname
attr Tibber.device get06Data { "query": "{viewer {home(id:\"%%homeID%%\") {address {address1 address2 address3 postalCode city country latitude longitude} owner {firstName lastName contactInfo {email mobile}}}}}" }
attr Tibber.device get06Header01 Content-Type: application/json
attr Tibber.device get06Header02 Authorization: Bearer %%token%%
attr Tibber.device get06JSON data_viewer_home
attr Tibber.device get06Name 06_address
attr Tibber.device get06URL https://api.tibber.com/v1-beta/gql
attr Tibber.device get07-10Name nodes_24_03_from
attr Tibber.device get07-10OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-11Name nodes_24_03_cost
attr Tibber.device get07-11OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-12Name nodes_24_03_consumption
attr Tibber.device get07-13Name nodes_24_04_from
attr Tibber.device get07-13OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-14Name nodes_24_04_cost
attr Tibber.device get07-14OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-15Name nodes_24_04_consumption
attr Tibber.device get07-16Name nodes_24_05_from
attr Tibber.device get07-16OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-17Name nodes_24_05_cost
attr Tibber.device get07-17OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-18Name nodes_24_05_consumption
attr Tibber.device get07-19Name nodes_24_06_from
attr Tibber.device get07-19OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-1Name features_realTimeConsumptionEnabled
attr Tibber.device get07-1OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-20Name nodes_24_06_cost
attr Tibber.device get07-20OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-21Name nodes_24_06_consumption
attr Tibber.device get07-22Name nodes_24_07_from
attr Tibber.device get07-22OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-23Name nodes_24_07_cost
attr Tibber.device get07-23OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-24Name nodes_24_07_consumption
attr Tibber.device get07-25Name nodes_24_08_from
attr Tibber.device get07-25OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-26Name nodes_24_08_cost
attr Tibber.device get07-26OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-27Name nodes_24_08_consumption
attr Tibber.device get07-28Name nodes_24_09_from
attr Tibber.device get07-28OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-29Name nodes_24_09_cost
attr Tibber.device get07-29OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-2Name features_id
attr Tibber.device get07-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-30Name nodes_24_09_consumption
attr Tibber.device get07-31Name nodes_24_10_from
attr Tibber.device get07-31OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-32Name nodes_24_10_cost
attr Tibber.device get07-32OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-33Name nodes_24_10_consumption
attr Tibber.device get07-34Name nodes_24_11_from
attr Tibber.device get07-34OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-35Name nodes_24_11_cost
attr Tibber.device get07-35OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-36Name nodes_24_11_consumption
attr Tibber.device get07-37Name nodes_24_12_from
attr Tibber.device get07-37OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-38Name nodes_24_12_cost
attr Tibber.device get07-38OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-39Name nodes_24_12_consumption
attr Tibber.device get07-3Name nodes_24_00_consumption
attr Tibber.device get07-40Name nodes_24_13_from
attr Tibber.device get07-40OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-41Name nodes_24_13_cost
attr Tibber.device get07-41OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-42Name nodes_24_13_consumption
attr Tibber.device get07-43Name nodes_24_14_from
attr Tibber.device get07-43OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-44Name nodes_24_14_cost
attr Tibber.device get07-44OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-45Name nodes_24_14_consumption
attr Tibber.device get07-46Name nodes_24_15_from
attr Tibber.device get07-46OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-47Name nodes_24_15_cost
attr Tibber.device get07-47OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-48Name nodes_24_15_consumption
attr Tibber.device get07-49Name nodes_24_16_from
attr Tibber.device get07-49OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-4Name nodes_24_01_from
attr Tibber.device get07-4OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-50Name nodes_24_16_cost
attr Tibber.device get07-50OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-51Name nodes_24_16_consumption
attr Tibber.device get07-52Name nodes_24_17_from
attr Tibber.device get07-52OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-53Name nodes_24_17_cost
attr Tibber.device get07-53OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-54Name nodes_24_17_consumption
attr Tibber.device get07-55Name nodes_24_18_from
attr Tibber.device get07-55OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-56Name nodes_24_18_cost
attr Tibber.device get07-56OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-57Name nodes_24_18_consumption
attr Tibber.device get07-58Name nodes_24_19_from
attr Tibber.device get07-58OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-59Name nodes_24_19_cost
attr Tibber.device get07-59OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-5Name nodes_24_01_cost
attr Tibber.device get07-5OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-60Name nodes_24_19_consumption
attr Tibber.device get07-61Name nodes_24_20_from
attr Tibber.device get07-61OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-62Name nodes_24_20_cost
attr Tibber.device get07-62OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-63Name nodes_24_20_consumption
attr Tibber.device get07-64Name nodes_24_21_from
attr Tibber.device get07-64OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-65Name nodes_24_21_cost
attr Tibber.device get07-65OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-66Name nodes_24_21_consumption
attr Tibber.device get07-67Name nodes_24_22_from
attr Tibber.device get07-67OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-68Name nodes_24_22_cost
attr Tibber.device get07-68OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-69Name nodes_24_22_consumption
attr Tibber.device get07-6Name nodes_24_01_consumption
attr Tibber.device get07-70Name nodes_24_23_from
attr Tibber.device get07-70OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-71Name nodes_24_23_cost
attr Tibber.device get07-71OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-72Name nodes_24_23_consumption
attr Tibber.device get07-7Name nodes_24_02_from
attr Tibber.device get07-7OExpr $val =~ s/T/ /g ;; substr($val,0,19)
attr Tibber.device get07-8Name nodes_24_02_cost
attr Tibber.device get07-8OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val
attr Tibber.device get07-9Name nodes_24_02_consumption
attr Tibber.device get07Data { "query": "{viewer {home(id:\"%%homeID%%\") {id features{realTimeConsumptionEnabled} } } }" }
attr Tibber.device get07Header01 Content-Type: application/json
attr Tibber.device get07Header02 Authorization: Bearer %%token%%
attr Tibber.device get07JSON data_viewer_home
attr Tibber.device get07Name 07_realTimeConsumptionEnabled
attr Tibber.device get07RegOpt g
attr Tibber.device get07Regex \{"from":"([\d+-]+T[\d+:]+\.000[+-][\d+:]+)","cost":(null|\d+\.\d+|0),"consumption":(null|\d+\.\d+|0)\}
attr Tibber.device get07URL https://api.tibber.com/v1-beta/gql
attr Tibber.device group Strom
attr Tibber.device icon stromzaehler_icon
attr Tibber.device replacement01Mode reading
attr Tibber.device replacement01Regex %%token%%
attr Tibber.device replacement01Value token
attr Tibber.device replacement02Mode reading
attr Tibber.device replacement02Regex %%homeID%%
attr Tibber.device replacement02Value homeID
attr Tibber.device requestData { "query": "{viewer {home(id:\"%%homeID%%\") {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
attr Tibber.device requestHeader1 Content-Type: application/json
attr Tibber.device requestHeader2 Authorization: Bearer %%token%%
attr Tibber.device room Photovoltaik
attr Tibber.device showBody 0
attr Tibber.device showError 1
attr Tibber.device stateFormat current_price cent/kWh (=current_level)
attr Tibber.device userReadings ProcessValues {\
my $result = "";;\
\
#get forecast cost as array\
my @fc_cost = sort\
              grep { $_ =~ /^fc(?:0|1)_[0-9]{1,2}_total$/ }\
              keys %{$defs{$NAME}{READINGS}};;\
\
#get forecast time as array\
my @fc_startsAt = sort\
                  grep { $_ =~ /^fc(?:0|1)_[0-9]{1,2}_startsAt$/ }\
                  keys %{$defs{$NAME}{READINGS}};;\
\
#$result .= "Found ".scalar(@fc_cost)." cost entries\n";;\
#$result .= "Found ".scalar(@fc_startsAt)." startsAt entries\n";;\
#$result .= join("\n", map { $fc_cost[$_].", ".$fc_startsAt[$_] } 0 .. $#fc_cost );;\
\
#add entries for each hour, build datastructure\
my %seen;;\
map {\
      my $startsAt = ReadingsVal($NAME, $fc_startsAt[$_], '');;\
      my ($year, $month, $day, $hour, $min, $sec) = $startsAt =~ /(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})/;;\
      my $epoch_time = timelocal($sec, $min, $hour, $day, $month-1, $year);;\
\
      ${$defs{$NAME}{"TibberValues"}}[$_] =\
      {\
  'Basename' => ($fc_cost[$_] =~ /(fc(?:0|1)_[0-9]{1,2}_)/) ? $1 : '???', #keep the name prefix\
        'Cost'     => ReadingsVal($NAME, $fc_cost[$_], 0), #the total cost for this hour\
'Outdated' => ( $epoch_time <= time() ) ? 1 : 0, #is the entry in the past?\
'Unique'   => ( $seen{"$startsAt"}++ ) ? 0 : 1, #is the entries start-time unique?\
'StartsAt' => "$startsAt" #keep the start-time\
      }\
    } 0 .. $#fc_cost;; #iterate over this index, should be consistent\
\
#define the variable $hash for convenience\
my $hash = $defs{$NAME}{"TibberValues"};;\
\
#filter out non-unique items:\
@{$hash} =  grep { $_->{'Unique'} == 1 } @{$hash};;\
\
#check if it is a local minimum\
#my $hash = $defs{$NAME}{"TibberValues"};;\
#map {\
#    $hash->[$_]{'isLocalMin'} = ( $hash->[$_-1]{'Cost'} >= $hash->[$_]{'Cost'} && $hash->[$_]{'Cost'} <= $hash->[$_+1]{'Cost'}) ? 1 : 0\
#  } 1 .. ($#fc_cost-1);;\
#special handling for first and last item:\
#$hash->[0]{'isLocalMin'} = ( $hash->[0]{'Cost'} <= $hash->[1]{'Cost'}) ? 1 : 0;;\
#$hash->[-1]{'isLocalMin'} = ( $hash->[-1]{'Cost'} <= $hash->[-2]{'Cost'}) ? 1 : 0;;\
\
my $length = scalar @{$hash};;\
$result .= "Length: $length\n";;\
\
# Check if each item is a local minimum or local maximum\
for my $index (1 .. ($length - 2)) {\
    #check local minimum\
    $hash->[$index]{'isLocalMin'} = (\
        $hash->[$index - 1]{'Cost'} >= $hash->[$index]{'Cost'} &&\
        $hash->[$index]{'Cost'} <= $hash->[$index + 1]{'Cost'}\
    ) ? 1 : 0;;\
#check local maximum\
$hash->[$index]{'isLocalMax'} = (\
        $hash->[$index - 1]{'Cost'} <= $hash->[$index]{'Cost'} &&\
        $hash->[$index]{'Cost'} >= $hash->[$index + 1]{'Cost'}\
    ) ? 1 : 0;;\
}\
\
# Special handling for the first and last items where there is only one adjacent value:\
$hash->[0]{'isLocalMin'} = ($hash->[0]{'Cost'} <= $hash->[1]{'Cost'}) ? 1 : 0;;\
$hash->[-1]{'isLocalMin'} = ($hash->[-1]{'Cost'} <= $hash->[-2]{'Cost'}) ? 1 : 0;;\
$hash->[0]{'isLocalMax'} = ($hash->[0]{'Cost'} >= $hash->[1]{'Cost'}) ? 1 : 0;;\
$hash->[-1]{'isLocalMax'} = ($hash->[-1]{'Cost'} >= $hash->[-2]{'Cost'}) ? 1 : 0;;\
\
#Average cost for ALL values, might differ from Tibber-App because it uses all available values\
my $average_cost = 0;;\
map { $average_cost += $_->{Cost}/$length } @{$hash};;\
for my $item (@$hash) {\
    $item->{'AboveAverage'} = ($item->{'Cost'} > $average_cost) ? 1 : 0;;\
}\
\
$result .= Data::Dumper::Dumper($defs{$NAME}{"TibberValues"});;\
\
return $result;;\
},\
AveragePriceToday {\
my @fc = grep { $_ =~ /fc0.*total/ } # filtere gegen den RegEx\
keys %{$defs{$NAME}{READINGS}};; # erstelle ein Array der Keys von den Readings\
\
my $sum = 0;;\
map { $sum += ReadingsNum($NAME, "$_", 0) / (scalar @fc) } @fc;;\
\
return $sum;;\
},\
Overview {\
my @arr = @{$defs{$NAME}{"TibberValues"}};;\
my $result = "";;\
\
my @columns = ("B", "O", "M", "StartsAt", "Cost");;\
my @column_widths = (3, 3, 3, 22, 10);;\
for my $col (0 .. $#columns) {\
    $result .= sprintf("%-*s", $column_widths[$col], $columns[$col]);;\
}\
$result .= "\n";;\
\
for my $item (@arr) {\
    $result .= sprintf("%-*s", $column_widths[0], ($item->{'AboveAverage'})?".":"B");;\
$result .= sprintf("%-*s", $column_widths[1], ($item->{'Outdated'})?"x":".");;\
$result .= sprintf("%-*s", $column_widths[2], ($item->{'isLocalMin'})?"*":".");;\
$result .= sprintf("%-*s", $column_widths[3], $item->{'StartsAt'});;\
$result .= sprintf("%-*s", $column_widths[4], $item->{'Cost'});;\
$result .= "\n";;\
}\
\
return $result;;\
},\
NextMinAt { ##find the closest minimum price\
my @arr = @{$defs{$NAME}{"TibberValues"}};;\
\
@arr = grep { $_->{'isLocalMin'} == 1 } #keep minima\
       grep { $_->{'Outdated'} == 0 } #filter out outdated items\
   @arr;;\
\
#just return the first match\
(scalar @arr) ? return $arr[0]->{'StartsAt'} : return "???";;\
}
attr Tibber.device widgetOverride userReadings:textField-long,87

Praktisch sind die dazugebauten UserReadings:
"NextMinAt", das ist der nächstgelegene Zeitpunkt, wann der Strom wieder günstig wird.
"Overview", ist eine Tabelle des Hash, Spalte B ist "Below Average" oder auch "Buy" wenn man Strom kaufen muss, "O" wie outdated, "M" wie Minima

Im UserReading "ProcessValues" werden die Werte vorbereitet. Zur Zeit enthält das Array dann solche Werte:
$VAR1 = [
          {
            'AboveAverage' => 1,
            'Outdated' => 1,
            'Unique' => 1,
            'isLocalMin' => 0,
            'Cost' => '0.252',
            'StartsAt' => '2023-06-02 00:00:00',
            'isLocalMax' => 1,
            'Basename' => 'fc0_00_'
          },
          {
            'isLocalMax' => 0,
            'Basename' => 'fc0_01_',
            'AboveAverage' => 1,
            'Outdated' => 1,
            'Unique' => 1,
            'isLocalMin' => 1,
            'Cost' => '0.247',
            'StartsAt' => '2023-06-02 01:00:00'
          },
          {
            'Cost' => '0.2475',
            'isLocalMin' => 0,
            'StartsAt' => '2023-06-02 02:00:00',
            'Unique' => 1,
            'Outdated' => 1,
            'AboveAverage' => 1,
            'isLocalMax' => 1,
            'Basename' => 'fc0_02_'
          },...

und der Überblick sieht dann so als Beispiel aus:
B  O  M  StartsAt              Cost     
.  x  .  2023-06-02 00:00:00   0.252    
.  x  *  2023-06-02 01:00:00   0.247    
.  x  .  2023-06-02 02:00:00   0.2475   
.  x  *  2023-06-02 03:00:00   0.2446   
.  x  .  2023-06-02 04:00:00   0.249    
.  x  .  2023-06-02 05:00:00   0.2606   
.  x  .  2023-06-02 06:00:00   0.2941   
.  x  .  2023-06-02 07:00:00   0.3019   
.  x  .  2023-06-02 08:00:00   0.267    
.  x  .  2023-06-02 09:00:00   0.2529   
B  x  .  2023-06-02 10:00:00   0.2383   
B  x  .  2023-06-02 11:00:00   0.2276   
B  x  .  2023-06-02 12:00:00   0.2192   
B  x  .  2023-06-02 13:00:00   0.2032   
B  x  *  2023-06-02 14:00:00   0.1963   
B  x  .  2023-06-02 15:00:00   0.2059   
B  x  .  2023-06-02 16:00:00   0.2218   
.  x  .  2023-06-02 17:00:00   0.2437   
.  x  .  2023-06-02 18:00:00   0.2548   
.  x  .  2023-06-02 19:00:00   0.2728   
.  x  .  2023-06-02 20:00:00   0.284    
.  x  .  2023-06-02 21:00:00   0.2731   
.  .  .  2023-06-02 22:00:00   0.2626   
.  .  .  2023-06-02 23:00:00   0.2537   
.  .  .  2023-06-03 00:00:00   0.2536   
.  .  .  2023-06-03 01:00:00   0.2481   
.  .  .  2023-06-03 02:00:00   0.2451   
.  .  *  2023-06-03 03:00:00   0.242    
.  .  .  2023-06-03 04:00:00   0.2485   
.  .  .  2023-06-03 05:00:00   0.2461   
.  .  .  2023-06-03 06:00:00   0.245    
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 13 Juni 2023, 17:51:46
Die erste Rechnung ist bei mir eingetrudelt. Es ist genau der Betrag, der in der App berechnet wurde. Die Grundgebühr von ca. 10 Euro wurde, wie schon von mir erwähnt, bereits auf die Stunden verteilt:

ZitatKosten Stromverbrauch 16. Mai 2023 - 31. Mai 2023
58,20 kWh mit einem Durchschnittspreis von 22,18 ct/kWh
12,91 €
Kosten Grundgebühr 16. Mai 2023 - 31. Mai 2023
Einzelheiten findest du auf den nächsten Seiten.
4,27 €
MwSt 19% 3,29 €
Fälliger Betrag
20,47 €

Mit 22,18 ct/kWh kann ich mich nicht beschweren :)

Ohne PV dürfte die Kilowattstunde noch günstiger sein.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 08:45:08
Zitat von: Damian am 13 Juni 2023, 17:51:46Die erste Rechnung ist bei mir eingetrudelt. Es ist genau der Betrag, der in der App berechnet wurde. Die Grundgebühr von ca. 10 Euro wurde, wie schon von mir erwähnt, bereits auf die Stunden verteilt:

Zitat< snip >

Mit 22,18 ct/kWh kann ich mich nicht beschweren :)

Ohne PV dürfte die Kilowattstunde noch günstiger sein.
Moin,
könntest Du mal eine Auswertung mit Unterscheidung zwischen Tag/Nacht machen? Am besten direkt auf Stunden Basis und nicht im Durchschnitt, dann hätte man mal eine reelle Auswertung, wann man wirklich die niedrigsten Preise abgreifen kann.

- Bei mir wäre von 6-21 Uhr zu 100% PV-Leistung.
- In der Nacht hätte ich den Speicher zu 100%, aber es hat ja nicht jeder einen Speichen.

Somit könnte man im Sommer nur in der Nacht günstiger beziehen und da hatte ich leider nur die hohen Preise bei Tibber gesehen.

Spannend wird da erst der Winter, wenn man auch tagsüber seinen Bedarf nicht decken kann.

Welche Geräte könntest Du denn zur Optimierung verwenden, die man im Verbrauch verschieben kann?

- WP für WW und HZG
- Klima Geräte für Kühlung / Heizung
- Pool / Wirlpool
- BEV
- Waschmaschine
- Spülmaschine
- Teichheizung


VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Juni 2023, 09:36:28
Das kann man leider nicht pauschal sagen.

Am Wochenende sieht es anders aus als unter der Woche. In der Mittagszeit halbiert sich der Preis am Wochenende. Im Winter werden die stündlichen Preise vermutlich anders aussehen, weil dann weniger PV-Energie insgesamt produziert wird.

Für eine Bewertung fehlen mir noch die Daten des gesamten Jahres.

Ich denke, dass man sagen kann, dass die Stundenpreise morgens 7-8 Uhr und abends 20-21 Uhr immer höher sein werden, weil in dieser Zeit der Strombedarf bundesweit am höchsten ist. Und umgekehrt, die Stundenpreise am Wochenende im Sommer (ggf. auch im Winter) mittags am niedrigsten sind, weil der Strombedarf dort am niedrigsten ist.

Für die Berechnung benötigt man nur die offiziellen Stundenpreise von Tibber und das eigene Benutzerprofil und dann kann jeder für sich berechnen, was er für sein Verhalten bezahlen würde.

Da wir unser Verhalten weitgehend an PV optimiert haben - Stromfresser (Waschmaschine/Spülmaschine/Trockner) laufen, wenn die Sonne scheint, der Rest ist weitgehend fix, lohnt sich die Rechnerei für mich nicht so sehr, ob ich nun Tibber habe oder nicht.

Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 09:47:19
Zitat von: Damian am 14 Juni 2023, 09:36:28Das kann man leider nicht pauschal sagen.

Am Wochenende sieht es anders aus als unter der Woche. In der Mittagszeit halbiert sich der Preis am Wochenende. Im Winter werden die stündlichen Preise vermutlich anders aussehen, weil dann weniger PV-Energie insgesamt produziert wird.

Für eine Bewertung fehlen mir noch die Daten des gesamten Jahres.

Ich denke, dass man sagen kann, dass die Stundenpreise morgens 7-8 Uhr und abends 20-21 Uhr immer höher sein werden, weil in dieser Zeit der Strombedarf bundesweit am höchsten ist. Und umgekehrt, die Stundenpreise am Wochenende im Sommer (ggf. auch im Winter) mittags am niedrigsten sind, weil der Strombedarf dort am niedrigsten ist.

Für die Berechnung benötigt man nur die offiziellen Stundenpreise von Tibber und das eigene Benutzerprofil und dann kann jeder für sich berechnen, was er für sein Verhalten bezahlen würde.

Da wir unser Verhalten weitgehend an PV optimiert haben - Stromfresser (Waschmaschine/Spülmaschine/Trockner) laufen, wenn die Sonne scheint, der Rest ist weitgehend fix, lohnt sich die Rechnerei für mich nicht so sehr. Ob ich nun Tibber habe oder nicht.


Ich stelle mir eine MySQL SELECT Auswertung vor, bei der die PV Werte und die Tibber Werte zusammen geführt werden und nur der Teil aus dem Netzbezug in die Berechnung eingeht.

Optimieren kannst Du ja nur, wenn Du bei einer PV-Anlage nicht genug Leistung hast.
Bei mir wäre das im Winter, wenn ich den Speicher nicht voll bekomme. Dann könnte ich z.B. das WP WW in die Tibber 0 € Zeit legen. Dann wäre die Chance den Speicher am Tag doch voll zu bekommen. Wenn er leer wäre könnte man ihn auch in der 0 € Zeit laden. Das BEV könnte ebenfalls zu Tibber Zeiten geladen werden.

Bei Dir könntest Du die Starkverbraucher auch im Winter auf Tibber optimieren, falls Du einen PV-Speicher hast, um den richtig zu füllen. Das könnte man an den Verbrauchskurven erkennen. Hast Du die Starrkverbraucher separat gemessen? Bei mir verwende ich einen Shelly 1, wegen des Anlaufstroms der WAMA.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Juni 2023, 10:05:37
ZitatBei Dir könntest Du die Starkverbraucher auch im Winter auf Tibber optimieren, falls Du einen PV-Speicher hast, um den richtig zu füllen.

Das wird vermutlich die Mittagszeit sein, verstärkt am Wochenende - würde bei uns am Verhalten nicht viel ändern, da es ohnehin die Zeit ist, wo wir auch heute diese Verbraucher laufen lassen und man kann nicht immer bis zum Wochenende warten. Wir haben keinen Speicher und kein E-Auto.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 10:24:21
Zitat von: Damian am 14 Juni 2023, 10:05:37
ZitatBei Dir könntest Du die Starkverbraucher auch im Winter auf Tibber optimieren, falls Du einen PV-Speicher hast, um den richtig zu füllen.

Das wird vermutlich die Mittagszeit sein, verstärkt am Wochenende - würde bei uns am Verhalten nicht viel ändern, da es ohnehin die Zeit ist, wo wir auch heute diese Verbraucher laufen lassen und man kann nicht immer bis zum Wochenende warten. Wir haben keinen Speicher und kein E-Auto.

Ich hatte im Winter durch starken Wind auch häufiger nachts günstige Preise gesehen ;-) Da wäre WAMA und SPÜMA gut zu starten.
Wenn es im Winter mit Deiner PV natürlich tagsüber auch passt wäre das natürlich als Direktverbrauch auch gut, außer Tibber macht negative Preise.
Es ist somit nicht so richtig einfach die Balance zu finden, da man in bestimmten Fällen eventuell mehr für die Einspeisung bekommt.
Fallen bei den 0 € Preisen die Grundkosten/kWh auch an? Also die Netzkosten und das ganze andere Zeugs.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Juni 2023, 11:08:23
Daher warte ich mal die Entwicklung der Stundenpreise ab.

Die pauschalen Fixkosten pro Monat von ca. 10 € je nach Region hast du immer. Die kannst du außen vor lassen oder gleich auf die Anzahl der Stunden des Monats aufteilen, wie Tibber das in der App macht. Die sind ja für die Optimierung des Verbrauchs nicht relevant.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 11:26:36
Zitat von: Damian am 14 Juni 2023, 11:08:23Daher warte ich mal die Entwicklung der Stundenpreise ab.

Die pauschalen Fixkosten pro Monat von ca. 10 € je nach Region hast du immer. Die kannst du außen vor lassen oder gleich auf die Anzahl der Stunden des Monats aufteilen, wie Tibber das in der App macht. Die sind ja für die Optimierung des Verbrauchs nicht relevant.
Ich meinte die Durchleitungskosten, wenn Tibber < 0 € als Preis angibt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 11:41:19
Ich habe mal ein Sommer Diagramm mit Speicher und dem Tibber Trigger erstellt.
Der Tibber Trigger ist die gelbe Stufen Linie oben im Diagramm
1.JPG
Man sieht jetzt im Sommer natürlich, das bei PV mit Speicher nichts zu sparen ist :-)
Und der Trigger entspricht dem Mittagshoch der vielen PV-Anlagen in DE.

Jetzt bin ich mal auf den Winter gespannt.

Für die Grafana Nutzer mal die MySQL Tibber_fc0_trigger Definition
SELECT
  TIMESTAMP AS "time",
  if((value = "on"),16000,15000) AS "Tibber_fc0_trigger"
FROM history
WHERE
  $__timeFilter(TIMESTAMP) AND
  DEVICE = 'EVU_Tibber_connect' AND
  READING = 'fc0_trigger'
ORDER BY TIMESTAMP
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Juni 2023, 12:01:08
Zitat von: ch.eick am 14 Juni 2023, 11:26:36
Zitat von: Damian am 14 Juni 2023, 11:08:23Daher warte ich mal die Entwicklung der Stundenpreise ab.

Die pauschalen Fixkosten pro Monat von ca. 10 € je nach Region hast du immer. Die kannst du außen vor lassen oder gleich auf die Anzahl der Stunden des Monats aufteilen, wie Tibber das in der App macht. Die sind ja für die Optimierung des Verbrauchs nicht relevant.
Ich meinte die Durchleitungskosten, wenn Tibber < 0 € als Preis angibt.

Ich habe den Fall < 0 bei mir noch nicht gesehen. Da aber Tibber in der App alle Kosten pro Stunde verrechnet, sowohl die Fixkosten, als auch die variablen, werden zumindest in der App die endgültigen Stundenkosten stehen, ob sie jemals negativ werden - weiß ich nicht. Die sind ja auch nicht Null, wenn man in der Stunde nichts verbraucht hat.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 12:12:24
Zitat von: Damian am 14 Juni 2023, 12:01:08Ich habe den Fall < 0 bei mir noch nicht gesehen. Da aber Tibber in der App alle Kosten pro Stunde verrechnet, sowohl die Fixkosten, als auch die variablen, werden zumindest in der App die endgültigen Stundenkosten stehen, ob sie jemals negativ werden - weiß ich nicht. Die sind ja auch nicht Null, wenn man in der Stunde nichts verbraucht hat.
Im Winter, wenn die Windkraft läuft habe ich das mit < 0 € schon mal gesehen, denn das wäre für das Speicher Laden sehr gut.
Den Trigger in meinem Diagramm kann man ja bei der Formel im EVU_Tibber Device anders berechnen, bzw die Berechnungsbasis ändern, was ich für die Justierung eingebaut hatte.
1.JPG
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Juni 2023, 12:30:41
ja, wenn die anteiligen Fixkosten und die variablen Abgabekosten pro Stunde niedriger sind das was die reine Kilowattstunde an der Börse für's Verbrauchen einbringt!!! (negative Kosten), dann kann evtl. die Stunde für einen Verbrauch tatsächlich Geld einbringen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Juni 2023, 12:35:33
Zitat von: Damian am 14 Juni 2023, 12:30:41ja, wenn die anteiligen Fixkosten und die variablen Abgabekosten pro Stunde niedriger sind das was die reine Kilowattstunde an der Börse für's Verbrauchen einbringt!!! (negative Kosten), dann kann evtl. die Stunde für einen Verbrauch tatsächlich Geld einbringen.
Der Preis muss halt nur so niedrig sein, dass sich das Speichern inklusive der 20% Verluste irgendwie rechnet, da habe ich aber auch noch nicht die richtige Formel gefunden.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 01 Juli 2023, 17:30:08
Darf ich mal fragen ob ihr morgen auch 44 Cent pro verbrauchter kWh erhalten werdet? Der Preis für morgen Mittag ist nicht nur ein wenig negativ hier in Niedersachsen. Ist das nur regional so?

Hier der Screenshot aus der App inklusive Steuern und Gebühren:
2023-07-02 - tibber.png
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 01 Juli 2023, 17:35:30
Zitat von: Torxgewinde am 01 Juli 2023, 17:30:08Darf ich mal fragen ob ihr morgen auch 44 Cent pro verbrauchter kWh erhalten werdet? Der Preis für morgen Mittag ist nicht nur ein wenig negativ hier in Niedersachsen. Ist das nur regional so?

Hier der Screenshot aus der App inklusive Steuern und Gebühren:
2023-07-02 - tibber.png

Ja bei uns ist der Preis auch negativ bei ca 44 Cent. Aber nein du bekommst keine 44 Cent das du Strom abnimmst. Minimal bei Tibber ist 0 cent
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 01 Juli 2023, 17:39:21
Ah Schade, steht sogar in der FAQ: https://tibber.com/de/faq (https://tibber.com/de/faq)

ZitatMit negativen Strompreisen sind bestimmte Zeiten gemeint, in denen das Angebot die Nachfrage übersteigt. In dieser Zeit soll mit niedrigen Preisen der überflüssige Strom schneller aus den Netzen gespeist werden – daher wird teilweise sogar etwas für die Abnahme von Strom bezahlt. Realistisch heißt das nicht, dass du Geld für den Stromverbrauch bekommst – die negativen Preise beziehen sich ausschließlich auf den Strombörsenpreis. Dieser beträgt nur einen geringen Anteil des Endpreis. Steuern, Abgaben und Umlagen werden also dennoch fällig. Hier findest du mehr Informationen zum Thema.

Trotzdem interessant...
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: xerion am 01 Juli 2023, 17:45:33
Zitat von: Torxgewinde am 01 Juli 2023, 17:39:21Ah Schade, steht sogar in der FAQ: https://tibber.com/de/faq (https://tibber.com/de/faq)

ZitatMit negativen Strompreisen sind bestimmte Zeiten gemeint, in denen das Angebot die Nachfrage übersteigt. In dieser Zeit soll mit niedrigen Preisen der überflüssige Strom schneller aus den Netzen gespeist werden – daher wird teilweise sogar etwas für die Abnahme von Strom bezahlt. Realistisch heißt das nicht, dass du Geld für den Stromverbrauch bekommst – die negativen Preise beziehen sich ausschließlich auf den Strombörsenpreis. Dieser beträgt nur einen geringen Anteil des Endpreis. Steuern, Abgaben und Umlagen werden also dennoch fällig. Hier findest du mehr Informationen zum Thema.

Trotzdem interessant...
[/quote
Zitat von: Torxgewinde am 01 Juli 2023, 17:39:21Ah Schade, steht sogar in der FAQ: https://tibber.com/de/faq (https://tibber.com/de/faq)

ZitatMit negativen Strompreisen sind bestimmte Zeiten gemeint, in denen das Angebot die Nachfrage übersteigt. In dieser Zeit soll mit niedrigen Preisen der überflüssige Strom schneller aus den Netzen gespeist werden – daher wird teilweise sogar etwas für die Abnahme von Strom bezahlt. Realistisch heißt das nicht, dass du Geld für den Stromverbrauch bekommst – die negativen Preise beziehen sich ausschließlich auf den Strombörsenpreis. Dieser beträgt nur einen geringen Anteil des Endpreis. Steuern, Abgaben und Umlagen werden also dennoch fällig. Hier findest du mehr Informationen zum Thema.

Trotzdem interessant...
Obwohl wenn man es genau nimmt zahlt man ja "nur" die Steuern und Netzentgelte und die sind in der Summe ja nicht über 40 Cent pro kWh somit könnte ja was übrig bleiben. Ich teste das Mal morgen und beobachte die App was für den Tag berechnet wird
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hyper2910 am 01 Juli 2023, 21:43:54
Der Preis bei Tibber ist der Preis inkl. Aller Steuern, also das was ich für den Strom bezahle oder bekomme.

Wo steht das der bei 0cent gedeckelt ist?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hyper2910 am 01 Juli 2023, 23:03:16
Also es gibt Geld
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Basti-K am 22 August 2023, 13:46:17
In diesem Zusammenhang frage ich mich, ob es nicht sinnvoll/möglich ist, den PV-Wechselrichter auszuschalten, wenn man Kunde bei Tibber ist, und stattdessen Strom aus dem Netz zu beziehen.
Im Grunde genommen verschlechtert die Einspeisung des eigenen PV-Stroms die Situation in diesem Moment nicht.
Wie ist das eigentlich mit den Smart Meter Gateways?
Diese müssten doch auch auf irgendeine Weise mit dem Wechselrichter kommunizieren können. (sofern vorhanden)
Sind die Befehle standardisiert?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 22 August 2023, 14:35:32
Zitat von: Basti-K am 22 August 2023, 13:46:17In diesem Zusammenhang frage ich mich, ob es nicht sinnvoll/möglich ist, den PV-Wechselrichter auszuschalten, wenn man Kunde bei Tibber ist, und stattdessen Strom aus dem Netz zu beziehen.
Im Grunde genommen verschlechtert die Einspeisung des eigenen PV-Stroms die Situation in diesem Moment nicht.
Wie ist das eigentlich mit den Smart Meter Gateways?
Diese müssten doch auch auf irgendeine Weise mit dem Wechselrichter kommunizieren können. (sofern vorhanden)
Sind die Befehle standardisiert?
Was verstehst Du unter einem Smart Meter Gateway ? Wenn das die intelligente Messeinrichtung des Netzbetreibers ist, so wird die nicht Deinen WR abschalten.
Wenn Du Deinen WR abschaltest und stattdessen aus dem Netz beziehst, verlierst Du die Einspeisevergütung, die Du bei Tibber auch erstmal erwirtschaften müsstest.
Für mich macht die Idee somit keinen Sinn :-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Basti-K am 22 August 2023, 14:55:48
Wenn ich mich irre, bitte korrigieren Sie mich.
Ich habe im Hinterkopf, dass PV-Anlagen mit einer Leistung von etwa 30 kWp extern abgeregelt werden können / müssen.
Welcher Mechanismus wird dabei verwendet?
War da nicht immer das Smart Meter Gateway (SMG) auch ein Empfänger, weil es online war und hatte die Möglichkeit, über irgendeine Steuerleitung die Produktion zu drosseln?

Es gibt grob gesagt drei Arten von Zählern: die alten Ferraris-Zähler, die modernen digitalen Zweirichtungszähler (MME), und die Smart Meter Gateways (SMG), die direkt online sind.

Das Ganze ergibt natürlich nur dann Sinn, wenn das negative Delta, das man von Tibber erhält (abzüglich der Netzkosten usw. - vorausgesetzt, das ist der Fall), größer ist als die 8-Cent-Einspeisevergütung.

Ich glaube, die Situation wird sich in den kommenden Jahren verschärfen, besonders wenn immer mehr Haushalte eine PV-Anlage haben.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Ralli am 22 August 2023, 15:39:16
Zitat von: Basti-K am 22 August 2023, 14:55:48War da nicht immer das Smart Meter Gateway (SMG) auch ein Empfänger, weil es online war und hatte die Möglichkeit, über irgendeine Steuerleitung die Produktion zu drosseln?

Ja und nein. Bezüglich der Funktion des SMG hast du Recht. Siehe hier (Ziffer 2.3):

https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/Broschueren/Smart-Meter-Gateway.pdf?__blob=publicationFile&v=6

Was die Steuerungsmöglichkeiten betrifft: eine Steuerung von Komponenten funktioniert natürlich nur dann, wenn die Komponenten 1) dafür die entsprechende Schnittstelle haben und 2) diese auch für die Steuerung durch das SMG entsprechend konfiguriert sind.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 22 August 2023, 17:31:07
Zitat von: Basti-K am 22 August 2023, 14:55:48Wenn ich mich irre, bitte korrigieren Sie mich.
Ich habe im Hinterkopf, dass PV-Anlagen mit einer Leistung von etwa 30 kWp extern abgeregelt werden können / müssen.
Ich denke Du machst dafür lieber einen eigenen Thread bei Solaranlagen auf und stellst dort zuerst mal die Anlage vor.
Das hat nicht direkt etwas mit Tibber zu tun.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Snake1980 am 24 August 2023, 12:54:19
Hat jemand einen Tipp, wie ich das Tageschart der Strompreise halbwegs simple in meine bestehende Tablet-UI bekomme?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 27 August 2023, 16:19:54
Zitat von: Snake1980 am 24 August 2023, 12:54:19Hat jemand einen Tipp, wie ich das Tageschart der Strompreise halbwegs simple in meine bestehende Tablet-UI bekomme?
Kann man da nicht einfach den Preis je Stunde als Diagramm zeichnen?
Ich hatte hier mal ein Device entwickelt, bei dem mit MySQL die Werte der entsprechnden Stunde zugeordnet wurden. Im DbLog und Grafana kann man das dann einfach darstellen.
Dann sollte im Thread auch noch ein DOIF zu finden sein, dass die Diagramme in einem Widget darstellt. Eventuell gibt es da ja auch etwas für Tablet-UI.
Screenshot 2023-08-27 161809.png
 
VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Speedy68 am 29 August 2023, 16:49:06
Zitat von: Snake1980 am 24 August 2023, 12:54:19Hat jemand einen Tipp, wie ich das Tageschart der Strompreise halbwegs simple in meine bestehende Tablet-UI bekomme?

Ich habe das für mein Tablet-UI so gelöst (nicht wundern, ich zeichne sowohl Balken, als auch Punkte: mir kommt es dabei auf den letzten Punkt um 23 Uhr an, weil die Balken von 23 bis 24 Uhr technisch nicht gezeichnet werden können).

            <div data-type="chart"
                    data-device='["EVU_Tibber_connect","EVU_Tibber_connect"]'
                    data-get="current_date"
                    data-style='["ftui l0fill","ftui l2sym"]'
                    data-ptype='["steps","points"]'
                    data-uaxis='["primary","primary"]'                   
                    data-logdevice='["DBLogging","DBLogging"]'
                    data-logfile='["history","history"]'
                    data-columnspec='["EVU_Tibber_connect:fc1_total:::$val=($val*100)","EVU_Tibber_connect:fc1_total:::$val=($val*100)"]'
                    data-minvalue="auto"
                    data-maxvalue="auto"
                    data-yticks="0.5"
                    data-xticks="120"
                    data-daysago_end="-2"
                    data-crosshair="false"
                    data-cursorgroup="1"
                    data-scrollgroup="1"
                    data-legend="Strompreis in Cent"
                    data-width="1150"
                    data-height="500">
            </div>

Viele Grüße
Frank
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: huhu am 25 September 2023, 15:16:44
Zitat von: PS915 am 24 April 2023, 20:52:23
Zitat von: Damian am 24 April 2023, 19:33:29Jetzt gehe ich in den Keller und versuche meine Selbstbauelektronik dazwischenzuschalten, damit ich zum Puls IR noch meinen alten Auslesekopf parallel betreiben kann :)


Ich bin auch gerade dabei, einen IR SML Lesekopf sowie den Tibber Pulse an einem Smartmeter zu betreiben.

Nachdem ich es mit Toslink Y Adapter, IR Repeater versucht habe, kommt nun ein Prisma aus China, um zu versuchen das IR Signal optisch zu vervielfältigen.

https://de.m.wikipedia.org/wiki/Strahlteiler

Falls das klappen sollte, werde ich dazu einen einfachen 3D druckbaren Adapter entwerfen.

[url="https://forum.fhem.de/index.php?action=dlattach;attach=170934;type=preview;file"]Screenshot_20230424-204329.png[/url]


Hat sonst noch jemand eine Idee, wie man zwei Leseköpfe an einem Smartmeter betreiben kann?



Hat das mit dem Prisma funktioniert? Würde auch gerne zwei Leseköpfe verwenden ;-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: blueberry63 am 13 November 2023, 12:32:50
Ich melde mich mal kurz hier, ohne den gesamten Thread gelesen zu haben, weil ich nur fragen möchte, warum ihr einen 2. Lesekopf benutzen möchtet? Ich hatte auch einen eignen Lesekopf und dachte daran, diesen parallel zum Pulse zu benutzen. Aber da die Tibber-Bridge ja die Daten des Zählers ebenfalls im SML-Format zur Verfügung stellt, kann man ohne großen Aufwand (in FHEM) umstellen.

Bridge lokal auslesen: https://forum.fhem.de/index.php?topic=133358.0

Gruß
Blueberry63
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 26 November 2023, 21:17:13
So viel ich weiß, ist die Schnittstelle nicht offiziell, daher könnte es eines Tages sie nicht mehr geben.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Felix_86 am 28 November 2023, 16:28:39
Auch wenn die Schnittstelle offiziell ist, kann dem Hersteller jederzeit einfallen sie nicht weiter fortzuführen und mit einem nächsten Release einzustampfen  ;)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 28 November 2023, 19:31:44
Ab Januar beziehe ich nun auch über tibber meinen Strom. Daher habe ich mich schon mal um die Implementierung auf Basis der tollen Anleitung von Christian gekümmert.

Leider bekomme ich es nicht hin.
Ich erfülle aber auch eine Voraussetzung nicht: DbLog und DbRep mit MySQL
Ich habe eine DbLog und DbRep mit SQLite. Das war eben beim Einrichten von FHEM vor Jahren so :-)

Eigentlich ist das auch kein Problem. Die wenigen spezifischen MySQL Befehle kann man meistens umstellen.
Nur hier habe ich anscheinend Probleme und hoffe auf etwas Hilfe.

EVU_Tibber DOIF und EVU_Tibber_connect sind eingerichtet. Alle Daten von tibber kommen sauber an.
fc_DbLog:fc0_00_total.*, fc0_avg, fc0_min, fc_max sowie nodes_consumption_day,nodes_consumption_month und
nodes_consumption_year haben jedoch keine Werte.

Die Befehle AND YEAR(TIMESTAMP) = YEAR(curdate()) lassen sich in SQLite durch TIMESTAMP=date('now','start of year') umstellen. Day und Month entsprechend.


Das SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE habe ich noch nicht umstellen können.
Auch der Loop (for (my $loop_fc = 0;; $loop_fc <= 1;; $loop_fc++)) läuft so nicht.


Daher die Frage und Bitte.
Vielleicht hat ja jemand das coding von EVU_Tibber_connect auch für z.B. SQLite in Nutzung und könnte das hier posten.

Danke
Grüße
Jörg
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 28 November 2023, 20:11:30
Moin,
Ich kann erst Donnerstag wieder rein schauen.
VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 29 November 2023, 07:42:54
Hallo Jörg,
hier schon mal erste Infos.
Zitat von: jnewton957 am 28 November 2023, 19:31:44Ich erfülle aber auch eine Voraussetzung nicht: DbLog und DbRep mit MySQL
Ich habe eine DbLog und DbRep mit SQLite. Das war eben beim Einrichten von FHEM vor Jahren so :-)

Eigentlich ist das auch kein Problem. Die wenigen spezifischen MySQL Befehle kann man meistens umstellen.
Nur hier habe ich anscheinend Probleme und hoffe auf etwas Hilfe.
MariaDB sollte auch gehen

ZitatEVU_Tibber DOIF und EVU_Tibber_connect sind eingerichtet. Alle Daten von tibber kommen sauber an.
fc_DbLog:fc0_00_total.*, fc0_avg, fc0_min, fc_max sowie nodes_consumption_day,nodes_consumption_month und
nodes_consumption_year haben jedoch keine Werte.
Diese Werte werden über userreadings aus der Datenbank mit SQL abgefragt.
Die SQL Statements kannst Du über eine SQL Terminal Session direkt in der Datenbank testen. Da sollte dann genau ein Wert als Rückmeldung kommen.

Besonders wichtig ist das fc_DbLog:fc0_00_total.* {} , denn das schreibt die Werte mit dem richtigen TIMESTAMP in die Datenbank. Dabei sollte zuerst die Perl Schleife laufen und es sollten keine Fehlermeldungen im FHEM Log erscheinen.
Zum schreiben in die Datenbank wird ein "INSERT INTO TABLE" mit "ON DUPLICATE KEY UPDATE" verwendet, was es eventuell auch nicht im SQLite gibt.

ZitatDie Befehle AND YEAR(TIMESTAMP) = YEAR(curdate()) lassen sich in SQLite durch TIMESTAMP=date('now','start of year') umstellen. Day und Month entsprechend.

Das SELECT CAST(SUM(VALUE) AS DECIMAL(8,2)) AS VALUE habe ich noch nicht umstellen können.
Hierbei wird der VALUE aufsummiert und in eine Zahl mit zwei Nachkommastellen umgewandelt. Im FHEM stehen in der Datenbank nur Strings, mit denen man manchmal nicht rechnen kann. Bitte auch das in der SQL Terminal Session zuerst mal testen.

ZitatAuch der Loop (for (my $loop_fc = 0;; $loop_fc <= 1;; $loop_fc++)) läuft so nicht.
Mit den zwei ;; ist das das FHEM RAW Format. Im userreading sollte hinterher nur noch ein ; sein.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 30 November 2023, 10:04:59
Moin,
für heute sieht es echt grütze bei Tibber aus :-(
Screenshot 2023-11-30 100104.png

Und hier mal ein Test mit dem Speicher Laden über den Trigger
Wie man erkennen kann könnte ich in meiner Konstellation zum Einen die Verbraucher in die günstige Zeit legen und zum Anderen noch weitere ca 5 Stunden aus dem Speicher Leben. Gerade in der Nacht hätte ich noch zusätzlich das E-Auto laden können, was weitere fast 40 kWh gewesen wären.
Nur leider lag der niedrige Tibberpreis nur im Durchschnitt bei 24,94 ct und ich zahle 23 ct :-( Das wäre somit für mich kein Tag gewesen, um die höheren Grundgebühren und die 20% Verluste beim Speicher raus zu holen.
Screenshot 2023-11-30 093802.png

Ich könnte jetzt ja nett sein und trotzdem nach dem Tibber Trigger steuern, damit der Überschuss aus dem Netz verbraucht wird und somit weniger Kohle verstromt wird, aber ob das die Erzeuger wirklich merken ;-) Naja, ist ja jetzt nur noch ein Klick und somit wäre wenigstens ein Verbraucher vorbereitet, man weiß ja nie welche Preismodell noch kommen werden.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Dezember 2023, 08:47:08
Hallo zusammen,
da anscheinend doch einige das EVU_Tibber_connect verwenden möchten haben sich noch einige Fehler gefunden, die ich gerade korrigiere.

Sorry für die unannehmlichkeiten
     Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Dezember 2023, 09:15:08
Für diejenigen, die keine original MySQL Datenbank verwenden, sollte es auch mit MariaDB laufen.
Man kann jedoch im FHEM auch zwei Datenbanken parallel verwenden und hat somit zwei DbLogs.
Ich verwende auf einem RPI4 im 64 Bit Modus bereits seit ca. 2 Jahren den original Oracle MySQL Docker Container.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Dezember 2023, 11:06:43
EDIT: Aktualisiert 2023.12.03 18:00
EDIT: Aktualisiert 2023.12.06 13:00

Moin,nochmal,
für die early birds kommt hier mal mein aktueller Stand des EVU_Tibber_connect Devices, was noch im Test ist.

Für token und homeID gibt es zwei Möglichkeiten
# 1. über den KeyStore, den ich bevorzuge
attr EVU_Tibber_connect replacement01Mode expression
attr EVU_Tibber_connect replacement01Regex %%token%%
attr EVU_Tibber_connect replacement01Value {KeyValue("read","EVU_Tibber_connect_token")}
attr EVU_Tibber_connect replacement02Mode expression
attr EVU_Tibber_connect replacement02Regex %%homeID%%
attr EVU_Tibber_connect replacement02Value {KeyValue("read","EVU_Tibber_connect_homeID")}

# 2. über ein Text replacement
attr EVU_Tibber_connect replacement01Mode text
attr EVU_Tibber_connect replacement01Regex %%token%%
attr EVU_Tibber_connect replacement01Value 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
attr EVU_Tibber_connect replacement02Mode test
attr EVU_Tibber_connect replacement02Regex %%homeID%%
attr EVU_Tibber_connect replacement02Value 96a14971-525a-4420-aae9-e5aedaa129ff

Wenn man noch keinen Tibber Account hat und die Test homeID verwendet werden die Preise in Schwedischen Kronen angezeigt ;-)
Da ich kein Tibber habe bin ich auf Eure Rückmeldungen angewiesen!

- In den userreadings waren noch einige Fehler in den Perl Schleifen, die ich hoffentlich alle gefunden habe.
- Auch bei den SQL Statements sind z.B. TIMESTAMP und READING, an einigen Stellen, falsch formatiert gewesen.
- Beim fc1 habe ich jetzt die Gültigkeit berücksichtigt und lösche die readings, wenn sie nicht aktuell geliefert werden.

- Mit der Diagramm Aktualisierung im EVU_Tibber kämpfe ich gerade noch, damit sich das auch aktualisiert :-(
  Hier sollte es nun passen.

Neuerungen:
- 05_consumption_hourly_100 hier wurde bisher nur abgefragt, jedoch nicht in die Datenbank geschrieben
  Da es mehrfach zu timeouts bei Tibber gekommen ist habe ich 05_consumption_hourly_100 nun für das
  nachträgliche abfragen eingerichtet. Somit werden nun ca. 4 Tage nachträglich in die Datenbank geschrieben.

- Der timeout wurde verlängert
  attr EVU_Tibber_connect timeout 30

- fc0_trigger_price
  Sobald die Werte für den nächsten Tag vorhanden sind, wird jetzt der fc_min und fc_avg über zwei Tage gebildet
  und somit berücksichtigt, dass es am Folgetag eventuell günstiger sein könnte. Daduch ist das Trigger Fenster
  beim Tageswechsel treffsicherer.

- Es gibt nun readings für fc1_trigger_[start|stop], die auch im EVU_Tibber angezeigt werden.
  Dies finde ich sinnvoll, wenn es für fc0 kein Trigger Fenster mehr gibt, damit man das für den nächsten
  Tag schon mal sehen kann.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 03 Dezember 2023, 16:50:39
Zitat von: ch.eick am 02 Dezember 2023, 11:06:43Wenn man noch keinen Tibber Account hat und die Test homeID verwendet werden die Preise in Schwedischen Kronen angezeigt ;-)
Da ich kein Tibber habe bin ich auf Eure Rückmeldungen angewiesen!


Ich kämpfe zwar immer noch mit dem ON Duplicate Key, da ich eine SQLite habe, die diesen Befehl nicht kennt...
Aber schon mal einige Rückmeldungen. Ich benutze aktuell den tibber DEMO Account.


Was mir auffällt, wenn ich in den https://developer.tibber.com/explorer schaue:


Aber auf jeden Fall ist die EVU_Tibber_connect schon mal der Hammer... DANKE

Grüße
Jörg

[/list]

Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 03 Dezember 2023, 18:06:47
Zitat von: jnewton957 am 03 Dezember 2023, 16:50:39Ich kämpfe zwar immer noch mit dem ON Duplicate Key, da ich eine SQLite habe, die diesen Befehl nicht kennt...
Aber schon mal einige Rückmeldungen. Ich benutze aktuell den tibber DEMO Account.
Du könntest anstelle des On Duplicate auch zwei SQL Aufrufe mit DbRep machen. Dabei müsste der erste die bestehenden Datenbankeinträge löschen und der zweite dann die neuen eintragen.

Später können wir gerne noch weitere Abfragen ins Device einbauen.

Die Verbräuche pro Stunde werden mit den consumption Abfragen erstellt.

05_consumption_hourly_100 ist zum auffüllen von versäumten Abfragen, denn ab und zu gibt es bei Tibber auch mal Timeouts :-)

"vor 1 Tag", "vor 2 Tagen" wären Abfragen aus der Datenbank, die man genau wie die Summen Monat oder letzter Monat aus der Datenbank mit SQL abfragen könnte.

Das liveMeasurement geht nach meiner Kenntniss nicht über die normale API, sondern nur über eine WebSession,die ich als Node-Red Verbindung mal getestet habe. Das wäre bei mir dann alternatives EVU_Tibber_connect, dass ich als MQTT2 Device hier mal eingestellt habe. Momentan scheinen aber alle hier im Thread die API zu verwenden.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Dezember 2023, 13:32:08
Und schon gibt es wieder ein kleines Update

In diesem Post habe ich gerade nochmal aktualisiert. (https://forum.fhem.de/index.php?msg=1295543)
Wenn es für fc0 kein Trigger Fenster mehr gibt, kann man jetzt auch das für fc1 im EVU_Tibber Device sehen.

Und hier mal ein Beispiel, wie ich das im DOIF im Perl Modus einbinde
## Das wäre ein Block im DOIF, der auf den Trigger reagiert

################################################################################################################
## 18 SpeicherStromboerse
##
18_SpeicherStromboerse
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
     and
      ((
           [$SELF:SpeicherStromboerse] eq "Tibber"                       ## Soll Tibber verwendet werden?
       and [EVU_Tibber_connect:fc0_trigger]                              ## Wurde der Trigger geändert

       )
       or [$SELF:ui_command_1] eq "SpeicherStromboerse"                  ## Hier wird das uiTable select ausgewertet
      )
   ) {

    if ([EVU_Tibber_connect:fc0_trigger] eq "on") {
      set_Reading("SpeicherDcPowerAbs",[$SELF:SpeicherStromboerseDcPowerAbs]);  ## Hier wird das Speicher Laden gestartet
      fhem("setreading $SELF SpeicherTriggerLaden An");
    } else {
      fhem("setreading $SELF SpeicherTriggerLaden Aus");
      fhem("setreading $SELF SpeicherDcPowerAbs 0");                            ## Das beendet das Speicher Laden
    }

   set_Reading("ui_command_1","---");                                    ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
   }
}



## Im uiTable sieht eine zusätzliche Zeile dann bei mir wie folgt aus, was natürlich von der Anzahl der Spalten abhängt

|"Strombörse<dd>Auswahl / Ladeleistung / Trigger Status </dd>" | widget([$SELF:SpeicherStromboerse],"uzsuDropDown,Aus,Tibber") |
widget([$SELF:SpeicherStromboerseDcPowerAbs],"selectnumbers,-4500,250,0,0,lin")."W" |
[EVU_Tibber_connect:fc0_trigger] |""
Solch eine Zeile kommt dann bei jedem Device hinzu, um individuell zu aktivieren/deaktivieren, eventuell mit oder ohne Konfigurationsparameter für das Device.
Screenshot 2023-12-06 133758.png

Viel Spaß beim Testen
  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Dezember 2023, 15:56:54
Hallo Jörg,
ich hatte Dir schon mal einen Vorschlag gemacht, wie Du das ON DUPLICATE beim SQLite umgehen könntest.
Du hast das hier ja nochmals geposted. (https://forum.fhem.de/index.php?topic=136061.0)

Hier wäre es dann mal aufgeteilt in zwei Aufrufe, also zuerst ein DELETE und anschließend nur ein Insert.
Ich habe es nicht getestet und es könnten somit auch noch Syntax Fehler drin sein :-)
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                        DELETE FROM history
                          WHERE
                            TIMESTAMP = '".$timestamp."',
                            DEVICE = "','$NAME',
                            READING = 'fc".$loop_fc."_total';" ;

::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
                        INSERT INTO history (TIMESTAMP,DEVICE,TYPE,READING,VALUE)
                          VALUES('".$timestamp."','$NAME','Tibber','fc".$loop_fc."_total','".$value."';") ;

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 07 Dezember 2023, 10:48:41
Hallo zusammen,
bisher konnte ich jetzt keine weiteren Probleme im EVU_Tibber und EVU_Tibber_connect feststellen.

Wer übrigens im EVU_Tibber die aktuellen Werte sehen möchte, der müsste das andere EVU_Tibber_connect für die Node-Red Verbindung verwenden, was eine live Web Session zu Tibber verwendet. Dort werden dann die aktuellen Werte des Tibber Pulse gesendet.
Eine weitere Möglichkeit wäre natürlich auch einen eigenen Lesekopf (dazu gibt es einen anderen Thread), oder ein SmartMeter dort im uiTable zu verlinken.
Screenshot 2023-12-07 104254.png

Hier mal die beiden Zeilen im uiTable als Beispiel für ein SmartMeter.
## |"Bezug vom Netz"|sprintf("%04d W",::ReadingsVal(Device(),"Pulse_P_act",0))|Format("day")|Format("month")|Format("year")
|"Bezug vom Netz"|sprintf("%04d W",([WR_0_KSEM:M_AC_Power] >= 0 ? ::round(::ReadingsVal("WR_0_KSEM","M_AC_Power",0),0) : 0) )|Format("day")|Format("month")|Format("year")

## |"Einspeisung ins Netz"|sprintf("%04d W",::ReadingsVal(Device(),"Pulse_P_act_Prod",0))|""|""|""
|"Einspeisung ins Netz"|sprintf("%04d W",([WR_0_KSEM:M_AC_Power] <= 0 ? abs(::round(::ReadingsVal("WR_0_KSEM","M_AC_Power",0),0)) :  0) )|""|""|""


VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 28 Dezember 2023, 15:52:33
Hallo zusammen,
da ich das Tibber Device ja jetzt auch selber nutze, um meine Verbraucher zu netzdienlichen Zeiten zu betreiben, habe ich noch kleinere Ideen gehabt.

1. Was haltet Ihr davon die Berechnungen von fc0_* auf fc_* um zu benennen?
Das würde folgende readings betreffen
fc0_avg
fc0_max
fc0_med
fc0_min
fc0_trigger
fc0_trigger_price
Der Hintergrung ist, dass ich die Werte nun, falls vorhanden, über fc= und fc1 berechne, was ein besseres Trigger Fenster über die vorhandenen Tibber Preise ermöglicht.
Das habe ich selber noch nicht umgesetzt und würde mich über Rückmeldungen freuen.

2. fc_avg, fc_max, fc0_min werden dann jetzt ohne Datenbank Aufrufe berechnet, da das nicht so sonderlich schwirig ist :-)

3. Beim Trigger Preis gibt es mehrere Möglichkeiten
3.1 Über die bisherige Formel
3.2 Über die zweite Formel, die den Faktor compensation_grid berücksichtigt, der dann im gleichnamigen reading stehen muss.
    Mit dem EVU_Tibber Device kann man diesen auch mit dem "Trigger fc0 Basis 0.0" in der uiTable einstellen.
    Das könnte die Einspeisevergütunh in Cent oder ein frei justierter Wert sein, den man empirisch ermittelt.
3.3 Man könnte überlegen, wie man den Median Wert verwendet.

Hier wären dann mal die Änderungen für das userReadings (zu 1. ist noch nicht umgesetzt)
fc0_avg:current_price.* {
## Berechnung des durchschnitt Wertes
  my $fc_avg = 0;
  my $fc = 0;

  if (ReadingsVal("$NAME","fc1_00_startsAt","null") ne "null") {       ## Der nächste Tag ist bereits da
    if (AttrVal("$NAME","verbose",0) >=3) {
      Log 3, "$NAME cmd_1  : Tibber Daten für fc1 sind bereits da";
    }
    $fc = 1;
  } # end if

    for (my $j=0;$j<=$fc;$j++){
      for (my $k=0;$k<=23;$k++) {                                          ## Summe  berechnen
        $fc_avg += ReadingsVal("$NAME",sprintf("fc%d_%02d_total",$j,$k),0);
        } # end $k
    } # end $j

    return round($fc_avg / (24 *(1+$fc)) *100 ,2);                     ## Durchschnitt berechnen
},

fc0_med:current_price.* {
## Berechnung des median Wertes
::CommandGet(undef, "LogDBRep_".$NAME."_SQL sqlCmdBlocking
           SELECT
             cast( (   (SUBSTRING_INDEX(SUBSTRING_INDEX(group_concat(VALUE order by VALUE), ',', floor(1+((count(VALUE)-1) / 2)))  , ',', -1))
                       + (SUBSTRING_INDEX(SUBSTRING_INDEX(group_concat(VALUE order by VALUE), ',', ceiling(1+((count(VALUE)-1) / 2))), ',', -1))
                     )/2 *100
             AS DECIMAL(4,2))
           FROM history
           WHERE DEVICE='".$NAME."'
             AND (   READING='fc0_total' AND TIMESTAMP >= DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
                     OR READING='fc1_total' AND TIMESTAMP >= DATE_FORMAT(NOW() + INTERVAL 1 DAY, '%Y-%m-%d 00:00:00') ) ;") ;
},

fc0_min:current_price.* {
##  Ermittlung des minimal Wertes
  my $fc_min = 0;
  my $fc_tmp = 0;
  my $fc = 0;

  if (ReadingsVal("$NAME","fc1_00_startsAt","null") ne "null") {       ## Der nächste Tag ist bereits da
    $fc = 1;
  } # end if

    for (my $j=0;$j<=$fc;$j++){
      for (my $k=0;$k<=23;$k++) {
        $fc_tmp = ReadingsVal("$NAME",sprintf("fc%d_%02d_total",$j,$k),0);
 
        if (($fc_tmp < $fc_min) or ($j == 0 and $k == 0)) {
          $fc_min = $fc_tmp;
        }
      } # end $k
    } # end $j

    return round($fc_min *100 ,2);                             ## Von Euro auf Cent umrechnen
},

fc0_max:current_price.* {
##  Ermittlung des minimal Wertes
  my $fc_max = 0;
  my $fc_tmp = 0;
  my $fc = 0;

  if (ReadingsVal("$NAME","fc1_00_startsAt","null") ne "null") {       ## Der nächste Tag ist bereits da
    $fc = 1;
  } # end if

    for (my $j=0;$j<=$fc;$j++){
      for (my $k=0;$k<=23;$k++) {
        $fc_tmp = ReadingsVal("$NAME",sprintf("fc%d_%02d_total",$j,$k),0);
 
        if (($fc_tmp > $fc_max) or ($j == 0 and $k == 0)) {
          $fc_max = $fc_tmp;
        }
      } # end $k
    } # end $j

    return round($fc_max *100 ,2);                             ## Von Euro auf Cent umrechnen
},


Viel Spaß und bitte ordentlich testen...
    Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 29 Dezember 2023, 20:09:10
Zu 1: Ich habe ein fc0_x und fc1_x umgesetzt und nutze das eben auch, um den morgigen Tage das Triggerfenster und die Preise zu sehen.
Habe mal ein screenshot der aktuellen Umsetzung des Dashboard gemacht. Ist noch nicht fertig und Kosten kommen ja erst ab Januar. Die 3 Thermostate wechseln dann auch noch zu den Kosten (Stromkosten, Total_cost etc). Ich kombiniere das mit einem PV Ertrag Forecast, Wetter
Interessant am heutigen Tag ist aber auch, dass es zwei gleich gute Triggerfenster gegeben hätte. Eben 0 -7 und 9-13. Das zweite Fenster geht aktuell in den Trigger-Zeitberechnungen verloren. Der fc0_trigger dürfte den ja mit ON jeweils gemerkt haben (habe ich nicht geprüft)

Zu 2. macht Sinn und reduziert DB-Abrufe.

Zu 3.1/3.2 Ich habe den compensation_grid auf null gelassen. Alleine die Netzentgelte liegen ja bei ca. 16 ct/kWh (steigend) und somit wohl bei den meisten über compensation_grid. Ich möchte ja die Steuerung eigentlich unabhängig vom compensation_grid machen. Also wenn Bedarf ist, um z.B. das Auto zu laden oder Batterie zu laden. Dann möchte ich ja "unabhängig" vom compensation_grid den jeweils günstigsten Zeitpunkt heute oder morgen nutzen.


Zu 3.3: Erkenne den Mehrwert nicht.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 30 Dezember 2023, 09:36:13
Zu 3.3 das Trigger Fenster könnte anders ausfallen.

Die zwei Fenster wurden nacheinander im Trigger bedient, was man sehen kann, wenn man den Trigger on/off im Diagramm darstellt.

Compensation_grid wäre für das Sinnvolle Laden des Speichers verwendbar. Bei zu hohen Preisen bei Tibber macht das Speicherladen keinen Sinn. Laden von BEV natürlich schon.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 01 Januar 2024, 15:18:39
Erst mal Danke an Christian für das Tibber Device, ich hätte aber noch mal ne Frage dazu: wie kann ich ohne MQTT / Node-Red die täglichen / monatlichen Verbrauchskosten für mich ermitteln? Gibt es da auch über die HTTPMOD Abfrage eine Möglichkeit?
Alternative: Ich lese meinen Stromzähler über Modbus und OBIS aus und erzeuge mir mit dem statistics Modul damit u.a. stündliche Verbrauchswerte. Jetzt kann ich die ja am Ende jeder Stunde mit dem jeweils gültigen Strompreis multiplizieren und habe dann damit die Verbrauchskosten für die jeweils abgelaufene Stunde. Aber wie summiere ich das dann am geschicktesten zu täglichen bzw. monatlichen Werten auf? Das statistics-Modul kann ja glaube ich keine Summenbildung. Werde es mal mit monotonic probieren und das dann in einem eigenen Reading aufsummieren, was dann wieder über statistics ausgewertet wird. Etwas kompliziert, aber vielleicht gibt es ja eine einfachere Möglichkeit.
Danke und Grüße,
Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 01 Januar 2024, 15:27:31
Hallo,
Bezüglich der Websocket habe ich heute mal angefangen, die Verbindung wird auch wohl aufgebaut - aber praktisch auch sofort wieder geschlossen. Vielleicht sieht jemand ja den Fehler, denn dann könnten wir direkt auf FHEM heraus die "liveMeasurements" auslesen. Die Attribute "homeId" und "token" muss man aus der API-Seite auslesen: https://developer.tibber.com/explorer (https://developer.tibber.com/explorer)

Ganz generell funktioniert eine Websocket wohl so aus einem Dummy heraus, das nutze ich seit mehreren Wochen für OwnTone (vormal ForkedDaapd): https://forum.fhem.de/index.php?topic=135838.0 (https://forum.fhem.de/index.php?topic=135838.0)

defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws eventMap /wert connect:start/wert disconnect:stop/
attr Tibber.ws group Strom
attr Tibber.ws homeId 1234567-1234-1234-1234-1234567890
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws readingList wert
attr Tibber.ws setList wert
attr Tibber.ws token BLABLABLA
attr Tibber.ws userReadings connect:wert:.connect {\
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device already open" if (defined($devState));;\
    \
    $hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
    #is set implicitly by wss: $hash->{SSL} = 1;;\
    $hash->{TIMEOUT} = 10;;\
    \
    # special headers needed for Tibber, see also Developer Tools in Browser\
    $hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
    $hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
    $hash->{header}{'Origin'} = 'websocket-api.tibber.com';;\
    \
    # callback function when "select" signals data for us\
    # websocket Ping/Pongs are treated in DevIo but still call this function\
    $hash->{directReadFn} = sub () {\
        my $hash = $defs{$name};;\
        readingsBeginUpdate($hash);;\
        \
        # we can read without closing the DevIo, because select signalled data\
        my $buf = DevIo_SimpleRead($hash);;\
        \
        if(!defined($buf)) {\
            #DevIo_CloseDev($hash);;\
            $buf = "not connected";;\
        }\
        \
        # only update our reading if buffer is not empty\
        readingsBulkUpdate($hash, "websocketData", "$buf") if ($buf ne "");;\
        readingsEndUpdate($hash, 1);;\
    };;\
    \
    # open DevIo websocket\
    DevIo_OpenDev($hash, 0, undef, sub(){\
        my ($hash, $error) = @_;;\
        return "$error" if ($error);;\
        \
        #immediately send what we would like to be notified for\
        my $homeId = AttrVal($name, "homeId", "???");;\
        DevIo_SimpleWrite($hash, 'subscription{ liveMeasurement(homeId:"'.$homeId.'"){ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower }}', 2);;\
    });;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:wert:.disconnect {\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash);;\
    DevIo_SimpleRead($hash);;\
    DevIo_CloseDev($hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
    my $myState = ReadingsVal($name, "state", "???");;\
    return if ($myState ne "disconnected");;\
    \
    ## timer callback function, called after a few seconds to initiate a reconnect\
    #my $timerFunction = sub() {\
    #    my ($hash) = @_;;\
    #    my $devState = DevIo_IsOpen($hash);;\
    #    readingsSingleUpdate($hash, "wert", "connect", 1) if (!defined($devState));;\
    #};;\
    #my $hash = $defs{$name};;\
    #RemoveInternalTimer($hash, $timerFunction);;\
    #InternalTimer(gettimeofday() + 60, $timerFunction, $hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
}
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 01 Januar 2024, 16:01:11
Moin,
Die Werte für heute/Monat/Jahr werden doch bereits im Device gebildet und im EVU_Tibber auch angezeigt.

VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 01 Januar 2024, 16:09:05
Moin,
Die Werte für heute/Monat/Jahr werden doch bereits im Device gebildet und im EVU_Tibber auch angezeigt.

VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 01 Januar 2024, 17:37:34
Zitat von: ch.eick am 01 Januar 2024, 16:01:11Moin,
Die Werte für heute/Monat/Jahr werden doch bereits im Device gebildet und im EVU_Tibber auch angezeigt.

VG Christian

OK, Danke. Dann werden die entsprechenden userreadings bei mir vermutlich noch nicht angezeigt, weil mein Vertrag erst am 5.1. startet.

VG, Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Januar 2024, 13:38:53
Zitat von: tomhead am 01 Januar 2024, 17:37:34Dann werden die entsprechenden userreadings bei mir vermutlich noch nicht angezeigt, weil mein Vertrag erst am 5.1. startet.
Hallo Tom,
hier mal ein Beispiel, der aus der Datenbank ermittelten Werte, was im userReadings geschieht.
nodes_consumption_day 9.3770
nodes_consumption_month 22.4870
nodes_consumption_year 22.4870
nodes_cost_avg 11.39
nodes_cost_max 33.63
nodes_cost_min 0.54
total_cost_day 2.19
total_cost_month 4.70
total_cost_year 4.70
VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Januar 2024, 16:31:02
Moin,
falls übrigens jemand das EVU_Tibber_connect in der Node-Red Variante verwendet, dann könnte man dort auch die Änderungen im userReading übernehmen (https://forum.fhem.de/index.php?msg=1298016).

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 02 Januar 2024, 16:34:10
Zitat von: Torxgewinde am 01 Januar 2024, 15:27:31Hallo,
Bezüglich der Websocket habe ich heute mal angefangen, die Verbindung wird auch wohl aufgebaut - aber praktisch auch sofort wieder geschlossen. Vielleicht sieht jemand ja den Fehler, denn dann könnten wir direkt auf FHEM heraus die "liveMeasurements" auslesen. Die Attribute "homeId" und "token" muss man aus der API-Seite auslesen: https://developer.tibber.com/explorer (https://developer.tibber.com/explorer)
< snip >
Bist Du da schon weiter gekommen?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 02 Januar 2024, 18:43:49
Zitat von: ch.eick am 02 Januar 2024, 13:38:53Hallo Tom,
hier mal ein Beispiel, der aus der Datenbank ermittelten Werte, was im userReadings geschieht.
nodes_consumption_day 9.3770
nodes_consumption_month 22.4870
nodes_consumption_year 22.4870
nodes_cost_avg 11.39
nodes_cost_max 33.63
nodes_cost_min 0.54
total_cost_day 2.19
total_cost_month 4.70
total_cost_year 4.70

Hallo Christian, Danke. Ich habe angenommen, dass aufgrund der Bezeichnungen (nodes_...) die Werte nur mit der red-node Anbindung erstellt werden. Aber ich verstehe dich so, dass das auch mit der HTTPMOD Version funktioniert?

Und noch eine Frage zu deinem letzten Update zur Berechnung der avg, min, max Werte: ist das so gedacht, dass der avg Wert nun über beide Tage gemittelt wird? Ich dachte, das war vorher der jeweilige Tagesmittelwert.

VG, Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 02 Januar 2024, 22:21:15
Zitat von: ch.eick am 02 Januar 2024, 16:34:10...
Bist Du da schon weiter gekommen?

Ja, es läuft nun 👍:
2024.01.02 22:54:42 3: Opening Tibber.ws device wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
2024.01.02 22:54:43 3: Tibber.ws device opened
2024.01.02 22:54:43 1: Tibber.ws:connect: websocket data: >>>{"type":"connection_ack"}<<<
2024.01.02 22:54:43 1: Tibber.ws:onConnectionAck: got connection ack
2024.01.02 22:54:43 1: Tibber.ws:onConnectionAck: sending JSON: >>>{ "id":"TorxgewindeID", "type":"subscribe", "payload":{"variables":{}, "extensions":{}, "query":"subscription { liveMeasurement( homeId: \"...geheim...\" ) { timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower }}"}}<<<
2024.01.02 22:54:55 1: Tibber.ws:connect: websocket data: >>><<<
2024.01.02 22:55:01 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:54:59.000+01:00","power":607,"accumulatedConsumption":15.2338,"accumulatedCost":4.08684,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:04 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:02.000+01:00","power":608,"accumulatedConsumption":15.2342,"accumulatedCost":4.086937,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:06 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:05.000+01:00","power":615,"accumulatedConsumption":15.2349,"accumulatedCost":4.087108,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:07 1: Tibber.ws:connect: websocket data: >>><<<
2024.01.02 22:55:14 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:11.000+01:00","power":623,"accumulatedConsumption":15.2359,"accumulatedCost":4.087353,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:18 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:18.000+01:00","power":610,"accumulatedConsumption":15.2369,"accumulatedCost":4.087597,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:19 1: Tibber.ws:connect: websocket data: >>><<<
2024.01.02 22:55:25 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:24.000+01:00","power":610,"accumulatedConsumption":15.2379,"accumulatedCost":4.087841,"currency":"EUR","minPower":0,"averagePower":664.7,"maxPower":4162}}}}<<<
2024.01.02 22:55:30 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:30.000+01:00","power":610,"accumulatedConsumption":15.2389,"accumulatedCost":4.088086,"currency":"EUR","minPower":0,"averagePower":664.6,"maxPower":4162}}}}<<<
2024.01.02 22:55:31 1: Tibber.ws:connect: websocket data: >>><<<
2024.01.02 22:55:37 1: Tibber.ws:connect: websocket data: >>>{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-02T22:55:37.000+01:00","power":637,"accumulatedConsumption":15.24,"accumulatedCost":4.088354,"currency":"EUR","minPower":0,"averagePower":664.6,"maxPower":4162}}}}<<<

Hier der aktuellen Stand:
defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token myId
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws eventMap /wert connect:start/wert subscribe:subscr/wert disconnect:stop/
attr Tibber.ws homeId deineHomeIDHier
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws myId TorxgewindeID
attr Tibber.ws readingList wert
attr Tibber.ws setList wert
attr Tibber.ws token deinTibberTokenHier
attr Tibber.ws userReadings connect:wert:.connect {\
my $hash = $defs{$name};;\
my $devState = DevIo_IsOpen($hash);;\
return "Device already open" if (defined($devState));;\
\
$hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
#$hash->{SSL} = 1;;\
$hash->{TIMEOUT} = 10;;\
\
# special headers needed for Tibber, see also Developer Tools in Browser\
$hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
$hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
$hash->{header}{'Origin'} = 'https://developer.tibber.com';;\
\
# callback function when "select" signals data for us\
# websocket Ping/Pongs are treated in DevIo but still call this function\
$hash->{directReadFn} = sub () {\
my $hash = $defs{$name};;\
readingsBeginUpdate($hash);;\
\
# we can read without closing the DevIo, because select signalled data\
my $buf = DevIo_SimpleRead($hash);;\
\
if(!defined($buf)) {\
#DevIo_CloseDev($hash);;\
$buf = "not connected";;\
}\
\
Log(1, "$name:$reading: websocket data: >>>$buf<<<");;\
\
# only update our reading if buffer is not empty\
readingsBulkUpdate($hash, "websocketData", "$buf") if ($buf ne "");;\
readingsEndUpdate($hash, 1);;\
};;\
\
# open DevIo websocket\
DevIo_OpenDev($hash, 0, undef, sub(){\
my ($hash, $error) = @_;;\
return "$error" if ($error);;\
\
#immediately send what we would like to be notified for\
my $homeId = AttrVal($name, "homeId", "???");;\
my $token = AttrVal($name, "token", "???");;\
\
DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);;\
});;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:wert:.disconnect {\
my $hash = $defs{$name};;\
RemoveInternalTimer($hash);;\
DevIo_SimpleRead($hash);;\
DevIo_CloseDev($hash);;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
my $myState = ReadingsVal($name, "state", "???");;\
return if ($myState ne "disconnected");;\
\
## timer callback function, called after a few seconds to initiate a reconnect\
#my $timerFunction = sub() {\
# my ($hash) = @_;;\
# my $devState = DevIo_IsOpen($hash);;\
# readingsSingleUpdate($hash, "wert", "connect", 1) if (!defined($devState));;\
#};;\
#my $hash = $defs{$name};;\
#RemoveInternalTimer($hash, $timerFunction);;\
#InternalTimer(gettimeofday() + 60, $timerFunction, $hash);;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onConnectionAck:websocketData:.*connection_ack.* {\
Log(1, "$name:$reading: got connection ack");;\
\
my $hash = $defs{$name};;\
my $devState = DevIo_IsOpen($hash);;\
return "Device not open" if (!defined($devState));;\
\
my $homeId = AttrVal($name, "homeId", "???");;\
my $myId = AttrVal($name, "myId", "???");;\
\
my $json = '{ "id":"'. $myId .'", "type":"subscribe"'.", ";;\
$json .= '"payload":{';;\
$json .= '"variables":{}'.", ";;\
$json .= '"extensions":{}'.", ";;\
$json .= '"query":"subscription { liveMeasurement( homeId: \"'.$homeId.'\" ) ';;\
$json .= '{ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower }}"';;\
$json .= '}}';;\
\
Log(1, "$name:$reading: sending JSON: >>>$json<<<");;\
DevIo_SimpleWrite($hash, $json, 2);;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
}
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 03 Januar 2024, 09:09:27
Hallo Tom,
Zitat von: tomhead am 02 Januar 2024, 18:43:49Hallo Christian, Danke. Ich habe angenommen, dass aufgrund der Bezeichnungen (nodes_...) die Werte nur mit der red-node Anbindung erstellt werden. Aber ich verstehe dich so, dass das auch mit der HTTPMOD Version funktioniert?
der Namensteil "nodes_" kommt aus den Tibber Daten.
ZitatUnd noch eine Frage zu deinem letzten Update zur Berechnung der avg, min, max Werte: ist das so gedacht, dass der avg Wert nun über beide Tage gemittelt wird? Ich dachte, das war vorher der jeweilige Tagesmittelwert.
Ja, das habe ich jetzt über alle Daten von fc0 und fc1 gebildet, um einen besseren Wert zu bekommen. Es kam vor, dass z.B. fc0 zwar ein Triggerfenster hat was jedoch um einiges höher lag als das von fc1. Jetzt würde das Triggerfenster dann um 14 Uhr, wenn der nächste Tag geliefert wird mit dem Preisniveau vom fc1 neu angepasst werden.

Den fc_med habe ich bisher nur ermittelt, jedoch noch nicht eingebaut.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 03 Januar 2024, 13:53:52
ich bin ja nun auch seit 1.1.2024 tibber-Kunde.

Ein wenig kämpfe ich noch mit der Stabilität der Anwendung bzw. den Daten.

Wenn ich bei den nodes_00_0x_cost, nodes_00_0x_consumption eine "0" (kein null) im listing/DB habe, muss ich davon ausgehen, dass mir tibber die Daten nicht korrekt liefert ?

nodes_00_00_consumption 0.103                2024-01-03 13:41:17
nodes_00_00_cost        0.0276               2024-01-03 13:41:17
nodes_00_00_from        2024-01-03 10:00:00  2024-01-03 13:41:17
nodes_00_01_consumption 0                    2024-01-03 13:41:17
nodes_00_01_cost        0                    2024-01-03 13:41:17
nodes_00_01_from        2024-01-03 11:00:00  2024-01-03 13:41:17
nodes_00_02_consumption 0                    2024-01-03 13:41:17
nodes_00_02_cost        0                    2024-01-03 13:41:17
nodes_00_02_from        2024-01-03 12:00:00  2024-01-03 13:41:17

Eine Idee, woran das ggf. (sonst) liegen könnte?

Danke
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 03 Januar 2024, 14:43:40
Zitat von: jnewton957 am 03 Januar 2024, 13:53:52ich bin ja nun auch seit 1.1.2024 tibber-Kunde.
Ein wenig kämpfe ich noch mit der Stabilität der Anwendung bzw. den Daten.
Wenn ich bei den nodes_00_0x_cost, nodes_00_0x_consumption eine "0" (kein null) im listing/DB habe, muss ich davon ausgehen, dass mir tibber die Daten nicht korrekt liefert ?
< snip >
Eine Idee, woran das ggf. (sonst) liegen könnte?
Hallo,
die Werte kommen so von Tibber und es könnte z.B. sein, dass Du wirklich keinen, oder einen sehr kleinen Verbrauch gehabt hast, wenn eventuell eine PV mit Speicher mit im Spiel ist.

## Bei den Kosten kommt es vor, dass Tibber diese noch nicht berechnet hat (null). Dann werden sie meistens bei der nächsten Abfrage geliefert.
## Das Schreiben in die Datenbank erfolgt im userReadings mit dem von Tibber gelieferten TIMESTAMP. Sollte später von Tibber ein aktualisierter
## Wert geliefert werden, wir dieser dann in der Datenbank ebenfalls korrigiert übernommen (ON DUPLICATE KEY UPDATE)
get03-2Name nodes_00_00_cost
get03-2OExpr ($val ne "0" and $val ne "null")? round($val,4) : $val

## Der Wert von Consumpion wird direkt von Tibber gelesen
get03-3Name nodes_00_00_consumption
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 03 Januar 2024, 16:29:52
Komisch ist es schon.
Habe mal über die https://developer.tibber.com/explorer eine live Abfrage gemacht.

{
  "liveMeasurement": {
    "timestamp": "2024-01-03T16:27:02.000+01:00",
    "power": 423.4,
    "accumulatedConsumption": 14.4858,
    "accumulatedCost": null,
    "currency": null,
    "minPower": 0,
    "averagePower": 880.4,
    "maxPower": 5145.5
  }
}

Quasi gleiches Ergebnis. accumulatedCost": null, currency": null,

ich beobachte das mal weiter. Aktuell haben wir keinen PV Ertrag und eben 423.4 W Verbrauch.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 04 Januar 2024, 18:31:22
Hier die aktuelle Version der "liveMeasurements" via Websocket. Die homeId und der token sind funktionale Demo-Werte von https://developer.tibber.com/explorer (https://developer.tibber.com/explorer):

defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token myId
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws eventMap /wert connect:start/wert disconnect:stop/
attr Tibber.ws homeId 96a14971-525a-4420-aae9-e5aedaa129ff
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws myId TorxgewindeID
attr Tibber.ws readingList wert
attr Tibber.ws setList wert
attr Tibber.ws token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
attr Tibber.ws userReadings connect:wert:.connect {\
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device already open" if (defined($devState));;\
    \
    $hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
    \
    # special headers needed for Tibber, see also Developer Tools in Browser\
    $hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
    $hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
    $hash->{header}{'Origin'} = 'https://developer.tibber.com';;\
    \
    # callback function when "select" signals data for us\
    # websocket Ping/Pongs are treated in DevIo but still call this function\
    $hash->{directReadFn} = sub () {\
        my $hash = $defs{$name};;\
        readingsBeginUpdate($hash);;\
        \
        # we can read without closing the DevIo, because select signalled data\
        my $buf = DevIo_SimpleRead($hash);;\
        \
        if(!defined($buf)) {\
            DevIo_CloseDev($hash);;\
            $buf = "not_connected";;\
        }\
        \
        #Log(1, "$name:$reading: websocket data: >>>$buf<<<");;\
        \
        # only update our reading if buffer is not empty\
        readingsBulkUpdate($hash, "websocketData", "$buf") if ($buf ne "");;\
        readingsEndUpdate($hash, 1);;\
    };;\
    \
    # open DevIo websocket\
    DevIo_OpenDev($hash, 0, undef, sub(){\
        my ($hash, $error) = @_;;\
        return "$error" if ($error);;\
        \
        my $token = AttrVal($name, "token", "???");;\
        \
        DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);;\
    });;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:wert:.disconnect {\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash);;\
    DevIo_SimpleRead($hash);;\
    DevIo_CloseDev($hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
    my $myState = ReadingsVal($name, "state", "???");;\
    my $myData = ReadingsVal($name, "websocketData", "???");;\
    return if ($myState ne "disconnected" and $myData ne "not_connected");;\
    \
    ## timer callback function, called after a few seconds to initiate a reconnect\
    my $timerFunction = sub() {\
        my ($hash) = @_;;\
        readingsSingleUpdate($hash, "wert", "connect", 1);;\
    };;\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash, $timerFunction);;\
    \
    # wait a random time before reconnect (exponential backoff TBD):\
    my $rwait = int(rand(200)) + 30;;\
    InternalTimer(gettimeofday() + $rwait, $timerFunction, $hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onConnectionAck:websocketData:.*connection_ack.* {\
    Log(1, "$name:$reading: got connection ack");;\
    \
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device not open" if (!defined($devState));;\
    \
    my $homeId = AttrVal($name, "homeId", "???");;\
    my $myId = AttrVal($name, "myId", "???");;\
    \
    my $json = '{ "id":"'. $myId .'", "type":"subscribe"'.", ";;\
    $json .= '"payload":{';;\
    $json .= '"variables":{}'.", ";;\
    $json .= '"extensions":{}'.", ";;\
    $json .= '"query":"subscription { liveMeasurement( homeId: \"'.$homeId.'\" ) ';;\
    #$json .= '{ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower signalStrength }}"';;\
    $json .= '{ timestamp power lastMeterConsumption accumulatedConsumption accumulatedProduction ';;\
    $json .= 'accumulatedProductionLastHour accumulatedCost accumulatedReward currency minPower averagePower maxPower ';;\
    $json .= 'powerProduction powerReactive powerProductionReactive minPowerProduction maxPowerProduction lastMeterProduction ';;\
    $json .= 'powerFactor voltagePhase1 voltagePhase2 voltagePhase3 signalStrength }}"';;\
    $json .= '}}';;\
    \
    Log(1, "$name:$reading: sending JSON: >>>$json<<<");;\
    DevIo_SimpleWrite($hash, $json, 2);;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onNextLiveMeasurement:websocketData:.*next.*payload.*data.*liveMeasurement.* {\
    my $val = ReadingsVal($name, "websocketData", "{}");;\
    my %res = %{json2nameValue($val, undef, undef, "payload_data_liveMeasurement.*")};;\
    \
    my $ret = "got values for:\n";;\
    foreach my $k (sort keys %res) {\
        $ret .= "$k\n";;\
        readingsBulkUpdate($hash, makeReadingName($k), $res{$k});;\
    }\
    return $ret;;\
}
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Zook am 05 Januar 2024, 14:12:08
Für was steht denn die "myId" bei
attr Tibber.ws myId TorxgewindeID ?
Ist das der Login bei Tibber?

Zitat von: Torxgewinde am 04 Januar 2024, 18:31:22Hier die aktuelle Version der "liveMeasurements" via Websocket. Die homeId und der token sind funktionale Demo-Werte von https://developer.tibber.com/explorer (https://developer.tibber.com/explorer):

defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token myId
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws eventMap /wert connect:start/wert disconnect:stop/
attr Tibber.ws homeId 96a14971-525a-4420-aae9-e5aedaa129ff
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws myId TorxgewindeID
attr Tibber.ws readingList wert
attr Tibber.ws setList wert
attr Tibber.ws token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
attr Tibber.ws userReadings connect:wert:.connect {\
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device already open" if (defined($devState));;\
    \
    $hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
    \
    # special headers needed for Tibber, see also Developer Tools in Browser\
    $hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
    $hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
    $hash->{header}{'Origin'} = 'https://developer.tibber.com';;\
    \
    # callback function when "select" signals data for us\
    # websocket Ping/Pongs are treated in DevIo but still call this function\
    $hash->{directReadFn} = sub () {\
        my $hash = $defs{$name};;\
        readingsBeginUpdate($hash);;\
        \
        # we can read without closing the DevIo, because select signalled data\
        my $buf = DevIo_SimpleRead($hash);;\
        \
        if(!defined($buf)) {\
            DevIo_CloseDev($hash);;\
            $buf = "not_connected";;\
        }\
        \
        #Log(1, "$name:$reading: websocket data: >>>$buf<<<");;\
        \
        # only update our reading if buffer is not empty\
        readingsBulkUpdate($hash, "websocketData", "$buf") if ($buf ne "");;\
        readingsEndUpdate($hash, 1);;\
    };;\
    \
    # open DevIo websocket\
    DevIo_OpenDev($hash, 0, undef, sub(){\
        my ($hash, $error) = @_;;\
        return "$error" if ($error);;\
        \
        my $token = AttrVal($name, "token", "???");;\
        \
        DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);;\
    });;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:wert:.disconnect {\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash);;\
    DevIo_SimpleRead($hash);;\
    DevIo_CloseDev($hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
    my $myState = ReadingsVal($name, "state", "???");;\
    my $myData = ReadingsVal($name, "websocketData", "???");;\
    return if ($myState ne "disconnected" and $myData ne "not_connected");;\
    \
    ## timer callback function, called after a few seconds to initiate a reconnect\
    my $timerFunction = sub() {\
        my ($hash) = @_;;\
        readingsSingleUpdate($hash, "wert", "connect", 1);;\
    };;\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash, $timerFunction);;\
    \
    # wait a random time before reconnect (exponential backoff TBD):\
    my $rwait = int(rand(200)) + 30;;\
    InternalTimer(gettimeofday() + $rwait, $timerFunction, $hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onConnectionAck:websocketData:.*connection_ack.* {\
    Log(1, "$name:$reading: got connection ack");;\
    \
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device not open" if (!defined($devState));;\
    \
    my $homeId = AttrVal($name, "homeId", "???");;\
    my $myId = AttrVal($name, "myId", "???");;\
    \
    my $json = '{ "id":"'. $myId .'", "type":"subscribe"'.", ";;\
    $json .= '"payload":{';;\
    $json .= '"variables":{}'.", ";;\
    $json .= '"extensions":{}'.", ";;\
    $json .= '"query":"subscription { liveMeasurement( homeId: \"'.$homeId.'\" ) ';;\
    #$json .= '{ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower signalStrength }}"';;\
    $json .= '{ timestamp power lastMeterConsumption accumulatedConsumption accumulatedProduction ';;\
    $json .= 'accumulatedProductionLastHour accumulatedCost accumulatedReward currency minPower averagePower maxPower ';;\
    $json .= 'powerProduction powerReactive powerProductionReactive minPowerProduction maxPowerProduction lastMeterProduction ';;\
    $json .= 'powerFactor voltagePhase1 voltagePhase2 voltagePhase3 signalStrength }}"';;\
    $json .= '}}';;\
    \
    Log(1, "$name:$reading: sending JSON: >>>$json<<<");;\
    DevIo_SimpleWrite($hash, $json, 2);;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onNextLiveMeasurement:websocketData:.*next.*payload.*data.*liveMeasurement.* {\
    my $val = ReadingsVal($name, "websocketData", "{}");;\
    my %res = %{json2nameValue($val, undef, undef, "payload_data_liveMeasurement.*")};;\
    \
    my $ret = "got values for:\n";;\
    foreach my $k (sort keys %res) {\
        $ret .= "$k\n";;\
        readingsBulkUpdate($hash, makeReadingName($k), $res{$k});;\
    }\
    return $ret;;\
}
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions

Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 05 Januar 2024, 16:24:28
Zitat von: Zook am 05 Januar 2024, 14:12:08Für was steht denn die "myId" bei
attr Tibber.ws myId TorxgewindeID ?
Ist das der Login bei Tibber?
Ja, die ID und das Token identifizieren den Kunden.
Wer noch kein Kunde ist kann mit der ID und dem Token von der Entwickler Seite üben, dann kommen aber fiktive Testdaten und als Wehrung Schwedische Kronen ;-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 05 Januar 2024, 16:43:43
Zitat von: ch.eick am 05 Januar 2024, 16:24:28
Zitat von: Zook am 05 Januar 2024, 14:12:08Für was steht denn die "myId" bei
attr Tibber.ws myId TorxgewindeID ?
Ist das der Login bei Tibber?
Ja, die ID und das Token identifizieren den Kunden.
Verstehe ich aber auch noch nicht ganz; es gibt ja die homeID und den Token (die sind ja als eigene attr gesetzt), aber was ist dann myID?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 05 Januar 2024, 17:13:58
Ich habe eine Demo bei CoolTux hochgeladen, damit man es in Aktion sehen kann: https://demo-fhem.cooltux.net/fhem?room=Power (https://demo-fhem.cooltux.net/fhem?room=Power)

Die Parameter die man anpassen MUSS:

Den Parameter myId KANN man anpassen. Er dient nur dazu, dass man der Websocket eine ID mitgibt die dann in den folgenden Antworten genutzt wird. Der Wert scheint frei wählbar zu sein und hat keine weitere Relevanz außer dass man die Antwort ggf. von anderen unterscheiden kann. Sinn macht mir das für einen Websocket und eine HomeId nicht, aber ggf. ist das vorgesehen wenn man mehrere Websockets/HomeIds gleichzeitig nutzen will. Die Explorer-Testseite selbst trägt da Werte wie zum Beispiel "96a14971-525a-4420-aae9-e5aedaa129ff" ein, die sind aber jedesmal anders. TorxgewindeID ist einfach nur irgendein Wert, man kann da auch "Bla-Blubb-Foo-Bar" etc. eintragen.

Die Doku für Graph-QL über Websockets habe ich hier gefunden: https://github.com/apollographql/subscriptions-transport-ws/blob/master/PROTOCOL.md
Zitatid field so the client can identify each response from the server.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 05 Januar 2024, 23:44:06
Zitat von: jnewton957 am 03 Januar 2024, 16:29:52Komisch ist es schon.
Habe mal über die https://developer.tibber.com/explorer eine live Abfrage gemacht.

{
  "liveMeasurement": {
    "timestamp": "2024-01-03T16:27:02.000+01:00",
    "power": 423.4,
    "accumulatedConsumption": 14.4858,
    "accumulatedCost": null,
    "currency": null,
    "minPower": 0,
    "averagePower": 880.4,
    "maxPower": 5145.5
  }
}

Quasi gleiches Ergebnis. accumulatedCost": null, currency": null,

ich beobachte das mal weiter. Aktuell haben wir keinen PV Ertrag und eben 423.4 W Verbrauch.

Ist bei mir auch so, alle Werte sind vorhanden, nur accumulatedCost:null, currency:null
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 06 Januar 2024, 08:27:06
Ich bräuchte bitte noch mal Hilfe, wie ich die Vorschauwerte für die nächsten 3h über ftui dargestellt bekomme. Die Werte werden ja im Tool von Christian für die uitable berechnet, liegen aber nicht als eigene Readings mit der zugehörigen Uhrzeit ab. Wie bekomme ich das analog der uitable in ftui dargestellt?
Danke und Grüße, Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Januar 2024, 09:05:37
Zitat von: tomhead am 06 Januar 2024, 08:27:06Ich bräuchte bitte noch mal Hilfe, wie ich die Vorschauwerte für die nächsten 3h über ftui dargestellt bekomme. Die Werte werden ja im Tool von Christian für die uitable berechnet, liegen aber nicht als eigene Readings mit der zugehörigen Uhrzeit ab. Wie bekomme ich das analog der uitable in ftui dargestellt?
Danke und Grüße, Tom
Hallo Tom,
das ist die Funktion Price{} im EVU_Tibber Device, die die entsprechenden readings fc[0|1]_[hh]_total aus dem EVU_Tibber_connect ausliest und formatiert anzeigt.
Dabei ist 0 die aktuelle und 1-n die jeweils nächsten Stunden. Durch den Vergleich mit fc_trigger_price wird der Wert dann noch in rot/grün als html formatiert, die Berechnung wird nicht im uiTable gemacht.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Januar 2024, 09:12:29
Zitat von: tomhead am 05 Januar 2024, 23:44:06
Zitat von: jnewton957 am 03 Januar 2024, 16:29:52Komisch ist es schon.
Habe mal über die https://developer.tibber.com/explorer eine live Abfrage gemacht.

< snip >

Quasi gleiches Ergebnis. accumulatedCost": null, currency": null,

ich beobachte das mal weiter. Aktuell haben wir keinen PV Ertrag und eben 423.4 W Verbrauch.

Ist bei mir auch so, alle Werte sind vorhanden, nur accumulatedCost:null, currency:null
Ich denke, dass diese Werte gar nicht über die live Werte mit geliefert werden, denn die Kosten ergeben sich ja erst nach einer abgelaufenen Stunde. In meinem Node-Red Beispiel habe ich den live Stream als zweiten Flow implementiert, der nur die live Werte liefert. Alle anderen Werte werden über die API abgefragt. Beim live Stream habe ich noch zusätzlich eine Filterung auf z.B. alle 15 Sekunden eingerichtet, damit FHEM nicht mit sinnlos vielen Werten geflutet wird.
Bei meiner PV-Anlage werte ich auch nur alle 60 Sekunden aus um nicht die Datenbank, auf dem RPI, zu sprengen.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 06 Januar 2024, 09:47:35
Zitat von: ch.eick am 06 Januar 2024, 09:12:29...
Ich denke, dass diese Werte gar nicht über die live Werte mit geliefert werden, denn die Kosten ergeben sich ja erst nach einer abgelaufenen Stunde.
...
Ne, bei meinem echten Daten zählt der brav meine Tagessumme wie auch in der App mit. Es ist eher die App die da "stottert" und ab und zu ewig braucht um die Live-Werte anzuzeigen.

Zitat von: ch.eick am 06 Januar 2024, 09:12:29...
In meinem Node-Red Beispiel habe ich den live Stream als zweiten Flow implementiert, der nur die live Werte liefert. Alle anderen Werte werden über die API abgefragt. Beim live Stream habe ich noch zusätzlich eine Filterung auf z.B. alle 15 Sekunden eingerichtet, damit FHEM nicht mit sinnlos vielen Werten geflutet wird.
...
Jein, der Pulse liefert real ca. alle fünf Sekunden einen frischen Wert. Die Websocket stottert dann mit einem ziemlichem Jitter die Werte zurück, aber in ähnlichen Intervallen. Ggf. macht es aber tatsächlich Sinn die Readings nochmal in ihrer Rate zu begrenzen, z.B. mit "attr Tibber.ws event-on-change-reading .*" etc. An Perfomanceprobleme stoße ich allerdings trotz geringer Rechenleistung des Servers nicht.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 06 Januar 2024, 17:28:06
Hier einmal eine Liste welche Werte bei mir kommen und welche nicht. Die Werte habe ich mit einfachen Zahlenfolgen ersetzt, aber nur dort wo ich echte Werte hatte. Heute war kein PV-Ertrag, deswegen macht es Sinn dass der auf 0 steht:

{"id":"TorxgewindeID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-06T17:24:35.000+01:00","power":1234,"lastMeterConsumption":1234.5678,"accumulatedConsumption":1.234,"accumulatedProduction":0,"accumulatedProductionLastHour":0,"accumulatedCost":2.613382,"accumulatedReward":null,"currency":"EUR","minPower":117,"averagePower":496.3,"maxPower":6373,"powerProduction":0,"powerReactive":null,"powerProductionReactive":null,"minPowerProduction":0,"maxPowerProduction":0,"lastMeterProduction":1234.5678,"powerFactor":null,"voltagePhase1":218,"voltagePhase2":220.5,"voltagePhase3":219.5,"signalStrength":null}}}}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 06 Januar 2024, 18:29:45
Hier die Liste meiner Werte:
{"id":"TomID","type":"next","payload":{"data":{"liveMeasurement":{"timestamp":"2024-01-06T18:24:25.000+01:00","power":1277,"lastMeterConsumption":9311.8,"accumulatedConsumption":11.6,"accumulatedProduction":0,"accumulatedProductionLastHour":0,"accumulatedCost":null,"accumulatedReward":null,"currency":null,"minPower":0,"averagePower":630.1,"maxPower":4997,"powerProduction":0,"powerReactive":null,"powerProductionReactive":null,"minPowerProduction":0,"maxPowerProduction":6,"lastMeterProduction":3762.1,"powerFactor":null,"voltagePhase1":226.4,"voltagePhase2":227.5,"voltagePhase3":229.2,"signalStrength":null}}}}
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 09 Januar 2024, 23:19:42
So, seit heute kommen bei mir nun auch die Daten zu "accumulatedCost" und "currency".
@Torxgewinde: wie kann ich denn einstellen, dass z.B. nur alle 5 Minuten die Daten abgefragt werden?
VG, Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 10 Januar 2024, 10:04:42
Zitat von: Torxgewinde am 04 Januar 2024, 18:31:22Hier die aktuelle Version der "liveMeasurements" via Websocket. Die homeId und der token sind funktionale Demo-Werte von
< snip >
connect:wert:.connect {
    my $hash = $defs{$name};
    my $devState = DevIo_IsOpen($hash);
    return "Device already open" if (defined($devState));
   
    $hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");
   
    # special headers needed for Tibber, see also Developer Tools in Browser
    $hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';
    $hash->{header}{'Host'} = 'websocket-api.tibber.com';
    $hash->{header}{'Origin'} = 'https://developer.tibber.com';
   
    # callback function when "select" signals data for us
    # websocket Ping/Pongs are treated in DevIo but still call this function
    $hash->{directReadFn} = sub () {
        my $hash = $defs{$name};
        readingsBeginUpdate($hash);
       
        # we can read without closing the DevIo, because select signalled data
        my $buf = DevIo_SimpleRead($hash);
       
        if(!defined($buf)) {
            DevIo_CloseDev($hash);
            $buf = "not_connected";
        }
       
        #Log(1, "$name:$reading: websocket data: >>>$buf<<<");
       
        # only update our reading if buffer is not empty
        readingsBulkUpdate($hash, "websocketData", "$buf") if ($buf ne "");
        readingsEndUpdate($hash, 1);
    };
   
    # open DevIo websocket
    DevIo_OpenDev($hash, 0, undef, sub(){
        my ($hash, $error) = @_;
        return "$error" if ($error);
       
        my $token = AttrVal($name, "token", "???");
       
        DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);
    });
       
    return POSIX::strftime("%H:%M:%S",localtime(time()));
},
< snip >
Moin,
ich habe dann jetzt auch mal das liveMeasurement ausprobiert und hätte da schon einen Wunsch. In dem oben gelisteten Code Stück wird ja der WebSocket gelesen und nur bei Änderungen in die readings geschrieben.
Zitat von: tomhead am 09 Januar 2024, 23:19:42@Torxgewinde: wie kann ich denn einstellen, dass z.B. nur alle 5 Minuten die Daten abgefragt werden?
Könnte man da noch ein Attribut abfragen, dass eine Zeit in Sekunden beinhaltet, um die Abfrage zu verzögern/verlangsamen?
In meinem Fall frage ich z.B. Zähler und die PV-Anlage nur im 60 Sekunden Takt ab, was mit beim EVU Zähler auch reichen würde. Dadurch verringere ich die Anzahl der Events im FHEM und natürlich auch das Logging in die DbLog.
Auch wenn man den Datenverkehr auf dem WebSocket nicht verlangsamen kann, könnte man das setzen der readings verringern und einfach einige Werte verschlucken :-)

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 10 Januar 2024, 18:24:14
Zitat von: ch.eick am 10 Januar 2024, 10:04:42Könnte man da noch ein Attribut abfragen, dass eine Zeit in Sekunden beinhaltet, um die Abfrage zu verzögern/verlangsamen?
...
Auch wenn man den Datenverkehr auf dem WebSocket nicht verlangsamen kann, könnte man das setzen der readings verringern und einfach einige Werte verschlucken :-)
Jupp, das ist technisch korrekt, die Websocket liefert einfach was und wann sie liefert, aber man könnte "skippen" wenn nicht mindestens XX Sekunden vergangen sind. Ich guck mal wann ich dazu kommen kann, dauert ne Weile da ich gerade wieder recht busy bin... Wer da zwischenzeitlich dran möchte ist herzlich eingeladen es vor mir zu machen...
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 10 Januar 2024, 19:08:33
Zitat von: Torxgewinde am 10 Januar 2024, 18:24:14Jupp, das ist technisch korrekt, die Websocket liefert einfach was und wann sie liefert, aber man könnte "skippen" wenn nicht mindestens XX Sekunden vergangen sind. Ich guck mal wann ich dazu kommen kann, dauert ne Weile da ich gerade wieder recht busy bin... Wer da zwischenzeitlich dran möchte ist herzlich eingeladen es vor mir zu machen...
Welches der Statements müsste ich den mit der Zeit überspringen?
Könnte es diese stelle sein?
        # we can read without closing the DevIo, because select signalled data
        my $buf = DevIo_SimpleRead($hash);

Ich habe das Dummy Device bei mir schon mal direkt in das HTTPMOD mit eingebaut, damit später nur ein Device für EVU_Tibber_connect notwendig ist.
Das scheint sogar zu funktionieren, dass man die HTTPMOD abfragen tätigt und wärend dessen der WebSocket die liveMeasurement aktualisiert.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: KölnSolar am 10 Januar 2024, 19:09:31
ZitatWer da zwischenzeitlich dran möchte ist herzlich eingeladen es vor mir zu machen...
Nicht wirklich. 8)
Aber vielleicht kann Dir das OBIS-Modul helfen, da es vergleichbares bietet.
Grüße Markus
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 10 Januar 2024, 19:26:53
Zitat von: KölnSolar am 10 Januar 2024, 19:09:31Aber vielleicht kann Dir das OBIS-Modul helfen, da es vergleichbares bietet.
Hallo Markus,
das übersteigt etwas meine Perl Kenntnisse. Im OBIS Modul habe ich keine Stelle gefunden, die zeitabhängig etwas überspringen würde.
VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 10 Januar 2024, 21:02:38
Hi, müsste eigentlich schon so gehen (hier begrenzt auf mindestens 60 Sekunden Pausen nach jedem Update):

defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token myId minInterval
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws event-on-change-reading .*
attr Tibber.ws eventMap /wert connect:start/wert disconnect:stop/
attr Tibber.ws homeId 96a14971-525a-4420-aae9-e5aedaa129ff
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws minInterval 60
attr Tibber.ws myId TorxgewindeID
attr Tibber.ws readingList wert
attr Tibber.ws room Power
attr Tibber.ws setList wert
attr Tibber.ws stateFormat payload_data_liveMeasurement_accumulatedCost payload_data_liveMeasurement_currency (payload_data_liveMeasurement_power W, Import: payload_data_liveMeasurement_accumulatedConsumption kWh, Export: payload_data_liveMeasurement_accumulatedProduction kWh)
attr Tibber.ws token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
attr Tibber.ws userReadings connect:wert:.connect {\
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device already open" if (defined($devState));;\
    \
    $hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
    \
    # special headers needed for Tibber, see also Developer Tools in Browser\
    $hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
    $hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
    $hash->{header}{'Origin'} = 'https://developer.tibber.com';;\
    \
    # callback function when "select" signals data for us\
    # websocket Ping/Pongs are treated in DevIo but still call this function\
    $hash->{directReadFn} = sub () {\
        my $hash = $defs{$name};;\
        \
        # we can read without closing the DevIo, because select signalled data\
        my $buf = DevIo_SimpleRead($hash);;\
        \
        if(!defined($buf)) {\
            DevIo_CloseDev($hash);;\
            $buf = "not_connected";;\
        }\
        \
        #Log(1, "$name:$reading: websocket data: >>>$buf<<<");;\
        \
        # only update our reading if buffer is not empty and if last update is older than minInterval\
        my $websocketDataAge = ReadingsAge($name, "websocketData", 3600);;\
        my $minInterval = AttrVal($name, "minInterval", 0);;\
        if ($buf ne "") {\
            my $isNext = ($buf =~ /{"id":".*","type":"next","payload":{"data":{"liveMeasurement":.*}/s);;\
            \
            readingsBeginUpdate($hash);;\
            if ($isNext && $websocketDataAge > $minInterval) {\
                readingsBulkUpdate($hash, "websocketData", "$buf");;\
            } elsif (!$isNext) {\
                readingsBulkUpdate($hash, "websocketData", "$buf");;\
            }\
            readingsEndUpdate($hash, 1);;\
        }\
    };;\
    \
    # open DevIo websocket\
    DevIo_OpenDev($hash, 0, undef, sub(){\
        my ($hash, $error) = @_;;\
        return "$error" if ($error);;\
        \
        my $token = AttrVal($name, "token", "???");;\
        \
        DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);;\
    });;\
        \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:wert:.disconnect {\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash);;\
    DevIo_SimpleRead($hash);;\
    DevIo_CloseDev($hash);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
    my $myState = ReadingsVal($name, "state", "???");;\
    my $myData = ReadingsVal($name, "websocketData", "???");;\
    return if ($myState ne "disconnected" and $myData ne "not_connected");;\
    \
    ## timer callback function, called after a few seconds to initiate a reconnect\
    my $timerFunction = sub() {\
        my ($hash) = @_;;\
        my $devState = DevIo_IsOpen($hash);;\
        readingsSingleUpdate($hash, "wert", "connect", 1) if (!defined($devState));;;;\
    };;\
    my $hash = $defs{$name};;\
    RemoveInternalTimer($hash, $timerFunction);;\
    \
    # wait a random time before reconnect (exponential backoff TBD):\
    my $rwait = int(rand(200)) + 30;;\
    InternalTimer(gettimeofday() + $rwait, $timerFunction, $hash);;\
    readingsBulkUpdate($hash, "wert", "reconnect attempt in $rwait seconds");;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onConnectionAck:websocketData:.*connection_ack.* {\
    Log(1, "$name:$reading: got connection ack");;\
    \
    my $hash = $defs{$name};;\
    my $devState = DevIo_IsOpen($hash);;\
    return "Device not open" if (!defined($devState));;\
    \
    my $homeId = AttrVal($name, "homeId", "???");;\
    my $myId = AttrVal($name, "myId", "???");;\
    \
    my $json = '{ "id":"'. $myId .'", "type":"subscribe"'.", ";;\
    $json .= '"payload":{';;\
    $json .= '"variables":{}'.", ";;\
    $json .= '"extensions":{}'.", ";;\
    $json .= '"query":"subscription { liveMeasurement( homeId: \"'.$homeId.'\" ) ';;\
    #$json .= '{ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower signalStrength }}"';;\
    $json .= '{ timestamp power lastMeterConsumption accumulatedConsumption accumulatedProduction ';;\
    $json .= 'accumulatedProductionLastHour accumulatedCost accumulatedReward currency minPower averagePower maxPower ';;\
    $json .= 'powerProduction powerReactive powerProductionReactive minPowerProduction maxPowerProduction lastMeterProduction ';;\
    $json .= 'powerFactor voltagePhase1 voltagePhase2 voltagePhase3 signalStrength }}"';;\
    $json .= '}}';;\
    \
    Log(1, "$name:$reading: sending JSON: >>>$json<<<");;\
    DevIo_SimpleWrite($hash, $json, 2);;\
    \
    return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onNextLiveMeasurement:websocketData:.*next.*payload.*data.*liveMeasurement.* {\
    my $val = ReadingsVal($name, "websocketData", "{}");;\
    my %res = %{json2nameValue($val, undef, undef, "payload_data_liveMeasurement.*")};;\
    \
    my $ret = "got values for:\n";;\
    foreach my $k (sort keys %res) {\
        $ret .= "$k\n";;\
        readingsBulkUpdate($hash, makeReadingName($k), $res{$k});;\
    }\
    return $ret;;\
}
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 10 Januar 2024, 23:13:03
Zitat von: Torxgewinde am 10 Januar 2024, 21:02:38Hi, müsste eigentlich schon so gehen (hier begrenzt auf mindestens 60 Sekunden Pausen nach jedem Update):

Vielen Dank für die schnelle Anpassung, funktioniert!
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: KölnSolar am 11 Januar 2024, 09:56:58
Hi Christian,

Problem scheint ja gelöst, aber trotzdem zu Deiner Frage
Zitatdas übersteigt etwas meine Perl Kenntnisse. Im OBIS Modul habe ich keine Stelle gefunden, die zeitabhängig etwas überspringen würde
Im OBIS-Modul gibt es 3 entscheidende Attribute, die ich nutze, weil meine Zähler massenhaft Daten übertragen und dadurch FHEM überlastet wird.
- pollingMode - Changes from direct-read to polling-mode. Useful with meters, that send a continous datastream. Reduces CPU-load.
- interval    - The polling-interval in seconds. (Only useful in Polling-Mode)
- alignTime   - Aligns the intervals to a given time. Each interval is repeatedly calculated. So if alignTime=00:00 and interval=600 aligns the interval to xx:00:00, xx:10:00, xx:20:00 etc....

Grüße Markus
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 11 Januar 2024, 10:39:18
Zitat von: KölnSolar am 11 Januar 2024, 09:56:58Hi Christian,

Problem scheint ja gelöst, aber trotzdem zu Deiner Frage
Zitatdas übersteigt etwas meine Perl Kenntnisse. Im OBIS Modul habe ich keine Stelle gefunden, die zeitabhängig etwas überspringen würde
Im OBIS-Modul gibt es 3 entscheidende Attribute, die ich nutze, weil meine Zähler massenhaft Daten übertragen und dadurch FHEM überlastet wird.
- pollingMode - Changes from direct-read to polling-mode. Useful with meters, that send a continous datastream. Reduces CPU-load.
- interval    - The polling-interval in seconds. (Only useful in Polling-Mode)
- alignTime   - Aligns the intervals to a given time. Each interval is repeatedly calculated. So if alignTime=00:00 and interval=600 aligns the interval to xx:00:00, xx:10:00, xx:20:00 etc....

Grüße Markus
Okay, danke
dann muss ich nur noch den Code dazu im Modul finden und verstehen ;-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 13 Januar 2024, 11:21:07
Wie bekomme ich denn das hin, dass der Websocket bei jedem FHEM Neustart automatisch startet?  :-[
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 13 Januar 2024, 15:06:13
Moin,
Es gibt da viele Wege. Ich bevorzuge ein DOIF, das müsste dann so aussehen:
defmod di_Startup DOIF (0) ## Startup Befehle\
{Log(0, "▶️ di_Startup startet")}\
(set Tibber.ws start)\
{Log(0, "🏁 di_Startup beendet")}
attr di_Startup do always
attr di_Startup startup set $SELF cmd_1

Probier's mal aus bitte...
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 13 Januar 2024, 15:58:28
Zitat von: Torxgewinde am 13 Januar 2024, 15:06:13Moin,
Es gibt da viele Wege. Ich bevorzuge ein DOIF, das müsste dann so aussehen:
defmod di_Startup DOIF (0) ## Startup Befehle\
    {Log(0, "▶️ di_Startup startet")}\
    (set Tibber.ws start)\
    {Log(0, "🏁 di_Startup beendet")}
attr di_Startup do always
attr di_Startup startup set $SELF cmd_1

Probier's mal aus bitte...
Hallo zusammen,
In meiner Variante wird das EVU_Tibber_connect Device ja noch von einem EVU_Tibber (doif) begleitet, das die Visualisierung mit uiTable macht. Dort würde ich mir dann auch einen Startblock Vorstellen.
Den Websocket habe ich ebenfalls bereits im EVU_Tibber_connect (HTTPMOD) im Test, sodass dann letztlich zwei Devices alles beinhalten.
Bei den zu triggernden Devices verwende ich ebenfalls DOIF im Perlmodus, wodurch man die uiTable Funktionen Device übergreifend nur einmal benötigt.
Nach meinen Tests stell ich das dann hier mal ein.

Eine Frage noch, triggert das (0) einmalig auf den fhem Start?

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 13 Januar 2024, 21:28:55
Hallo,

Coole Sache, gibt es irgendwo eine Zusammenfassung was man alles definieren muss das man die coolen Auswertungen bekommt oder muss ich mich hier komplett durchkämpfen?

Gruß
Max
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 13 Januar 2024, 22:55:01
Zitat von: MadMax am 13 Januar 2024, 21:28:55Hallo,

Coole Sache, gibt es irgendwo eine Zusammenfassung was man alles definieren muss das man die coolen Auswertungen bekommt oder muss ich mich hier komplett durchkämpfen?

Gruß
Max
Hallo Max,
ich werde nächste Woche wohl nochmal meine beiden Devices hier einstellen, am WE schaff ich das nicht mehr.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 13 Januar 2024, 22:58:41
Das kann man im DOIF Perl-Modus etwas eleganter definieren:

defmod di_starup DOIF init { ## Startup Befehle\
      Log(0, "▶️ di_Startup startet");;\
      fhem_set"Tibber.ws start";;\
      Log(0, "🏁 di_Startup beendet");;\
     }

Hier kommt man ohne zusätzliche Attribute aus und es ist reiner Perlcode.

siehe dazu: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#init-Block
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 13 Januar 2024, 23:00:21
Zitat von: Damian am 13 Januar 2024, 22:58:41Das kann man im DOIF Perl-Modus etwas eleganter definieren:

< snip >

Hier kommt man ohne zusätzliche Attribute und es ist reiner Perlcode.

siehe dazu: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#init-Block
Super,
das bau ich dann auch sofort mit ein...

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 13 Januar 2024, 23:05:16
Zitat von: ch.eick am 13 Januar 2024, 23:00:21
Zitat von: Damian am 13 Januar 2024, 22:58:41Das kann man im DOIF Perl-Modus etwas eleganter definieren:

< snip >

Hier kommt man ohne zusätzliche Attribute und es ist reiner Perlcode.

siehe dazu: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#init-Block
Super,
das bau ich dann auch sofort mit ein...

VG   Christian

Achtung, es waren noch zu viel Klammern drin, ich habe es gerade korrigiert.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 07:49:48
Zitat von: ch.eick am 13 Januar 2024, 22:55:01
Zitat von: MadMax am 13 Januar 2024, 21:28:55Hallo,

Coole Sache, gibt es irgendwo eine Zusammenfassung was man alles definieren muss das man die coolen Auswertungen bekommt oder muss ich mich hier komplett durchkämpfen?

Gruß
Max
Hallo Max,
ich werde nächste Woche wohl nochmal meine beiden Devices hier einstellen, am WE schaff ich das nicht mehr.

VG   Christian

Hallo Christian,

ich habe deine beiden Devices in einem älteren Post gefunden aber mir werden Preise von 111c und so angezeigt, das kann ja nicht passen oder?

Gruß
Max
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 14 Januar 2024, 10:29:42
Wenn alles zusammengefasst ist, dann wäre das was fürs wiki oder zumindest für Codeschnipsel, damit Interessierte nicht die ganze Vorgeschichte hier lesen müssen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 18:57:41
Zitat von: MadMax am 14 Januar 2024, 07:49:48ich habe deine beiden Devices in einem älteren Post gefunden aber mir werden Preise von 111c und so angezeigt, das kann ja nicht passen oder?
Hallo Max,
hast Du den auch Dein Token und Deine homeID eingetragen? Im Beispiel Device ist die Demo von Tibber eingetragen und die arbeitet in Schwedischen Kronen :-)

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 19:06:21
Nein, wo muss ich mich denn anmelden?

Ich Mächte das nur mal vergleichen und schauen ob es sich lohnt.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 19:12:16
Zitat von: MadMax am 14 Januar 2024, 19:06:21Nein, wo muss ich mich denn anmelden?
Schau mal bitte im comment des EVU_Tibber_connect, da sollte etwas dazu stehen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 19:16:27
Ja den Demo Token habe ich verwendet.
Ich möchte mir das nur mal Simulieren und nicht gleich Kunde werden.
Im Comment steht ja nur steht aber nicht wie ich einen eigenen Token bekomme.

Gruß
Max
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 19:19:58
Zitat von: MadMax am 14 Januar 2024, 19:16:27Ja den Demo Token habe ich verwendet.
Ich möchte mir das nur mal Simulieren und nicht gleich Kunde werden.
Im Comment steht ja nur steht aber nicht wie ich einen eigenen Token bekomme.
So hatte ich das auch mal vor, wurde jedoch von Tibber ziemlich enttäuscht, da man die aktuellen Preise nur bekommt, wenn man Kunde ist. Dann bekommt man sein eigenes Token und eine homeID :-(
Somit kannst Du nur die Demo Keys verwenden und die sind in Schwedischen Kronen mit simmulierten Daten, das taucht nur um einen Verbindungstest zu machen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 19:21:53
Also bist du Kunde?
Klappt das und bist du soweit zufrieden?
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 19:28:20
Zitat von: MadMax am 14 Januar 2024, 19:21:53Also bist du Kunde?
Klappt das und bist du soweit zufrieden?
:-) ich bin kein Kunde, habe aber von einem Gönner einen Zugang zum Testen.
Bei mir lohnt sich Tibber nicht, da ich nur 2600 kWh/Jahr zukaufe, wo die LWP, E-Auto und das Heizen der Mietwohnung bereits mit drin sind. Ich teste bereits über ein Jahr und kann meine Geräte sehr präziese in die niedrig Preise von Tibber legen, trotzdem schaffe ich maximal eine 0€ Runde wegen der hohen Grundgebühren. Mein EVU ist momentan anscheinend unschlagbar mit 24 ct/kWh :-) Ich bin aber immer gerne vorbereitet und hatte schon bei aWATTar spaß an der Möglichkeit, bei was wäre wenn.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 19:35:04
Ich denke bei mir wird es ähnlich sein ich brauche auch nur noch 2500kWh im Jahr.
Ich habe jetzt mal den Wechselkurs hinterlegt und schaue mir das mal an.

Die Wallbox und die WP kann man ja etwas beeinflussen ;)

Danke.

Gruß
Max
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 20:12:15
Zitat von: MadMax am 14 Januar 2024, 19:35:04Ich denke bei mir wird es ähnlich sein ich brauche auch nur noch 2500kWh im Jahr.
Ich habe jetzt mal den Wechselkurs hinterlegt und schaue mir das mal an.
Ich denke das wird nichts, die Preise könnten auch generiert sein :-)
{"data":{"viewer":{"home":{"currentSubscription":{"priceInfo":{"current":{"total":0.2688,"startsAt":"2024-01-14T20:00:00.000+01:00"},"today":[{"total":0.2486,"startsAt":"2024-01-14T00:00:00.000+01:00"},{"total":0.2464,"startsAt":"2024-01-14T01:00:00.000+01:00"},{"total":0.2473,"startsAt":"2024-01-14T02:00:00.000+01:00"},{"total":0.2486,"startsAt":"2024-01-14T03:00:00.000+01:00"},{"total":0.2494,"startsAt":"2024-01-14T04:00:00.000+01:00"},{"total":0.25,"startsAt":"2024-01-14T05:00:00.000+01:00"},{"total":0.2525,"startsAt":"2024-01-14T06:00:00.000+01:00"},{"total":0.2577,"startsAt":"2024-01-14T07:00:00.000+01:00"},{"total":0.2638,"startsAt":"2024-01-14T08:00:00.000+01:00"},{"total":0.269,"startsAt":"2024-01-14T09:00:00.000+01:00"},{"total":0.2684,"startsAt":"2024-01-14T10:00:00.000+01:00"},{"total":0.2698,"startsAt":"2024-01-14T11:00:00.000+01:00"},{"total":0.2681,"startsAt":"2024-01-14T12:00:00.000+01:00"},{"total":0.2641,"startsAt":"2024-01-14T13:00:00.000+01:00"},{"total":0.2666,"startsAt":"2024-01-14T14:00:00.000+01:00"},{"total":0.2704,"startsAt":"2024-01-14T15:00:00.000+01:00"},{"total":0.2755,"startsAt":"2024-01-14T16:00:00.000+01:00"},{"total":0.2818,"startsAt":"2024-01-14T17:00:00.000+01:00"},{"total":0.2878,"startsAt":"2024-01-14T18:00:00.000+01:00"},{"total":0.2782,"startsAt":"2024-01-14T19:00:00.000+01:00"},{"total":0.2688,"startsAt":"2024-01-14T20:00:00.000+01:00"},{"total":0.266,"startsAt":"2024-01-14T21:00:00.000+01:00"},{"total":0.2622,"startsAt":"2024-01-14T22:00:00.000+01:00"},{"total":0.2524,"startsAt":"2024-01-14T23:00:00.000+01:00"}],"tomorrow":[{"total":0.2532,"startsAt":"2024-01-15T00:00:00.000+01:00"},{"total":0.2498,"startsAt":"2024-01-15T01:00:00.000+01:00"},{"total":0.2485,"startsAt":"2024-01-15T02:00:00.000+01:00"},{"total":0.2463,"startsAt":"2024-01-15T03:00:00.000+01:00"},{"total":0.2463,"startsAt":"2024-01-15T04:00:00.000+01:00"},{"total":0.2549,"startsAt":"2024-01-15T05:00:00.000+01:00"},{"total":0.2676,"startsAt":"2024-01-15T06:00:00.000+01:00"},{"total":0.2722,"startsAt":"2024-01-15T07:00:00.000+01:00"},{"total":0.2906,"startsAt":"2024-01-15T08:00:00.000+01:00"},{"total":0.2918,"startsAt":"2024-01-15T09:00:00.000+01:00"},{"total":0.2854,"startsAt":"2024-01-15T10:00:00.000+01:00"},{"total":0.2799,"startsAt":"2024-01-15T11:00:00.000+01:00"},{"total":0.2722,"startsAt":"2024-01-15T12:00:00.000+01:00"},{"total":0.2702,"startsAt":"2024-01-15T13:00:00.000+01:00"},{"total":0.273,"startsAt":"2024-01-15T14:00:00.000+01:00"},{"total":0.2789,"startsAt":"2024-01-15T15:00:00.000+01:00"},{"total":0.2885,"startsAt":"2024-01-15T16:00:00.000+01:00"},{"total":0.2991,"startsAt":"2024-01-15T17:00:00.000+01:00"},{"total":0.3067,"startsAt":"2024-01-15T18:00:00.000+01:00"},{"total":0.3038,"startsAt":"2024-01-15T19:00:00.000+01:00"},{"total":0.2943,"startsAt":"2024-01-15T20:00:00.000+01:00"},{"total":0.2817,"startsAt":"2024-01-15T21:00:00.000+01:00"},{"total":0.2789,"startsAt":"2024-01-15T22:00:00.000+01:00"},{"total":0.2753,"startsAt":"2024-01-15T23:00:00.000+01:00"}]}}}}}}
Hier mal ein Beispiel von heute.
fc_avg 26.92
fc_max 30.67
fc_med 26.89
fc_min 24.63     <<< das min ist schon echt gut, wenn man die letzten Wochen anschaut
fc_trigger_price 25.8

ZitatDie Wallbox und die WP kann man ja etwas beeinflussen ;)
Ich könnte den Speicher variabel laden und mein Nachbar lädt sein Auto auch bei mir. Dann kommt noch der Wirlpool dazu und selbst das alles reicht nicht um die Grundgebühr, die ja 12 Monate anfällt wieder raus zu bekommen, wenn man eine PV-Anlage hat.

Lohnen wird sich das ohne PV-Anlage, wenn man strikt nach Tibber steuert.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: MadMax am 14 Januar 2024, 20:36:07
Ja das denke ich auch.

Die Grundgebühr zahle ich 12 Montate und brauche das ganze aber nur 3-4 Monate...
Für die Grundgebühr kann man einiges an Strom kaufen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 14 Januar 2024, 22:10:16
Hallo zusammen,
könnte mir mal jemand Tibber Preise, so ab 2023-01-01 aus dem Raum 64xxx schicken? Ich würde liebend gerne mal meine SQL SELECT Kenntnisse ausprobieren und mit echten Daten Spielen.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 15 Januar 2024, 17:28:35
Hallo zusammen,
hier mal der Zwischenstand von heute.
Es gibt zwei Devices EVU_Tibber_connect und EVU_Tibber
- EVU_Tibber_connect
  - Ist ein HTTPMOD und fragt diverse Informationen ab
  - Über das userReadings ist liveMessurment im HTTPMOD mit WebSocket integriert
    - Die readings habe ich vom Namen her mit ws_* verändert
    - ws_wert dient dem Starten/Stoppen des WebSocket und wurde beim Wert auf connected/disconnected
      verändert, wodurch es im EVU_Tibber uiTable klarer zu verstehen ist
  - Die Visualisierung geschieht über das EVU_Tibber mit uiTable
- EVU_Tibber
  - Ermöglicht die Bedienung von EVU_Tibber_connect mit Drop Down Menü
  - Mit einem Button wird der Zustand des WebSocket angezeigt und ist auch bedienbar
  - Über die init() Funktion wird der WebSocket vom EVU_Tibber_connect beim Start von FHEM direkt mitgestartet
  - Die Preis von fc0 und fc1 werden in Diagrammen angezeigt
  - Aktuelle Statistiken werden als Zahlenwert angezeigt
  - Das Triggerfenster für fc0 und fc1 wird angezeigt
  - Im Bereich der Statistiken werden die liveMessurment Werte angezeigt sowie Tages/Monats/Jahres Werte
Screenshot 2024-01-15 161103.png
Ich denke, den Stand werde ich dann in den nächsten Tagen ins Wiki stellen.
Bei meinen zu steuernden Geräten habe ich dann noch im FHEMWEB solche Blöcke im uiTable, damit man die Geräte separat auf den Tibber Trigger reagieren lassen kann.
Hier wäre der Block für die Speicher Steuerung, um dann auch die Ladestärke konfigurieren zu können.
Screenshot 2024-01-15 182556.png

Solltet Ihr noch Ideen haben, wäre jetzt der richtige Zeitpunkt es zu äußern.
- Denkbar wären jetzt natürlich auch noch Statistiken aus der Datenbank mit Vortag/Vormonat/letztes Jahr

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 15 Januar 2024, 20:54:16
Zitat von: MadMax am 14 Januar 2024, 19:21:53Also bist du Kunde?
Klappt das und bist du soweit zufrieden?

Ich bin seit Mai Tibber-Kunde und habe mir gerade meine monatlichen Rechnungen bei Tibber Juni bis November angeschaut. Wir haben einen dynamischen Tarif, eine PV-Anlage, keinen Speicher. Die PV Anlage ist eher kontraproduktiv. Unser jährlicher Bezug lag bisher bei ca. 2200 kWh.

Die vertrauenswürdigen Anbieter für unsere Region liegen z. Zt. über 30 Cent/kWh, daher kann ich mich über die bisherigen Rechnungen von Tibber nicht beklagen.

So sahen die monatlichen Stromkosten bei uns aus:
Screenshot 2024-01-15 204415.png
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horizon am 18 Januar 2024, 15:01:15
Zitat von: ch.eick am 15 Januar 2024, 17:28:35Solltet Ihr noch Ideen haben, wäre jetzt der richtige Zeitpunkt es zu äußern.

Hallo Christian,
kann man mit deinen Devices Entladesperrzeiten für den Speicher automatisch setzen?

Ich bin seit 01.01.2024 Tibber-Kunde und versuche den Strombezug zu optimieren. In der Nacht rechnet FHEM bei mir aus dem Stromverbrauch des vorherigen Tages und dem zu erwartenden Solar-Ertrag des aktuellen Tages einen prognostizierten Stromverbrauch aus. Aus dem prognostizierten Strombedarf wird die Länge des Ladezeitraums berechnet und das günstigste Zeitfenster zwischen 0 und 7 Uhr bestimmt. Zur Startzeit des Ladezeitfensters lädt der Speicher auf 80% des prognostizierten Strombedarfs. Auf die Kosten für diese Ladung rechne ich 15% Verlust drauf und erhalte dann den Preis, den der Strom aus dem Speicher kostet. So lange der Tibber-Preis günstiger ist, wie der Preis des gespeicherten Stroms, wird eine Entladesperre für den Speicher gesetzt.

Mit der Automatisierung dieses Vorgangs hapert es aktuell noch und ich muss ständig manuell eingreifen. Ich weiß noch nicht, bei welchem kWh-Preis ich im Durchschnitt am Ende des Monats landen werde, aber es sieht aktuell danach aus, dass Tibber teurer sein wird, wie andere Anbieter. Die günstigeren Preise der anderen Anbieter kommen allerdings nur durch einen Durchschnittspreis über das ganze Jahr zustande, d.h. als Solaranlagenbetreiber profitiert man davon, dass andere Kunden im Sommer zu viel zahlen. Meine Tibber-Bilanz wird zusätzlich noch dadurch verhagelt, dass die Stromnebenkosten am 01.01.2024 unerwartet um 5 Cent pro kWh gestiegen sind.

Ich tendiere dazu das Experiment demnächst abzubrechen und wieder zu einem Anbieter mit fixen Preisen zu wechseln, weil der Aufwand deutlich zu hoch ist. Es ist schade, weil ich Tibber für ein faires Angebot halte.

Grüße,
Oli
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 18 Januar 2024, 22:16:05
Zitat von: horizon am 18 Januar 2024, 15:01:15
Zitat von: ch.eick am 15 Januar 2024, 17:28:35Solltet Ihr noch Ideen haben, wäre jetzt der richtige Zeitpunkt es zu äußern.

Hallo Christian,
kann man mit deinen Devices Entladesperrzeiten für den Speicher automatisch setzen?
Hallo Oli,
Das hat nicht wirklich was mit Tibber zu tun.
Ich hatte nur auch schon überlegt,  ob ich auch ein Maximum Fenster berechne, was man dann auch für das Entladen des Speichers verwenden könnte. Die Zeiten könnten dann ja als Sperrzeiten verwendet werden.

In einem DOIF lassen sich die Zeiten in den readings direkt als Timer setzen.

VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 19 Januar 2024, 20:52:06
Zitat von: ch.eick am 18 Januar 2024, 22:16:05Hallo Oli,
Ich hatte nur auch schon überlegt, ob ich auch ein Maximum Fenster berechne, was man dann auch für das Entladen des Speichers verwenden könnte. Die Zeiten könnten dann ja als Sperrzeiten verwendet werden.

In einem DOIF lassen sich die Zeiten in den readings direkt als Timer setzen.
Hallo Oli,
ich habe da mal was zum Testen.
Diese Code Blöcke kommen zusätzlich ins userReadings. Bei mir habe ich die vor "total_cost_day:nodes_TIMESTAMP.* {" eingesetzt.
fc_trigger_max:fc_avg.* {
  my $fc_avg = ReadingsVal("$NAME","fc_avg",0);
  my $fc_max = ReadingsVal("$NAME","fc_max",0);

  # Berechnung eines Schwellwertes als täglichen Maximalpreises
  my $price_level = round( ($fc_max - $fc_avg)/2 + $fc_avg , 0);
 
$price_level;
},

fc0_trigger_max_start:fc_trigger_max.* {
  my $fc_trigger_max = ReadingsVal("$NAME","fc_trigger_max",0) /100;

  # Ermitteln des nächsten Trigger_max Fensters
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;
  my $fc_total = 0;

    for (my $loop_hour = $hour; $loop_hour <= 23; $loop_hour++) {
      $fc_total = ReadingsVal("$NAME","fc0_".sprintf("%02d",$loop_hour)."_total",0);
      if ( $fc_total > $fc_trigger_max ) {
        return(sprintf("%02d:00",$loop_hour)) ;
      }
    } # end  for loop_hour

  return("null");
},

fc0_trigger_max_stop:fc0_trigger_max_start.* {
  my $fc = 0;
  my $loop_hour = 0;
  my $fc_trigger_max = ReadingsVal("$NAME","fc_trigger_max",0) /100;

  # Ermitteln des nächsten Trigger Fensters
  my $fc_trigger_max_start = ReadingsVal("$NAME","fc0_trigger_max_start","null");
  my $fc_trigger_max_stop = $fc_trigger_max_start;

  if ( $fc_trigger_max_start ne "null" ) {
    $fc_trigger_max_start =~ /(\d\d):/; $fc_trigger_max_start = $1 ;
    my $fc_total = 0;

    for ($loop_hour = $fc_trigger_max_start; $loop_hour <= 23; $loop_hour++) {
      $fc_total = ReadingsVal("$NAME","fc".$fc."_".sprintf("%02d",$loop_hour)."_total",0);
      if ( $fc_total > $fc_trigger_max ) {
        $fc_trigger_max_stop = sprintf("%02d:00",$loop_hour) ;
      } else {
        return(sprintf("%02d:00",$loop_hour));
      }

     # wechsel zum nächsten Tag
     if ( $loop_hour == 23 and $fc == 0 ) {
       $fc = 1;
       $loop_hour = -1;
     }

    } # end for loop_hour
  }
 
  return($fc_trigger_max_stop);
},

fc0_trigger_max:fc0_trigger_max_stop.* {

  # Setzen des maximum Triggers für die aktuelle Stunde
  if ( ReadingsVal("$NAME","current_price",0)  > ReadingsVal("$NAME","fc_trigger_max",0) ) {
    return("on")
  } else {
    return("off")
  }
},

fc1_trigger_max_start:fc_trigger_max.* {
  if (ReadingsVal("$NAME","fc1_00_startsAt","null") ne "null") {
    my $fc_trigger_max = ReadingsVal("$NAME","fc_trigger_max",0) /100;

    # Ermitteln des nächsten Trigger Fensters
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;
    my $fc_total = 0;

    for (my $loop_hour = 0; $loop_hour <= 23; $loop_hour++) {
      $fc_total = ReadingsVal("$NAME","fc1_".sprintf("%02d",$loop_hour)."_total",0);
      if ( $fc_total > $fc_trigger_max ) {
        return(sprintf("%02d:00",$loop_hour)) ;
      }
    } # end  for loop_hour
  }
  return("null");
},

fc1_trigger_max_stop:fc0_trigger_max_start.* {
  my $loop_hour = 0;
  my $fc_trigger_max = ReadingsVal("$NAME","fc_trigger_max",0) /100;

  # Ermitteln des nächsten Trigger Fensters
  my $fc_trigger_max_start = ReadingsVal("$NAME","fc1_trigger_max_start","null");
  my $fc_trigger_max_stop = $fc_trigger_max_start;

  if ( $fc_trigger_max_start ne "null" ) {
    $fc_trigger_max_start =~ /(\d\d):/; $fc_trigger_max_start = $1 ;
    my $fc_total = 0;

    for ($loop_hour = $fc_trigger_max_start; $loop_hour <= 23; $loop_hour++) {
      $fc_total = ReadingsVal("$NAME","fc1_".sprintf("%02d",$loop_hour)."_total",0);
      if ( $fc_total > $fc_trigger_max ) {
        $fc_trigger_max_stop = sprintf("%02d:00",$loop_hour) ;
      } else {
        return(sprintf("%02d:00",$loop_hour));
      }

    } # end for loop_hour
  }
 
  return($fc_trigger_max_stop);
},

Nach dem Abrufen 02_priceAll sollten dann weitere readings erscheinen, die ein Maximum Zeitfenster angeben und auch einen Trigger liefern.
Hier mal ein Beispiel von jetzt
# Für fc0 ist das Maximum bereits vorbei
fc0_trigger_max off
fc0_trigger_max_start null
fc0_trigger_max_stop null

# Für fc1 wird das Maximum von 17:00 bis 20:00 (19:59) erwartet
fc1_trigger_max_start 17:00
fc1_trigger_max_stop 20:00

# Der Maximum Preis wurde ja bereits berechnet und dazu kommt nun noch ein Schwellwert
fc_max 29.65
fc_trigger_max 28

Viel Spaß beim Testen
    Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horizon am 20 Januar 2024, 10:43:58
Hallo Christian,
danke für den Code :D

Grüße,
Oli
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Torxgewinde am 20 Januar 2024, 11:44:57
Hallo,
Bei dem Dummy-Device für Tibber-Live-Readings via Websocket habe ich noch eine Timeout-Erkennung mit eingebaut und das Ganze in das Wiki gestellt: Wiki --> Websocket (https://wiki.fhem.de/wiki/Websocket)

hier auch nochmal der aktuelle Stand:
defmod Tibber.ws dummy
attr Tibber.ws userattr websocketURL homeId token myId minInterval
attr Tibber.ws alias Tibber Websocket
attr Tibber.ws event-on-change-reading .*
attr Tibber.ws eventMap /cmd connect:start/cmd disconnect:stop/
attr Tibber.ws homeId 96a14971-525a-4420-aae9-e5aedaa129ff
attr Tibber.ws icon hue_filled_plug
attr Tibber.ws minInterval 30
attr Tibber.ws myId TorxgewindeID
attr Tibber.ws readingList cmd
attr Tibber.ws setList cmd
attr Tibber.ws stateFormat payload_data_liveMeasurement_accumulatedCost payload_data_liveMeasurement_currency (payload_data_liveMeasurement_power W, Import: payload_data_liveMeasurement_accumulatedConsumption kWh, Export: payload_data_liveMeasurement_accumulatedProduction kWh)
attr Tibber.ws token 5K4MVS-OjfWhK_4yrjOlFe1F6kJXPVf7eQYggo8ebAE
attr Tibber.ws userReadings connect:cmd:.connect {\
my $hash = $defs{$name};;\
my $devState = DevIo_IsOpen($hash);;\
return "Device already open" if (defined($devState));;\
\
# establish connection to websocket\
# format must also include portnumber if a path is to be specified\
$hash->{DeviceName} = AttrVal($name, "websocketURL", "wss:echo.websocket.org:443");;\
\
# special headers needed for Tibber, see also Developer Tools in Browser\
$hash->{header}{'Sec-WebSocket-Protocol'} = 'graphql-transport-ws';;\
$hash->{header}{'Host'} = 'websocket-api.tibber.com';;\
$hash->{header}{'Origin'} = 'https://developer.tibber.com';;\
\
# callback function when "select()" signals data for us\
# websocket Ping/Pongs are treated in DevIo but still call this function\
$hash->{directReadFn} = sub () {\
my $hash = $defs{$name};;\
\
# we can read without closing the DevIo, because select() signalled data\
my $buf = DevIo_SimpleRead($hash);;\
\
# if read fails, close device\
if(!defined($buf)) {\
DevIo_CloseDev($hash);;\
$buf = "not_connected";;\
}\
\
#Log(3, "$name:$reading: websocket data: >>>$buf<<<");;\
\
# only update our reading if buffer is not empty and if last update is older than minInterval\
if ($buf ne "") {\
my $websocketDataAge = ReadingsAge($name, "websocketData", 3600);;\
my $minInterval = AttrVal($name, "minInterval", 0);;\
my $isNext = ($buf =~ /.*id.*type.*next.*payload.*data.*liveMeasurement.*/s);;\
\
readingsBeginUpdate($hash);;\
readingsBulkUpdate($hash, "websocketData", "$buf") if ($isNext && $websocketDataAge > $minInterval);;\
readingsBulkUpdate($hash, "websocketData", "$buf") if (!$isNext);;\
readingsEndUpdate($hash, 1);;\
}\
};;\
\
# open DevIo websocket\
DevIo_OpenDev($hash, 0, undef, sub(){\
my ($hash, $error) = @_;;\
return "$error" if ($error);;\
\
my $token = AttrVal($name, "token", "???");;\
\
DevIo_SimpleWrite($hash, '{"type":"connection_init","payload":{"token":"'.$token.'"}}', 2);;\
});;\
readingsBulkUpdate($hash, "websocketData", "");;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
disconnect:cmd:.disconnect {\
my $hash = $defs{$name};;\
RemoveInternalTimer($hash);;\
DevIo_SimpleRead($hash);;\
DevIo_CloseDev($hash);;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onDisconnect {\
my $myState = ReadingsVal($name, "state", "???");;\
my $myData = ReadingsVal($name, "websocketData", "???");;\
return if ($myState ne "disconnected" and $myData ne "not_connected");;\
\
## timer callback function, called after a few seconds to initiate a reconnect\
my $timerFunction = sub() {\
my ($arg) = @_;;\
my $hash = $defs{$name};;\
my $devState = DevIo_IsOpen($hash);;\
\
# only re-connect if device is not connected\
readingsSingleUpdate($hash, "cmd", "connect", 1) if (!defined($devState));;\
};;\
RemoveInternalTimer($name.$reading.'Timer');;\
\
# wait a random time before reconnect (exponential backoff TBD):\
my $rwait = int(rand(200)) + 30;;\
InternalTimer(gettimeofday() + $rwait, $timerFunction, $name.$reading.'Timer');;\
\
#set cmd to a new value, informs user and allows to retrigger when timer expires\
my $hash = $defs{$name};;\
readingsBulkUpdate($hash, "cmd", "reconnect attempt in $rwait seconds");;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onTimeout:websocketData:.* {\
#re-establish websocket connection if no data received in the past ten minutes\
#but only if our reading "cmd" was not set to the value "disconnect"\
\
#timeout in seconds when the connection is considered dead\
my $timeoutTime = 600;;\
\
# function to execute when timeout expired\
# defining the function here in the userReading, allows us to insert variables directly\
my $timerFunction = sub() {\
my ($arg) = @_;;\
my $hash = $defs{$name};;\
my $rCmd = ReadingsVal($name, "cmd", "???");;\
my $age  = ReadingsAge($name, "websocketData", 0);;\
\
Log(3, "$name: onTimeoutTimer triggered >>$arg<<");;\
\
#do not do anything further if disconnect is on purpose\
if ( $rCmd eq "disconnect" ) {\
Log(3, "$name: cmd was set to disconnect");;\
return;;\
}\
\
# for whatever reason, we triggered to soon (80%)\
if ( $age < $timeoutTime*0.8 ) {\
Log(3, "$name: websocketData is not outdated");;\
return;;\
}\
\
DevIo_CloseDev($hash);;\
Log(3, "$name: onTimeoutTimer closed DevIo...");;\
\
readingsSingleUpdate($hash, "cmd", "connect", 1);;\
Log(3, "$name: onTimeoutTimer set cmd to value 'connect'");;\
};;\
\
#remove/cancel previous timers, because we got fresh data and countdown starts again\
RemoveInternalTimer($name.$reading.'Timer');;\
\
#set timer to expire and execute function defined above, give special arg as identifier\
InternalTimer(gettimeofday() + $timeoutTime, $timerFunction, $name.$reading.'Timer');;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onConnectionAck:websocketData:.*connection_ack.* {\
#websocketData contains the string "connection_ack"\
Log(3, "$name:$reading: got connection ack");;\
\
# do not proceed if connection is lost\
my $hash = $defs{$name};;\
my $devState = DevIo_IsOpen($hash);;\
return "Device not open" if (!defined($devState));;\
\
readingsBulkUpdate($hash, "cmd", "got connection ack");;\
\
my $homeId = AttrVal($name, "homeId", "???");;\
my $myId = AttrVal($name, "myId", "???");;\
\
# build the query, do it in pieces, the comma at the end caused perl errors\
# so we put it together in this not very elegant way\
my $json = '{ "id":"'. $myId .'", "type":"subscribe"'.", ";;\
$json .= '"payload":{';;\
$json .= '"variables":{}'.", ";;\
$json .= '"extensions":{}'.", ";;\
$json .= '"query":"subscription { liveMeasurement( homeId: \"'.$homeId.'\" ) ';;\
#$json .= '{ timestamp power accumulatedConsumption accumulatedCost currency minPower averagePower maxPower signalStrength }}"';;\
$json .= '{ timestamp power lastMeterConsumption accumulatedConsumption accumulatedProduction ';;\
$json .= 'accumulatedProductionLastHour accumulatedCost accumulatedReward currency minPower averagePower maxPower ';;\
$json .= 'powerProduction powerReactive powerProductionReactive minPowerProduction maxPowerProduction lastMeterProduction ';;\
$json .= 'powerFactor voltagePhase1 voltagePhase2 voltagePhase3 signalStrength }}"';;\
$json .= '}}';;\
\
#send the string via websocket as ASCII\
Log(3, "$name:$reading: sending JSON: >>>$json<<<");;\
DevIo_SimpleWrite($hash, $json, 2);;\
\
return POSIX::strftime("%H:%M:%S",localtime(time()));;\
},\
onNextLiveMeasurement:websocketData:.*next.*payload.*data.*liveMeasurement.* {\
#websocketData contains next-live-measurement-data\
my $val = ReadingsVal($name, "websocketData", "{}");;\
my %res = %{json2nameValue($val, undef, undef, "payload_data_liveMeasurement.*")};;\
\
my $ret = "got values for:\n";;\
foreach my $k (sort keys %res) {\
$ret .= "$k\n";;\
readingsBulkUpdate($hash, makeReadingName($k), $res{$k});;\
}\
return $ret;;\
}
attr Tibber.ws webCmd start:stop
attr Tibber.ws websocketURL wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 20 Januar 2024, 18:05:49
Zitat von: Torxgewinde am 20 Januar 2024, 11:44:57Bei dem Dummy-Device für Tibber-Live-Readings via Websocket habe ich noch eine Timeout-Erkennung mit eingebaut
Okay,
ich habe das in meine HTTPMOD Version ebenfalls mit aufgenommen, muss jetzt aber leider nochmal etwas testen.
Die zusammengefassten Devices kommen dann hoffendlich diese Woche noch.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 22 Januar 2024, 10:28:46
Ich habe mir aus den EVU_Tibber_connect readings noch ein wenig Statistik gebaut.

Um einmal festzustellen, ob tibber nun wirtschaftlicher ist als andere EVU habe ich mir ein:
Tibber_price_avg_month und Tibber_price_avg_year erstellt.
Einfach total_cost_year / nodes_consumption_year und _month entsprechend.

Bei mir kommt aktuell 0.29 ct/kWh heraus, was inkl. der Gebühren knapp günstiger bzw. im Bereich günstiger EVU sein dürfte. Aber das wird sich ja noch ändern, wenn die eigentlichen Börsentarife noch sinken bzw. ich Verbraucher in günstigere Zeiten legen kann..

Ich habe einige devices, für die ich mit dem Modul ElectricityCalculator eine Statistik erstelle. Für die readings EnergyCostYear/EnergyCostMonth/EnergyCostDay wird das Attribut EnergyPricePerKWh verwendet.
Da sich dieser ja bei tibber stündlich verändert, kann ich nun mit einem täglichen {fhem(attr <device> ElectricityPricePerKWh <Tibber_price_avg_year>} den EnergyPricePerKWh  setzen lassen.

Da ich aber auch eine PV-Anlage (ohne Speicher) habe, stimmt ja der Preis nur wenn eben ausschließlich Bezug über tibber erfolgt. Da es aber ja das SW_Statistic_EnergyHomePv_Year gibt, habe ich mir ein EnergyPricePerKWh aus (SW_Statistic_EnergyHomePv_year * Einspeisevergütung + total_cost_year) / (nodes_consumption_year + SW_Statistic_EnergyHomePv_Year) gebaut.

So komme ich hinreichend genau auf den EnergyPricePerKWh von aktuell 0.20 ct/kWh.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 22 Januar 2024, 19:41:48
Sooo,
ich habe dann jetzt mal ein Wiki angelegt. (https://wiki.fhem.de/wiki/Stromb%C3%B6rse)

Update 20240123
  Ich habe auch noch aWATTar im Wiki abgelegt und das EVU_aWATTar_connect vergleichbar aufgebaut.
  Das soll nun noch weiter entwickelt werden, da man von Tibber ja nur als Kunde die wirklichen Preise bekommt.
  Im bisherigen Stand werden die Börsen Preise4 bereits in der DbLog abgelegt, jedoch fehlen noch die Fixkosten.


VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 25 Januar 2024, 17:16:06
Moin,
ich habe gerade mal den fc0_trigger_max mit ins Grafana Diagramm eingezeichnet, der ist heute von 16:00-19:00 Uhr im EVU_Tibber_connect Device angegeben.
Zu der Zeit müsste man den Speicher dann noch voll haben :-)
Der normale fc0_trigger ist der gelbe.
Screenshot 2024-01-25 171058.png

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 27 Januar 2024, 10:17:40
Moin zusammen,
bei Tibber scheint es wohl ein Problem mit der Berechnung der consumption zu geben, ich denke die sind etwas in Verzug.
Mit "get EVU_Tibber_connect [03_|04_|05_]consumption.* " könnt Ihr die Lücken dann schließen, sobald Tibber mit den Berechnungen fertig ist. Mit get 05_consumption_hourly_100 kommt Ihr ca 4 Tage zurück, also 100 / 24 = 4,16 Tage.
Es ginge auch noch mehr, falls Ihr mal den Zeitpunkt verpasst habt es nachzuladen.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 27 Januar 2024, 13:19:57
Zitat von: ch.eick am 27 Januar 2024, 10:17:40Es ginge auch noch mehr, falls Ihr mal den Zeitpunkt verpasst habt es nachzuladen.

VG   Christian

Ich habe mir ein atEVU_tibber_connect_last4days gebaut, der +*90:00:00 get EVU_Tibber_connect 05_consumption_hourly_100 meine Vergesslichkeit automatisiert.

Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 27 Januar 2024, 13:26:10
Zitat von: jnewton957 am 27 Januar 2024, 13:19:57
Zitat von: ch.eick am 27 Januar 2024, 10:17:40Es ginge auch noch mehr, falls Ihr mal den Zeitpunkt verpasst habt es nachzuladen.

VG   Christian
Ich habe mir ein atEVU_tibber_connect_last4days gebaut, der +*90:00:00 get EVU_Tibber_connect 05_consumption_hourly_100 meine Vergesslichkeit automatisiert.
Moin,
das würde in meinem Gedankengud dann ins EVU_Tibber Device als eigener Block gehören, damit alles zur Steuerung zusammen ist.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Prof. Dr. Peter Henning am 28 Januar 2024, 13:42:47
Ich bin kein Tibber-Kunde, aber die flexiblen Strompreise halte ich in Anbetracht der Tatsache, dass mein BEV im Zulauf ist, für hoch interessant.

Meine schicke neue WallBox hat ein aWattar-Interface eingebaut, das ich aber nicht direkt nutzen will. Sondern ich will ein Gesamtsystem zum Energiemanagement aufbauen.

Folgende Vorschläge deshalb:

1. Diesen Thread hier zumachen oder verschieben. Das ist nichts mehr für "Anfängerfragen"
2. Im Bereich "Solaranlagen" künftig alle Fragen (und Module) für Energiemanagement und Wallboxen diskutieren.
3. Im Wiki das Thema aWattar vom Thema Tibber trennen.

LG

pah
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 28 Januar 2024, 15:22:11
Zitat von: Prof. Dr. Peter Henning am 28 Januar 2024, 13:42:47Ich bin kein Tibber-Kunde, aber die flexiblen Strompreise halte ich in Anbetracht der Tatsache, dass mein BEV im Zulauf ist, für hoch interessant.

Meine schicke neue WallBox hat ein aWattar-Interface eingebaut, das ich aber nicht direkt nutzen will. Sondern ich will ein Gesamtsystem zum Energiemanagement aufbauen.

Folgende Vorschläge deshalb:

1. Diesen Thread hier zumachen oder verschieben. Das ist nichts mehr für "Anfängerfragen"
Das denke ich auch.
Zitat2. Im Bereich "Solaranlagen" künftig alle Fragen (und Module) für Energiemanagement und Wallboxen diskutieren.
Mache ich ja auch bereits so.
Zitat3. Im Wiki das Thema aWattar vom Thema Tibber trennen.
Das hatte ich gerade erst zusammen unter Strombörse angesiedelt.
Ich würde gerne jeweils ein Device für die Anbindung der EVU nach Strömbörse dort ansiedeln und versuchen es unter einem Device für die Visualisierung zu verbinden. Beim EVU_aWATTar_connect habe ich die readings an das vom EVU_Tibber_connect angeglichen und ergänzt.
aWATTar scheint jedoch wohl kaum jemand zu verwenden.

Ich verwende weder das eine noch das andere, da ich die hohen Grundkosten bei nur 2600 möglichen kWh nicht wieder raus bekomme.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Prof. Dr. Peter Henning am 28 Januar 2024, 18:51:31
Ich habe gerade eine Umbenennung der Kategorien im Forum angeregt, wart mal ein paar Stunden.

Zum Wiki: Auch da sollte es neue Kategorien geben, mache ich morgen mal. Und dann eben nicht alles in gigantisch langen Artikeln, sondern mit viel Struktur und Verlinkung.

LG

pah
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 29 Januar 2024, 11:39:54
Ich habe mich gestern nochmals mit den Werten nodes_consumption und nodes_cost beschäftigt und diese mit der Tibber-App und der Tibber-Api (detailliert auf Stundenbasis) verglichen.

good news:
nodes_consumption entspricht exakt Tibber-App und der Tibber-Api ("consumption")
nodes_cost entspricht Tibber-Api ("cost")

bad news:
nodes_cost entspricht nicht der Tibber-App und somit dann dem Rechnungsbetrag.

Ursache:
Tibber-Api: cost = unit price (excl. VAT) * consumption
Der übertragene Wert "cost" aus der Tibber-Api enthält nicht die MwSt. node_cost muss noch die MwSt addiert werden.

Mögliche weitere Ursache
Der übertragene Wert cost/node_cost aus der Tibber-Api enthält nicht die verbrauchsunabhängigen Kosten (u.a. Tibber-Monatsgebühr). Da ich noch keinen Monatsrechnung erhalten habe, kann ich dieses im Detail noch nicht mit den readings nachvollziehen.

Validierung:
Ich habe das reading 05_consumption_hourly_100 mal mit 680 Std quasi ab 1.1.24 neu laufen lassen und dann ein nodes_TIMESTAMP_MwSt mit 2050 loops jeweils nodes_cost_mwst neu in der DB erstellen lassen.
Ein darauf aufbauendes Total_cost_MwSt ergibt erfreulicherweise bis auf  4€ genau den Wert der Tibber-App. Ggf. ist dies ja genau die Tibber-Monatsgebühr.

Auch ein Total_cost_day *1,19 bzw. Total_cost_month*1,19 bringt das gleich gute Ergebnis.










Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 05 Februar 2024, 22:32:43
Könntet ihr mir helfen, wie ich in dem EVU_Tibber_connect von Christian noch ein zusätzliches Reading mit der Vorschau des Strompreises für die nächsten 3h anlegen könnte, entweder als 3 eigene Readings oder in einem Reading z.B. über Leerzeichen getrennt?
Danke, Tom
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Februar 2024, 08:39:59
Zitat von: tomhead am 05 Februar 2024, 22:32:43Könntet ihr mir helfen, wie ich in dem EVU_Tibber_connect von Christian noch ein zusätzliches Reading mit der Vorschau des Strompreises für die nächsten 3h anlegen könnte, entweder als 3 eigene Readings oder in einem Reading z.B. über Leerzeichen getrennt?
Danke, Tom
Hallo Tom,
zum EVU_Tibber_connect gehör noch das EVU_Tibber dazu. Dort wird so ziemlich alles, was von Interesse ist angezeigt.
Screenshot 2024-02-06 083904.png
Ansonsten wird ja das nächste günstige Fenster angegeben, was Du in einem DOIF als Timer verwenden solltest.
Sobald fc0_trigger_[start|stop] auf null steht gibt es kein Fenster mehr unter dem berechneten trigger Wert.
Wenn Du die Preise nochmal selber auswerten möchtest, müsstest Du im userReading einen Trigger und dann die aktuelle Stunde verwenden, um die nächsten drei Stunden in eigene readings zu kopieren. Nach meiner persönlichen Meinung ist das jedoch nicht notwendig, da Du ja in den readings bereits die Zeiten drin hast.
Für Sperrzeiten wurden auch die fc0_trigger_max_[start|stop] eingeführt, die das Maximum des Tages signalisieren.

VG  Christian

P.S.
im EVU_Tibber wird die uiTable Anzeige der nächsten drei Stunden über eine Funktion im uiTable umgesetzt. Die müsste jedoch für ein userReadings entsprechend umgesetzt werden. Achtung, auch der Tageswechsel muss berücksichtigt werden.

Price([0-3])
sub Price {
  my($i)=@_;
  my $j;
  my $value;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;

  if ($i == 0) {
    $value = ::ReadingsVal(Device(),"current_price",0);
    $value = ( ::ReadingsVal(Device(),"fc0_trigger","off") eq "on" ) ?
         "<span style='color:green'>".$value."</span>" :
         "<span style='color:red'>".$value."</span>" ;
    $value .= " ct/kWh";
  } else {
    $j       = $i+$hour;
    if ($j < 24) {
      $value = ::round(::ReadingsVal(Device(),"fc0_".sprintf("%02d",$j)."_total",0)*100,1);
    } else {
      $j = $j - 24;
      $value = ::round(::ReadingsVal(Device(),"fc1_".sprintf("%02d",$j)."_total",0)*100,1);
    }
    $value = ( ::ReadingsVal(Device(),"fc_trigger_price","0") > $value ) ?
         "<span style='color:green'>".$value."</span>" :
         "<span style='color:red'>".$value."</span>" ;
    $value = sprintf("%02d",$j)." :  ".$value ;
  }
  return  $value;
 }
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Februar 2024, 09:07:48
Moin nochmal,
um in einem Verbraucher Device auf den Tibber Trigger zu reagieren habe ich das wie folgt gemacht.

Ein Beispielblock für ein DOIF im Perl Modus
< snip >
################################################################################################################
## 12 Stromboerse
##
12_Stromboerse
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
     and
      ((   [WR_ctl:Yield_fc0_day] < [WR_1_Speicher_1_ExternControl:SpeicherMinSOC_fc1_Limit]  ## Im Herbst/Winter ist wenig zu erwarten
       and [WB_1:lp_1_PlugStat]         eq "Plugged in"   
#       and [Kia_connect:atHomeStanding] eq "true"                        ##   wenn das Auto zuhause ist

       and [$SELF:SpeicherStromboerse]  eq "Tibber"                      ## Soll Tibber verwendet werden?
       and [EVU_Tibber_connect:fc0_trigger]                              ## Wurde der Trigger geändert
       )
       or [$SELF:ui_command_4] eq "12_Stromboerse"                       ## Hier wird das uiTable select ausgewertet
      )
   ) {

    if ([?EVU_Tibber_connect:fc0_trigger] eq "on") {
      set_Reading("SpeicherTriggerLaden","An");

      fhem_set("WB_1 Lademodus SofortLaden");
      if (AttrVal("$SELF","verbose",0) >= 3)
         {Log 3, "$SELF 12_Stromboerse          : Lademodus SofortLaden"};

    } else {
      set_Reading("SpeicherTriggerLaden","Aus");

      fhem_set("WB_1 Lademodus Stop");
      if (AttrVal("$SELF","verbose",0) >= 3)
         {Log 3, "$SELF 12_Stromboerse          : Lademodus Stop"};

    }

   if (AttrVal("$SELF","verbose",0) >=3)
     {Log 3, "$SELF 12_Stromboerse          : ".[EVU_Tibber_connect:fc0_trigger]." by ".[$SELF:SpeicherStromboerse]};

   set_Reading("ui_command_4","---");                                    ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
   }
}
< snip >
Zuerst wird geprüft, wann auf Tibber reagiert werden soll, was bei mir nur im Winter oder bei schlechtem Wetter sein soll.
In diesem Fall ist es das E-Auto, was dann natürlich angesteckt sein muss, man kann es auch verschärfen, indem man das Auto fragt, wo es gerade ist. Hier wird somit noch verhindert, dass kein fremdes Auto "ausversehen" geladen würde (ist momentan auf Kommentar).
"and [$SELF:SpeicherStromboerse]  eq "Tibber"" Das ist ein uiTable Button, mit dem man Tibber aktivieren kann.
"and [EVU_Tibber_connect:fc0_trigger]" Hier wird auf jedes Event des Triggers reagiert, ob es ein on/off ist wird im Block entschieden.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Februar 2024, 09:10:03
Die EVU_Tibber Devices sind in meinem contrib/ch.eick zu finden, der Link ist im Footer.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 Februar 2024, 09:16:41
Leider scheint Tibber die Lieferung der aktuellen Kosten nodes_*_cost eingestellt zu haben, weshalb sie aktuell nicht im EVU_Tibber unter Day zu sehen sind.

EDIT:
Auch der WebSocket liefert bei mir nichts mehr zurück.
2024.02.06 09:39:35.023 3: EVU_Tibber_connect:ws_connect: websocket data: >>><<<
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 06 Februar 2024, 21:45:40
Zitat von: ch.eick am 06 Februar 2024, 08:39:59
Zitat von: tomhead am 05 Februar 2024, 22:32:43Könntet ihr mir helfen, wie ich in dem EVU_Tibber_connect von Christian noch ein zusätzliches Reading mit der Vorschau des Strompreises für die nächsten 3h anlegen könnte, entweder als 3 eigene Readings oder in einem Reading z.B. über Leerzeichen getrennt?
Danke, Tom
Hallo Tom,
zum EVU_Tibber_connect gehör noch das EVU_Tibber dazu. Dort wird so ziemlich alles, was von Interesse ist angezeigt.
Wenn Du die Preise nochmal selber auswerten möchtest, müsstest Du im userReading einen Trigger und dann die aktuelle Stunde verwenden, um die nächsten drei Stunden in eigene readings zu kopieren. Nach meiner persönlichen Meinung ist das jedoch nicht notwendig, da Du ja in den readings bereits die Zeiten drin hast.

VG  Christian
P.S.
im EVU_Tibber wird die uiTable Anzeige der nächsten drei Stunden über eine Funktion im uiTable umgesetzt. Die müsste jedoch für ein userReadings entsprechend umgesetzt werden. Achtung, auch der Tageswechsel muss berücksichtigt werden.

Hallo Christian, ich möchte das als eigene readings haben, um sie dann z.B. in FTUI anzeigen zu können.
Müsste das userReadings im EVU_Tibber_connect dann z.B. so ausschauen? (Sorry, habe leider so gar keine Ahnung von Perl)
next1_hour:current_price.* {
  my($i)=1;
  my $j;
  my $value;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;

  if ($i == 0) {
    $value = ::ReadingsVal(Device(),"current_price",0);
    $value .= " ct/kWh";
  } else {
    $j       = $i+$hour;
    if ($j < 24) {
      $value = ::round(::ReadingsVal(Device(),"fc0_".sprintf("%02d",$j)."_total",0)*100,1);
    } else {
      $j = $j - 24;
      $value = ::round(::ReadingsVal(Device(),"fc1_".sprintf("%02d",$j)."_total",0)*100,1);
    }
    $value = ( ::ReadingsVal(Device(),"fc_trigger_price","0") > $value ) ?;
    $value = sprintf("%02d",$j)." :  ".$value ;
  }
  return  $value;
 }
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 07 Februar 2024, 12:40:08
Zitat von: tomhead am 06 Februar 2024, 21:45:40
Zitat von: ch.eick am 06 Februar 2024, 08:39:59
Zitat von: tomhead am 05 Februar 2024, 22:32:43Könntet ihr mir helfen, wie ich in dem EVU_Tibber_connect von Christian noch ein zusätzliches Reading mit der Vorschau des Strompreises für die nächsten 3h anlegen könnte, entweder als 3 eigene Readings oder in einem Reading z.B. über Leerzeichen getrennt?
Danke, Tom
Hallo Tom,
zum EVU_Tibber_connect gehör noch das EVU_Tibber dazu. Dort wird so ziemlich alles, was von Interesse ist angezeigt.
Wenn Du die Preise nochmal selber auswerten möchtest, müsstest Du im userReading einen Trigger und dann die aktuelle Stunde verwenden, um die nächsten drei Stunden in eigene readings zu kopieren. Nach meiner persönlichen Meinung ist das jedoch nicht notwendig, da Du ja in den readings bereits die Zeiten drin hast.

VG  Christian
P.S.
im EVU_Tibber wird die uiTable Anzeige der nächsten drei Stunden über eine Funktion im uiTable umgesetzt. Die müsste jedoch für ein userReadings entsprechend umgesetzt werden. Achtung, auch der Tageswechsel muss berücksichtigt werden.

Hallo Christian, ich möchte das als eigene readings haben, um sie dann z.B. in FTUI anzeigen zu können.
Müsste das userReadings im EVU_Tibber_connect dann z.B. so ausschauen? (Sorry, habe leider so gar keine Ahnung von Perl)
< snip >
 }
Hallo Tom,

Ich habe es Dir dann mal etwas bereinigt, wobei es natürlich unschön ist das dann drei mal für next[1-3]_hour ins userReadings zu packen :-(
Du müstest dann $i von 1-3 jeweils ändern, ansonsten habe ich den code korrigiert und gekürzt.
next1_hour:current_price.* {
  my $i =1;
  my $j;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1 ;

    $j      = $i+$hour;
    if ($j < 24) {
      return round(ReadingsVal($NAME,"fc0_".sprintf("%02d",$j)."_total",0)*100,1);
    } else {
      $j = $j - 24;
      return round(ReadingsVal($NAME,"fc1_".sprintf("%02d",$j)."_total",0)*100,1);
    }
 }
gibt es im FTUI nicht eventuell eine Funktion, die über die aktuelle Zeit auf das richtige reading zeigen kann?
Irgend etwas, was in der 99_myUtils.pm abgelegt werden kann?
Mach doch mal hier https://forum.fhem.de/index.php?board=71.50 einen Thread auf.


VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: tomhead am 07 Februar 2024, 21:11:09
Zitat von: ch.eick am 07 Februar 2024, 12:40:08Hallo Tom,

Ich habe es Dir dann mal etwas bereinigt, wobei es natürlich unschön ist das dann drei mal für next[1-3]_hour ins userReadings zu packen :-(
Du müstest dann $i von 1-3 jeweils ändern, ansonsten habe ich den code korrigiert und gekürzt.

VG  Christian

Hi Christian, vielen vielen Dank! Ich weiß, dass das sicher nicht die eleganteste Methode ist, aber sie funktioniert erst mal. Und dann kann ich bei Gelegenheit mal schauen, ob ich das noch anders gelöst bekomme mit meinem bescheidenen Wissen über Perl und myutils ;-)
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 07 Februar 2024, 22:02:35
Zitat von: tomhead am 07 Februar 2024, 21:11:09
Zitat von: ch.eick am 07 Februar 2024, 12:40:08Hallo Tom,

Ich habe es Dir dann mal etwas bereinigt, wobei es natürlich unschön ist das dann drei mal für next[1-3]_hour ins userReadings zu packen :-(
Du müstest dann $i von 1-3 jeweils ändern, ansonsten habe ich den code korrigiert und gekürzt.

VG  Christian

Hi Christian, vielen vielen Dank! Ich weiß, dass das sicher nicht die eleganteste Methode ist, aber sie funktioniert erst mal. Und dann kann ich bei Gelegenheit mal schauen, ob ich das noch anders gelöst bekomme mit meinem bescheidenen Wissen über Perl und myutils ;-)
Wenn Du das aus der myUtils aufrufen kannst, dann kann man das recht leicht umbauen.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: jnewton957 am 17 Februar 2024, 11:28:35
Hallo,
ich habe nun meine erste Tibberrechnung erhalten und diese mit den Werten aus der EVU_Tibber_connect verglichen.

Ergebnis:
node_consumption passt sehr genau zur App und Rechnung
node_cost hat nur eine sehr geringe Abweichung (<3% geringer als Rechnung). Dies könnte aber auch an meinen vielen Anpassungen im Januar liegen und mir sind vielleicht Werte abhandengekommen.

fc0 und fc1 entsprechen den Werten der App.

Daher nochmals Danke an Christian für die Mühe und das coding.

Ich habe mir zwischenzeitlich ein paar hilfsdummies gebaut, da ich tibber auch mit anderen EVU mal vergleichen möchte.

Tibber_cost_avg_day = total_cost_day/ nodes_consumption_day
Das dann auch für month und year.

Und die Ergebnisse waren dann überraschend.

Eigentlich hätte ich erwartet, dass Tibber_cost_avg_day etwa  fc0_avg entspricht und nicht höher als fc_0_max sein darf. Ich habe eine Abweichung >10% zu fc0_avg und bin regelmäßig über fc_0_max.

Ich habe dann mal recherchiert: die forecastwerte von tibber enthalten den Arbeitspreis sowie die Nebenkosten wie Grundgebühr, Netzentgelte und Steuern. Diese natürlich herunter gebrochen auf Tag/Stunde und Schätzwert pro kWh. Aber sie sind in fc0_hr_total enthalten.

Ich habe dann mal Hilfsrechnungen vorgenommen:

fc0_hr_total x nodes_24_hr_consumption müsste ja etwa nodes_24_hr_cost entsprechen

Je nach nodes_24_hr_consumption ist meine Abweichung jedoch zwischen 5 und 10%. Das macht bei mir eben schnell 2-4 ct/kWh aus.
Ich habe noch nicht die echte Ursache bzw. einen fixen Korrekturfaktor finden können.

Letztlich nehme ich allerdings die fc0 Werte nur um eben die Tendenz teuer/preiswert abzulesen und den günstigsten Zeitpunkt für das E-Laden zu bestimmen. Für Personen, die damit aber Batterien beladen wollen oder Großverbrauchern steuern wollen, wären 10% Abweichungen schon relevant.

Ich hatte also 28,34 ct/kWh Arbeitspreis und 16,66 € Grundgebühr im Januar. Damit ist eigentlich tibber teurer als andere EVU. Letztlich macht die hohe verbrauchsunabhängige Grundgebühr bei mir tibber aktuell unwirtschaftlich.

Wie sind eure Erfahrungen mit den Werten bzw. fc0 Abweichungen ??
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hwahl am 03 März 2024, 10:12:40
Hallo,
ich bin Tibber Kunde und ein etwas fortgeschrittener FHEM Bastler. Tibber ist aktiv, aber erst ab 01.04.2024 mein Stromlieferant.

Ich hole mir meine Echtzeitdaten über die API das klappt ganz gut. Allerdings ist der gelieferte Wert für "power" immer null. Das ist sowohl bei meinem FHEM Skript so und auch im Tibber API Developer so.  In der Handy APP wird der Wert für den aktuellen power allerdings angezeigt.

Hat Tibber eventuell die Spezifikation geändert?

Gruß
Hans-Dieter
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 03 März 2024, 11:45:19
Zitat von: hwahl am 03 März 2024, 10:12:40Hallo,
ich bin Tibber Kunde und ein etwas fortgeschrittener FHEM Bastler. Tibber ist aktiv, aber erst ab 01.04.2024 mein Stromlieferant.

Ich hole mir meine Echtzeitdaten über die API das klappt ganz gut. Allerdings ist der gelieferte Wert für "power" immer null. Das ist sowohl bei meinem FHEM Skript so und auch im Tibber API Developer so.  In der Handy APP wird der Wert für den aktuellen power allerdings angezeigt.

Hat Tibber eventuell die Spezifikation geändert?

Gruß
Hans-Dieter
Hallo Hans-Dieter,
in meinem EVU_Tibber Device wird der Power Wert nach wie vor geliefert, da dieser jedoch über das Internet von Tibber kommt, vermute ich  das das erst kommen wird, wenn Du als Kunde aktiv bist.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hwahl am 03 März 2024, 17:51:56
Hallo Christian,
danke für den Hinweis. Deine Erklärung klingt plausible, ich werde mal schauen ob die aktuelle Leistung ab 01.04 übertragen wird.

Gruß
Hans-Dieter
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horchundkuck am 06 März 2024, 20:30:55
Finde die EVU_Tibber_connect Definitionen sehr hilfreich zum smarten Steuern und bin damit auch gerade am Testen und Anpassen.
Da ich SQLite nutze, mussten (und müssen teilweise noch) einige Berechnungen angepasst werden. Siehe im Thema 'DbLog mit SQLite': https://forum.fhem.de/index.php?topic=136061.msg1306013#msg1306013 (https://forum.fhem.de/index.php?topic=136061.msg1306013#msg1306013)

1. Frage
Zu fc_min und fc_max benötige die gültige Zeit, also ein Reading nach der Art '_startsAt', wie z. B. bei fc1_23_startsAt = 2024-03-07 23:00:00. Wie kann ich das umsetzen?

2. Frage
Können die Triggerzeiten 'fc1_trigger_start' u.ä. nicht wie bisher in HH:MM sondern ebenfalls im Format YYYY-MM-DD HH:MM:SS dargestellt werden?

Sonnige Grüße
Heinz
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 06 März 2024, 22:44:20
Zitat von: horchundkuck am 06 März 2024, 20:30:551. Frage
Zu fc_min und fc_max benötige die gültige Zeit, also ein Reading nach der Art '_startsAt', wie z. B. bei fc1_23_startsAt = 2024-03-07 23:00:00. Wie kann ich das umsetzen?

2. Frage
Können die Triggerzeiten 'fc1_trigger_start' u.ä. nicht wie bisher in HH:MM sondern ebenfalls im Format YYYY-MM-DD HH:MM:SS dargestellt werden?
Hallo Heinz,
Könntest Du den Anwendungsfall für 1 und 2 mal beschreiben ?

Für das Minimale und auch Maximale Fenster gibt es ja bereits Start und Stop Zeiten.
Das Datum ist impliziet im fc0 und fc1 , also heute und morgen, beinhaltet. Die Uhrzeit soll als Triggerzeit z.B. in einer DOIF Abfrage dienen. Da ist es jedoch einfacher direkt den Trigger zu verwenden.

VG Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horchundkuck am 07 März 2024, 01:07:42
Hallo Christian, Danke für deine schnelle Rückmeldung, die mir jetzt schon fast zu schnell kam. ;)
Meine 2. Frage wollte ich nämlich nach weiteren Tests zurückziehen. Aus dem Grund, den du auch genannt hast: das wäre für DOIF gar nicht nutzbar.
Ich wollte das nächste min-Fenster nutzen, egal ob fc0 oder fc1.
Ich habe das bis jetzt so verstanden: wenn fc0_trigger on ist, gibt es heute ein Fenster, bei off gibt es heute keines (mehr). Ob es dann morgen ein Fenster gibt, lässt sich mit fc1_trigger_start (ein fc1_trigger on/off gibt es nicht?) feststellen. Ein existierendes fc1 Fenster wird nach Mitternacht zum fc0 Fenster. In der Praxis sieht das bei mir aber anders aus: die Zeiten des Fensters vor und nach Mitternacht sind unterschiedlich, wie auf den Screenshots zu sehen ist.
Das Zeitfenster fc0 ist dabei korrekt. Das werde ich für mich also auch nutzen.

Anwendungsfall für 1.:
Mir reicht eigentlich die (eine) Stunde mit dem niedrigsten Strompreis als Zeitfenster aus, um sie im DOIF für Aktionen zu nutzen. Das kann ich mit dem Preisvergleich current_price/fc_min auch lösen, eine direkte Zeit wäre natürlich flexibler, z.B. +/- 1 Stunde nutzbar.

VG Heinz
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 07 März 2024, 11:03:09
Zitat von: horchundkuck am 07 März 2024, 01:07:42Ich wollte das nächste min-Fenster nutzen, egal ob fc0 oder fc1.
Ich habe das bis jetzt so verstanden: wenn fc0_trigger on ist, gibt es heute ein Fenster, bei off gibt es heute keines (mehr).
das rteading fc0_trigger ist direkt der Trigger, den Du verwenden kannst.
on bedeutet jetzt ist es im Trigger Fenster, somit bleibt der Trigger dann für die günstige Zeit auf on und geht am Ende des Fensters wieder auf off.

ZitatOb es dann morgen ein Fenster gibt, lässt sich mit fc1_trigger_start (ein fc1_trigger on/off gibt es nicht?) feststellen.
Getriggert wird immer nur mit fc0_trigger
Die start/stop Zeiten wären dann für die eigene Planung noch zusätzlich, damit man sehen kann, ob überhaupt z.B. ein Laden des Speichers möglich sein wird.

ZitatEin existierendes fc1 Fenster wird nach Mitternacht zum fc0 Fenster.
So sollte es sein, es sei denn ich habe einen Fehler eingebaut.

ZitatIn der Praxis sieht das bei mir aber anders aus: die Zeiten des Fensters vor und nach Mitternacht sind unterschiedlich, wie auf den Screenshots zu sehen ist.
Das Zeitfenster fc0 ist dabei korrekt. Das werde ich für mich also auch nutzen.
Das passiert, wenn sich die Preise in der Zwischenzeit geändert haben, da die Berechnungen immer über alle verfügbaren Zeiten geschehen.
Somit ist die fc1 Prognose mit berücksichtigt, da die Preise ja beim fc1 noch mehr fallen können. Um Mittenacht fallen dann jedoch die fc0 Preise weg und die Berechnung wird nur mit fc1 Werten, die ja dann zu fc0 geworden sind, neu erstellt. Somit kann sich dann das Trigger Fenster verändern, denn man möchte dann ja wieder das beste Fenster haben.

Das Fenster von 11:00-16:00 Uhr war natürlich am Vortag auch bereits vorhanden, jedoch wird immer nur ein Fenster pro Tag angezeigt und mit dem min Preis von fc0+fc1 erschien es von 03:00-05:00 Uhr als nächstes Fenster noch günstig. Mit der aktualisierten Berechnung von nur fc1, was zu fc0 wurde, hat sich der min Preis von 29.7 auf 29.5 gesenkt und somit auch das Fenster verschoben.

ZitatAnwendungsfall für 1.:
Mir reicht eigentlich die (eine) Stunde mit dem niedrigsten Strompreis als Zeitfenster aus, um sie im DOIF für Aktionen zu nutzen. Das kann ich mit dem Preisvergleich current_price/fc_min auch lösen, eine direkte Zeit wäre natürlich flexibler, z.B. +/- 1 Stunde nutzbar.
In den meisten Fällen benötigt man jedoch mehrere Stunden für die Geräte (E-Auto, WP, Pool), weshalb ich ein Fenster unter einem bestimmten Preis berechnet habe.
In den userReadings wäre das an dieser Stelle, wo es bereits noch die Möglichkeit für eine Wirtschaftlichkeitsberechnung zum Speicherladen gibt.
Wenn Du dort das $price_level = $fc_min setzt, bekommst nur noch das Minimum, also unter Umständen nur eine Stunde als Trigger zurück.
fc_trigger_price:fc_avg.* {
## fc_trigger_price:[fc_avg|compensation_grid].* {
  my $fc_avg = ReadingsVal("$NAME","fc_avg",0);
  my $fc_min = ReadingsVal("$NAME","fc_min",0);

  # Berechnung eines Default Schwellwertes als täglicher Niedrigpreis
  my $price_level = round( ($fc_avg - $fc_min)/2 + $fc_min , 1);            <<<< Hier wäre die bisherige Formel
 
  # Abschätzung von Wirtschaftlichkeit beim Speicher Laden, falls Tibber zu teuer wird
  if ( ReadingsVal("$NAME","compensation_grid",0) != 0 ) {
    my $price_level_battery = round( ($fc_avg - ReadingsVal("$NAME","compensation_grid",0)) *0.85 , 1) ;
    if ( $price_level > $price_level_battery ) {
      $price_level = $price_level_battery;
    }
  }
$price_level;
},

Eine weiter Variante wäre es rein reaktiv zu machen. indem Du im zu schaltenden Device jeweils current_price mit fc_min vergleichst, aber Achtung,Du musst current_price/100 rechnen, da ein reading in ct und eins in EUR angegeben ist. current_price ist in ct, da man das im EVU_Tibber als lesbar angezeigt bekommt und man den Strompreis meist in ct sehen möchte.

VG   Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horchundkuck am 08 März 2024, 00:06:24
Wow, so schön ausführlich und nachvollziehbar. Da hatte ich doch ein Verständnisproblem, nun sehe ich klarer und werde mein DOIF besser anpassen können. :) Vielen Dank!

LG Heinz
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 08 März 2024, 12:33:04
Moin,
ich weiß nicht, ob ich es vergessen habe, aber in meiner aktuellen Version habe ich fc_min, fc_max und fc_avg im userReadings mit Perl berechnet, damit einige Datenbank Aufrufe entfallen. Für den fc_med bleibt es allerdings bei der DB, falls den Wert jemand verwendet.

VG  Christian
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horchundkuck am 08 März 2024, 15:34:28
_med musste ich aus dem Reading entfernen, da ich nur SQLite installiert habe (an der Installation von mySQL oder MariaDB auf meinem rasbpi bin ich gescheitert, darum kümmere ich mich später noch einmal), auch die Summen für heute, Monat und Jahr bekomme ich nicht richtig rechnend angepasst. Ist mir aber auch (noch) nicht so wichtig, da ich diese Daten nicht weiter verwende und auch in der TibberApp einsehen kann.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 08 März 2024, 19:47:19
Zitat von: horchundkuck am 08 März 2024, 15:34:28_med musste ich aus dem Reading entfernen, da ich nur SQLite installiert habe (an der Installation von mySQL oder MariaDB auf meinem rasbpi bin ich gescheitert, darum kümmere ich mich später noch einmal)
Das würde ich einfach als Docker Container verwenden.
Zitat, auch die Summen für heute, Monat und Jahr bekomme ich nicht richtig rechnend angepasst. Ist mir aber auch (noch) nicht so wichtig, da ich diese Daten nicht weiter verwende und auch in der TibberApp einsehen kann.
Dafür gibt es sicher eine standard SQL für SQLite, die man nur austauschen müsste.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: horchundkuck am 10 März 2024, 21:57:10
Zitat von: ch.eick am 08 März 2024, 19:47:19Dafür gibt es sicher eine standard SQL für SQLite, die man nur austauschen müsste.
Hab heute komplett auf MariaDB umgestellt, nun laufen alle deine Definitionen ohne dass ich dran "rumfummeln" muss ... und ich habe den Kopf wieder frei für andere Dinge  ;)
Vielen Dank für deine Unterstützung
VG Heinz
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: ch.eick am 11 März 2024, 08:33:27
Zitat von: horchundkuck am 10 März 2024, 21:57:10
Zitat von: ch.eick am 08 März 2024, 19:47:19Dafür gibt es sicher eine standard SQL für SQLite, die man nur austauschen müsste.
Hab heute komplett auf MariaDB umgestellt, nun laufen alle deine Definitionen ohne dass ich dran "rumfummeln" muss ... und ich habe den Kopf wieder frei für andere Dinge  ;)
Ich verwende einen RPI4 mit 64 Bit Installation, da läuft direkt der Oracle MySQL Docker Container.
Ich habe auch diverse MySQL SELECT Abfragen, die nicht mehr im MariaDB laufen. MySQL entwickelt sich immer weiter, insbesondere auf die Sicherheitsfunktionalität und da gab es leider bei MariaDB zuwenig Updates in den Docker Containern.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hkspks am 20 April 2024, 09:41:37
Hallo, bei mir wird kein barchart für den Strompreis angezeigt im Device EVU_Tibber:

Strompreis
error unknown expression format: in expression: bar1dayerror unknown expression format: in expression: bar1day

Hat jemand eine Idee? Mein Pulse ist seit gestern erst aktiv, das dürfte für die Preisanzeige ja keinen Unterschied machen. Der Rest funktioniert und zeigt auch Werte an.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hkspks am 20 April 2024, 10:00:35
Hallo, bei mir wird kein barchart für den Strompreis angezeigt im Device EVU_Tibber:

Strompreis
error unknown expression format: in expression: bar1dayerror unknown expression format: in expression: bar1day

Hat jemand eine Idee? Mein Pulse ist seit gestern erst aktiv. Infoschnittstelle für das Livemeasurement ist noch nicht offen, siehe log:

2024.04.20 09:42:16 3: EVU_Tibber:Warning in DOIF_RegisterEvalAll:package ui_Table;::DOIF_Widget($hash,$reg,'EVU_Tibber_uiTable_c_3_1_0_0',sprintf("%04d W",(::ReadingValDoIf($hash,'EVU_Tibber_connect','payload_data_liveMeasurement_powerProduction')  >= 0 ? ::ReadingsVal("EVU_Tibber_connect","payload_data_liveMeasurement_powerProduction",0) : 0)),"")
2024.04.20 09:42:16 1: PERL WARNING: Argument "" isn't numeric in numeric ge (>=) at (eval 1130041) line 1.

Das dürfte für die Preisanzeige ja keinen Unterschied machen, oder? Der Rest funktioniert und zeigt auch Werte an.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: Damian am 20 April 2024, 11:11:47
Es gibt in der Definition einen Größenvergleich >=, im Log ist eine Warnung dazu, die sagt, dass dort die vermeintliche Zahl nicht numerisch ist - den Rest wirst du schon selber finden.
Titel: Aw: Tibber & Tibber Pulse
Beitrag von: hkspks am 20 April 2024, 11:31:29
Alles klar, war ein veraltetes DOIF.pm - das Update hat geholfen.