reserve85 / HoymilesZeroExport

Zero Export Script for Hoymiles Inverters using AhoyDTU / OpenDTU and Tasmota Smart Meter inferface / Shelly 3EM / SHRDZM / Emlog / ioBroker
GNU General Public License v3.0
135 stars 31 forks source link

Smartmeter mit OBIS-Code #12

Closed tqma1 closed 1 year ago

tqma1 commented 1 year ago

Hallo,

tolles Projekt und schon mal ein kräftiges Danke hierzu!

Ist es geplant auch Leseköpfe zu unterstützen welche mit sogenannten OBIS-Codes arbeiten?

1.7.0 ist der aktuelle Bezug 2.7.0 ist die aktuelle Einspeisung.

Mein Zähler liefert z.Bsp über eine REST API folgende Daten:

{ "1.8.0":"123456", "2.8.0":"123456", "3.8.1":"123456", "4.8.1":"123456", "1.7.0":"200", "2.7.0":"300", "3.7.0":"123456", "4.7.0":"123456", "1.128.0":"123456", "uptime":"0000:11:42:35" }

Abfragelink: http://IP_Adresse/getLastData?user=Benutzername&password=Passwort

Es gibt hier keine negativen Daten sondern man müsste beim Wert von 1.7.0 den Wert von 2.7.0 abziehen und so hätte man in meinem Beispiel eine aktuelle Einspeisung von 100 Watt.

Gruß, Thomas

reserve85 commented 1 year ago

Hi,

ja das wäre wahrscheinlich problemlos als weitere Variante möglich, ich müsste das nur implementieren. Das kann ich die nächsten Tage mal machen, am Wochenende siehts zeitlich aktuell schlecht aus. Du müsstest das dann aber testen?

Kannst du mir mal Infos dazu geben welches Modul das ist? Wie oft aktualisiert der Wert?

Gruß Tobias

tqma1 commented 1 year ago

Das wäre super! Testen würde ich selbstverständlich. Daten werden alle 2 Sekunden aktualisiert.

mein Modul ist von shrdzm, da in Österreich die Daten ja im Modul mit dem entsprechenden Key entschlüsselt werden müssen. Geht meines Wissens nach bei Tasmota (leider) noch nicht.

reserve85 commented 1 year ago

Ok, ich gebe dir bescheid.

Grüße nach Österreich, Tobias

Ollipop030 commented 1 year ago

Hallo @tqma1

habe auch keinen Tasmota Lesekopf, aber meiner gibt auch zwei Werte aus. Du kannst mit ein paar Änderungen das Ding ans Laufen bekommen:

HoymilesZeroExport_Config.ini:

[TASMOTA]

--- defines for Tasmota ---

TASMOTA_IP = IP Adresse

the following three constants describes how to navigate through the Tasmota-JSON

e.g. JSON_Result = {"StatusSNS":{"Time":"2023-02-28T12:49:49","SML":{"total_kwh":15011.575,"curr_w":-71}}}

TASMOTA_JSON_STATUS = StatusSNS

Prefix for Web UI and MQTT JSON payload

TASMOTA_JSON_PAYLOAD_MQTT_PREFIX = SML

Power-MQTT label

TASMOTA_JSON_POWER_MQTT_LABEL = 1.7.0 TASMOTA_JSON_POWER_E_MQTT_LABEL = 2.7.0

HoymilesZeroExport.py:

def GetPowermeterWattsTasmota(): url = f'http://{TASMOTA_IP}getLastData?user=Benutzername&password=Passwort' ParsedData = requests.get(url).json() Watts = int(ParsedData[TASMOTA_JSON_POWER_MQTT_LABEL] - ParsedData[TASMOTA_JSON_POWER_E_MQTT_LABEL]) logging.info("powermeter: %s %s",Watts," Watt") return int(Watts)

und weiter unten im Script unter # read config:

TASMOTA_JSON_STATUS = config.get('TASMOTA', 'TASMOTA_JSON_STATUS')

TASMOTA_JSON_PAYLOAD_MQTT_PREFIX = config.get('TASMOTA', 'TASMOTA_JSON_PAYLOAD_MQTT_PREFIX')

TASMOTA_JSON_POWER_MQTT_LABEL = config.get('TASMOTA', 'TASMOTA_JSON_POWER_MQTT_LABEL') TASMOTA_JSON_POWER_E_MQTT_LABEL = config.get('TASMOTA', 'TASMOTA_JSON_POWER_E_MQTT_LABEL')

tqma1 commented 1 year ago

Hallo @Ollipop030

Herzlichen Dank für Deinen Input, so wie das aussieht läuft das schon mit den von Dir ausgearbeiteten Änderungen!

reserve85 commented 1 year ago

Perfekt, so weit hab ich ehrlich gesagt gar nicht gedacht. Danke @Ollipop030 ich würde es trotzdem noch als neue Variante mit implementieren, sonst ist die Namensgebung verwirrend und das Script muss immer bei jeder neuen Version mit angepasst werden. Ich würde gerne die Einstellungen komplett in die config verfrachten.

tqma1 commented 1 year ago

