diff --git a/blueprint.yaml b/blueprint.yaml index 66df46a..74ff6fe 100644 --- a/blueprint.yaml +++ b/blueprint.yaml @@ -1,6 +1,6 @@ blueprint: - name: Custom Better Thermostat Multi-Mode Controller - description: Steuert Better Thermostat mit Sommer/Winter (Wetterbasiert), tägliche Schedule, Anwesenheit (optional) und Urlaubs-Button. Für Homematic IP + SHT31. + name: Better Thermostat Multi-Mode Controller + description: Steuert Better Thermostat mit Sommer/Winter (Wetterbasiert), tägliche Schedule, Anwesenheit (optional) und Urlaubs-Button domain: automation input: better_thermostat_entity: @@ -17,14 +17,14 @@ blueprint: domain: schedule presence_entity: name: Anwesenheit (optional) - description: Leer lassen für immer present + description: Leer lassen für immer anwesend + default: "" selector: entity: domain: binary_sensor - default: {} vacation_helper: name: Urlaubsmodus Helper - description: input_boolean.urlaub + description: input_boolean für Urlaub selector: entity: domain: input_boolean @@ -36,40 +36,46 @@ blueprint: domain: weather summer_temp_threshold: name: Sommer-Schwellwert + description: Wenn Vorhersage über dieser Temp, Heizung aus default: 25 selector: number: - min: 18 + min: 16 max: 50 step: 1 + unit_of_measurement: "°C" winter_temp_threshold: name: Winter-Schwellwert + description: Wenn Vorhersage unter dieser Temp, Winter-Modus default: 10 selector: number: min: 0 max: 20 step: 1 + unit_of_measurement: "°C" eco_temp: - name: Eco Temp + name: Eco Temperatur + description: Temperatur bei Abwesenheit/Urlaub default: 15 selector: number: min: 10 max: 18 step: 0.5 + unit_of_measurement: "°C" comfort_temp: - name: Komfort Temp + name: Komfort Temperatur + description: Temperatur wenn Schedule aktiv default: 21 selector: number: min: 18 max: 24 step: 0.5 + unit_of_measurement: "°C" trigger: - - platform: state - entity_id: !input better_thermostat_entity - platform: state entity_id: !input schedule_entity - platform: state @@ -78,31 +84,109 @@ trigger: entity_id: !input presence_entity - platform: state entity_id: !input weather_entity + - platform: time_pattern + minutes: "/30" condition: [] action: - variables: - we: "{{ states(''' + '''!input weather_entity) }}" - wt: "{{ state_attr(we, 'forecast')[0].temperature if state_attr(we, 'forecast') and state_attr(we, 'forecast')|length > 0 else 0 }}" - is_summer: "{{ wt | float(0) > [blueprint_input.summer_temp_threshold] | float(25) }}" - is_winter: "{{ wt | float(0) < [blueprint_input.winter_temp_threshold] | float(10) }}" - is_vacation: "{{ states(''' + '''!input vacation_helper) == 'on' }}" - p: "{{ states(''' + '''!input presence_entity) }}" - is_present: >- - {%- set p = states('!input presence_entity') -%} - {%- if p == 'unknown' or p == 'unavailable' or !input presence_entity == '' -%} - true - {%- else -%} - {{ p == 'on' }} - {%- endif -%} - schedule_active: "{{ states(''' + '''!input schedule_entity) == 'on' }}" + weather_entity: !input weather_entity + schedule_entity: !input schedule_entity + vacation_entity: !input vacation_helper + presence_entity: !input presence_entity + summer_threshold: !input summer_temp_threshold + winter_threshold: !input winter_temp_threshold + eco_temperature: !input eco_temp + comfort_temperature: !input comfort_temp + + - variables: + forecast: "{{ state_attr(weather_entity, 'forecast') }}" + weather_temp: "{{ forecast[0].temperature if forecast and forecast|length > 0 else 15 }}" + is_summer: "{{ weather_temp | float(15) > summer_threshold | float(25) }}" + is_winter: "{{ weather_temp | float(15) < winter_threshold | float(10) }}" + is_vacation: "{{ states(vacation_entity) == 'on' }}" + presence_state: "{{ states(presence_entity) if presence_entity != '' else 'on' }}" + is_present: "{{ presence_state in ['on', 'home', 'unknown', 'unavailable'] }}" + schedule_active: "{{ states(schedule_entity) == 'on' }}" + - choose: + # Priorität 1: Sommer-Modus (Heizung aus) - conditions: - - "{{ is_summer }}" + - condition: template + value_template: "{{ is_summer }}" sequence: - service: climate.set_hvac_mode target: entity_id: !input better_thermostat_entity data: - hvac_mode + hvac_mode: "off" + + # Priorität 2: Urlaubsmodus (Eco) + - conditions: + - condition: template + value_template: "{{ is_vacation }}" + sequence: + - service: climate.set_hvac_mode + target: + entity_id: !input better_thermostat_entity + data: + hvac_mode: "heat" + - service: climate.set_temperature + target: + entity_id: !input better_thermostat_entity + data: + temperature: "{{ eco_temperature }}" + + # Priorität 3: Abwesenheit (Eco) + - conditions: + - condition: template + value_template: "{{ not is_present and not is_vacation }}" + sequence: + - service: climate.set_hvac_mode + target: + entity_id: !input better_thermostat_entity + data: + hvac_mode: "heat" + - service: climate.set_temperature + target: + entity_id: !input better_thermostat_entity + data: + temperature: "{{ eco_temperature }}" + + # Priorität 4: Winter + Schedule aktiv (Komfort) + - conditions: + - condition: template + value_template: "{{ is_winter and schedule_active and is_present }}" + sequence: + - service: climate.set_hvac_mode + target: + entity_id: !input better_thermostat_entity + data: + hvac_mode: "heat" + - service: climate.set_temperature + target: + entity_id: !input better_thermostat_entity + data: + temperature: "{{ comfort_temperature }}" + + # Priorität 5: Winter ohne Schedule (reduzierte Temp) + - conditions: + - condition: template + value_template: "{{ is_winter and not schedule_active and is_present }}" + sequence: + - service: climate.set_hvac_mode + target: + entity_id: !input better_thermostat_entity + data: + hvac_mode: "heat" + - service: climate.set_temperature + target: + entity_id: !input better_thermostat_entity + data: + temperature: "{{ eco_temperature + 2 }}" + + default: [] + +mode: queued +max: 10