SOLAX: tasmota oder ESPHome auf ESP8266 und ESP32 flashen

Der GX Part:
Die Himbeeere brauchst du nicht, du kannst MQTT auf dem GX aktivieren und im LAN freigeben.
Einige Leute haben Probleme mit Pip3, hatte ich auch aber vergessen wie ich es installiert habe.ich glaube es war die Variante
opkg install python3-pip python3-modules

Installation ist die so wie hier beschreiben:GitHub - RalfZim/venus.dbus-fronius-smartmeter: A service for Venus OS, reading smart meter data from a Fronius system and making the values available on dbus.
mqtt_broker_address ist dann localhost

Zum Kopieren der Dateien und Setzen der Attribute (für die shellskripte) kann man auch WinSCP nutzen.
Venus booten oder einmal von Hand starten, nicht wundern wenn dann nichts zu sehen ist.
Der Inverter wird erst mit senden von venus/pvinverter/${name}/init erzeugt (aus esphome).
Am ESP die Daten zusamenzusuchen wird dann noch mal ne keine Aufgabe.
Die Standradsensoren von Esphome sind nicht wirklich syncronisiert.
Wie man da an den Event eines Lesezyklus vom Modbus rankommt weiß ich noch nicht, Das Senden der Daten kann man aber auch erstmal zeitgestiert machen.

1 „Gefällt mir“

Moin @und-mehr,

hat es einen Grund, warum du dein eigens Python Script geschrieben hast und nicht die hier verwendest?

https://github.com/freakent/dbus-mqtt-devices

Aufgrund meiner ungenügenden Kenntnisse auch einfachster Console-Befehle traue ich mich noch nicht, das an meinem laufenden System zu machen.

Habe also VENUS auf den RasPi installiert, Zugangslevel ist superuser, über putty kann ich mich als root@raspberrypi4 anmelden. Schaut erstmal so aus:

Der FRONIUS ist natürlich sofort wieder da... ?

Modbus TCP und MQTT auf LAN (SSL) aktiviert.

ich hab das irgendwann im Juli gemacht und im August hat hier jemand das verlinkte Projekt gepostet.

WinSCP ist super, danke für den Tipp!

Mit der Installation nach Beschreibung von RalfZim bin ich nicht ganz durchgekommen.

Add a symlink to the file /data/rc.local:

ln -s /data/dbus-fronius-smartmeter/service /service/dbus-fronius-smartmeter

Or if that file does not exist yet, store the file rc.local from this service on your Raspberry Pi as /data/rc.local . You can then create the symlink by just running rc.local:

rc.local

The daemon-tools should automatically start this service within seconds.

rc.local ist bei mir nicht vorhanden... wie die zu erstellen ist, oder wo ich sie herbekomme, habe ich nicht verstanden.
In the Python file, you should put the IP of your Fronius device that hosts the REST API. In my setup, it is the IP of the Fronius Symo, which gets the data from the Fronius Smart Metervia the RS485 connection between them.
Heisst das, ich muss die dbus-fronius-smartmeter.py mit editor bearbeiten, und in Zeile 58 die IP des esp32 eintragen?

"mqtt_broker_address ist dann localhost" Wo muss ich das angeben?

"Der Inverter wird erst mit senden von venus/pvinverter/${name}/init erzeugt (aus esphome)" Und wo mache ich das?

Vielen Dank für eure Hilfe!

Rc.local is ne Textdatei, es ist normal dass die nicht da ist, wenn deine venus noch jungfräulich ist.

Das froniusding sollte eigentlich nur Beispiel sein, wie so ein Service installiert wird, das phytonfile ist dann ein anderes.

Also ich habe das jetzt mit dem Projekt hier https://github.com/freakent/dbus-mqtt-devices zum laufen bekommen.

Da musst du das Setup Script ausführen und dann wird alles erstellt.

Bei mir sieht das jetzt so aus:

Für ESPHome habe ich folgendes Script erstellt:

