SOLAX: tasmota oder ESPHome auf ESP8266 und ESP32 flashen

Kannst du mal per SSH auf den Raspberry gehen (also mit Putty z.B.) und dort das Setup Script lokal ausführen wenn du das über WinSCP gemacht hast.

Falls du das über SSH gemacht hast:

  • geh mal in das Installations-Verzeichnis also /data/drivers/dbus-mqtt-devices-0.5.1
  • da mal das ausführen: python -m pip install -r requirements.txt
  • wenn dann der gleiche Fehler kommt: python -m pip install dataclasses und dann nochmal setup.sh ausführen.
  • Es gibt noch ein uninstall Script das kannst du auch mal laufen lassen.
  • Wenn das nicht hilft mach den Raspi platt mit einen neue Venus OS und starte neu.

Habe ich gemacht, mit gleichem Ergebnis. Also Raspi platt machen oder...

... könnte das auch auf meinen laufenden MP2-GX installieren.

Der Raspi hat zwar die große firmware bekommen, aber sonst hängt nichts dran. Müsste aber trotzdem funktionieren? Den Fronius zeigt er an.

Ich setz den Raspi später nochmal neu auf. Mit deinen Tipps bis hierher müsste ich es eigentlich hinbekommen ? . Ansonsten melde ich mich abends nochmal.

1 „Gefällt mir“

@saugnapf Ja du kannst mal auf dem MP2-GX installieren.

Hier: Raspberry Pi PyYalm fails on install and with workaround storage + VRM updates breaks on ver 2.92 · Issue #37 · freakent/dbus-mqtt-devices · GitHub ist dein Fehler beschrieben. Ich hab anscheinend eine ältere Venus OS Version mit der das geht.

Lass mal das setup-ccgx.sh laufen. Also am Besten erstmal uninstall und dann das setup-ccgx.sh. Das scheint den Workarround für den Bug zu haben

Hier Installed today the 2.93 Update on CCGX and reinstalled dbus-mqtt-device "without" any issue · Issue #40 · freakent/dbus-mqtt-devices · GitHub steht auch noch was.

Du sollst "opkg update && opkg install python3-modules python3-pip" ausführen.

? Da bin ich auch gerade...

1 „Gefällt mir“

{green}:formalsmile:

1 „Gefällt mir“

Da isser. ?

Warum weder Fronius noch Solax in der remote-console erscheinen, muss ich mal noch rausfinden.

Aber das mache ich dann heute Abend am "echten" System.

VIELEN DANK!!!

edit: also die Lösung für diesen Schritt war: "opkg update && opkg install python3-modules python3-pip"

und ich habe die Firmware v3.00~24 aufgespielt. Eins von beidem oder beides hat geholfen.

@saugnapf Super!

Wenn du nicht soweit weg wohnen würdest würden wir jetzt mit einem Bier feiern ? .

Kann sein das du erst Leistungsdaten brauchst damit das angezeigt wird. War bei mir auch so das erstmal nichts zu sehen war und auf einmal war der da.

Evtl. stimmt da noch was mit den Modbus-Adressen nicht.

Strom und Leistung ist bei dir ja 0. Muss mich da noch was durch das Modbus Protokoll kämpfen da werde ich momentan nicht schlau draus wie sich da die Adressen zusammen bauen

Nicht nur eins! ? ? ? (? ? ...)

Ja, beide Geräte sind quasi blank.

Der Solax hat keine PV dran, die hängt momentan am Fronius und wird heute Abend, wenn's dunkel ist, umgesteckt.

Der RasPi hat keinen MP zum steuern, kein ESP ähm, ESS eingerichtet, keine Verbindung zu SmartMeter, Phasen, nicht mal BMS...

Aus seiner Sicht ist die Darstellung in der RemoteConsole korrekt.

Leistungsdaten gibt's dann morgen, ich werde erstmal die .yaml etwas entschlacken, vielleicht kann ich L2 und L3 ganz rausnehmen.

1 „Gefällt mir“

Hier ist schonmal die Leistung:

L2 und L2 ganz rauszuschmeißen scheint nicht ganz so einfach zu sein... ist aber auch egal.

1 „Gefällt mir“

Nee aus dem Venus OS bekommst du L2, L3 glaube ich nicht raus. Die sind da fest drin und einen Schalter zum Ausblenden kenne ich nicht.

@saugnapf der RS485-Konverter hat mich auch zur Verzweiflung gebracht: bei diesem Modul wird TX->TX und RX->RX verbunden (also nicht wie üblich gekreuzt)!

Hi Zusammen,

