substitutions: name: soyosource-gtn-display device_description: "Monitor and control the Soyosource GTN (WiFi version) via the display port and control the power output on demand via RS485" external_components_source: github://syssi/esphome-soyosource-gtn-virtual-meter@main # The display port should be connected to these GPIOs using a USB connector (VCC, RX, TX, GND) # A optocoupler / optical isolator (f.e. ADUM1201) between the display port and the ESP is recommended if the ESP isn't powered by the display port! tx_pin_ttl_wifi: GPIO4 rx_pin_ttl_wifi: GPIO5 tx_pin_rs485: GPIO14 rx_pin_rs485: GPIO12 esphome: name: ${name} friendly_name: ${name} comment: ${device_description} project: name: "syssi.esphome-soyosource-gtn-virtual-meter" version: 2.6.0 esp8266: board: d1_mini external_components: - source: ${external_components_source} refresh: 0s wifi: ssid: !secret wifi_ssid password: !secret wifi_password min_auth_mode: WPA2 ota: platform: esphome logger: level: INFO # 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: !secret mqtt_host username: !secret mqtt_username password: !secret mqtt_password id: mqtt_client # api: uart: - id: uart_0 baud_rate: 9600 tx_pin: ${tx_pin_ttl_wifi} rx_pin: ${rx_pin_ttl_wifi} - id: uart_1 baud_rate: 4800 tx_pin: ${tx_pin_rs485} rx_pin: ${rx_pin_rs485} soyosource_modbus: - id: modbus0 uart_id: uart_1 # flow_control_pin: GPIO12 # Optional settings # # The name is used as prefix for some log messages and should # help to distinguish between different instances/devices name: firstfloor_inverter soyosource_virtual_meter: - id: virtualmeter0 soyosource_modbus_id: modbus0 # The state of this sensor (instantaneous power in watt) is used as source power_id: powermeter0 # Optional settings power_sensor_inactivity_timeout: 20s power_demand_calculation: NEGATIVE_MEASUREMENTS_REQUIRED min_power_demand: 0 max_power_demand: 900 zero_output_on_min_power_demand: true # Split/distribute the power demand if you have multiple inverters attached to the same RS485 bus power_demand_divider: 1 # A positive buffer value (10) tries to avoid exporting power to the grid (demand - 10 watts) # A negative buffer value (-10) exports power to the grid (demand + 10 watts) buffer: 10 # The operation_status_id sensor is expected here. Passing the operation_status won't work # The state is used to suspend the limiter if the operation status of the inverter isn't 0x0 (normal) operation_status_id: operation_status_id0 # The update interval is important and defaults to 3 seconds. If the demand is sent too frequently # or rarely the interverter stops. TODO: Identify and validate the lower and upper update limit update_interval: 3s soyosource_display: - id: display0 uart_id: uart_0 protocol_version: SOYOSOURCE_WIFI_VERSION update_interval: 5s binary_sensor: - platform: soyosource_display fan_running: name: "fan running" limiter_connected: name: "limiter connected" button: - platform: soyosource_display restart: name: "restart" number: - platform: soyosource_virtual_meter soyosource_virtual_meter_id: virtualmeter0 buffer: name: "buffer" initial_value: 10 restore_value: true manual_power_demand: name: "manual power demand" max_value: 900 max_power_demand: name: "max power demand" initial_value: 600 max_value: 900 restore_value: true power_demand_divider: name: "power demand divider" initial_value: 1 restore_value: true - platform: soyosource_display start_voltage: name: "start voltage" shutdown_voltage: name: "shutdown voltage" # Maximum output power in limiter mode / Output power in constant power mode output_power_limit: name: "output power limit" start_delay: name: "start delay" select: - platform: soyosource_display operation_mode: name: "operation mode" optionsmap: 1: "PV" 2: "Battery Constant Power" 17: "PV Limit" 18: "Battery Limit" sensor: - platform: soyosource_virtual_meter soyosource_virtual_meter_id: virtualmeter0 power_demand: name: "power demand" - platform: soyosource_display error_bitmask: name: "error bitmask" operation_mode_id: name: "operation mode id" operation_status_id: name: "operation status id" id: operation_status_id0 battery_voltage: name: "battery voltage" battery_current: name: "battery current" battery_power: name: "battery power" ac_voltage: name: "ac voltage" ac_frequency: name: "ac frequency" temperature: name: "temperature" output_power: name: "output power" # mqtt subscribe example - id: powermeter0 internal: true platform: mqtt_subscribe name: "instantaneous power consumption" topic: "smartmeter/sensor/groundfloor/obis/1-0:16.7.0/255/value" accuracy_decimals: 2 unit_of_measurement: W device_class: power filters: - throttle_average: 15s # # import smartmeter reading from homeassistant # # requires the "api" component see above # - platform: homeassistant # id: powermeter0 # name: "smartmeter instantaneous power" # entity_id: sensor.firstfloor_smartmeter_instantaneous_power # filters: # - throttle_average: 15s switch: - platform: soyosource_virtual_meter soyosource_virtual_meter_id: virtualmeter0 manual_mode: name: "manual mode" restore_mode: RESTORE_DEFAULT_ON emergency_power_off: name: "emergency power off" restore_mode: RESTORE_DEFAULT_OFF text_sensor: - platform: soyosource_virtual_meter soyosource_virtual_meter_id: virtualmeter0 operation_mode: name: "limiter operation mode" - platform: soyosource_display errors: name: "errors" operation_mode: name: "operation mode" operation_status: name: "operation status"