NEU! UPGRADE IP 11 verfügbar!
NEU! LICHTWIDGET - DPT 7.600 - Logik Manager Update - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/B9MUEJj2

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur VISU
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

[V4.0 IP1] HTTP/API Webabfrage Tibber

Wissen, Planung & Diskussion zur Unterstützung von Rest-API & Webabfragen im Timberwolf Server.
Stellt uns hier Eure Projekte und Ideen vor.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
cheater
Reactions:
Beiträge: 613
Registriert: Sa Aug 11, 2018 11:16 pm
Hat sich bedankt: 384 Mal
Danksagung erhalten: 274 Mal

[V4.0 IP1] HTTP/API Webabfrage Tibber

#1

Beitrag von cheater »

Hallo Leute,
hat von euch schon mal wer eine API Abfrage bei Tibber (aktueller Strompreis) realisiert? Ich habe mich heute mal da ran versucht, aber habe es leider nicht geschafft Daten abzurufen. Hintergrund ist, dass ich überlege ab 1.1. auch zu Tibber zu wechseln.

Behelfsmäßig habe ich jetzt mal Awattar integriert, da scheinen die Preise gleich. viewtopic.php?f=82&t=2998&start=10#p45636

Danke @Robert_Mini für den Tipp!
Grüße, Dominic

Timberwolf 2400 #126, VPN offen, Reboot nach Absprache

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#2

Beitrag von Marino »

Ich habe nun auch ein wenig rumgespielt, um mit Tibber Daten zu bekommen.

Vorweg: Mein Tibber Pulse läuft noch nicht, da ich seit fast einer Woche auf den PIN meines EVU's warte und ich nutze V4 IP4, nicht IP1, wie in Deinem Titel.

Es läuft auch noch nicht komplett, aber vielleicht bekommen wir es mit der Schwarm-Intelligenz ja hin.

Was ich schaffe ist, einzelne Werte zu holen. Warum nur einzelne?
Mein Body (String) wird abgeschnitten, wenn er zu lang ist, damit kann ich nicht komplett abfragen.

Ich bekomme noch einen Error, bekomme aber auch Daten. Vielleicht hängt das mit dem unvollständigen Senden zusammen? Ich kenne mich da leider nicht so gut aus.

Ich nutze einen "Multiplexer(String)" und lasse alle x Sekunden Triggern. Wenn ich am HTTP-API Server oder der Recource etwas ändere, kommt der Wert aber nicht mehr. Dann ändere im Doktormodus etwas oder ändere hin und zurück und speichere wieder und dann geht es.
Auch hier: Keine Ahnung warum das so ist...

1.png
Ich weiß nicht, ob Server-Zertifikat funktioniert. Habe es beim Testen raus genommen und es ist noch nicht wieder aktiviert. Kann also ggf. aktiviert werden.
2.png
Trigger-Intervall ist noch so hoch, da es ja nicht komplett funktioniert.
3.png
Durch die Angabe von query als Selektor spare ich mir Zeichen, denn hierdurch wird meinem String ein Teil hinzugefügt, den ich mir dann im String selber sparen kann.

Code: Alles auswählen

{
  "query": "
vor dem String und nach dem String.

Übertragen wollte ich also das hier:

Code: Alles auswählen

{ "query": "{viewer {homes {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}" }
Das wird aber nicht komplett übertragen.

Durch die Angabe query als Selektor (oben erwähnt), bräuchte ich dafür nur das hier ageben:

Code: Alles auswählen

{viewer{homes{currentSubscription{priceInfo{current{energy tax startsAt }}}}}}



Trage ich das komplett ein

Code: Alles auswählen

{
{viewer{homes{currentSubscription{priceInfo{current{total energy tax startsAt}}}}}}
}
Schneidet er es ab und es wird das hier eingetragen:

Code: Alles auswählen

{
  "query": "{viewer{homes{currentSubscription{priceInfo{current{total energy tax startsAt}}"
}
Da fehle ein paar geschweifte Klammern } ud folglich kommt dann

Code: Alles auswählen