nach einigem hin und her funktioniert zumindest das Yaml File von Sebastian für meinen Solax X1 Mini.
Da ich ebenfalls die intergration für meine Victron Anlage benötige habe ich das entsprechende Yaml Beispiel
für den X1 Boost angepasst. Bei mir kommen aber keine Daten da mein Solax vermutlich kein Modbus_RTU spricht.

Noch ein paar Hinweise in eigener Sache weil es mich echt viel Zeit und Nerven gekostet hat:

Achtet auf ein stabile Spannungsversorgung. Anfänglich konnte ich keine ESB32 zum arbeiten bewegen.
Wenn Ihr Eure IOT Geräte über eine Versteckte SSID einbinden wollt müsst Ihr den wifi bereich wie folgt erweitern:

wifi:
ssid: "GEHEIME_IOT_SSID"
password: "geheim"
fast_connect: true

Könnte mir jemand sagen an welchen Stellen ich die YAML Datei anpassen muss damit der ESP32 mit meine Wechselrichter spricht (X1 Mini ohne Boost)?

Hi,

niemand eine Idee wie man das file von @Sebastian für den Cerbo (MQTT) anpassen kann für den Solax Mini ohne Boost?

Ich hab jetzt mehrfach versucht entweder das eine oder das andere yaml file funktionsfähig zu bekommen. Aber ich kriege
es leider nicht hin. Wäre für jeden Tipp dankbar.

Gruß

Udo

Vielleicht wird es einfacher, wenn du schreibst, was schon geht, und was noch nicht, also wo du grad hängen bleibst.

@saugnapf

Das komplette Yaml Script von Sebastian funktioniert. Das angepasste Script für den Solax X1 Boost zum Teil (der Teil der das Gerät per MQTT am Cerbo anmeldet).

Mein Problem ist das verschiedene Module in den Beiden Scripten angesprochen werden und diese untereinander nicht tauschbar sind.
Zusammengefasst ich möchte die Daten die aus Sebastians Script kommen and den Cerbo liefern analog der des zweiten Scripts für den Boost.

Das hier müsste eigentlich funktionieren um zumindest die Werte auszulesen und die Verbindung als Instanz am Cerbo anzumelden.
Soweit sich mir das erschließt wurde bei "substitution" die Einträge um Victron relevante Informationen erweitert.

Der MQTT Teil meldet erstmal auch nur die Instanz im Cerbo an.

substitutions:
name: solax-x1-mini
device_description: "Monitor a Solax X1 Mini via RS485"
external_components_source: github://syssi/esphome-solax-x1-mini@main
tx_pin: GPIO16    #esp32
rx_pin: GPIO17    #esp32
device_name: "solax-x1-mini"
client_id: "PvInverter1"
sensor_name: "L1"
device_instance: "36"
position: "1"
esphome:
name: ${name}
comment: ${device_description}
project:
name: "syssi.esphome-solax-x1-mini-garage"
version: 2.1.0
esp32:
board: wemos_d1_mini32
external_components:
- source: ${external_components_source}
refresh: 0s
wifi:
ssid: "XXXXXXXXXX"
password: "YYYYYYY"
fast_connect: true
ota:
logger:
level: DEBUG
# If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component!
# The native API has many advantages over MQTT: https://esphome.io/components/api.html#advantages-over-mqtt
mqtt:
broker: 192.168.1.xx # CERBO IP
port: 1883
discovery: false
birth_message:
topic: device/${client_id}/Status
payload: '{"clientId": "${client_id}", "connected": 1, "version": "1", "services": {"${sensor_name}": "pvinverter"}}'
will_message:
topic: device/${client_id}/Status
payload: '{"clientId": "${client_id}", "connected": 0, "version": "1"}'
on_json_message:
topic: device/${client_id}/DBus
then:
- globals.set:
id: vrm_portal_id
value: !lambda |-
return x["portalId"];
- globals.set:
id: sensor_id
value: !lambda |-
return x["deviceInstance"]["${sensor_name}"];
- mqtt.publish_json:
# Anzeigename in Venus OS
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/CustomName", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = "Solax X1 boost";
- mqtt.publish_json:
# 0=AC input 1; 1=AC output; 2=AC input 2
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Position", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 1;
- mqtt.publish_json:
# Nennleistung des Wechselrichters in W
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/MaxPower", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 2000;
# api:
uart:
id: uart_0
baud_rate: 9600
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
solax_modbus:
- id: modbus0
uart_id: uart_0
#    flow_control_pin: GPIO0
solax_x1_mini:
solax_modbus_id: modbus0
update_interval: 1s
text_sensor:
- platform: solax_x1_mini
mode_name:
name: "${name} mode name"
errors:
name: "${name} errors"
sensor:
- platform: solax_x1_mini
ac_power:
name: "${name} ac power"
energy_today:
name: "${name} energy today"
energy_total:
name: "${name} energy total"
dc1_voltage:
name: "${name} dc1 voltage"
dc2_voltage:
name: "${name} dc2 voltage"
dc1_current:
name: "${name} dc1 current"
dc2_current:
name: "${name} dc2 current"
ac_current:
name: "${name} ac current"
ac_voltage:
name: "${name} ac voltage"
ac_frequency:
name: "${name} ac frequency"
temperature:
name: "${name} temperature"
runtime_total:
name: "${name} runtime total"
mode:
name: "${name} mode"
error_bits:
name: "${name} error bits"
grid_voltage_fault:
name: "${name} grid voltage fault"
grid_frequency_fault:
name: "${name} grid frequency fault"
dc_injection_fault:
name: "${name} dc injection fault"
temperature_fault:
name: "${name} temperature fault"
pv1_voltage_fault:
name: "${name} pv1 voltage fault"
pv2_voltage_fault:
name: "${name} pv2 voltage fault"
gfc_fault:
name: "${name} gfc fault"