Preisfrage: Habe gestern später noch auf python3.10 upgedated nun läuft das script nicht mehr. Führe ich "sudo journalctl -u HoymilesZeroExport.service -n 20000 -e -f" aus sehe das es Verweise auf python3.9/ z.Bsp: File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 565, in send Muss ich es nun neu installieren - oder?

reserve85 commented 1 year ago

Gute Frage, ich habe die 3.9 - kann schon sein dass mit 3.10 da was geändert wurde. Kannst du mal das LogOutput hier posten? Oder fehlt dir das request Modul für 3.10 (muss glaube ich extra installiert werden)?

Ollipop030 commented 1 year ago

Auf dem Pi läuft es bei mir auf 3.7.3. Es lief bei mir allerdings testweise aber auf einer Windows Maschine mit python 3.10.10 32bit. Zum Testen von Neuerungen führe ich das dort immer noch aus (natürlich auf dem PI erst beenden). Ich denke beim Update bei dir ist was schiefgelaufen. Evtl. fehlen irgendwelche Abhängigkeiten?

@reserve85 zu der geplanten Version hätte ich ein paar Anmerkungen:

  1. Wäre es in der *.ini nicht besser die ganze Domäne mit den json Daten anzugeben statt nur der IP? Hilft dann auch Leuten mit einem Powerfox Lesekopf. Wobei es dann ja auch nicht mehr Tasmota heißen müsste.

  2. In dem Beispiel habe ich ja die Variable TASMOTA_JSON_POWER_E_MQTT_LABEL = 2.7.0 hinzugefügt. Hier wäre es doch schlau, wenn man hier seinen Wert eintragen kann, und wenn der Lesekopf dafür keinen Wert ausgibt (wie bei Tasmota) den Wert "none" einträgt. Das Script sollte dann nur unterscheiden,

wenn Wert "none" dann "Watts = int(ParsedData[TASMOTA_JSON_POWER_MQTT_LABEL])",

sonst "Watts = int(ParsedData[TASMOTA_JSON_POWER_MQTT_LABEL] - ParsedData[TASMOTA_JSON_POWER_E_MQTT_LABEL])"

tqma1 commented 1 year ago

Habe die Installation nochmals gemacht, jetzt läuft es wieder - Danke

@reserve85

Hatte da gestern Abend eine Idee … Wäre es möglich eine zweite Instanz für die Einspeisung in der Nacht laufen zu lassen? Ich denke hierfür müsste man das zwingend über eine zweite DTU laufen lassen? Oder wäre hier die Aktivierung/Deaktivierung über Sonnen- Auf bzw. Untergang denkbar?

Schöne Grüße!

reserve85 commented 1 year ago

@Ollipop030 : danke für deinen Input, ich weiss auch nicht so recht wie man das möglichst "Variabel" gestalten kann. Problem ist halt, dass du es eigentlich immer irgendwie anpassen musst. Am einfachsten ist da wahrscheinlich noch die "Request" URL, da es ja meist nur eine Zeile ist. Allerdings kommt bei manchen dann auch noch HTTP Authentifizierung mit dazu. Problematischer sind die JSON Results, da die immer komplett unterschiedlich aufgebaut sind. Da musst du dann teilweise über mehrere Arrays springen und suchen. Keine Ahnung wie ich das variabel implementieren könnte. Meine Idee war daher, dass man die zwei Funktionen dann halt für unterschiedliche Geräte erweitert. Keine Ahnung ob das der richtige Weg ist. Ich bin auch kein Python Profi, programmiere berufsbedingt normalerweise Delphi...

@tqma1 : Was verstehst du unter Nachteinspeisung? Ich Frage die DTU´s ab ob die Inverter erreichbar sind, da ist das Sonnenaufgangsthema eigentlich dann schon mit abgedeckt. edit: Dank dir übrigens!

Ollipop030 commented 1 year ago

Ich verstehe die Idee von @tqma1 so:

Man trägt die Maximalleistung der WR ein (zB 600W), und dieser Wert wird dann nach Sonnenuntergang geändert auf 100W. Und dementsprechend morgens wieder hoch auch 600W. Dazu müsste man aber die Zeiten aus der DTU abfragen.

reserve85 commented 1 year ago

ok, versteh ich dennoch nicht so ganz: da wird doch auch nix mehr produziert? Wieso sollte das dann auf 100 begrenzt werden?

Ollipop030 commented 1 year ago

Ich schätze mal, dass er einen Akku an einem separaten Wechselrichter hat. Der WR wird tagsüber begrenzt, damit der Akku geladen werden kann und nicht einspeist, und erst Abends soll der WR dann einspeisen um die Grundlast zu decken.

curtosvienna commented 1 year ago

Denke auch an Akku Nulleinspeisung

reserve85 commented 1 year ago

