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"