Der Sensor Bereich unterscheidet sich vom Aufbau deutlich:

sensor:
- platform: solax_x1_mini
ac_power:
name: "${name} ac power"
energy_today:
name: "${name} energy today"
energy_total:
name: "${name} energy total"
dc1_voltage:
name: "${name} dc1 voltage"
dc2_voltage:
name: "${name} dc2 voltage"
dc1_current:
name: "${name} dc1 current"
dc2_current:
name: "${name} dc2 current"
ac_current:
name: "${name} ac current"
ac_voltage:
name: "${name} ac voltage"
ac_frequency:
name: "${name} ac frequency"
temperature:
name: "${name} temperature"
runtime_total:
name: "${name} runtime total"
mode:
name: "${name} mode"
error_bits:
name: "${name} error bits"
grid_voltage_fault:
name: "${name} grid voltage fault"
grid_frequency_fault:
name: "${name} grid frequency fault"
dc_injection_fault:
name: "${name} dc injection fault"
temperature_fault:
name: "${name} temperature fault"
pv1_voltage_fault:
name: "${name} pv1 voltage fault"
pv2_voltage_fault:
name: "${name} pv2 voltage fault"
gfc_fault:
name: "${name} gfc fault"

und die hier mal nur ein Auszug für einen Wert (Grid Voltage) aus dem Boost Script:

- platform: modbus_controller
id: inverter_grid_voltage
modbus_controller_id: solax0
name: "${name} grid voltage"
address: 0x404
register_type: read
value_type: U_WORD
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;

welche Teile davon sind jetzt spezifisch für den Boost?

Würde sowas funktionieren da ja die Feld und Typdefinition bei Sebastians Script nicht aus einem String herausgeschnitten und konvertiert werden muss:

sensor:
- platform: solax_x1_mini
...
ac_voltage:
name: "${name} ac voltage"
id: inverter_grid_voltage
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;

Es wäre etwas angenehmer, wenn du deine codes in einen spoiler packen würdest. Das spart endloses scrollen.

Habe ich das richtig verstanden, du hast einen Solax X1 Mini? Und du möchtest die .yaml für den Solax X1 boost so anpassen, dass es für den Mini passt?

Und das wäre nix für dich?

Doch, das genau will ich ja mit den MQTT Anpassungen für den Cerbo inkl. Webserver Oberfläche.

Hab es Gestern mit einer Spätschicht noch mit Try und Error hinbekommen.

Abweichend von Sebastians (Sissy) Yaml Konfig file für den ESP32 https://github.com/syssi/esphome-solax-x1-mini/blob/main/esp32-example.yaml

habe ich folgende Modifikationen vorgenommen:

WLAN:

fast_connect: true # da ich die SSID für das IOT Netz nicht publiziere.. leider mag ESPHOME versteckte SSID's nicht.

Web Server hinzugefügt der alle Werte aus Sebastians Yaml file anzeigt inkl. einem Resetbutton.

MQTT Server und Spezifika hinzugefügt der mit dem Victron System sprechen kann.

MQTT und Webserver basierte auf dem Yaml file von @profantus https://www.akkudoktor.net/forum/open-source-software-projekte/tasmota-auf-esp32-wroom-32-flashen/paged/6 und des passenden Gegenstücks auf der Victron Seite: uhttps://githb.com/freakent/dbus-mqtt-devices