{
  "errors": [
    {
      "message": "Syntax Error: Expected Name, found <EOF>.",
      "extensions": {
        "code": "GRAPHQL_PARSE_FAILED"
      }
    }
  ]
}

Trage ich aber einzeln ein

Code: Alles auswählen

{viewer{homes{currentSubscription{priceInfo{current{total}}}}}}
oder

Code: Alles auswählen

{viewer{homes{currentSubscription{priceInfo{current{tax}}}}}}
z.B.,

bekomme ich eine Ausgabe (hier von total):

Code: Alles auswählen

{
  "data": {
    "viewer": {
      "homes": [
        {
          "currentSubscription": {
            "priceInfo": {
              "current": {
                "total": 0.3615
              }
            }
          }
        }
      ]
    }
  }
}

Man sieht also, es ist bei weitem noch nicht perfekt, aber ich bekomme schon einmal etwas. VIelleicht bastelt ja noch der eine oder andere dran und kann darauf aufbauen oder hat eine Idee, warum mein String gekürzt wird.

Ich kann heute nur nicht mehr weiter testen, war aber schon einmal froh, dass ich schonmal eine Antwort bekam. Ist ja schon eimal ein Schritt.


Viele Grüße
Nils
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#3

Beitrag von Marino »

Ich habe nun rausgefunden, dass nicht alle Logikbausteine mit Textausgabe große Datengrößen unterstützen. Ich habe nun bei den Logikbaustein "Text im Intervall senden" genutzt. Ich habe noch nicht rausgefunden, welcher Baustein welche Begrenzung hat. Jedenfalls kann dieser de vollen String ausgeben.

Sende ich nun

Code: Alles auswählen

{viewer {homes {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}
und hänge als Selektor

Code: Alles auswählen

query
an, so wird das hier gesendet als Body:

Code: Alles auswählen

{
  "query": "{viewer {homes {currentSubscription {priceInfo {current {total energy tax startsAt }}}}}}"
}
Dann habe ich keinen Fehler mehr und bekomme als Ausgabe:

Code: Alles auswählen

{
  "data": {
    "viewer": {
      "homes": [
        {
          "currentSubscription": {
            "priceInfo": {
              "current": {
                "total": 0.3097,
                "energy": 0.0969,
                "tax": 0.2128,
                "startsAt": "2023-09-13T11:00:00.000+02:00"
              }
            }
          }
        }
      ]
    }
  }
}
Der Error wird zwar noch angezeigt, Zeitstempel ist aber von gestern.




Nun habe ich mal folgendes abgefragt:

Code: Alles auswählen

{
  "query": "{   viewer {     homes {       consumption(resolution: HOURLY, last: 100) {         nodes {           from           to           cost           unitPrice           unitPriceVAT           consumption           consumptionUnit         }       }     }   } }"
}
Die Ausgabe ist relativ groß, aber consumption ist für den heutigen Tag immer "null". Die vorherigen Tage haben Werte. Probiere ich das mit der API au der Tibber-Seite, so stehen dort Werte drin. Genau die interessieren mich aber :cry:


EDIT:
Auch mit anderen Abfragen ist die Ausgabe für "consumption" immer "null". Genau das sind aber interessante Werte, um diese in eine Datenbank zu schreibe. So ein Mist. Hat jemand ne Idee?


EDIT 2:
Ich habe ja heute erst meinen PIN bekommen und der Tibber Pulse ist ja noch nicht dran. Die "null" sind also eigentlich normal, dass gestern stündlich Werte drin sind, das ist eigentlich falsch. Da ich keine übertragen konnte, können das also nur Schätzwerte sein.
Eigentlich muss also erst einmal der Pulse ran und dann kann man sich das nochmal anschauen.
Zuletzt geändert von Marino am Mi Sep 13, 2023 12:11 pm, insgesamt 3-mal geändert.
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#4

Beitrag von Marino »

Die Abfrage funktioniert ja schon einmal und das ganze auch mit "Server Zertifikat" aktiv. Habe ich mal getestet.

Ich treibe mich gerade mit der Frage herum, und teste auch ein wenig, ob man auch die Livedaten bekommen kann. Das ganze funktioniert mit einer subscripton eines web sockets.
Ist das hiermit überhaupt möglich? Wenn ja, hat jemand einen Tipp für mich?

Interessieren tut mich eigentlich hauptsächlich momentane Leistung (power) und der Zählerstand (lastMeterConsumption). Mit dem GraphiQL-Tool bei der API -Beschreibung kann ich das abrufen. Die Leistung würde ich gerne loggen und weiß nicht, ob ich einen Modbus- oder KNX-Zähler kaufen sollte oder ob ich das nicht hier auch abfragen kann.
Der Zählerstand kann zwar durch andere Zähler gezählt werden, allerdings mit Toleranz und der hier gelesene Wert ist im Endeffekt der, den ich bezahle. Damit nützt selber ein genauerer Zähler nichts, da dieser Wert verbindlich ist.

Falls mir jemand hier einen Tipp geben kann, ob ich aufgeben kann oder ob es möglich ist, wäre das super. Wie gesagt, das ist für mich ein wenig Neuland. Ich programmiere sonst nur SPS und das hilft mir hier nicht weiter :)


Viele Grüße
Nils
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#5

Beitrag von Marino »

Bitte nicht meine Frage im letzten Post übersehen :)

