Ready for synching test

This commit is contained in:
2026-01-13 11:31:56 +01:00
parent 57e11fc539
commit e21474e733
8 changed files with 2033 additions and 268 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
# Gitignore settings for ESPHome
# This is an example and may include too much for your use-case.
# You can modify this file to suit your needs.
/.esphome/
/secrets.yaml

File diff suppressed because it is too large Load Diff

View File

@@ -1,89 +1,17 @@
substitutions:
device_name: "ades-office-control-panel"
friendly_name: Ade's Office Control Panel
esphome:
name: $device_name
friendly_name: $friendly_name
on_boot:
- delay: 2s
name: adesoffice_resistive_control
friendly_name: Ade's office Resistive control panel
esp32:
board: esp32dev
framework:
type: arduino
logger:
ota:
platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
on_connect:
- lvgl.widget.show: wifiStatusIcon
on_disconnect:
- lvgl.widget.hide: wifiStatusIcon
light:
- platform: monochromatic
output: backlight_pwm
name: Display Backlight
id: backlight
restore_mode: ALWAYS_ON
time:
- platform: homeassistant
id: esptime
spi:
- id: tft
clk_pin: GPIO14
mosi_pin: GPIO13
miso_pin: GPIO12
i2c:
sda: GPIO33
scl: GPIO32
touchscreen:
platform: cst816
id: my_touchscreen
display: mainDisplay
reset_pin: GPIO25
update_interval: 50ms
transform:
mirror_x: true
mirror_y: true
on_touch:
- lambda: |-
ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
touch.x,
touch.y,
touch.x_raw,
touch.y_raw
);
on_release:
then:
- if:
condition: lvgl.is_paused
then:
- logger.log: "LVGL resuming"
- lvgl.resume:
- lvgl.widget.redraw:
- light.turn_on: backlight
output:
- platform: ledc
pin: GPIO27
id: backlight_pwm
api:
encryption:
key: "FdLcYGMsxFkCFoY8UUu0q/huDesKrcy4+vNQujhbXVE="
key: "yDySAAGJIQIgZcDURBrLtWiVYNteCm155yyZUnrMjZY="
on_client_connected:
- lvgl.widget.show: haStatusIcon
on_client_disconnected:
@@ -95,10 +23,151 @@ api:
else:
- lvgl.widget.hide: haStatusIcon
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
on_connect:
- lvgl.widget.show: wifiStatusIcon
on_disconnect:
- lvgl.widget.hide: wifiStatusIcon
i2c:
sda: 27
scl: 22
scan: true
spi:
- id: tft
clk_pin: 14
mosi_pin: 13
miso_pin:
number: 12
ignore_strapping_warning: true
- id: touch
clk_pin: 25
mosi_pin: 32
miso_pin: 39
output:
- id: backlightPwm
platform: ledc
pin: 21
- id: outputRed
platform: ledc
pin: 4
inverted: true
- id: outputGreen
platform: ledc
pin: 16
inverted: true
- id: outputBlue
platform: ledc
pin: 17
inverted: true
light:
- id: backlight
platform: monochromatic
output: backlightPwm
name: "Display Backlight"
restore_mode: ALWAYS_ON
- id: rgbLed
platform: rgb
red: outputRed
green: outputGreen
blue: outputBlue
name: "RGB LED"
restore_mode: ALWAYS_OFF
sensor:
- platform: adc
pin: 34
name: "Brightness"
update_interval: 60s
id: lsr
- platform: homeassistant
entity_id: sensor.k1max_progress
id: sensor_3dprinter_percentage
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_percentage
text:
format: "Percentage: %.0f%%"
args: [x]
- platform: homeassistant
entity_id: sensor.k1max_extruder_temperature
id: sensor_3dprinter_nozzle
on_value:
then:
- lvgl.indicator.update:
id: gauge_3dprinter_nozzle_needle
value: !lambda return x;
- lvgl.label.update:
id: gauge_3dprinter_nozzle_text
text:
format: "%.0f°C"
args: [ 'x' ]
- platform: homeassistant
entity_id: sensor.k1max_bed_temperature_2
id: sensor_3dprinter_bed
on_value:
then:
- lvgl.indicator.update:
id: gauge_3dprinter_bed_needle
value: !lambda return x;
- lvgl.label.update:
id: gauge_3dprinter_bed_text
text:
format: "%.0f°C"
args: [ 'x' ]
text_sensor:
- platform: homeassistant
entity_id: sensor.k1max_current_print_state
id: printerStatus
on_value:
then:
- if:
condition:
lambda: 'return x == "printing";'
then:
- lvgl.widget.update:
id: button3dPrinter
state:
disabled: ON
else:
- lvgl.widget.update:
id: button3dPrinter
state:
disabled: OFF
- lvgl.label.update:
id: lbl_3dprinter_status
text:
format: "Status: %s"
args: [x.c_str()]
- platform: homeassistant
entity_id: sensor.k1max_filename
id: printer_modelname
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_modelname
text:
format: "Model: %s"
args: [x.c_str()]
display:
- id: mainDisplay
platform: ili9xxx
model: ili9341
model: ILI9341
spi_id: tft
cs_pin:
number: 15
@@ -109,15 +178,8 @@ display:
invert_colors: false
update_interval: never
auto_clear_enabled: false
pixel_mode: 16bit
transform:
mirror_y: true
mirror_x: true
swap_xy: false
dimensions:
height: 320
width: 240
color_order: rgb
init_sequence:
- [0x01 ]
- [0xcf, 0x00, 0xC1, 0x30 ]
@@ -142,119 +204,31 @@ display:
- [0x11 ] # SLPOUT Exit sleep
- [0x29 ] # DISPLAY_ON
sensor:
- platform: adc
pin: 34
name: "Brightness"
update_interval: 60s
id: lsr
- platform: homeassistant
entity_id: sensor.k2plus_c06b_print_progress
id: sensor_3dprinter_percentage
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_percentage
text:
format: "Percentage: %.0f%%"
args: [x]
- platform: homeassistant
entity_id: sensor.k2plus_c06b_nozzle_temperature
id: sensor_3dprinter_nozzle
on_value:
then:
- lvgl.indicator.update:
id: gauge_3dprinter_nozzle_needle
value: !lambda return x;
- lvgl.label.update:
id: gauge_3dprinter_nozzle_text
text:
format: "%.0fC"
args: [ 'x' ]
- platform: homeassistant
entity_id: number.k2plus_c06b_nozzle_target
id: number_3dprinter_nozzle_target
on_value:
then:
- lvgl.arc.update:
id: arc_nozzle_target
value: !lambda return x;
- platform: homeassistant
entity_id: sensor.k2plus_c06b_bed_temperature
id: sensor_3dprinter_bed
on_value:
then:
- lvgl.indicator.update:
id: gauge_3dprinter_bed_needle
value: !lambda return x;
- lvgl.label.update:
id: gauge_3dprinter_bed_text
text:
format: "%.0fC"
args: [ 'x' ]
- platform: homeassistant
entity_id: number.k2plus_c06b_bed_target
id: number_3dprinter_bed_target
on_value:
then:
- lvgl.arc.update:
id: arc_bed_target
value: !lambda return x;
touchscreen:
platform: xpt2046
id: mainTouchscreen
spi_id: touch
cs_pin: 33
interrupt_pin: 36
threshold: 800
calibration:
x_min: 410
x_max: 3349
y_min: 179
y_max: 3958
on_release:
then:
- if:
condition: lvgl.is_paused
then:
- logger.log: "LVGL resuming"
- lvgl.resume:
- lvgl.widget.redraw:
- light.turn_on: backlight
transform:
mirror_x: false
mirror_y: true
text_sensor:
- platform: homeassistant
entity_id: sensor.k2plus_c06b_print_status
id: printerStatus
on_value:
then:
- if:
condition:
lambda: 'return x == "printing";'
then:
- lvgl.widget.update:
id: button3dPrinter
state:
disabled: ON
else:
- lvgl.widget.update:
id: button3dPrinter
state:
disabled: OFF
- lvgl.label.update:
id: lbl_3dprinter_status
text:
format: "Status: %s"
args: [x.c_str()]
- platform: homeassistant
entity_id: sensor.k2plus_c06b_current_object
id: printer_modelname
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_modelname
text:
format: "Model: %s"
args: [x.c_str()]
- platform: homeassistant
entity_id: sensor.k2plus_c06b_working_layer
id: printer_working_layer
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_layer
text:
format: "Layer: %s"
args: [x.c_str()]
- platform: homeassistant
entity_id: sensor.k2plus_c06b_print_time_left
id: printer_print_time_left
on_value:
then:
- lvgl.label.update:
id: lbl_3dprinter_print_time_left
text:
format: "Time remaining: %s"
args: [x.c_str()]
number:
- platform: template
name: "LVGL Screen Timeout"
@@ -601,24 +575,6 @@ lvgl:
id: lbl_3dprinter_modelname
width: 240
text: "Model: None"
- label:
align_to:
id: lbl_3dprinter_modelname
align: OUT_BOTTOM_LEFT
y: 3
long_mode: scroll
id: lbl_3dprinter_layer
width: 240
text: "Layer: 0 of 0"
- label:
align_to:
id: lbl_3dprinter_layer
align: OUT_BOTTOM_LEFT
y: 3
long_mode: scroll
id: lbl_3dprinter_print_time_left
width: 240
text: "Print time left: NaN"
- meter:
id: meter_3dprinter_nozzle
align: BOTTOM_LEFT
@@ -637,6 +593,12 @@ lvgl:
width: 2
color: 0xFF0000
r_mod: -4
- tick_style:
start_value: 0
end_value: 380
color_start: 0x0000bd
color_end: 0xbd0000
width: 1
- range_from: 0 # scale for the value labels
range_to: 380
angle_range: 240
@@ -656,7 +618,7 @@ lvgl:
widgets:
- label:
id: gauge_3dprinter_nozzle_text
text: "-.-C"
text: "-.-°C"
align_to:
id: meter_3dprinter_nozzle
align: CENTER
@@ -667,30 +629,6 @@ lvgl:
id: meter_3dprinter_nozzle
align: CENTER
y: 45
- arc:
align: BOTTOM_LEFT
y: -35
x: 5
height: 110
width: 110
id: arc_nozzle_target
value: !lambda "return id(number_3dprinter_nozzle_target).state;"
min_value: 0
max_value: 380
adjustable: true
start_angle: 150
end_angle: 30
knob:
pad_all: 0
arc_rounded: false
arc_width: 6
on_value:
then:
- homeassistant.service:
service: number.set_value
data:
entity_id: number.k2plus_c06b_nozzle_target
value: !lambda "return x;"
- meter:
id: meter_3dprinter_bed
align: BOTTOM_LEFT
@@ -709,6 +647,12 @@ lvgl:
width: 2
color: 0xFF0000
r_mod: -4
- tick_style:
start_value: 0
end_value: 130
color_start: 0x0000bd
color_end: 0xbd0000
width: 1
- range_from: 0 # scale for the value labels
range_to: 130
angle_range: 240
@@ -728,7 +672,7 @@ lvgl:
widgets:
- label:
id: gauge_3dprinter_bed_text
text: "-.-C"
text: "-.-°C"
align_to:
id: meter_3dprinter_bed
align: CENTER
@@ -739,30 +683,6 @@ lvgl:
id: meter_3dprinter_bed
align: CENTER
y: 45
- arc:
align: BOTTOM_LEFT
y: -35
x: 125
height: 110
width: 110
id: arc_bed_target
value: !lambda "return id(number_3dprinter_bed_target).state;"
min_value: 0
max_value: 130
adjustable: true
start_angle: 150
end_angle: 30
knob:
pad_all: 0
arc_rounded: false
arc_width: 6
on_value:
then:
- homeassistant.service:
service: number.set_value
data:
entity_id: number.k2plus_c06b_bed_target
value: !lambda "return x;"
on_idle:
@@ -871,4 +791,3 @@ switch:
id: buttonScreens
state:
checked: OFF