substitutions:
device_name: "huwaei-sun2000-3680"
client_id: "PvInveter1"
sensor_name: "L1"
device_instance: "150"
position: "1"
globals:
- id: vrm_portal_id
type: std::string
restore_value: no
initial_value: ''
- id: sensor_id
type: int
restore_value: no
initial_value: '0'
esphome:
name: ${device_name}
esp8266:
board: d1_mini
# Enable logging
logger:
baud_rate: 0 # disable serial logger
level: ERROR
# hardware_uart: UART0_SWAP
logs:
mqtt: NONE
mqtt.client: NONE
mqtt.component: NONE
api: !include _api.yaml
ota: !include _ota.yaml
wifi: !include _wifi.yaml
mqtt:
broker: 192.168.0.51
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:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/CustomName", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_model).state;
- 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;
switch:
- platform: restart
name: ${device_name} Restart
uart:
baud_rate: 9600
data_bits: 8
id: mod_bus
parity: NONE
rx_buffer_size: 1024
rx_pin: GPIO03
stop_bits: 1
tx_pin: GPIO01
modbus:
id: modbus1
modbus_controller:
- id: huawei_inverter
address: ${device_instance}
modbus_id: modbus1
setup_priority: -10
command_throttle: 750ms
update_interval: 15s
text_sensor:
- platform: wifi_info
ip_address:
name: ${device_name} IP Address
id: ip_address
internal: true
# Range 30000 - 30035
- name: "Huawei inverter model"
id: inverter_model
icon: "mdi:information"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 30000
register_count: 15
response_size: 30
skip_updates: 100
- name: "Huawei inverter SN"
icon: "mdi:information"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 30015
register_count: 10
response_size: 20
skip_updates: 100
# Inverter status string
- name: "Huawei inverter status"
platform: template
id: inverter_status_string
icon: "mdi:information"
sensor:
- name: "Huawei inverter device status code"
icon: "mdi:information"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32089
value_type: U_WORD
on_value:
- text_sensor.template.publish:
id: inverter_status_string
state: !lambda |-
int code = (int)x;
switch (code) {
case 0x0000:
return {"Standby: initializing"};
case 0x0001:
return {"Standby: detecting insulation resistance"};
case 0x0002:
return {"Standby: detecting irradiation"};
case 0x0003:
return {"Standby: grid detecting"};
case 0x0100:
return {"Starting"};
case 0x0200:
return {"On-grid (Off-grid mode: running)"};
case 0x0201:
return {"Grid connection: power limited (Off-grid mode: running: power limited)"};
case 0x0202:
return {"Grid connection: self-derating (Off-grid mode: running: self-derating"};
case 0x0203:
return {"Off-grid Running"};
case 0x0300:
return {"Shutdown: fault"};
case 0x0301:
return {"Shutdown: command"};
case 0x0302:
return {"Shutdown: OVGR"};
case 0x0303:
return {"Shutdown: communication disconnected"};
case 0x0304:
return {"Shutdown: power limited"};
case 0x0305:
return {"Shutdown: manual startup required"};
case 0x0306:
return {"Shutdown: DC switches disconnected"};
case 0x0307:
return {"Shutdown: rapid cutoff"};
case 0x0308:
return {"Shutdown: input underpower"};
case 0x0401:
return {"Grid scheduling: cosφ-P curve"};
case 0x0402:
return {"Grid scheduling: Q-U curve"};
case 0x0403:
return {"Grid scheduling: PF-U curve"};
case 0x0404:
return {"Grid scheduling: dry contact"};
case 0x0405:
return {"Grid scheduling: Q-P curve"};
case 0x0500:
return {"Spot-check ready"};
case 0x0501:
return {"Spot-checking"};
case 0x0600:
return {"Inspecting"};
case 0x0700:
return {"AFCI self check"};
case 0x0800:
return {"I-V scanning"};
case 0x0900:
return {"DC input detection"};
case 0x0A00:
return {"Running: off-grid charging"};
case 0xA000:
return {"Standby: no irradiation"};
default:
return {"Unknown state code"};
}
# Templates of range 32016 - 32019
- name: "Huawei inverter PV1 power"
platform: template
id: pv1_power
icon: mdi:flash
unit_of_measurement: "kW"
device_class: power
state_class: measurement
accuracy_decimals: 2
- name: "Huawei inverter PV2 power"
platform: template
id: pv2_power
icon: mdi:flash
unit_of_measurement: "kW"
device_class: power
state_class: measurement
accuracy_decimals: 2
- name: Huawei inverter string ratio
platform: template
id: string_ratio
icon: mdi:solar-panel-large
state_class: measurement
unit_of_measurement: ""
accuracy_decimals: 3
# Range 32064 - 32114 (2/2)
- name: "Huawei inverter input power"
id: inverter_input_power
icon: "mdi:solar-power"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32064
value_type: S_DWORD
unit_of_measurement: "kW"
device_class: power
state_class: measurement
accuracy_decimals: 3
filters:
- multiply: 0.001
- name: "Huawei inverter grid voltage"
id: inverter_grid_voltage
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32066
value_type: U_WORD
register_count: 6  # read more to get to 32072
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- throttle_average: 60s
on_value:
- mqtt.publish_json:
# topic: W/${vrm_portal_id}/grid/${sensor_id}/Ac/L2/Energy/Forward
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;
- name: "Huawei inverter grid current"
id: inverter_grid_current
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32072  # read more to get to 32078
value_type: S_DWORD
register_count: 6
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 3
filters:
- multiply: 0.001
on_value:
- mqtt.publish_json:
# topic: W/${vrm_portal_id}/grid/${sensor_id}/Ac/L2/Energy/Forward
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;
- name: "Huawei inverter peak power today"
icon: "mdi:solar-power"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32078
value_type: S_DWORD
unit_of_measurement: "kW"
device_class: power
state_class: measurement
accuracy_decimals: 3
filters:
- multiply: 0.001
- name: "Huawei inverter active power"
id: inverter_active_power
icon: "mdi:solar-power"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32080
value_type: S_DWORD
register_count: 5  # read more to get to 32085
unit_of_measurement: "kW"
device_class: power
state_class: measurement
accuracy_decimals: 3
filters:
- multiply: 0.001
on_value:
- mqtt.publish_json:
# topic: W/${vrm_portal_id}/grid/${sensor_id}/Ac/L2/Energy/Forward
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;
- name: "Huawei inverter grid frequency"
icon: "mdi:sine-wave"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32085
value_type: U_WORD
unit_of_measurement: "Hz"
state_class: measurement
accuracy_decimals: 2
filters:
- multiply: 0.01
- throttle_average: 60s
- name: "Huawei inverter efficiency"
register_type: holding
platform: modbus_controller
modbus_controller_id: huawei_inverter
address: 32086
value_type: U_WORD
unit_of_measurement: "%"
state_class: measurement
accuracy_decimals: 2
filters:
- multiply: 0.01
- name: "Huawei inverter internal temperature"
register_type: holding
platform: modbus_controller
modbus_controller_id: huawei_inverter
address: 32087
value_type: S_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 2
filters:
- multiply: 0.1
- throttle_average: 60s
- name: "Huawei inverter fault code"
icon: "mdi:alert-circle"
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32090
value_type: U_WORD
- name: Huawei inverter daily energy
id: inverter_daily_energy
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 32114
value_type: U_DWORD
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 2
filters:
- multiply: 0.01
on_value:
- mqtt.publish_json:
# topic: W/${vrm_portal_id}/grid/${sensor_id}/Ac/L2/Energy/Forward
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;
- name: "Huawei inverter system time"
id: inverter_system_time
platform: modbus_controller
modbus_controller_id: huawei_inverter
register_type: holding
address: 40000
value_type: U_DWORD
device_class: timestamp

