Compare commits

...

2 Commits

Author SHA1 Message Date
claus ce888204db Fix Roborock wake timing, update kontekst.txt
- Roborock: wait for vacuum+battery != unknown/unavailable (2min timeout)
- Roborock: recompute variables AFTER wait_template, not at trigger time
- Roborock: block start if vacuum in error state (e.g. dock water refill)
- kontekst.txt: add device/integration details (TTS, garage, Roborock, Shelly, etc.)
2026-04-19 20:58:11 +02:00
claus 0311447d91 Robust garage: use input_boolean to track car departure
- Replace fragile Tesla tracker state check with input_boolean.left_home_by_car
- Set boolean ON when leaving by car (speed > 0), check it on arrival
- Add separate car_arriving trigger as backup for WiFi-first phone
- Fixes: garage not opening on arrival due to slow Tesla tracker updates
2026-04-19 19:25:20 +02:00
4 changed files with 100 additions and 44 deletions
@@ -2,7 +2,8 @@
alias: Garage auto Claus
description: >
Åbn garage ved ankomst i bil, luk ved afrejse.
Trigger på både telefon og bil-tracker for at fange begge signaler.
Bruger input_boolean.left_home_by_car til at huske at afrejsen var i bil,
så ankomst-logikken ikke afhænger af at Tesla-trackeren opdaterer hurtigt.
trigger:
# Telefon ankommer hjem (debounce 10s mod GPS-flimmer)
@@ -13,11 +14,11 @@
seconds: 10
id: arriving
# Bil ankommer hjem (fanger tilfælde hvor telefon allerede var "home" via WiFi)
# Bil ankommer hjem (backup hvis telefon allerede var "home" via WiFi)
- platform: state
entity_id: device_tracker.snowywhite_location_tracker
to: "home"
id: arriving
id: car_arriving
# Telefon forlader hjemmet (debounce 10s mod GPS-flimmer)
- platform: state
@@ -35,7 +36,7 @@
action:
- choose:
# ÅBN: garage lukket + telefon hjemme + bil netop ankommet
# ÅBN via telefon: garage lukket + forlod hjemmet i bil
- conditions:
- condition: trigger
id: arriving
@@ -44,31 +45,54 @@
entity_id: binary_sensor.garageport
state: "off"
# Telefon skal være hjemme
# Vi ved at brugeren kørte hjemmefra
- condition: state
entity_id: device_tracker.claus_iphone_15pro
state: "home"
# Bil skal være hjemme
- condition: state
entity_id: device_tracker.snowywhite_location_tracker
state: "home"
# Bilen skal have skiftet til "home" for nylig (< 5 min)
# Forhindrer åbning hvis du går hjem og bilen allerede stod i garagen
- condition: template
value_template: >
{{ (now() - states.device_tracker.snowywhite_location_tracker.last_changed).total_seconds() < 300 }}
entity_id: input_boolean.left_home_by_car
state: "on"
sequence:
- service: cover.toggle
target:
entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage åbnet (ankomst i bil)"
# ÅBN via bil-tracker: telefon allerede hjemme + forlod i bil
- conditions:
- condition: trigger
id: car_arriving
- condition: state
entity_id: binary_sensor.garageport
state: "off"
- condition: state
entity_id: device_tracker.claus_iphone_15pro
state: "home"
- condition: state
entity_id: input_boolean.left_home_by_car
state: "on"
sequence:
- service: cover.toggle
target:
entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage åbnet (bil-tracker ankomst)"
# LUK: garage åben + forlader hjemmet + bil kører
- conditions:
- condition: trigger
@@ -78,12 +102,17 @@
entity_id: binary_sensor.garageport
state: "on"
# Bil skal faktisk have fart (> 0), ikke bare "speed eksisterer"
# Bil skal faktisk have fart (> 0)
- condition: template
value_template: >
{{ (state_attr('device_tracker.snowywhite_location_tracker', 'speed') | float(0)) > 0 }}
sequence:
# Markér at vi kørte hjemmefra (bruges ved ankomst)
- service: input_boolean.turn_on
target:
entity_id: input_boolean.left_home_by_car
- delay: "00:00:30"
# Dobbelttjek at garagen stadig er åben efter forsinkelsen
+16 -9
View File
@@ -52,20 +52,25 @@
for: "00:05:00"
variables:
roborock_family_away: "{{ is_state('binary_sensor.family_presence', 'off') }}"
roborock_auto_runs: "{{ states('input_number.roborock_auto_runs_today') | int(0) }}"
roborock_is_cleaning: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
roborock_battery: "{{ states('sensor.roborock_s8_pro_ultra_batteri') | int(0) }}"
roborock_state: "{{ states('vacuum.roborock_s8_pro_ultra') }}"
roborock_status: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}"
roborock_error: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}"
roborock_cleaned_area: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaned_area') | default('ukendt', true) }}"
roborock_cleaning_time: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaning_time') | default('ukendt', true) }}"
action:
# Vent til Roborock er vækket og rapporterer tilstand
- wait_template: "{{ states('sensor.roborock_s8_pro_ultra_batteri') != 'unknown' }}"
timeout: "00:00:30"
- wait_template: >
{{ states('vacuum.roborock_s8_pro_ultra') not in ['unknown', 'unavailable']
and states('sensor.roborock_s8_pro_ultra_batteri') not in ['unknown', 'unavailable'] }}
timeout: "00:02:00"
# Genberegn variabler EFTER Roborock er vågnet
- variables:
roborock_family_away: "{{ is_state('binary_sensor.family_presence', 'off') }}"
roborock_auto_runs: "{{ states('input_number.roborock_auto_runs_today') | int(0) }}"
roborock_is_cleaning: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
roborock_battery: "{{ states('sensor.roborock_s8_pro_ultra_batteri') | int(0) }}"
roborock_state: "{{ states('vacuum.roborock_s8_pro_ultra') }}"
roborock_status: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}"
roborock_error: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}"
- choose:
- conditions:
@@ -75,6 +80,7 @@
roborock_family_away
and roborock_auto_runs < 2
and not roborock_is_cleaning
and roborock_state not in ['error', 'unknown', 'unavailable']
and roborock_battery > 20
}}
sequence:
@@ -129,6 +135,7 @@
Familie hjemme: {{ not roborock_family_away }}.
Auto-kørsler i dag: {{ roborock_auto_runs }}.
Kører allerede: {{ roborock_is_cleaning }}.
State: {{ roborock_state }}.
Batteri: {{ roborock_battery }}%.
+4
View File
@@ -0,0 +1,4 @@
left_home_by_car:
name: Forlod hjemmet i bil
icon: mdi:car
initial: false
+32 -16
View File
@@ -1,31 +1,47 @@
Jeg arbejder med Home Assistant version 2026.3.3.
Min konfiguration er 100% YAML-baseret og opdelt via !include_dir_merge_* og !include i en struktureret mappestruktur (templates, sensors, automations, binary_sensors, input_*, osv.). Jeg forventer løsninger, der respekterer denne opdeling og er direkte kompatible med en splittet konfiguration.
Min konfiguration er 100% YAML-baseret og opdelt via !include_dir_merge_* og !include i en struktureret mappestruktur (templates, sensors, automations, binary_sensors, input_*, osv.). Jeg forventer loesninger, der respekterer denne opdeling og er direkte kompatible med en splittet konfiguration.
Jeg bruger standard Lovelace (YAML mode) ikke UI editor og ikke Dwains Dashboard. Alle dashboards skal derfor leveres som valid Lovelace YAML.
Jeg bruger standard Lovelace (YAML mode) - ikke UI editor og ikke Dwains Dashboard. Alle dashboards skal derfor leveres som valid Lovelace YAML.
Antag følgende:
Antag foelgende:
- Jeg er erfaren HA-bruger
- Jeg ønsker robuste, produktionsegnet løsninger
- Jeg prioriterer stabilitet over smart hacks
- Jeg vil undgå unknown/unavailable states og template-fejl
- Jeg vil have korrekt datatype-håndtering (float/int/string)
- Jeg oensker robuste, produktionsegnet loesninger
- Jeg prioriterer stabilitet over "smart hacks"
- Jeg vil undgaa unknown/unavailable states og template-fejl
- Jeg vil have korrekt datatype-haandtering (float/int/string)
- Jeg vil minimere race conditions og edge cases
Når du svarer:
Naar du svarer:
- Giv altid copy-paste klar YAML
- Indiker hvor filer skal placeres (fx include/sensors/xxx.yaml)
- Brug defensive templates (default værdier, checks for unknown/unavailable)
- Undgå deprecated eller UI-only features
- Optimer for performance (undgå unødvendige loops / tunge templates)
- Forklar kort hvorfor løsningen er korrekt men vær præcis og teknisk
- Brug defensive templates (default vaerdier, checks for unknown/unavailable)
- Undgaa deprecated eller UI-only features
- Optimer for performance (undgaa unoedvendige loops / tunge templates)
- Forklar kort hvorfor loesningen er korrekt - men vaer praecis og teknisk
Hvis relevant:
- Foreslå forbedringer i arkitektur (ikke kun fixes)
- Identificér potentielle fejl før de opstår
- Prioritér simplicity + robustness over kompleksitet
- Foreslaa forbedringer i arkitektur (ikke kun fixes)
- Identificer potentielle fejl foer de opstaar
- Prioriter simplicity + robustness over kompleksitet
Kort sagt: agér som en Home Assistant arkitekt/debugger og optimer min opsætning.
Kort sagt: ager som en Home Assistant arkitekt/debugger og optimer min opsaetning.
Skriv en commit besked som jeg kan bruge til git.
Vigtige detaljer om min opsaetning:
- Docker-baseret Home Assistant, config paa /Volumes/homeassistant
- MQTT broker: 10.0.0.142:1883 (bruges af Shelly-enheder)
- Tesla (Snowywhite): device_tracker.snowywhite_location_tracker, sensor.snowywhite_battery, m.fl.
- TTS: Brug tts.speak med tts.google_ai_tts (IKKE google_translate - den provider findes ikke)
- Garage: cover.anne (GoGoGate2) + binary_sensor.garageport (rigtig sensor, GoGoGate2 sensor er upaalidelig)
- Brug altid cover.toggle (ikke open/close) da GoGoGate2 ikke kender sin tilstand
- input_boolean.left_home_by_car bruges til at tracke om afrejse var i bil
- Roborock S8 Pro Ultra: vacuum.roborock_s8_pro_ultra
- Sover ofte - vent paa state != unknown/unavailable foer brug af variabler
- Beregn variabler EFTER wait_template, ikke ved trigger-tidspunkt
- Tjek for error-state (fx dock-fejl) inden start
- Shelly Button 1 enheder via MQTT: fordoer (C45BBE6A5696), bagdoer (98CDAC1E5F42)
- Telefoner: notify.mobile_app_claus_iphone_15pro, notify.mobile_app_annes_iphone_14_pro
- Sonos hoejtalere: media_player.alrum, media_player.lille_badevaerelse, m.fl.
- Git repo: gitea.anneclaus.synology.me (SSH)