View File

@@ -0,0 +1,45 @@
substitutions:
# Settings - Editable values
device_name: ns-panel-ground-floor
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
nextion_update_url: "http://192.168.17.44:8123/local/nspanel_eu.tft" # Optional for `esp-idf` framework
# Add-on configuration (if needed)
# heater_relay: "1" # Possible values: "1" or "2"
api:
encryption:
key: "DVkkntEil08ex4e7xjnKTz4o2z/ZM/UHnkjOJP7KUfA="
# Customization area
##### My customization - Start #####
##### My customization - End #####
# Core and optional configurations
packages:
remote_package:
url: https://github.com/Blackymas/NSPanel_HA_Blueprint
ref: main
files:
- nspanel_esphome.yaml # Core package
# Optional advanced and add-on configurations
# - advanced/esphome/nspanel_esphome_advanced.yaml
# - nspanel_esphome_addon_climate_cool.yaml
# - nspanel_esphome_addon_climate_heat.yaml
# - nspanel_esphome_addon_climate_dual.yaml
refresh: 300s
esp32:
framework:
type: esp-idf
time:
- id: !extend time_provider
timezone: "Europe/Berlin"
wifi:
networks:
- id: !extend wifi_default
manual_ip:
static_ip: 192.168.17.139
gateway: 192.168.17.1
subnet: 255.255.255.0