Für dich interessant ist hier der MQTT Abschnitt mit birth_message, will_message, on_message_json

und der Teil bei den Sensoren im on_value Event mit mqtt.publish_json.

Den on_value Event musst du dann zu den passenden Modbus-Sensoren einfügen.

Da ich nur einen 1-phasigen WR habe hab ich für L2 und L3 jeweils noch einen 0 mit geschickt.

2 „Gefällt mir“

Muss ich den "MQTT Abschnitt mit birth_message, will_message, on_message_json, und der Teil bei den Sensoren im on_value Event mit mqtt.publish_json"

in meine .yaml einbauen?

@saugnapf

Ja genau. Das klappt aber nur mit dem D-Bus Treiber den ich oben verlinkt habe.

Du kannst ja nochmal dein yaml posten. Dann kann ich nochmal drüber schauen.

Für das Setup vom Dbus-Treiber gibt es im Projekt auf Github eine gute Anleitung: GitHub - freakent/dbus-mqtt-devices: A driver for Victron VenusOS GX devices to support use of dbus-mqtt/flashmq-mqtt

Danke für eure Geduld!

@profantus den Treiber habe ich gestern schon installiert, nach deiner weiter oben verlinkten Anleitung. Oder sollte ich besser die Version für CCGX nehmen?

Mit der .yaml werde ich mich dann heute nachmittag / abend nochmal beschäftigen, und hier posten, wäre super, wenn du dir das dann nochmal anschauen könntest. ?

@saugnapf Der Treiber ist gleich nur das Setup unterscheidet sich etwas. Da gibt es zwei Scripte. Ich hab alles auf dem Raspi laufen daher hab ich keine Erfahrung mit dem CCGX. Hab nur gelesen dass das 'normale' Script wohl Problem auf dem CCGX gemacht hat.

Hi @profantus ja, habe zu Testzwecken auch alles auf dem RasPi laufen. (Ansonsten ist das ein MP2-GX, also kein CCGX) Aber das spielt ja dann eigentlich keine Rolle.

Hier nochmal meine aktuelle .yaml:

# This configuration is for a Solax X1 Boost
#
# The Solax X1 Boost can be interfaced using ModbusRTU via RS485.
#
# Please `enable` the Modbus support at the settings (password 6868)
# of your inverter and make sure the modbus address is set to `1`.
#
# Kudos to @benjaminvdb and @kidwellj
#
# https://github.com/syssi/esphome-solax-x1-mini/issues/31
# https://github.com/aiolos/ESPHome-config/blob/main/modbus-solax.yaml
substitutions:
#name: solar-powermeter
name: solar-powermeter-32
device_description: "Monitor a Solax X1 Boost via RS485"
# tx_pin: GPIO4   #esp8266
# rx_pin: GPIO5   #esp8266
tx_pin: GPIO16    #esp32
rx_pin: GPIO17    #esp32
device_name: "solar-powermeter-32"
client_id: "PvInveter1"
sensor_name: "L1"
device_instance: "150"
position: "1"
globals:
- id: vrm_portal_id
type: std::string
restore_value: no
initial_value: ''
- id: sensor_id
type: int
restore_value: no
initial_value: '0'
esphome:
name: ${name}
comment: ${device_description}
project:
name: "syssi.esphome-solax-x1-mini"
version: 2.1.0
#esp8266:
#  board: d1_mini
esp32:
board: wemos_d1_mini32
wifi:
ssid: "*****"
password: "*****"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "SolaxHotspot"
password: "HotspotSolax"
captive_portal:
web_server:
port: 80
version: 1
include_internal: true
ota:
# If you use Home Assistant please remove this `mqtt` section and uncomment the `api` component!
# mqtt:
# broker: !secret mqtt_host
# username: !secret mqtt_username
# password: !secret mqtt_password
# id: mqtt_client
api:
reboot_timeout: 0s
logger:
level: INFO
mqtt:
broker: localhost
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:
topic: !lambda return str_sprintf("W/%s/pvinverter/%d/CustomName", id(vrm_portal_id).c_str(), id(sensor_id));
payload: |-
root["value"] = id(inverter_model).state;
- 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;
switch:
- platform: restart
name: ${device_name} Restart
uart:
# id: uart0
baud_rate: 9600
data_bits: 8
id: mod_bus
parity: NONE
rx_buffer_size: 1024
stop_bits: 1
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
# tx_pin: GPIO01
# rx_pin: GPIO03
# uart:
# id: uart0
# baud_rate: 9600
# tx_pin: ${tx_pin}
# rx_pin: ${rx_pin}
modbus:
- id: modbus0
#    uart_id: uart0
#    flow_control_pin: GPIO0
modbus_controller:
- id: solax0
address: 0x1
modbus_id: modbus0
setup_priority: -10
update_interval: 15s
text_sensor:
- name: "SOLAX inverter model"
id: inverter_model
icon: "mdi:information"
platform: modbus_controller
modbus_controller_id: solax0
register_type: holding
address: 30000
register_count: 15
response_size: 30
skip_updates: 100
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} operation mode"
address: 0x40f
register_type: read
raw_encode: HEXBYTES
lambda: |-
uint16_t value = modbus_controller::word_from_hex_str(x, 0);
switch (value) {
case 0: return std::string("Waiting");
case 1: return std::string("Checking");
case 2: return std::string("Normal");
case 3: return std::string("Fault");
case 4: return std::string("Permanent Fault");
case 5: return std::string("Update");
case 6: return std::string("Off-grid waiting");
case 7: return std::string("Off-grid");
case 8: return std::string("Self Testing");
case 9: return std::string("Idle");
case 10: return std::string("Standby");
}
return std::string("Unknown");
sensor:
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} PV1 input voltage"
address: 0x400
register_type: read
value_type: U_WORD
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} PV2 iput vltage"
address: 0x401
register_type: read
value_type: U_WORD
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} PV1 iput crrent"
address: 0x402
register_type: read
value_type: U_WORD
unit_of_measurement: A
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} PV2 input current"
address: 0x403
register_type: read
value_type: U_WORD
unit_of_measurement: A
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
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
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} grid frequency"
address: 0x407
register_type: read
value_type: U_WORD
unit_of_measurement: Hz
device_class: frequency
state_class: measurement
accuracy_decimals: 2
filters:
- multiply: 0.01
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} output current"
address: 0x40A
register_type: read
value_type: U_WORD
unit_of_measurement: A
device_class: current
state_class: measurement
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} temperature"
address: 0x40D
register_type: read
value_type: U_WORD
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} inverter power"
address: 0x40e
register_type: read
value_type: U_WORD
unit_of_measurement: W
device_class: power
state_class: measurement
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: solax0
id: solax0_power_dc1
name: "${name} power dc1"
address: 0x414
register_type: read
value_type: U_WORD
unit_of_measurement: W
device_class: power
state_class: measurement
accuracy_decimals: 0
- platform: modbus_controller
modbus_controller_id: solax0
id: solax0_power_dc2
name: "${name} power dc2"
address: 0x415
register_type: read
value_type: U_WORD
unit_of_measurement: W
device_class: power
state_class: measurement
accuracy_decimals: 0
on_value:
then:
component.update: solax0_total_dc_power
- platform: template
id: solax0_total_dc_power
name: "${name} total dc power"
update_interval: never
unit_of_measurement: W
device_class: power
state_class: measurement
accuracy_decimals: 0
lambda: |-
return (id(solax0_power_dc1).state + id(solax0_power_dc2).state);
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} energy total"
address: 0x423
register_type: read
value_type: U_WORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
- platform: modbus_controller
modbus_controller_id: solax0
name: "${name} energy today"
address: 0x425
register_type: read
value_type: U_WORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1

Hat etwas gedauert, das nach diversen Fehlermeldungen lauffähig zu bekommen.

Nachdem ich nun schon -ich weiß nicht wieviele ...zig- Stunden mit dem Projekt zugebracht habe, nähert sich das von meiner Seite her eher dem Ende.

Das ganze ist viel zu kompliziert, ein Ergebnis ist nach wie vor nicht in Sicht, kann das so nicht weiter betreiben. Zeit hätte ich zwar genügend, auch tagsüber kann ich mir das nebenher einteilen, aber es steht einfach nicht dafür. Hätte gern den SOLAX X1 boost in den MP2 einbinden wollen, der WR gefällt mir ganz gut, habe auch ein paar davon, aber wie gesagt, wenn das dermaßen mühsam wird, geht es für mich zeitlich nicht mehr auf. (Meine Frau zieht auch schon eine Augenbraue hoch... ? )

