NEWS
ESPHome json per mqtt senden
-
Hallo zusammen ich versuche von meinem Growatt modstick auf dem ESPHome läuft werte direkt an mein VenusOS zu senden.
so sieht meine config aus ```
substitutions:
devicename: "esphome-growatt-01"
upper_devicename: "ESPHome Growatt 01"esphome:
name: $devicename
platform: ESP8266
board: esp07sEnable logging
logger:
baud_rate: 0Enable Home Assistant API
#api:
password: "01234"
mqtt:
broker: 192.168.1.12
port: 1884
username: Nils
password: !secret mqtt_passwordota:
password: "01234"wifi:
ssid: !secret wifi_ssid
password: !secret wifi_passwordEnable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "GGrowatt"
password: "oLjULFvNXq1l"Enable Web server
web_server:
port: 80captive_portal:
#time:
- platform: homeassistant
id: homeassistant_time
output:
Blue Led
- id: light_bl platform: gpio pin: 16
Green Led
- id: light_gr platform: gpio pin: 0
Red Led
- id: light_rd platform: gpio pin: 2
uart:
id: mod_bus
tx_pin: 1
rx_pin: 3
baud_rate: 115200modbus:
id: modbus1
uart_id: mod_busmodbus_controller:
- id: growattthe Modbus device addr
address: 0x1 modbus_id: modbus1 update_interval: 10s setup_priority: -10
sensor:
- platform: modbus_controller
name: "${devicename} DcPower"
address: 5
register_type: "read"
unit_of_measurement: W
device_class: power
icon: mdi:flash
value_type: U_DWORD
accuracy_decimals: 1
filters:
- multiply: 0.1- platform: modbus_controller name: "${devicename} DcVoltage" address: 3 register_type: "read" unit_of_measurement: V device_class: voltage icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} DcInputCurrent" address: 4 register_type: "read" unit_of_measurement: A device_class: current icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} AcFrequency" address: 37 register_type: "read" unit_of_measurement: Hz icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.01 - platform: modbus_controller name: "${devicename} AcVoltage" id: pv_voltage address: 38 register_type: "read" unit_of_measurement: V device_class: voltage icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} AcOutputCurrent" id: pv_current address: 39 register_type: "read" unit_of_measurement: A device_class: current icon: mdi:flash value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} AcPower" id: pv_power address: 40 register_type: "read" unit_of_measurement: W device_class: power icon: mdi:flash value_type: U_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 on_value: then: - mqtt.publish_json: topic: "Growatt/mic2000/meters" payload: | { "pv": { "power": id(pv_power).state, "voltage": id(pv_voltage).state, "current": id(pv_current).state, "energy_forward": id(pv_energy_forward).state, "L1": { "power": id(pv_power).state, "voltage": id(pv_voltage).state, "current": id(pv_current).state, "energy_forward": id(pv_energy_forward).state } }} - platform: modbus_controller name: "${devicename} EnergyToday" address: 53 register_type: "read" unit_of_measurement: kWh device_class: energy icon: mdi:flash value_type: U_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} EnergyTotal" id: pv_energy_forward address: 55 register_type: "read" unit_of_measurement: kWh state_class: total_increasing device_class: energy icon: mdi:flash value_type: U_DWORD accuracy_decimals: 2 filters: - multiply: 0.1 - platform: modbus_controller name: "${devicename} Temperature" address: 93 register_type: "read" unit_of_measurement: C device_class: temperature icon: mdi:thermometer value_type: U_WORD accuracy_decimals: 1 filters: - multiply: 0.1 - platform: mqtt_subscribe name: "mqtttest" id: mqtttest topic: the/topic on_value: then: - lambda: |- esphome::modbus_controller::ModbusController *controller = id(growatt); uint16_t reg = 3; // Register: Max output active power (in %) float value = id(mqtttest).state; uint16_t register_value = static_cast<uint16_t>(value); modbus_controller::ModbusCommandItem setOutputPower_command = modbus_controller::ModbusCommandItem::create_write_single_command(controller, reg, register_value); controller->queue_command(setOutputPower_command); #- platform: mqtt_subscribe # name: "mqtttest" # id: mqtttest # topic: the/topic # on_value: # lambda: |- # id(poweroutput).state;
#neu test power factor 02/2023
number:
- platform: modbus_controller
name: "${devicename} Max Output Active Power"
id: poweroutput
address: 3
value_type: U_WORD
min_value: 0
max_value: 100
entity_category: config
step: 1ich habe folgenden abschnitt hinzugefügt
on_value:
then:
- mqtt.publish_json:
topic: "Growatt/mic2000/meters"
payload: |
{
"pv": {
"power": id(pv_power).state,
"voltage": id(pv_voltage).state,
"current": id(pv_current).state,
"energy_forward": id(pv_energy_forward).state,
"L1": {
"power": id(pv_power).state,
"voltage": id(pv_voltage).state,
"current": id(pv_current).state,
"energy_forward": id(pv_energy_forward).state
}
}}Vorweg vorher lief es über Node Red ohne Probleme Die payload soll folgendermaßen aussehen
msg.payload = {
"pv": {
"power": msg.payload["P"],
"voltage": msg.payload["V"],
"current": msg.payload["I"],
"energy_forward": msg.payload["W"],
"L1": {
"power": msg.payload["P"],
"voltage": msg.payload["V"],
"current": msg.payload["I"],
"energy_forward": msg.payload["W"],
}
}
}return msg;
Evtl hat jemand einen tip
-
Warum machst Du es dann nicht weiter über NodeRed?
-
@mickym Node red läuft auf einem zusätzlichen gerät. warum die Daten per Mqtt an den IoBroker senden dort in Node red dann wieder per Mqtt an das VenusOS senden.
Ich habe nur leider wenig ahnung von ESPHome und yaml. Es ist merh ein Trial & Error. -
@jacke Du sendest nicht. Das VenusOS ist ein mqtt-Broker und kann beliebig viele mqtt-Clients bedienen. Du kannst Dir ja dann NodeRed auf dem zusätzlichen Gerät sparen, wenn Du NodeRed als Logikmaschine im iobroker verwendest.
-
@mickym ich schicke es ja nicht am das Venus sondern am einem zusätzlichen Treiber auf dem VenusOS dieser subscribed ein topic von einem Broker uns sendet die Daten an das dbus system.
Ich bin noch ziemlich unerfahren in node red aber ist der Venus Treiber dann nicht Client?
Mir fällt gerade auf das ich im esp Home den iobroker als Broker angebe also benötige ich ihn doch noch. Besser wäre ohne.
Ich habe den esp Code hinbekommen das richtige Stichwort was mir geholfen hat war adruino json library.
So sieht der richtige code auson_value: then: - mqtt.publish_json: topic: "Growatt/mic2000/meters" payload: |- root["pv"]["power"] = id(pv_power).state; root["pv"]["voltage"] = id(pv_voltage).state; root["pv"]["current"] = id(pv_current).state; root["pv"]["energy_forward"] = id(pv_energy_forward).state; root["pv"]["L1"]["power"] = id(pv_power).state; root["pv"]["L1"]["voltage"] = id(pv_voltage).state; root["pv"]["L1"]["current"] = id(pv_current).state; root["pv"]["L1"]["energy_forward"] = id(pv_energy_forward).state;
-
@jacke Für das ESP Home brauchst Du einen mqtt-Broker. Ich hätte Dir aber eher einen externen Broker, wie mosquitto empfohlen. Aber kannst Du immer noch machen,
-
@mickym ich hätte es halt gerne komplett ohne zusätzliche Hardware. Also nur den Growatt stick mit ESHome und das Vensu OS ich weiß nicht ob ich den MQTT vom VenusOS benutzen kann?
Aber das gehört bestimmt ins Victron forum? -
@jacke Ja ich kann Dir da nicht helfen. Aber ich glaube auch nicht dass Du das VenusOS als normalen Mqtt-Broker nutzen kannst.
-
@jacke
Ich vermute mal, du willst die Daten im Victron-System abbilden.
Dann müssen die noch auch dem Venus-OS von MQTT auf dbus umgeschrieben werden.
Hier habe ich zB. etwas dazu gefunden: https://github.com/Louisvdw/dbus-serialbattery/discussions/258#discussioncomment-5482398Ansonsten, ja - auf dem Venus-OS läuft ein vollständiger MQTT-Broker. Noch ist es mosquitto, bald soll es FlashMQ werden.