634
oekoboiler-interface.yaml Normal file
View File

@@ -0,0 +1,634 @@
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
# Defrost End Temperature (40032

View File

@@ -148,4 +148,3 @@ script:
logger:
level: DEBUG

77
powermeter.yaml Normal file
View File

@@ -0,0 +1,77 @@
esphome:
name: powermeter
friendly_name: PowerMeter
esp8266:
board: esp01_1m
# Enable logging
logger:
web_server:
port: 80
# Enable Home Assistant API
api:
encryption:
key: "sRMMr/ojhCUtZukAFSRT/fZpvI0bcTPHAqs0CzXY/q0="
ota:
- platform: esphome
password: "8383401f9c2ff3b99a166c2782307e8b"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.20.152
gateway: 192.168.20.1
subnet: 255.255.255.0
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Powermeter Fallback Hotspot"
password: "kmSJk2j8Lpak"
captive_portal:
sensor:
- platform: pulse_meter
name: 'Power'
id: sensor_pulse_meter # Optional ID, necessary if you want to calculate the total daily energy
unit_of_measurement: 'W'
device_class: power
state_class: measurement
accuracy_decimals: 0
internal_filter: 100ms
pin:
number: 12
inverted: true
mode:
input: true
pullup: true
filters:
- multiply: 60
total:
name: "Electricity Total"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.001
- platform: total_daily_energy
name: 'Total Daily Energy'
id: sensor_total_daily_energy
power_id: sensor_pulse_meter
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
accuracy_decimals: 3
filters:
# Multiplication factor from W to kW is 0.001
- multiply: 0.001
time:
- platform: homeassistant
id: homeassistant_time