Ahso, also wäre das dann ein zweiter WR der eben nachts "produziert" während der andere mit Panels ausgeschaltet ist? Ich glaube am einfachsten wäre es da zwei Scripte und zwei DTUs zu haben, getrennt jeweils eins für Tagbetrieb und eins für Nachtbetrieb. Das könnte man dann abends z.B. über ein Shellscript switchen ("stop Service Tagbetrieb -> start Service Nachtbetrieb") und hätte dadurch kein Programmieraufwand im Script selbst. Gibt ja dafür diverse API´s (z.B. auf die schnelle https://domes-finest.de/2014/09/17/linux-shell-script-sonnenaufgang-sonnenuntergang-bestimmen/)

Ollipop030 commented 1 year ago

So würde ich es auch machen, einfach zwei DTUs und zwei Dienste, wobei man den Dienst Tagesbetrieb gar nicht beenden müsste, da ja vom Dach eh nichts mehr kommt. Könnte man mit cron machen, wird dann aber komplizierter mit der Berechnung für Sonnenauf- und Untergang. Das über dieses Script zu lösen ist aber wohl der falsche Weg.

reserve85 commented 1 year ago

ich noch mal: @tqma1 : ich habe das SHRDZM Modul eingebunden, wäre super wenn du das mal laufen lassen könntest. Ist im DEV-Zweig (https://github.com/reserve85/HoymilesZeroExport/tree/dev_shrdzm)

@Ollipop030 : Die Option für 1.7.0 - 2.7.0 bei Tasmota habe ich auch mit reingenommen. Kannst dir es ja mal anschauen. Ich habe es mit einem boolean-flag umgesetzt ob es berechnet werden muss oder nicht.

Ollipop030 commented 1 year ago

Klappt iwie nicht:

2023-03-20 12:58:17 INFO Author: reserve85 / Script Version: 1.8 2023-03-20 12:58:17 INFO read config file: D:\Download\HoymilesZeroExport_Config.ini Traceback (most recent call last): File "D:\Download\HoymilesZeroExport.py", line 174, in config.read(str(Path.joinpath(Path(file).parent.resolve(), "HoymilesZeroExport_Config.ini"))) File "C:\Users\stasi2000\AppData\Local\Programs\Python\Python310-32\lib\configparser.py", line 699, in read self._read(fp, filename) File "C:\Users\stasi2000\AppData\Local\Programs\Python\Python310-32\lib\configparser.py", line 1098, in _read raise DuplicateOptionError(sectname, optname, configparser.DuplicateOptionError: While reading from 'D:\Download\HoymilesZeroExport_Config.ini' [line 86]: option 'serial_number' in section 'INVERTER_1' already exists

Ollipop030 commented 1 year ago

Bin mir hiermit aber nicht ganz sicher, soll das so aussehen?:

Power-MQTT label (the current power in Watt, positive (import more energy than export) or negative (export more energy than import)).

TASMOTA_JSON_POWER_MQTT_LABEL = curr_w

if your powermeter does NOT output the current power: you need to calculate it -> Power(W) = OBIS(1.7.0) - OBIS(2.7.0)

TASMOTA_JSON_POWER_CALCULATE = true

Power-MQTT Input label (positive active instantaneous power, e.g. OBIS Code 1.7.0)

TASMOTA_JSON_POWER_INPUT_MQTT_LABEL = Leistung170

Power-MQTT output label (negative active instantaneous power, e.g. OBIS Code 2.7.0)

TASMOTA_JSON_POWER_OUTPUT_MQTT_LABEL = Leistung270

reserve85 commented 1 year ago

ja, eigentlich schon. Sieht von der Meldung her so aus als hättest du irgend eine Zeile doppelt in der config (line 86)? bei mir läuft das so durch... Ansonsten schau ich nachher nochmal.

edit: evtl copy paste Fehler und zwei mal [INVERTER_1] definiert?

Ollipop030 commented 1 year ago

Gefunden. Habe die ganzen Semikolons in der ini beim zweiten Inverter stehen lassen. Läuft jetzt ersteinmal.

tqma1 commented 1 year ago

Ui, schnell mal etwas Arbeiten gegangen und ich komme mit dem lesen fast nicht mehr hinterher…

Richtig, Nachteinspeisung kommt von einem separates Wechselrichter am Akku, daher die Idee mit der zweiten Instanz. Werde morgen mal die Testversion installieren und hoffen das die Sonne ordentlich strahlt :-)

tqma1 commented 1 year ago

ich noch mal: @tqma1 : ich habe das SHRDZM Modul eingebunden, wäre super wenn du das mal laufen lassen könntest. Ist im DEV-Zweig (https://github.com/reserve85/HoymilesZeroExport/tree/dev_shrdzm)

Sollte das nicht ein zip-File zum installieren nach Anleitung sein oder muss ich da eine Datei austauschen?

Ollipop030 commented 1 year ago

Du brauchst die nur die .ini und .py aus dem dev Branch. Eben wieder anpassen, so wie du sie brauchst und starten.

reserve85 commented 1 year ago

kannst auch rechts oben auf "Code" und "Download ZIP" klicken.

tqma1 commented 1 year ago

So installiert und getestet - regelt leider nur nicht auf die eingestellte Einspeisung von 75 Watt schreibt nur das Inverter 0 reachable: True sollte das auch für den Smartmeter kommen?

reserve85 commented 1 year ago

Weil Wetter wie in Frankfurt? Oder geht was nicht?

tqma1 commented 1 year ago

Sonnenschein pur!

Output:

Mär 21 15:20:01 Debian-Server python3[1118]: 2023-03-21 15:20:01 INFO Author: reserve85 / Script Version: 1.9 Mär 21 15:20:01 Debian-Server python3[1118]: 2023-03-21 15:20:01 INFO read config file: /home/user/HoymilesZeroExport/HoymilesZeroExport_Config.ini Mär 21 15:20:01 Debian-Server python3[1118]: 2023-03-21 15:20:01 INFO Inverter 0 reachable: True Mär 21 15:20:01 Debian-Server python3[1118]: 2023-03-21 15:20:01 INFO setting new limit to 800 Watt Mär 21 15:20:01 Debian-Server python3[1118]: 2023-03-21 15:20:01 INFO Inverter 0: setting new limit from 0 Watt to 800 Watt Mär 21 15:20:11 Debian-Server python3[1118]: 2023-03-21 15:20:11 INFO Inverter 0 reachable: True Mär 21 15:20:31 Debian-Server python3[1118]: 2023-03-21 15:20:31 INFO Inverter 0 reachable: True Mär 21 15:20:51 Debian-Server python3[1118]: 2023-03-21 15:20:51 INFO Inverter 0 reachable: True Mär 21 15:21:11 Debian-Server python3[1118]: 2023-03-21 15:21:11 INFO Inverter 0 reachable: True Mär 21 15:21:31 Debian-Server python3[1118]: 2023-03-21 15:21:31 INFO Inverter 0 reachable: True Mär 21 15:21:52 Debian-Server python3[1118]: 2023-03-21 15:21:52 INFO Inverter 0 reachable: True Mär 21 15:22:12 Debian-Server python3[1118]: 2023-03-21 15:22:12 INFO Inverter 0 reachable: True

tqma1 commented 1 year ago

Nach einem Neustart kommen nachfolgende Fehlermeldungen:

tqma1 commented 1 year ago

Mär 21 15:52:21 Debian-Server systemd[1]: HoymilesZeroExport.service: Main process exited, code=exited, status=1/FAILURE Mär 21 15:52:21 Debian-Server systemd[1]: HoymilesZeroExport.service: Failed with result 'exit-code'. Mär 21 15:52:21 Debian-Server systemd[1]: HoymilesZeroExport.service: Scheduled restart job, restart counter is at 4. Mär 21 15:52:21 Debian-Server systemd[1]: Stopped HoymilesZeroExport Service. Mär 21 15:52:21 Debian-Server systemd[1]: Started HoymilesZeroExport Service. Mär 21 15:52:21 Debian-Server python3[616]: 2023-03-21 15:52:21 INFO Author: reserve85 / Script Version: 1.9 Mär 21 15:52:21 Debian-Server python3[616]: 2023-03-21 15:52:21 INFO read config file: /home/user/HoymilesZeroExport/HoymilesZeroExport_Config.ini Mär 21 15:52:21 Debian-Server python3[616]: Traceback (most recent call last): Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 169, in _new_conn Mär 21 15:52:21 Debian-Server python3[616]: conn = connection.create_connection( Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 96, in create_connection Mär 21 15:52:21 Debian-Server python3[616]: raise err Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 86, in create_connection Mär 21 15:52:21 Debian-Server python3[616]: sock.connect(sa) Mär 21 15:52:21 Debian-Server python3[616]: OSError: [Errno 101] Network is unreachable Mär 21 15:52:21 Debian-Server python3[616]: During handling of the above exception, another exception occurred: Mär 21 15:52:21 Debian-Server python3[616]: Traceback (most recent call last): Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 699, in urlopen Mär 21 15:52:21 Debian-Server python3[616]: httplib_response = self._make_request( Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 394, in _make_request Mär 21 15:52:21 Debian-Server python3[616]: conn.request(method, url, httplib_request_kw) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 234, in request Mär 21 15:52:21 Debian-Server python3[616]: super(HTTPConnection, self).request(method, url, body=body, headers=headers) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3.9/http/client.py", line 1255, in request Mär 21 15:52:21 Debian-Server python3[616]: self._send_request(method, url, body, headers, encode_chunked) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3.9/http/client.py", line 1301, in _send_request Mär 21 15:52:21 Debian-Server python3[616]: self.endheaders(body, encode_chunked=encode_chunked) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3.9/http/client.py", line 1250, in endheaders Mär 21 15:52:21 Debian-Server python3[616]: self._send_output(message_body, encode_chunked=encode_chunked) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3.9/http/client.py", line 1010, in _send_output Mär 21 15:52:21 Debian-Server python3[616]: self.send(msg) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3.9/http/client.py", line 950, in send Mär 21 15:52:21 Debian-Server python3[616]: self.connect() Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 200, in connect Mär 21 15:52:21 Debian-Server python3[616]: conn = self._new_conn() Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 181, in _new_conn Mär 21 15:52:21 Debian-Server python3[616]: raise NewConnectionError( Mär 21 15:52:21 Debian-Server python3[616]: urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f3bdffb05e0>: Failed to establish a new connection: [Errno 101] Network is unreachable Mär 21 15:52:21 Debian-Server python3[616]: During handling of the above exception, another exception occurred: Mär 21 15:52:21 Debian-Server python3[616]: Traceback (most recent call last): Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 489, in send Mär 21 15:52:21 Debian-Server python3[616]: resp = conn.urlopen( Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 755, in urlopen Mär 21 15:52:21 Debian-Server python3[616]: retries = retries.increment( Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 574, in increment Mär 21 15:52:21 Debian-Server python3[616]: raise MaxRetryError(_pool, url, error or ResponseError(cause)) Mär 21 15:52:21 Debian-Server python3[616]: urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.1.4', port=80): Max retries exceeded with url: /api/index (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f3bdffb05e0>: Failed to establish a new connection: [Errno 101] Network is unreachable')) Mär 21 15:52:21 Debian-Server python3[616]: During handling of the above exception, another exception occurred: Mär 21 15:52:21 Debian-Server python3[616]: Traceback (most recent call last): Mär 21 15:52:21 Debian-Server python3[616]: File "/home/user/HoymilesZeroExport/HoymilesZeroExport.py", line 228, in Mär 21 15:52:21 Debian-Server python3[616]: if GetHoymilesAvailable(): Mär 21 15:52:21 Debian-Server python3[616]: File "/home/user/HoymilesZeroExport/HoymilesZeroExport.py", line 69, in GetHoymilesAvailable Mär 21 15:52:21 Debian-Server python3[616]: GetHoymilesAvailable = GetHoymilesAvailable and GetHoymilesAvailableAhoy(i) Mär 21 15:52:21 Debian-Server python3[616]: File "/home/user/HoymilesZeroExport/HoymilesZeroExport.py", line 60, in GetHoymilesAvailableAhoy Mär 21 15:52:21 Debian-Server python3[616]: ParsedData = requests.get(url).json() Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/api.py", line 73, in get Mär 21 15:52:21 Debian-Server python3[616]: return request("get", url, params=params, kwargs) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/api.py", line 59, in request Mär 21 15:52:21 Debian-Server python3[616]: return session.request(method=method, url=url, kwargs) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 587, in request Mär 21 15:52:21 Debian-Server python3[616]: resp = self.send(prep, send_kwargs) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 701, in send Mär 21 15:52:21 Debian-Server python3[616]: r = adapter.send(request, **kwargs) Mär 21 15:52:21 Debian-Server python3[616]: File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 565, in send Mär 21 15:52:21 Debian-Server python3[616]: raise ConnectionError(e, request=request) Mär 21 15:52:21 Debian-Server python3[616]: requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.4', port=80): Max retries exceeded with url: /api/index (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f3bdffb05e0>: Failed to establish a new connection: [Errno 101] Network is unreachable')) Mär 21 15:52:21 Debian-Server systemd[1]: HoymilesZeroExport.service: Main process exited, code=exited, status=1/FAILURE Mär 21 15:52:21 Debian-Server systemd[1]: HoymilesZeroExport.service: Failed with result 'exit-code'. Mär 21 15:52:22 Debian-Server systemd[1]: HoymilesZeroExport.service: Scheduled restart job, restart counter is at 5. Mär 21 15:52:22 Debian-Server systemd[1]: Stopped HoymilesZeroExport Service. Mär 21 15:52:22 Debian-Server systemd[1]: HoymilesZeroExport.service: Start request repeated too quickly. Mär 21 15:52:22 Debian-Server systemd[1]: HoymilesZeroExport.service: Failed with result 'exit-code'. Mär 21 15:52:22 Debian-Server systemd[1]: Failed to start HoymilesZeroExport Service.

reserve85 commented 1 year ago

sieht aus als erreicht er AHOY nicht? Kannst du das prüfen und mir die Config zeigen (gerne auch private message falls du da ne seriennummer oder so drin hast)?

tqma1 commented 1 year ago

Den Verdacht hatte ich auch schon da ich hier die aktuelle Entwicklerversion 0.5.104 eingespielt habe. Bin nun auf die letzens verwendete 0.5.93 zurück - keine Änderung Du meinst die json Settings?

tqma1 commented 1 year ago

warum gibt er immer noch python3.9/ pfade aus ? Habe ja auf python3.10 upgedated - liegt hier der Fehler?

reserve85 commented 1 year ago

Gute Frage, bei mir lief es in Windows und debian aber mit 3.9… ne ich meine die config von mir.

tqma1 commented 1 year ago
SELECT_DTU]
# --- define your DTU (only one) ---
USE_AHOY = true
USE_OPENDTU = false

[SELECT_POWERMETER]
# --- define your Powermeter (only one) ---
USE_TASMOTA = false
USE_SHELLY_3EM = false
USE_SHRDZM = true

[AHOY_DTU]
# --- defines for AHOY-DTU ---
# in settings/inverter set interval to 6 seconds!
AHOY_IP = 192.168.X.YY

[OPEN_DTU]
# --- defines for OPEN-DTU ---
OPENDTU_IP = xxx.xxx.xxx.xxx
OPENDTU_USER =
OPENDTU_PASS =

[TASMOTA]
# --- defines for Tasmota ---
TASMOTA_IP = 192.168.10.90
# the following three constants describes how to navigate through the Tasmota-JSON
# e.g. JSON_Result = {"StatusSNS":{"Time":"2023-02-28T12:49:49","SML":{"total_kwh":15011.575,"curr_w":-71}}}
TASMOTA_JSON_STATUS = StatusSNS
# Prefix for Web UI and MQTT JSON payload
TASMOTA_JSON_PAYLOAD_MQTT_PREFIX = SML
# Power-MQTT label (the current power in Watt, positive (import more energy than export) or negative (export more energy than import)).
TASMOTA_JSON_POWER_MQTT_LABEL = curr_w
# if your powermeter does NOT output the current power: you need to calculate it -> Power(W) = OBIS(1.7.0) - OBIS(2.7.0)
TASMOTA_JSON_POWER_CALCULATE = FALSE
# Power-MQTT Input label (positive active instantaneous power, e.g. OBIS Code 1.7.0)
TASMOTA_JSON_POWER_INPUT_MQTT_LABEL =
# Power-MQTT output label (negative active instantaneous power, e.g. OBIS Code 2.7.0)
TASMOTA_JSON_POWER_OUTPUT_MQTT_LABEL =

[SHELLY_3EM]
# --- defines for Shelly ---
SHELLY_IP = xxx.xxx.xxx.xxx

[SHRDZM]
# --- defines for SHRDZM Smartmeter Modul ---
SHRDZM_IP = 192.168.X.ZZ
SHRDZM_USER = USER_DATA
SHRDZM_PASS = USER_PW

[COMMON]
# Number of Inverters
INVERTER_COUNT = 1
# max difference in percent between SetpointLimit change to approximate the power to new setpoint
SLOW_APPROX_LIMIT_IN_PERCENT = 20
# interval time for setting limit to Hoymiles
LOOP_INTERVAL_IN_SECONDS = 20
# delay time after sending limit to Hoymiles Inverter
SET_LIMIT_DELAY_IN_SECONDS = 5
# delay time after sending limit to Hoymiles Inverter when using more than one Inverter
SET_LIMIT_DELAY_IN_SECONDS_MULTIPLE_INVERTER = 2
# polling interval for powermeter (must be < LOOP_INTERVAL_IN_SECONDS)
POLL_INTERVAL_IN_SECONDS = 1
# when powermeter > 0: (True): always jump to maxLimit of inverter; (False): increase limit based on previous limit
JUMP_TO_MAX_LIMIT_ON_GRID_USAGE = true
# max difference between Limit and real output power in % of HOY_MAX_WATT (100 = disabled)
MAX_DIFFERENCE_BETWEEN_LIMIT_AND_OUTPUTPOWER = 10

[CONTROL]
# --- global defines for control behaviour ---
# this is the target power for powermeter in watts
POWERMETER_TARGET_POINT = -75
# this is the tolerance (pos and neg) around the target point. in this range no adjustment will be set
POWERMETER_TOLERANCE = 25
# this is the max power to regulate the limit. if your powermeter is above this point, the limit jumps to 100% (when JUMP_TO_MAX_LIMIT_ON_GRID_USAGE is set to TRUE). Must be higher than POWERMETER_TARGET_POINT + POWERMETER_TOLERANCE
POWERMETER_MAX_POINT = 0

# List of INVERTERS, based on COMMON/COUNT
[INVERTER_1]
# Hoymiles Inverter Serial Number
SERIAL_NUMBER = 114181814616
# maximum limit in watts (100%)
HOY_MAX_WATT = 800
# minimum limit in percent, e.g. 5%
HOY_MIN_WATT_IN_PERCENT = 5

; [INVERTER_2]
; # Hoymiles Inverter Serial Number
; SERIAL_NUMBER = xxxxxxxxxxxx
; # maximum limit in watts (100%)
; HOY_MAX_WATT = 600
; # minimum limit in percent, e.g. 5%
; HOY_MIN_WATT_IN_PERCENT = 5

; [INVERTER_3]
; # Hoymiles Inverter Serial Number
; SERIAL_NUMBER = xxxxxxxxxxxx
; # maximum limit in watts (100%)
; HOY_MAX_WATT = 300
; # minimum limit in percent, e.g. 5%
; HOY_MIN_WATT_IN_PERCENT = 5
; #...

# grid power
#    ...
#     |
#     | -------> jump limit to HOY_MAX_WATT if (JUMP_TO_MAX_LIMIT_ON_GRID_USAGE = TRUE), else: increasing limit <-------
#     |
#   [0W]      [POWERMETER_MAX_POINT]
#     |
#     | -------> increasing limit <-------
#     |
#  [-50W]     [POWERMETER_TARGET_POINT + POWERMETER_TOLERANCE]
#     |
#     | -------> no limit change between -100W ... -50W <-------
#     |
#  [-75W]     [POWERMETER_TARGET_POINT]
#     |
#     | -------> no limit change between -100W ... -50W <-------
#     |
#  [-100W]    [POWERMETER_TARGET_POINT - POWERMETER_TOLERANCE]
#     |
#     | -------> decreasing limit <-------
#     |
#    ...
reserve85 commented 1 year ago

Und die IP ist korrekt? HTTPConnectionPool(host='192.168.1.4', port=80): Max retries exceeded with url: /api/index (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f3bdffb05e0>: Failed to establish a new connection: [Errno 101] Network is unreachable'))

Für mich sieht das so aus als kann er Ahoy nicht abfragen.

tqma1 commented 1 year ago

IP ist definitiv korrekt

reserve85 commented 1 year ago

Kannst du es mal in Windows versuchen? Da kannst du es debuggen wo er genau rausfliegt…

reserve85 commented 1 year ago

Oder kannst du die AHOY IP mal von dem Debian Server pingen ob der erreichbar ist? Ist definitiv ein Fehler bei GetHoymilesAvailable... Kann ich auch nachstellen wenn ich eine falsche IP eintrage oder eine die es nicht gibt.

tqma1 commented 1 year ago

Anpingen ist absolut stressfrei: ca. 2,5ms bis 4ms im Schnitt

tqma1 commented 1 year ago

Aber dann sollte doch auch nie die Meldung kommen: Inverter reachable true

reserve85 commented 1 year ago

ja ich schau grad den zweiten eintrag an von dir, da kommt das auch nicht? https://github.com/reserve85/HoymilesZeroExport/issues/12#issuecomment-1477986401 oder was ist jetzt dein output?

edit: ansonsten müsste ich evtl. mal mit teamviewer oder so bei dir debuggen, falls das möglich ist (z.B. mit Visual Code, falls du das installiert hast)

reserve85 commented 1 year ago

du könntest auch das hier noch zum Testen in den Code einfügen, evtl hilft es:

direkt nach der Zeile SLOW_APPROX_LIMIT = int(GetMaxWattFromAllInverters() * config.getint('COMMON', 'SLOW_APPROX_LIMIT_IN_PERCENT') / 100) das hier einfügen und das script dann mal starten

try:
    # Test
    logging.info("---Startup-Test---")
    logging.info("GetHoymilesAvailable")
    GetHoymilesAvailable()
    logging.info("GetPowermeterWatts")
    GetPowermeterWatts()
    logging.info("GetHoymilesActualPower")
    GetHoymilesActualPower()
    logging.info("SetLimit")
    SetLimit(GetMaxWattFromAllInverters())
    logging.info("---Startup-Test complete---")
except Exception as e:
    if hasattr(e, 'message'):
        print(e.message)
    else:
        print(e)
tqma1 commented 1 year ago

Habe den Teil eingefügt und das Script manuell gestartet:

Mär 22 16:19:05 Debian-Server systemd[1]: Started HoymilesZeroExport Service. Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO Author: reserve85 / Script Version: 1.9 Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO read config file: /home/user/HoymilesZeroExport/HoymilesZeroExport_Config.ini Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO ---Startup-Test--- Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO GetHoymilesAvailable Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO Inverter 0 reachable: True Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO GetPowermeterWatts Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO Inverter 0 reachable: True Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO setting new limit to 800 Watt Mär 22 16:19:05 Debian-Server python3[805]: 2023-03-22 16:19:05 INFO Inverter 0: setting new limit from 0 Watt to 800 Watt Mär 22 16:19:15 Debian-Server python3[805]: 2023-03-22 16:19:15 INFO Inverter 0 reachable: True Mär 22 16:19:36 Debian-Server python3[805]: 2023-03-22 16:19:36 INFO Inverter 0 reachable: True

Starte ich allerdings den Server neu und er startet selbst das Script erhalte ich nach Eingabe von: sudo journalctl -u HoymilesZeroExport.service -n 20000 -e -f eine Unmenge von Fehlermeldungen ....

reserve85 commented 1 year ago

OK, ein Schritt weiter: vom Powermeter kommt nix an. Bitte die Funktion mal ersetzen:

def GetPowermeterWattsShrdzm():
    logging.info("GetPowermeterWattsShrdzm")
    logging.info(f'http://{SHRDZM_IP}/getLastData?user={SHRDZM_USER}&password={SHRDZM_PASS}')
    url = f'http://{SHRDZM_IP}/getLastData?user={SHRDZM_USER}&password={SHRDZM_PASS}'
    ParsedData = requests.get(url).json()
    logging.info(ParsedData)
    logging.info(ParsedData['1.7.0'])
    logging.info(ParsedData['2.7.0'])
    Watts = int(ParsedData['1.7.0'] - ParsedData['2.7.0'])
    logging.info("powermeter: %s %s",Watts," Watt")
    return int(Watts)
tqma1 commented 1 year ago

Zählerdaten sind sichtbar:

Mär 22 16:58:35 Debian-Server systemd[1]: Started HoymilesZeroExport Service. Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO Author: reserve85 / Script Version: 1.9 Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO read config file: /home/user/HoymilesZeroExport/HoymilesZeroExport_Config.ini Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO ---Startup-Test--- Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO GetHoymilesAvailable Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO Inverter 0 reachable: True Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO GetPowermeterWatts Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO GetPowermeterWattsShrdzm Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO http://192.168.1.8/getLastData?user=USER&password=PASSWORT Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO {'1.8.0': '18334860', '2.8.0': '6849', '3.8.1': '60184', '4.8.1': '4749016', '1.7.0': '357', '2.7.0': '0', '3.7.0': '0', '4.7.0': '97', '1.128.0': '0', 'uptime': '0000:13:44:56'} Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO 357 Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO 0 Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO Inverter 0 reachable: True Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO setting new limit to 800 Watt Mär 22 16:58:35 Debian-Server python3[870]: 2023-03-22 16:58:35 INFO Inverter 0: setting new limit from 0 Watt to 800 Watt Mär 22 16:58:45 Debian-Server python3[870]: 2023-03-22 16:58:45 INFO Inverter 0 reachable: True Mär 22 16:58:45 Debian-Server python3[870]: 2023-03-22 16:58:45 INFO GetPowermeterWattsShrdzm Mär 22 16:58:45 Debian-Server python3[870]: 2023-03-22 16:58:45 INFO http://192.168.1.8/getLastData?user=USER&password=PASSWORT Mär 22 16:58:46 Debian-Server python3[870]: 2023-03-22 16:58:46 INFO {'1.8.0': '18334862', '2.8.0': '6849', '3.8.1': '60184', '4.8.1': '4749017', '1.7.0': '364', '2.7.0': '0', '3.7.0': '0', '4.7.0': '96', '1.128.0': '0', 'uptime': '0000:13:45:09'}

reserve85 commented 1 year ago

diese Zeile ersetzen: Watts = int(ParsedData['1.7.0'] - ParsedData['2.7.0']) durch Watts = int(int(ParsedData['1.7.0']) - int(ParsedData['2.7.0']))

tqma1 commented 1 year ago

sieht jetzt ganz gut aus:

Mär 22 17:14:27 Debian-Server systemd[1]: Started HoymilesZeroExport Service. Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO Author: reserve85 / Script Version: 1.9 Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO read config file: /home/user/HoymilesZeroExport/HoymilesZeroExport_Config.ini Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO ---Startup-Test--- Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO GetHoymilesAvailable Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO Inverter 0 reachable: True Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO GetPowermeterWatts Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO GetPowermeterWattsShrdzm Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO http://192.168.1.8/getLastData?user=USER&password=PASSWORT Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO {'1.8.0': '18334984', '2.8.0': '6849', '3.8.1': '60184', '4.8.1': '4749042', '1.7.0': '328', '2.7.0': '0', '3.7.0': '0', '4.7.0': '97', '1.128.0': '0', 'uptime': '0000:14:00:51'} Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO 328 Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO 0 Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO powermeter: 328 Watt Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO GetHoymilesActualPower Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO Inverter 0 power producing: 29 Watt Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO SetLimit Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO setting new limit to 800 Watt Mär 22 17:14:28 Debian-Server python3[1049]: 2023-03-22 17:14:28 INFO Inverter 0: setting new limit from 0 Watt to 800 Watt Mär 22 17:14:33 Debian-Server python3[1049]: 2023-03-22 17:14:33 INFO ---Startup-Test complete--- Mär 22 17:14:33 Debian-Server python3[1049]: 2023-03-22 17:14:33 INFO Inverter 0 reachable: True Mär 22 17:14:33 Debian-Server python3[1049]: 2023-03-22 17:14:33 INFO setting new limit to 800 Watt Mär 22 17:14:33 Debian-Server python3[1049]: 2023-03-22 17:14:33 INFO Inverter 0: setting new limit from 800 Watt to 800 Watt Mär 22 17:14:43 Debian-Server python3[1049]: 2023-03-22 17:14:43 INFO Inverter 0 reachable: True Mär 22 17:14:43 Debian-Server python3[1049]: 2023-03-22 17:14:43 INFO GetPowermeterWattsShrdzm Mär 22 17:14:43 Debian-Server python3[1049]: 2023-03-22 17:14:43 INFO http://192.168.1.8/getLastData?user=USER&password=PASSWORT Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO {'1.8.0': '18334985', '2.8.0': '6849', '3.8.1': '60184', '4.8.1': '4749043', '1.7.0': '588', '2.7.0': '0', '3.7.0': '0', '4.7.0': '97', '1.128.0': '0', 'uptime': '0000:14:01:07'} Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO 588 Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO 0 Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO powermeter: 588 Watt Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO setting new limit to 800 Watt Mär 22 17:14:44 Debian-Server python3[1049]: 2023-03-22 17:14:44 INFO Inverter 0: setting new limit from 800 Watt to 800 Watt

reserve85 commented 1 year ago

perfekt. SORRY! ich konnte das schlecht testen. Ich übernehme den Bugfix in der nächsten Version mit in den Quellcode. Du kannst im Prinzip vorerst das Originalfile nehmen und nur die eine Zeile austauschen. Danke für deine Geduld!