Es ist aber auch schwierig, den Weg zu finden, ohne das Ziel zu kennen... zumindest mir geht das so.

Mal ganz abgesehen davon, einen SOLAX zu steuern, bzw. abzuregeln.

Um nur die Leistungsdaten zu erfassen reicht ja auch ein einfacher ET112 am USB-Port des MP2.

Kurz gesagt: tendenziell gebe ich nun auf.

Und an dieser Stelle ganz herzlichen Dank an und-mehr, profantus, Sebastian, Nadors.

Mach mal nee Pause.

1 „Gefällt mir“

Du bist schon fast am Ziel. Man muss am Anfang wirklich viel lernen und Zeit investieren. Das ist mit den meisten DIY Dingen ja so.

Kaufen und eine fertige Lösung haben oder halt für kleines Geld und viel Einsatz selber machen.

Du hast ja schon viel gelernt und hin bekommen. Schau mal wo du vor einer Woche warst.

Wenn ich Zeit finde konfiguriere ich dir noch die paar MQTT Nachrichten die dir noch fehlen ? .

1 „Gefällt mir“

Da habt ihr recht. War gestern abend sehr frustriert... weil ich so vieles noch nicht kapiere. Grade auch von den Grundlagen her: Wie muss man was schreiben, damit die beiden Teile sich verstehen... usw.

Heute schaut's schon wieder besser aus... ?

Eigentlich macht es mir ja schon Spaß, das zu lernen, und es eilt ja überhaupt nicht.

Aktuell nerve ich grad CHAT-GPT mit meinen Fragen... ist Klasse, der schreibt mir ganze code-Schnipsel.

Zum Beispiel:

Vielen Dank für die zusätzlichen Informationen. Hier ist ein Beispiel-Code für den ESP8266 in YAML, der Daten über RX und TX von Ihrem Hailege-Breakout-Board abruft und sie per MQTT an Ihren Raspberry Pi sendet:

esphome:
name: esp8266
platform: ESP8266
board: nodemcuv2
wifi:
ssid: "Ihr_WLAN_Name"
password: "Ihr_WLAN_Passwort"
# Optional: Fügen Sie eine statische IP-Adresse hinzu, wenn gewünscht
# manual_ip:
#   static_ip: 192.168.1.50
#   gateway: 192.168.1.1
#   subnet: 255.255.255.0
mqtt:
broker: "IP-Adresse des Raspberry Pi"
port: 1883
username: "Ihr_MQTT_Broker_Benutzername" # Wenn erforderlich
password: "Ihr_MQTT_Broker_Passwort" # Wenn erforderlich
uart:
rx_pin: GPIO5
tx_pin: GPIO4
baud_rate: 9600
sensor:
- platform: custom
lambda: |-
auto solax_parser(char* payload) {
uint16_t i = 0;
int data[4];
char* pch = strtok(payload, ",");
while (pch != NULL) {
data[i++] = atoi(pch);
pch = strtok(NULL, ",");
}
// Anpassen der Daten an Ihre spezifischen Anforderungen
float ac_output_power = data[0] / 1000.0;
float pv_input_voltage = data[1] / 10.0;
float grid_voltage = data[2] / 10.0;
float grid_frequency = data[3] / 100.0;
return {{"ac_output_power", ac_output_power},
{"pv_input_voltage", pv_input_voltage},
{"grid_voltage", grid_voltage},
{"grid_frequency", grid_frequency}};
}
# Fügen Sie weitere Sensorwerte hinzu, falls erforderlich
sensors:
- name: "AC Output Power"
unit_of_measurement: "W"
accuracy_decimals: 2
icon: "mdi:flash"
state_class: "measurement"
lambda: |-
return solax_parser(id(payload).c_str())["ac_output_power"];
- name: "PV Input Voltage"
unit_of_measurement: "V"
accuracy_decimals: 1
icon: "mdi:solar-power"
state_class: "measurement"
lambda: |-
return solax_parser(id(payload).c_str())["pv_input_voltage"];
- name: "Grid Voltage"
unit_of_measurement: "V"
accuracy_decimals: 1
icon: "mdi:transmission-tower"
state_class: "measurement"
lambda: |-
return solax_parser(id(payload).c_str())["grid_voltage"];
- name: "Grid Frequency"
unit_of_measurement: "Hz"
accuracy_decimals: 2
icon: "mdi:current-ac"
state_class: "measurement"
lambda: |-
return solax_parser(id(payload).c_str())["grid_frequency"];

Der SOLAX spricht ModbusRTU. Kannst du den Beispiel-Code entsprechend anpassen?

Sicher, hier ist eine angepasste Version des Beispiel-Codes für die Verwendung von ModbusRTU mit dem SOLAX X1 boost.