Vielleicht fragt sich ja beim Lesen jemand was man nun mit dem json anfangen kann und wie man die Daten rausbekommt. So alleine hilft es ja immerhin noch nicht.

Ich mache das mal exemplarisch für einen Wert. Ich weiß noch nicht genau, was mich interessiert und was und wie ich es loggen möchte, da der ausgelesene Werte zu einem Zeitraum (1h) in der Vergangenheit gehört und ich ihn beim loggen nicht mit der aktuellen Zeit schreiben wollen würde.

Wenn ich testweise mal nur 2 Werte Abfrage,

Code: Alles auswählen

{
  "query": "{     viewer {     homes {       consumption(resolution: HOURLY, last: 2) {         nodes {           from           to           cost           unitPrice           unitPriceVAT           consumption           consumptionUnit         }       }     }   } }"
}
bekomme ich etwas verschachtelt das hier:

Code: Alles auswählen

{
  "data": {
    "viewer": {
      "homes": [
        {
          "consumption": {
            "nodes": [
              {
                "from": "2023-09-14T13:00:00.000+02:00",
                "to": "2023-09-14T14:00:00.000+02:00",
                "cost": 0.197232028,
                "unitPrice": 0.3011176,
                "unitPriceVAT": 0.0480776,
                "consumption": 0.655,
                "consumptionUnit": "kWh"
              },
              {
                "from": "2023-09-14T14:00:00.000+02:00",
                "to": "2023-09-14T15:00:00.000+02:00",
                "cost": 0.1520488704,
                "unitPrice": 0.2993088,
                "unitPriceVAT": 0.0477888,
                "consumption": 0.508,
                "consumptionUnit": "kWh"
              }
            ]
          }
        }
      ]
    }
  }
}
Darin sind zwei Arrays.
- homes: Da ich nur ein Heim und einen Tarif habe, ist hier nur ein Datensatz drin
- nodes: Ich habe 2 abgefragt, also sind hier 2 Datensätze drin. Jeder Datensatz enthält die 7 Daten, die ich abgefragt habe (from, to, cost, unitPrice, unitPriceVAT, consumption & consumptionUnit).

Möchte ich nun consumption zwischen 13 & 14 Uhr haben, so ist das der erste Datensatz und natürlich in meinem ersten und einzigen home.

Man klickt also auf "Auswertung HTTP Antwort hinzufügen" und trägt die folgenden Daten ein:
Lokation: Body
Selektor: data.viewer.homes[0].consumption.nodes[0].consumption
Objekteinheit: kWh
Format: Fließkomma (FLOAT)
(Ich habe hier kein Bild gemacht, da der Selektor eh nicht komplett zu sehen ist)

