Tibber API - Real Time Subscription mit Python

Supi, dann sollte es ja eigentlich klappen.

Bei mir scheint irgendetwas im Netzwerk nicht i.O. zu sein. Wenn ich mich mit ssh auf Venus einlogge und

wget http://localhost:1880/api

eingebe, dann erhalte ich ein Textfile namens api mit dem Inhalt

{}

D.h. er selber kann auf den Port zugreifen, von außen geht das aber nicht. Allerdings ist immer noch nichts in der Klammer.

Wenn ich mir meine Funktion anschaue, dann sehe ich ja

var newmsg = {payload: msg.payload.power};
global.set("tibber.power",newmsg);
return newmsg;

D.h. unser Wert wird auf die globale Variable tibber.power gelegt, richtig?

Mit Deinem Knoten

msg.payload = {gridpower: global.get('fronius.meter')};
msg.headers = {};
msg.headers['content-type'] = 'application/json';
return msg;

ließt Du aber fronius.meter aus und gibst den dann weiter. Ist das so richtig? Oder wie kommt der Tibber Wert letzlich nach http://localhost:1880/api ? Oder: wie kommt der Tibber-Power-Wert zur fronius.meter Variable?

HA!!! Wenn ich Deinen Knoten umschreibe auf Tibber-Power, dann klappt's:

{"gridpower":{"payload":173.4,"_msgid":"21538c2f8d15e6e3"}}

:grinning:

Jetzt muss ich das Ganze nur noch von außerhalb des Pis lesen können...

Nochmals herzlichen Dank an mdkell für die unermüdliche Unterstützung!!! Ich denke, dies wird vielen helfen. :blush: :+1:

Hier also noch mal das komplette Kochrezept in dem nur noch die Home-ID im Tibber-Node angepasst werden muss. Die kann man auch gleich hier schon in Zeile 9 zwischen die Anführungszeichen eintragen.

Um die Abfrage mit einer neueren Node-Red / VenusOS Version zu realisieren, ist dies hier die korrekte Abfrage:

wget https://venus.local:1881/api --no-check-certificate

Bei einem VenusOS Versionssprung (vermutlich bei 3.00) wurde er HTTP Port für alle HTTP-Anfragen auf 1881 gesetzt.

https://venus.local:1881

ist dabei die Node-Red GUI, alles andere liegt darunter.

Hier also der Flow:

[
{
"id": "f7057bc3c95c55fe",
"type": "tibber-feed",
"z": "96cffcb4cb06b139",
"name": "Tibber-Live",
"active": true,
"apiEndpointRef": "5e8af9f09e4a2d66",
"homeId": "",
"timestamp": "1",
"power": "1",
"lastMeterConsumption": false,
"accumulatedConsumption": false,
"accumulatedProduction": false,
"accumulatedConsumptionLastHour": false,
"accumulatedProductionLastHour": false,
"accumulatedCost": false,
"accumulatedReward": false,
"currency": false,
"minPower": false,
"averagePower": false,
"maxPower": false,
"powerProduction": false,
"minPowerProduction": false,
"maxPowerProduction": false,
"lastMeterProduction": false,
"powerFactor": false,
"voltagePhase1": false,
"voltagePhase2": false,
"voltagePhase3": false,
"currentL1": "1",
"currentL2": "1",
"currentL3": "1",
"signalStrength": false,
"x": 200,
"y": 2500,
"wires": [
[
"88cc0f4960d02fde"
]
],
"icon": "node-red/feed.svg"
},
{
"id": "88cc0f4960d02fde",
"type": "function",
"z": "96cffcb4cb06b139",
"name": "extractpower",
"func": "var newmsg = {payload: msg.payload.power};\nglobal.set(\"tibber.power\",newmsg);\nreturn newmsg;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 410,
"y": 2500,
"wires": [
[
"25aa143c52267d04"
]
]
},
{
"id": "25aa143c52267d04",
"type": "debug",
"z": "96cffcb4cb06b139",
"name": "debug 3",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 660,
"y": 2500,
"wires": []
},
{
"id": "edeb5b596a7cec77",
"type": "http in",
"z": "96cffcb4cb06b139",
"name": "",
"url": "/api",
"method": "get",
"upload": false,
"swaggerDoc": "",
"x": 200,
"y": 2680,
"wires": [
[
"7bf4ca40c5400086"
]
]
},
{
"id": "7bf4ca40c5400086",
"type": "function",
"z": "96cffcb4cb06b139",
"name": "json",
"func": "msg.payload = {gridpower: global.get('tibber.power')};\nmsg.headers = {};\nmsg.headers['content-type'] = 'application/json';\nreturn msg;",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 350,
"y": 2680,
"wires": [
[
"7883d17ca80f0090"
]
]
},
{
"id": "7883d17ca80f0090",
"type": "http response",
"z": "96cffcb4cb06b139",
"name": "http Response",
"statusCode": "",
"headers": {},
"x": 560,
"y": 2680,
"wires": []
},
{
"id": "5e8af9f09e4a2d66",
"type": "tibber-api-endpoint",
"queryUrl": "https://api.tibber.com/v1-beta/gql",
"feedConnectionTimeout": "30",
"feedTimeout": "60",
"queryRequestTimeout": "30",
"name": "TibberData"
}
]

Und den importiert man hier. Einfach copy/paste in das sich öffnende Fenster.

Die Variable fronius.meter habe ich nur zur Veranschaulichung genommen, hat also nix mit Tibber zu tun.