esphome:
name: esp8266
platform: ESP8266
board: nodemcuv2
wifi:
ssid: "Ihr_WLAN_Name"
password: "Ihr_WLAN_Passwort"
# Optional: Fügen Sie eine statische IP-Adresse hinzu, wenn gewünscht
# manual_ip:
#   static_ip: 192.168.1.50
#   gateway: 192.168.1.1
#   subnet: 255.255.255.0
mqtt:
broker: "IP-Adresse des Raspberry Pi"
port: 1883
username: "Ihr_MQTT_Broker_Benutzername" # Wenn erforderlich
password: "Ihr_MQTT_Broker_Passwort" # Wenn erforderlich
modbus:
- id: modbus_solax
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 1
address: 1
sensor:
- platform: modbus
coils:
- name: "Coil 1"
slave: modbus_solax
address: 0
registers:
- name: "AC Output Power"
unit_of_measurement: "W"
accuracy_decimals: 2
icon: "mdi:flash"
slave: modbus_solax
address: 3089
data_type: float
- name: "PV Input Voltage"
unit_of_measurement: "V"
accuracy_decimals: 1
icon: "mdi:solar-power"
slave: modbus_solax
address: 3057
data_type: float
- name: "Grid Voltage"
unit_of_measurement: "V"
accuracy_decimals: 1
icon: "mdi:transmission-tower"
slave: modbus_solax
address: 3073
data_type: float
- name: "Grid Frequency"
unit_of_measurement: "Hz"
accuracy_decimals: 2
icon: "mdi:current-ac"
slave: modbus_solax
address: 3077
data_type: float
mqtt:
broker: "IP-Adresse des Raspberry Pi"
username: "Ihr_MQTT_Broker_Benutzername" # Wenn erforderlich
password: "Ihr_MQTT_Broker_Passwort" # Wenn erforderlich
# Fügen Sie weitere Sensorwerte hinzu, falls erforderlich
topic_prefix: "home/sensors/solax"
discovery: true

In diesem Beispiel wird die modbus-Komponente verwendet, um die Daten vom SOLAX X1 boost abzurufen. Die sensor-Komponente wird verwendet, um die gemessenen Werte als MQTT-Topics zu veröffentlichen.

Bitte beachten Sie, dass die Modbus-Registeradressen und -datentypen in diesem Beispiel spezifisch für den SOLAX X1 boost sind. Wenn Sie ein anderes Gerät verwenden, müssen Sie möglicherweise die Registeradressen und -datentypen entsprechend anpassen.

Um dich ein bisschen zu motivieren:

Hier das Script das erstmal was tut und Werte nach MQTT schickt. Da ich keine Solax hab kann ich das natürlich nicht komplett testen.

Es geht aber schon mal so weit das sich der ESP32 via MQTT meldet und an Venus OS an meldet.

MQTT Explorer:

https://github.com/thomasnordquist/MQTT-Explorer/releases/download/0.0.0-0.4.0-beta1/MQTT-Explorer-Setup-0.4.0-beta1.exe