Auslesen möchte ich also
data
viewer
home (den ersten und einzigen Datensatz, also 0)
consumption
nodes (den ersten der Werte, also auch 0)
consumption (mein eigentlicher Wert, der mich interessiert)

Merken also:
- Array muss mit eckigen Klammern mit angegeben werden beginnend mit 0.
- Würde ein Name Punkte beinhalten, müsste dieser mit " " angegeben werden, da sonst kein Datensatz gefunden werden kann.
Beispiel: Würde es nicht data, sondern data.01.gt heißen (also ein zusammenhängender String), müsste man "data.01.gt".viewer.homes[0].consumption.nodes[0].consumption angeben da sonst unter data.01.gt... gesucht wird, was es ja nicht gibt.
Kam bisher hier nicht vor, aber wer weiß. So habe ich es mir nochmal mit notiert



Vielleicht hilft es ja jemandem.


Viele Grüße
Nils
Zuletzt geändert von Marino am Do Sep 14, 2023 3:39 pm, insgesamt 2-mal geändert.
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#6

Beitrag von Marino »

Bitte immer noch meine Frage oben beantworten. Ich weiß immer noch nicht, wie ich die Daten vom web socket subscriben kann, um meine aktuell entnommene Leistung und den Zählerstand auslesen zu können!



Da es hier ja ursprünglich im ersten Post darum ging, den aktuellen Strompreis abzufragen, schreibe ich hier mal kurz, was dafür notwendig ist, um das zu realisieren. Damit wäre dann die Frage im Post 1 schonmal geklärt.

Oben in den Screenshots sieht man die allgemeine Einrichtung mit der API, das ist hier gültig (Server-Zertifikat kann aktiviert werden).
Minimalabfrage (Body) nur für die interessierten Werte:

Code: Alles auswählen

{
  viewer {
    homes {
      currentSubscription{
        priceInfo{
          current{
            total
            energy
            tax
            startsAt
          }
        }
      }
    }
  }
}
Antwort wird so etwas wie hier sein:

Code: Alles auswählen

{
  "data": {
    "viewer": {
      "homes": [
        {
          "currentSubscription": {
            "priceInfo": {
              "current": {
                "total": 0.4204,
                "energy": 0.1899,
                "tax": 0.2305,
                "startsAt": "2023-09-15T19:00:00.000+02:00"
              }
            }
          }
        }
      ]
    }
  }
}
Ausgeben kann man hier 3 Daten für die Preise:
Loction: Body
Objekteinheit: no unit
Format: Fließkomma (FLOAT)

total (Energiepreis + Steuern):

Code: Alles auswählen

data.viewer.homes[0].currentSubscription.priceInfo.current.total
energy (Energiepreis):

Code: Alles auswählen

data.viewer.homes[0].currentSubscription.priceInfo.current.energy
tax (Steuern):

Code: Alles auswählen

data.viewer.homes[0].currentSubscription.priceInfo.current.tax
Das kann man dann auch einfach als Zeitserie speichern und schon hat man die aktuellen Stromwerte.
Da die Werte sich pro Stunde ändern, würde es hier theoretisch reichen, stündlich abzufragen. Ich würde, falls ein Wert mal ausbleibt 1/2 oder 1/3 der Zeit nehmen, also 20-30 Min.
Kombiniert man die Abfrage mit anderen, muss man ggf. häufiger abfragen.


Viele Grüße
Nils
Zuletzt geändert von Marino am Fr Sep 15, 2023 7:19 pm, insgesamt 1-mal geändert.
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#7

Beitrag von Marino »

Im TWS habe ich bisher keine Lösung gefunden, den web socket subscriben zu können.

Ich hoffe, ich bin hier kein Alleinunterhalter und es ist auch von Interesse. Also, was habe ich nun gemacht?

Ich habe eine Anleitung für Node Red gefunden und dachte, ich probiere das mal aus. Nativ im TWS wäre mir deutlich lieber.

Der Weg geht dafür nun bei mir wie folgt:
- Node Red und MQTT-Broker als Docker auf dem TWS installiert.
- In Node red: node-red-contrib-tibber-api installiert, feed abgefragt, Ergebnis geteilt und per MQTT ausgegeben
- Im TWS: MQTT Feed Subscribed und in eine Zeitserie geschrieben, um es in Grafana darzustellen

