From 1cb58b01d459eb132e978d851362f46c195930ab Mon Sep 17 00:00:00 2001 From: "Adrian A. Baumann" Date: Wed, 29 Oct 2025 10:10:26 +0100 Subject: [PATCH] Oekoboiler added --- Oekoboiler/main.yaml | 632 +++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 633 insertions(+) create mode 100644 Oekoboiler/main.yaml diff --git a/Oekoboiler/main.yaml b/Oekoboiler/main.yaml new file mode 100644 index 0000000..6e263b3 --- /dev/null +++ b/Oekoboiler/main.yaml @@ -0,0 +1,632 @@ +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 diff --git a/README.md b/README.md index 989d200..f134f76 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # ESP-Home-Scripts +Device description files for my ESPHome-devices - currently still transmitted "manually"...