Ich habe noch gesehen, was man bei dir noch optimieren kann.. dann ist die Weiterverarbeitung sauberer/einfacher.

  • ggfs statt wget zur Abfrage curl nehmen..
global.set("tibber.power",newmsg);
ändern in
global.set("tibber.power",msg.payload.power);

Und hier noch der PythonCode mit dem man den Wert dann wieder ausließt:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 29 21:01:55 2023
@author: nick
"""
import requests
import json
requests.packages.urllib3.disable_warnings()
#### Tibber Pulse über Node-Red ########################################################
try:
url = "https://venus.local:1881/api"
TP = requests.get(url, verify=False, timeout=2)
TP1 = TP.text
TP2  = json.loads(TP1)
TibberPower = TP2['gridpower']['payload']
except:
print("No Tibber Data")
print("Tibber Pulse:")
print(str(TibberPower)) 

Das Ganze ist jetzt noch einmal anfängergerecht, Schritt für Schritt erklärt, in der Wiki zu finden.

1 „Gefällt mir“

würde ich noch anpassen, da zum einen das unnötige "payload" wegfällt und man die msgid vermutlich auch nicht braucht.

1 „Gefällt mir“

Das ist tatsächlich noch ein Stückchen sauberer. Bei mir funktiniert's jetzt aber prima wie es ist, und es belasse es jetzt mal so. Womöglich kann jemand mit der Message ID auch doch noch etwas anfangen...

Aber vielen Dank für den Hinweis. :+1:

@monokristallin

Sehr schön, werde ich mal bei Gelegenheit nachbauen.

Ich habe derweil den anderen Pfad (Tibber Power via Websockets auslesen; mittels Python Script) weiterverfolgt und in ein Github-Projekt gegossen, das jetzt die ersten 24h die Steuerung bei mir erfolgreich übernommen hat.

Dabei läuft der Tibber Part in einem Docker Container und versorgt damit den MQTT-Broker, der in einem zweiten Docker Container auf dem selben Raspberry Pi läuft.
Die anderen beiden Container spielen für diese Diskussion keine Rolle.

Somit kann man sich das Dockerfile und das Script für Tibber bei Bedarf als Vorlage nehmen ...
Nur mal als alternativen Lösungsweg, falls jemand die Suche bemüht hat und auf unsere Diskussion stößt.

@luchbewohner

Ja, ich hatte eh gerade vor, Deine Alternative noch in den Wiki Eintrag zu setzen. Aber Du warst einfach früher wach als ich. :wink:

Dann sind es also zwei Alternativen. Sehr gut. Werde ich gleich mal einfügen. Ich werde auch noch einmal testen, ob es mit einem Raspberry zero 2 funktionieren würde. Ich habe hier noch einen herumfliegen...

PS: da es etwas unwissenschaftlich ist, seine Quellen nicht zu nennen, habe ich Euch (mdkell und luchtbewohner) nun auch lobend im Wikieintrag erwähnt. :blush:

@Monokristallin

Hallo,

wie ja schon weiter oben als Tip gegeben wurde kann man den Tibber-Pulse Webserver auf dauerhaft "EIN" einstellen und dann die Echtzeitdaten vom Zähler direkt auslesen (ohne irgendeinen Umweg über Tibber). Du schreibst das Dein Pulse zu weit von Deinem WLAN entfernt ist um diese Lösung verwenden zu können, aber warum verwendest Du denn nicht einfach einen Powerline-Adapter? Ich gehe mal davon aus, daß der Pulse in einer Steckdose die zu Deinem Stromzähler gehört steckt, oder. Aber selbst wenn nicht (also irgendein anderer Stromkreis) wäre es einen Versuch wert. Dann hättest Du alle Tibber- und Cloudprobleme vom Hals.

Ich bin gerade am Anfang der Tibber-Nutzung (seit 1.1.24) und habe gerade Gestern den Webserver auf Dauer-EIN gestellt. In meinem Fall hole ich die RAW-Daten mit einem passenden "Obis-Modul" in meine FHEM-Hausautomation. Funktioniert bestens. Was ich jetzt noch brauche sind die Strompreisdaten von Tibber einlesen zu können und (das Wichtigste) einen Weg finden wie ich meinem Wechselrichter (Goodwe GW25K-ET) Befehle senden und ihn dann auf "Laden" stellen kann. Zum Daten abholen nutze ich ein Python-Modul, aber das kann (noch) keine Daten an den WR senden.

Weil ich nicht mal eine Steckdose im Keller habe, die ich nutzen kann. :smirk:

Verstehe Deine Config jetzt nicht, sorry. In welcher Steckdose steckt denn Deine Tibber-Bridge? Die muß doch auch in einer Steckdose in der Nähe des Pulse stecken, oder nicht?

@guzzicharlie

Wie oben im Text beschrieben, ist mein Nachbar im ersten Stock so nett, die Bridge einzustecken und über seinen Router einspeisen zu lassen. Mehr möchte ich ihm nicht zumuten.

Deine Lösung mit dem offenen Netzserver ist natürlich prima für alle bei denen das geht. Für alle anderen (so wie bei mir) ist die oben beschriebene Lösung gedacht.

Ah, ok. Das mit der Bridge beim Nachbarn hatte ich nicht richtig gelesen. Da ist man natürlich mit einem Haus im Vorteil, wo man tun und lassen kann was man will.