# This configuration is for a Solax X1 Boost
#
# The Solax X1 Boost can be interfaced using ModbusRTU via RS485.
#
# Please `enable` the Modbus support at the settings (password 6868)
# of your inverter and make sure the modbus address is set to `1`.
#
# Kudos to @benjaminvdb and @kidwellj
#
#  https://github.com/syssi/esphome-solax-x1-mini/issues/31
#  https://github.com/aiolos/ESPHome-config/blob/main/modbus-solax.yaml
substitutions:
name: solar-powermeter-32
device_description: "Monitor a Solax X1 Boost via RS485"
tx_pin: GPIO16    #esp32
rx_pin: GPIO17    #esp32
device_name: "solar-powermeter-32"
client_id: "PvInveter1"
sensor_name: "L1"
device_instance: "150"
position: "1"
globals:
- id: vrm_portal_id
type: std::string
restore_value: no
initial_value: ''
- id: sensor_id
type: int
restore_value: no
initial_value: '0'
esphome:
name: ${name}
comment: ${device_description}
project:
name: "syssi.esphome-solax-x1-mini"
version: 2.1.0
esp32:
board: wemos_d1_mini32
wifi:
ssid: "********"
password: "**********"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "SolaxHotspot"
password: "HotspotSolax"
web_server:
port: 80
version: 1
include_internal: true
ota:
logger:
level: ERROR
# level: INFO
logs:
mqtt: NONE
mqtt.client: NONE
mqtt.component: NONE
mqtt:
broker: localhost # +++ localhost kann nicht stimmen. Hier die IP eintragen vom MQTT-Server
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"] = 0;
- 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"] = 5000;
switch:
- platform: restart
name: ${device_name} Restart
uart:
baud_rate: 9600
data_bits: 8
id: mod_bus
parity: NONE
rx_buffer_size: 1024
stop_bits: 1
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
modbus:
- id: modbus0
#    uart_id: uart0
#    flow_control_pin: GPIO0
modbus_controller:
- id: solax0
address: 0x1
modbus_id: modbus0
setup_priority: -10
command_throttle: 750ms
update_interval: 15s
text_sensor:
# - name: "SOLAX inverter model"
#   id: inverter_model
#   icon: "mdi:information"
#   platform: modbus_controller
#   modbus_controller_id: solax0
#   register_type: holding
#   address: 30000
#   register_count: 15
#   response_size: 30
#   skip_updates: 100
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} operation mode"
#   address: 0x40f
#   register_type: read
#   raw_encode: HEXBYTES
#   lambda: |-
#     uint16_t value = modbus_controller::word_from_hex_str(x, 0);
#     switch (value) {
#       case 0: return std::string("Waiting");
#       case 1: return std::string("Checking");
#       case 2: return std::string("Normal");
#       case 3: return std::string("Fault");
#       case 4: return std::string("Permanent Fault");
#       case 5: return std::string("Update");
#       case 6: return std::string("Off-grid waiting");
#       case 7: return std::string("Off-grid");
#       case 8: return std::string("Self Testing");
#       case 9: return std::string("Idle");
#       case 10: return std::string("Standby");
#     }
#     return std::string("Unknown");
sensor:
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} PV1 input voltage"
#   address: 0x400
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: V
#   device_class: voltage
#   state_class: measurement
#   accuracy_decimals: 1
#   filters:
#     - multiply: 0.1
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} PV2 iput voltage"
#   address: 0x401
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: V
#   device_class: voltage
#   state_class: measurement
#   accuracy_decimals: 1
#   filters:
#     - multiply: 0.1
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} PV1 iput crrent"
#   address: 0x402
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: A
#   device_class: current
#   state_class: measurement
#   accuracy_decimals: 1
#   filters:
#     - multiply: 0.1
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} PV2 input current"
#   address: 0x403
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: A
#   device_class: current
#   state_class: measurement
#   accuracy_decimals: 1
#   filters:
#     - multiply: 0.1
- 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;
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} grid frequency"
#   address: 0x407
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: Hz
#   device_class: frequency
#   state_class: measurement
#   accuracy_decimals: 2
#   filters:
#     - multiply: 0.01
- platform: modbus_controller
id: inverter_grid_current
modbus_controller_id: solax0
name: "${name} output current"
address: 0x40A
register_type: read
value_type: U_WORD
unit_of_measurement: A
device_class: current
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/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;
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} temperature"
#   address: 0x40D
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: "°C"
#   device_class: temperature
#   state_class: measurement
#   accuracy_decimals: 0
- platform: modbus_controller
id: inverter_active_power
modbus_controller_id: solax0
name: "${name} inverter power"
address: 0x40e
register_type: read
value_type: U_WORD
unit_of_measurement: W
device_class: power
state_class: measurement
accuracy_decimals: 0
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;
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   id: solax0_power_dc1
#   name: "${name} power dc1"
#   address: 0x414
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: W
#   device_class: power
#   state_class: measurement
#   accuracy_decimals: 0
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   id: solax0_power_dc2
#   name: "${name} power dc2"
#   address: 0x415
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: W
#   device_class: power
#   state_class: measurement
#   accuracy_decimals: 0
#   on_value:
#     then:
#       component.update: solax0_total_dc_power
# - platform: template
#   id: solax0_total_dc_power
#   name: "${name} total dc power"
#   update_interval: never
#   unit_of_measurement: W
#   device_class: power
#   state_class: measurement
#   accuracy_decimals: 0
#   lambda: |-
#     return (id(solax0_power_dc1).state + id(solax0_power_dc2).state);
# - platform: modbus_controller
#   modbus_controller_id: solax0
#   name: "${name} energy total"
#   address: 0x423
#   register_type: read
#   value_type: U_WORD
#   unit_of_measurement: kWh
#   device_class: energy
#   state_class: total_increasing
#   accuracy_decimals: 1
#   filters:
#     - multiply: 0.1
- platform: modbus_controller
id: inverter_daily_energy
modbus_controller_id: solax0
name: "${name} energy today"
address: 0x425
register_type: read
value_type: U_WORD
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
accuracy_decimals: 1
filters:
- multiply: 0.1
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;

WIFI musst du noch ändern wo jetzt ******** drin steht.

MQTT Server Adresse musst du ändern. localhost kann da nicht passen. Da muss die IP von deinem Raspberry rein.

Folgendes vorgehen schlag ich vor:

  1. MQTT Explorer installieren und am Raspberry anmelden. Wenn das klappt kennst du schon mal die Zugangsdaten. Bei mir ist Benutzer und Passwort leer und ich muss nur die IP vom Raspberry konfigurieren. Sieht so aus

  1. Zugangsdaten des MQTT Server eintragen und laufen lassen. Du musst dann im MQTT Explorer einen Eintrag mit solar-powermeter-32 sehen und unter devices einen Eintrag mit PvInverter2.

Wenn das klappt ist auf der MQTT Seite alles ok und wenn du den Treiber in Venus korrekt konfiguriert hast siehst du den Inverter.

1 „Gefällt mir“

