esphome: name: oekoboiler-interface friendly_name: Oekoboiler-Interface esp8266: board: nodemcuv2 # Enable logging logger: baud_rate: 0 # Enable Home Assistant API api: encryption: key: !secret oekoboiler_encryptionkey reboot_timeout: 0s ota: - platform: esphome password: !secret oekoboiler_otapassword wifi: ssid: !secret wifi_ssid password: !secret wifi_password power_save_mode: none # Disable power saving fast_connect: true # Skip scanning, connect faster reboot_timeout: 0s # Disable auto-reboot on wifi loss # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Oekoboiler-Interface" password: !secret oekoboiler_fallbackpassword captive_portal: #web_server: # port: 80 # UART configuration for Modbus (0-based register addressing) uart: id: mod_bus tx_pin: GPIO1 # D10/TX rx_pin: GPIO3 # D9/RX baud_rate: 9600 stop_bits: 1 data_bits: 8 parity: NONE # Modbus RTU modbus: flow_control_pin: GPIO5 # D1 - DE/RE pin for MAX485 id: modbus1 send_wait_time: 200ms modbus_controller: - id: oekoboiler address: 0x1 modbus_id: modbus1 setup_priority: -10 update_interval: 10s command_throttle: 200ms sensor: # WiFi Signal - platform: wifi_signal name: "WiFi Signal" update_interval: 60s # Uptime - platform: uptime name: "Uptime" update_interval: 60s # ======================================== # INPUT REGISTERS (3x) - Documentation address MINUS 1 # ======================================== # A1 - Water Temperature (30001 -> 0) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Water Temperature" address: 0 register_type: read value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # A2 - Evaporator Temperature (30002 -> 1) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Evaporator Temperature" address: 1 register_type: read value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # A4 - Ambient Temperature (30003 -> 2) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Ambient Temperature" address: 2 register_type: read value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # A3 - Exhaust Temperature (30004 -> 3) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Exhaust Temperature" address: 3 register_type: read value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # A9 - Return Gas Temperature (30005 -> 4) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Return Gas Temperature" address: 4 register_type: read value_type: S_WORD unit_of_measurement: "°C" device_class: temperature state_class: measurement accuracy_decimals: 1 filters: - multiply: 0.1 # ======================================== # HOLDING REGISTERS (4x) - Read-only values # ======================================== # Controller Status (41102 -> 1101) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Controller Status Raw" id: controller_status_raw address: 1101 register_type: holding value_type: U_WORD internal: true # Operating Mode (41105 -> 1104) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Mode Raw" id: mode_raw address: 1104 register_type: holding value_type: U_WORD internal: true # Econ Mode Time Window (41106 -> 1105) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Econ Mode Time Window" address: 1105 register_type: holding value_type: U_WORD skip_updates: 4 # Alarm sensors (41121-41133 -> 1120-1132) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A1 Sensor" address: 1120 register_type: holding value_type: U_WORD internal: true id: alarm_a1 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A2 Sensor" address: 1121 register_type: holding value_type: U_WORD internal: true id: alarm_a2 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A3 Sensor" address: 1122 register_type: holding value_type: U_WORD internal: true id: alarm_a3 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A6 Sensor" address: 1125 register_type: holding value_type: U_WORD internal: true id: alarm_a6 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A5 High Pressure" address: 1126 register_type: holding value_type: U_WORD internal: true id: alarm_a5 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A4 Sensor" address: 1127 register_type: holding value_type: U_WORD internal: true id: alarm_a4 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Water Temp Warning 55C" address: 1128 register_type: holding value_type: U_WORD internal: true id: alarm_water_temp - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A9 Sensor" address: 1129 register_type: holding value_type: U_WORD internal: true id: alarm_a9 - platform: modbus_controller modbus_controller_id: oekoboiler name: "Alarm A8 Condensate" address: 1130 register_type: holding value_type: U_WORD internal: true id: alarm_a8 binary_sensor: - platform: status name: "Connection Status" # ======================================== # COILS (0x) - Documentation address MINUS 1 # ======================================== # Compressor (00001 -> 0) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Compressor Running" address: 1 register_type: coil device_class: running # Heating Element (00002 -> 1) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heating Element" address: 2 register_type: coil device_class: heat # Fan (00004 -> 3) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Four-Way Valve" address: 3 register_type: coil device_class: running # Fan (00004 -> 3) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Fan Running" address: 4 register_type: coil device_class: running # ======================================== # DISCRETE INPUTS (1x) - Documentation address MINUS 1 # ======================================== # Template binary sensors for alarms - platform: template name: "Alarm: A1 Water Temp Sensor" device_class: problem lambda: |- return id(alarm_a1).state != 0; - platform: template name: "Alarm: A2 Evaporator Sensor" device_class: problem lambda: |- return id(alarm_a2).state != 0; - platform: template name: "Alarm: A3 Ambient Sensor" device_class: problem lambda: |- return id(alarm_a3).state != 0; - platform: template name: "Alarm: A6 Heating Element" device_class: problem lambda: |- return id(alarm_a6).state != 0; - platform: template name: "Alarm: A5 High Pressure" device_class: problem lambda: |- return id(alarm_a5).state != 0; - platform: template name: "Alarm: A4 Exhaust Sensor" device_class: problem lambda: |- return id(alarm_a4).state != 0; - platform: template name: "Warning: Water Temperature 55°C" device_class: problem lambda: |- return id(alarm_water_temp).state != 0; - platform: template name: "Alarm: A9 Return Gas Sensor" device_class: problem lambda: |- return id(alarm_a9).state != 0; - platform: template name: "Alarm: A8 Condensate Overflow" device_class: problem lambda: |- return id(alarm_a8).state != 0; text_sensor: - platform: template name: "Controller Status" lambda: |- int status = (int)id(controller_status_raw).state; switch(status) { case 0: return {"Power Off"}; case 1: return {"Standby"}; case 2: return {"Preheating"}; case 3: return {"Heating"}; case 4: return {"Before Defrost"}; case 5: return {"Defrosting"}; case 6: return {"After Defrost"}; case 8: return {"Alarm"}; default: return {"Unknown (" + to_string(status) + ")"}; } - platform: template name: "Operating Mode" lambda: |- int mode = (int)id(mode_raw).state; switch(mode) { case 0: return {"Econ Mode"}; case 1: return {"Auto Mode"}; case 2: return {"Heater Mode"}; default: return {"Unknown (" + to_string(mode) + ")"}; } switch: # ======================================== # WRITABLE HOLDING REGISTERS - Switches # ======================================== # PV Mode (40067 -> 66) - platform: modbus_controller modbus_controller_id: oekoboiler name: "PV Mode" address: 66 register_type: holding bitmask: 1 entity_category: config icon: "mdi:solar-power" # Heating Element Enable (40015 -> 14) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heating Element Enable" address: 14 register_type: holding bitmask: 1 entity_category: config icon: "mdi:heating-coil" # Heating Element for Sterilization (40017 -> 16) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Sterilization Enable" address: 16 register_type: holding bitmask: 1 entity_category: config icon: "mdi:bacteria" # Heating Element in Econ Mode (40028 -> 27) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heating Element in Econ Mode" address: 27 register_type: holding bitmask: 1 entity_category: config # Heat Pump in Heater Mode (40029 -> 28) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heat Pump in Heater Mode" address: 28 register_type: holding bitmask: 1 entity_category: config # Save Status on Power Off (40061 -> 60) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Save Status on Power Off" address: 60 register_type: holding bitmask: 1 entity_category: config # Electronic Anode (40068 -> 67) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Electronic Anode" address: 67 register_type: holding bitmask: 1 entity_category: config number: # ======================================== # WRITABLE HOLDING REGISTERS - Numbers # ======================================== # Set Temperature PV (40009 -> 8) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Target Temperature (PV Mode)" address: 8 value_type: U_WORD unit_of_measurement: "°C" device_class: temperature min_value: 5 max_value: 70 step: 1 mode: box use_write_multiple: true entity_category: config icon: "mdi:solar-power" # Set Temperature Normal (40010 -> 9) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Target Temperature (Normal)" address: 9 value_type: U_WORD unit_of_measurement: "°C" device_class: temperature min_value: 5 max_value: 70 step: 1 mode: box use_write_multiple: true entity_category: config # Set Temperature F62=0 (40011 -> 10) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Target Temperature (F62=0)" address: 10 value_type: U_WORD unit_of_measurement: "°C" device_class: temperature min_value: 5 max_value: 70 step: 1 mode: box use_write_multiple: true entity_category: config # Temperature Delta/Hysteresis (40012 -> 11) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Temperature Hysteresis" address: 11 value_type: U_WORD unit_of_measurement: "°C" min_value: 1 max_value: 20 step: 1 mode: box use_write_multiple: true entity_category: config icon: "mdi:thermometer-lines" # Ambient Temperature Shutdown (40013 -> 12) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heat Pump Shutdown Temperature" address: 12 value_type: S_WORD unit_of_measurement: "°C" device_class: temperature min_value: -10 max_value: 5 step: 1 mode: box use_write_multiple: true entity_category: config # Maximum Temperature with Heat Pump (40014 -> 13) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Max Temperature Heat Pump" address: 13 value_type: U_WORD unit_of_measurement: "°C" device_class: temperature min_value: 20 max_value: 60 step: 1 mode: box use_write_multiple: true entity_category: config # Ambient Temperature for Heating Element Start (40016 -> 15) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Heating Element Start Temperature" address: 15 value_type: U_WORD unit_of_measurement: "°C" device_class: temperature min_value: 10 max_value: 20 step: 1 mode: box use_write_multiple: true entity_category: config # Sterilization Cycle (40018 -> 17) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Sterilization Cycle Hours" address: 17 value_type: U_WORD unit_of_measurement: "h" min_value: 1 max_value: 990 step: 1 mode: box use_write_multiple: true entity_category: config icon: "mdi:bacteria" # A1 Temperature Sensor Offset (40019 -> 18) - platform: modbus_controller modbus_controller_id: oekoboiler name: "A1 Sensor Offset" address: 18 value_type: S_WORD unit_of_measurement: "°C" device_class: temperature min_value: -5 max_value: 5 step: 1 mode: box use_write_multiple: true entity_category: config # Compressor Delay (40021 -> 20) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Compressor Delay" address: 20 value_type: U_WORD unit_of_measurement: "min" min_value: 0 max_value: 10 step: 1 mode: box use_write_multiple: true entity_category: config # Defrost Start Temperature (40031 -> 30) - platform: modbus_controller modbus_controller_id: oekoboiler name: "Defrost Start Temperature" address: 30 value_type: S_WORD unit_of_measurement: "°C" device_class: temperature min_value: -20 max_value: 20 step: 1 mode: box use_write_multiple: true entity_category: config