Folgende Einschänkung gibt es die für mich eher ein Feature sind:

Ich nutze zwei eigenständige PV Inverter am L1 out, die werden aufgrund der Namensgebung jetzt kummuliert in der Victron Übersicht angezeigt, ich weiß leider nicht ob sich das ändern lässt, ich belasse es aber erstmal so:

In der Remote Konsole werden sie einzeln aufgelistet:

Anbei noch mein Yaml File für den Solax X1 Mini mit Anbindung an das Victron System:

substitutions:
name: solax-x1-mini
device_description: "Monitor a Solax X1 Mini via RS485"
external_components_source: github://syssi/esphome-solax-x1-mini@main
tx_pin: GPIO16    #esp32
rx_pin: GPIO17    #esp32
device_name: "solax-x1-mini"
client_id: "PvInverter1"
sensor_name: "L1"
device_instance: "36"
position: "1"
esphome:
name: ${name}
comment: ${device_description}
project:
name: "syssi.esphome-solax-x1-mini-garage"
version: 2.1.0
esp32:
board: wemos_d1_mini32
external_components:
- source: ${external_components_source}
refresh: 0s
wifi:
ssid: "XXXXXXXXXXXXXX"
password: "YYYYYYYYYYY"
fast_connect: true
ota:
logger:
level: ERROR
web_server:
port: 80
version: 1
include_internal: true
# If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component!
# The native API has many advantages over MQTT: https://esphome.io/components/api.html#advantages-over-mqtt
mqtt:
broker: 192.168.1.x # CERBO IP
port: 1883
discovery: false
birth_message:
topic: device/${client_id}/Status
payload: '{"clientId": "${client_id}", "connected": 1, "version": "1", "services": {"${sensor_name}": "pvinverter"}}'
will_message:
topic: device/${client_id}/Status
payload: '{"clientId": "${client_id}", "connected": 0, "version": "1"}'
on_json_message:
topic: device/${client_id}/DBus
then:
- globals.set:
id: vrm_portal_id
value: !lambda |-
return x["portalId"];
- globals.set:
id: sensor_id
value: !lambda |-
return x["deviceInstance"]["${sensor_name}"];
- mqtt.publish_json:
# Anzeigename in Venus OS
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/CustomName", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = "Solax X1 boost";
- mqtt.publish_json:
# 0=AC input 1; 1=AC output; 2=AC input 2
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Position", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 1;
- mqtt.publish_json:
# Nennleistung des Wechselrichters in W
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/MaxPower", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 2000;
# api:
uart:
id: uart_0
baud_rate: 9600
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
solax_modbus:
- id: modbus0
uart_id: uart_0
#    flow_control_pin: GPIO0
solax_x1_mini:
solax_modbus_id: modbus0
update_interval: 1s
text_sensor:
- platform: solax_x1_mini
mode_name:
name: "${name} mode name"
errors:
name: "${name} errors"
switch:
- platform: restart
name: ${device_name} Restart
sensor:
- platform: solax_x1_mini
ac_power:
name: "${name} ac power"
id: inverter_active_power
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Power", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_active_power).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Power", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_active_power).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Power", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Power", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
energy_today:
name: "${name} energy today"
id: inverter_daily_energy
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Energy/Forward", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_daily_energy).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Energy/Forward", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_daily_energy).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Energy/Forward", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Energy/Forward", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
energy_total:
name: "${name} energy total"
dc1_voltage:
name: "${name} dc1 voltage"
dc2_voltage:
name: "${name} dc2 voltage"
dc1_current:
name: "${name} dc1 current"
dc2_current:
name: "${name} dc2 current"
ac_current:
name: "${name} ac current"
id: inverter_grid_current
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Current", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_current).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Current", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_current).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Current", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Current", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
ac_voltage:
name: "${name} ac voltage"
id: inverter_grid_voltage
on_value:
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L1/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_grid_voltage).state;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L2/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
- mqtt.publish_json:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/Ac/L3/Voltage", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = 0;
ac_frequency:
name: "${name} ac frequency"
temperature:
name: "${name} temperature"
runtime_total:
name: "${name} runtime total"
mode:
name: "${name} mode"
error_bits:
name: "${name} error bits"
grid_voltage_fault:
name: "${name} grid voltage fault"
grid_frequency_fault:
name: "${name} grid frequency fault"
dc_injection_fault:
name: "${name} dc injection fault"
temperature_fault:
name: "${name} temperature fault"
pv1_voltage_fault:
name: "${name} pv1 voltage fault"
pv2_voltage_fault:
name: "${name} pv2 voltage fault"
gfc_fault:
name: "${name} gfc fault"