Nette Idee das mit ChatGPT zu probieren. Die Modbus-Adressen passen aber wohl nicht bzw. sind nicht die aus der yaml von gestern. Ich habe übrigens im Beispiel oben alles auskommentiert (als die # vor die Zeile gesetzt) was momentan in Kombination mit Venus OS keinen Sinn macht da die Werte nicht verwendet werden.

Wenn du das brauchst einfach die # wieder raus nehmen.

Hast du eine Dokumentation des Modbus Protokolls für den Solax? Ich hab mal gesucht aber nichts gefunden. Daher kann ich nicht sagen ob die Register passen. Da du aber schon was empfangen hast scheint das ja korrekt zu sein.

1 „Gefällt mir“

Danke! Das schaut erstmal gut aus.

Ein Communication_Protocol für den SOLAX habe ich, das hänge ich mal unten an.

Dann stimmt noch was bei meinem RasPi nicht, oder?

Das mit ChatGPT ist echt krass, wie gut das funktioniert. Hätte ich nie erwartet, bin total beeindruckt...

Ist halt super um sowas zu lernen, weil man quasi Schritt für Schritt einen code aufgebaut bekommt, und so die einzelnen Schritte besser versteht.

SolaxPower_Single_Phase_External_Communication_Protocol_X1_V1.8.pdf (743 KB)

Ja.

MQTT sieht gut aus aber du bekommst die vrm_portal_id und die sensor_id nicht zurück.

Das müsste von den Pfaden im MQTT Explorer etwa so aussehen:

als unter W (wie write ?) die vrm_portal_id und dann hinter pvinverter eine 1 (0 ist der default Wert daher hier eine Zahl grösser 0).

Geh auf dem Raspi nochmal die Installationsanleitung durch:

Also das hier:

$ mkdir -p /data/drivers
$ cd /data/drivers
$ wget -O dbus-mqtt-devices.zip https://github.com/freakent/dbus-mqtt-devices/archive/refs/tags/v0.5.1.zip
$ unzip dbus-mqtt-devices.zip
$ ./dbus-mqtt-devices-0.5.1/bin/setup.sh
1 „Gefällt mir“

Habe ich nochmal drübergeschrieben. setup endet mit Fehler:

root@raspberrypi4:/data/drivers# ./dbus-mqtt-devices-0.5.1/bin/setup.sh
Setup dbus-mqtt-devices in /data/drivers/dbus-mqtt-devices-0.5.1 started
Ensure Python's Pip is installed
pip 20.0.2 from /usr/lib/python3.8/site-packages/pip (python 3.8)
Pip install module dependencies
Collecting PyYAML==6.0
Using cached PyYAML-6.0.tar.gz (124 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
ERROR: Exception:
Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 186, in _main
status = self.run(options, args)
File "/usr/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 331, in run
resolver.resolve(requirement_set)
File "/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
discovered_reqs.extend(self._resolve_one(requirement_set, req))
File "/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 282, in _get_abstract_dist_for
abstract_dist = self.preparer.prepare_linked_requirement(req)
File "/usr/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 515, in prepare_linked_requi rement
abstract_dist = _get_prepared_distribution(
File "/usr/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 95, in _get_prepared_distrib ution
abstract_dist.prepare_distribution_metadata(finder, build_isolation)
File "/usr/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py", line 38, in prepare_distribution _metadata
self._setup_isolation(finder)
File "/usr/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py", line 96, in _setup_isolation
reqs = backend.get_requires_for_build_wheel()
File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/wrappers.py", line 151, in get_requires_for_build_wh eel
return self._call_hook('get_requires_for_build_wheel', {
File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/wrappers.py", line 255, in _call_hook
raise BackendUnavailable(data.get('traceback', ''))
pip._vendor.pep517.wrappers.BackendUnavailable: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py", line 63, in _build_backend
obj = import_module(mod_path)
File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 843, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/init.py", li ne 18, in <module>
from setuptools.dist import Distribution
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/dist.py", line 4 2, in <module>
from setuptools.config import setupcfg, pyprojecttoml
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/config/init. py", line 10, in <module>
from . import setupcfg
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/config/setupcfg. py", line 30, in <module>
from setuptools.extern.packaging.requirements import Requirement, InvalidRequirement
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/_vendor/packagin g/requirements.py", line 8, in <module>
from ._parser import parse_requirement
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/_vendor/packagin g/_parser.py", line 10, in <module>
from ._tokenizer import DEFAULT_RULES, Tokenizer
File "/var/volatile/tmp/pip-build-env-w9mrkui4/overlay/lib/python3.8/site-packages/setuptools/_vendor/packagin g/_tokenizer.py", line 3, in <module>
from dataclasses import dataclass
ModuleNotFoundError: No module named 'dataclasses'
Set up Victron module libraries
Set up device service to autorun on restart
Setup dbus-mqtt-devices complete
root@raspberrypi4:/data/drivers#

Der mqtt-service läuft wohl nicht.

root@raspberrypi4:~# svstat /service/dbus-mqtt-devices
/service/dbus-mqtt-devices: up (pid 2353) 0 seconds
root@raspberrypi4:~#