Update Home Assistant configuration and automations

- Updated .ha_run.lock to reflect the new Home Assistant version 2026.4.2.
- Enhanced automations.yaml with improved entity targeting and additional automation actions for window shading.
- Refactored configuration.yaml to include templates from a separate file for better organization.
- Added new ESPHome configurations for window sensors and updated KNX configurations for door contacts and buttons.
- Removed deprecated pv_to_dhw.yaml package to streamline the project.
This commit is contained in:
Ben Melchior
2026-04-20 21:00:56 +02:00
parent 56e3da75a0
commit 52b0376aca
16 changed files with 472 additions and 920 deletions
+2 -10
View File
@@ -1,11 +1,3 @@
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"POSTGRES_CONNECTION_STRING": "postgresql://hass:FTXZ9r8iw0fTT655Q6tePTzp@synology.cobe.space:5433/hass"
}
}
}
}
"mcpServers": {}
}
+1 -1
View File
@@ -1 +1 @@
{"pid": 67, "version": 1, "ha_version": "2026.3.1", "start_ts": 1772977331.1190224}
{"pid": 67, "version": 1, "ha_version": "2026.4.2", "start_ts": 1776243874.2238262}
+291 -667
View File
File diff suppressed because it is too large Load Diff
+1 -13
View File
@@ -34,16 +34,4 @@ automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
knx: !include knx/knx.yaml
# Storage for Bubble Card Modules
template:
- trigger:
- trigger: event
event_type: bubble_card_update_modules
sensor:
- name: "Bubble Card Modules"
state: "saved"
icon: "mdi:puzzle"
attributes:
modules: "{{ trigger.event.data.modules }}"
last_updated: "{{ trigger.event.data.last_updated }}"
template: !include templates.yaml
+5
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
+50
View File
@@ -0,0 +1,50 @@
esphome:
name: fenstersensor
friendly_name: Fenstersensor
esp8266:
board: d1_mini
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
min_auth_mode: WPA2
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_password
logger:
deep_sleep:
id: deep_sleep_control
run_duration: 15s
sleep_duration: 60min
binary_sensor:
- platform: gpio
pin:
number: D1
mode: INPUT_PULLUP
inverted: true
name: "Fenster 1"
device_class: window
filters:
- delayed_on: 50ms
- delayed_off: 50ms
- platform: gpio
pin:
number: D2
mode: INPUT_PULLUP
inverted: true
name: "Fenster 2"
device_class: window
filters:
- delayed_on: 50ms
- delayed_off: 50ms
+61
View File
@@ -0,0 +1,61 @@
esphome:
name: fenstersensor
friendly_name: Fenstersensor
esp32:
board: esp32dev
variant: esp32
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
min_auth_mode: WPA2
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_password
logger:
deep_sleep:
id: deep_sleep_control
run_duration: 8s
esp32_ext1_wakeup:
pins:
- number: GPIO4
allow_other_uses: true
- number: GPIO13
allow_other_uses: true
mode: ANY_HIGH
binary_sensor:
- platform: gpio
pin:
number: GPIO4
mode: INPUT_PULLUP
inverted: true
allow_other_uses: true
name: "Fenster 1"
device_class: window
filters:
- delayed_on: 50ms
- delayed_off: 50ms
- platform: gpio
pin:
number: GPIO13
mode: INPUT_PULLUP
inverted: true
allow_other_uses: true
name: "Fenster 2"
device_class: window
filters:
- delayed_on: 50ms
- delayed_off: 50ms
+5 -2
View File
@@ -1,5 +1,8 @@
- name: 'Garagentor 1'
- name: 'Garagentor Conny öffnen'
address: '5/4/0'
- name: 'Garagentor 2'
- name: 'Garagentor Ben öffnen'
address: '5/4/1'
- name: 'Haustür öffnen'
address: '0/0/2'
+1 -1
View File
@@ -64,4 +64,4 @@
target_temperature_state_address: "4/3/10"
operation_mode_address: "4/3/16"
operation_mode_state_address: "4/3/16"
active_state_address: "4/3/18"
active_state_address: "4/3/18"
+1 -1
View File
@@ -97,4 +97,4 @@
move_short_address: "4/2/11"
stop_address: "4/2/11"
position_address: "4/2/13"
position_state_address: "4/2/12"
position_state_address: "4/2/12"
-1
View File
@@ -226,4 +226,3 @@
brightness_state_address: "2/1/14"
+19
View File
@@ -13,3 +13,22 @@
- name: 'SS_OG1_FL_Tablet'
address: '3/4/2'
state_address: '3/4/3'
- name: 'SE_EG_WZ_01 Door Contact'
address: '2/5/4'
state_address: '2/5/4'
- name: 'SE_EG_WZ_02 Door Contact'
address: '2/5/6'
state_address: '2/5/6'
- name: 'SE_EG_WZ_03 Door Contact'
address: '2/5/7'
state_address: '2/5/7'
- name: 'SE_EG_WC_01 Door Contact'
address: '2/5/8'
state_address: '2/5/8'
-135
View File
@@ -1,135 +0,0 @@
# ems-esp
# Aktuelle Warmwassertemperatur: sensor.boiler_dhw_current_intern_temperature
# Soll Warmwassertemperatur: sensor.boiler_dhw_set_temperature
# Soll Warmwassertemperatur: (einstellen) number.boiler_dhw_comfort_switch_off
# DHW Heizen aktiv: binary_sensor.boiler_dhw_charging
# sh15t
# MPPT Total Power: sensor.sh15t_mppt_total_power
# Total Export Active Power: sensor.sh15t_total_export_active_power
template:
- sensor:
- name: "DHW Boost available"
state: >
{% set dhw_temp = states('sensor.boiler_dhw_current_intern_temperature') | float %}
{% set dhw_setpoint = states('sensor.boiler_dhw_set_temperature') | float %}
{% set temp_diff = dhw_setpoint - dhw_temp %}
{{ temp_diff > 5 }}
- name: "DHW Boost Demand"
state: >
{% set excess = states('sensor.sh15t_total_export_active_power') | float(0) %}
{% set dhw_available = states('sensor.dhw_boost_available') %}
{% set wp_power = states('input_number.dhw_pv_min_excess') | float %}
{{ excess > wp_power and dhw_available }}
- binary_sensor:
- name: "DHW PV Boost active"
state: >
{{ states('input_boolean.dhw_pv_boost_enabled') == 'on' and
states('sensor.dhw_boost_demand') }}
input_boolean:
dhw_pv_boost_enabled:
name: "DHW PV Boost enabled"
icon: mdi:water-boiler-auto
initial: false
input_number:
dhw_pv_boost_temp:
name: "DHW PV Boost Setpoint temperature"
min: 45
max: 65
step: 1
unit_of_measurement: "°C"
initial: 60
dhw_pv_min_excess:
name: "Minimal PV Excess for DHW"
min: 1
max: 5
step: 0.1
unit_of_measurement: "kW"
initial: 2
input_datetime:
dhw_pv_boost_start:
name: "PV-Boost Earliest Start Time"
has_time: true
initial: "10:00:00"
dhw_pv_boost_end:
name: "PV-Boost Latest End Time"
has_time: true
initial: "17:00:00"
# automation:
# - id: 'dhw_pv_boost_start'
# alias: "DHW PV-Boost Start"
# trigger:
# - platform: numeric_state
# entity_id: sensor.sh15t_total_export_active_power
# above: input_number.dhw_pv_min_excess
# for:
# minutes: 5
# condition:
# - condition: state
# entity_id: input_boolean.dhw_pv_boost_enabled
# state: 'on'
# - condition: time
# after: input_datetime.dhw_pv_boost_start
# before: input_datetime.dhw_pv_boost_end
# - condition: numeric_state
# entity_id: sensor.boiler_dhw_current_intern_temperature
# below: input_number.dhw_pv_boost_temp
# - condition: state
# entity_id: binary_sensor.boiler_dhw_charging
# state: 'off'
# action:
# - service: number.set_value
# target:
# entity_id: number.boiler_dhw_set_temperature
# data:
# value: "{{ states('input_number.dhw_pv_boost_temp') }}"
# - service: switch.turn_on
# target:
# entity_id: switch.boiler_dhw_comfort
# - service: script.cobe_haus_benachrichtigung
# data:
# message: "DHW PV-Boost started - Excess: {{ states('sensor.sh15t_total_export_active_power') }}kW"
# title: "COBE Haus - DHW PV-Boost"
# - id: 'dhw_pv_boost_stop'
# alias: "DHW PV-Boost Stop"
# trigger:
# - platform: numeric_state
# entity_id: sensor.sh15t_total_export_active_power
# below: 1.0
# for:
# minutes: 10
# - platform: numeric_state
# entity_id: sensor.boiler_dhw_current_intern_temperature
# above: input_number.dhw_pv_boost_temp
# - platform: time
# at: input_datetime.dhw_pv_boost_end
# condition:
# - condition: state
# entity_id: binary_sensor.dhw_pv_boost_aktiv
# state: 'on'
# action:
# - service: number.set_value
# target:
# entity_id: number.boiler_dhw_set_temperature
# data:
# value: 50
# - service: switch.turn_off
# target:
# entity_id: switch.boiler_dhw_comfort
# - service: script.cobe_haus_benachrichtigung
# data:
# message: "DHW PV-Boost stopped - Temperature reached or excess too low"
# title: "COBE Haus - DHW PV-Boost"
-89
View File
@@ -62,95 +62,6 @@ cobe_haus_benachrichtigung_mit_bild:
required: true
alias: COBE Haus Benachrichtigung mit Bild
description: ''
smarte_beschattung:
sequence: []
fields:
cover_entity:
description: Entity ID des Rollladens
example: cover.wohnzimmer_rolladen
required: true
selector:
entity:
domain: cover
window_azimuth_start:
description: Start-Azimut des Fensters (Grad)
example: 135
required: true
default: 90
selector:
number:
min: 0
max: 360
step: 1
unit_of_measurement: °
window_azimuth_end:
description: End-Azimut des Fensters (Grad)
example: 225
required: true
default: 270
selector:
number:
min: 0
max: 360
step: 1
unit_of_measurement: °
min_elevation:
description: Minimale Sonnenhöhe für Beschattung
example: 15
default: 10
selector:
number:
min: 0
max: 90
step: 1
unit_of_measurement: °
max_elevation:
description: Maximale Sonnenhöhe für stärkste Beschattung
example: 60
default: 50
selector:
number:
min: 0
max: 90
step: 1
unit_of_measurement: °
max_closed_position:
description: Maximal geschlossene Position (0=ganz zu, 100=ganz auf)
example: 20
default: 15
selector:
number:
min: 0
max: 100
step: 1
unit_of_measurement: '%'
fully_open_position:
description: Vollständig geöffnete Position
example: 100
default: 100
selector:
number:
min: 0
max: 100
step: 1
unit_of_measurement: '%'
block_entity:
description: Block-Entity (wenn aktiviert, wird Rolladen nicht bewegt)
example: input_boolean.wohnzimmer_rolladen_block
required: false
selector:
entity:
domain:
- input_boolean
- binary_sensor
- switch
enable_logging:
description: Debug-Logging aktivieren
default: false
selector:
boolean:
alias: Smarte Beschattung
description: ''
cobe_haus_kritische_benachrichtigung:
sequence:
- action: notify.mobile_app_kn0x_tech_iphone
+35
View File
@@ -0,0 +1,35 @@
- trigger:
- trigger: event
event_type: bubble_card_update_modules
sensor:
- name: "Bubble Card Modules"
state: "saved"
icon: "mdi:puzzle"
attributes:
modules: "{{ trigger.event.data.modules }}"
last_updated: "{{ trigger.event.data.last_updated }}"
- sensor:
- name: "Interpolated Brightness from Azimuth"
unit_of_measurement: "lx"
state: >
{% set azimut = state_attr('sun.sun', 'azimuth') | float %}
{% set brightness_south = states('sensor.se_au_gt_lux_south') | float(0) %}
{% set brightness_west = states('sensor.se_au_gt_lux_west') | float(0) %}
{% set brightness_east = states('sensor.se_au_gt_lux_east') | float(0) %}
{% if azimut >= 90 and azimut < 180 %}
{# Ost → Süd: Interpolation #}
{% set t = (azimut - 90) / 90 %}
{{ (brightness_east * (1 - t) + brightness_south * t) | round(0) }}
{% elif azimut >= 180 and azimut < 270 %}
{# Süd → West: Interpolation #}
{% set t = (azimut - 180) / 90 %}
{{ (brightness_south * (1 - t) + brightness_west * t) | round(0) }}
{% else %}
{# Nachts / Nord: 0 #}
0
{% endif %}