diff --git a/dashboards/views/03_andreas.yaml b/dashboards/views/03_andreas.yaml index a161ab9..fab22b4 100644 --- a/dashboards/views/03_andreas.yaml +++ b/dashboards/views/03_andreas.yaml @@ -272,6 +272,15 @@ sections: entity: sensor.sovevaerelse_stue_carbon_dioxide name: CO₂ + - type: grid + cards: + - type: heading + heading: Vindue + + - type: tile + entity: binary_sensor.andreas_vindue + name: Vindue + - type: grid cards: - type: heading diff --git a/dashboards/views/04_daniel.yaml b/dashboards/views/04_daniel.yaml index 3691a05..f99b73d 100644 --- a/dashboards/views/04_daniel.yaml +++ b/dashboards/views/04_daniel.yaml @@ -272,6 +272,15 @@ sections: entity: sensor.sovevaerelse_daniel_carbon_dioxide name: CO₂ + - type: grid + cards: + - type: heading + heading: Vindue + + - type: tile + entity: binary_sensor.daniel_vindue + name: Vindue + - type: grid cards: - type: heading diff --git a/dashboards/views/04b_sovevaerelse.yaml b/dashboards/views/04b_sovevaerelse.yaml index 209c896..d2d76b5 100644 --- a/dashboards/views/04b_sovevaerelse.yaml +++ b/dashboards/views/04b_sovevaerelse.yaml @@ -141,3 +141,12 @@ sections: - type: tile entity: sensor.sovevaerelse_carbon_dioxide name: CO2 + + - type: grid + cards: + - type: heading + heading: Vindue + + - type: tile + entity: binary_sensor.sovevaerelse_vindue + name: Vindue diff --git a/dashboards/views/11_vedligehold.yaml b/dashboards/views/11_vedligehold.yaml index 4ded514..9e57e65 100644 --- a/dashboards/views/11_vedligehold.yaml +++ b/dashboards/views/11_vedligehold.yaml @@ -1600,4 +1600,142 @@ sections: card: type: tile entity: sensor.garageport_batteri + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.sovevaerelse_vindue_batteri + name: Soveværelse vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.sovevaerelse_vindue_batteri + below: 20 + card: + type: tile + entity: sensor.sovevaerelse_vindue_batteri + name: Soveværelse vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.daniel_vindue_batteri + name: Daniel vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.daniel_vindue_batteri + below: 20 + card: + type: tile + entity: sensor.daniel_vindue_batteri + name: Daniel vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.andreas_vindue_batteri + name: Andreas vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.andreas_vindue_batteri + below: 20 + card: + type: tile + entity: sensor.andreas_vindue_batteri + name: Andreas vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.badevaerelse_vindue_batteri + name: Badeværelse vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.badevaerelse_vindue_batteri + below: 20 + card: + type: tile + entity: sensor.badevaerelse_vindue_batteri + name: Badeværelse vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.lille_bad_vindue_batteri + name: Lille bad vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.lille_bad_vindue_batteri + below: 20 + card: + type: tile + entity: sensor.lille_bad_vindue_batteri + name: Lille bad vindue + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "on" + card: + type: tile + entity: sensor.terrassedor_batteri + name: Terrassedør + + - type: conditional + conditions: + - condition: state + entity: input_boolean.vis_alle_vedligehold + state: "off" + - condition: numeric_state + entity: sensor.terrassedor_batteri + below: 20 + card: + type: tile + entity: sensor.terrassedor_batteri + name: Terrassedør name: Garageport sensor \ No newline at end of file diff --git a/include/automations/vinduer.yaml b/include/automations/vinduer.yaml new file mode 100644 index 0000000..c605dd1 --- /dev/null +++ b/include/automations/vinduer.yaml @@ -0,0 +1,251 @@ +################################################## +# Vindue-automationer (Aqara vinduesensorer) +################################################## + +### Varme: Sluk varme når vindue åbnes, tænd igen når det lukkes +### Rum-mapping: andreas, daniel, sovevaerelse, lille_bad + + - alias: "Varme - sluk ved åbent vindue" + id: varme_sluk_ved_aabent_vindue + description: "Slukker varme i rummet når vinduet åbnes og genstarter når det lukkes" + mode: parallel + max: 4 + trigger: + - platform: state + entity_id: + - binary_sensor.andreas_vindue + - binary_sensor.daniel_vindue + - binary_sensor.sovevaerelse_vindue + - binary_sensor.lille_bad_vindue + to: "on" + action: + - variables: + room_map: + binary_sensor.andreas_vindue: climate.andreas + binary_sensor.daniel_vindue: climate.daniel + binary_sensor.sovevaerelse_vindue: climate.sovev_prelse + binary_sensor.lille_bad_vindue: climate.lille_bad + climate_entity: "{{ room_map[trigger.entity_id] }}" + current_temp: "{{ state_attr(climate_entity, 'temperature') | float(20) }}" + current_mode: "{{ states(climate_entity) }}" + - service: scene.create + data: + scene_id: "vindue_varme_{{ trigger.entity_id.split('.')[1] }}" + snapshot_entities: + - "{{ climate_entity }}" + - service: climate.set_hvac_mode + target: + entity_id: "{{ climate_entity }}" + data: + hvac_mode: "off" + - wait_for_trigger: + - platform: state + entity_id: "{{ trigger.entity_id }}" + to: "off" + timeout: "04:00:00" + continue_on_timeout: true + - service: scene.turn_on + target: + entity_id: "scene.vindue_varme_{{ trigger.entity_id.split('.')[1] }}" + +### Notifikation: Vindue åbner og ingen er hjemme + + - alias: "Vindue åbent - ingen hjemme" + id: vindue_aabent_ingen_hjemme + description: "Send notifikation til Claus hvis et vindue åbner og ingen er hjemme" + trigger: + - platform: state + entity_id: + - binary_sensor.andreas_vindue + - binary_sensor.daniel_vindue + - binary_sensor.sovevaerelse_vindue + - binary_sensor.badevaerelse_vindue + - binary_sensor.lille_bad_vindue + - binary_sensor.terrassedor + to: "on" + condition: + - condition: state + entity_id: binary_sensor.family_presence + state: "off" + action: + - variables: + vindue_navne: + binary_sensor.andreas_vindue: "Andreas' værelse" + binary_sensor.daniel_vindue: "Daniels værelse" + binary_sensor.sovevaerelse_vindue: "Soveværelset" + binary_sensor.badevaerelse_vindue: "Badeværelset" + binary_sensor.lille_bad_vindue: "Lille badeværelse" + binary_sensor.terrassedor: "Terrassedøren" + vindue_navn: "{{ vindue_navne[trigger.entity_id] }}" + - service: notify.mobile_app_claus_iphone_15pro + data: + title: "⚠️ Vindue åbnet - ingen hjemme" + message: "{{ vindue_navn }} er blevet åbnet, men der er ingen hjemme!" + data: + push: + sound: + name: default + critical: 0 + +### Notifikation: Sidste person forlader huset med åbent vindue + + - alias: "Forlader huset - vindue åbent" + id: forlader_huset_vindue_aabent + description: "Send notifikation hvis family_presence slår fra og vinduer er åbne" + trigger: + - platform: state + entity_id: binary_sensor.family_presence + from: "on" + to: "off" + condition: + - condition: or + conditions: + - condition: state + entity_id: binary_sensor.andreas_vindue + state: "on" + - condition: state + entity_id: binary_sensor.daniel_vindue + state: "on" + - condition: state + entity_id: binary_sensor.sovevaerelse_vindue + state: "on" + - condition: state + entity_id: binary_sensor.badevaerelse_vindue + state: "on" + - condition: state + entity_id: binary_sensor.lille_bad_vindue + state: "on" + - condition: state + entity_id: binary_sensor.terrassedor + state: "on" + action: + - variables: + aabne_vinduer: >- + {% set vinduer = [] %} + {% if is_state('binary_sensor.andreas_vindue', 'on') %} + {% set vinduer = vinduer + ["Andreas' værelse"] %} + {% endif %} + {% if is_state('binary_sensor.daniel_vindue', 'on') %} + {% set vinduer = vinduer + ["Daniels værelse"] %} + {% endif %} + {% if is_state('binary_sensor.sovevaerelse_vindue', 'on') %} + {% set vinduer = vinduer + ["Soveværelset"] %} + {% endif %} + {% if is_state('binary_sensor.badevaerelse_vindue', 'on') %} + {% set vinduer = vinduer + ["Badeværelset"] %} + {% endif %} + {% if is_state('binary_sensor.lille_bad_vindue', 'on') %} + {% set vinduer = vinduer + ["Lille badeværelse"] %} + {% endif %} + {% if is_state('binary_sensor.terrassedor', 'on') %} + {% set vinduer = vinduer + ["Terrassedøren"] %} + {% endif %} + {{ vinduer | join(', ') }} + - service: notify.mobile_app_claus_iphone_15pro + data: + title: "🏠 Åbne vinduer - alle er væk" + message: "Alle har forladt huset, men disse vinduer er åbne: {{ aabne_vinduer }}" + data: + push: + sound: + name: default + critical: 1 + volume: 1.0 + +### Ventilation: Luft ud ved høj CO2 eller luftfugtighed (kl 6-22) + + - alias: "Ventilation - luft ud påmindelse" + id: ventilation_luft_ud_paamindelse + description: "Send notifikation om at lufte ud ved høj CO2 eller luftfugtighed" + trigger: + - platform: numeric_state + entity_id: sensor.sovevaerelse_stue_carbon_dioxide + above: 1000 + id: andreas_co2 + - platform: numeric_state + entity_id: sensor.sovevaerelse_daniel_carbon_dioxide + above: 1000 + id: daniel_co2 + - platform: numeric_state + entity_id: sensor.sovevaerelse_carbon_dioxide + above: 1000 + id: sovevaerelse_co2 + - platform: numeric_state + entity_id: sensor.sovevaerelse_stue_luftfugtighed + above: 70 + id: andreas_fugt + - platform: numeric_state + entity_id: sensor.sovevaerelse_daniel_luftfugtighed + above: 70 + id: daniel_fugt + - platform: numeric_state + entity_id: sensor.sovevaerelse_luftfugtighed + above: 70 + id: sovevaerelse_fugt + condition: + - condition: time + after: "06:00:00" + before: "22:00:00" + action: + - variables: + rum_navne: + andreas_co2: "Andreas' værelse (CO₂)" + andreas_fugt: "Andreas' værelse (luftfugtighed)" + daniel_co2: "Daniels værelse (CO₂)" + daniel_fugt: "Daniels værelse (luftfugtighed)" + sovevaerelse_co2: "Soveværelset (CO₂)" + sovevaerelse_fugt: "Soveværelset (luftfugtighed)" + rum_navn: "{{ rum_navne[trigger.id] }}" + - service: notify.mobile_app_claus_iphone_15pro + data: + title: "🌬️ Luft ud" + message: "{{ rum_navn }} har for høj værdi. Åbn vinduet for at lufte ud." + + - alias: "Ventilation - luk vindue efter 15 min" + id: ventilation_luk_vindue_efter_15_min + description: "Påmind om at lukke vinduet 15 minutter efter det blev åbnet for udluftning" + mode: parallel + max: 3 + trigger: + - platform: state + entity_id: + - binary_sensor.andreas_vindue + - binary_sensor.daniel_vindue + - binary_sensor.sovevaerelse_vindue + to: "on" + condition: + - condition: time + after: "06:00:00" + before: "22:00:00" + - condition: or + conditions: + - condition: template + value_template: >- + {{ trigger.entity_id == 'binary_sensor.andreas_vindue' and + (states('sensor.sovevaerelse_stue_carbon_dioxide') | float(0) > 1000 or + states('sensor.sovevaerelse_stue_luftfugtighed') | float(0) > 70) }} + - condition: template + value_template: >- + {{ trigger.entity_id == 'binary_sensor.daniel_vindue' and + (states('sensor.sovevaerelse_daniel_carbon_dioxide') | float(0) > 1000 or + states('sensor.sovevaerelse_daniel_luftfugtighed') | float(0) > 70) }} + - condition: template + value_template: >- + {{ trigger.entity_id == 'binary_sensor.sovevaerelse_vindue' and + (states('sensor.sovevaerelse_carbon_dioxide') | float(0) > 1000 or + states('sensor.sovevaerelse_luftfugtighed') | float(0) > 70) }} + action: + - variables: + vindue_navne: + binary_sensor.andreas_vindue: "Andreas' værelse" + binary_sensor.daniel_vindue: "Daniels værelse" + binary_sensor.sovevaerelse_vindue: "Soveværelset" + vindue_navn: "{{ vindue_navne[trigger.entity_id] }}" + - delay: "00:15:00" + - condition: state + entity_id: "{{ trigger.entity_id }}" + state: "on" + - service: notify.mobile_app_claus_iphone_15pro + data: + title: "🪟 Luk vinduet" + message: "Vinduet i {{ vindue_navn }} har været åbent i 15 minutter. Husk at lukke det igen." diff --git a/include/templates/maintenance.yaml b/include/templates/maintenance.yaml index e91b439..fec321a 100644 --- a/include/templates/maintenance.yaml +++ b/include/templates/maintenance.yaml @@ -75,8 +75,12 @@ states('sensor.terrasse_dor_battery') | float(100), states('sensor.venstre_battery') | float(100), states('sensor.syd_batteri') | float(100), - states('sensor.hojre_battery') | float(100) - ] | min < 20 + states('sensor.hojre_battery') | float(100) states('sensor.sovevaerelse_vindue_batteri') | float(100), + states('sensor.daniel_vindue_batteri') | float(100), + states('sensor.andreas_vindue_batteri') | float(100), + states('sensor.badevaerelse_vindue_batteri') | float(100), + states('sensor.lille_bad_vindue_batteri') | float(100), + states('sensor.terrassedor_batteri') | float(100), ] | min < 20 }} - name: Vedligehold Home Assistant @@ -217,6 +221,12 @@ 1 if states('sensor.syd_batteri') | float(100) < 20 else 0, 1 if states('sensor.hojre_battery') | float(100) < 20 else 0, 1 if states('sensor.garageport_batteri') | float(100) < 20 else 0, + 1 if states('sensor.sovevaerelse_vindue_batteri') | float(100) < 20 else 0, + 1 if states('sensor.daniel_vindue_batteri') | float(100) < 20 else 0, + 1 if states('sensor.andreas_vindue_batteri') | float(100) < 20 else 0, + 1 if states('sensor.badevaerelse_vindue_batteri') | float(100) < 20 else 0, + 1 if states('sensor.lille_bad_vindue_batteri') | float(100) < 20 else 0, + 1 if states('sensor.terrassedor_batteri') | float(100) < 20 else 0, 1 if is_state('lawn_mower.husqvarna_automower', 'error') else 0 ] | sum }} \ No newline at end of file