Da ich den Umweg über Node Red nehme, passt es hier nicht so sehr rein, das hier detailliert darzulegen, auch wenn das als Docker auf dem TWS läuft.

Wenn jemand mir Tipps geben könnte, wie ich das mit dem TWS nativ hinbekomme, würde ich mich sehr freuen. Note Red läuft nun ausschließlich dafür, aber immerhin bekomme ich direkt meinen von meinem Zähler so erst einmal den Zählenwert und die aktuelle Leistung.


Viele Grüße
Nils
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

gbglace
Reactions:
Beiträge: 3615
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 1273 Mal
Danksagung erhalten: 1674 Mal

#8

Beitrag von gbglace »

Ich habe auch einen MQTT Container (Shellys) und auch Node-Red in einem Container (Alexa, Hue, Telegramm) daher hätte ich da jetzt weniger Probleme auch Tibber darüber abzuziehen. Auch wenn der TWS einiges davon bestimmt auch nativ übernehmen können wird, wird es immer mal was neues geben wo man auf die open Source Plattformen NR/HA zurückgreifen wird.
Zuletzt geändert von gbglace am Sa Sep 16, 2023 7:44 am, insgesamt 1-mal geändert.
Grüße
Göran

#1 Timberwolf 2600 Velvet Red TWS #225 / VPN aktiv / Reboot OK
#2 Timberwolf 2600 Organic Silver TWS #438 / VPN aktiv / Reboot OK
#3 PBM 3 Kanäle, #4 Modbus-Extension

Marino
Reactions:
Beiträge: 307
Registriert: Fr Jul 24, 2020 6:44 am
Wohnort: Hamburg
Hat sich bedankt: 129 Mal
Danksagung erhalten: 143 Mal

#9

Beitrag von Marino »

Stimmt schon. Nativ wäre besser, aber immerhin läuft alles auf dem TWS und ich weiß beim nächsten Mal, wie ich Dinge einbinden kann, die nativ nicht laufen. Vor- und Nachteil zugleich :)
Ich werde halt nur mit Node Red nicht richtig wärm und habe schon genug Systeme laufen und würde das unnötige Software gerne vermeiden, wenn es geht.

Nun muss ich nur noch schauen, dass ich die historischen Werte richtig verarbeitet bekomme. Oder ich lese den aktuellen Zählerstand, was ich ja nun kann, und verrechne das stündlich manuell, anstatt historische Werte zu nutzen.


Viele Grüße
Nils
Viele Grüße
Nils


TWS 3500XL ID:1080 (VPN offen, Reboot nach Rücksprache)

gbglace
Reactions:
Beiträge: 3615
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 1273 Mal
Danksagung erhalten: 1674 Mal

#10

Beitrag von gbglace »

Ich nehme auch nur die aktuellen Werte, es gibt hier im Forum einen Custombaustein um sich Tages/Wochen/Monats/Jahres Verbrauchswerte zu bauen, da auch Grafana keine sauberen Monate hinbekommt. Ich habe mir dann auch mal noch eine Customlogik gebaut mit der ich Zähler auf DQ prüfe und ggf bei Zählerwechsel offsets berücksichtigen kann, ein Shelly kann bei längerem Stromlos auch mal wieder bei 0 beginnen, in dem Moment soll dann der Baustein keinen negativen Verbrauchausgeben sondern den gesamten Zählerstand auf addieren. Das soll eben Unsauberkeit en bereinigen wenn mal ein kleinerer Wert ankommt als der zuletzt gelieferte.
Grüße
Göran

#1 Timberwolf 2600 Velvet Red TWS #225 / VPN aktiv / Reboot OK
#2 Timberwolf 2600 Organic Silver TWS #438 / VPN aktiv / Reboot OK
#3 PBM 3 Kanäle, #4 Modbus-Extension
Antworten

Zurück zu „HTTP-API, REST & Web-Abfragen“