Growatt <> Openhab
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Growatt <> Openhab
Hallo zusammen,
hat jemand von euch schon mal mit diesem Script gearbeitet?
https://github.com/Sjord/growatt_api_client
Da ich mich mit Python nicht auskenne, ist es überhaupt möglich Rückgabe werte aus dem Script zu openhb zu bekommen? Wir müsste ich dies anstellen?
Das Script gibt folgende Werte aus:
{'data': [{'plantMoneyText': '2.5 (â¬)', 'plantName': 'xxx', 'plantId': '00000', 'isHaveStorage': 'false', 'todayEnergy': '2 kWh', 'totalEnergy': '9 kWh', 'currentPower': '0 W'}], 'totalData': {'currentPowerSum': '0 W', 'CO2Sum': '0 T', 'isHaveStorage': 'false', 'eTotalMoneyText': '2.5 (â¬)', 'todayEnergySum': '2 kWh', 'totalEnergySum': '9 kWh'}, 'success': True}
{'plantData': {'plantMoneyText': '0.5 (â¬)', 'plantName': 'xxxx', 'plantId': '000000000', 'currentEnergy': '2 kWh'}, 'data': {'15:00': '268.68', '05:00': '0', '18:30': '0', '11:30': '330.97', '12:00': '322.7', '20:30': '0', '07:30': '9.46', '08:30': '40.18', '17:30': '18', '10:30': '194.2', '09:00': '81.92', '03:00': '0', '14:00': '349.5', '16:00': '160.62', '13:30': '381.83', '02:00': '0', '01:00': '0', '12:30': '259.98', '19:30': '0', '04:00': '0', '15:30': '206.3', '06:30': '0', '07:00': '0', '19:00': '0', '05:30': '0', '10:00': '199.28', '17:00': '54.52', '09:30': '125.62', '21:00': '0', '08:00': '33.02', '03:30': '0', '11:00': '244.18', '18:00': '0.23', '14:30': '314.65', '20:00': '0', '01:30': '0', '04:30': '0', '06:00': '0', '13:00': '382.27', '00:30': '0', '16:30': '102.9', '02:30': '0'}, 'success': True}
Im Netz habe ich hier nichts direktes gefunden und habe ich unterschiedliche Aussage über Python gefunden..
Ideal wäre ja eigentlich wenn das Script die Werte als MQTT publishen würde....
Dank Euch und Gruß..
Thomas
hat jemand von euch schon mal mit diesem Script gearbeitet?
https://github.com/Sjord/growatt_api_client
Da ich mich mit Python nicht auskenne, ist es überhaupt möglich Rückgabe werte aus dem Script zu openhb zu bekommen? Wir müsste ich dies anstellen?
Das Script gibt folgende Werte aus:
{'data': [{'plantMoneyText': '2.5 (â¬)', 'plantName': 'xxx', 'plantId': '00000', 'isHaveStorage': 'false', 'todayEnergy': '2 kWh', 'totalEnergy': '9 kWh', 'currentPower': '0 W'}], 'totalData': {'currentPowerSum': '0 W', 'CO2Sum': '0 T', 'isHaveStorage': 'false', 'eTotalMoneyText': '2.5 (â¬)', 'todayEnergySum': '2 kWh', 'totalEnergySum': '9 kWh'}, 'success': True}
{'plantData': {'plantMoneyText': '0.5 (â¬)', 'plantName': 'xxxx', 'plantId': '000000000', 'currentEnergy': '2 kWh'}, 'data': {'15:00': '268.68', '05:00': '0', '18:30': '0', '11:30': '330.97', '12:00': '322.7', '20:30': '0', '07:30': '9.46', '08:30': '40.18', '17:30': '18', '10:30': '194.2', '09:00': '81.92', '03:00': '0', '14:00': '349.5', '16:00': '160.62', '13:30': '381.83', '02:00': '0', '01:00': '0', '12:30': '259.98', '19:30': '0', '04:00': '0', '15:30': '206.3', '06:30': '0', '07:00': '0', '19:00': '0', '05:30': '0', '10:00': '199.28', '17:00': '54.52', '09:30': '125.62', '21:00': '0', '08:00': '33.02', '03:30': '0', '11:00': '244.18', '18:00': '0.23', '14:30': '314.65', '20:00': '0', '01:30': '0', '04:30': '0', '06:00': '0', '13:00': '382.27', '00:30': '0', '16:30': '102.9', '02:30': '0'}, 'success': True}
Im Netz habe ich hier nichts direktes gefunden und habe ich unterschiedliche Aussage über Python gefunden..
Ideal wäre ja eigentlich wenn das Script die Werte als MQTT publishen würde....
Dank Euch und Gruß..
Thomas
- udo1toni
- Beiträge: 15252
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Growatt <> Openhab
Also, wenn man das Ganze durch einen Prettifyer laufen lässt, wird die Struktur etwas klarer. Was dann auch schnell klar wird, ist, dass es sich um zwei(!) JSON Objekte handelt. Das erste Objekt
Das zweite Objekt:
Jetzt ist halt die Frage, warum da 2 Objekte ausgegeben werden (damit wird das als Ganzes betrachtet ungültig) Auf die einzelnen werte kann man Bequem zugreifen, wenn gültiges JSON geliefert wird. Beispiel für den Zugriff:
JSONPATH:$.data[0].todayEnergy liefert für das erste Objekt "2kWh".
EDIT: Ich hab grade mal einen Blick auf das Script geworfen... das "Problem" mit dem 2. (eigentlich dem 1.) JSON Objekt ist die 1. Print Zeile (print(plant_info)).
Das Script ist vermutlich vor allem als Anregung für Entwickler gedacht. Du kannst das aber einfach so verwenden, Du musst lediglich die Zeile auskommentieren (mit einer vorangestellten Raute #)
Die Ausgabe leitest Du dann an JSONPATH weiter und lässt den entsprechenden Wert ausgeben.
Was den Weg über mqtt betrifft: ja, das wäre sehr geschickt. Das Hauptproblem ist hier, wann sollen die Daten gezogen werden? Es gibt eine Bibliothek (paho) für Python, die musst Du importieren und dann ein paar Zeilen Code hinzufügen, dann kann das Script beide JSON Objekte in zwei Topics publishen. Dann müsste noch eine Schleife mit rein, die die Seite zyklisch abfragt (wie oft darf das passieren? wie oft ist das sinnvoll?)
Code: Alles auswählen
{
'data': [{
'plantMoneyText': '2.5(â¬)',
'plantName': 'xxx',
'plantId': '00000',
'isHaveStorage': 'false',
'todayEnergy': '2kWh',
'totalEnergy': '9kWh',
'currentPower': '0W'
}],
'totalData': {
'currentPowerSum': '0W',
'CO2Sum': '0T',
'isHaveStorage': 'false',
'eTotalMoneyText': '2.5(â¬)',
'todayEnergySum': '2kWh',
'totalEnergySum': '9kWh'
},
'success': True
}
Code: Alles auswählen
{
'plantData': {
'plantMoneyText': '0.5(â¬)',
'plantName': 'xxxx',
'plantId': '000000000',
'currentEnergy': '2kWh'
},
'data': {
'15: 00': '268.68',
'05: 00': '0',
'18: 30': '0',
'11: 30': '330.97',
'12: 00': '322.7',
'20: 30': '0',
'07: 30': '9.46',
'08: 30': '40.18',
'17: 30': '18',
'10: 30': '194.2',
'09: 00': '81.92',
'03: 00': '0',
'14: 00': '349.5',
'16: 00': '160.62',
'13: 30': '381.83',
'02: 00': '0',
'01: 00': '0',
'12: 30': '259.98',
'19: 30': '0',
'04: 00': '0',
'15: 30': '206.3',
'06: 30': '0',
'07: 00': '0',
'19: 00': '0',
'05: 30': '0',
'10: 00': '199.28',
'17: 00': '54.52',
'09: 30': '125.62',
'21: 00': '0',
'08: 00': '33.02',
'03: 30': '0',
'11: 00': '244.18',
'18: 00': '0.23',
'14: 30': '314.65',
'20: 00': '0',
'01: 30': '0',
'04: 30': '0',
'06: 00': '0',
'13: 00': '382.27',
'00: 30': '0',
'16: 30': '102.9',
'02: 30': '0'
},
'success': True
}
JSONPATH:$.data[0].todayEnergy liefert für das erste Objekt "2kWh".
EDIT: Ich hab grade mal einen Blick auf das Script geworfen... das "Problem" mit dem 2. (eigentlich dem 1.) JSON Objekt ist die 1. Print Zeile (print(plant_info)).
Das Script ist vermutlich vor allem als Anregung für Entwickler gedacht. Du kannst das aber einfach so verwenden, Du musst lediglich die Zeile auskommentieren (mit einer vorangestellten Raute #)
Die Ausgabe leitest Du dann an JSONPATH weiter und lässt den entsprechenden Wert ausgeben.
Was den Weg über mqtt betrifft: ja, das wäre sehr geschickt. Das Hauptproblem ist hier, wann sollen die Daten gezogen werden? Es gibt eine Bibliothek (paho) für Python, die musst Du importieren und dann ein paar Zeilen Code hinzufügen, dann kann das Script beide JSON Objekte in zwei Topics publishen. Dann müsste noch eine Schleife mit rein, die die Seite zyklisch abfragt (wie oft darf das passieren? wie oft ist das sinnvoll?)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 60
- Registriert: 17. Dez 2019 09:03
- Wohnort: Sisaket Thailand
Re: Growatt <> Openhab
Hallo, ich sende meine Inverter Daten an den Mqtt Broker, sehr einfach mit Python
hier der Code fuer Python
=======================================
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
client.publish("inverter/topic1", wert1)
client.publish("inverter/topic2", wert2)
client.publish("inverter/topic3", wert3)
======================================
Dann landen die Daten beim Brooker (z.B. Mosquitto)
ich hatte vergessen
client.loop_start()
hier der Code fuer Python
=======================================
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
client.publish("inverter/topic1", wert1)
client.publish("inverter/topic2", wert2)
client.publish("inverter/topic3", wert3)
======================================
Dann landen die Daten beim Brooker (z.B. Mosquitto)
ich hatte vergessen
client.loop_start()
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Re: Growatt <> Openhab
Hallo Udo,
Danke für deine schnell und gute Analyse.
So wie es aussieht kommen 2 antworten vom Script, die erste ist recht allgemein, die 2 wohl der genaue Verlauf.
Ist es möglich direkt aus einer rule über Json direkt auf die letzten Werte zuzugreifen?
Um regelmäßig Daten zu bekommen dachte ich an ein crontab alle paar Minuten, das müsste doch eigentlich gegen.
Gruß
Danke für deine schnell und gute Analyse.
So wie es aussieht kommen 2 antworten vom Script, die erste ist recht allgemein, die 2 wohl der genaue Verlauf.
Ist es möglich direkt aus einer rule über Json direkt auf die letzten Werte zuzugreifen?
Um regelmäßig Daten zu bekommen dachte ich an ein crontab alle paar Minuten, das müsste doch eigentlich gegen.
Gruß
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Re: Growatt <> Openhab
Hi,
Wo würde ich diese Zeilen einbinden? Wie machst du es?
Direkt im ursprünglichen Script?
Gruß
Wo würde ich diese Zeilen einbinden? Wie machst du es?
Direkt im ursprünglichen Script?
Gruß
baipai hat geschrieben: ↑4. Mär 2021 11:13 Hallo, ich sende meine Inverter Daten an den Mqtt Broker, sehr einfach mit Python
hier der Code fuer Python
=======================================
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
client.publish("inverter/topic1", wert1)
client.publish("inverter/topic2", wert2)
client.publish("inverter/topic3", wert3)
======================================
Dann landen die Daten beim Brooker (z.B. Mosquitto)
ich hatte vergessen
client.loop_start()
- udo1toni
- Beiträge: 15252
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Growatt <> Openhab
Wir reden ja von diesem Script:
Ich habe hier mal eingefügt, was da passiert.
Eine ganz einfache Variante wäre diese hier:
Wobei ich mir nicht sicher bin, ob das so korrekt ist. Python mache ich nur ganz selten, und dann läuft es meist auf copy&paste&trial&error heraus.
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.
Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.
Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
Code: Alles auswählen
import sys
import datetime
from growatt import hash_password, GrowattApi, Timespan
username = sys.argv[1]
password = sys.argv[2]
with GrowattApi() as api:
api.login(username, password)
plant_info = api.plant_list()
# die nächste Zeile liefert das erste JSON Objekt
print(plant_info)
plant_id = plant_info["data"][0]["plantId"]
plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
# die nächste Zeile liefert das zweite JSON Objekt
print(plant_detail)
Eine ganz einfache Variante wäre diese hier:
Code: Alles auswählen
import datetime
import paho.mqtt.client as mqtt
from growatt import hash_password, GrowattApi, Timespan
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
username = Dein Growatt Username
password = Dein Growatt Passwort
with GrowattApi() as api:
api.login(username, password)
plant_info = api.plant_list()
client.publish("inverter/plant_info", plant_info)
plant_id = plant_info["data"][0]["plantId"]
plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
client.publish("inverter/plant_detail", plant_detail)
client.loop_start()
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.
Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.
Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 60
- Registriert: 17. Dez 2019 09:03
- Wohnort: Sisaket Thailand
Re: Growatt <> Openhab
Genau so,
Du musst natuerlich noch Paho Downloaden und Installieren.
https://pypi.org/project/paho-mqtt/
Die Datenabfrage wuerde ich in eine Schleife packen und alle 10 sec. oder 60 sec. durchlaufen lassen.So wie du die Daten benoetigst.
So ein Python-Script frisst ja wenig Resourcen.
Du kannst auch ein Cron laufen lassen oder das Script von Openhab aus aufrufen.
Bei mir lauft das Script in einer While Schleife (ca. alle 7 sec) bis ich den Prozess Beende. Ich brauche die Daten auch Nachts, da ich die Batteriebank mit Ueberwache.
Ich habe eine OffGrid und OnGrid Anlage.
Du musst natuerlich noch Paho Downloaden und Installieren.
https://pypi.org/project/paho-mqtt/
Die Datenabfrage wuerde ich in eine Schleife packen und alle 10 sec. oder 60 sec. durchlaufen lassen.So wie du die Daten benoetigst.
So ein Python-Script frisst ja wenig Resourcen.
Du kannst auch ein Cron laufen lassen oder das Script von Openhab aus aufrufen.
Bei mir lauft das Script in einer While Schleife (ca. alle 7 sec) bis ich den Prozess Beende. Ich brauche die Daten auch Nachts, da ich die Batteriebank mit Ueberwache.
Ich habe eine OffGrid und OnGrid Anlage.
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Re: Growatt <> Openhab
Super idee, genau so hatte ich es mir vorgestellt. Ich muss mich echt mehr mit Python beschäftigen...
Aber:
Leider lässt sich ein Json nicht per mqtt über pao versenden. Nun wird es wohl kniffelig..
Wie kann man dies denn nun umwandeln?
Traceback (most recent call last):
File "growatt/mygrowatt.py", line 16, in <module>
client.publish("inverter/plant_info", plant_info)
File "/home/openhabian/growatt_api_client/venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 1264, in publish
'payload must be a string, bytearray, int, float or None.')
TypeError: payload must be a string, bytearray, int, float or None.
quote=udo1toni post_id=31667 time=1614885128 user_id=1014]
Wir reden ja von diesem Script:
Ich habe hier mal eingefügt, was da passiert.
Eine ganz einfache Variante wäre diese hier:
Wobei ich mir nicht sicher bin, ob das so korrekt ist. Python mache ich nur ganz selten, und dann läuft es meist auf copy&paste&trial&error heraus.
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.
Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.
Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
[/quote]
Aber:
Leider lässt sich ein Json nicht per mqtt über pao versenden. Nun wird es wohl kniffelig..
Wie kann man dies denn nun umwandeln?
Traceback (most recent call last):
File "growatt/mygrowatt.py", line 16, in <module>
client.publish("inverter/plant_info", plant_info)
File "/home/openhabian/growatt_api_client/venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 1264, in publish
'payload must be a string, bytearray, int, float or None.')
TypeError: payload must be a string, bytearray, int, float or None.
quote=udo1toni post_id=31667 time=1614885128 user_id=1014]
Wir reden ja von diesem Script:
Code: Alles auswählen
import sys
import datetime
from growatt import hash_password, GrowattApi, Timespan
username = sys.argv[1]
password = sys.argv[2]
with GrowattApi() as api:
api.login(username, password)
plant_info = api.plant_list()
# die nächste Zeile liefert das erste JSON Objekt
print(plant_info)
plant_id = plant_info["data"][0]["plantId"]
plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
# die nächste Zeile liefert das zweite JSON Objekt
print(plant_detail)
Eine ganz einfache Variante wäre diese hier:
Code: Alles auswählen
import datetime
import paho.mqtt.client as mqtt
from growatt import hash_password, GrowattApi, Timespan
client = mqtt.Client()
client.connect("xxx.xxx.x.xxx", 1883, 60)
username = Dein Growatt Username
password = Dein Growatt Passwort
with GrowattApi() as api:
api.login(username, password)
plant_info = api.plant_list()
client.publish("inverter/plant_info", plant_info)
plant_id = plant_info["data"][0]["plantId"]
plant_detail = api.plant_detail(plant_id, Timespan.day, datetime.date.today())
client.publish("inverter/plant_detail", plant_detail)
client.loop_start()
Es gäbe anschließend zwei Topics inverter/plant_info und inverter/plant_detail, die jeweils ein JSON Objekt beinhalten, was dann auf openHAB-Seite bequem mit JSONPATH ausgewertet werden kann.
Für das schnelle Ergebnis stehen die Daten wie Username, Passwort und IP des mqtt Brokers direkt im Programmcode, besser wäre es natürlich, diese z.B. in eine Konfigurationsdatei auszulagern. Logging ist auch immer eine gute Idee.
Mutmaßlich wird das Script einmalig abfragen und schreiben, sinnvoll wäre aber, das Script einmalig zu starten und dann zyklisch die Daten abfragen zu lassen. Da Du nachts vermutlich keinen Strom erzeugst (ich gehe von einer PV Anlage aus), wäre es eine nette Variante, über mqtt einen befehl zu senden, um die Abfrage zu starten / zu stoppen. Das hieße, das Programm läuft als Dienst dauerhaft im Hintergrund, holt die Daten aber nur in der Zeit ein, wo dies auch sinnvoll ist.
[/quote]
- udo1toni
- Beiträge: 15252
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Growatt <> Openhab
Doch, das sollte schon gehen. Es kann halt sein, dass da Steuerzeichen drin sind, die fälschlich ausgewertet werden (Anführungszeichen...)
erster Versuch: auf die Variable verzichten:
Achtung! Du musst die Indentation bachten!
erster Versuch: auf die Variable verzichten:
Code: Alles auswählen
client.publish("inverter/plant_info", api.plant_list())
client.publish("inverter/plant_detail", api.plant_detail(plant_id, Timespan.day, datetime.date.today()))
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 60
- Registriert: 17. Dez 2019 09:03
- Wohnort: Sisaket Thailand
Re: Growatt <> Openhab
Veruche mal die plant_info und plant_detail in einen String zu wandeln
Code: Alles auswählen
var1 = str((plant_info))
var2 = str((plant_detail))
client.publish("inverter/plant_info", plant_info)
client.publish("inverter/plant_detail", plant_detail)
## Kontrolliere immer auf dem Bildschirm was da rauskommt
print(plant_info)
print(plant_detail)