Das Problem saß mal wieder vor dem Bildschirm…hat unter erweitert noch eine alte Konfig drin. Hab den Broker komplett neu angelegt und siehe da…es geht. Hab jetzt alles auf EMQX umgestellt und alles läuft. Danke für die Unterstützung.
So leider auch das gleiche Phenomen mit löschen der Authentification. Ich glaub wirklich dass es am Cloudflare hängt, da auch local nicht einmal Home Assistant erreichbar ist.
So Cloudflare Addon deaktiviert und siehe da wieder HA ist Lokal erreichbar und Schwippsers Script läuft ohne Fehler:
Ist im EMQX sichtbar: iot/A8yh63/dEhqpWgY/# emqx@homeassistant.local
Jetzt zum nächsten Step, kann man das PYthon scirpt auch auf Homeassitant laufen lassen wie mit HACS->Python Script Pro ?
mit Configuration Yaml:
python_script:
requirements:
- paho-mqtt>=2.0.0
Weil dann bräuchte ich keinen zusätzlichen Laptop oder Prox… oder sonst was und kann es im HA OS am Raspy ausführen. → eigentlich wäre das dann schon was für eine HACS erweiterung wenn das geht…
Moin,
das ist auch mein Problem.
Aktuell starte ich das Skript manuell auf meinem HA über HACS im pyscript Terminal und es läuft.
Automatisiert habe ich es noch nicht starten können.
Könntest du mal deine Code posten ?
Ich habe das original Skript in Verwendung ohne Änderung.
reinhard-brandstaedter (Reinhard Weber (Brandstaedter)) · GitHub
Meine Vorgehensweise:
In HACS PYScript installieren und anschließend im Python Terminal Paho.mqtt installieren (Das Python Terminal habe ich im StudioCodeServer “gefunden” und mir eingeblendet.)
Installation:
git clone GitHub - eclipse-paho/paho.mqtt.python: paho.mqtt.python
cd paho.mqtt.python
pip install -e .
Danach läuft das original Mapping Skript (liegt in HA unter Config/pscript)
manuell starten ➜ python solarflow-topic-mapper.py
Starten bei Systemstart des HA als Aktion oder ähnliches ist mir noch nicht gelungen. Suche aucvh nach einer Lösung.
Viel Erfolg ![]()
@Logan1728
Vielen Dank für Deinen Beitrag.
Genau so etwa suchen wir. Wir haben seit einem Jahr ein “dummes” BKW installiert. Der Hyper 2000 ist noch nicht gekauft, da wir erst abklären wollen, ob das gewünschte auch funktioniert.
Kann mit der beschriebenen Lösung die Hyper 2000 während der teuren Phasen am Tag den Stromzähler durch laden und entladen auf ca 0 ausregeln (mit Shelly pro 3EM und zendure Smart-CT-Modus) und wenn der Strompreis niedrig ist (beim Tarif octopus Go zwischen 0 uns 5 Uhr) den Akku laden.
Wenn ich zendure richtig verstanden habe, muss man dazu den Modus zu den richtigen Zeitpunkten manuell in der App umschalten, was über die Bordmittel nicht zeitgesteuert geht.
Kann die von dir beschriebene Lösung unseren Wunsch täglich automatisch leisten?
Viele Grüße
Ich versuche meine Lösung hier einmal so gut wie möglich zu beschreiben.
Über die App von Zendure ist leider eine komplette Automatisierung aktuell nicht möglich, dort muss jeden Tag an den aktuellen Strompreis angepasst werden.
Ich realisiere dies wie folgt im HASS.
- Börsenstrompreis wird über EPEX abgerufen
- für jede Stunde am Tag und am Folgetag habe ich einen Helfer angelegt, welcher den Preis der jeweiligen Stunde speichert
- zusätzlich eine Helfer, welcher mir die günstigsten Zeiträume filtert
Folgende Automatisierungen habe ich mir angelegt:
- laden/entladen nach Zeitfenster unter/über Preis
- Entladeleistung anpassen
- heutiger Strompreis pro Stunde → Helfer
- morgiger Strompreis pro Strunde → Helfer
Um die Einspeisung in das Hausnetz zu regulieren haben ich in der template.yaml mir einen Sensor (max. Ausgangsleistung) angelegt. Dort habe ich ebenfalls Sensoren für die günstigen Zeitfenster.
Es gibt natürlich Schwankungen bei der Entladung, diese gab es aber über Zendure selbst auch.
Gruß
@Logan1728
Vielen Dank für Deine Antwort. diese hilft mir sehr.
Was mir noch nicht ganz klar ist:
Nutzt Du einen Smart-Meter (z.B. Shelly pro 3EM) um die Entladeleistung dem Hausverbrauch anzupassen?
Nutzt Du dafür den “Smart-CT-Mode” des Zendure?
Falls nein, warum hast Du das in HA selbst nachgebaut?
Viele Grüße
Ich nutze eine Shelly pro 3EM, welchen ich über MQTT auslese. Mein Zendure ist völlig von der Zendurecloud getrennt, dadurch kann ich keinerlei Funktionen in der App nutzen.
Somit bleibt nur der Weg über den Docker/HA.
In der Konfiguguration des Doker habe ich den Shelly wie folgt eingetragen.
[shellyem3]
# The MQTT base topic your Shelly 3EM (Pro) is posting it's telemetry data to
# Note: you have to configure your Shelly to use MQTT
base_topic = shellypro3em-home/status/em:0
#rapid_change_diff = 500
zero_offset = 20
[smartmeter]
base_topic = shellypro3em-home/status/em:0
# if the published value at the base_topic is a JSON type then these accessors are used to get the power values
# e.g. if Smartmeter reader posts { "Power": {"Power_curr": 120, "Total_in": 12345.6} }
cur_accessor = total_act_power
total_accessor = total_aprt_power
zero_offset = 20
Nach dieser Konfig habe ich mich gerichtet.
https://github.com/reinhard-brandstaedter/solarflow-control/blob/master/src/config.ini
Im HA sind die Möglichkeiten für die automatische Steuerung viel größer als in der aktuellen App von Zendure. Ich habe dazu auch den Support einmal angeschrieben…es wurde wohl an die Entwicklung weiter gegeben.
Gruß
So ich bin nun endlich weiter gekommen, und schaffe es ohne Raspi zero oder sonstwas über WLAN und EMQX MQTT Broker direkt Befehle über Wifi an den Hub mit HomeAssitant zu senden. Und die Daten zu empfangen und zu visualisieren. Ohne irgendein PY-Script dazwischen. PY-Script hab ich nur gebraucht um den Hub zu entkoppeln und die Verbindung zwischen Broker und HUB einzustellen. Eh schon hundert mal hier beschrieben, aber als völliger Newbie hab ich doch richtig lange gebraucht. Ich hab nen Raspi Zero 2W geholt mit Bookworm lite und über SSH mal die Grundeinstellungen vorgenommen:
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo reboot
sudo apt update
sudo apt install git -y
git clone https://github.com/reinhard-brandstaedter/solarflow-bt-manager.git
cd ~/solarflow-bt-manager/src
sudo apt install python3.11 python3.11-venv python3.11-distutils python3.11-dev -y
sudo apt install python3-pip -y
pip3 install bleak paho-mqtt
Danach hab ich die Einstellungen für das entkoppeln gemacht wobei man in set_enviroment.sh nicht wirklich alles braucht:
nano set_env.sh # ein File mit den Passwoertern und EInstellungen: Inhalt:
#!/bin/bash
export WIFI_PWD="Dein Wlan Passwort"
export WIFI_SSID="Deine WLAN SSID"
export SF_DEVICE_ID="Deine Zendure Hub ID"
export SF_DEVICE_IPW="Hub Passwort" # braucht man glaub ich nicht
export SF_DEVICE_SN="Zendure Hub Seriennummer" # braucht man glaub ich nicht
export SF_PRODUCT_ID="A8yh63" #für Hub2000
export MQTT_USER="braucht man nicht" # weil man EMQX eh du die Sachen ausschaltet und anonym einloggen lässt
export MQTT_PWD="braucht man auch eigentlich nicht"
export MQTT_HOST="192.168.0.100" #wichtig HA (MQTT Broker)IP Adresse eintragen
export MQTT_PORT="1883" #Port von MQTT Broker eintragen
Danach ausführbar machen und ausführen, fertig
source ./set_env.sh # in die Shell laden
source venv/bin/activate # ab in den Bereich wo man die das PY Script läuft.
python3 solarflow-bt-manager.py -i -b "$MQTT_HOST" # <- damit müsste man ihn schon sehen im EMQX und kann dort weiter machen
python3 solarflow-bt-manager.py -d -w "$WIFI_SSID" -b "$MQTT_HOST" #<- wenn man den Datenlivestream mal anschauen will.
Alles als völliger Newbie gemacht, also wenn ihr noch Fehler findet dürft ihr mir gerne Bescheid sagen, dann verbessere ich es noch.
Wenn ich mit meiner adaptierten YAML fertig bin werd ichs auch herein posten, damit keiner so lange wie ich ( 3 Wochen, und 8 neuinstallationen (weil ich unbedingt alles auf dem Raspi Zero zum laufen bringen wollte)) braucht.
Wie händelst du das mit den Topics? Die MQTT- Daten vom Solarflow musst du doch irgendwie “übersetzen”. Also das was das Topic-Mapper-Script macht. Wie machst du das?
Ich hab mir das Angeschaut:
- name: "Zendure Battery Level"
state_topic: "/A8yh63/d--deine ID-Y/properties/report"
value_template: "{{ value_json.properties.electricLevel if value_json.properties is defined else None }}"
unit_of_measurement: "%"
unique_id: "d--deine ID-Y_electricLevel"
device:
identifiers: ["d--deine ID-Y"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
- name: "Zendure Event Electric"
state_topic: "/A8yh63/d--deine ID-Y/event/device"
value_template: "{{ value_json.data.electric if value_json.data is defined else None }}"
unique_id: "d--deine ID-Y_electric"
device:
identifiers: ["d--deine ID-Y"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
- name: "Zendure Output Home Power"
state_topic: "/A8yh63/d--deine ID-Y/properties/report"
value_template: "{{ value_json.properties.outputHomePower if value_json.properties is defined else None }}"
unit_of_measurement: "W"
unique_id: "d--deine ID-Y_outputHomePower"
device:
identifiers: ["d-deine ID-Y"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
- name: "Zendure Output Home Power Cycle"
state_topic: "/A8yh63/d--deine ID-Y/properties/report"
value_template: "{{ value_json.properties.outputHomePowerCycle if value_json.properties is defined else None }}"
unit_of_measurement: "Wh"
unique_id: "d--deine ID-Y_outputHomePowerCycle"
device:
identifiers: ["d--deine ID-Y"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
- name: "Zendure Solar Power 1"
state_topic: "/A8yh63/d--deine ID-Y/properties/report"
value_template: "{{ value_json.properties.solarPower1 if value_json.properties is defined else None }}"
unit_of_measurement: "W"
unique_id: "d--deine ID-Y_solarPower1"
device:
identifiers: ["d--deine IDY"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
- name: "Zendure Solar Power 1 Cycle"
state_topic: "/A8yh63/d--deine IDY/properties/report"
value_template: "{{ value_json.properties.solarPower1Cycle if value_json.properties is defined else None }}"
unit_of_measurement: "Wh"
unique_id: "d--deine ID-Y_solarPower1Cycle"
device:
identifiers: ["d--deine ID-Y"]
manufacturer: "Zendure"
model: "Hub 2000"
name: "Solarflow Hub"
sw_version: "3.0.21"
Das Problem ist, ich weiß noch nicht ganz was was ist. Aber mit Chat GPT ist einmal das daraus geworden, die Frage ist leider noch wirklich was was ist.
zB was ist der Solar Power 1 Cycle ? Und wieso kriege ich es nicht zusammen ne Interger Zahl der Zeit zu nen Zeitwert zu bekommen.
Und wie ich die anderen Werte konvertiert bekomme. Also ne Liste wäre super um zu wissen was was ist.
Also wenn mir wer die Arbeit abnehmen kann die YAML richtig aufzuschreiben, wäre ich super Happy und auch fürs Daten Senden an den Flowhub.
OK … wenn ich das richtig sehe übernimmt dein “value_template” in der yaml die Aufgabe der “solarflow-topic-mapper.py”.
Obwohl der Raspberry ausgeschaltet ist.
Man könnte es auch direkt aus dem Log auslesen.
Ich weiß nur nicht ob es immer die gleiche Stelle ist an der der Parameter gesendet wird. Aber dieses sendet nur alle 30 Sekunden im Gegensatz zu den anderen Werte die dauernt (jede 1 bis 2 Sekunden (vorallem Solar Input)) daher kommen. Hiermit könnte man zB die Seriennummer und andere Sachen kontrollieren zb welche Wert für den Output gesetzt ist, und ihn dann in der Box aktualisieren, ich weiß leider noch nicht ganz wie das geht. Vorschlag von Chat Gpt ist jener:
mqtt:
number:
- unique_id: "output_limit_writer"
name: "Zendure Output Limit"
state_topic: "/A8yh63/d-yourID-Y/properties/write/reply"
value_template: "{{ value_json.properties.outputLimit }}"
command_topic: "iot/A8yh63/d-YourID-Y/properties/write"
command_template: '{"properties": {"outputLimit": {{ value | int }} }}'
unit_of_measurement: "W"
min: 20
max: 1050
step: 1
mode: box
device:
name: "Zendure Hub 2000"
identifiers: ["d-yourID-Y"]
manufacturer: "Zendure"
model: "SmartPV Hub 2000"
sensor:
- name: "Zendure Output Limit Logwert"
unique_id: "output_limit_log"
state_topic: "/A8yh63/d-yourID-Y/log"
value_template: >
{% set val = (value_json.log.params[51] | float(0)) / 100 %}
{{ val | round(0) }}
unit_of_measurement: "W"
device_class: power
template:
- sensor:
- name: "Zendure Output Status"
unique_id: "output_limit_status"
state: >
{% set setval = states('number.zendure_output_limit') | int %}
{% set logval = states('sensor.zendure_output_limit_logwert') | int %}
{% if setval == logval %}
OK
{% else %}
Abweichung
{% endif %}
icon: >
{% if states('sensor.zendure_output_status') == 'OK' %}
mdi:check-circle
{% else %}
mdi:alert-circle
{% endif %}
Das Passwort, mit dem sich z.B. der Hub 2000 (und andere?) beim MQTT-Server von Zendure anmeldet, kann man aus der device_id berechnen.
mqtt user name: device_id
mqtt_passwort: MD5-hash der device_id erzeugen, in Großbuchstaben wandeln, und davon die Zeichen von Position 8 bis 24 nehmen.
Dann einen User z.B. im HA-Mosquitto-addon mit diesem username/passwort anlegen und wie bekannt ein DNS-rewrite auf die IP des Mosquitto-servers einrichten. Ich mach das mit OpnSense&AdGuard (geht aber natürlich auch anders).
Dann spart man sich Verrenkungen mit zusätzlichen MQTT-server wegen anonymous login, foo, bla …
Aber: Keine Ahnung, ob zukünftige Firmware-updates das Passwort ändern…
Was aber egal wäre, wenn Zendure gleichzeitig eine vernünftige Direktkopplung an einen lokalen MQTT-server über die App erlauben würde…
Tausend Dank für die tolle Anleitung (GitHub - Schwippser/Solarflow-mqtt-HA: Zendure Solarflow - Daten an lokalen mqtt-Broker senden und in Homeassistant abfragen - Update (06.12.2024): Steuerung des Zendure jetzt über Homeassistant möglich).
Dazu habe ich gleich drei Fragen:
-
Sehe ich es richtig, dass man als Alternative zu den Schritten 2 und 3 auch den Zendure Cloud Disconnector (GitHub - nograx/zendure-cloud-disconnector: Zendure Cloud Disconnector) verwenden könnte?
-
Punkt 4:
Wie sorgt man in HA dafür, dass das Skript solarflow-topic-mapper.py in HA automatisch ausgeführt wird? -
Punkt 5:
Was macht eigentlich die mqtt.yaml? Denn im Punkt 4 steht ja "Jetzt sollten im MQTT-Explorer unter dem Haupttopic “solarflow-hub"alle Untertopics zu sehen sein.”
Damit wäre doch die Mission schon erfüllt, oder nicht?
zu 2. hatte ich irgendwie hinbekommen, müsste das jetzt aber erstmal wieder nachvollziehen. Ich hab es wieder deaktiviert, weil für mich unnötig. Wie auch Einrichtung eines MQTT- Brokers der anonymen Zugang ermöglicht, oder DNS-Kram. Da man das Login errechnen kann, fügt man das einfach (nach der “Befreiung”), in Mosqitto hinzu und man sieht dann schon einige Topics. Mit einem Button im mqqt-Bereich der config.yaml kann man sich dann bei Bedarf alle Topics holen:
- button:
- unique_id: "<SF_DEVICE_ID>sendall_btn"
name: "ACE Send All"
command_topic: "iot/<SF_PRODUCT_ID>/<SF_DEVICE_ID>/properties/read"
payload_press: '{"properties": ["getAll"]}'
qos: 0
retain: false
entity_category: "config"
device:
identifiers: "<device SN>"
zu 3. Ja, richtig. Ich z.B. hab mir aber alle Sensoren und Einstellungsmöglichkeiten erst mal in HA für die Geräte (ACE 1k5 & Hyper2k) angelegt, im mqtt-Abschnitt der configuration.yaml. Einerseits passen irgendwelche Vorlagen für meine Zwecke nicht, dann stimmen bei ein paar Topics Bezeichnungen oder Beschreibungen nicht, oder deren Bedeutung ist nirgends dokumentiert. Oder irgendwelche Integrationen arbeiten doch mit der Cloud/App zusammen. Das will ich alles nicht. So hab ich mir erst mal die Entitäten zusammengestoppelt um auch manuell etwas auspropbieren/debuggen zu können und dann später zu sehen wie ich das in HA mit anderen Geräten und untereinander über Automationen verknote.
Vielen Dank!
Wie? Ist es wirklich so einfach? Den Code von Dir in die configuration.yaml (und die Geräte-IDs eingragen)?
Hallo zusammen,
kurzes Update:
Punkt 1) hat mit dem Cloud Disconnector funktioniert, so dass man auf dieser Basis zumindest mal die Zendure-Integration nutzen kann, was aber nicht die beste Lösung ist!
Zu 2)
Den MQTT Login (User: DeviceID und Passwort über MD%-Hash berechnet) haut gut hin.
Da kommt es gleich zur nächsten Fragen:
In der Anleitung (GitHub - Schwippser/Solarflow-mqtt-HA: Zendure Solarflow - Daten an lokalen mqtt-Broker senden und in Homeassistant abfragen - Update (06.12.2024): Steuerung des Zendure jetzt über Homeassistant möglich) steht:
solarflow-topic-mapper.py:
sf_device_id = os.environ.get('SF_DEVICE_ID','DEVICE_ID') #siehe Abfrage-Infos Script sf_product_id = os.environ.get('SF_PRODUCT_ID',"PRODUCT_ID") #siehe oben bei Voraussetzungen mqtt_user = os.environ.get('MQTT_USER',None) mqtt_pwd = os.environ.get('MQTT_PWD',None) mqtt_host = os.environ.get('MQTT_HOST','IP_MQTT-BROKER') mqtt_port = os.environ.get('MQTT_PORT',1883)
Ist es wirklich so, dass die DEVICE_ID in ‘'…’ gesetzt und die PRODUCT:_ID in “…”?
Wie gibt man den MQTT_USER und -PWD an? In “…”?
Ich checke noch nicht, wie man “solarflow-topic-mapper.py” automatisch in HA laufen lassen kann, Weiß das jemand?





