Compare commits
142 Commits
42930ef2f0
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 644cb28e88 | |||
| 7cae5a8c8b | |||
| 31c1258760 | |||
| 7cb07af473 | |||
| 25ab4ceeef | |||
| ba3ba34db8 | |||
| c54f583968 | |||
| 27224a4115 | |||
| ff8324af1f | |||
| 6731257b83 | |||
| 8b533ca95a | |||
| b46d820c20 | |||
| f5f085f155 | |||
| 63b6283fdb | |||
| 9e446e0d57 | |||
| d0e3a6c3e5 | |||
| 8b2ff535de | |||
| acdc7259a7 | |||
| c297012592 | |||
| 52dc97dd3d | |||
| 532f42b310 | |||
| ad5bdf91b9 | |||
| 0cb3145257 | |||
| 54144a03b8 | |||
| af3779a573 | |||
| 3094620985 | |||
| 8057b3abf1 | |||
| 677debfc27 | |||
| 910de6ed54 | |||
| bc6799c126 | |||
| 9f9de0524a | |||
| eacd137a7c | |||
| 63288dbb4b | |||
| c394d6b974 | |||
| fa64223630 | |||
| f2ac6064b5 | |||
| bd134bafef | |||
| 4e0819d4ff | |||
| 0d112fb4d0 | |||
| 067d5c6a63 | |||
| 5a7d25fd3c | |||
| bee2028f0b | |||
| 1525cc0070 | |||
| 812199889e | |||
| 7d5b31f9ab | |||
| bf6f2feba6 | |||
| ae8b1ea6f8 | |||
| 16b68da838 | |||
| 02d63e3d2b | |||
| 7b3bf5b375 | |||
| da78422f5e | |||
| ba0c34672c | |||
| 1805b4c107 | |||
| c366831dd0 | |||
| 6310ee4055 | |||
| 0e23bceb79 | |||
| 19dcab272e | |||
| 1fdcf410ed | |||
| 83fc33f809 | |||
| 1e96c41971 | |||
| 6c3def6996 | |||
| 68db35cae3 | |||
| 4e13ccf658 | |||
| 1063166faa | |||
| 750dee2996 | |||
| 7c6c62cff4 | |||
| e0ec8391d9 | |||
| 6208f6fb49 | |||
| 9cb7550f78 | |||
| 56f21f79e1 | |||
| 6b302b7c65 | |||
| a7580b851a | |||
| 3d2cfe6437 | |||
| 40cb13662a | |||
| 9b833aef16 | |||
| 4030b5995f | |||
| cd9bc28e9e | |||
| c36e47d2ee | |||
| 94f0cd4d8a | |||
| 158beed9c5 | |||
| 9c184ed0b7 | |||
| df734d9259 | |||
| 9f1dd20f06 | |||
| 8bd20bda42 | |||
| 30fffd8651 | |||
| 5a0232eeba | |||
| 3608da8a4c | |||
| 7e38ef2e42 | |||
| 72e0e583be | |||
| 70d01bfabf | |||
| 2ae9723fa3 | |||
| 9fbc1626d7 | |||
| cea0e599f9 | |||
| b7caa8d158 | |||
| 542af023c8 | |||
| 9697dd2925 | |||
| fa79ffc0e6 | |||
| 5bbf0a5082 | |||
| 7b7dc22245 | |||
| 2c3e5bb540 | |||
| 0f3743c1cf | |||
| ea97b824e7 | |||
| ef9200f65b | |||
| 83f8908a3f | |||
| 98adadbaaa | |||
| 8828281ae2 | |||
| dbf4b42738 | |||
| 4b9202567d | |||
| 89dc2ec499 | |||
| b13bc2e74b | |||
| d411488b27 | |||
| ab76023b12 | |||
| c82c8a66e5 | |||
| 8fa3cf7c87 | |||
| 6c26c6b05c | |||
| 6013bb6f81 | |||
| f6a0c75dfb | |||
| 1cf12e53df | |||
| 43034bb41e | |||
| ce888204db | |||
| 0311447d91 | |||
| d39e0051db | |||
| fcb290a1aa | |||
| ed6e91d52b | |||
| c7f6e74544 | |||
| acb2540890 | |||
| 27228815ba | |||
| 6e9e28274c | |||
| be4f83fcb1 | |||
| cd4da0eaed | |||
| aab1ead212 | |||
| 69942ef7b7 | |||
| 654ae18ddd | |||
| 394fadd463 | |||
| aa6413ea79 | |||
| 7f467714c3 | |||
| ba49056764 | |||
| 66e28ce68f | |||
| 04c29a8839 | |||
| f8eacec2ff | |||
| fd8ccb9771 | |||
| 2c4f6c4308 |
+1
-1
@@ -1 +1 @@
|
||||
2026.4.1
|
||||
2026.5.1
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
name: ha
|
||||
description: "Use when creating, updating, or reviewing Home Assistant YAML automations, scripts, templates, dashboards, and includes in this repository. Trigger phrases: ha, home assistant, automation, script, yaml, lovelace, include, configuration.yaml."
|
||||
tools: [read, edit, search, todo, execute]
|
||||
user-invocable: true
|
||||
---
|
||||
You are a Home Assistant specialist for this exact repository.
|
||||
|
||||
Your primary goal is to produce reliable, maintainable YAML changes that match this installation's structure and conventions.
|
||||
|
||||
## Core Principles
|
||||
- Target latest Home Assistant behavior and YAML syntax.
|
||||
- Always prefer YAML-managed configuration over UI-generated storage unless explicitly requested.
|
||||
- Keep changes minimal, safe, and consistent with nearby files.
|
||||
- Never move secrets into tracked YAML files; keep secrets in secrets.yaml.
|
||||
|
||||
## Repository-Specific Layout
|
||||
Follow these include rules from configuration.yaml:
|
||||
- Automations: include/automations/ via include_dir_merge_list
|
||||
- Scripts: include/scripts/ via include_dir_merge_named
|
||||
- Shell commands: include/shell_commands/ via include_dir_merge_named
|
||||
- Templates: include/templates/ via include_dir_merge_list
|
||||
- Sensors: include/sensors/ via include_dir_merge_list
|
||||
- Binary sensors: include/binary_sensors/ via include_dir_merge_list
|
||||
- Inputs live under include/input/*/
|
||||
|
||||
When adding new logic:
|
||||
- Put automations in include/automations/*.yaml (do not edit root automations.yaml unless asked).
|
||||
- Put scripts in include/scripts/*.yaml (do not edit root scripts.yaml unless asked).
|
||||
- Put shell commands in include/shell_commands/*.yaml.
|
||||
- Keep Lovelace in YAML mode and edit existing YAML dashboards/views files.
|
||||
|
||||
## Automation Authoring Rules
|
||||
- Use clear alias names and deterministic triggers.
|
||||
- Prefer idempotent actions and guard conditions to avoid repeated/duplicate notifications.
|
||||
- Use choose/conditions for branching instead of duplicated automations.
|
||||
- Reuse existing helper entities and naming patterns where possible.
|
||||
- Keep time/date logic explicit (timezone-aware assumptions for Europe/Copenhagen).
|
||||
|
||||
## YAML Quality Rules
|
||||
- Preserve existing indentation and style in the target file.
|
||||
- Avoid broad refactors when only a local change is needed.
|
||||
- Keep comments short and only where they clarify non-obvious logic.
|
||||
- If multiple files are touched, ensure references are consistent across automations/scripts/shell commands/dashboard buttons.
|
||||
|
||||
## Validation and Safety
|
||||
- After edits, run a quick repository sanity check (at minimum inspect YAML structure and obvious syntax issues).
|
||||
- If executable checks are available, run them and report results.
|
||||
- Call out assumptions or runtime dependencies (custom components, integrations, mobile notify targets).
|
||||
- Do not remove or overwrite unrelated user changes.
|
||||
|
||||
## Output Expectations
|
||||
When asked to implement changes:
|
||||
1. Make the YAML edits directly in the correct include files.
|
||||
2. Explain exactly which files were changed and why.
|
||||
3. Summarize any validation performed.
|
||||
4. Mention any manual Home Assistant reload/restart steps required (automation/script reload vs full restart).
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
name: Madplan
|
||||
description: "Use when creating or updating weekly dinner meal plans for this family, importing Valdemarsro recipes into Mealie, avoiding duplicates, and producing a Bilka ToGo shopping list. Trigger phrases: madplan, mealie, Valdemarsro, aftensmad, indkøbsliste, Bilka ToGo, ugeplan."
|
||||
tools: [read, edit, search, web, todo, execute]
|
||||
user-invocable: true
|
||||
---
|
||||
You are a specialist meal-planning agent for this Home Assistant + Mealie setup.
|
||||
|
||||
Your goal is to create practical weekly DINNER plans that match family nutrition needs, reuse leftovers smartly, and keep shopping simple.
|
||||
|
||||
## Family Profile
|
||||
- Family of 4: Anne (49), Claus (54), Andreas (16), Daniel (14).
|
||||
- Andreas: wants high protein and fewer carbs.
|
||||
- Daniel: elite swimmer, trains 7x/week, needs high carbs.
|
||||
- Anne and Claus: weight maintenance.
|
||||
|
||||
## Fixed Weekly Structure
|
||||
- Dinner only.
|
||||
- Sunday: cook double portion; serve leftovers Tuesday.
|
||||
- Monday: cook double portion; serve leftovers Wednesday.
|
||||
- Thursday: light, fast, flexible meal (family may eat at different times).
|
||||
- Friday: "lækker mad" (for example ribeye-style dinner).
|
||||
- Saturday: "lækker mad" (for example homemade salmon sushi).
|
||||
|
||||
## Recipe Source Rules
|
||||
- Prefer Valdemarsro recipes.
|
||||
- Always import planned recipes into Mealie by default.
|
||||
- Fetch recipe pages and map to Mealie-friendly names/slugs before finalizing the plan.
|
||||
- Never add duplicate recipes already present in Mealie or existing week plan.
|
||||
- Keep the plan realistic for one weekly grocery run.
|
||||
|
||||
## Shopping Rules
|
||||
- Build one combined weekly shopping list suitable for Bilka ToGo.
|
||||
- Group clearly by category (produce, meat/fish, dairy, pantry, frozen, etc.).
|
||||
- Use plain item names and practical quantities for 4 people, accounting for double-portion days.
|
||||
- If exact quantities are unknown from source, provide best-effort estimates and mark them clearly.
|
||||
|
||||
## Workflow
|
||||
1. Read current Mealie data and detect already planned dinners and existing imported recipes.
|
||||
2. Propose or update a week plan that follows the fixed Sunday-Monday leftovers pattern.
|
||||
3. Validate nutrition balance across the week:
|
||||
- Ensure protein-forward options exist for Andreas.
|
||||
- Ensure carb availability for Daniel (sides/add-ons where relevant).
|
||||
- Keep Anne/Claus portions and sides weight-maintenance friendly.
|
||||
4. Import all missing planned recipes into Mealie references before publishing the final plan.
|
||||
5. Produce a Bilka ToGo shopping list for the final plan.
|
||||
|
||||
## Output Format
|
||||
Always return:
|
||||
1. Weekly dinner plan (Sun-Sat) with leftover links Tue/Wed.
|
||||
2. Brief nutrition notes per day (protein/carbs adjustment hints per person).
|
||||
3. "Imported to Mealie" section (added vs skipped as duplicate).
|
||||
4. Bilka ToGo shopping list grouped by category.
|
||||
5. Optional prep plan for Friday pickup/delivery and Sunday prep.
|
||||
|
||||
## Constraints
|
||||
- Do not plan breakfast/lunch unless explicitly requested.
|
||||
- Do not ignore the fixed leftovers pattern.
|
||||
- Do not leave planned recipes unimported in Mealie unless blocked by missing source data.
|
||||
- Do not include duplicate recipe imports.
|
||||
- Keep recommendations practical for a busy training week.
|
||||
+10
@@ -1,5 +1,6 @@
|
||||
# Ignore everything globally
|
||||
.DS_Store
|
||||
._*
|
||||
custom_components/
|
||||
blueprints/
|
||||
dwains-dashboard/
|
||||
@@ -26,6 +27,7 @@ secrets.yaml
|
||||
known_devices.yaml
|
||||
configuration_full.yaml
|
||||
configuration_minimal.yaml
|
||||
.env.infrastructure
|
||||
|
||||
# --- Whitelist core files ---
|
||||
!*.yaml
|
||||
@@ -36,6 +38,10 @@ configuration_minimal.yaml
|
||||
!.HA_VERSION
|
||||
!customize
|
||||
|
||||
# --- Re-ignore macOS metadata files inside whitelisted dirs ---
|
||||
include/**/.DS_Store
|
||||
include/**/._*
|
||||
|
||||
# --- Whitelist directories ---
|
||||
!www/
|
||||
!include/
|
||||
@@ -64,6 +70,7 @@ configuration_minimal.yaml
|
||||
/oldscripts.yaml
|
||||
|
||||
# --- Local media snapshots and downloads ---
|
||||
/www/snapshots/
|
||||
/www/affalddk/
|
||||
/www/community/
|
||||
/www/indkorsel_snapshot.jpg
|
||||
@@ -74,4 +81,7 @@ configuration_minimal.yaml
|
||||
|
||||
# --- Local helper scripts not used in git ---
|
||||
/python_scripts/scene_generator.py
|
||||
|
||||
# --- Temporary backup workspace ---
|
||||
/tmp_backups/
|
||||
/python_scripts/update_climate.py
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
## Installation of home-assistant on Synology
|
||||
|
||||
Follow https://www.home-assistant.io/installation/alternative/:
|
||||
@@ -86,6 +85,47 @@ Synology.
|
||||
|
||||
https://thomes.blog/2020/12/09/how-to-gitea-on-synology/
|
||||
|
||||
## Synology infrastructure stack
|
||||
|
||||
Hvis Synology genstarter, er det let at ende med at Mosquitto, Gitea DB og Gitea ikke kommer op i korrekt rækkefølge.
|
||||
|
||||
Denne repo indeholder derfor også en compose-baseret variant i [docker-compose.infrastructure.yml](docker-compose.infrastructure.yml) med:
|
||||
|
||||
* `restart: unless-stopped` på Mosquitto, Gitea DB og Gitea
|
||||
* healthchecks på alle tre services
|
||||
* `depends_on` så Gitea først starter når databasen er healthy
|
||||
* Gitea-vaerdier justeret til at spejle den nuvaerende interne `app.ini`-opsaetning
|
||||
|
||||
Brug den sammen med en lokal `.env.infrastructure` baseret på [.env.infrastructure.example](.env.infrastructure.example).
|
||||
|
||||
Det giver en mere robust opstart end manuelt oprettede containere i Synology UI, især efter NAS-reboot.
|
||||
|
||||
### Sikker migration fra Synology UI til compose
|
||||
|
||||
Hvis du vil flytte Mosquitto, Gitea DB og Gitea fra Synology UI til compose uden datatab, saa goer det i denne raekkefoelge:
|
||||
|
||||
1. Bekraeft at paths i `.env.infrastructure` matcher de eksisterende mounts i Synology UI.
|
||||
2. Tag backup af mindst disse mapper: `/volume1/docker/gitea/data`, `/volume1/docker/gitea/db` og Mosquitto `config`, `data`, `log`.
|
||||
3. Eksporter eller tag screenshots af nuvaerende container-indstillinger i Synology UI, saa porte, mounts og miljoevariabler kan sammenlignes bagefter.
|
||||
4. Stop foerst `gitea`, derefter `gitea-db` og til sidst `mosquitto` i Synology UI.
|
||||
5. Lad containerne blive liggende i UI i foerste omgang, men undgaa at starte dem igen under testen.
|
||||
6. Kør compose-stakken med samme data-mounts, saa de nye containere genbruger eksisterende data i stedet for at initialisere nyt dataindhold.
|
||||
7. Start foerst `gitea-db` og vent til den er healthy.
|
||||
8. Start derefter `gitea` og kontroller at login, repositories og push virker som foer.
|
||||
9. Start `mosquitto` og kontroller at Home Assistant reconnecter, og at dørklokker eller andre MQTT-afhaengige funktioner virker igen.
|
||||
10. Naar alt virker stabilt, kan de gamle UI-oprettede containere slettes eller deaktiveres permanent.
|
||||
|
||||
Praktisk testsekvens efter migration:
|
||||
|
||||
* Aabn Gitea og bekraeft at repos og historik er intakte.
|
||||
* Test et `git pull` og et lille `git push` mod Gitea.
|
||||
* Bekraeft at Home Assistant kan ramme MQTT igen.
|
||||
* Ring paa en doerklokke eller test en anden MQTT-trigger.
|
||||
|
||||
Vigtig regel: genbrug eksisterende data-paths under hele migrationen. Den stoerste risiko er ikke compose-filen, men at man ved en fejl starter en ny tom database eller en ny tom Gitea-data-mappe.
|
||||
|
||||
En kort cutover-version findes i [dokumenter/infrastructure_cutover_checklist.md](dokumenter/infrastructure_cutover_checklist.md).
|
||||
|
||||
## use git version control on the local gitea client
|
||||
https://community.home-assistant.io/t/sharing-your-configuration-on-github/195144
|
||||
|
||||
|
||||
+3
-1
@@ -6,7 +6,7 @@ default_config:
|
||||
|
||||
homeassistant:
|
||||
name: !secret name
|
||||
external_url: "http://anneclaus.duckdns.org:8123"
|
||||
external_url: "https://ha.anneclaus.dk"
|
||||
internal_url: "http://dethlefsen:8123"
|
||||
auth_providers:
|
||||
- type: homeassistant
|
||||
@@ -27,6 +27,7 @@ http:
|
||||
trusted_proxies:
|
||||
- 127.0.0.1
|
||||
- 10.0.0.142
|
||||
- 172.17.0.0/16 # Docker bridge (NPM)
|
||||
|
||||
logger:
|
||||
default: warning
|
||||
@@ -38,6 +39,7 @@ logger:
|
||||
homeassistant.components.discovery: error
|
||||
homeassistant.components.dlna_dmr: error
|
||||
async_upnp_client: error
|
||||
automower_ble: critical
|
||||
|
||||
recorder:
|
||||
purge_keep_days: 7
|
||||
|
||||
@@ -155,6 +155,15 @@ cards:
|
||||
target:
|
||||
entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop
|
||||
|
||||
- type: button
|
||||
name: Gå til dock
|
||||
icon: mdi:home-import-outline
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: vacuum.return_to_base
|
||||
target:
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
|
||||
# 🏎️ Plæneklipper
|
||||
- type: horizontal-stack
|
||||
cards:
|
||||
@@ -222,13 +231,15 @@ cards:
|
||||
show_state: true
|
||||
|
||||
- type: tile
|
||||
entity: cover.anne
|
||||
entity: binary_sensor.garageport
|
||||
name: Garage
|
||||
icon: mdi:garage
|
||||
features_position: bottom
|
||||
vertical: false
|
||||
tap_action:
|
||||
action: toggle
|
||||
action: call-service
|
||||
service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
show_state: true
|
||||
|
||||
# 🎵 Sonos
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
title: Person Status
|
||||
path: person-status
|
||||
icon: mdi:account-group
|
||||
type: sections
|
||||
max_columns: 1 # én kolonne for fuld bredde
|
||||
|
||||
sections:
|
||||
|
||||
# 👨👩👧👦 Personer (2x2 grid)
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
|
||||
- type: entities
|
||||
title: Daniel
|
||||
entities:
|
||||
- entity: person.daniel_schusler_dethlefsen
|
||||
- entity: input_select.daniel_status
|
||||
|
||||
- type: entities
|
||||
title: Claus
|
||||
entities:
|
||||
- entity: person.claus_dethlefsen
|
||||
- entity: input_select.claus_status
|
||||
|
||||
- type: entities
|
||||
title: Anne
|
||||
entities:
|
||||
- entity: person.anne_schusler_dethlefsen
|
||||
- entity: input_select.anne_status
|
||||
|
||||
- type: entities
|
||||
title: Andreas
|
||||
entities:
|
||||
- entity: person.andreas_schusler_dethlefsen
|
||||
- entity: input_select.andreas_status
|
||||
|
||||
|
||||
# 🗺️ Popup kort nederst
|
||||
- type: grid
|
||||
cards:
|
||||
- type: custom:button-card
|
||||
name: Åbn kort
|
||||
icon: mdi:map
|
||||
show_state: false
|
||||
styles:
|
||||
card:
|
||||
- border-radius: 16px
|
||||
- padding: 14px
|
||||
- background: linear-gradient(135deg, rgba(0,0,0,0.05), rgba(0,0,0,0.1))
|
||||
icon:
|
||||
- color: var(--primary-color)
|
||||
name:
|
||||
- font-size: 14px
|
||||
- font-weight: 600
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: browser_mod.popup
|
||||
service_data:
|
||||
title: 📍 Familien
|
||||
size: fullscreen
|
||||
style:
|
||||
--popup-border-radius: 20px
|
||||
--popup-background-color: rgba(0,0,0,0.9)
|
||||
content:
|
||||
type: map
|
||||
default_zoom: 12
|
||||
hours_to_show: 6
|
||||
aspect_ratio: 1
|
||||
entities:
|
||||
- entity: device_tracker.andreas_iphone_12
|
||||
name: Andreas
|
||||
- entity: device_tracker.daniels_iphone_7_3
|
||||
name: Daniel
|
||||
- entity: device_tracker.annes_iphone_xs_4
|
||||
name: Anne
|
||||
- entity: device_tracker.claus_iphone_15pro
|
||||
name: Claus
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,6 +4,31 @@ icon: mdi:bed-king-outline
|
||||
type: sections
|
||||
|
||||
sections:
|
||||
- type: grid
|
||||
cards:
|
||||
- type: custom:button-card
|
||||
name: Godnat
|
||||
icon: mdi:weather-night
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: script.godnat_sovevaerelse
|
||||
hold_action:
|
||||
action: call-service
|
||||
service: light.turn_off
|
||||
service_data:
|
||||
entity_id: light.sovevaerelse
|
||||
styles:
|
||||
card:
|
||||
- height: 64px
|
||||
- background-color: "#1a1a2e"
|
||||
- color: "#c8b8f0"
|
||||
icon:
|
||||
- color: "#c8b8f0"
|
||||
- width: 24px
|
||||
name:
|
||||
- font-size: 14px
|
||||
- color: "#c8b8f0"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
@@ -141,3 +166,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
|
||||
|
||||
@@ -0,0 +1,696 @@
|
||||
title: Madplan
|
||||
path: madplan
|
||||
icon: mdi:chef-hat
|
||||
|
||||
cards:
|
||||
|
||||
# 🍽️ Dagens ret - stort fremhævet kort med link til Mealie
|
||||
- type: custom:button-card
|
||||
entity: sensor.dagens_aftensmad
|
||||
show_icon: true
|
||||
show_name: true
|
||||
show_state: true
|
||||
icon: mdi:food-variant
|
||||
name: I dag
|
||||
tap_action:
|
||||
action: url
|
||||
url_path: >
|
||||
[[[
|
||||
var slug = states['sensor.dagens_aftensmad_slug'].state;
|
||||
if (slug && slug !== '' && slug !== 'unknown') {
|
||||
return 'https://mealie.anneclaus.dk/g/home/r/' + slug;
|
||||
}
|
||||
return 'https://mealie.anneclaus.dk';
|
||||
]]]
|
||||
styles:
|
||||
card:
|
||||
- padding: 16px
|
||||
- background: var(--primary-color)
|
||||
- border-radius: 12px
|
||||
icon:
|
||||
- color: white
|
||||
- width: 40px
|
||||
name:
|
||||
- font-size: 13px
|
||||
- color: "rgba(255,255,255,0.7)"
|
||||
- text-transform: uppercase
|
||||
- letter-spacing: 1px
|
||||
state:
|
||||
- font-size: 22px
|
||||
- font-weight: bold
|
||||
- color: white
|
||||
- padding-top: 4px
|
||||
|
||||
# 🎵 Musik i køkken + Vi laver mad + Der er mad
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
- type: button
|
||||
name: Musik i køkken
|
||||
icon: mdi:music-note-outline
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "1 Family Mix"
|
||||
|
||||
- type: button
|
||||
name: Vi laver mad
|
||||
icon: mdi:chef-hat
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: script.vi_laver_mad
|
||||
|
||||
- type: button
|
||||
name: Der er mad!
|
||||
icon: mdi:silverware-fork-knife
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: script.mad_announcement
|
||||
|
||||
# 📅 Madplan: i dag + 6 dage
|
||||
- type: markdown
|
||||
content: |-
|
||||
{%- set ns = namespace(rows="") -%}
|
||||
{%- set items = state_attr('sensor.mealie_madplan_ugen', 'items') or [] -%}
|
||||
{%- set days = ['Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag','Søndag'] -%}
|
||||
{%- for offset in range(7) -%}
|
||||
{%- set day = now().date() + timedelta(days=offset) -%}
|
||||
{%- set ms = items | selectattr('date', 'eq', day.isoformat()) | list -%}
|
||||
{%- set m = ms[0] if ms else none -%}
|
||||
{%- set recipe = m.recipe if m else none -%}
|
||||
{%- set name = recipe.name if recipe else '' -%}
|
||||
{%- set slug = recipe.slug if recipe else '' -%}
|
||||
{%- set label = 'I dag' if offset == 0 else days[day.weekday()] -%}
|
||||
{%- if slug -%}
|
||||
{%- set ns.rows = ns.rows + "| **" + label + "** | [" + name + "](https://mealie.anneclaus.dk/g/home/r/" + slug + ") |\n" -%}
|
||||
{%- elif name -%}
|
||||
{%- set ns.rows = ns.rows + "| **" + label + "** | " + name + " |\n" -%}
|
||||
{%- else -%}
|
||||
{%- set ns.rows = ns.rows + "| **" + label + "** | - |\n" -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
## Næste 7 dage
|
||||
|
||||
| Dag | Ret |
|
||||
| --- | --- |
|
||||
{{ ns.rows }}
|
||||
|
||||
# 🎵 Sonos Køkken
|
||||
- type: media-control
|
||||
entity: media_player.kokken
|
||||
name: Sonos Køkken
|
||||
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:button-card
|
||||
name: Volumen ned
|
||||
icon: mdi:volume-minus
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.volume_down
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
hold_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.volume_down
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
styles:
|
||||
card:
|
||||
- height: 72px
|
||||
- font-size: 16px
|
||||
- background: var(--primary-color)
|
||||
icon:
|
||||
- color: white
|
||||
- width: 36px
|
||||
name:
|
||||
- color: white
|
||||
- font-size: 13px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Volumen op
|
||||
icon: mdi:volume-plus
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.volume_up
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
hold_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.volume_up
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
styles:
|
||||
card:
|
||||
- height: 72px
|
||||
- font-size: 16px
|
||||
- background: var(--primary-color)
|
||||
icon:
|
||||
- color: white
|
||||
- width: 36px
|
||||
name:
|
||||
- color: white
|
||||
- font-size: 13px
|
||||
|
||||
- type: grid
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:button-card
|
||||
name: DR P3
|
||||
icon: mdi:radio
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "0 DR P3"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Family Mix
|
||||
icon: mdi:account-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "1 Family Mix"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Danske fav.
|
||||
icon: mdi:music-note
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Danske favoritter"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Rock klassikere
|
||||
icon: mdi:music-note-outline
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Danske rock klassikere"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 1
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 1"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 2
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 2"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 3
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 3"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 4
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 4"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 5
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 5"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Anne Mix 6
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Anne Daily Mix 6"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 1
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 1"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 2
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 2"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 3
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 3"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 4
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 4"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 5
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 5"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Claus Mix 6
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Claus Daily Mix 6"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 1
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 1"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 2
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 2"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 3
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 3"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 4
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 4"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 5
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 5"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Andreas Mix 6
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Andreas Daily Mix 6"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 1
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 1"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 2
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 2"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 3
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 3"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 4
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 4"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 5
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 5"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
- type: custom:button-card
|
||||
name: Daniel Mix 6
|
||||
icon: mdi:playlist-music
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: media_player.select_source
|
||||
target:
|
||||
entity_id: media_player.kokken
|
||||
data:
|
||||
source: "Daniel Daily Mix 6"
|
||||
styles:
|
||||
card:
|
||||
- height: 52px
|
||||
- padding: 6px 8px
|
||||
icon:
|
||||
- width: 18px
|
||||
name:
|
||||
- font-size: 11px
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
title: Vanding
|
||||
path: vanding
|
||||
icon: mdi:sprinkler-variant
|
||||
type: sections
|
||||
|
||||
max_columns: 2
|
||||
|
||||
sections:
|
||||
|
||||
# 💧 Jordfugt – målere
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Jordfugt
|
||||
icon: mdi:water-percent
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.annes_havesensor_soil_moisture_1
|
||||
name: Højbed 1 – Ærter
|
||||
min: 0
|
||||
max: 100
|
||||
needle: true
|
||||
severity:
|
||||
green: 40
|
||||
yellow: 20
|
||||
red: 0
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.annes_havesensor_soil_moisture_2
|
||||
name: Højbed 2 – Kartofler
|
||||
min: 0
|
||||
max: 100
|
||||
needle: true
|
||||
severity:
|
||||
green: 40
|
||||
yellow: 20
|
||||
red: 0
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.annes_havesensor_soil_moisture_3
|
||||
name: Højbed 3 – Rabarber
|
||||
min: 0
|
||||
max: 100
|
||||
needle: true
|
||||
severity:
|
||||
green: 40
|
||||
yellow: 20
|
||||
red: 0
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.annes_havesensor_soil_moisture_4
|
||||
name: Drivhus
|
||||
min: 0
|
||||
max: 100
|
||||
needle: true
|
||||
severity:
|
||||
green: 45
|
||||
yellow: 25
|
||||
red: 0
|
||||
|
||||
# 📈 Jordfugt – historik
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Jordfugt – 7 dage
|
||||
icon: mdi:chart-line
|
||||
|
||||
- type: history-graph
|
||||
title: Højbede (%)
|
||||
entities:
|
||||
- entity: sensor.annes_havesensor_soil_moisture_1
|
||||
name: HB1 Ærter
|
||||
- entity: sensor.annes_havesensor_soil_moisture_2
|
||||
name: HB2 Kartofler
|
||||
- entity: sensor.annes_havesensor_soil_moisture_3
|
||||
name: HB3 Rabarber
|
||||
hours_to_show: 168
|
||||
refresh_interval: 900
|
||||
|
||||
- type: history-graph
|
||||
title: Drivhus (%)
|
||||
entities:
|
||||
- entity: sensor.annes_havesensor_soil_moisture_4
|
||||
name: Drivhus
|
||||
hours_to_show: 168
|
||||
refresh_interval: 900
|
||||
|
||||
# 🌧️ Regn & vejr
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Regn (Netatmo)
|
||||
icon: mdi:weather-rainy
|
||||
|
||||
- type: tile
|
||||
entity: sensor.n22_nedbor
|
||||
name: Nedbør nu
|
||||
|
||||
- type: tile
|
||||
entity: sensor.n22_precipitation_today
|
||||
name: Nedbør i dag
|
||||
|
||||
- type: history-graph
|
||||
title: Nedbør – 7 dage
|
||||
entities:
|
||||
- entity: sensor.n22_precipitation_today
|
||||
name: Nedbør
|
||||
hours_to_show: 168
|
||||
refresh_interval: 1800
|
||||
|
||||
- type: custom:apexcharts-card
|
||||
header:
|
||||
show: true
|
||||
title: Forventet nedbør – næste 7 dage
|
||||
graph_span: 7d
|
||||
span:
|
||||
start: day
|
||||
apex_config:
|
||||
chart:
|
||||
type: bar
|
||||
height: 200
|
||||
dataLabels:
|
||||
enabled: true
|
||||
formatter: |
|
||||
EVAL:function(val) { return val ? val + ' mm' : ''; }
|
||||
xaxis:
|
||||
type: datetime
|
||||
labels:
|
||||
datetimeFormatter:
|
||||
day: "dd/MM"
|
||||
yaxis:
|
||||
min: 0
|
||||
title:
|
||||
text: mm
|
||||
series:
|
||||
- entity: sensor.vejr_daglig_prognose
|
||||
name: Nedbør
|
||||
color: "#4fc3f7"
|
||||
data_generator: |
|
||||
return entity.attributes.forecast.map(f => ({
|
||||
x: new Date(f.datetime).getTime(),
|
||||
y: f.precipitation ?? 0
|
||||
}));
|
||||
|
||||
# ⏸️ Rain Bird RC2
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Rain Bird RC2
|
||||
icon: mdi:sprinkler-fire
|
||||
|
||||
- type: tile
|
||||
entity: sensor.annes_vanding_raindelay
|
||||
name: Regn-forsinkelse status
|
||||
|
||||
- type: tile
|
||||
entity: number.annes_vanding_rain_delay
|
||||
name: Sæt forsinkelse (dage)
|
||||
|
||||
- type: tile
|
||||
entity: calendar.annes_vanding
|
||||
name: Vandingsplan
|
||||
|
||||
# 🌿 Zonekontrol
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Zoner – manuel styring
|
||||
icon: mdi:water-pump
|
||||
|
||||
- type: tile
|
||||
entity: switch.hojbed_1
|
||||
name: Højbed 1 – Ærter
|
||||
icon: mdi:sprinkler
|
||||
|
||||
- type: tile
|
||||
entity: switch.hojbed_2
|
||||
name: Højbed 2 – Kartofler
|
||||
icon: mdi:sprinkler
|
||||
|
||||
- type: tile
|
||||
entity: switch.hojbed_3
|
||||
name: Højbed 3 – Rabarber
|
||||
icon: mdi:sprinkler
|
||||
|
||||
- type: tile
|
||||
entity: switch.drivhus_drypvanding
|
||||
name: Drivhus
|
||||
icon: mdi:greenhouse
|
||||
|
||||
# 🔋 Sensorbatterier
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Sensor batterier
|
||||
icon: mdi:battery
|
||||
|
||||
- type: glance
|
||||
show_name: true
|
||||
show_icon: true
|
||||
show_state: true
|
||||
columns: 4
|
||||
entities:
|
||||
- entity: sensor.annes_havesensor_soil_battery_1
|
||||
name: HB1
|
||||
icon: mdi:battery
|
||||
- entity: sensor.annes_havesensor_soil_battery_2
|
||||
name: HB2
|
||||
icon: mdi:battery
|
||||
- entity: sensor.annes_havesensor_soil_battery_3
|
||||
name: HB3
|
||||
icon: mdi:battery
|
||||
- entity: sensor.annes_havesensor_soil_battery_4
|
||||
name: Drivhus
|
||||
icon: mdi:battery
|
||||
+261
-28
@@ -37,10 +37,15 @@ sections:
|
||||
name: Netatmo
|
||||
- entity: sensor.hue_motion_sensor_2_temperature_2
|
||||
name: Hue
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.andreas
|
||||
name: Andreas
|
||||
- entity: climate.andreas
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.andreas
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -72,10 +77,15 @@ sections:
|
||||
name: Netatmo
|
||||
- entity: sensor.hue_motion_sensor_2_temperature
|
||||
name: Hue
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.daniel
|
||||
name: Daniel
|
||||
- entity: climate.daniel
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.daniel
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -111,10 +121,15 @@ sections:
|
||||
name: Skab Claus
|
||||
- entity: sensor.temperature
|
||||
name: Skab Anne
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.sovev_prelse
|
||||
name: Sovevaerelse
|
||||
- entity: climate.sovev_prelse
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.sovev_prelse
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -144,10 +159,17 @@ sections:
|
||||
series:
|
||||
- entity: sensor.kontor_motion_temperatur
|
||||
name: Hue
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.kontor
|
||||
name: Kontor
|
||||
- entity: sensor.annes_havesensor_indoor_temperature
|
||||
name: Havesensor inde
|
||||
- entity: climate.kontor
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.kontor
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -177,10 +199,15 @@ sections:
|
||||
series:
|
||||
- entity: sensor.gang_sensor_temperature
|
||||
name: Hue
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.fordelingsgang
|
||||
name: Gang
|
||||
- entity: climate.fordelingsgang
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.fordelingsgang
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -188,7 +215,7 @@ sections:
|
||||
graph_span: 24h
|
||||
header:
|
||||
show: true
|
||||
title: Bad
|
||||
title: Badeværelse
|
||||
show_states: true
|
||||
colorize_states: true
|
||||
now:
|
||||
@@ -210,6 +237,15 @@ sections:
|
||||
series:
|
||||
- entity: sensor.bad_motion_sensor_temperature
|
||||
name: Hue
|
||||
- entity: climate.badevarelse
|
||||
attribute: current_temperature
|
||||
name: Ally aktuelt
|
||||
- entity: climate.badevarelse
|
||||
attribute: temperature
|
||||
name: Ally mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -239,6 +275,15 @@ sections:
|
||||
series:
|
||||
- entity: sensor.stue_motion_temperatur
|
||||
name: Hue
|
||||
- entity: climate.stue
|
||||
attribute: current_temperature
|
||||
name: Ally aktuelt
|
||||
- entity: climate.stue
|
||||
attribute: temperature
|
||||
name: Ally mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
@@ -268,13 +313,201 @@ sections:
|
||||
series:
|
||||
- entity: sensor.forgang_sensor_temperature
|
||||
name: Hue
|
||||
|
||||
- type: thermostat
|
||||
entity: climate.forgang
|
||||
name: Forgang
|
||||
- entity: climate.forgang
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.forgang
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: thermostat
|
||||
entity: climate.lille_bad
|
||||
name: Lille bad
|
||||
- type: custom:apexcharts-card
|
||||
graph_span: 24h
|
||||
header:
|
||||
show: true
|
||||
title: Lille bad
|
||||
show_states: true
|
||||
colorize_states: true
|
||||
now:
|
||||
show: true
|
||||
label: Nu
|
||||
apex_config:
|
||||
chart:
|
||||
height: 240
|
||||
grid:
|
||||
strokeDashArray: 2
|
||||
xaxis:
|
||||
type: datetime
|
||||
labels:
|
||||
datetimeFormatter:
|
||||
hour: HH:mm
|
||||
yaxis:
|
||||
decimalsInFloat: 1
|
||||
tickAmount: 6
|
||||
series:
|
||||
- entity: climate.lille_bad
|
||||
attribute: current_temperature
|
||||
name: Roth aktuelt
|
||||
- entity: climate.lille_bad
|
||||
attribute: temperature
|
||||
name: Roth mål
|
||||
stroke_width: 1
|
||||
curve: stepline
|
||||
color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: custom:apexcharts-card
|
||||
graph_span: 24h
|
||||
header:
|
||||
show: true
|
||||
title: Bryggers
|
||||
show_states: true
|
||||
colorize_states: true
|
||||
now:
|
||||
show: true
|
||||
label: Nu
|
||||
apex_config:
|
||||
chart:
|
||||
height: 240
|
||||
grid:
|
||||
strokeDashArray: 2
|
||||
xaxis:
|
||||
type: datetime
|
||||
labels:
|
||||
datetimeFormatter:
|
||||
hour: HH:mm
|
||||
yaxis:
|
||||
decimalsInFloat: 1
|
||||
tickAmount: 6
|
||||
series:
|
||||
- entity: sensor.temp_bryggers_temperatur
|
||||
name: Temperatur
|
||||
# TODO: tilføj climate-entity når tænd/sluk er monteret
|
||||
# - entity: climate.bryggers
|
||||
# attribute: current_temperature
|
||||
# name: Roth aktuelt
|
||||
# - entity: climate.bryggers
|
||||
# attribute: temperature
|
||||
# name: Roth mål
|
||||
# stroke_width: 1
|
||||
# curve: stepline
|
||||
# color: "#ff8800"
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: custom:apexcharts-card
|
||||
graph_span: 24h
|
||||
header:
|
||||
show: true
|
||||
title: Køkken
|
||||
show_states: true
|
||||
colorize_states: true
|
||||
now:
|
||||
show: true
|
||||
label: Nu
|
||||
apex_config:
|
||||
chart:
|
||||
height: 240
|
||||
grid:
|
||||
strokeDashArray: 2
|
||||
xaxis:
|
||||
type: datetime
|
||||
labels:
|
||||
datetimeFormatter:
|
||||
hour: HH:mm
|
||||
yaxis:
|
||||
decimalsInFloat: 1
|
||||
tickAmount: 6
|
||||
series:
|
||||
- entity: sensor.temp_kokken_temperatur
|
||||
name: Temperatur
|
||||
# TODO: tilføj climate-entity når tænd/sluk er monteret
|
||||
# - entity: climate.kokken
|
||||
# attribute: current_temperature
|
||||
# name: Roth aktuelt
|
||||
# - entity: climate.kokken
|
||||
# attribute: temperature
|
||||
# name: Roth mål
|
||||
# stroke_width: 1
|
||||
# curve: stepline
|
||||
# color: "#ff8800"
|
||||
|
||||
# Indstillinger: Komforttemperaturer og sænkninger
|
||||
- type: grid
|
||||
cards:
|
||||
- type: entities
|
||||
title: Komforttemperaturer
|
||||
entities:
|
||||
- entity: input_number.varme_komfort_andreas
|
||||
- entity: input_number.varme_komfort_daniel
|
||||
- entity: input_number.varme_komfort_sovevaerelse
|
||||
- entity: input_number.varme_komfort_kontor
|
||||
- entity: input_number.varme_komfort_gang
|
||||
- entity: input_number.varme_komfort_forgang
|
||||
- entity: input_number.varme_komfort_lille_bad
|
||||
- entity: input_number.varme_komfort_badevarelse
|
||||
- entity: input_number.varme_komfort_stue
|
||||
# TODO: aktiver når climate-entiteter er oprettet
|
||||
# - entity: input_number.varme_komfort_bryggers
|
||||
# - entity: input_number.varme_komfort_kokken
|
||||
|
||||
- type: entities
|
||||
title: Sænkninger og ferie
|
||||
entities:
|
||||
- entity: input_datetime.varme_morgen_tid
|
||||
- entity: input_datetime.varme_aften_tid
|
||||
- entity: input_number.varme_nat_saenkning
|
||||
- entity: input_number.varme_vaek_saenkning
|
||||
- entity: input_number.varme_ferie_temp
|
||||
|
||||
- type: button
|
||||
name: Genberegn varme nu
|
||||
icon: mdi:refresh
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: script.varme_recalculate
|
||||
|
||||
- type: button
|
||||
name: Gem temperaturer som standard
|
||||
icon: mdi:content-save
|
||||
tap_action:
|
||||
action: perform-action
|
||||
perform_action: script.varme_save_defaults
|
||||
|
||||
# Ventilposition
|
||||
- type: grid
|
||||
cards:
|
||||
- type: gauge
|
||||
entity: sensor.fjernvarme_ventil_3_ugers_gennemsnit
|
||||
name: Anbefalet ventilposition – 3 ugers snit (1–5)
|
||||
min: 1
|
||||
max: 5
|
||||
needle: true
|
||||
segments:
|
||||
- from: 1
|
||||
color: "#44aa44" # grøn: lukket/sommer
|
||||
- from: 2
|
||||
color: "#aaaa00" # gul: mildt
|
||||
- from: 3
|
||||
color: "#dd8800" # orange: køligt
|
||||
- from: 4
|
||||
color: "#cc4400" # rød-orange: koldt
|
||||
- from: 4.5
|
||||
color: "#aa0000" # rød: frost
|
||||
|
||||
- type: markdown
|
||||
content: |-
|
||||
**Anbefalet stilling (3 ugers snit): {{ states('sensor.fjernvarme_ventil_3_ugers_gennemsnit') | float(0) | round(1) }}**
|
||||
|
||||
Øjeblikkelig (vejrbaseret): {{ states('sensor.fjernvarme_ventil_anbefalet') }} – {{ state_attr('sensor.fjernvarme_ventil_anbefalet', 'anbefaling') }}
|
||||
|
||||
Udetemperatur nu: {{ state_attr('sensor.fjernvarme_ventil_anbefalet', 'udetemperatur') }}°C
|
||||
|
||||
Gælder for begge manuelle hoveddrejehaner:
|
||||
- Roth-fordeler (sauna)
|
||||
- Fjernvarme indstikning (bryggers)
|
||||
@@ -0,0 +1,352 @@
|
||||
title: Sikkerhed
|
||||
path: sikkerhed
|
||||
icon: mdi:shield-home
|
||||
|
||||
cards:
|
||||
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# 📷 KAMERAER
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
|
||||
- type: picture-entity
|
||||
entity: camera.terrasse_sub
|
||||
name: Terasse
|
||||
camera_view: live
|
||||
show_state: false
|
||||
show_name: true
|
||||
tap_action:
|
||||
action: fire-dom-event
|
||||
browser_mod:
|
||||
service: browser_mod.popup
|
||||
data:
|
||||
title: Terasse – Live
|
||||
content:
|
||||
type: vertical-stack
|
||||
cards:
|
||||
- type: picture-entity
|
||||
entity: camera.terrasse_sub
|
||||
camera_view: live
|
||||
show_name: false
|
||||
show_state: false
|
||||
tap_action:
|
||||
action: none
|
||||
- type: tile
|
||||
entity: number.terrasse_focus
|
||||
name: Fokus
|
||||
icon: mdi:focus-field
|
||||
features:
|
||||
- type: numeric-input
|
||||
style: slider
|
||||
- type: tile
|
||||
entity: number.terrasse_zoom
|
||||
name: Zoom
|
||||
icon: mdi:magnify
|
||||
features:
|
||||
- type: numeric-input
|
||||
style: slider
|
||||
|
||||
- type: picture-entity
|
||||
entity: camera.indkoersel_sub
|
||||
name: Indkørsel
|
||||
camera_view: live
|
||||
show_state: false
|
||||
show_name: true
|
||||
tap_action:
|
||||
action: fire-dom-event
|
||||
browser_mod:
|
||||
service: browser_mod.popup
|
||||
data:
|
||||
title: Indkørsel – Live
|
||||
content:
|
||||
type: vertical-stack
|
||||
cards:
|
||||
- type: picture-entity
|
||||
entity: camera.indkoersel_sub
|
||||
camera_view: live
|
||||
show_name: false
|
||||
show_state: false
|
||||
tap_action:
|
||||
action: none
|
||||
- type: tile
|
||||
entity: number.indkoersel_focus
|
||||
name: Fokus
|
||||
icon: mdi:focus-field
|
||||
features:
|
||||
- type: numeric-input
|
||||
style: slider
|
||||
- type: tile
|
||||
entity: number.indkoersel_zoom
|
||||
name: Zoom
|
||||
icon: mdi:magnify
|
||||
features:
|
||||
- type: numeric-input
|
||||
style: slider
|
||||
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# 🛡️ SIKKERHEDSSTATUS
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
- type: heading
|
||||
heading: Sikkerhedsstatus
|
||||
heading_style: title
|
||||
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
|
||||
# 👥 Tilstedeværelse
|
||||
- type: custom:mushroom-template-card
|
||||
entity: binary_sensor.family_presence
|
||||
primary: >
|
||||
{{ 'Nogen hjemme' if is_state('binary_sensor.family_presence', 'on') else 'Ingen hjemme' }}
|
||||
secondary: >
|
||||
{% set persons = [
|
||||
('Claus', 'person.claus_dethlefsen'),
|
||||
('Anne', 'person.anne_schusler_dethlefsen'),
|
||||
('Andreas', 'person.andreas_schusler_dethlefsen'),
|
||||
('Daniel', 'person.daniel_schusler_dethlefsen')
|
||||
] %}
|
||||
{% set ns = namespace(home=[]) %}
|
||||
{% for name, eid in persons %}
|
||||
{% if is_state(eid, 'home') %}{% set ns.home = ns.home + [name] %}{% endif %}
|
||||
{% endfor %}
|
||||
{{ ns.home | join(', ') if ns.home else 'Alle ude' }}
|
||||
icon: >
|
||||
{{ 'mdi:home-account' if is_state('binary_sensor.family_presence', 'on') else 'mdi:home-outline' }}
|
||||
icon_color: >
|
||||
{{ 'green' if is_state('binary_sensor.family_presence', 'on') else 'blue' }}
|
||||
tap_action:
|
||||
action: none
|
||||
|
||||
# 💡 Lys
|
||||
- type: custom:mushroom-template-card
|
||||
entity: light.alle_lys
|
||||
primary: >
|
||||
{{ 'Lys er tændt' if is_state('light.alle_lys', 'on') else 'Alt lys slukket' }}
|
||||
secondary: ""
|
||||
icon: >
|
||||
{{ 'mdi:lightbulb-on' if is_state('light.alle_lys', 'on') else 'mdi:lightbulb-off' }}
|
||||
icon_color: >
|
||||
{{ 'yellow' if is_state('light.alle_lys', 'on') else 'grey' }}
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/lys
|
||||
|
||||
# 🪟 Vinduer og terrassedør
|
||||
- type: custom:mushroom-template-card
|
||||
multiline_secondary: true
|
||||
primary: >
|
||||
{% set sensors = [
|
||||
'binary_sensor.andreas_vindue',
|
||||
'binary_sensor.daniel_vindue',
|
||||
'binary_sensor.sovevaerelse_vindue',
|
||||
'binary_sensor.badevaerelse_vindue',
|
||||
'binary_sensor.lille_bad_vindue',
|
||||
'binary_sensor.terrassedor'
|
||||
] %}
|
||||
{% set ns = namespace(open=0) %}
|
||||
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
|
||||
{{ 'Alle vinduer lukket' if ns.open == 0 else ns.open | string + ' vindue(r) åben' }}
|
||||
secondary: >
|
||||
{% set sensor_map = {
|
||||
'binary_sensor.andreas_vindue': 'Andreas',
|
||||
'binary_sensor.daniel_vindue': 'Daniel',
|
||||
'binary_sensor.sovevaerelse_vindue': 'Soveværelse',
|
||||
'binary_sensor.badevaerelse_vindue': 'Badeværelse',
|
||||
'binary_sensor.lille_bad_vindue': 'Lille bad',
|
||||
'binary_sensor.terrassedor': 'Terrassedør'
|
||||
} %}
|
||||
{% set ns = namespace(aabne=[]) %}
|
||||
{% for s, n in sensor_map.items() %}{% if is_state(s, 'on') %}{% set ns.aabne = ns.aabne + [n] %}{% endif %}{% endfor %}
|
||||
{{ ns.aabne | join(', ') if ns.aabne else '' }}
|
||||
icon: >
|
||||
{% set sensors = [
|
||||
'binary_sensor.andreas_vindue',
|
||||
'binary_sensor.daniel_vindue',
|
||||
'binary_sensor.sovevaerelse_vindue',
|
||||
'binary_sensor.badevaerelse_vindue',
|
||||
'binary_sensor.lille_bad_vindue',
|
||||
'binary_sensor.terrassedor'
|
||||
] %}
|
||||
{% set ns = namespace(open=0) %}
|
||||
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
|
||||
{{ 'mdi:window-open-variant' if ns.open > 0 else 'mdi:window-closed-variant' }}
|
||||
icon_color: >
|
||||
{% set sensors = [
|
||||
'binary_sensor.andreas_vindue',
|
||||
'binary_sensor.daniel_vindue',
|
||||
'binary_sensor.sovevaerelse_vindue',
|
||||
'binary_sensor.badevaerelse_vindue',
|
||||
'binary_sensor.lille_bad_vindue',
|
||||
'binary_sensor.terrassedor'
|
||||
] %}
|
||||
{% set ns = namespace(open=0) %}
|
||||
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
|
||||
{{ 'red' if ns.open > 0 else 'green' }}
|
||||
tap_action:
|
||||
action: none
|
||||
|
||||
# 🚗 Garage
|
||||
- type: custom:mushroom-template-card
|
||||
entity: binary_sensor.garageport
|
||||
primary: >
|
||||
{{ 'Garage åben' if is_state('binary_sensor.garageport', 'on') else 'Garage lukket' }}
|
||||
secondary: >
|
||||
Sidst ændret: {{ relative_time(states.binary_sensor.garageport.last_changed) }} siden
|
||||
icon: >
|
||||
{{ 'mdi:garage-open-variant' if is_state('binary_sensor.garageport', 'on') else 'mdi:garage-variant' }}
|
||||
icon_color: >
|
||||
{{ 'orange' if is_state('binary_sensor.garageport', 'on') else 'green' }}
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
|
||||
# 🏖️ Ferietilstand
|
||||
- type: custom:mushroom-template-card
|
||||
entity: input_boolean.vacation_mode
|
||||
primary: >
|
||||
{{ 'Ferie aktiv' if is_state('input_boolean.vacation_mode', 'on') else 'Normal tilstand' }}
|
||||
secondary: >
|
||||
{% if is_state('input_boolean.vacation_mode', 'on') %}
|
||||
{% set end = states('input_datetime.vacation_end') %}
|
||||
{% if end not in ['unknown', 'unavailable', ''] %}Slutter {{ as_datetime(end).strftime('%-d. %b') }}{% endif %}
|
||||
{% endif %}
|
||||
icon: >
|
||||
{{ 'mdi:beach' if is_state('input_boolean.vacation_mode', 'on') else 'mdi:home' }}
|
||||
icon_color: >
|
||||
{{ 'cyan' if is_state('input_boolean.vacation_mode', 'on') else 'grey' }}
|
||||
tap_action:
|
||||
action: more-info
|
||||
|
||||
# 🤖 AI-overvågning (indkørsel)
|
||||
- type: custom:mushroom-template-card
|
||||
primary: >
|
||||
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
|
||||
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
|
||||
{{ 'AI-overvågning pauset' if paused else 'AI-overvågning aktiv' }}
|
||||
secondary: >
|
||||
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
|
||||
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
|
||||
{% if paused %}Genoptages kl. {{ as_datetime(pause).strftime('%H:%M') }}{% else %}Indkørsel overvåges{% endif %}
|
||||
icon: >
|
||||
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
|
||||
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
|
||||
{{ 'mdi:robot-off' if paused else 'mdi:robot' }}
|
||||
icon_color: >
|
||||
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
|
||||
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
|
||||
{{ 'orange' if paused else 'green' }}
|
||||
tap_action:
|
||||
action: more-info
|
||||
entity: input_datetime.ai_indkorsel_ai_pause_until
|
||||
|
||||
# 🔒 Terrassedør (separat overblik)
|
||||
- type: custom:mushroom-template-card
|
||||
entity: binary_sensor.terrassedor
|
||||
primary: >
|
||||
{{ 'Terrassedør åben' if is_state('binary_sensor.terrassedor', 'on') else 'Terrassedør lukket' }}
|
||||
secondary: >
|
||||
Sidst ændret: {{ relative_time(states.binary_sensor.terrassedor.last_changed) }} siden
|
||||
icon: >
|
||||
{{ 'mdi:door-open' if is_state('binary_sensor.terrassedor', 'on') else 'mdi:door-closed' }}
|
||||
icon_color: >
|
||||
{{ 'red' if is_state('binary_sensor.terrassedor', 'on') else 'green' }}
|
||||
tap_action:
|
||||
action: more-info
|
||||
|
||||
# 📡 Bevægelse i indkørslen lige nu
|
||||
- type: custom:mushroom-template-card
|
||||
entity: binary_sensor.indkorsel_sensor_motion
|
||||
primary: >
|
||||
{{ 'Bevægelse registreret!' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'Ingen bevægelse' }}
|
||||
secondary: >
|
||||
Sidst: {{ relative_time(states.binary_sensor.indkorsel_sensor_motion.last_changed) }} siden
|
||||
icon: >
|
||||
{{ 'mdi:motion-sensor' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'mdi:motion-sensor-off' }}
|
||||
icon_color: >
|
||||
{{ 'red' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'grey' }}
|
||||
tap_action:
|
||||
action: none
|
||||
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# 📋 SENESTE BEVÆGELSE – INDKØRSEL (AI-log)
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
- type: heading
|
||||
heading: Seneste bevægelse – Indkørsel
|
||||
heading_style: title
|
||||
|
||||
# Seneste snapshot gemt af AI-overvågningsscriptet
|
||||
- type: picture-entity
|
||||
entity: camera.indkorsel_snapshot
|
||||
show_name: false
|
||||
show_state: false
|
||||
tap_action:
|
||||
action: fire-dom-event
|
||||
browser_mod:
|
||||
service: browser_mod.popup
|
||||
data:
|
||||
title: Seneste bevægelse – Indkørsel
|
||||
content:
|
||||
type: picture-entity
|
||||
entity: camera.indkorsel_snapshot
|
||||
show_name: false
|
||||
show_state: false
|
||||
tap_action:
|
||||
action: none
|
||||
|
||||
# Seneste AI-beskrivelse
|
||||
- type: custom:button-card
|
||||
entity: input_text.last_notification_message
|
||||
show_name: false
|
||||
show_icon: true
|
||||
show_state: true
|
||||
icon: mdi:robot
|
||||
styles:
|
||||
card:
|
||||
- padding: 14px 16px
|
||||
- text-align: left
|
||||
grid:
|
||||
- grid-template-areas: '"i s"'
|
||||
- grid-template-columns: 44px 1fr
|
||||
- grid-template-rows: auto
|
||||
icon:
|
||||
- width: 32px
|
||||
- height: 32px
|
||||
- color: var(--primary-color)
|
||||
- align-self: flex-start
|
||||
- margin-top: 2px
|
||||
state:
|
||||
- white-space: normal
|
||||
- word-break: break-word
|
||||
- font-size: 13px
|
||||
- text-align: left
|
||||
- line-height: "1.5"
|
||||
tap_action:
|
||||
action: none
|
||||
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# 📸 SENESTE PERSON-SNAPSHOT – INDKØRSEL
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
- type: heading
|
||||
heading: Seneste person i indkørsel
|
||||
heading_style: subtitle
|
||||
|
||||
# Klik åbner galleri med alle tidligere snapshots
|
||||
- type: picture
|
||||
image: /local/snapshots/indkorsel/latest.jpg
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/indkorsel-snapshots
|
||||
|
||||
# Logbog over bevægelseshændelser (48 timer)
|
||||
- type: logbook
|
||||
entities:
|
||||
- binary_sensor.indkorsel_sensor_motion
|
||||
hours_to_show: 48
|
||||
title: Bevægelseslog (48 timer)
|
||||
@@ -0,0 +1,9 @@
|
||||
title: Snapshots Indkørsel
|
||||
path: indkorsel-snapshots
|
||||
icon: mdi:camera-burst
|
||||
panel: true
|
||||
|
||||
cards:
|
||||
- type: iframe
|
||||
url: /local/snapshots/indkorsel_loader.html?v=20260516103651
|
||||
aspect_ratio: 100%
|
||||
@@ -63,7 +63,128 @@ sections:
|
||||
name: Ladehastighed
|
||||
|
||||
|
||||
# 💡 Automations / kontrol
|
||||
# � Zigbee stik med strømmåling
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Zigbee stik
|
||||
|
||||
# Aktuel effekt – alle stik samlet
|
||||
- type: history-graph
|
||||
title: Effekt lige nu (W)
|
||||
entities:
|
||||
- entity: sensor.stik_alrum_effekt
|
||||
name: Alrum
|
||||
- entity: sensor.stik_kontor_effekt
|
||||
name: Kontor
|
||||
- entity: sensor.stik_bad_effekt
|
||||
name: Badeværelse
|
||||
- entity: sensor.stik_lillebad_effekt
|
||||
name: Lille bad
|
||||
- entity: sensor.stik_sonos_stue_effekt
|
||||
name: Sonos stue
|
||||
- entity: sensor.stik_quooker_effekt
|
||||
name: Quooker
|
||||
- entity: sensor.stik_fryser_effekt
|
||||
name: Fryser
|
||||
- entity: sensor.stik_bryggers_effekt
|
||||
name: Bryggers
|
||||
hours_to_show: 6
|
||||
refresh_interval: 30
|
||||
|
||||
# Individuelle stik med tænd/sluk + effekt
|
||||
- type: tile
|
||||
entity: switch.stik_alrum
|
||||
name: Alrum
|
||||
secondary_info: sensor.stik_alrum_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_kontor
|
||||
name: Kontor
|
||||
secondary_info: sensor.stik_kontor_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_bad
|
||||
name: Badeværelse
|
||||
secondary_info: sensor.stik_bad_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_lillebad
|
||||
name: Lille bad
|
||||
secondary_info: sensor.stik_lillebad_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_sonos_stue
|
||||
name: Sonos stue
|
||||
secondary_info: sensor.stik_sonos_stue_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_quooker
|
||||
name: Quooker
|
||||
secondary_info: sensor.stik_quooker_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_fryser
|
||||
name: Fryser
|
||||
secondary_info: sensor.stik_fryser_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
- type: tile
|
||||
entity: switch.stik_bryggers
|
||||
name: Bryggers
|
||||
secondary_info: sensor.stik_bryggers_effekt
|
||||
icon: mdi:power-plug
|
||||
features:
|
||||
- type: toggle
|
||||
|
||||
# Akkumuleret energiforbrug (kWh) pr. stik
|
||||
- type: statistics-graph
|
||||
title: Energiforbrug (kWh)
|
||||
entities:
|
||||
- entity: sensor.stik_alrum_summation_delivered
|
||||
name: Alrum
|
||||
- entity: sensor.stik_kontor_summation_delivered
|
||||
name: Kontor
|
||||
- entity: sensor.stik_bad_summation_delivered
|
||||
name: Badeværelse
|
||||
- entity: sensor.stik_lillebad_summation_delivered
|
||||
name: Lille bad
|
||||
- entity: sensor.stik_sonos_stue_summation_delivered
|
||||
name: Sonos stue
|
||||
- entity: sensor.stik_quooker_summation_delivered
|
||||
name: Quooker
|
||||
- entity: sensor.stik_fryser_summation_delivered
|
||||
name: Fryser
|
||||
- entity: sensor.stik_bryggers_summation_delivered
|
||||
name: Bryggers
|
||||
period: day
|
||||
days_to_show: 7
|
||||
chart_type: bar
|
||||
stat_types:
|
||||
- change
|
||||
|
||||
|
||||
# �💡 Automations / kontrol
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
|
||||
@@ -45,26 +45,24 @@ cards:
|
||||
cards:
|
||||
- type: button
|
||||
name: Start opladning
|
||||
icon: mdi:flash-circle
|
||||
icon: mdi:flash
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: switch.turn_on
|
||||
service_data:
|
||||
entity_id: switch.home_charging
|
||||
service: script.tesla_force_start_charging
|
||||
|
||||
- type: button
|
||||
name: Stop opladning
|
||||
icon: mdi:flash-off
|
||||
tap_action:
|
||||
action: call-service
|
||||
service: switch.turn_off
|
||||
service_data:
|
||||
entity_id: switch.home_charging
|
||||
service: script.tesla_force_stop_charging
|
||||
|
||||
# 🕒 Opladningsplan
|
||||
- type: entities
|
||||
title: Opladningsplan
|
||||
entities:
|
||||
- entity: input_boolean.tesla_manual_override
|
||||
name: Manuel override
|
||||
- entity: binary_sensor.tesla_charge_now
|
||||
name: Skal lade nu
|
||||
- entity: sensor.tesla_charge_plan
|
||||
|
||||
@@ -1048,6 +1048,54 @@ sections:
|
||||
entity: sensor.dishwasher_rinse_aid_level
|
||||
name: Afspaending
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "on"
|
||||
card:
|
||||
type: heading
|
||||
heading: Plæneklipper
|
||||
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "off"
|
||||
- condition: state
|
||||
entity: lawn_mower.husqvarna_automower
|
||||
state: error
|
||||
card:
|
||||
type: heading
|
||||
heading: Plæneklipper
|
||||
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "on"
|
||||
card:
|
||||
type: tile
|
||||
entity: lawn_mower.husqvarna_automower
|
||||
name: Automower
|
||||
show_state: true
|
||||
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "off"
|
||||
- condition: state
|
||||
entity: lawn_mower.husqvarna_automower
|
||||
state: error
|
||||
card:
|
||||
type: tile
|
||||
entity: lawn_mower.husqvarna_automower
|
||||
name: Automower
|
||||
show_state: true
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: conditional
|
||||
@@ -1530,3 +1578,163 @@ sections:
|
||||
type: tile
|
||||
entity: sensor.hojre_battery
|
||||
name: Gardin hojre
|
||||
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "on"
|
||||
card:
|
||||
type: tile
|
||||
entity: sensor.garageport_batteri
|
||||
name: Garageport sensor
|
||||
|
||||
- type: conditional
|
||||
conditions:
|
||||
- condition: state
|
||||
entity: input_boolean.vis_alle_vedligehold
|
||||
state: "off"
|
||||
- condition: numeric_state
|
||||
entity: sensor.garageport_batteri
|
||||
below: 20
|
||||
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
|
||||
@@ -3,7 +3,7 @@ path: lys
|
||||
icon: mdi:lightbulb-multiple
|
||||
type: sections
|
||||
|
||||
max_columns: 2
|
||||
max_columns: 3
|
||||
|
||||
sections:
|
||||
- type: grid
|
||||
@@ -150,7 +150,7 @@ sections:
|
||||
data:
|
||||
entity_id: script.raketloop
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -464,7 +464,7 @@ sections:
|
||||
- light.spejl2
|
||||
- light.badevaerelse_2
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -569,7 +569,7 @@ sections:
|
||||
show_color_temp_control: true
|
||||
collapsible_controls: true
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -647,7 +647,7 @@ sections:
|
||||
data:
|
||||
entity_id: script.have_color_scene
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -711,7 +711,7 @@ sections:
|
||||
show_brightness_control: true
|
||||
collapsible_controls: true
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -756,7 +756,7 @@ sections:
|
||||
- type: heading
|
||||
heading: Ovrige
|
||||
- type: grid
|
||||
columns: 2
|
||||
columns: 3
|
||||
square: false
|
||||
cards:
|
||||
- type: custom:mushroom-light-card
|
||||
@@ -779,3 +779,64 @@ sections:
|
||||
use_light_color: true
|
||||
show_brightness_control: true
|
||||
collapsible_controls: true
|
||||
|
||||
- type: grid
|
||||
cards:
|
||||
- type: heading
|
||||
heading: Motion-indstillinger
|
||||
- type: entities
|
||||
title: Gang
|
||||
entities:
|
||||
- entity: input_number.gang_lux_threshold
|
||||
name: Lux grænse
|
||||
- entity: input_number.gang_timeout_day
|
||||
name: Timeout dag
|
||||
- entity: input_number.gang_timeout_night
|
||||
name: Timeout nat
|
||||
- type: entities
|
||||
title: Badeværelse
|
||||
entities:
|
||||
- entity: input_number.badevaerelse_timeout_day
|
||||
name: Timeout dag
|
||||
- entity: input_number.badevaerelse_timeout_night
|
||||
name: Timeout nat
|
||||
- type: entities
|
||||
title: Andreas
|
||||
entities:
|
||||
- entity: input_number.andreas_lux_threshold
|
||||
name: Lux grænse
|
||||
- entity: input_number.andreas_timeout
|
||||
name: Timeout
|
||||
- entity: input_number.andreas_brightness
|
||||
name: Lysstyrke
|
||||
- type: entities
|
||||
title: Daniel
|
||||
entities:
|
||||
- entity: input_number.daniel_lux_threshold
|
||||
name: Lux grænse
|
||||
- entity: input_number.daniel_timeout
|
||||
name: Timeout
|
||||
- entity: input_number.daniel_brightness
|
||||
name: Lysstyrke
|
||||
- type: entities
|
||||
title: Kontor
|
||||
entities:
|
||||
- entity: input_number.kontor_lux_threshold
|
||||
name: Lux grænse
|
||||
- entity: input_number.kontor_timeout_day
|
||||
name: Timeout dag
|
||||
- entity: input_number.kontor_timeout_night
|
||||
name: Timeout nat
|
||||
- type: entities
|
||||
title: Stue
|
||||
entities:
|
||||
- entity: input_number.stue_lux_threshold
|
||||
name: Lux grænse
|
||||
- entity: input_number.stue_timeout_morgen
|
||||
name: Timeout morgen (06-16)
|
||||
- entity: input_number.stue_timeout_eftermiddag
|
||||
name: Timeout eftermiddag (16-19)
|
||||
- entity: input_number.stue_timeout_aften
|
||||
name: Timeout aften/TV off (19-00)
|
||||
- entity: input_number.stue_timeout_nat
|
||||
name: Timeout nat (00-06)
|
||||
@@ -4,6 +4,7 @@ services:
|
||||
image: homeassistant/home-assistant:latest
|
||||
volumes:
|
||||
- /volume1/homeassistant:/config
|
||||
- /volume1/docker/homeassistant/backups:/backups
|
||||
devices:
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
network_mode: host
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
DOCKER_ROOT=/volume1/docker
|
||||
GITEA_IMAGE_TAG=latest
|
||||
GITEA_DB_IMAGE_TAG=17
|
||||
GITEA_DB_DATA_PATH=/volume1/docker/gitea/db
|
||||
GITEA_DATA_PATH=/volume1/docker/gitea/data
|
||||
GITEA_CUSTOM_PATH=/data/gitea
|
||||
|
||||
GITEA_DB_NAME=gitea
|
||||
GITEA_DB_USER=change_me
|
||||
GITEA_DB_PASSWORD=change_me
|
||||
|
||||
PUID=1038
|
||||
PGID=100
|
||||
|
||||
GITEA_HTTP_PORT=12080
|
||||
GITEA_SSH_PORT=12022
|
||||
GITEA_DOMAIN=dethlefsen
|
||||
GITEA_ROOT_URL=http://dethlefsen:12080/
|
||||
GITEA_SSH_DOMAIN=dethlefsen
|
||||
@@ -0,0 +1,13 @@
|
||||
services:
|
||||
home-assistant:
|
||||
container_name: homeassistant
|
||||
image: homeassistant/home-assistant:latest
|
||||
volumes:
|
||||
- /volume1/homeassistant:/config
|
||||
- /volume1/docker/homeassistant/backups:/backups
|
||||
devices:
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
network_mode: host
|
||||
restart: always
|
||||
environment:
|
||||
- TZ=Europe/Copenhagen
|
||||
@@ -0,0 +1,92 @@
|
||||
## Denne stack er justeret mod den nuvaerende Synology Gitea-DB opsaetning.
|
||||
## Hvis den eksisterende Gitea-container bruger andre porte eller paths, skal de tilpasses i .env.infrastructure.
|
||||
|
||||
services:
|
||||
mosquitto:
|
||||
container_name: mosquitto
|
||||
image: eclipse-mosquitto:2
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "1883:1883"
|
||||
- "9001:9001"
|
||||
volumes:
|
||||
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/config:/mosquitto/config
|
||||
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/data:/mosquitto/data
|
||||
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/log:/mosquitto/log
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mosquitto_sub -h 127.0.0.1 -p 1883 -t '$$SYS/broker/version' -C 1 -W 3 >/dev/null 2>&1 || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 20s
|
||||
|
||||
gitea-db:
|
||||
container_name: gitea-db
|
||||
image: postgres:${GITEA_DB_IMAGE_TAG:-17}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: ${GITEA_DB_NAME:-gitea}
|
||||
POSTGRES_USER: ${GITEA_DB_USER:-giteauser}
|
||||
POSTGRES_PASSWORD: ${GITEA_DB_PASSWORD}
|
||||
volumes:
|
||||
- ${GITEA_DB_DATA_PATH:-/volume1/docker/gitea/db}:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${GITEA_DB_USER:-giteauser} -d ${GITEA_DB_NAME:-gitea}"]
|
||||
interval: 15s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 20s
|
||||
|
||||
nginx-proxy-manager:
|
||||
container_name: nginx-proxy-manager
|
||||
image: jc21/nginx-proxy-manager:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "10080:80" # HTTP (inkl. Let's Encrypt HTTP-01 challenge) – router forwarder 80→10080
|
||||
- "10443:443" # HTTPS – router forwarder 443→10443
|
||||
- "10.0.0.142:81:81" # Admin UI – kun tilgængeligt fra LAN
|
||||
volumes:
|
||||
- ${DOCKER_ROOT:-/volume1/docker}/nginx-proxy-manager/data:/data
|
||||
- ${DOCKER_ROOT:-/volume1/docker}/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway" # Gør det muligt at proxye til HA på host-netværket
|
||||
healthcheck:
|
||||
test: ["CMD", "/usr/bin/check-health"]
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 3
|
||||
start_period: 20s
|
||||
|
||||
gitea:
|
||||
container_name: gitea
|
||||
image: gitea/gitea:${GITEA_IMAGE_TAG:-latest}
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
gitea-db:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
USER: git
|
||||
GITEA_CUSTOM: ${GITEA_CUSTOM_PATH:-/data/gitea}
|
||||
USER_UID: ${PUID:-1038}
|
||||
USER_GID: ${PGID:-100}
|
||||
GITEA__database__DB_TYPE: postgres
|
||||
GITEA__database__HOST: gitea-db:5432
|
||||
GITEA__database__NAME: ${GITEA_DB_NAME:-gitea}
|
||||
GITEA__database__USER: ${GITEA_DB_USER:-giteauser}
|
||||
GITEA__database__PASSWD: ${GITEA_DB_PASSWORD}
|
||||
GITEA__server__DOMAIN: ${GITEA_DOMAIN:-dethlefsen}
|
||||
GITEA__server__ROOT_URL: ${GITEA_ROOT_URL:-http://dethlefsen:12080/}
|
||||
GITEA__server__SSH_DOMAIN: ${GITEA_SSH_DOMAIN:-dethlefsen}
|
||||
GITEA__server__SSH_PORT: ${GITEA_SSH_PORT:-12022}
|
||||
ports:
|
||||
- "${GITEA_HTTP_PORT:-12080}:3000"
|
||||
- "${GITEA_SSH_PORT:-12022}:22"
|
||||
volumes:
|
||||
- ${GITEA_DATA_PATH:-/volume1/docker/gitea/data}:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:3000/ || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
start_period: 40s
|
||||
@@ -0,0 +1,8 @@
|
||||
services:
|
||||
unifi:
|
||||
container_name: jacobalberty-unifi-1
|
||||
image: jacobalberty/unifi:latest
|
||||
restart: always
|
||||
network_mode: host
|
||||
volumes:
|
||||
- /volume1/docker/unifi:/var/lib/unifi
|
||||
@@ -0,0 +1,48 @@
|
||||
# TODO - Pending Tasks
|
||||
|
||||
## Home Assistant - Åbne opgaver
|
||||
|
||||
### HA-fejl der skal fikses
|
||||
- [x] **Mealie shopping merge timeout** — udgået, merge med Google Keep droppes. Shopping-liste køres direkte i Mealie hver onsdag morgen.
|
||||
- [x] **aiohttp 400 Bad Request fra ekstern IP** — Løst: Nginx Proxy Manager sat op som HTTPS reverse proxy (`anneclaus.duckdns.org`). Let's Encrypt cert udstedt, Force HTTPS aktiveret. Port 8123 lukket på routeren. HA tilgås nu udelukkende via HTTPS på port 443.
|
||||
- [x] **switch.home_charging mangler** — Bilen oplades fint (16. maj 2026). Ikke et reelt problem.
|
||||
- [x] **climate.badevarelse** — Danfoss Ally TRV monteret og online (7. maj 2026).
|
||||
- [x] **Husqvarna Automower BLE — genopsæt parring** — Kørte fint. Problemet var at telefon-app'en kørte i baggrunden og holdt BLE-forbindelsen, selvom klipperen var slettet fra appen.
|
||||
- [x] **Google AI MAX_TOKENS i AI-indkørsel automation** — Ingen fejl observeret i loggen. Fjernet fra aktiv liste.
|
||||
|
||||
### HA - Kendte ikke-fejl (ingen handling nødvendig)
|
||||
- `husqvarna_automower_ble` BLE fejl — normalt når plæneklipperen klipper (men se auth fail-fejl ovenfor)
|
||||
- `light.spejl1/spejl2` mangler — strøm slukket på kontakt, OK
|
||||
|
||||
|
||||
## Sikring af port forwards via NPM + subdomæner
|
||||
**Baggrund:** Diverse tjenester er direkte eksponeret via port-forwards på routeren uden kryptering. Disse bør flyttes bag NPM med HTTPS og subdomæner under `anneclaus.dk`.
|
||||
|
||||
**Tjenester fra routeren (per 17. maj 2026):**
|
||||
| Tjeneste | WAN-port | Intern port | Forslag til subdomain |
|
||||
|---|---|---|---|
|
||||
| Mealie | 9925 | 9925 | `mealie.anneclaus.dk` |
|
||||
| Plex | 32400 | 32400 | `plex.anneclaus.dk` (Plex har egen HTTPS — lavere prioritet) |
|
||||
| Synology DSM | 5000/5001 | 5000/5001 | `nas.anneclaus.dk` |
|
||||
| Unifi | 8443 | 8443 | (Unifi har egen HTTPS — lavere prioritet) |
|
||||
| FTP | 21 | 21 | FTP er usikkert — overvej om den skal lukkes |
|
||||
| MQTT | 1883 | 1883 | MQTT i klartekst — høj risiko |
|
||||
| SSH | 2222 | 2222 | SSH er krypteret, men tiltrækker brute-force |
|
||||
|
||||
**For hver tjeneste der flyttes:**
|
||||
1. Tilføj CNAME-record hos One.com: `<subdomain>` → `anneclaus.duckdns.org`
|
||||
2. Opret proxy host i NPM med SSL-cert og Force HTTPS
|
||||
3. Luk den direkte port-forward på routeren
|
||||
|
||||
- [x] **MQTT port 1883** — lukket på routeren (17. maj 2026). MQTT bruges kun internt af Aqara-knapper til ringklokke — ingen ekstern adgang nødvendig.
|
||||
- [x] **FTP port 21** — lukket på routeren (17. maj 2026).
|
||||
- [x] **Mealie** — `mealie.anneclaus.dk` via NPM med HTTPS (18. maj 2026). Port 9925 lukket på routeren.
|
||||
- [x] **Synology DSM** — `nas.anneclaus.dk` via NPM med HTTPS (19. maj 2026). Port 5000/5001 lukket på routeren.
|
||||
- [ ] **SSH port 2222** — overvej at begrænse til nøgle-login og deaktivere password-login
|
||||
- [~] **Plex** — springer over. Plex krypterer selv sin trafik, og alle klientenheder (telefoner, iPad, Apple TV) skulle opdateres manuelt. Ikke umagen værd.
|
||||
- [ ] **Unifi** — lavere prioritet, Unifi har allerede HTTPS
|
||||
|
||||
---
|
||||
|
||||
## Gitea External HTTPS Access
|
||||
- [x] **gitea.anneclaus.dk via NPM** — CNAME oprettet hos One.com, NPM proxy host med Let's Encrypt + Force SSL, `.env.infrastructure` opdateret, container genstartet. HTTPS 200 OK (20. maj 2026).
|
||||
Binary file not shown.
@@ -0,0 +1,111 @@
|
||||
# DALL-E / AI billedgenerator prompts – Vandingssystem
|
||||
|
||||
Brug disse prompts sammen med dine fotos i ChatGPT (GPT-4o), DALL-E 3,
|
||||
Midjourney, Gemini eller anden AI-billedgenerator.
|
||||
|
||||
**Tip:** ChatGPT med GPT-4o er pt. bedst til at bevare det originale foto
|
||||
og kun tilføje elementer. Sig: *"Use this photo as a base and add the
|
||||
following..."*
|
||||
|
||||
---
|
||||
|
||||
## Prompt 1 – Vandhane-station
|
||||
|
||||
*Brug med foto af nordmur med vandhane, slangerulle og stikkontakt.*
|
||||
|
||||
```
|
||||
Using this photo of the north wall of a Danish house as reference,
|
||||
add the following installation while keeping the existing wall,
|
||||
window, hose reel, water tap and electrical outlet exactly as they are:
|
||||
|
||||
- A weatherproof grey IP65 enclosure (approx 30x20x15 cm) mounted on
|
||||
the wall next to the existing electrical outlet, with a small
|
||||
OpenSprinkler controller visible through a transparent lid
|
||||
- A Y-splitter on the existing water tap, with one branch going to
|
||||
the existing garden hose and the other branch going down to a
|
||||
small manifold containing: a brass 24V solenoid valve, a blue
|
||||
Dosatron fertilizer injector, a water filter and a pressure regulator
|
||||
- A 20-liter white plastic jerrycan on the ground next to the
|
||||
manifold, connected to the Dosatron with a thin suction tube
|
||||
- A 25mm black PE irrigation pipe leaving the manifold and
|
||||
disappearing into the ground, heading across the lawn
|
||||
- A thin low-voltage cable running parallel to the PE pipe
|
||||
|
||||
Photorealistic, same lighting and perspective as the original photo,
|
||||
Scandinavian garden style, daytime.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prompt 2 – Højbede med ventilbox
|
||||
|
||||
*Brug med foto af de tre højbede med drivhus i baggrunden.*
|
||||
|
||||
```
|
||||
Using this photo of three Danish raised garden beds (højbede) with
|
||||
asparagus and rhubarb, add the following irrigation installation
|
||||
while keeping the beds, plants and greenhouse in the background
|
||||
exactly as they are:
|
||||
|
||||
- A black 25mm PE irrigation pipe coming up from the lawn between
|
||||
the first raised bed and the second/third raised beds
|
||||
- A green plastic valve box (approx 40x30 cm, IP65) buried flush
|
||||
with the gravel path between the beds, with the lid visible at
|
||||
ground level showing "Irrigation" text
|
||||
- Black drip irrigation soaker hoses (siveslange) laid on the
|
||||
soil surface in each of the three raised beds, in a snake pattern
|
||||
- The PE pipe continuing from the valve box towards the greenhouse
|
||||
in the background, disappearing under the greenhouse foundation
|
||||
|
||||
Photorealistic, same lighting and perspective as the original photo,
|
||||
Scandinavian garden, summer daytime.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prompt 3 – Drivhus indvendigt
|
||||
|
||||
*Brug med foto af drivhus indefra med de tre sorte kapillærkasser.*
|
||||
|
||||
```
|
||||
Using this photo of the inside of a Danish hobby greenhouse with
|
||||
three black self-watering capillary boxes on a shelf, add the
|
||||
following irrigation installation while keeping the greenhouse
|
||||
structure, plants, shelving and capillary boxes exactly as they are:
|
||||
|
||||
- A black 25mm PE irrigation pipe coming up vertically through one
|
||||
of the floor tiles near the entrance
|
||||
- The pipe splitting via a T-fitting into two branches:
|
||||
1. A black drip irrigation soaker hose laid along the soil bed
|
||||
2. A thin 16mm tube going up to the shelf with the capillary boxes
|
||||
- Three small white plastic float valves (mini-flydventil), one
|
||||
mounted on each of the three capillary boxes, each connected to
|
||||
the 16mm tube via small black drip fittings
|
||||
|
||||
Photorealistic, same lighting and perspective as the original photo,
|
||||
greenhouse interior, daytime, lush plants.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tips til de forskellige AI-værktøjer
|
||||
|
||||
- **ChatGPT (GPT-4o):** Bedst til at bevare originalbillede. Upload foto
|
||||
+ indsæt prompt. Sig evt. *"only add the new components, do not change
|
||||
anything else in the photo"* hvis den ændrer for meget.
|
||||
- **DALL-E 3 standalone:** Genererer ofte ny scene. Brug
|
||||
*"in the style of this photo"* i stedet for *"using this photo"*.
|
||||
- **Midjourney:** Brug `/describe` på dit foto først, eller `--sref
|
||||
<billed-url>` som style reference sammen med prompten.
|
||||
- **Gemini 2.0 Flash / 2.5:** God billedredigering – upload foto og bed
|
||||
den om at tilføje elementerne.
|
||||
- **Adobe Firefly / Photoshop Generative Fill:** Bedst hvis du vil
|
||||
redigere kun bestemte områder af fotoet med en mindre prompt.
|
||||
|
||||
## Hvis resultatet bliver underligt
|
||||
|
||||
- Prøv: *"only add the new irrigation components, do not change anything
|
||||
else in the photo, preserve the original lighting and perspective"*
|
||||
- Del op i mindre prompts (én komponent ad gangen)
|
||||
- Brug billede-til-billede med lav strength (0.3-0.5) hvis værktøjet
|
||||
understøtter det
|
||||
@@ -0,0 +1,6 @@
|
||||
# Google Keep basis-indkøbsliste
|
||||
# En vare per linje. Linjer der starter med # ignoreres.
|
||||
# Eksempel:
|
||||
# Mælk
|
||||
# Toiletpapir
|
||||
# Bananer
|
||||
@@ -0,0 +1,41 @@
|
||||
# Cutover-checkliste
|
||||
|
||||
Brug denne ved skift fra Synology UI-containere til compose for `mosquitto`, `gitea-db` og `gitea`.
|
||||
|
||||
## Foer cutover
|
||||
|
||||
1. Bekraeft at [/.env.infrastructure](/Volumes/homeassistant/.env.infrastructure) matcher de nuvaerende mounts, porte og credentials.
|
||||
2. Tag backup af:
|
||||
`/volume1/docker/gitea/data`
|
||||
`/volume1/docker/gitea/db`
|
||||
`/volume1/docker/mosquitto/config`
|
||||
`/volume1/docker/mosquitto/data`
|
||||
`/volume1/docker/mosquitto/log`
|
||||
3. Bekraeft at gamle UI-containere stadig koerer normalt inden du stopper noget.
|
||||
|
||||
## Stop gammel stack
|
||||
|
||||
1. Stop `gitea` i Synology UI.
|
||||
2. Stop `gitea-db` i Synology UI.
|
||||
3. Stop `mosquitto` i Synology UI.
|
||||
4. Lad containerne blive liggende i UI, men start dem ikke igen under testen.
|
||||
|
||||
## Start compose-stack
|
||||
|
||||
1. Kør `docker compose --env-file .env.infrastructure -f docker-compose.infrastructure.yml up -d gitea-db`.
|
||||
2. Vent til `gitea-db` er healthy.
|
||||
3. Kør `docker compose --env-file .env.infrastructure -f docker-compose.infrastructure.yml up -d gitea mosquitto`.
|
||||
|
||||
## Verificer
|
||||
|
||||
1. Aabn Gitea og bekraeft at login virker.
|
||||
2. Bekraeft at repositories og historik er intakte.
|
||||
3. Test et `git pull` og et lille `git push`.
|
||||
4. Bekraeft at Home Assistant reconnecter til MQTT.
|
||||
5. Test en MQTT-afhaengig funktion, fx en doerklokke.
|
||||
|
||||
## Hvis noget er galt
|
||||
|
||||
1. Stop compose-containere.
|
||||
2. Start de gamle UI-containere igen i modsat raekkefoelge: `mosquitto`, `gitea-db`, `gitea`.
|
||||
3. Fejlsoeg foerst derefter. Den store risiko er forkert mount eller forkert credential, ikke selve compose-formatet.
|
||||
@@ -0,0 +1,85 @@
|
||||
# Procedure for fuld netværksgenstart
|
||||
|
||||
Brug denne procedure ved fejlfinding, strømafbrydelse eller planlagt vedligehold.
|
||||
Formål: sikre at alle enheder starter i korrekt rækkefølge og at Home Assistant
|
||||
kan forbinde til alle integrationer ved opstart.
|
||||
|
||||
---
|
||||
|
||||
## NEDLUKNING
|
||||
|
||||
Luk i denne rækkefølge — afhængige enheder lukkes **før** infrastruktur.
|
||||
|
||||
1. Luk NAS (Synology) ned via DSM eller SSH
|
||||
2. Sluk Sonos-enheder i alle rum og tag stikket ud
|
||||
3. Sluk PlayStation 5
|
||||
4. Sluk printer og Sonos S1 på kontakten
|
||||
5. Luk Mac mini og gamer-PC ned
|
||||
6. Sluk Ubiquiti Access Points (kontor og stue)
|
||||
7. Sluk Roth Touchline controller
|
||||
8. Sluk gardin-controller (Hunter Douglas hub)
|
||||
9. Sluk Denon forstærker
|
||||
10. Sluk Google Nest Mini
|
||||
11. Sluk Netatmo central enhed
|
||||
12. Sluk Hue bridge
|
||||
13. Sluk Ubiquiti switch
|
||||
14. Sluk router
|
||||
15. Sluk bredbåndsmodem (fiber)
|
||||
|
||||
---
|
||||
|
||||
## OPSTART
|
||||
|
||||
Start i denne rækkefølge — infrastruktur **før** afhængige enheder.
|
||||
|
||||
### Netværk (fundament)
|
||||
1. **Bredbåndsmodem** — vent **5 min** til synkronisering
|
||||
2. **Router** — vent **5 min**
|
||||
3. **Ubiquiti switch** — vent **2 min**
|
||||
4. **Ubiquiti Access Points** (stue og kontor) — vent **2 min**
|
||||
|
||||
### Enheder HA afhænger af ved opstart — tænd ALLE før NAS
|
||||
5. **Hue bridge**
|
||||
6. **Roth Touchline controller**
|
||||
7. **Gardin-controller** (Hunter Douglas hub)
|
||||
8. **Netatmo central enhed**
|
||||
9. **Sonos Port** (central Sonos-enhed i stuen) — vent til den er online
|
||||
10. **Sonos-enheder** — tænd én ad gangen, startende tættest på Sonos Port
|
||||
11. **Denon receiver**
|
||||
12. **Google Nest Mini** *(smart speaker/Google Assistant)*
|
||||
13. **Printer og Sonos S1**
|
||||
|
||||
### NAS og Home Assistant
|
||||
14. **NAS (Synology)** — tænd og vent **10 min**
|
||||
- Home Assistant Docker-container starter automatisk
|
||||
- HA bruger 3–5 min på at initialisere alle integrationer
|
||||
- Tjek at HA er oppe: åbn `http://homeassistant.local:8123`
|
||||
|
||||
### Verificer Home Assistant
|
||||
15. Tjek HA-loggen for fejl:
|
||||
- Gå til **Indstillinger → System → Log** i HA
|
||||
- Forventede (acceptable) fejl ved opstart:
|
||||
- `husqvarna_automower_ble` — plæneklipper ikke i paringstilstand (normalt)
|
||||
- `cover.terrasse_dor` / `cover.hojre` — Hunter Douglas timing (forsvinder efter et par min)
|
||||
- `light.spejl1`, `light.spejl2` — kun tilgængelige når manuel kontakt er tændt
|
||||
- Fejl der **kræver handling**:
|
||||
- `Can not write request body for https://10.0.0.154` → Hue bridge reagerer ikke, genstartden igen
|
||||
- `touchline` timeout hvert minut → Touchline CGI API stadig nede, prøv genstart af Touchline
|
||||
|
||||
### Øvrige enheder (ikke styret af HA)
|
||||
16. **Mac mini, PS5, gamer-PC**
|
||||
|
||||
---
|
||||
|
||||
## KENDTE PROBLEMER OG STATUS (maj 2026)
|
||||
|
||||
| Integration | Problem | Løsning |
|
||||
|---|---|---|
|
||||
| Roth Touchline | CGI API (`/cgi-bin/ILRReadValues.cgi`) returnerer HTTP 000 | Netværksgenstart hjælper typisk |
|
||||
| Hue bridge (10.0.0.154) | "Can not write request body" ved RAM-udtømning | HA-restart eller Hue-genstart |
|
||||
| Zigbee USB | Periodisk `NcpFailure: ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT` | Acceptabelt, genoprettes automatisk |
|
||||
| RAM | 3.7 GiB total — RAM-opgradering bestilt | Installer ny RAM når den ankommer |
|
||||
|
||||
---
|
||||
|
||||
*Opdateret: maj 2026*
|
||||
@@ -0,0 +1,173 @@
|
||||
# Ønskeliste – Nyt udstyr til Home Assistant
|
||||
|
||||
*Sidst opdateret: maj 2026*
|
||||
|
||||
---
|
||||
|
||||
## Netværk / UniFi
|
||||
|
||||
### IoT VLAN-segmentering (trin 4 fra UniFi check 10. maj 2026)
|
||||
|
||||
**Formål:** Isolere IoT-enheder fra primært hjemmenetværk af sikkerhedshensyn.
|
||||
|
||||
**Plan:**
|
||||
- Nyt netværk: `IoT` med VLAN 20, subnet `192.168.20.0/24`
|
||||
- Genaktivér eksisterende `sonoff`-SSID og tilknyt til IoT-netværk
|
||||
- Firewall-regler:
|
||||
- IoT → LAN: **BLOKERET**
|
||||
- Home Assistant → IoT: **TILLADT** (nødvendigt for styring)
|
||||
- IoT → Internet: **TILLADT**
|
||||
- Enheder der skal flyttes til IoT-netværk: Sonoff, Zaptec, Tesla-lader, Wavin, øvrige IoT
|
||||
|
||||
**Kræver:** Manuel re-tilslutning af WiFi-enheder til nyt SSID. Kablede enheder tildeles VLAN via switch-port.
|
||||
|
||||
---
|
||||
|
||||
## Høj prioritet
|
||||
|
||||
### Zigbee Termostater – 1× Danfoss Ally TRV
|
||||
|
||||
| Antal | Rum | Beskrivelse | Status |
|
||||
|---|---|---|---|
|
||||
| 1 | Badeværelse | Danfoss Ally TRV (Zigbee) | ✅ Monteret og online (7. maj 2026) |
|
||||
|
||||
**Bekræftet ventiltype:** Danfoss RA (snap-on clips) – Ally passer direkte med medfølgende RA-adapter.
|
||||
|
||||
**Bemærkninger:**
|
||||
- Eksisterende klimastyring: kontor, soveværelse, Andreas, Daniel, lille bad (gulvvarme)
|
||||
- Stue: har i dag en eQ-3 Bluetooth-termostat som IKKE virker med HA (kræver PIN, forsøgt med M5Stack proxy uden held) – erstattes af Ally
|
||||
- Badeværelse: har i dag en manuel Danfoss RA 2000 – erstattes af Ally
|
||||
- Begge ventiler er bekræftet Danfoss RA snap-on – Ally passer direkte
|
||||
- Badeværelse: snæver plads mod væg, men Ally (Ø52 mm) er kun 2 mm bredere end nuværende (Ø50 mm) – passer fint da den ikke skal drejes
|
||||
- Rigeligt plads opad (længde ~97 mm vs. nuværende ~65 mm er OK)
|
||||
- Kan integreres med eksisterende vindues-sensorer til automatisk lukning ved åbent vindue
|
||||
|
||||
---
|
||||
|
||||
### Zigbee relæmoduler – 4× Sonoff ZBMINI-L2
|
||||
|
||||
| Antal | Rum | Beskrivelse | Status |
|
||||
|---|---|---|---|
|
||||
| 1 | Bryggers | Sonoff ZBMINI-L2 (on/off, ingen nulleder krævet) | ⬜ Ønsket |
|
||||
| 1 | Lille badeværelse | Sonoff ZBMINI-L2 (on/off, ingen nulleder krævet) | ⬜ Ønsket |
|
||||
| 1 | Køkken | Sonoff ZBMINI-L2 eller tilsvarende mini-relæ til Sonos-stikkontakt | ⬜ Ønsket |
|
||||
| 1 | Soveværelse | Sonoff ZBMINI-L2 eller tilsvarende mini-relæ til Sonos-stikkontakt | ⬜ Ønsket |
|
||||
|
||||
**Bemærkninger:**
|
||||
- Monteres bag eksisterende kontakt – lampen bliver smart via Zigbee, kontakten virker stadig fysisk
|
||||
- Bryggers: 1× LED-loftlampe – simpel on/off
|
||||
- Lille bad: G9 halogen – on/off (overvej at skifte G9 halogen til G9 LED for energibesparelse)
|
||||
- Køkken + soveværelse: relevant hvis Sonos-højttalerne ikke har fysisk plads til smart plug
|
||||
- De viste LK FUGA-kombinationer i bryggers og lille bad ser ikke ud som oplagte steder uden først at åbne og kontrollere pladsen
|
||||
- Køb kun relæ til indbygning efter kontrol af dåsedybde, ledningsmængde og om nulleder er til stede
|
||||
- Kræver plads i dåse/stikkontakt og bør kun laves, hvis installationen er egnet og lovlig at udføre
|
||||
- Ca. 80-100 kr/stk
|
||||
|
||||
---
|
||||
|
||||
### Gulvvarme: Wavin bryggers + køkken – Sonoff ZBMINI-L2 + temp-sensorer
|
||||
|
||||
| Antal | Enhed | Beskrivelse | Status |
|
||||
|---|---|---|---|
|
||||
| 2 | Sonoff ZBMINI-L2 | Zigbee relæ, erstatter Wavin RF-modtager | ⬜ Ønsket |
|
||||
| 2 | SONOFF SNZB-02D | Zigbee temperatur/fugt sensor | ⬜ Ønsket |
|
||||
|
||||
**Baggrund:** Bryggers og køkken har i dag en dumb Wavin RF-modtager (JT6/3003-boksen) med to relækanaler (X = bryggers, Y = køkken) der styres af simple trådløse Wavin-termostater. Ingen smart protokol.
|
||||
|
||||
**Plan:** ZBMINI-L2 sættes i serie med fasen ud til aktuatoren (kanalernes brune ledning ud) inde i Wavin-boksen. Temp-sensor per rum. HA `generic_thermostat` samler dem til climate-entiteter der integreres med `script.varme_recalculate` som de øvrige rum.
|
||||
|
||||
**Se:** `dokumenter/wavin_sonoff_installation.md` for komplet installationsguide.
|
||||
|
||||
**Pris:** ~260 kr (ZBMINI) + ~200 kr (temp-sensorer) = **~460 kr total**
|
||||
|
||||
---
|
||||
|
||||
## Normal prioritet
|
||||
|
||||
### Vindues-/dørsensorer – Aqara
|
||||
|
||||
| Antal | Placering | Beskrivelse | Status |
|
||||
|---|---|---|---|
|
||||
| 4 | Køkken | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
|
||||
| 2 | Bryggers | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
|
||||
| 4 | Forgang | Aqara kontaktsensor (vindue/dør) | ⬜ Ønsket |
|
||||
| 2 | Stue | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
|
||||
| 1 | Fordør | Aqara kontaktsensor (dør) | ⬜ Ønsket |
|
||||
| 1 | Bagdør | Aqara kontaktsensor (dør) | ⬜ Ønsket |
|
||||
| 1 | Kontor | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
|
||||
|
||||
**Total:** 15 stk. Aqara Door & Window Sensor (Zigbee) — 6 eksisterende + 9 nye
|
||||
|
||||
**Formål:** Automatisk stop af gulvvarme i rum med åbent vindue — samme logik som eksisterende sensorer i Andreas, Daniel, Soveværelse og Lille bad. Kobles direkte ind i `script.varme_recalculate` med if-betingelse per rum.
|
||||
|
||||
**Bemærk:** Afklar præcis placering (vinduesramme vs. dørfals) inden køb, særligt forgang og fordør/bagdør.
|
||||
|
||||
---
|
||||
|
||||
### Mere RAM til Synology NAS
|
||||
|
||||
| Antal | Beskrivelse | Status |
|
||||
|---|---|---|
|
||||
| 1 stk | Crucial 16GB DDR4-2666 SODIMM — CT16G4SFD8266 | ✅ Installeret 13. maj 2026 |
|
||||
|
||||
**Baggrund:** OOM-kill (exit 137) 23. april 2026 — Synology løb tør for RAM og dræbte mosquitto, gitea, gitea-db og DokuWiki på samme tid. HA selv overlevede men crashede urent.
|
||||
|
||||
**Resultat:** DS920+ kører nu med 4GB (loddet) + 16GB SODIMM = **20GB total RAM**. Bekræftet i DSM Info Center. Sundhedscheck 13. maj 2026: 3,4GB brugt af 19GB tilgængeligt, swap-brug 0B — ingen memory-pressure. Alle 8 Docker containere kører healthy.
|
||||
|
||||
---
|
||||
|
||||
### Idéer til fremtidige udvidelser
|
||||
|
||||
| Enhed | Beskrivelse | Bemærkninger |
|
||||
|---|---|---|
|
||||
| Zigbee vandlækagesensor | Vandskadedetektion | Under opvaskemaskine, vaskemaskine, badeværelse |
|
||||
| Zigbee vibrationssensor | Registrér vaskemaskine-status | Ligesom opvaskemaskinen, men for vaskemaskinen |
|
||||
| Smart dørklokke | Video-dørklokke | Integreres med HA notifikationer |
|
||||
| Zigbee knapmodul | Fysisk betjening | Erstat eksisterende Hue-switches med Zigbee2MQTT-kompatible |
|
||||
| Relæ i stikkontakt til spejllys | Smart styring af `light.spejl1` + `light.spejl2` via eksisterende manuel stikkontakt | Familien bruger den manuelle kontakt i dag, så løsningen skal bevare fysisk betjening |
|
||||
|
||||
---
|
||||
|
||||
## Lav prioritet / Nice-to-have
|
||||
|
||||
| Enhed | Beskrivelse | Bemærkninger |
|
||||
|---|---|---|
|
||||
| Køkken: 11× Hue GU10 White Ambiance | Smart spots til køkken (4+7 grupper) | Bekræftet GU10-fatning. Kræver bypass af eksisterende dimmer. Ca. 2.200 kr |
|
||||
| Postkasse-sensorer | 2× Aqara kontaktsensor + 1× Aqara vibrationssensor | Vippelåg, brevsprække, tømmeluge – metal-kasse dæmper Zigbee, kræver nærliggende router |
|
||||
| Luftkvalitetssensor | VOC / PM2.5 | Udvidelse af eksisterende CO₂-måling |
|
||||
| Energimåler (CT-clamp) | Realtids strømmåling pr. kredsløb | Supplement til Eloverblik |
|
||||
|
||||
---
|
||||
|
||||
## Vildtkamera
|
||||
|
||||
**Krav:**
|
||||
- Batteri-drevet (ingen strøm på placeringen)
|
||||
- WiFi-upload — ingen SD-kortafhentning
|
||||
- Integration med Home Assistant og/eller Synology NAS
|
||||
|
||||
**Valgt: Reolink Argus 4 Pro + Reolink solpanel**
|
||||
|
||||
- Batteri + solpanel → aldrig behov for genopladning
|
||||
- WiFi 6 — upload direkte til NAS/cloud uden SD-kort
|
||||
- Officiel HA-integration (bevægelses-`binary_sensor` + `camera`-entitet med live stream og snapshot)
|
||||
- Virker med Synology Surveillance Station via RTSP
|
||||
- Farve-natvisning (spotlight)
|
||||
|
||||
| Enhed | Antal | Status |
|
||||
|---|---|---|
|
||||
| Reolink Argus 4 Pro | 1 | ⬜ Ønsket |
|
||||
| Reolink solpanel (kompatibelt) | 1 | ⬜ Ønsket |
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Indkøbt ✅
|
||||
|
||||
*Flyt enheder hertil når de er købt og installeret.*
|
||||
|
||||
| Dato | Enhed | Antal | Bemærkninger |
|
||||
|---|---|---|---|
|
||||
| April 2026 | Nous A1Z Smart Plug (Zigbee, energimåling) | 8 | Til Sonos + mesh-udvidelse |
|
||||
| April 2026 | Danfoss Ally TRV (Zigbee) | 1 | Stue – installeret |
|
||||
@@ -0,0 +1,289 @@
|
||||
# Udstyr tilsluttet Home Assistant
|
||||
|
||||
*Sidst opdateret: april 2026*
|
||||
|
||||
---
|
||||
|
||||
## Netværk & Infrastruktur
|
||||
|
||||
| Enhed | Placering | Bemærkninger |
|
||||
|---|---|---|
|
||||
| Synology NAS | Serverrum | IP: 10.0.0.142, 4-bay, kører HA i Docker |
|
||||
| Zigbee USB-dongle | NAS (USB) | `/dev/ttyUSB0` – Zigbee koordinator |
|
||||
| Philips Hue Bridge | — | IP: 10.0.0.154 |
|
||||
| UniFi netværk | Hele huset | Bruges til enhedsblokeringer (børnenes TV/PS5) |
|
||||
| Duck DNS | Ekstern | anneclaus.duckdns.org |
|
||||
|
||||
---
|
||||
|
||||
## Lys (~50+ individuelle)
|
||||
|
||||
### Philips Hue
|
||||
|
||||
| Rum | Enheder |
|
||||
|---|---|
|
||||
| Stue | `raket`, `pendle1`, `pendle2`, `panton`, `spisebord`, `syd` |
|
||||
| Gang | `gang`, `fordelingsgang_1` – `fordelingsgang_5` |
|
||||
| Forgang | `forgang` |
|
||||
| Soveværelse | `claus`, `anne`, `sov_dor`, `sov_midt`, `sov_vindue` |
|
||||
| Kontor | `kontor` |
|
||||
| Badeværelse | `bad_nw`, `bad_ne`, `bad_sw`, `bad_se`, `spejl1`, `spejl2` |
|
||||
| Daniels værelse | `daniel_lysstrip`, `bamse` |
|
||||
| Andreas' værelse | `andreas_lysstrip`, `andreas_stol` |
|
||||
| Sauna | `sauna` |
|
||||
| Garage | `garage` |
|
||||
| Udendørs | `indkorsel_plug`, `udendors_forgang`, `indkorsel_2`, `fordoer` |
|
||||
| Havelys | `hue_outdoor_spot_1`, `hue_outdoor_spot_2`, `hue_outdoor_spot_3` |
|
||||
| Diverse | `hue_ambiance_lamp_1` – `1_3`, `hue_ambiance_lamp_2`, lysstrips |
|
||||
|
||||
### Sonoff (WiFi)
|
||||
|
||||
| Enhed | Placering |
|
||||
|---|---|
|
||||
| `sonoff_10006a2cdd` | Koste |
|
||||
| `sonoff_1000a76e41` | Drivhus |
|
||||
| `sonoff_1000a8c28a_2` | Rønnebær |
|
||||
| `sonoff_1000a721a1` | Terrasse |
|
||||
| `sonoff_1000a70ca0` | Ventilator/Paradis |
|
||||
|
||||
### Smart Plugs (Zigbee)
|
||||
|
||||
| Enhed | Model | Placering |
|
||||
|---|---|---|
|
||||
| Nous A1Z #1-#4 | Nous A1Z (Zigbee 3.0) | Diverse |
|
||||
| `on_off_plug_1` | Hue On/Off Plug | Udetræ |
|
||||
| `on_off_plug_2` | Hue On/Off Plug | Udetræ |
|
||||
|
||||
### Lysgrupper (16 grupper)
|
||||
|
||||
`lys_stue`, `lys_gang`, `lys_pendle`, `lys_bad`, `lys_kids`, `lys_indenfor`, `lys_udenfor`, `lys_indkorsel`, `lys_havelys`, `lys_drivhus`, `lys_ronnebær`, `lys_koste`, `lys_terasse`, `lys_paradis`, `lys_udetrae`, `lys_julelys`
|
||||
|
||||
---
|
||||
|
||||
## Medieafspillere
|
||||
|
||||
### Sonos (10 enheder)
|
||||
|
||||
| Enhed | Rum |
|
||||
|---|---|
|
||||
| `media_player.stue` | Stue |
|
||||
| `media_player.stue_2` | Stue (alternativ) |
|
||||
| `media_player.kokken` | Køkken |
|
||||
| `media_player.alrum` | Alrum |
|
||||
| `media_player.sovevaerelse` | Soveværelse |
|
||||
| `media_player.kontor` | Kontor |
|
||||
| `media_player.andreas` | Andreas' værelse |
|
||||
| `media_player.daniel` | Daniels værelse |
|
||||
| `media_player.badevaerelse` | Badeværelse |
|
||||
| `media_player.lille_badevaerelse` | Lille badeværelse |
|
||||
|
||||
### Øvrige
|
||||
|
||||
| Enhed | Rum |
|
||||
|---|---|
|
||||
| Samsung S95CA 55" TV | Stue |
|
||||
| Denon Receiver | Stue (IP: 10.0.0.233) |
|
||||
|
||||
---
|
||||
|
||||
## Klimastyring (Gulvvarme)
|
||||
|
||||
| Zone | Entity |
|
||||
|---|---|
|
||||
| Kontor | `climate.kontor` |
|
||||
| Soveværelse | `climate.sovev_prelse` |
|
||||
| Andreas' værelse | `climate.andreas` |
|
||||
| Daniels værelse | `climate.daniel` |
|
||||
| Lille badeværelse | `climate.lille_bad` |
|
||||
|
||||
---
|
||||
|
||||
## Bevægelsessensorer (Zigbee/Hue)
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `stue_bevaegelse` | Stue |
|
||||
| `kontor_motion_bevaegelse` | Kontor |
|
||||
| `gang_sensor_motion` | Gang |
|
||||
| `forgang_sensor_motion` | Forgang |
|
||||
| `bad_motion_sensor_motion` | Badeværelse |
|
||||
| `garage_sensor_motion` | Garage |
|
||||
| `sauna_motion_motion` | Sauna |
|
||||
| `hue_motion_sensor_1` | Diverse (×2) |
|
||||
| `hue_motion_sensor_2` | Diverse (×2) |
|
||||
|
||||
---
|
||||
|
||||
## Vindues- & Dørsensorer (Zigbee)
|
||||
|
||||
### Vinduer
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `andreas_vindue` | Andreas' værelse |
|
||||
| `daniel_vindue` | Daniels værelse |
|
||||
| `sovevaerelse_vindue` | Soveværelse |
|
||||
| `badevaerelse_vindue` | Badeværelse |
|
||||
| `lille_bad_vindue` | Lille badeværelse |
|
||||
| `terrassedor` | Terrassedør |
|
||||
|
||||
### Døre
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `garageport` | Garage |
|
||||
| `dishwasher_dor` | Opvaskemaskine |
|
||||
|
||||
---
|
||||
|
||||
## Gardiner / Covers (Zigbee)
|
||||
|
||||
| Enhed | Placering |
|
||||
|---|---|
|
||||
| `cover.hojre` | Stue (højre) |
|
||||
| `cover.midt` | Stue (midt) |
|
||||
| `cover.syd` | Stue (syd) |
|
||||
| `cover.venstre` | Stue (venstre) |
|
||||
| `cover.terrasse_dor` | Terrassedør |
|
||||
| `cover.anne` | Garage (Annes side) |
|
||||
|
||||
---
|
||||
|
||||
## Miljøsensorer
|
||||
|
||||
### CO₂
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `sovevaerelse_stue_carbon_dioxide` | Soveværelse/stue |
|
||||
| `sovevaerelse_daniel_carbon_dioxide` | Daniels værelse |
|
||||
| `sovevaerelse_carbon_dioxide` | Soveværelse |
|
||||
|
||||
### Luftfugtighed
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `sovevaerelse_stue_luftfugtighed` | Soveværelse/stue |
|
||||
| `sovevaerelse_daniel_luftfugtighed` | Daniels værelse |
|
||||
| `sovevaerelse_luftfugtighed` | Soveværelse |
|
||||
|
||||
### Lysstyrke
|
||||
|
||||
| Sensor | Placering |
|
||||
|---|---|
|
||||
| `stue_belysningsstyrke` | Stue |
|
||||
| `kontor_belysningsstyrke` | Kontor |
|
||||
| `indkorsel_sensor_illuminance` | Indkørsel |
|
||||
| `stue_motion_belysningsstyrke` | Stue (motion sensor) |
|
||||
|
||||
---
|
||||
|
||||
## Robotstøvsuger & Robotplæneklipper
|
||||
|
||||
| Enhed | Model | Bemærkninger |
|
||||
|---|---|---|
|
||||
| `vacuum.roborock_s8_pro_ultra` | Roborock S8 Pro Ultra | Fuld integration med rumspecifik rengøring |
|
||||
| `lawn_mower.husqvarna_automower` | Husqvarna Automower | Robotplæneklipper |
|
||||
|
||||
---
|
||||
|
||||
## Tesla (SnowyWhite)
|
||||
|
||||
| Type | Entity |
|
||||
|---|---|
|
||||
| Batteri | `sensor.snowywhite_battery` |
|
||||
| Rækkevidde | `sensor.snowywhite_range` |
|
||||
| Opladning | `sensor.snowywhite_charger_power`, `binary_sensor.snowywhite_charging` |
|
||||
| Dæktryk | 4× TPMS sensorer |
|
||||
| Position | `device_tracker.snowywhite_location_tracker` |
|
||||
|
||||
---
|
||||
|
||||
## Opvaskemaskine (Bosch/Siemens – Home Connect)
|
||||
|
||||
| Entity | Beskrivelse |
|
||||
|---|---|
|
||||
| `sensor.dishwasher_status_2` | Status (off/running/paused) |
|
||||
| `sensor.dishwasher_remaining_time_2` | Resterende tid |
|
||||
| `sensor.dishwasher_powerdisk_level` | Opvaskepulver |
|
||||
| `sensor.dishwasher_salt_level` | Salt |
|
||||
| `sensor.dishwasher_rinse_aid_level` | Afspændingsmiddel |
|
||||
| `button.dishwasher_start` | Start |
|
||||
|
||||
---
|
||||
|
||||
## EV-Ladning
|
||||
|
||||
| Integration | Beskrivelse |
|
||||
|---|---|
|
||||
| Zaptec | EV-lader |
|
||||
| EV Smart Charging | Optimeret opladning efter elpris |
|
||||
|
||||
---
|
||||
|
||||
## Energi & Forsyning
|
||||
|
||||
| Integration | Beskrivelse |
|
||||
|---|---|
|
||||
| Eloverblik | Dansk elforbrug (datahub) |
|
||||
| Energi Data Service | Realtids-elpriser |
|
||||
| Affald DK | Affaldsafhentning (rest, papir/plast, haveaffald) |
|
||||
|
||||
---
|
||||
|
||||
## Netværksblokering (UniFi)
|
||||
|
||||
| Switch | Enhed |
|
||||
|---|---|
|
||||
| `switch.localhost` | Daniels TV |
|
||||
| `switch.localhost_2` | Andreas' TV |
|
||||
| `switch.unifi_block_5c_96_66_25_36_b7` | Andreas' PS5 |
|
||||
| `switch.unifi_block_5c_96_66_39_18_4a` | Daniels PS5 |
|
||||
| `switch.andreas_atv` | Andreas' Apple TV |
|
||||
|
||||
---
|
||||
|
||||
## Personsporing
|
||||
|
||||
| Person | Enhed |
|
||||
|---|---|
|
||||
| Claus Dethlefsen | iPhone 15 Pro |
|
||||
| Anne Schusler Dethlefsen | iPhone 14 Pro |
|
||||
| Andreas Schusler Dethlefsen | — |
|
||||
| Daniel Schusler Dethlefsen | — |
|
||||
|
||||
---
|
||||
|
||||
## Øvrige Integrationer
|
||||
|
||||
| Integration | Beskrivelse |
|
||||
|---|---|
|
||||
| Google Calendar | Kalenderintegration |
|
||||
| Google TTS | Tekst-til-tale |
|
||||
| Garmin Connect | Fitness-data |
|
||||
| Spotify Plus | Musikstyring |
|
||||
| Rejseplanen | Dansk offentlig transport |
|
||||
| Mealie | Madplanlægning |
|
||||
| HACS | Community add-on store |
|
||||
| Browser Mod | UI-kontrol via browser |
|
||||
| Presence Simulation | Simuler tilstedeværelse (ferie) |
|
||||
| Scheduler | Avanceret planlægning |
|
||||
|
||||
---
|
||||
|
||||
## Opsummering
|
||||
|
||||
| Kategori | Antal |
|
||||
|---|---|
|
||||
| Lys (individuelle) | ~50+ |
|
||||
| Lysgrupper | 16 |
|
||||
| Sonos-højttalere | 10 |
|
||||
| Bevægelsessensorer | ~11 |
|
||||
| Vindues-/dørsensorer | 8 |
|
||||
| Klimazoner (gulvvarme) | 5 |
|
||||
| Gardiner/covers | 6 |
|
||||
| CO₂-sensorer | 3 |
|
||||
| Batterienheder overvåget | 40+ |
|
||||
| Custom integrationer | 14 |
|
||||
| Automationer | ~47 |
|
||||
| Scripts | ~24 |
|
||||
@@ -0,0 +1,338 @@
|
||||
# Automatisk Vandingssystem – Projektplan
|
||||
|
||||
*Oprettet: april 2026*
|
||||
|
||||
---
|
||||
|
||||
## Oversigt
|
||||
|
||||
Automatisk vanding af 3 højbede + drivhus med 3 kapillærkasser. Vandhane på nordsiden af huset, PE-rør i rende over græsplænen til højbede/drivhus. Systemet skal kunne passe sig selv i op til 3 uger (ferie) inkl. automatisk gødningstilførsel.
|
||||
|
||||
---
|
||||
|
||||
## Systemdiagram
|
||||
|
||||
```
|
||||
Hus (nordside)
|
||||
═══[Vandhane]════════════════════════
|
||||
│
|
||||
├── Y-splitter ──→ Manuel slange (bypass)
|
||||
│
|
||||
├── Hovedventil (24V AC magnetventil, NC)
|
||||
│
|
||||
├── Dosatron D25RE2 ←── 20L gødningsdunk
|
||||
│
|
||||
├── Vandfilter (130µm mesh)
|
||||
│
|
||||
├── Trykreducer (1-1.5 bar)
|
||||
│
|
||||
════ PE-rør 25mm i rende (~10m over græs) ════
|
||||
│
|
||||
┌──────────┤ Fordeler + ventilbox (nedgravet IP65)
|
||||
│ │
|
||||
Zone 1 Zone 2 Zone 3 Zone 4 Zone 5
|
||||
Højbed 1 Højbed 2 Højbed 3 Drivhusbed Kapillærkasser
|
||||
(sive) (sive) (sive) (sive) (3× flydventil)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Komponentliste
|
||||
|
||||
### Controller & sensorer (OpenSprinklerShop.de)
|
||||
|
||||
| Komponent | Antal | Ca. pris | Formål |
|
||||
|---|---|---|---|
|
||||
| OpenSprinkler AC v3.4 (8 zoner, inkl. 24V transformer) | 1 | 650 kr | WiFi irrigation controller, HA integration |
|
||||
| Analog Sensor Board | 1 | 225 kr | Forbind jordfugtsensorer |
|
||||
| SMT50 jordfugt+temp sensorer | 4 | 900 kr | Én per jordzone (3 højbede + drivhusbed) |
|
||||
| IP65 kabinet | 1 | 190 kr | Udendørs beskyttelse |
|
||||
| **Subtotal** | | **~1.965 kr** | |
|
||||
|
||||
### Vandstyring (Vandingsspecialisten.dk / Bauhaus)
|
||||
|
||||
| Komponent | Antal | Ca. pris | Formål |
|
||||
|---|---|---|---|
|
||||
| Y-splitter m/ kugleventiler | 1 | 100 kr | Bypass til manuel slange |
|
||||
| 24V AC magnetventiler (Rain Bird/Hunter 1") | 5 | 1.000 kr | Zoneventiler |
|
||||
| Ventilbox/fordeler (underjordisk) | 1 | 300 kr | Samler ventiler |
|
||||
| PE-rør 25mm | ~20m | 200 kr | Hovedledning i rende |
|
||||
| Siveslange/drypslange (5m ruller) | 4 | 320 kr | Én per jordzone |
|
||||
| Trykreducer (1-1.5 bar) | 1 | 150 kr | Nødvendigt for siveslanger |
|
||||
| Vandfilter (mesh 130µm) | 1 | 100 kr | Beskytter mod tilstopning |
|
||||
| PE-fittings (T-stykker, koblinger, klemringe) | diverse | 300 kr | Forgreninger |
|
||||
| Mini-flydventiler (1/2" eller 1/4") | 3 | 240 kr | Selvreguler kapillærkasser |
|
||||
| **Subtotal** | | **~2.710 kr** | |
|
||||
|
||||
### Gødningsdosering (Dosatron-forhandler / AgroWeb.dk)
|
||||
|
||||
| Komponent | Antal | Ca. pris | Formål |
|
||||
|---|---|---|---|
|
||||
| Dosatron D25RE2 (1:500-1:50) | 1 | 2.500 kr | Proportional gødningsinjektor, vandtryks-drevet |
|
||||
| 20L dunk med låg + slangekoblinger | 1 | 100 kr | Gødningskoncentrat |
|
||||
| **Subtotal** | | **~2.600 kr** | |
|
||||
|
||||
### Total
|
||||
|
||||
| Kategori | Pris |
|
||||
|---|---|
|
||||
| Controller & sensorer | ~1.965 kr |
|
||||
| Vandstyring | ~2.710 kr |
|
||||
| Gødningsdosering | ~2.600 kr |
|
||||
| **Total** | **~7.275 kr** |
|
||||
|
||||
> **Budget-alternativ (~3.500 kr):** Venturi-injektor (200 kr) i stedet for Dosatron, billigere ventiler fra AliExpress, Tuya Zigbee jordfugtsensorer (~100 kr/stk) i stedet for SMT50.
|
||||
|
||||
---
|
||||
|
||||
## Indkøbssteder
|
||||
|
||||
| Butik | Hvad | Link |
|
||||
|---|---|---|
|
||||
| OpenSprinklerShop.de | Controller, sensorer, kabinet | opensprinklershop.de/en |
|
||||
| Vandingsspecialisten.dk / Bauhaus.dk | Slanger, ventiler, rør, fittings | vandingsspecialisten.dk |
|
||||
| Dosatron-forhandler / AgroWeb.dk | Gødningsinjektor | agroweb.dk |
|
||||
| AliExpress (budget-alt.) | Ventiler, venturi, Tuya-sensorer | aliexpress.com |
|
||||
|
||||
---
|
||||
|
||||
## HA-integration
|
||||
|
||||
### OpenSprinkler HA-integration
|
||||
- Officiel HA-integration (config flow)
|
||||
- Giver entities for hver zone (switch), programstyring, sensordata
|
||||
- Understøtter MQTT til sensor-publicering
|
||||
|
||||
### Automation-logik
|
||||
|
||||
```yaml
|
||||
# Pseudo-logik for daglig vanding
|
||||
trigger:
|
||||
- platform: time
|
||||
at: "06:00:00"
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.netatmo_regn_sidste_24t
|
||||
below: 5 # mm
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.jordfugt_zone_1
|
||||
below: 40 # procent
|
||||
action:
|
||||
# Sekventiel vanding (én zone ad gangen for at holde trykket)
|
||||
- service: switch.turn_on
|
||||
entity_id: switch.opensprinkler_zone_1
|
||||
- delay: "00:15:00"
|
||||
- service: switch.turn_off
|
||||
entity_id: switch.opensprinkler_zone_1
|
||||
- service: switch.turn_on
|
||||
entity_id: switch.opensprinkler_zone_2
|
||||
# ... osv for zone 3, 4 og 5
|
||||
```
|
||||
|
||||
### Tilstandsstyring
|
||||
|
||||
| Hændelse | Aktion |
|
||||
|---|---|
|
||||
| Jordfugt < tærskel OG ingen regn | Vand zonen |
|
||||
| Regn > 5mm sidste 24t | Spring vanding over |
|
||||
| Temperatur < 5°C | Ingen vanding (frostbeskyttelse) |
|
||||
| Kapillærkasser | Flydventiler er selvregulerende – zone 5 åbnes 2×/dag |
|
||||
|
||||
---
|
||||
|
||||
## Fysisk installation – trin
|
||||
|
||||
1. **Montér ved vandhane:** Y-splitter → hovedventil → Dosatron → filter → trykreducer
|
||||
2. **Grav rende:** ~10cm dyb fra vandhane over græsplæne til højbedsområdet
|
||||
3. **Læg PE-rør** i renden, dæk til
|
||||
4. **Monter ventilbox** ved højbedene (nedgravet IP65 boks med 5 magnetventiler)
|
||||
5. **Fordel siveslanger:** Én per højbed, én i drivhusbed
|
||||
6. **Kapillærkasser:** Forbind zone 5 → T-stykker → 3× flydventil i kasserne
|
||||
7. **Monter OpenSprinkler** i IP65 kabinet ved stikkontakt (nordsiden)
|
||||
8. **Træk kabel** fra OpenSprinkler til ventilbox (24V AC, lavspænding)
|
||||
9. **Forbind jordfugtsensorer** til Analog Sensor Board (kabel i rende)
|
||||
10. **Test:** Kør hver zone manuelt, tjek flow og dækning
|
||||
11. **HA-integration:** Tilføj OpenSprinkler, opret automationer
|
||||
|
||||
---
|
||||
|
||||
## 3-ugers autonomi – tjekliste
|
||||
|
||||
- [x] Dosatron: 20L koncentrat ved 1:100 = 2.000L vandvolumen (rigeligt)
|
||||
- [ ] Jordfugtsensorer forhindrer overvanding
|
||||
- [ ] Netatmo regnmåler springer vanding over ved regn
|
||||
- [ ] Flydventiler i kapillærkasser er 100% selvregulerende
|
||||
- [ ] OpenSprinkler har lokal fallback hvis HA er nede
|
||||
- [ ] Rens vandfilter inden afrejse
|
||||
- [ ] Test alle zoner inden afrejse
|
||||
|
||||
---
|
||||
|
||||
## Eksisterende sensorer der kan bruges
|
||||
|
||||
- **Netatmo regnmåler** – allerede installeret, bruges til vejrkompensering
|
||||
- **WiFi-dækning** – god dækning til drivhus/have (bekræftet)
|
||||
- **Zigbee-dækning** – god, udvides yderligere med Zigbee smart plugs (se ønskeliste)
|
||||
|
||||
---
|
||||
|
||||
## Konkret graveplan & placering (ud fra fotos)
|
||||
|
||||
### Vandhane-station (nordsiden af huset)
|
||||
|
||||
```
|
||||
[Vindue]
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
│ Husmur │
|
||||
│ │
|
||||
│ [Slangerulle] [Stikkontakt - sort boks] │
|
||||
│ Gardena │ │
|
||||
│ │ │ 230V │
|
||||
│ │ ┌────┴─────────┐ │
|
||||
│ ▼ │ OpenSprinkler│ │
|
||||
│ [Vandhane] │ i IP65 boks │ │
|
||||
│ │ └────┬─────────┘ │
|
||||
│ ●─[Y-splitter] │ │
|
||||
│ │ ├── Manuel slange (bypass) │ 24V kabel │
|
||||
│ │ └── ↓ │ (parallelt med │
|
||||
│ │ [Hovedventil 24V] │ PE-rør) │
|
||||
│ │ [Dosatron + 20L dunk] │ │
|
||||
│ │ [Filter] │ │
|
||||
│ │ [Trykreducer] │ │
|
||||
│ ▼ │ │
|
||||
│ ●═════════════════════════════ ●═══════════════════►
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
↓
|
||||
Fliser → græsplæne
|
||||
Husqvarna Automower kører her
|
||||
→ PE-rør graves ned ~10cm under græs
|
||||
```
|
||||
|
||||
### Renden over græsplænen
|
||||
|
||||
```
|
||||
[Hus med vandhane]
|
||||
═══════════════════════════════════
|
||||
│
|
||||
│ PE-rør 25mm + 24V kabel
|
||||
│ (i samme rende, ~10cm dyb)
|
||||
│ (~6-8m over græsplæne)
|
||||
│
|
||||
│ ⚠ Husqvarna Automower kører her –
|
||||
│ derfor SKAL alt graves ned
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ Graverende stopper │
|
||||
│ mellem højbedene │
|
||||
│ │
|
||||
[Højbed 1] ⊕──── ventilbox [Højbed 2]
|
||||
(asparges) │ graves ned (asparges)
|
||||
│ i grus-stien
|
||||
│
|
||||
│ ┌──────────┐
|
||||
│ │ Ventilbox │ ← 5 magnetventiler
|
||||
│ │ (IP65) │ (3 til højbede + 1 til drivhusbed + 1 til kapillærkasser)
|
||||
│ └──────────┘
|
||||
│
|
||||
[Højbed 3] │
|
||||
(rabarber) │
|
||||
│
|
||||
▼
|
||||
PE-rør fortsætter
|
||||
under drivhusets fundament
|
||||
(lille graverende eller eksisterende åbning)
|
||||
│
|
||||
[Op gennem flise inde i drivhus]
|
||||
```
|
||||
|
||||
### Højbede – set ovenfra (fra fotos)
|
||||
|
||||
```
|
||||
═══[Hus, nordside]═══
|
||||
│
|
||||
│ PE-rør i rende (under græs)
|
||||
│
|
||||
▼
|
||||
┌──────────────────────────┐
|
||||
│ Højbed 1 (asparges) │ ← sive 5m
|
||||
│ ━━━━━━━━━━━━━━━━━━━━━━━━ │ (zone 1)
|
||||
└──────────┬───────────────┘
|
||||
│
|
||||
╔══════╪══════╗
|
||||
║ ⊕ Ventilbox ║ ← graves ned i grus-stien
|
||||
║ (5 ventiler)║
|
||||
╚══════╪══════╝
|
||||
│
|
||||
┌──────────┴──────────┐──────────────────┐
|
||||
│ Højbed 2 (asparges) │ Højbed 3 (rabarb)│
|
||||
│ ━━━━━━━ sive 5m ━━━ │ ━━━ sive 5m ━━━━ │
|
||||
│ (zone 2) │ (zone 3) │
|
||||
└──────────┬──────────┴──────────────────┘
|
||||
│
|
||||
│ PE-rør under drivhusfundament
|
||||
▼
|
||||
┌──────────────────────────────────┐
|
||||
│ Drivhus │
|
||||
│ 📍 ↑ PE-rør op gennem flise │
|
||||
│ │ │
|
||||
│ ├──→ Sive 5m i drivhusbed │ ← (zone 4)
|
||||
│ │ │
|
||||
│ └──→ Zone 5 ─────┐ │
|
||||
│ │ │
|
||||
│ ┌─────────────────┴─────────┐ │
|
||||
│ │ Mini-flydventil → Kasse 1│ │
|
||||
│ │ Mini-flydventil → Kasse 2│ │
|
||||
│ │ Mini-flydventil → Kasse 3│ │
|
||||
│ └───────────────────────────┘ │
|
||||
└──────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Drivhus – kapillærkasser (fra foto: 3 sorte kasser med huller)
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────────────┐
|
||||
│ Drivhus (set indefra mod indgang) │
|
||||
│ │
|
||||
│ 📍 PE-rør op gennem flise (ved indgang) │
|
||||
│ │ │
|
||||
│ │ │
|
||||
│ ├─────→ Zone 4: Siveslange langs jorden ─→ │
|
||||
│ │ │
|
||||
│ │ [Plantebord] │
|
||||
│ │ ┌──────────┐ │
|
||||
│ │ │ potter │ │
|
||||
│ │ └──────────┘ │
|
||||
│ │ │
|
||||
│ │ ┌────┐ ┌────┐ ┌────┐ │
|
||||
│ ├─────→ Zone 5: │ ⊙F │ │ ⊙F │ │ ⊙F │ ← Mini-flydven│
|
||||
│ │ ├────┤ ├────┤ ├────┤ │
|
||||
│ │ │Kap1│ │Kap2│ │Kap3│ ← Kapillær- │
|
||||
│ │ │vand│ │vand│ │vand│ kasser med │
|
||||
│ │ └────┘ └────┘ └────┘ vandreservoir│
|
||||
│ │ │
|
||||
│ │ Selvregulerer: når vandstand falder, │
|
||||
│ │ åbner flydventilen og fylder op │
|
||||
│ │
|
||||
└────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Strækninger & graveplan (sammenfatning)
|
||||
|
||||
| Strækning | Længde | Hvad |
|
||||
|---|---|---|
|
||||
| Vandhane → start på græsrende | ~2m | PE-rør + 24V kabel langs husmur |
|
||||
| Rende over græsplæne | ~6-8m | Graveret ~10cm dyb (Husqvarna kører her) |
|
||||
| Rende → ventilbox (mellem højbede) | ~1-2m | Ventilbox nedgraves i grus-sti |
|
||||
| Ventilbox → drivhus | ~3m | Under drivhusfundament |
|
||||
| Inde i drivhus | ~2m | Op ved flise, fordel til drivhusbed + 3 kapillærkasser |
|
||||
| **Total PE-rør** | **~15m** | (køb 20m for sikkerhed) |
|
||||
|
||||
### Vigtige observationer fra fotos
|
||||
|
||||
1. **Husqvarna Automower** har sin garage ved nordmuren – PE-rør og kabler SKAL graves ned så robotten kan køre uforstyrret over græsset
|
||||
2. **Stikkontakten** under vinduet er ideel placering for OpenSprinkler – ingen lange strømkabler nødvendige
|
||||
3. **Grus-stien mellem 1. og 2./3. højbed** giver naturligt sted til ventilboxen – let adgang for service, ingen planter forstyrres
|
||||
4. **Drivhusets fundament** – PE-rør føres under (kort gravearbejde) og kommer op ved flisen ved indgangen
|
||||
5. **Slangerullen** kan blive ved muren til manuel brug – Y-splitteren bevarer manuel adgang
|
||||
6. **Stikkontakten** sidder højt nok til at være fri af regnvand
|
||||
@@ -0,0 +1,509 @@
|
||||
# Alternativt Vandingssystem – Rain Bird RC2 + Venturi + Kapillærkasser
|
||||
|
||||
*Oprettet: april 2026*
|
||||
|
||||
---
|
||||
|
||||
## Formål
|
||||
|
||||
Dette dokument beskriver et alternativ til det eksisterende forslag i [vandingssystem.md](./vandingssystem.md).
|
||||
|
||||
Dette alternative forslag tager udgangspunkt i:
|
||||
|
||||
- Rain Bird RC2 230V Outdoor som primær controller
|
||||
- 5 zoner i stedet for 4
|
||||
- Venturi-gødskning i stedet for Dosatron
|
||||
- 3 kapillærkasser i drivhus med mekaniske flydventiler uden zone-styring
|
||||
- Lokal autonom drift, selv hvis Home Assistant er utilgængelig
|
||||
|
||||
Målet er en løsning, der er lidt mere klassisk "havevanding" end OpenSprinkler-forslaget, men stadig kan overvåges og delvist styres fra Home Assistant.
|
||||
|
||||
---
|
||||
|
||||
## Kort konklusion
|
||||
|
||||
Dette Rain Bird-forslag er stærkt, hvis du vil have:
|
||||
|
||||
- en traditionel irrigation-controller med egen lokal tidsplan
|
||||
- 5 tydeligt adskilte zoner
|
||||
- lavere kompleksitet på gødningsdelen
|
||||
- et system der fortsætter med at køre uden Home Assistant
|
||||
|
||||
Det oprindelige OpenSprinkler-forslag er stærkere, hvis du vil have:
|
||||
|
||||
- dybere Home Assistant-integration
|
||||
- mere fleksibel logik omkring jordfugt, regn og feriedrift
|
||||
- bedre mulighed for sensorstyret beslutningstagning direkte i controller/logik
|
||||
- mere præcis og stabil gødningsdosering via Dosatron
|
||||
|
||||
---
|
||||
|
||||
## Systemoversigt
|
||||
|
||||
### Have-layout
|
||||
|
||||
- 3 højbede á 2m × 1m
|
||||
- 1 ekstra bed
|
||||
- 1 drivhus på 3m × 3m
|
||||
- 3 kapillærkasser inde i drivhuset
|
||||
- Vandhane på husmur
|
||||
- 230V ved vandhane
|
||||
- WiFi via UniFi i nærheden
|
||||
- Nedgravet 25 mm PE-rør, ca. 20-30 cm dybde
|
||||
|
||||
### Afstande
|
||||
|
||||
- Ca. 5 m fra husmur/vandhane til første højbed
|
||||
- Højbede står på række
|
||||
- Ca. 70 cm mellem højbedene
|
||||
- Ca. 4 m fra højbedene til drivhuset
|
||||
|
||||
### Zoner
|
||||
|
||||
| Zone | Område | Vandingstype |
|
||||
|---|---|---|
|
||||
| Zone 1 | Højbed 1 | 16 mm drypslange / driptubing |
|
||||
| Zone 2 | Højbed 2 | 16 mm drypslange / driptubing |
|
||||
| Zone 3 | Højbed 3 | 16 mm drypslange / driptubing |
|
||||
| Zone 4 | Ekstra bed | 16 mm drypslange / driptubing |
|
||||
| Zone 5 | Drivhusbed | Mikro-dryp |
|
||||
|
||||
### Kapillærkasser
|
||||
|
||||
Kapillærkasserne er **ikke zone-styrede**.
|
||||
|
||||
De forsynes fra en separat, konstant trykreduceret lavtryksgren med:
|
||||
|
||||
- mekanisk flydventil i hver kasse
|
||||
- fast vandstand på ca. 2 cm
|
||||
- overflow-beskyttelse
|
||||
- manuel afspærring før kapillærgrenen
|
||||
|
||||
Det betyder, at kapillærkasserne virker, også hvis controlleren eller Home Assistant er nede.
|
||||
|
||||
---
|
||||
|
||||
## Fysisk systemdesign
|
||||
|
||||
### Hovedopbygning
|
||||
|
||||
```text
|
||||
Husmur / vandhane
|
||||
|
||||
Vandhane
|
||||
│
|
||||
├── Y-splitter
|
||||
│ ├── Manuel haveslange
|
||||
│ └── Irrigationssystem
|
||||
│
|
||||
└── Filter 120 mesh
|
||||
│
|
||||
├── Trykreducer til drypzoner
|
||||
│ │
|
||||
│ ├── Venturi-bypass + gødningstank
|
||||
│ │ │
|
||||
│ │ └── 25 mm PE hovedledning til ventilbox
|
||||
│ │ │
|
||||
│ │ ├── Ventil 1 → Højbed 1
|
||||
│ │ ├── Ventil 2 → Højbed 2
|
||||
│ │ ├── Ventil 3 → Højbed 3
|
||||
│ │ ├── Ventil 4 → Ekstra bed
|
||||
│ │ └── Ventil 5 → Drivhus dryp
|
||||
│ │
|
||||
│ └── 24VAC styret af Rain Bird RC2
|
||||
│
|
||||
└── Separat lavtryksgren til kapillærkasser
|
||||
│
|
||||
├── Egen regulator
|
||||
├── Manuel afspærring
|
||||
└── 16 mm forsyning til 3 flydventiler i drivhus
|
||||
```
|
||||
|
||||
### Bemærkning om gødning og kapillærkasser
|
||||
|
||||
Hvis kapillærkasserne **ikke** skal have gødning kontinuerligt, bør deres vandgren ligge **uden om venturi-injektoren**.
|
||||
|
||||
Det er min anbefaling i denne løsning.
|
||||
|
||||
Det giver:
|
||||
|
||||
- mindre risiko for salt-/næringsophobning i reservoirerne
|
||||
- mindre risiko ved 3 ugers ferie
|
||||
- enklere drift
|
||||
|
||||
Hvis du ønsker gødning i kapillærkasserne, bør det ske meget kontrolleret og ikke som konstant forsyning.
|
||||
|
||||
---
|
||||
|
||||
## Anbefalet hardware
|
||||
|
||||
### Controller
|
||||
|
||||
| Komponent | Antal | Estimat | Note |
|
||||
|---|---|---|---|
|
||||
| Rain Bird RC2 230V Outdoor | 1 | ca. 1.400-1.900 kr | 8 stationer, WiFi, 24VAC |
|
||||
|
||||
### Ventiler og hydraulik
|
||||
|
||||
| Komponent | Antal | Estimat | Note |
|
||||
|---|---|---|---|
|
||||
| Rain Bird 100-DV 1" magnetventil | 5 | ca. 1.000-1.250 kr | 1 per zone |
|
||||
| Ventilbox | 1 | ca. 300-500 kr | Samlet servicepunkt |
|
||||
| PE-rør 25 mm | 15-20 m | ca. 200-300 kr | Nedgravet hovedledning |
|
||||
| 16 mm driptubing | passende længde | ca. 500-900 kr | Bed- og drivhusfordeling |
|
||||
| 120 mesh filter | 1 | ca. 100-200 kr | Før alt dryp |
|
||||
| Trykreducer til drypsystem | 1 | ca. 150-250 kr | Stabilt dryktryk |
|
||||
| Ekstra regulator til kapillærgren | 1 | ca. 150-250 kr | Lavt tryk til flydventiler |
|
||||
| Kugleventiler / afspærringer | flere | ca. 150-300 kr | Service og bypass |
|
||||
| Fittings og koblinger | diverse | ca. 300-500 kr | PE + 16 mm |
|
||||
|
||||
### Gødningssystem
|
||||
|
||||
| Komponent | Antal | Estimat | Note |
|
||||
|---|---|---|---|
|
||||
| Venturi-injektor | 1 | ca. 150-400 kr | Billigere end Dosatron |
|
||||
| Bypass-loop med ventiler | 1 | ca. 200-400 kr | Justering af sug |
|
||||
| Gødningstank 20L | 1 | ca. 100-200 kr | Koncentrat |
|
||||
| Sugeslange + filter | 1 | ca. 50-100 kr | Til venturi |
|
||||
|
||||
### Drivhus / kapillærkasser
|
||||
|
||||
| Komponent | Antal | Estimat | Note |
|
||||
|---|---|---|---|
|
||||
| Flydventil til kapillærkasser | 3 | ca. 240-450 kr | Mekanisk vandstand |
|
||||
| Overflow-løsning | 3 | ca. 100-200 kr | Sikkerhed |
|
||||
| 16 mm + mikrofordeling | 1 sæt | ca. 150-250 kr | Til drivhus |
|
||||
|
||||
### Sensorer
|
||||
|
||||
| Komponent | Antal | Estimat | Note |
|
||||
|---|---|---|---|
|
||||
| Jordfugtsensor højbed | 1-2 | afhænger af model | Til HA beslutningsstøtte |
|
||||
| Jordfugtsensor drivhus | 1 | afhænger af model | Til zone 5 |
|
||||
| Netatmo regnmåler | eksisterer | 0 kr | Allerede installeret |
|
||||
|
||||
### Samlet budget
|
||||
|
||||
Praktisk realistisk budget:
|
||||
|
||||
- **ca. 4.500-6.500 kr** uden avanceret flowmåler
|
||||
- **ca. 5.500-7.500 kr** hvis du vælger bedre fittings, bedre sensorer og ekstra sikkerhedskomponenter
|
||||
|
||||
Det gør løsningen typisk lidt billigere end OpenSprinkler + Dosatron-forslaget, især fordi venturi er langt billigere end Dosatron.
|
||||
|
||||
---
|
||||
|
||||
## Driftsprincip
|
||||
|
||||
### Når Home Assistant virker
|
||||
|
||||
Home Assistant bruges til:
|
||||
|
||||
- overvågning af zoner
|
||||
- regnlogik
|
||||
- jordfugt-logik
|
||||
- notifikationer
|
||||
- manuel override
|
||||
- statistik og status
|
||||
|
||||
### Når Home Assistant er nede
|
||||
|
||||
Rain Bird RC2 skal stadig kunne:
|
||||
|
||||
- køre faste schedules
|
||||
- vande alle 5 zoner efter lokal tidsplan
|
||||
- ignorere HA-afhængighed
|
||||
|
||||
Kapillærkasserne virker stadig via mekaniske flydventiler.
|
||||
|
||||
Det betyder, at feriekravet på 3 uger kan opfyldes, **hvis de faste schedules er fornuftigt sat op i controlleren**.
|
||||
|
||||
---
|
||||
|
||||
## Home Assistant-integration
|
||||
|
||||
### Vigtig kompatibilitetsnote
|
||||
|
||||
Home Assistant har en Rain Bird integration til LNK WiFi-baserede systemer.
|
||||
|
||||
Det er en fordel for denne løsning, men der er også en vigtig begrænsning:
|
||||
|
||||
- HA-dokumentationen angiver, at **Rain Bird 2.0 app / nyere IQ4-migrering ikke er kompatibel med Home Assistant**
|
||||
- derfor bør du sikre dig, at den valgte controller/app-kombination stadig fungerer med den lokale HA-integration
|
||||
|
||||
Hvis RC2-enheden eller firmware ender på den nye inkompatible platform, bliver denne løsning markant dårligere ift. HA-integration.
|
||||
|
||||
OpenSprinkler-forslaget har her lavere integrationsrisiko.
|
||||
|
||||
### Forventede HA-entities
|
||||
|
||||
```text
|
||||
switch.zone_1
|
||||
switch.zone_2
|
||||
switch.zone_3
|
||||
switch.zone_4
|
||||
switch.zone_5
|
||||
|
||||
sensor.soil_moisture_bed
|
||||
sensor.soil_moisture_greenhouse
|
||||
sensor.rain_today
|
||||
number.rain_delay
|
||||
calendar.irrigation_schedule
|
||||
```
|
||||
|
||||
### Praktisk model i HA
|
||||
|
||||
- Rain Bird styrer den basale lokale plan
|
||||
- Home Assistant justerer eller stopper efter behov
|
||||
- HA skal ikke være den eneste logikmotor
|
||||
|
||||
---
|
||||
|
||||
## Anbefalet autonom strategi
|
||||
|
||||
### Lokal controller-plan i Rain Bird
|
||||
|
||||
Programmer minimum følgende lokalt i Rain Bird:
|
||||
|
||||
- Zone 1-4: kort morgenkørsel
|
||||
- Zone 5: kortere, hyppigere kørsel efter drivhusbehov
|
||||
- Regnforsinkelse kan justeres fra HA eller manuelt
|
||||
|
||||
### HA som supervisory layer
|
||||
|
||||
Home Assistant skal bruges som et ekstra lag ovenpå:
|
||||
|
||||
- sæt rain delay ved kraftig regn
|
||||
- notifikation ved lav jordfugt i drivhus
|
||||
- notifikation ved manglende flow / usædvanligt forbrug hvis flowsensor tilføjes
|
||||
- manuel override ved hedebølge eller ferie
|
||||
|
||||
---
|
||||
|
||||
## Eksempel på HA-automationslogik
|
||||
|
||||
### 1. Regn-forsinkelse baseret på Netatmo
|
||||
|
||||
```yaml
|
||||
alias: Vanding - regnforsinkelse ved regn
|
||||
trigger:
|
||||
- platform: numeric_state
|
||||
entity_id: sensor.rain_today
|
||||
above: 5
|
||||
action:
|
||||
- service: number.set_value
|
||||
target:
|
||||
entity_id: number.rain_delay
|
||||
data:
|
||||
value: 1
|
||||
mode: single
|
||||
```
|
||||
|
||||
### 2. Notifikation om tørt højbed
|
||||
|
||||
```yaml
|
||||
alias: Vanding - hoejbed tørt
|
||||
trigger:
|
||||
- platform: numeric_state
|
||||
entity_id: sensor.soil_moisture_bed
|
||||
below: 28
|
||||
for: "02:00:00"
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Vanding"
|
||||
message: "Højbedene er tørre. Overvej ekstra vanding eller længere zonetid."
|
||||
mode: single
|
||||
```
|
||||
|
||||
### 3. Notifikation om tørt drivhus
|
||||
|
||||
```yaml
|
||||
alias: Vanding - drivhus tørt
|
||||
trigger:
|
||||
- platform: numeric_state
|
||||
entity_id: sensor.soil_moisture_greenhouse
|
||||
below: 35
|
||||
for: "01:00:00"
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Vanding"
|
||||
message: "Drivhuset er tørt. Tjek zone 5 eller hæv køretiden."
|
||||
mode: single
|
||||
```
|
||||
|
||||
### 4. Manuel zonekørsel med specifik varighed
|
||||
|
||||
```yaml
|
||||
alias: Vanding - start zone 1 manuelt
|
||||
trigger: []
|
||||
action:
|
||||
- service: rainbird.start_irrigation
|
||||
data:
|
||||
entity_id: switch.zone_1
|
||||
duration: 15
|
||||
mode: single
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Gødningsstrategi i dette alternativ
|
||||
|
||||
### Venturi-forslag
|
||||
|
||||
Venturi giver mening hvis du vil have:
|
||||
|
||||
- lavere pris
|
||||
- få bevægelige dele
|
||||
- enkel udskiftning
|
||||
|
||||
Men venturi er dårligere end Dosatron på:
|
||||
|
||||
- præcision
|
||||
- stabil dosering ved trykvariationer
|
||||
- reproducerbarhed over lang tid
|
||||
|
||||
### Praktisk anbefaling
|
||||
|
||||
Brug venturi kun på udvalgte dage eller uger, fx:
|
||||
|
||||
- gødning 1 gang pr. uge i vækstsæson
|
||||
- manuel åbning af venturi-bypass inden ferie hvis du er sikker på blandingsforholdet
|
||||
- kapillærkasser helst uden venturi i den konstante gren
|
||||
|
||||
### Simpel HA-logik for gødningsdag
|
||||
|
||||
```yaml
|
||||
input_boolean:
|
||||
fertigation_day:
|
||||
name: Gødningsdag
|
||||
|
||||
alias: Vanding - gødningspåmindelse
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.fertigation_day
|
||||
to: "on"
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: "Aktivér venturi-bypass og fyld gødningstank før næste vanding."
|
||||
mode: single
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sikkerhed og fail-safe
|
||||
|
||||
### Minimum anbefalet
|
||||
|
||||
- 120 mesh filter
|
||||
- trykreducer før dryp
|
||||
- separat regulator til kapillærgrenen
|
||||
- manuel afspærring af kapillærgren
|
||||
- ventilbox med god adgang
|
||||
- vintertømning/dræning
|
||||
|
||||
### Bør tilføjes senere
|
||||
|
||||
- flowsensor på hovedlinjen
|
||||
- læksensor ved ventilbox eller ved husmur
|
||||
- notifikation ved usædvanlig lang zonekørsel
|
||||
|
||||
---
|
||||
|
||||
## Sammenligning – forslag 1 vs forslag 2
|
||||
|
||||
### Forslag 1: OpenSprinkler + Dosatron
|
||||
|
||||
Se [vandingssystem.md](./vandingssystem.md).
|
||||
|
||||
Kendetegn:
|
||||
|
||||
- OpenSprinkler AC v3.4
|
||||
- 4 zoner
|
||||
- SMT50-sensorer direkte ind i systemdesignet
|
||||
- Dosatron proportional gødskning
|
||||
- kapillærkasser koblet på drivhus-zonen
|
||||
- stærk HA-orientering
|
||||
|
||||
### Forslag 2: Rain Bird RC2 + Venturi
|
||||
|
||||
Dette dokument.
|
||||
|
||||
Kendetegn:
|
||||
|
||||
- Rain Bird RC2 Outdoor
|
||||
- 5 zoner
|
||||
- Venturi-injektor
|
||||
- kapillærkasser på konstant mekanisk gren
|
||||
- mere klassisk havevanding-controller
|
||||
- HA som overvågning/supervision oven på lokal controller
|
||||
|
||||
### Sammenligningstabel
|
||||
|
||||
| Punkt | Forslag 1: OpenSprinkler + Dosatron | Forslag 2: Rain Bird + Venturi |
|
||||
|---|---|---|
|
||||
| Controller-fleksibilitet | Meget høj | Middel |
|
||||
| HA-integration | Meget stærk | God, men med kompatibilitetsrisiko på nyere Rain Bird platforme |
|
||||
| Lokal autonomi uden HA | God | God |
|
||||
| Sensorbaseret styring | Bedst egnet | Mulig, men mere indirekte |
|
||||
| Gødningspræcision | Meget høj | Middel |
|
||||
| Pris | Højere | Ofte lidt lavere |
|
||||
| Antal zoner | 4 | 5 |
|
||||
| Kapillærkasser | På drivhus-zone | Konstant mekanisk forsyning |
|
||||
| Installationskompleksitet | Høj | Middel |
|
||||
| Risiko for fejldosering | Lavere | Højere |
|
||||
| Egnethed til ferie | Meget god | God, hvis den lokale schedule er veldesignet |
|
||||
| Udvidelsesmuligheder | Meget høj | Middel-god |
|
||||
|
||||
---
|
||||
|
||||
## Praktisk vurdering
|
||||
|
||||
### Hvornår jeg ville vælge forslag 1
|
||||
|
||||
Vælg OpenSprinkler + Dosatron hvis du vil have:
|
||||
|
||||
- den mest HA-native løsning
|
||||
- mest mulig kontrol og fleksibilitet
|
||||
- bedre sensorstyring
|
||||
- bedre gødningspræcision
|
||||
- en løsning som er lettere at gøre intelligent over tid
|
||||
|
||||
### Hvornår jeg ville vælge forslag 2
|
||||
|
||||
Vælg Rain Bird + Venturi hvis du vil have:
|
||||
|
||||
- mere traditionel sprinklertænkning
|
||||
- 5 separate zoner fra start
|
||||
- simplere gødningshardware
|
||||
- lidt lavere pris
|
||||
- stærkere "standalone controller"-følelse
|
||||
|
||||
### Min samlede anbefaling
|
||||
|
||||
Hvis målet er **maksimal Home Assistant-værdi og bedst mulig logik**, er det oprindelige OpenSprinkler-forslag stadig det bedste.
|
||||
|
||||
Hvis målet er **en mere klassisk, driftssikker og lidt enklere havevanding-controller**, er dette Rain Bird-forslag et godt alternativ, men kun hvis du verificerer at den præcise Rain Bird-platform stadig er kompatibel med Home Assistant.
|
||||
|
||||
---
|
||||
|
||||
## Anbefalet beslutning
|
||||
|
||||
Hvis du vil vælge mellem de to, vil jeg formulere det sådan:
|
||||
|
||||
- **Vælg OpenSprinkler** hvis HA-integration og intelligent styring er vigtigst
|
||||
- **Vælg Rain Bird** hvis lokal controllerdrift og klassisk sprinkler-setup er vigtigst
|
||||
- **Behold mekaniske flydventiler** til kapillærkasser i begge scenarier
|
||||
- **Overvej flowsensor** uanset hvilken løsning du vælger
|
||||
|
||||
---
|
||||
|
||||
## Næste skridt hvis du går med Rain Bird-løsningen
|
||||
|
||||
1. Verificér at præcis RC2/LNK-kombination er kompatibel med Home Assistant i din opsætning.
|
||||
2. Beslut om kapillærkasserne skal være helt uden gødning.
|
||||
3. Fastlæg drypslange-layout for hver af de 5 zoner.
|
||||
4. Vælg jordfugtsensor-type og integrationsmetode.
|
||||
5. Tilføj senere flowsensor som ekstra sikkerhed ved ferie.
|
||||
@@ -0,0 +1,248 @@
|
||||
# Beslutningsnotat – Hvilket vandingssystem ville jeg vælge?
|
||||
|
||||
Oprettet: april 2026
|
||||
|
||||
Dette notat er et kort supplement til:
|
||||
|
||||
- [vandingssystem.md](./vandingssystem.md)
|
||||
- [vandingssystem_alternativ_rainbird.md](./vandingssystem_alternativ_rainbird.md)
|
||||
|
||||
Formålet er at svare direkte på spørgsmålet:
|
||||
|
||||
**Hvis det var min have og min Home Assistant-installation, hvilken løsning ville jeg vælge?**
|
||||
|
||||
---
|
||||
|
||||
## Kort svar
|
||||
|
||||
Jeg ville vælge **OpenSprinkler + proportional gødskning + mekaniske flydventiler til kapillærkasser**.
|
||||
|
||||
Med andre ord: grundretningen fra [vandingssystem.md](./vandingssystem.md), men med én vigtig praktisk pointe:
|
||||
|
||||
- kapillærkasserne skal stadig være så simple og mekaniske som muligt
|
||||
- flowsensor bør tilføjes senere som ekstra sikkerhed
|
||||
|
||||
---
|
||||
|
||||
## Hvorfor jeg ville vælge den løsning
|
||||
|
||||
### 1. Den passer bedre til din måde at bruge Home Assistant på
|
||||
|
||||
Du bruger allerede Home Assistant aktivt til:
|
||||
|
||||
- styring
|
||||
- automations
|
||||
- sensorer
|
||||
- speciallogik
|
||||
- fejlsøgning
|
||||
- dokumentation og videre udvikling
|
||||
|
||||
Det peger klart i retning af en løsning, hvor controlleren er mere åben og mere HA-venlig.
|
||||
|
||||
OpenSprinkler passer bedre til den tankegang end Rain Bird.
|
||||
|
||||
---
|
||||
|
||||
### 2. Integrationsrisikoen er lavere
|
||||
|
||||
Rain Bird-løsningen kan være fin, men den har en reel usikkerhed:
|
||||
|
||||
- nyere Rain Bird-platforme og app/firmware-retninger har kendte begrænsninger ift. Home Assistant
|
||||
- det betyder, at man kan ende med en controller, som fungerer fint alene, men dårligere sammen med HA end forventet
|
||||
|
||||
OpenSprinkler er mere forudsigelig her.
|
||||
|
||||
Det betyder ikke, at Rain Bird er dårlig.
|
||||
Det betyder bare, at **den tekniske risiko er højere**.
|
||||
|
||||
---
|
||||
|
||||
### 3. Sensorlogik bliver mere naturlig
|
||||
|
||||
Dit projekt handler ikke kun om at tænde og slukke vand.
|
||||
Det handler også om:
|
||||
|
||||
- jordfugt
|
||||
- regn
|
||||
- ferie i 3 uger
|
||||
- drivhus
|
||||
- gødning
|
||||
- forskellig adfærd i forskellige zoner
|
||||
|
||||
Jo mere af løsningen der bygger på beslutningslogik, desto mere giver OpenSprinkler-retningen mening.
|
||||
|
||||
Rain Bird er bedre som klassisk controller.
|
||||
OpenSprinkler er bedre som intelligent systemkomponent.
|
||||
|
||||
---
|
||||
|
||||
### 4. Dosatron er dyrere, men teknisk bedre
|
||||
|
||||
Hvis du vil have automatisk gødning over længere tid, er Dosatron bare en bedre løsning end venturi.
|
||||
|
||||
Fordelene er:
|
||||
|
||||
- mere stabil dosering
|
||||
- mindre følsom for trykvariationer
|
||||
- mere forudsigelig under ferie
|
||||
- bedre egnet når du vil stole på systemet uden daglig kontrol
|
||||
|
||||
Venturi er attraktivt på pris, men ikke på præcision.
|
||||
|
||||
Hvis målet er et system du tør lade passe sig selv i 3 uger, er præcision værd at betale for.
|
||||
|
||||
---
|
||||
|
||||
### 5. Din haveprofil taler for "robust men intelligent"
|
||||
|
||||
Du har flere krav på én gang:
|
||||
|
||||
- høj ferie-sikkerhed
|
||||
- drivhus og kapillærkasser
|
||||
- mulighed for gødning
|
||||
- Home Assistant-integration
|
||||
- sandsynligvis lyst til senere forbedringer
|
||||
|
||||
Det er præcis det punkt, hvor OpenSprinkler-løsningen begynder at give mere værdi end en mere klassisk controller.
|
||||
|
||||
---
|
||||
|
||||
## Hvad jeg ikke ville gøre
|
||||
|
||||
### Jeg ville ikke gøre kapillærkasserne afhængige af HA
|
||||
|
||||
Kapillærkasserne bør være mekaniske.
|
||||
Det gælder i begge forslag.
|
||||
|
||||
Derfor ville jeg holde fast i:
|
||||
|
||||
- flydventil i hver kasse
|
||||
- simpel vandforsyning
|
||||
- så få aktive komponenter som muligt
|
||||
|
||||
Det er den rigtige måde at gøre netop den del ferie-stabil.
|
||||
|
||||
---
|
||||
|
||||
### Jeg ville ikke starte med flowsensor som krav for dag 1
|
||||
|
||||
Flowsensor er en god idé, men ikke nødvendig for at komme i gang.
|
||||
|
||||
Jeg ville bygge systemet i denne rækkefølge:
|
||||
|
||||
1. controller
|
||||
2. ventiler
|
||||
3. hovedledning og zonefordeling
|
||||
4. drypvanding
|
||||
5. kapillærkasser
|
||||
6. HA-logik
|
||||
7. flowsensor og ekstra læk-overvågning
|
||||
|
||||
Så får du et brugbart system hurtigere, uden at gøre projektet unødigt tungt fra start.
|
||||
|
||||
---
|
||||
|
||||
## Hvornår jeg i stedet ville vælge Rain Bird
|
||||
|
||||
Jeg ville vælge Rain Bird-løsningen, hvis følgende var vigtigst:
|
||||
|
||||
- lokal controllerdrift er vigtigere end HA-dybde
|
||||
- du vil have 5 klassiske zoner og mindst mulig controller-speciallogik
|
||||
- du vil holde hardwareprisen lidt nede
|
||||
- du accepterer lidt større usikkerhed på integrationen
|
||||
|
||||
Det er et reelt og fornuftigt valg.
|
||||
|
||||
Jeg synes bare ikke, det er det **bedste** valg i netop din opsætning.
|
||||
|
||||
---
|
||||
|
||||
## Min anbefalede version af det endelige system
|
||||
|
||||
Hvis jeg skulle vælge for dig, ville jeg sigte efter denne version:
|
||||
|
||||
### Controller
|
||||
|
||||
- OpenSprinkler
|
||||
|
||||
### Zonering
|
||||
|
||||
- 5 zoner fra start
|
||||
- 3 zoner til højbede
|
||||
- 1 zone til drivhusbed
|
||||
- 1 zone til kapillærkasser
|
||||
|
||||
### Gødning
|
||||
|
||||
- Dosatron hvis du vil have reel automatisk drift med høj sikkerhed
|
||||
- ellers venturi som budgetversion, men så med lavere forventning til præcision
|
||||
|
||||
### Drivhus
|
||||
|
||||
- én drypzone til drivhusbed
|
||||
- én separat zone til 3 kapillærkasser på mekaniske flydventiler
|
||||
|
||||
### Sikkerhed
|
||||
|
||||
- filter
|
||||
- trykreducer
|
||||
- god serviceadgang
|
||||
- senere flowsensor
|
||||
|
||||
### Home Assistant
|
||||
|
||||
- HA som beslutnings- og overvågningslag
|
||||
- controller med lokal fallback
|
||||
|
||||
---
|
||||
|
||||
## Hvis jeg skulle optimere på budgettet
|
||||
|
||||
Hvis budgettet bliver afgørende, ville jeg ikke først spare på controlleren.
|
||||
Jeg ville i stedet spare her:
|
||||
|
||||
1. starte uden flowsensor
|
||||
2. starte med færre/færre bedre placerede jordfugtsensorer
|
||||
3. udskyde Dosatron og begynde uden automatisk gødning eller med simpel venturi
|
||||
|
||||
Det vigtigste at få rigtigt fra starten er:
|
||||
|
||||
- rørføring
|
||||
- ventilplacering
|
||||
- filter
|
||||
- trykregulering
|
||||
- zoneopdeling
|
||||
|
||||
Det er de ting, der er mest irriterende at bygge om senere.
|
||||
|
||||
---
|
||||
|
||||
## Endelig anbefaling
|
||||
|
||||
### Mit valg
|
||||
|
||||
Jeg ville vælge:
|
||||
|
||||
OpenSprinkler + mekaniske flydventiler + mulighed for senere flowsensor
|
||||
|
||||
### Mit valg hvis budgettet skal ned
|
||||
|
||||
Jeg ville vælge:
|
||||
|
||||
OpenSprinkler + mekaniske flydventiler + venturi som midlertidig budget-gødningsløsning
|
||||
|
||||
### Mit valg hvis du vil have mest klassisk controller-setup
|
||||
|
||||
Så ville jeg vælge:
|
||||
|
||||
Rain Bird RC2 + 5 zoner + mekanisk kapillærgren
|
||||
|
||||
Men det ville være mit andenvalg i din konkrete opsætning.
|
||||
|
||||
---
|
||||
|
||||
## En sætning-versionen
|
||||
|
||||
Hvis jeg skal sige det helt kort:
|
||||
|
||||
**Jeg ville vælge OpenSprinkler-løsningen, fordi den passer bedre til dit Home Assistant-miljø, giver lavere integrationsrisiko og er den stærkeste platform, hvis systemet senere skal blive mere intelligent og stadig være ferie-stabilt.**
|
||||
@@ -0,0 +1,262 @@
|
||||
# Indkøbsliste – Rain Bird-alternativ
|
||||
|
||||
Oprettet: april 2026
|
||||
|
||||
Denne liste hører sammen med [vandingssystem_alternativ_rainbird.md](./vandingssystem_alternativ_rainbird.md).
|
||||
|
||||
Målet er at gøre Rain Bird-løsningen konkret med realistiske produkter, som typisk kan findes i Danmark eller Tyskland.
|
||||
|
||||
> Bemærk: priser og lager skifter. Brug listen som indkøbsgrundlag, ikke som garanti for præcis pris eller tilgængelighed.
|
||||
|
||||
---
|
||||
|
||||
## 1. Controller
|
||||
|
||||
### Primært valg
|
||||
|
||||
| Produkt | Antal | Ca. pris | Butikstype | Note |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| Rain Bird RC2, 8 station, 230V Outdoor | 1 | 1.400-1.900 kr | Tysk webshop / dansk vandingsbutik | Hovedcontroller |
|
||||
|
||||
### Tjek før køb
|
||||
|
||||
- at modellen reelt understøtter den HA-kompatible Rain Bird/LNK-løsning
|
||||
- at den ikke tvinges over på nyere IQ4/2.0-platform uden HA-kompatibilitet
|
||||
- at udendørs kabinet og 230V-variant er den rigtige model
|
||||
|
||||
### Butikstyper for controller
|
||||
|
||||
- Rain Bird-forhandlere i Tyskland
|
||||
- Amazon.de
|
||||
- danske vandingsspecialister
|
||||
|
||||
---
|
||||
|
||||
## 2. Ventiler og ventilbox
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| Rain Bird 100-DV 1" 24VAC magnetventil | 5 | 180-250 kr/stk | En ventil pr. zone |
|
||||
| Ventilbox standard / jumbo | 1 | 300-500 kr | Til 5 ventiler samlet |
|
||||
| Ventilmanifold 1" eller samling med nipler/T-stykker | 1 sæt | 250-500 kr | Gør montage lettere |
|
||||
|
||||
### Konkrete ventiltyper
|
||||
|
||||
- Rain Bird 100-DV 1"
|
||||
- alternativt Hunter PGV 1" 24VAC hvis Rain Bird ikke er på lager
|
||||
|
||||
### Butikstyper for ventiler
|
||||
|
||||
- Vandingsspecialisten.dk
|
||||
- Rig-Tig Vanding / tilsvarende danske havevandingsforhandlere
|
||||
- Amazon.de
|
||||
- tyske irrigation-webshops
|
||||
|
||||
---
|
||||
|
||||
## 3. Filtrering og trykregulering
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| 120 mesh filter, 3/4" eller 1" | 1 | 100-200 kr | Før drypsystem |
|
||||
| Trykreducer til drypvanding, fx 1.5 bar | 1 | 150-250 kr | Til hovedzoner |
|
||||
| Ekstra lavtryksregulator til kapillærkasser | 1 | 150-250 kr | Separat gren |
|
||||
| Kugleventiler / afspærringsventiler | 3-5 | 40-100 kr/stk | Service og bypass |
|
||||
| Y-splitter til vandhane | 1 | 75-150 kr | Manuel slange + system |
|
||||
|
||||
### Konkrete filter- og regulatorvalg
|
||||
|
||||
- 120 mesh inline irrigation filter
|
||||
- Rain Bird / Netafim / Irritec trykreducer 1.0-1.5 bar
|
||||
- messing kugleventiler til bypass og service
|
||||
|
||||
### Butikstyper for filter og trykregulering
|
||||
|
||||
- Bauhaus
|
||||
- Harald Nyborg (simple fittings og kugleventiler)
|
||||
- Vandingsspecialisten.dk
|
||||
- Amazon.de
|
||||
|
||||
---
|
||||
|
||||
## 4. Rør, slanger og fittings
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| PE-rør 25 mm | 20 m | 200-350 kr | Nedgravet hovedledning |
|
||||
| 16 mm driptubing | 50-100 m | 400-900 kr | Højbede + drivhus |
|
||||
| 16 mm fittings (knæ, T, koblinger, ender) | 1 sæt | 200-400 kr | Distribution |
|
||||
| 25 mm PE fittings | 1 sæt | 250-500 kr | Hovedlinje |
|
||||
| Overgang 25 mm til manifold | 1 sæt | 100-200 kr | Samling ved ventilbox |
|
||||
|
||||
### Konkrete rør- og slangevalg
|
||||
|
||||
- 25 mm PE100 eller almindeligt vandings-PE-rør
|
||||
- 16 mm drypslange/driptubing med trykkompenserede dryppere
|
||||
- Rain Bird XF Dripline eller Netafim Techline som kvalitetsvalg
|
||||
|
||||
### Praktisk anbefaling for gødningssystemet
|
||||
|
||||
Til højbede ville jeg prioritere kvalitets-drypslange frem for den billigste løsning. Det er ofte her driftsstabiliteten afgøres.
|
||||
|
||||
---
|
||||
|
||||
## 5. Drivhus og kapillærkasser
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| Mini-flydventil / tank float valve | 3 | 80-150 kr/stk | En pr. kapillærkasse |
|
||||
| 16 mm forsyningsslange til kasser | 1 sæt | 100-200 kr | Konstant vandgren |
|
||||
| Mikrofordeling / 4 mm slanger | 1 sæt | 100-200 kr | Hvis nødvendigt i drivhus |
|
||||
| Overflow-gennemføring / udløb | 3 | 30-60 kr/stk | Sikkerhed mod overløb |
|
||||
|
||||
### Konkrete drivhusdele
|
||||
|
||||
- mini float valve til reservoir / livestock tank / RO-tank
|
||||
- gennemføring med pakning til sidevæg i kapillærkasser
|
||||
- 4 mm mikro-irrigation fittings
|
||||
|
||||
### Butikstyper for drivhusdele
|
||||
|
||||
- Amazon.de
|
||||
- eBay.de
|
||||
- tyske greenhouse / irrigation-webshops
|
||||
- hydroponics-butikker
|
||||
|
||||
---
|
||||
|
||||
## 6. Gødningssystem
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| Venturi-injektor 3/4" eller 1" | 1 | 150-400 kr | Billig fertigation |
|
||||
| Bypass-loop fittings + ventiler | 1 sæt | 200-400 kr | Juster sug og flow |
|
||||
| Gødningstank 20L | 1 | 100-200 kr | Koncentrat |
|
||||
| Sugeslange med filter | 1 | 50-100 kr | Ned i tank |
|
||||
|
||||
### Konkrete gødningsdele
|
||||
|
||||
- Mazzei-lignende venturi-injektor eller tilsvarende irrigation venturi
|
||||
- simpel 20L plastdunk med låg
|
||||
- kemikaliebestandig sugeslange
|
||||
|
||||
### Praktisk anbefaling
|
||||
|
||||
Hvis du vælger venturi:
|
||||
|
||||
- brug det kun til de zoner der reelt skal have gødning
|
||||
- hold kapillærkasserne udenfor den kontinuerte gødningsgren
|
||||
- byg bypass, så venturi kan isoleres helt
|
||||
|
||||
---
|
||||
|
||||
## 7. Sensorer
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| Jordfugtsensor til højbed | 1-2 | 150-900 kr/stk | Afhænger af ambitionsniveau |
|
||||
| Jordfugtsensor til drivhus | 1 | 150-900 kr/stk | Til zone 5 |
|
||||
| Flowsensor (senere) | 1 | 300-1.200 kr | Ekstra fail-safe |
|
||||
| Læksensor (senere) | 1-2 | 100-300 kr/stk | Ved husmur / ventilbox |
|
||||
|
||||
### Mulige retninger
|
||||
|
||||
Budget:
|
||||
|
||||
- Tuya Zigbee jordfugtsensorer
|
||||
|
||||
Mere seriøst:
|
||||
|
||||
- Vegetronix / SMT / industrielle sensorer med kendt kalibrering
|
||||
|
||||
### Praktisk anbefaling for sensorer
|
||||
|
||||
Hvis du går med Rain Bird-varianten, vil jeg holde sensorerne i HA-laget og ikke gøre hele løsningen afhængig af dem for basal drift.
|
||||
|
||||
---
|
||||
|
||||
## 8. El og montage
|
||||
|
||||
| Produkt | Antal | Ca. pris | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| Udendørs godkendt 24VAC installationskabel | passende længde | 150-300 kr | Fra controller til ventilbox |
|
||||
| Vandtætte samlemuffer / gel connectors | 1 sæt | 100-200 kr | Til ventilledninger |
|
||||
| Monteringsskruer / rawlplugs | 1 sæt | 50-100 kr | Controller og bokse |
|
||||
| Kabelflex eller beskyttelse | efter behov | 100-200 kr | Hvor kabel udsættes |
|
||||
|
||||
---
|
||||
|
||||
## 9. Min anbefalede indkøbspakke
|
||||
|
||||
Hvis jeg skulle købe denne løsning ind i praksis, ville jeg starte med:
|
||||
|
||||
### Kernepakke
|
||||
|
||||
- 1 × Rain Bird RC2 Outdoor 8-zone
|
||||
- 5 × Rain Bird 100-DV 1"
|
||||
- 1 × ventilbox til 5 ventiler
|
||||
- 20 m PE-rør 25 mm
|
||||
- 50-100 m 16 mm kvalitets-driptubing
|
||||
- 1 × 120 mesh filter
|
||||
- 1 × trykreducer til dryp
|
||||
- 1 × ekstra regulator til kapillærgrenen
|
||||
- 1 × venturi-injektor
|
||||
- 1 × 20L gødningsdunk
|
||||
- 3 × mini-flydventiler
|
||||
- fittings-pakker til både 25 mm og 16 mm
|
||||
- 24VAC kabel + vandtætte samlemuffer
|
||||
|
||||
### Bør tilføjes tidligt
|
||||
|
||||
- mindst 1 jordfugtsensor i højbedsområdet
|
||||
- mindst 1 jordfugtsensor i drivhuset
|
||||
|
||||
### Bør tilføjes senere
|
||||
|
||||
- 1 flowsensor
|
||||
- 1-2 læksensorer
|
||||
|
||||
---
|
||||
|
||||
## 10. Hvad jeg ville prioritere kvalitetsmæssigt
|
||||
|
||||
Hvis budgettet skal bruges rigtigt, ville jeg prioritere kvalitet i denne rækkefølge:
|
||||
|
||||
1. Drypslanger og fittings
|
||||
2. Ventiler
|
||||
3. Filter og trykreducer
|
||||
4. Ventilbox og servicevenlig montage
|
||||
5. Sensorer
|
||||
6. Venturi
|
||||
|
||||
Venturi må gerne være enkel. Det vigtigste er, at vandføringen, filteret og fordelingssystemet er stabilt.
|
||||
|
||||
---
|
||||
|
||||
## 11. Butikstyper jeg ville bruge
|
||||
|
||||
### Danmark
|
||||
|
||||
- Vandingsspecialisten.dk
|
||||
- Bauhaus
|
||||
- Harald Nyborg til simple fittings og kugleventiler
|
||||
|
||||
### Tyskland
|
||||
|
||||
- Amazon.de
|
||||
- specialiserede irrigation-webshops
|
||||
- greenhouse / hydroponics-webshops til float valves og mikrodele
|
||||
|
||||
---
|
||||
|
||||
## 12. Slutvurdering
|
||||
|
||||
Denne indkøbsliste giver en realistisk vej til at bygge Rain Bird-løsningen uden at gøre den for eksotisk.
|
||||
|
||||
Hvis du vil holde det robust i 3 ugers ferie, vil jeg især fokusere på:
|
||||
|
||||
- god filtrering
|
||||
- ordentlig trykregulering
|
||||
- kvalitets-drypslange
|
||||
- enkel kapillærgren med mekaniske flydventiler
|
||||
- flowovervågning som næste trin
|
||||
@@ -0,0 +1,252 @@
|
||||
# Gulvvarme: Wavin bryggers + køkken → HA styring
|
||||
## Idiot-sikker installationsguide
|
||||
|
||||
**Formål:** Erstatte den dumme RF-modtager (Wavin JT6/3003-boksen) med to Sonoff ZBMINI Zigbee-relæer,
|
||||
så Home Assistant kan styre bryggers og køkken-gulvvarme præcis som de andre rum.
|
||||
|
||||
---
|
||||
|
||||
## Del 1: Indkøb
|
||||
|
||||
| Vare | Antal | Pris ca. | Link/søg |
|
||||
|------|-------|----------|----------|
|
||||
| **Sonoff ZBMINI-L2** (Zigbee relæ, ingen nul-ledning) | 2 | ~130 kr/stk | Aliexpress, Elgiganten |
|
||||
| **SONOFF SNZB-02D** Zigbee temp/fugt sensor | 2 | ~100 kr/stk | Aliexpress |
|
||||
|
||||
> **Vigtigt:** Vælg ZBMINI-**L2** (eller ZBMINI Extreme) – den kræver **ikke** en nuleder (N).
|
||||
> Wavin-boksen har måske ikke nuleder fremme til brug for et relæ.
|
||||
|
||||
---
|
||||
|
||||
## Del 2: Forståelse af Wavin-boksen
|
||||
|
||||
Når du kigger på det grønne printplade med låget af:
|
||||
|
||||
```
|
||||
MAINS IND (fra stikkontakt i væggen):
|
||||
Brun = FASE (L) – "det farlige"
|
||||
Blå = NUL (N)
|
||||
|
||||
KANAL X (til aktuator 1, fx bryggers):
|
||||
Brun = FASE UD til aktuator
|
||||
|
||||
KANAL Y (til aktuator 2, fx køkken):
|
||||
Brun = FASE UD til aktuator
|
||||
|
||||
Aktuatorerne får NUL fra boksen via blå ledning.
|
||||
```
|
||||
|
||||
Boksen virker som et simpelt on/off relæ per kanal:
|
||||
- Når termostaten sender "varm op" → relæet lukker → 230V fase sendes ud til aktuatoren → ventil åbner
|
||||
- Sonoff ZBMINI erstatter præcis dette relæ
|
||||
|
||||
---
|
||||
|
||||
## Del 3: Installation trin for trin
|
||||
|
||||
### ⚠️ STOP – Sluk strøm FØR du rører noget
|
||||
|
||||
1. Find den sikring eller kontakt der forsyner Wavin-boksen
|
||||
2. Sluk den
|
||||
3. Brug en spændingsprøver/-tester på de brune ledninger inde i boksen – bekræft at der er 0V
|
||||
|
||||
---
|
||||
|
||||
### Trin 1: Fotografér ledningerne i boksen FØR du piller noget
|
||||
|
||||
Tag et billede med din telefon. Du vil gerne huske hvad der sidder hvor.
|
||||
|
||||
---
|
||||
|
||||
### Trin 2: Identificér de 4 relevante ledninger
|
||||
|
||||
I Wavin-boksen sidder:
|
||||
- **Brun ind** = Fase fra væggen (fælles for begge kanaler)
|
||||
- **Blå ind** = Nul fra væggen (fælles)
|
||||
- **Brun ud X** = Fase ud til aktuator bryggers
|
||||
- **Brun ud Y** = Fase ud til aktuator køkken
|
||||
|
||||
(De blå ledninger der går ud er nuleder direkte til aktuatorerne – de ændres ikke)
|
||||
|
||||
---
|
||||
|
||||
### Trin 3: Monter Sonoff ZBMINI-L2 nr. 1 (bryggers)
|
||||
|
||||
ZBMINI-L2 har disse klemmer:
|
||||
|
||||
```
|
||||
[ L in ] [ L out ] [ S1 ] [ S2 ]
|
||||
```
|
||||
|
||||
Tilslut:
|
||||
- **L in** ← Brun fase ind fra væggen (eller tag en aftapning fra eksisterende brun)
|
||||
- **L out** → Brun fase ud til bryggers-aktuatoren (den ledning der tidligere sad i X-relæet)
|
||||
- **S1/S2** = bruges kun hvis du vil have en fysisk kontakt – lad dem sidde tomme
|
||||
|
||||
Sonoff ZBMINI-L2 kræver ikke N (nuleder) – det er pointen med L2-modellen.
|
||||
|
||||
---
|
||||
|
||||
### Trin 4: Monter Sonoff ZBMINI-L2 nr. 2 (køkken)
|
||||
|
||||
Identisk som trin 3, men brug Y-kanalens udgang:
|
||||
- **L in** ← Brun fase ind (kan sidde på samme aftapning som nr. 1)
|
||||
- **L out** → Brun fase ud til køkken-aktuatoren
|
||||
|
||||
---
|
||||
|
||||
### Trin 5: Wavin RF-modtagerboksen
|
||||
|
||||
Den eksisterende boks kobles nu **forbi** – dens relæer bruges ikke længere.
|
||||
Du kan enten:
|
||||
- Efterlade den hængende (ufarlig, bare strøm ind og tomme udgange)
|
||||
- Klippe strømmen til den (tag brun og blå ind ud af klemmerne og tape enderne)
|
||||
|
||||
Den gamle Wavin termostat på væggen virker stadig men gør intet – du kan efterlade den eller tage den ned.
|
||||
|
||||
---
|
||||
|
||||
### Trin 6: Gendan strøm og test
|
||||
|
||||
1. Sæt strøm til igen
|
||||
2. Begge Sonoff-enheder bør lyse rødt (venter på pairing)
|
||||
|
||||
---
|
||||
|
||||
## Del 4: Zigbee-pairing i Home Assistant
|
||||
|
||||
1. Gå til **Indstillinger → Enheder → Zigbee2MQTT** (eller ZHA hvis du bruger det)
|
||||
2. Klik **Tillad tilslutning / Permit join** (60 sekunder)
|
||||
3. Hold knappen på Sonoff ZBMINI nede i 5 sekunder til LED blinker hurtigt
|
||||
4. Enheden dukker op – navngiv den `bryggers_relæ` og `kokken_relæ`
|
||||
5. Gentag for temp-sensorerne (tryk lille knap på siden for at parre)
|
||||
|
||||
---
|
||||
|
||||
## Del 5: Home Assistant konfiguration
|
||||
|
||||
### 5a: generic_thermostat (climate entity)
|
||||
|
||||
Tilføj til `configuration.yaml` (eller en inkluderet fil):
|
||||
|
||||
```yaml
|
||||
climate:
|
||||
- platform: generic_thermostat
|
||||
name: Bryggers
|
||||
unique_id: generic_thermostat_bryggers
|
||||
heater: switch.bryggers_relae # Sonoff enhedens switch entity
|
||||
target_sensor: sensor.bryggers_temp_sensor_temperature
|
||||
min_temp: 15
|
||||
max_temp: 28
|
||||
target_temp: 20
|
||||
cold_tolerance: 0.3
|
||||
hot_tolerance: 0.3
|
||||
min_cycle_duration:
|
||||
minutes: 5
|
||||
ac_mode: false
|
||||
|
||||
- platform: generic_thermostat
|
||||
name: Køkken
|
||||
unique_id: generic_thermostat_kokken
|
||||
heater: switch.kokken_relae
|
||||
target_sensor: sensor.kokken_temp_sensor_temperature
|
||||
min_temp: 15
|
||||
max_temp: 28
|
||||
target_temp: 20
|
||||
cold_tolerance: 0.3
|
||||
hot_tolerance: 0.3
|
||||
min_cycle_duration:
|
||||
minutes: 5
|
||||
ac_mode: false
|
||||
```
|
||||
|
||||
> Tilpas entity-navnene til hvad Zigbee2MQTT faktisk kalder dem efter pairing.
|
||||
|
||||
### 5b: input_number til komforttemperaturer
|
||||
|
||||
Tilføj til `include/input/number/varme.yaml`:
|
||||
|
||||
```yaml
|
||||
varme_komfort_bryggers:
|
||||
name: Komfort - Bryggers
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_kokken:
|
||||
name: Komfort - Køkken
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
```
|
||||
|
||||
### 5c: Tilføj til varme_recalculate scriptet
|
||||
|
||||
De to nye rum skal med i `include/scripts/varme_styring.yaml` → `varme_recalculate`
|
||||
på samme måde som badeværelse og stue (Danfoss Ally-mønsteret):
|
||||
|
||||
```yaml
|
||||
# ---- Bryggers – generic_thermostat ----
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ true }}" # ingen vinduessensor endnu
|
||||
then:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: climate.bryggers
|
||||
data:
|
||||
hvac_mode: heat
|
||||
temperature: >
|
||||
{% set k = states('input_number.varme_komfort_bryggers') | float(20) %}
|
||||
{% if vacation %} {{ ferie_temp }}
|
||||
{% elif night %} {{ [k - nat_sænk, 15] | max }}
|
||||
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
|
||||
{% else %} {{ k }}
|
||||
{% endif %}
|
||||
|
||||
# ---- Køkken – generic_thermostat ----
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ true }}"
|
||||
then:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: climate.kokken
|
||||
data:
|
||||
hvac_mode: heat
|
||||
temperature: >
|
||||
{% set k = states('input_number.varme_komfort_kokken') | float(20) %}
|
||||
{% if vacation %} {{ ferie_temp }}
|
||||
{% elif night %} {{ [k - nat_sænk, 15] | max }}
|
||||
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
|
||||
{% else %} {{ k }}
|
||||
{% endif %}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Del 6: Verificering
|
||||
|
||||
Når alt er sat op:
|
||||
1. Gå til **Udviklerværktøjer → Tjenester**
|
||||
2. Kald `climate.set_temperature` på `climate.bryggers` med `temperature: 25`
|
||||
3. Lyt efter at aktuatoren klikker (kan høres eller mærkes) inden for 1-2 minutter
|
||||
4. Sæt tilbage til normal komforttemperatur
|
||||
|
||||
---
|
||||
|
||||
## Resumé: Hvad du køber
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| 2× Sonoff ZBMINI-L2 | ~260 kr |
|
||||
| 2× Sonoff SNZB-02D temp-sensor | ~200 kr |
|
||||
| **Total** | **~460 kr** |
|
||||
|
||||
Ingen elektriker, ingen nye kabler til aktuatorerne, ingen cloud-afhængighed.
|
||||
@@ -0,0 +1,91 @@
|
||||
# Zigbee husplan og netværksnoter
|
||||
|
||||
## Fysisk layout
|
||||
|
||||
```
|
||||
NORD/INDKØRSEL-SIDE
|
||||
══════════════════════════════════════════════════════════════════
|
||||
GARAGE
|
||||
[stik_fryser] ←── fjern ende (mod nord)
|
||||
|
||||
[garageport sensor] [stik_indkørsel] ←── tæt ende (mod kontor/syd)
|
||||
══════════════ GARAGEMUR (beton - dæmper signal markant) ══════════
|
||||
[stik_bryggers] [køkken] [forgang] [stik_lillebad] [stik_kontor]
|
||||
↑ indkørslen løber langs denne side (bryggers → køkken → forgang → lille bad → badeværelse → kontor)
|
||||
|
||||
══════════════════════════════════════════════════════════════════
|
||||
[badeværelse] [stik_bad]
|
||||
[stik_sonos_stue] [stik_quooker] [stue]
|
||||
[stik_daniel] (Daniels værelse - nabo til Andreas og over for bad)
|
||||
[stik_soveværelse] (nabo til Daniel og kontor)
|
||||
[stik_andreas] (Andreas værelse)
|
||||
[stik_alrum]
|
||||
SYD/STUE-SIDE
|
||||
|
||||
KOORDINATOR: Sonoff ZBDongle-E sidder på loftet over stue/Andreas-siden
|
||||
```
|
||||
|
||||
## Zigbee enheder
|
||||
|
||||
| Enhed | Type | Placering |
|
||||
|-------|------|-----------|
|
||||
| SONOFF ZBDongle-E | Coordinator | Loft over stue/Andreas |
|
||||
| stik_indkørsel | Router (TS011F) | Garage, tæt ende mod kontor |
|
||||
| stik_fryser | Router (TS011F) | Garage, fjern ende mod nord |
|
||||
| stik_kontor | Router (TS011F) | Kontor |
|
||||
| stik_bryggers | Router (TS011F) | Bryggers |
|
||||
| stik_lillebad | Router (TS011F) | Lille bad |
|
||||
| stik_bad | Router (TS011F) | Badeværelse |
|
||||
| stik_daniel | Router (TS011F) | Daniels værelse |
|
||||
| stik_soveværelse | Router (TS011F) | Soveværelse |
|
||||
| stik_andreas | Router (TS011F) | Andreas' værelse |
|
||||
| stik_alrum | Router (TS011F) | Alrum |
|
||||
| stik_sonos_stue | Router (TS011F) | Stue (Sonos) |
|
||||
| stik_quooker | Router (TS011F) | Køkken (Quooker) |
|
||||
| garageport | EndDevice (3RDTS01056Z) | Garage, tæt ende - tiltssensor på garageport |
|
||||
| badevarelse | EndDevice | Badeværelse |
|
||||
| stue | EndDevice | Stue |
|
||||
| temp_bryggers | EndDevice | Bryggers (temperatursensor) |
|
||||
| temp_køkken | EndDevice | Køkken (temperatursensor) |
|
||||
| LUMI magnetsensorer (×6) | EndDevice | Spredt i huset |
|
||||
|
||||
## LQI-målinger over tid
|
||||
|
||||
| Enhed | 18/5 (morgen) | 18/5 (aften) | 20/5 | Bemærkning |
|
||||
|-------|--------------|-------------|------|------------|
|
||||
| stik_alrum | 184–192 | 188–192 | 184 | Stærk, tæt på koordinator |
|
||||
| stik_andreas | 184–192 | 188–192 | 184 | Stærk, tæt på koordinator |
|
||||
| stik_soveværelse | 76–192 | 76–188 | 84 | Svingende — route-afhængig |
|
||||
| stik_quooker | 144–152 | 124–148 | 144 | God |
|
||||
| stik_sonos_stue | 108–152 | 108–152 | 148 | God |
|
||||
| stik_lillebad | 112–136 | 112–136 | 144 | OK–God |
|
||||
| stik_daniel | — | 100–120 | 92 | OK |
|
||||
| stik_bryggers | 100–132 | 100–132 | 108 | OK |
|
||||
| stik_bad | 40–104 | 96–144 | 144 | Forbedret |
|
||||
| stik_kontor | 52–96 | 72–96 | 96 | Forbedret |
|
||||
| stik_fryser | 56–84 | 56–84 | 84 | Forbedret |
|
||||
| stik_indkørsel | 44–80 | 56–124 | 84 | OK efter genstart |
|
||||
| garageport sensor | 40–92 | 52–92 | 84 | Bedste måling! |
|
||||
| badevarelse | 108–136 | 108–136 | 144 | God |
|
||||
| stue | 84–116 | 84–116 | 112 | OK |
|
||||
| temp_bryggers | — | — | 148 | Ny 20/5 |
|
||||
| temp_køkken | — | — | 152 | Ny 20/5 |
|
||||
|
||||
## Kendte problemer
|
||||
|
||||
- **Garagemuren** dæmper signalet markant — alle enheder bag muren har LQI 40–80
|
||||
- **Garageport-sensoren** er tæt på grænsen og har tidligere været unavailable
|
||||
- Koordinatoren sidder i den modsatte ende af huset fra garagen
|
||||
|
||||
## Optimeringforslag
|
||||
|
||||
1. **Flyt koordinatoren til midten** (forgang/køkken-loftet) — størst effekt, kræver blot USB-forlænger
|
||||
2. **Tilsæt router i forgang/gang** tæt på garagemur — bedre mellemled til garagen
|
||||
3. stik_fryser er acceptabelt svag hvis fryseren blot er til strømmåling
|
||||
|
||||
## Entiteter der styrer indkørselslys
|
||||
|
||||
- `switch.stik_indkorsel` — Zigbee plug (erstattede `light.indkorsel_plug` fra Hue, maj 2026)
|
||||
- `light.indkorsel_2` — Hue gruppe (garage venstre + højre + bryggersdør)
|
||||
- `scene.indkorsel_bright` / `scene.indkorsel_dimmed` — Hue scener
|
||||
- Automationer: `lysindkorsel.yaml`, `presence_simulation.yaml`, `andreas_kommer_hjem_taend_lys.yaml`
|
||||
@@ -9,6 +9,13 @@
|
||||
{% set last = state_attr('automation.ai_overvagning', 'last_triggered') %}
|
||||
{% set someone_home = is_state('binary_sensor.family_presence', 'on') %}
|
||||
{{ not someone_home or last is none or (now() - last).total_seconds() > 900 }}
|
||||
- condition: not
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state:
|
||||
- cleaning
|
||||
- returning
|
||||
actions:
|
||||
- action: script.overvaagning
|
||||
metadata: {}
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_1782
|
||||
@@ -31,6 +35,8 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_445
|
||||
@@ -58,6 +64,8 @@
|
||||
value_template: '{{ now().date() | string != "2022-12-24" }}'
|
||||
- condition: template
|
||||
value_template: '{{ now().date() | string != "2022-12-31" }}'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_1874
|
||||
@@ -78,6 +86,8 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_377
|
||||
@@ -103,6 +113,8 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_1894
|
||||
@@ -128,6 +140,8 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_2273
|
||||
@@ -155,6 +169,8 @@
|
||||
value_template: '{{ now().date() | string != "2022-12-24" }}'
|
||||
- condition: template
|
||||
value_template: '{{ now().date() | string != "2022-12-31" }}'
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_3471
|
||||
@@ -177,6 +193,10 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_298
|
||||
@@ -194,27 +214,3 @@
|
||||
- service: homeassistant.turn_off
|
||||
entity_id: switch.sonos_alarm_298
|
||||
|
||||
- alias: 'Turn on alarms Badeværelse Afsted'
|
||||
trigger:
|
||||
platform: time
|
||||
at: '20:07:10'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'on'
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: switch.sonos_alarm_1899
|
||||
|
||||
|
||||
- alias: 'Turn off alarms Badeværelse Afsted'
|
||||
trigger:
|
||||
platform: time
|
||||
at: '20:06:20'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: 'off'
|
||||
action:
|
||||
- service: homeassistant.turn_off
|
||||
entity_id: switch.sonos_alarm_1899
|
||||
|
||||
@@ -29,10 +29,13 @@
|
||||
|
||||
action:
|
||||
- variables:
|
||||
lights:
|
||||
- light.indkorsel_2
|
||||
- light.extended_color_light_1
|
||||
- light.garage
|
||||
lights: >
|
||||
{% set base = ['light.indkorsel_2', 'light.garage'] %}
|
||||
{% if now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 %}
|
||||
{{ (base + ['light.extended_color_light_1']) | list }}
|
||||
{% else %}
|
||||
{{ base }}
|
||||
{% endif %}
|
||||
|
||||
lights_to_turn_on: >
|
||||
{{ lights | select('is_state','off') | list }}
|
||||
@@ -45,9 +48,17 @@
|
||||
target:
|
||||
entity_id: "{{ lights_to_turn_on }}"
|
||||
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- delay: "00:10:00"
|
||||
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: "{{ lights_to_turn_on }}"
|
||||
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
|
||||
@@ -34,7 +34,10 @@
|
||||
- condition: trigger
|
||||
id: open_garage
|
||||
sequence:
|
||||
- service: cover.open_cover
|
||||
- condition: state
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "off"
|
||||
- service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
|
||||
@@ -42,7 +45,10 @@
|
||||
- condition: trigger
|
||||
id: close_garage
|
||||
sequence:
|
||||
- service: cover.close_cover
|
||||
- condition: state
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
- service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
platform: state
|
||||
entity_id: binary_sensor.indkorsel_sensor_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: not
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state:
|
||||
- cleaning
|
||||
- returning
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
|
||||
@@ -27,7 +27,9 @@
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state: "cleaning"
|
||||
state:
|
||||
- cleaning
|
||||
- returning
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
|
||||
@@ -1,430 +0,0 @@
|
||||
# logik
|
||||
# hvis om dagen, så høj lydstyrke. Gem sonos-config. udkoble alle. Ding-dong i lille bad og hund der gør i alrum. Blink med lamperne.
|
||||
# send push besked til telefoner
|
||||
|
||||
- id: '1672487404009'
|
||||
alias: Ringklokke bagdør
|
||||
description: Når det ringer på bagdør, send besked, lav lyd og blink
|
||||
trigger:
|
||||
- platform: mqtt
|
||||
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
|
||||
condition: []
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "S" }}'
|
||||
sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren old
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren old
|
||||
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell-shortened-100308.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell-shortened-100308.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: before
|
||||
snapshot_entities:
|
||||
- light.pendle1
|
||||
- service: light.turn_on
|
||||
data:
|
||||
entity_id: light.pendle1
|
||||
brightness: 255
|
||||
rgb_color: [255, 0, 0]
|
||||
flash: long
|
||||
- delay: 2
|
||||
- service: scene.turn_on
|
||||
entity_id: scene.before
|
||||
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på bagdøren
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: before
|
||||
snapshot_entities:
|
||||
- light.pendle1
|
||||
- service: light.turn_on
|
||||
data:
|
||||
entity_id: light.pendle1
|
||||
brightness: 255
|
||||
rgb_color: [255, 0, 0]
|
||||
flash: long
|
||||
- delay: 2
|
||||
- service: scene.turn_on
|
||||
entity_id: scene.before
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SS" }}'
|
||||
sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - doublepress
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - doublepress
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på bagdøren
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SSS" }}'
|
||||
sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - triple-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - triple-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "L" }}'
|
||||
sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - long-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren - long-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
mode: single
|
||||
trigger_variables:
|
||||
button_id: 98CDAC1E5F42
|
||||
@@ -10,6 +10,32 @@
|
||||
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
|
||||
condition: []
|
||||
action:
|
||||
# Gem gammel og ny event_cnt
|
||||
- variables:
|
||||
new_cnt: "{{ trigger.payload_json.event_cnt | int(0) }}"
|
||||
old_cnt: "{{ states('input_number.shelly_bagdor_event_cnt') | int(-1) }}"
|
||||
# Opdater counter ALTID (ogsaa ved wake-up)
|
||||
- service: input_number.set_value
|
||||
target:
|
||||
entity_id: input_number.shelly_bagdor_event_cnt
|
||||
data:
|
||||
value: "{{ new_cnt }}"
|
||||
# Log ALLE MQTT events (ogsaa filtrerede) til logbog for debugging
|
||||
- service: logbook.log
|
||||
data:
|
||||
name: "Shelly bagdoer"
|
||||
message: >-
|
||||
MQTT event={{ trigger.payload_json.event }}
|
||||
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
||||
battery={{ trigger.payload_json.battery | default('?') }}%
|
||||
entity_id: input_number.shelly_bagdor_event_cnt
|
||||
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
|
||||
- condition: template
|
||||
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
|
||||
# Bloker ringeklokke om natten (22-06)
|
||||
- condition: time
|
||||
after: '06:00:00'
|
||||
before: '22:00:00'
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
@@ -27,299 +53,124 @@
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SS" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: german-shephard.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på bagdøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - doublepress
|
||||
message: Det ringer på bagdøren - doublepress
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - doublepress
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.andreas
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.daniel
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på bagdøren
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
message: Det ringer på bagdøren - doublepress
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SSS" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: dog-barking-2-bullmastiff.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på bagdøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - triple-press
|
||||
message: Det ringer på bagdøren - triple-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - triple-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på bagdøren
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
message: Det ringer på bagdøren - triple-press
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "L" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: two-tone-chime.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på bagdøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - long-press
|
||||
message: Det ringer på bagdøren - long-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på bagdøren (2) - long-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
message: Det ringer på bagdøren - long-press
|
||||
|
||||
mode: single
|
||||
trigger_variables:
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
- id: 'shelly_doorbell_low_battery'
|
||||
alias: Ringklokke lavt batteri
|
||||
description: Notifikation når en Shelly doerklokke-knap har under 30% batteri
|
||||
trigger:
|
||||
- platform: numeric_state
|
||||
entity_id:
|
||||
- sensor.shelly_bagdoer_batteri
|
||||
- sensor.shelly_fordoer_batteri
|
||||
below: 30
|
||||
for:
|
||||
minutes: 5
|
||||
condition: []
|
||||
action:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Lavt batteri - dørklokke"
|
||||
message: >-
|
||||
{{ trigger.to_state.attributes.friendly_name }}
|
||||
er på {{ trigger.to_state.state }}%.
|
||||
Oplad snart.
|
||||
mode: single
|
||||
@@ -11,379 +11,173 @@
|
||||
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
|
||||
condition: []
|
||||
action:
|
||||
# Gem gammel og ny event_cnt
|
||||
- variables:
|
||||
new_cnt: "{{ trigger.payload_json.event_cnt | int(0) }}"
|
||||
old_cnt: "{{ states('input_number.shelly_fordor_event_cnt') | int(-1) }}"
|
||||
# Opdater counter ALTID (ogsaa ved wake-up)
|
||||
- service: input_number.set_value
|
||||
target:
|
||||
entity_id: input_number.shelly_fordor_event_cnt
|
||||
data:
|
||||
value: "{{ new_cnt }}"
|
||||
# Log ALLE MQTT events (ogsaa filtrerede) til logbog for debugging
|
||||
- service: logbook.log
|
||||
data:
|
||||
name: "Shelly fordoer"
|
||||
message: >-
|
||||
MQTT event={{ trigger.payload_json.event }}
|
||||
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
||||
battery={{ trigger.payload_json.battery | default('?') }}%
|
||||
entity_id: input_number.shelly_fordor_event_cnt
|
||||
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
|
||||
- condition: template
|
||||
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
|
||||
# Bloker ringeklokke om natten (22-06)
|
||||
- condition: time
|
||||
after: '06:00:00'
|
||||
before: '22:00:00'
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "S" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
lille_bad_lydfil: "{{ 'Halloween-doorbell.mp3' if (now().hour >= 20 or now().hour < 6) else 'doorbell.mp3' }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: "{{ lille_bad_lydfil }}"
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på fordøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på fordøren
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på fordøren
|
||||
- sequence:
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: before
|
||||
snapshot_entities:
|
||||
- light.pendle1
|
||||
- service: light.turn_on
|
||||
data:
|
||||
entity_id: light.pendle1
|
||||
brightness: 255
|
||||
rgb_color: [255, 0, 0]
|
||||
flash: long
|
||||
- delay: 2
|
||||
- service: scene.turn_on
|
||||
entity_id: scene.before
|
||||
- sequence:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states('sensor.forgang_sensor_illuminance') | int < 60 }}
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
after: "06:00:00"
|
||||
before: "23:59:00"
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/Halloween-doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: Halloween-doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: before
|
||||
snapshot_entities:
|
||||
- light.pendle1
|
||||
- service: light.turn_on
|
||||
data:
|
||||
entity_id: light.pendle1
|
||||
brightness: 255
|
||||
rgb_color: [255, 0, 0]
|
||||
flash: long
|
||||
- delay: 2
|
||||
- service: scene.turn_on
|
||||
entity_id: scene.before
|
||||
|
||||
target:
|
||||
entity_id: scene.forgang_bright
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/doorbell.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: doorbell.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: before
|
||||
snapshot_entities:
|
||||
- light.pendle1
|
||||
- service: light.turn_on
|
||||
data:
|
||||
entity_id: light.pendle1
|
||||
brightness: 255
|
||||
rgb_color: [255, 0, 0]
|
||||
flash: long
|
||||
- delay: 2
|
||||
- service: scene.turn_on
|
||||
entity_id: scene.before
|
||||
target:
|
||||
entity_id: scene.forgang_dimmed
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SS" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: german-shephard.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på fordøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på fordøren - doublepress
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på fordøren - doublepress
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/german-shephard.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: german-shephard.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "SSS" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: dog-barking-2-bullmastiff.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på fordøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på fordøren - triple-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på fordøren - triple-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: dog-barking-2-bullmastiff.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ trigger.payload_json.event == "L" }}'
|
||||
sequence:
|
||||
- parallel:
|
||||
- sequence:
|
||||
- variables:
|
||||
lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
|
||||
- service: script.spil_paa_lille_bad
|
||||
data:
|
||||
lydfil: two-tone-chime.mp3
|
||||
volumen: "{{ lille_bad_volumen }}"
|
||||
- sequence:
|
||||
- service: tts.speak
|
||||
target:
|
||||
entity_id: tts.google_ai_tts
|
||||
data:
|
||||
media_player_entity_id: media_player.alrum
|
||||
message: "Der er nogen der ringer på fordøren"
|
||||
- sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: Det ringer på fordøren - long-press
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
message: Det ringer på fordøren - long-press
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
before: 06:00:00
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
sequence:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.5
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
default:
|
||||
- service: media_player.volume_set
|
||||
data:
|
||||
volume_level: 0.8
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
data:
|
||||
media_content_id: media-source://media_source/local/two-tone-chime.mp3
|
||||
media_content_type: audio/mpeg
|
||||
metadata:
|
||||
title: two-tone-chime.mp3
|
||||
thumbnail:
|
||||
media_class: music
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://media_source
|
||||
|
||||
- service: media_player.play_media
|
||||
target:
|
||||
entity_id: media_player.alrum
|
||||
data:
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
media_content_type: provider
|
||||
metadata:
|
||||
title: 'der er nogen der ringer på
|
||||
|
||||
'
|
||||
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
|
||||
media_class: app
|
||||
children_media_class:
|
||||
navigateIds:
|
||||
- {}
|
||||
- media_content_type: app
|
||||
media_content_id: media-source://tts
|
||||
- media_content_type: provider
|
||||
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
|
||||
|
||||
mode: single
|
||||
trigger_variables:
|
||||
|
||||
@@ -4,16 +4,16 @@
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: cover.anne
|
||||
to: "open"
|
||||
entity_id: binary_sensor.garageport
|
||||
to: "on"
|
||||
|
||||
- platform: time
|
||||
at: "21:00:00"
|
||||
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: cover.anne
|
||||
state: "open"
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
|
||||
action:
|
||||
- delay: "00:05:00"
|
||||
@@ -21,8 +21,8 @@
|
||||
- repeat:
|
||||
while:
|
||||
- condition: state
|
||||
entity_id: cover.anne
|
||||
state: "open"
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
|
||||
sequence:
|
||||
|
||||
@@ -51,8 +51,8 @@
|
||||
action: IGNORE_GARAGE_ANNE
|
||||
|
||||
- platform: state
|
||||
entity_id: cover.anne
|
||||
to: "closed"
|
||||
entity_id: binary_sensor.garageport
|
||||
to: "off"
|
||||
|
||||
timeout: "00:30:00"
|
||||
|
||||
@@ -62,7 +62,10 @@
|
||||
- condition: template
|
||||
value_template: "{{ wait.trigger.event.data.action == 'CLOSE_GARAGE_ANNE' }}"
|
||||
sequence:
|
||||
- service: cover.close_cover
|
||||
- condition: state
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
- service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
- stop: "Garage lukket via notifikation"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
data:
|
||||
group_members:
|
||||
- media_player.badevaerelse
|
||||
- media_player.lille_badevaerelse
|
||||
- media_player.sovevaerelse
|
||||
- media_player.stue
|
||||
- media_player.alrum
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
- alias: Infrastruktur - MQTT broker nede efter opstart
|
||||
id: infrastructure_mqtt_broker_down_after_start
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
|
||||
action:
|
||||
- delay: "00:03:00"
|
||||
- condition: state
|
||||
entity_id: binary_sensor.mqtt_broker_tcp
|
||||
state: "off"
|
||||
- service: persistent_notification.create
|
||||
data:
|
||||
title: "MQTT broker er nede"
|
||||
message: >-
|
||||
MQTT-brokeren svarer ikke efter Home Assistant-opstart.
|
||||
Dørklokker og andre MQTT-afhængige funktioner virker derfor ikke.
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Home Assistant: MQTT broker nede"
|
||||
message: "MQTT-brokeren svarer ikke efter opstart. Tjek Synology-containere."
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
title: "Home Assistant: MQTT broker nede"
|
||||
message: "MQTT-brokeren svarer ikke efter opstart. Tjek Synology-containere."
|
||||
|
||||
mode: single
|
||||
|
||||
- alias: Infrastruktur - MQTT broker gik ned
|
||||
id: infrastructure_mqtt_broker_down_runtime
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.mqtt_broker_tcp
|
||||
to: "off"
|
||||
for: "00:02:00"
|
||||
|
||||
action:
|
||||
- service: persistent_notification.create
|
||||
data:
|
||||
title: "MQTT broker er nede"
|
||||
message: >-
|
||||
MQTT-brokeren har været utilgængelig i mindst 2 minutter.
|
||||
Dørklokker og andre MQTT-afhængige funktioner virker derfor ikke.
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Home Assistant: MQTT broker nede"
|
||||
message: "MQTT-brokeren har været nede i mindst 2 minutter. Tjek Synology-containere."
|
||||
- service: notify.mobile_app_annes_iphone_14_pro
|
||||
data:
|
||||
title: "Home Assistant: MQTT broker nede"
|
||||
message: "MQTT-brokeren har været nede i mindst 2 minutter. Tjek Synology-containere."
|
||||
|
||||
mode: single
|
||||
@@ -10,7 +10,7 @@
|
||||
action:
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: all
|
||||
entity_id: light.indendorslamper
|
||||
|
||||
- service: media_player.media_stop
|
||||
target:
|
||||
@@ -23,3 +23,4 @@
|
||||
- media_player.badevaerelse
|
||||
- media_player.sovevaerelse
|
||||
- media_player.lille_badevaerelse
|
||||
- media_player.kontor
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
- condition: state # from sunset until sunrise
|
||||
entity_id: sun.sun
|
||||
state: 'below_horizon'
|
||||
- condition: template # Vintersæson uge 42-8
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
action:
|
||||
- service: light.turn_on
|
||||
data:
|
||||
@@ -19,6 +21,9 @@
|
||||
trigger:
|
||||
platform: sun
|
||||
event: sunrise
|
||||
condition:
|
||||
- condition: template # Vintersæson uge 42-8
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
action:
|
||||
- service: light.turn_off
|
||||
data:
|
||||
@@ -31,6 +36,8 @@
|
||||
condition:
|
||||
- condition: time
|
||||
before: '21:30:00'
|
||||
- condition: template # Vintersæson uge 42-8
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
action:
|
||||
- service: light.turn_on
|
||||
data:
|
||||
@@ -40,6 +47,9 @@
|
||||
trigger:
|
||||
platform: time
|
||||
at: "22:00:00"
|
||||
condition:
|
||||
- condition: template # Vintersæson uge 42-8
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
action:
|
||||
- service: light.turn_off
|
||||
data:
|
||||
|
||||
@@ -40,6 +40,10 @@
|
||||
{{ 1000 <= t <= 2030 }}
|
||||
{% endif %}
|
||||
|
||||
# Ikke syg
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
|
||||
|
||||
sequence:
|
||||
|
||||
- service: light.turn_on
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
- id: badevaerelse_startup_sluk
|
||||
alias: Badeværelse lys sluk ved HA opstart
|
||||
description: >
|
||||
Slukker badeværelsets lys ved genstart hvis bevægelsessensoren er inaktiv.
|
||||
Sikrer mod lys der sidder tændt efter strømudfald eller HA-genstart.
|
||||
mode: single
|
||||
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
|
||||
action:
|
||||
- delay:
|
||||
seconds: 30
|
||||
- condition: state
|
||||
entity_id: binary_sensor.badevaerelse_bevaegelse
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
area_id: badevaerelse
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
|
||||
- id: badevaerelse_motion_lys
|
||||
alias: Badeværelse lys via bevægelse
|
||||
mode: restart
|
||||
@@ -7,6 +31,12 @@
|
||||
entity_id: binary_sensor.badevaerelse_bevaegelse
|
||||
to: "on"
|
||||
|
||||
condition:
|
||||
# Spring over hvis manuel tilstand er aktiv – Hue-knap styrer lyset
|
||||
- condition: state
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
state: "off"
|
||||
|
||||
action:
|
||||
- choose:
|
||||
# Arbejdsdag dagtid (06:00–22:00)
|
||||
@@ -49,10 +79,104 @@
|
||||
- platform: state
|
||||
entity_id: binary_sensor.badevaerelse_bevaegelse
|
||||
to: "off"
|
||||
for:
|
||||
minutes: 3 # Standard nat-timeout, kan ændres til 10 for dag, osv.
|
||||
|
||||
variables:
|
||||
is_dag: >
|
||||
{% set t = now().strftime('%H%M') | int %}
|
||||
{% if is_state('binary_sensor.arbejdsdag', 'on') %}
|
||||
{{ 600 <= t < 2200 }}
|
||||
{% else %}
|
||||
{{ 800 <= t < 2200 }}
|
||||
{% endif %}
|
||||
|
||||
action:
|
||||
- delay:
|
||||
minutes: >
|
||||
{% if is_state('input_boolean.badevaerelse_manuel_tilstand', 'on') %}
|
||||
10
|
||||
{% elif is_dag %}
|
||||
{{ states('input_number.badevaerelse_timeout_day') | int }}
|
||||
{% else %}
|
||||
{{ states('input_number.badevaerelse_timeout_night') | int }}
|
||||
{% endif %}
|
||||
- condition: state
|
||||
entity_id: binary_sensor.badevaerelse_bevaegelse
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
area_id: badevaerelse
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
|
||||
- id: badevaerelse_hue_knap
|
||||
alias: Badeværelse Hue knap
|
||||
description: >
|
||||
Hue Tap Switch sætter manuel tilstand og tænder valgt scene.
|
||||
Bevægelses-automatik springes over så længe manuel tilstand er aktiv.
|
||||
Knap 4 slukker lyset og nulstiller til automatisk styring.
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: event.hue_tap_switch_1_button_1
|
||||
id: knap_1
|
||||
- platform: state
|
||||
entity_id: event.hue_tap_switch_1_button_2
|
||||
id: knap_2
|
||||
- platform: state
|
||||
entity_id: event.hue_tap_switch_1_button_3
|
||||
id: knap_3
|
||||
- platform: state
|
||||
entity_id: event.hue_tap_switch_1_button_4
|
||||
id: knap_4
|
||||
|
||||
action:
|
||||
- choose:
|
||||
# Knap 1 – Nat/dæmpet lys
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: knap_1
|
||||
sequence:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.badevaerelse_nat_2_lys
|
||||
|
||||
# Knap 2 – Fuld lys (klar til brug)
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: knap_2
|
||||
sequence:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.badevaerelse_klar
|
||||
|
||||
# Knap 3 – Blomstrende forår (medium)
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: knap_3
|
||||
sequence:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.badevaerelse_blomstrende_forar
|
||||
|
||||
# Knap 4 – Sluk lys + nulstil til automatisk
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: knap_4
|
||||
sequence:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.badevaerelse_manuel_tilstand
|
||||
- service: light.turn_off
|
||||
target:
|
||||
area_id: badevaerelse
|
||||
|
||||
@@ -1,94 +1,60 @@
|
||||
# - alias: 'Lys Daniel dag - arbejdsdag - sunrise'
|
||||
# trigger:
|
||||
# platform: time
|
||||
# at: '06:00:00'
|
||||
# condition:
|
||||
# - condition: state
|
||||
# entity_id: binary_sensor.arbejdsdag
|
||||
# state: 'on'
|
||||
# action:
|
||||
# - service: script.sunrise
|
||||
- id: daniel_motion_lys
|
||||
alias: Daniel lys via bevaegelse
|
||||
mode: restart
|
||||
|
||||
|
||||
- alias: 'Lys Daniel dag - arbejdsdag'
|
||||
trigger:
|
||||
platform: state
|
||||
- platform: state
|
||||
entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.hue_motion_sensor_2_illuminance
|
||||
below: 90
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: time
|
||||
after: '06:30:00'
|
||||
before: '19:30:00'
|
||||
to: "on"
|
||||
id: motion_on
|
||||
|
||||
- platform: state
|
||||
entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
to: "off"
|
||||
id: motion_off
|
||||
|
||||
variables:
|
||||
lux_limit: "{{ states('input_number.daniel_lux_threshold') | int }}"
|
||||
brightness: "{{ states('input_number.daniel_brightness') | int }}"
|
||||
timeout: "{{ states('input_number.daniel_timeout') | int }}"
|
||||
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
- choose:
|
||||
|
||||
# Motion on: taend lys hvis lux lavt og indenfor tidsvindue
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_on
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states('sensor.hue_motion_sensor_2_illuminance') | int < lux_limit }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set t = now().strftime('%H%M') | int %}
|
||||
{% if is_state('binary_sensor.arbejdsdag', 'on') %}
|
||||
{{ 630 <= t < 1930 }}
|
||||
{% else %}
|
||||
{{ 1000 <= t < 1945 }}
|
||||
{% endif %}
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: light.daniels_vaerelse
|
||||
data:
|
||||
brightness_pct: 100
|
||||
brightness_pct: "{{ brightness }}"
|
||||
|
||||
- alias: 'Lys Daniel dag - ikke arbejdsdag'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.hue_motion_sensor_2_illuminance
|
||||
below: 90
|
||||
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_off
|
||||
sequence:
|
||||
- delay:
|
||||
minutes: "{{ timeout }}"
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'off'
|
||||
- condition: time
|
||||
after: '10:00:00'
|
||||
before: '19:45:00'
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.daniels_vaerelse
|
||||
data:
|
||||
brightness_pct: 100
|
||||
|
||||
# - alias: 'Lys Daniel aften'
|
||||
# trigger:
|
||||
# platform: state
|
||||
# entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
# to: 'on'
|
||||
# condition:
|
||||
# - condition: numeric_state
|
||||
# entity_id: sensor.hue_motion_sensor_2_illuminance
|
||||
# below: 90
|
||||
# - condition: time
|
||||
# after: '20:00:01'
|
||||
# before: '21:00:00'
|
||||
# action:
|
||||
# - service: homeassistant.turn_on
|
||||
# target:
|
||||
# entity_id: light.daniels_vaerelse
|
||||
# data:
|
||||
# brightness_pct: 50
|
||||
|
||||
|
||||
|
||||
- alias: 'Sluk lys i Daniel'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.hue_motion_sensor_2_motion
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 10
|
||||
condition:
|
||||
- condition: time
|
||||
after: '05:00:00'
|
||||
before: '22:00:00'
|
||||
action:
|
||||
- service: homeassistant.turn_off
|
||||
data:
|
||||
entity_id:
|
||||
- light.daniels_vaerelse
|
||||
|
||||
|
||||
@@ -1,171 +1,68 @@
|
||||
- alias: 'Lys i gang - arbejdsdag - dag'
|
||||
- id: gang_motion_lys
|
||||
alias: Gang lys via bevægelse
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
platform: state
|
||||
- platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.gang_sensor_illuminance
|
||||
below: '70'
|
||||
- condition: time
|
||||
before: '21:30:00'
|
||||
- condition: time
|
||||
after: '06:30:00'
|
||||
to: "on"
|
||||
id: motion_on
|
||||
|
||||
- platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: "off"
|
||||
id: motion_off
|
||||
|
||||
variables:
|
||||
lux_limit: "{{ states('input_number.gang_lux_threshold') | int }}"
|
||||
is_dag: >
|
||||
{% set t = now().strftime('%H%M') | int %}
|
||||
{% if is_state('binary_sensor.arbejdsdag', 'on') %}
|
||||
{{ 630 <= t < 2130 }}
|
||||
{% else %}
|
||||
{{ 800 <= t < 2200 }}
|
||||
{% endif %}
|
||||
|
||||
action:
|
||||
- choose:
|
||||
|
||||
# Motion on - dag: taend bright scene hvis lux er lavt nok
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_on
|
||||
- condition: template
|
||||
value_template: "{{ is_dag }}"
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states('sensor.gang_sensor_illuminance') | int < lux_limit }}
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.gang_bright
|
||||
# brightness: 255
|
||||
# color_temp: 396
|
||||
|
||||
- alias: 'Sluk Lys i gang - arbejdsdag - dag'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 3
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: time
|
||||
after: '06:30:10'
|
||||
- condition: time
|
||||
before: '21:30:00'
|
||||
action:
|
||||
service: light.turn_off
|
||||
data:
|
||||
entity_id: light.gang_2
|
||||
|
||||
- alias: 'Lys i gang - ikke arbejdsdag - dag'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'off'
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.gang_sensor_illuminance
|
||||
below: 70
|
||||
- condition: time
|
||||
after: '08:00:00'
|
||||
- condition: time
|
||||
before: '22:00:00'
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.gang_bright
|
||||
# brightness: 255
|
||||
# color_temp: 396
|
||||
|
||||
- alias: 'Sluk Lys i gang - ikke arbejdsdag - dag'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 3
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'off'
|
||||
- condition: time
|
||||
after: '08:00:10'
|
||||
- condition: time
|
||||
before: '22:00:00'
|
||||
action:
|
||||
service: light.turn_off
|
||||
target:
|
||||
entity_id: light.gang
|
||||
entity_id: scene.gang_bright
|
||||
|
||||
########## NIGHT
|
||||
|
||||
- alias: 'Lys i gang - arbejdsdag - nat'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.gang_sensor_illuminance
|
||||
below: '70'
|
||||
- condition: time
|
||||
before: '06:30:00'
|
||||
after: '21:30:00'
|
||||
action:
|
||||
# Motion on - nat: taend daempet scene (ingen lux-check)
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_on
|
||||
- condition: template
|
||||
value_template: "{{ not is_dag }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.gang_daempet_nat
|
||||
# brightness_pct: 1
|
||||
# color_temp: 396
|
||||
|
||||
- alias: 'Sluk Lys i gang - arbejdsdag - nat'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 1
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: time
|
||||
after: '21:30:10'
|
||||
before: '06:30:00'
|
||||
action:
|
||||
service: light.turn_off
|
||||
target:
|
||||
entity_id: light.gang
|
||||
|
||||
- alias: 'Lys i gang - ikke arbejdsdag - nat'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'on'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'off'
|
||||
# - condition: numeric_state
|
||||
# entity_id: sensor.gang_sensor_light_level
|
||||
# below: '70'
|
||||
- condition: time
|
||||
after: '22:00:00'
|
||||
before: '08:00:00'
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.gang_daempet_nat
|
||||
# brightness_pct: 1
|
||||
# color_temp: 396
|
||||
|
||||
|
||||
- alias: 'Sluk Lys i gang - ikke arbejdsdag - nat'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 1
|
||||
condition:
|
||||
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_off
|
||||
sequence:
|
||||
- delay:
|
||||
minutes: >
|
||||
{{ states('input_number.gang_timeout_day') | int if is_dag
|
||||
else states('input_number.gang_timeout_night') | int }}
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'off'
|
||||
- condition: time
|
||||
after: '22:00:10'
|
||||
before: '08:00:00'
|
||||
action:
|
||||
entity_id: binary_sensor.gang_sensor_motion
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.gang
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
- alias: 'Lys Garage - tænd hvis garage åbner'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: cover.anne
|
||||
to: 'open'
|
||||
entity_id: binary_sensor.garageport
|
||||
to: 'on'
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
@@ -36,8 +36,8 @@
|
||||
- alias: 'Sluk lys garage 5 min efter lukning'
|
||||
trigger:
|
||||
platform: state
|
||||
entity_id: cover.anne
|
||||
to: 'closed'
|
||||
entity_id: binary_sensor.garageport
|
||||
to: 'off'
|
||||
for:
|
||||
minutes: 5
|
||||
action:
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
to: "on"
|
||||
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.kontor_belysningsstyrke
|
||||
below: 60
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states('sensor.kontor_belysningsstyrke') | int <
|
||||
states('input_number.kontor_lux_threshold') | int }}
|
||||
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
@@ -36,7 +37,8 @@
|
||||
- platform: state
|
||||
entity_id: binary_sensor.kontor_motion_bevaegelse
|
||||
to: "on"
|
||||
timeout: "00:10:00"
|
||||
timeout:
|
||||
minutes: "{{ states('input_number.kontor_timeout_day') | int }}"
|
||||
continue_on_timeout: true
|
||||
- condition: state
|
||||
entity_id: binary_sensor.kontor_motion_bevaegelse
|
||||
@@ -67,7 +69,8 @@
|
||||
- platform: state
|
||||
entity_id: binary_sensor.kontor_motion_bevaegelse
|
||||
to: "on"
|
||||
timeout: "00:05:00"
|
||||
timeout:
|
||||
minutes: "{{ states('input_number.kontor_timeout_night') | int }}"
|
||||
continue_on_timeout: true
|
||||
- condition: state
|
||||
entity_id: binary_sensor.kontor_motion_bevaegelse
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdag
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
action:
|
||||
- service: script.sunrise
|
||||
|
||||
@@ -25,6 +29,10 @@
|
||||
- condition: time
|
||||
after: '06:30:00'
|
||||
before: '20:00:00'
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
target:
|
||||
@@ -47,6 +55,10 @@
|
||||
- condition: time
|
||||
after: '10:00:00'
|
||||
before: '20:00:00'
|
||||
- condition: template
|
||||
value_template: >-
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
target:
|
||||
@@ -161,6 +173,9 @@
|
||||
- condition: time
|
||||
after: '06:30:00'
|
||||
before: '22:00:00'
|
||||
- condition: state
|
||||
entity_id: script.godnat_sovevaerelse
|
||||
state: 'off'
|
||||
action:
|
||||
- service: homeassistant.turn_off
|
||||
data:
|
||||
|
||||
@@ -1,31 +1,91 @@
|
||||
- id: stue_motion_lys
|
||||
alias: Stue lys via bevægelse
|
||||
alias: Stue lys via bevaegelse
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "on"
|
||||
id: motion_on
|
||||
|
||||
condition:
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.stue_belysningsstyrke
|
||||
below: 60
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "off"
|
||||
id: motion_off
|
||||
|
||||
- platform: state
|
||||
entity_id: media_player.samsung_s95ca_55_3
|
||||
to: "off"
|
||||
id: tv_off
|
||||
|
||||
variables:
|
||||
lux_limit: "{{ states('input_number.stue_lux_threshold') | int }}"
|
||||
dagperiode: >
|
||||
{% set t = now().strftime('%H%M') | int %}
|
||||
{% if 600 <= t < 1600 %}morgen
|
||||
{% elif 1600 <= t < 1900 %}eftermiddag
|
||||
{% elif 1900 <= t < 2100 %}aften_lys
|
||||
{% elif 2100 <= t %}aften
|
||||
{% else %}nat{% endif %}
|
||||
timeout_min: >
|
||||
{% set t = now().strftime('%H%M') | int %}
|
||||
{% if 600 <= t < 1600 %}
|
||||
{{ states('input_number.stue_timeout_morgen') | int }}
|
||||
{% elif 1600 <= t < 1900 %}
|
||||
{{ states('input_number.stue_timeout_eftermiddag') | int }}
|
||||
{% elif 1900 <= t < 2100 %}
|
||||
{{ states('input_number.stue_timeout_aften') | int }}
|
||||
{% elif 2100 <= t %}
|
||||
{{ states('input_number.stue_timeout_aften') | int }}
|
||||
{% else %}
|
||||
{{ states('input_number.stue_timeout_nat') | int }}
|
||||
{% endif %}
|
||||
|
||||
action:
|
||||
- choose:
|
||||
|
||||
# Motion on: taend lys hvis lux lavt
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: "06:00:00"
|
||||
before: "16:00:00"
|
||||
- condition: trigger
|
||||
id: motion_on
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ states('sensor.stue_belysningsstyrke') | int < lux_limit }}
|
||||
sequence:
|
||||
- choose:
|
||||
# Gæster: altid Annes favorit uanset tidspunkt
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: input_boolean.gaester
|
||||
state: "on"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.stue_annes_favorit
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ dagperiode == 'morgen' }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.stue_bright
|
||||
- conditions:
|
||||
- condition: time
|
||||
after: "16:00:00"
|
||||
before: "22:00:00"
|
||||
- condition: template
|
||||
value_template: "{{ dagperiode == 'eftermiddag' }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.stue_annes_favorit
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ dagperiode == 'aften_lys' }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.stue_annes_favorit
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ dagperiode == 'aften' }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
@@ -35,89 +95,38 @@
|
||||
target:
|
||||
entity_id: scene.stue_relax_minus_syd
|
||||
|
||||
- id: stue_motion_sluk_morgen
|
||||
alias: Sluk stue lys efter 60 min uden bevægelse om morgenen
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "off"
|
||||
|
||||
condition:
|
||||
- condition: time
|
||||
after: "06:00:00"
|
||||
before: "16:00:00"
|
||||
|
||||
action:
|
||||
- wait_for_trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "on"
|
||||
timeout: "01:00:00"
|
||||
continue_on_timeout: true
|
||||
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
|
||||
# Aften: springer over hvis TV er taendt (TV-off trigger haandterer det)
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_off
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ dagperiode not in ('aften','aften_lys') or
|
||||
is_state('media_player.samsung_s95ca_55_3', 'off') }}
|
||||
sequence:
|
||||
- delay:
|
||||
minutes: "{{ timeout_min }}"
|
||||
- condition: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
state: "off"
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ dagperiode not in ('aften','aften_lys') or
|
||||
is_state('media_player.samsung_s95ca_55_3', 'off') }}
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.livingroom
|
||||
|
||||
- id: stue_motion_sluk_eftermiddag_aften
|
||||
alias: Sluk stue lys efter 120 min uden bevægelse mellem 16 og 19
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "off"
|
||||
|
||||
condition:
|
||||
- condition: time
|
||||
after: "16:00:00"
|
||||
before: "19:00:00"
|
||||
|
||||
action:
|
||||
- wait_for_trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "on"
|
||||
timeout: "02:00:00"
|
||||
continue_on_timeout: true
|
||||
- condition: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.livingroom
|
||||
|
||||
- id: stue_motion_sluk_aften_tv
|
||||
alias: Sluk stue lys efter 10 min uden bevægelse når TV er slukket mellem 19 og 00
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "off"
|
||||
- platform: state
|
||||
entity_id: media_player.samsung_s95ca_55_3
|
||||
to: "off"
|
||||
|
||||
condition:
|
||||
- condition: time
|
||||
after: "19:00:00"
|
||||
before: "00:00:00"
|
||||
|
||||
action:
|
||||
- condition: state
|
||||
entity_id: media_player.samsung_s95ca_55_3
|
||||
state: "off"
|
||||
- wait_for_trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "on"
|
||||
timeout: "00:10:00"
|
||||
continue_on_timeout: true
|
||||
# TV slukket om aftenen: vent 10 min, sluk hvis ingen bevaegelse
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: tv_off
|
||||
- condition: template
|
||||
value_template: "{{ dagperiode in ('aften','aften_lys') }}"
|
||||
sequence:
|
||||
- delay:
|
||||
minutes: "{{ timeout_min }}"
|
||||
- condition: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
state: "off"
|
||||
@@ -127,31 +136,3 @@
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.livingroom
|
||||
|
||||
- id: stue_motion_sluk_nat
|
||||
alias: Sluk stue lys efter 30 min uden bevægelse om natten
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "off"
|
||||
|
||||
condition:
|
||||
- condition: time
|
||||
after: "00:00:00"
|
||||
before: "06:00:00"
|
||||
|
||||
action:
|
||||
- wait_for_trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
to: "on"
|
||||
timeout: "00:30:00"
|
||||
continue_on_timeout: true
|
||||
- condition: state
|
||||
entity_id: binary_sensor.stue_bevaegelse
|
||||
state: "off"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: light.livingroom
|
||||
@@ -16,6 +16,9 @@
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.indkorsel_bright
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- alias: 'Sluk lys indkørsel når der er lys nok'
|
||||
trigger:
|
||||
@@ -30,6 +33,9 @@
|
||||
- service: light.turn_off
|
||||
data:
|
||||
entity_id: light.indkorsel_2
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- alias: 'Tænd lys indkørsel aften'
|
||||
trigger:
|
||||
@@ -43,6 +49,9 @@
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.indkorsel_bright
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- alias: 'Sluk lys indkørsel aften'
|
||||
trigger:
|
||||
@@ -52,6 +61,9 @@
|
||||
- service: light.turn_off
|
||||
data:
|
||||
entity_id: light.indkorsel_2
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
|
||||
- alias: 'Tænd lys indkørsel ved bevægelse'
|
||||
@@ -78,6 +90,9 @@
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
entity_id: scene.indkorsel_bright
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- alias: 'Sluk lys indkørsel 15 min efter bevægelse'
|
||||
trigger:
|
||||
@@ -97,8 +112,11 @@
|
||||
# entity_id: sun.sun
|
||||
# state: below_horizon
|
||||
action:
|
||||
service: light.turn_off
|
||||
- service: light.turn_off
|
||||
data:
|
||||
entity_id: light.indkorsel_2
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,10 @@
|
||||
entity_id:
|
||||
- light.drivhus
|
||||
- light.paradis
|
||||
- light.extended_color_light_1
|
||||
- condition: template
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
- service: homeassistant.turn_on
|
||||
entity_id: light.extended_color_light_1
|
||||
|
||||
- alias: 'Sluk lys ved garage'
|
||||
trigger:
|
||||
@@ -29,12 +32,15 @@
|
||||
for:
|
||||
minutes: 10
|
||||
action:
|
||||
service: homeassistant.turn_off
|
||||
- service: homeassistant.turn_off
|
||||
data:
|
||||
entity_id:
|
||||
- light.drivhus
|
||||
- light.paradis
|
||||
- light.extended_color_light_1
|
||||
- condition: template
|
||||
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
|
||||
- service: homeassistant.turn_off
|
||||
entity_id: light.extended_color_light_1
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
- id: mealie_generate_bilka_checklist_wednesday
|
||||
alias: "Mealie indkøbsliste - onsdag morgen"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: "06:30:00"
|
||||
condition:
|
||||
- condition: time
|
||||
weekday:
|
||||
- wed
|
||||
action:
|
||||
- service: script.mealie_shopping_refresh
|
||||
|
||||
- id: mealie_update_mealplan
|
||||
alias: "Mealie opdater madplan"
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
- platform: time_pattern
|
||||
minutes: "/30"
|
||||
action:
|
||||
- service: shell_command.mealie_update
|
||||
|
||||
@@ -1,15 +1,32 @@
|
||||
- id: garage_auto_claus_presence
|
||||
alias: Garage auto Claus
|
||||
description: >
|
||||
Åbn garage ved ankomst i bil, luk ved afrejse.
|
||||
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.
|
||||
Leaving-trigger bruger garageport=on som bevis for bil (Tesla speed er for langsom).
|
||||
|
||||
trigger:
|
||||
# Telefon ankommer hjem (debounce 10s mod GPS-flimmer)
|
||||
- platform: state
|
||||
entity_id: device_tracker.claus_iphone_15pro
|
||||
to: "home"
|
||||
for:
|
||||
seconds: 10
|
||||
id: arriving
|
||||
|
||||
# Bil ankommer hjem (backup hvis telefon allerede var "home" via WiFi)
|
||||
- platform: state
|
||||
entity_id: device_tracker.snowywhite_location_tracker
|
||||
to: "home"
|
||||
id: car_arriving
|
||||
|
||||
# Telefon forlader hjemmet (debounce 10s mod GPS-flimmer)
|
||||
- platform: state
|
||||
entity_id: device_tracker.claus_iphone_15pro
|
||||
from: "home"
|
||||
for:
|
||||
seconds: 10
|
||||
id: leaving
|
||||
|
||||
condition:
|
||||
@@ -20,49 +37,92 @@
|
||||
action:
|
||||
- choose:
|
||||
|
||||
# ÅBN (kun hvis bil er aktiv)
|
||||
# ÅBN via telefon: garage lukket + forlod hjemmet i bil
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: arriving
|
||||
|
||||
- condition: state
|
||||
entity_id: cover.anne
|
||||
state: "closed"
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "off"
|
||||
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ state_attr('device_tracker.snowywhite_location_tracker', 'speed') not in [None, 'unknown'] }}
|
||||
# Vi ved at brugeren kørte hjemmefra
|
||||
- condition: state
|
||||
entity_id: input_boolean.left_home_by_car
|
||||
state: "on"
|
||||
|
||||
sequence:
|
||||
- service: cover.open_cover
|
||||
- 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 opened (arrival by car)"
|
||||
message: "Garage åbnet (ankomst i bil)"
|
||||
|
||||
# LUK (kun hvis bil er aktiv)
|
||||
# Å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 => kører i bil
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: leaving
|
||||
|
||||
- condition: state
|
||||
entity_id: cover.anne
|
||||
state: "open"
|
||||
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ state_attr('device_tracker.snowywhite_location_tracker', 'speed') not in [None, 'unknown'] }}
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
|
||||
sequence:
|
||||
- delay: "00:00:20" # giver tid til at du faktisk er kørt ud
|
||||
# Markér at vi kørte hjemmefra (bruges ved ankomst)
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.left_home_by_car
|
||||
|
||||
- service: cover.close_cover
|
||||
- delay: "00:00:30"
|
||||
|
||||
# Dobbelttjek at garagen stadig er åben efter forsinkelsen
|
||||
- condition: state
|
||||
entity_id: binary_sensor.garageport
|
||||
state: "on"
|
||||
|
||||
- service: cover.toggle
|
||||
target:
|
||||
entity_id: cover.anne
|
||||
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
message: "Garage closed (departure by car)"
|
||||
message: "Garage lukket (afrejse i bil)"
|
||||
|
||||
mode: single
|
||||
max_exceeded: silent
|
||||
|
||||
@@ -94,19 +94,85 @@
|
||||
|
||||
trigger:
|
||||
- platform: time_pattern
|
||||
minutes: "0"
|
||||
minutes: "/15"
|
||||
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: "{{ now().hour >= 16 and now().hour <= 21 }}"
|
||||
value_template: "{{ now().hour >= 19 and now().hour <= 21 }}"
|
||||
- condition: state
|
||||
entity_id: input_boolean.dishwasher_reminder_snoozed
|
||||
state: "off"
|
||||
- condition: template
|
||||
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
|
||||
- condition: or
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.dishwasher_fjernbetjening
|
||||
state: "off"
|
||||
- condition: template
|
||||
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
|
||||
value_template: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
|
||||
- condition: template
|
||||
value_template: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
|
||||
- condition: template
|
||||
value_template: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
|
||||
- condition: template
|
||||
value_template: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
|
||||
- condition: template
|
||||
value_template: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
|
||||
- condition: template
|
||||
value_template: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
|
||||
|
||||
action:
|
||||
- variables:
|
||||
reminder_time: "{{ now().strftime('%H:%M') }}"
|
||||
remote_off: "{{ is_state('binary_sensor.dishwasher_fjernbetjening', 'off') }}"
|
||||
door_not_closed: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
|
||||
low_salt: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
|
||||
low_rinse: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
|
||||
low_powerdisk: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
|
||||
info_on: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
|
||||
svigt: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
|
||||
issue_text: >
|
||||
{% set issues = [] %}
|
||||
{% if remote_off %}{% set issues = issues + ['remote control er ikke slået til'] %}{% endif %}
|
||||
{% if door_not_closed %}{% set issues = issues + ['døren er ikke lukket'] %}{% endif %}
|
||||
{% if low_salt %}{% set issues = issues + ['salt er lavt (' ~ states('sensor.dishwasher_salt_level') ~ '%)'] %}{% endif %}
|
||||
{% if low_rinse %}{% set issues = issues + ['afspændingsmiddel er lavt (' ~ states('sensor.dishwasher_rinse_aid_level') ~ '%)'] %}{% endif %}
|
||||
{% if low_powerdisk %}{% set issues = issues + ['powerdisk er lav (' ~ states('sensor.dishwasher_powerdisk_level') ~ '%)'] %}{% endif %}
|
||||
{% if info_on %}{% set issues = issues + ['info-advarsel aktiv'] %}{% endif %}
|
||||
{% if svigt %}{% set issues = issues + ['maskinsvigt'] %}{% endif %}
|
||||
{{ issues | join(', ') }}
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Slå fjernbetjening til på opvaskemaskinen"
|
||||
message: "Opvaskemaskinen er planlagt til natkørsel, men remote control er ikke slået til endnu."
|
||||
title: "⚠️ Opvaskemaskine - tjek inden natkørsel"
|
||||
message: "[{{ reminder_time }}] {{ issue_text | capitalize }}."
|
||||
data:
|
||||
actions:
|
||||
- action: "DISHWASHER_DONE"
|
||||
title: "✅ Gjort det"
|
||||
- action: "DISHWASHER_IGNORE"
|
||||
title: "🔕 Ignorer i aften"
|
||||
|
||||
- id: dishwasher_reminder_action_ignore
|
||||
alias: Opvaskemaskine - ignorer påmindelser i aften
|
||||
mode: single
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: mobile_app_notification_action
|
||||
event_data:
|
||||
action: DISHWASHER_IGNORE
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.dishwasher_reminder_snoozed
|
||||
|
||||
- id: dishwasher_reminder_snooze_reset
|
||||
alias: Opvaskemaskine - nulstil snooze ved midnat
|
||||
mode: single
|
||||
trigger:
|
||||
- platform: time
|
||||
at: "00:00:00"
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.dishwasher_reminder_snoozed
|
||||
@@ -1,3 +1,16 @@
|
||||
- alias: 'Plæneklipper - opdater sidst klippet'
|
||||
description: 'Opdater input_datetime når klipperen starter (uanset hvem der startede den)'
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
to: mowing
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.ploeneklipper_sidst_koert
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
|
||||
- alias: 'Plæneklipper - start arbejdsdag'
|
||||
description: 'Start plæneklipper kl 9 på arbejdsdage hvis det ikke regner og ingen er hjemme'
|
||||
trigger:
|
||||
@@ -38,11 +51,6 @@
|
||||
- service: lawn_mower.start_mowing
|
||||
target:
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.ploeneklipper_sidst_koert
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Plæneklipper"
|
||||
@@ -103,6 +111,9 @@
|
||||
- condition: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
state: 'mowing'
|
||||
- condition: state
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
state: 'off'
|
||||
action:
|
||||
- service: lawn_mower.dock
|
||||
target:
|
||||
@@ -111,3 +122,74 @@
|
||||
data:
|
||||
title: "Plæneklipper"
|
||||
message: "Klipperen er sendt hjem - {{ trigger.to_state.attributes.friendly_name }} kom hjem."
|
||||
|
||||
- alias: 'Plæneklipper - reset manuelt startet flag'
|
||||
description: 'Nulstil manuelt-startet flag når klipperen dokker efter kl. 20 (i dagtimerne håndteres genstarten af genstart-automation)'
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
to: 'docked'
|
||||
condition:
|
||||
- condition: time
|
||||
after: '20:00:00'
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
|
||||
- alias: 'Plæneklipper - genstart efter opladning (manuelt startet)'
|
||||
description: 'Genstart klipperen 75 min efter den er dokket, hvis den er manuelt startet og det er før kl. 20'
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
to: 'docked'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
state: 'on'
|
||||
- condition: time
|
||||
before: '20:00:00'
|
||||
action:
|
||||
- delay: '01:15:00'
|
||||
- condition: state
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
state: 'on'
|
||||
- condition: time
|
||||
before: '20:00:00'
|
||||
- condition: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
state: 'docked'
|
||||
- service: lawn_mower.start_mowing
|
||||
target:
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Plæneklipper"
|
||||
message: "Klipperen er genstartet efter opladning."
|
||||
|
||||
- alias: 'Plæneklipper - stop kl. 20 ved manuel start'
|
||||
description: 'Stop manuelt startet klipper kl. 20 og nulstil flag'
|
||||
trigger:
|
||||
- platform: time
|
||||
at: '20:00:00'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
state: 'on'
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
state: 'mowing'
|
||||
sequence:
|
||||
- service: lawn_mower.dock
|
||||
target:
|
||||
entity_id: lawn_mower.husqvarna_automower
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.ploeneklipper_manuelt_startet
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "Plæneklipper"
|
||||
message: "Klipperen er stoppet - kl. 20 grænse nået."
|
||||
|
||||
@@ -54,6 +54,10 @@
|
||||
- delay:
|
||||
seconds: "{{ range(30,180) | random }}"
|
||||
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- delay:
|
||||
minutes: "{{ range(10,30) | random }}"
|
||||
|
||||
@@ -66,6 +70,10 @@
|
||||
- delay:
|
||||
seconds: "{{ range(20,120) | random }}"
|
||||
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
@@ -146,6 +154,10 @@
|
||||
- delay:
|
||||
seconds: "{{ range(20,120) | random }}"
|
||||
|
||||
- service: switch.turn_on
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- delay:
|
||||
minutes: "{{ range(15,60) | random }}"
|
||||
|
||||
@@ -158,6 +170,10 @@
|
||||
- delay:
|
||||
seconds: "{{ range(20,120) | random }}"
|
||||
|
||||
- service: switch.turn_off
|
||||
data:
|
||||
entity_id: switch.stik_indkorsel
|
||||
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
|
||||
@@ -52,6 +52,18 @@
|
||||
for: "00:05:00"
|
||||
|
||||
variables:
|
||||
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('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') }}"
|
||||
@@ -59,13 +71,6 @@
|
||||
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"
|
||||
|
||||
- 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:
|
||||
@@ -82,13 +88,13 @@
|
||||
target:
|
||||
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
|
||||
|
||||
- delay: "00:00:20"
|
||||
- wait_template: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
|
||||
timeout: "00:02:00"
|
||||
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state: "cleaning"
|
||||
- condition: template
|
||||
value_template: "{{ wait.completed }}"
|
||||
sequence:
|
||||
- service: input_number.increment
|
||||
target:
|
||||
@@ -103,17 +109,14 @@
|
||||
}} min.
|
||||
|
||||
- conditions:
|
||||
- condition: not
|
||||
conditions:
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state: "cleaning"
|
||||
- condition: template
|
||||
value_template: "{{ not wait.completed }}"
|
||||
sequence:
|
||||
- service: notify.mobile_app_claus_iphone_15pro
|
||||
data:
|
||||
title: "⚠️ Roborock start fejlede"
|
||||
message: >
|
||||
Startkommando sendt, men den begyndte ikke at køre.
|
||||
Startkommando sendt, men den begyndte ikke at køre inden for 2 min.
|
||||
State: {{ states('vacuum.roborock_s8_pro_ultra') }}.
|
||||
Status: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}.
|
||||
Error: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}.
|
||||
@@ -129,6 +132,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 }}%.
|
||||
|
||||
|
||||
@@ -146,6 +150,9 @@
|
||||
- condition: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
state: "cleaning"
|
||||
- condition: state
|
||||
entity_id: input_boolean.roborock_manuelt_startet
|
||||
state: "off"
|
||||
|
||||
action:
|
||||
- service: vacuum.return_to_base
|
||||
@@ -158,6 +165,21 @@
|
||||
message: "Rengøring stoppet fordi nogen er kommet hjem."
|
||||
|
||||
|
||||
# 🔄 Reset manuelt-startet flag når Roborock dokker
|
||||
- id: roborock_reset_manuelt_flag
|
||||
alias: Roborock - Reset manuelt startet flag
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: vacuum.roborock_s8_pro_ultra
|
||||
to: "docked"
|
||||
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.roborock_manuelt_startet
|
||||
|
||||
|
||||
# 🧹 Syd på arbejdsdage
|
||||
- id: roborock_syd_workday_vacuum
|
||||
alias: Roborock støvsug syd på arbejdsdage
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
- alias: 'Indkorsel: Slet gamle snapshots (behold 100)'
|
||||
description: Køres via webhook fra galleriet – sletter alle undtagen de 100 nyeste snapshots og regenererer galleriet.
|
||||
trigger:
|
||||
- platform: webhook
|
||||
webhook_id: indkorsel_prune_100
|
||||
allowed_methods: [POST]
|
||||
local_only: true
|
||||
action:
|
||||
- action: shell_command.indkorsel_prune_keep_100
|
||||
- delay: '00:00:02'
|
||||
- action: shell_command.indkorsel_generate_gallery
|
||||
mode: single
|
||||
|
||||
- alias: 'Snapshot ved person i indkorsel'
|
||||
description: >
|
||||
Gemmer et tidsstemplet snapshot + opdaterer latest.jpg + regenererer HTML-galleri,
|
||||
hver gang binary_sensor.indkoersel_person skifter til 'on'.
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.indkoersel_person
|
||||
to: 'on'
|
||||
condition: []
|
||||
action:
|
||||
- variables:
|
||||
ts: "{{ now().strftime('%Y-%m-%d_%H-%M-%S') }}"
|
||||
# Gem tidsstemplet kopi
|
||||
- action: camera.snapshot
|
||||
data:
|
||||
entity_id: camera.indkoersel_sub
|
||||
filename: "/config/www/snapshots/indkorsel/{{ ts }}.jpg"
|
||||
# Overskriv latest.jpg (bruges af local_file-kamera i dashboardet)
|
||||
- action: camera.snapshot
|
||||
data:
|
||||
entity_id: camera.indkoersel_sub
|
||||
filename: "/config/www/snapshots/indkorsel/latest.jpg"
|
||||
# Regenerer HTML-galleriet
|
||||
- action: shell_command.indkorsel_generate_gallery
|
||||
mode: queued
|
||||
max: 5
|
||||
@@ -0,0 +1,89 @@
|
||||
##################################################
|
||||
# Syg-status: sluk alarmer + motion-lys ved sygdom
|
||||
#
|
||||
# Triggeres af input_select.PERSON_status → "syg"
|
||||
# Genaktiverer alarmer når status ikke længere er "syg"
|
||||
# Motion-lys håndteres via conditions i lys_*.yaml
|
||||
##################################################
|
||||
|
||||
# ---- Andreas ----
|
||||
# Andreas har ingen Sonos-alarmer, så der er intet at slå fra/til ved sygdom.
|
||||
# Motion-lys håndteres via condition i lys_andreas.yaml (tjekker andreas_status != syg).
|
||||
|
||||
# ---- Daniel ----
|
||||
|
||||
- alias: "Syg - Daniel - sluk alarmer"
|
||||
id: syg_daniel_sluk_alarmer
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_select.daniel_status
|
||||
to: "syg"
|
||||
action:
|
||||
- service: homeassistant.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- switch.sonos_alarm_377 # Daniel hverdagsalarm
|
||||
- switch.sonos_alarm_1894 # Daniel afsted
|
||||
- switch.sonos_alarm_2273 # Daniel man/fre
|
||||
- switch.sonos_alarm_3471 # Daniel lørdag
|
||||
|
||||
- alias: "Syg - Daniel - genaktiver alarmer"
|
||||
id: syg_daniel_genaktiver_alarmer
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_select.daniel_status
|
||||
not_to: "syg"
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: "on"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- switch.sonos_alarm_377
|
||||
- switch.sonos_alarm_3471
|
||||
|
||||
# ---- Anne / Claus (soveværelse) ----
|
||||
|
||||
- alias: "Syg - Soveværelse - sluk alarmer"
|
||||
id: syg_sovevaerelse_sluk_alarmer
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_select.anne_status
|
||||
to: "syg"
|
||||
- platform: state
|
||||
entity_id: input_select.claus_status
|
||||
to: "syg"
|
||||
action:
|
||||
- service: homeassistant.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- switch.sonos_alarm_1782 # Soft wakeup
|
||||
- switch.sonos_alarm_298 # Badeværelse
|
||||
|
||||
- alias: "Syg - Soveværelse - genaktiver alarmer"
|
||||
id: syg_sovevaerelse_genaktiver_alarmer
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_select.anne_status
|
||||
not_to: "syg"
|
||||
- platform: state
|
||||
entity_id: input_select.claus_status
|
||||
not_to: "syg"
|
||||
condition:
|
||||
# Kun genaktiver hvis BEGGE ikke er syge
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ not is_state('input_select.anne_status', 'syg') and
|
||||
not is_state('input_select.claus_status', 'syg') }}
|
||||
- condition: state
|
||||
entity_id: binary_sensor.arbejdsdagimorgen
|
||||
state: "on"
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- switch.sonos_alarm_1782
|
||||
- switch.sonos_alarm_298
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
- platform: time
|
||||
at: "13:05:00"
|
||||
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set deadline = states('input_datetime.tesla_charge_deadline') %}
|
||||
{{ deadline in ['unknown','unavailable',''] or as_timestamp(deadline) <= as_timestamp(now()) }}
|
||||
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
@@ -23,6 +29,12 @@
|
||||
entity_id: binary_sensor.snowywhite_charger
|
||||
to: "on"
|
||||
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set deadline = states('input_datetime.tesla_charge_deadline') %}
|
||||
{{ deadline in ['unknown','unavailable',''] or as_timestamp(deadline) <= as_timestamp(now()) }}
|
||||
|
||||
action:
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
minutes: "0"
|
||||
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.tesla_manual_override
|
||||
state: "off"
|
||||
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set deadline = states('input_datetime.tesla_charge_deadline') %}
|
||||
@@ -65,3 +69,14 @@
|
||||
- service: switch.turn_off
|
||||
target:
|
||||
entity_id: switch.home_charging
|
||||
|
||||
- alias: "Tesla - nulstil manuel override ved frakobling"
|
||||
id: tesla_reset_manual_override
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.snowywhite_charger
|
||||
to: "off"
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.tesla_manual_override
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
{{ (states('sensor.snowywhite_battery')|float(0)) >=
|
||||
(states('number.snowywhite_charge_limit')|float(100)) }}
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.tesla_manual_override
|
||||
- service: switch.turn_off
|
||||
target:
|
||||
entity_id: switch.home_charging
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
action:
|
||||
- service: media_player.unjoin
|
||||
entity_id: media_player.badevaerelse
|
||||
- service: media_player.unjoin
|
||||
entity_id: media_player.lille_badevaerelse
|
||||
- service: media_player.unjoin
|
||||
entity_id: media_player.sovevaerelse
|
||||
|
||||
|
||||
@@ -1,12 +1,2 @@
|
||||
### Set temperature to 24 in heat mode
|
||||
- alias: "Tænd varme i kontor"
|
||||
trigger:
|
||||
platform: time
|
||||
at: "19:30:00"
|
||||
action:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: climate.kontor
|
||||
data:
|
||||
temperature: 24
|
||||
hvac_mode: heat
|
||||
### Kontor-varme styres nu af script.varme_recalculate (include/scripts/varme_styring.yaml)
|
||||
### Denne fil er beholdt tom for fremtidige manuelle overrides
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
##################################################
|
||||
# Varme: Triggers der kalder script.varme_recalculate
|
||||
# Scenarierne der kræver genberegning:
|
||||
# - Morgen (input_datetime.varme_morgen_tid) - nat slut → komforttemp
|
||||
# - Aften (input_datetime.varme_aften_tid) - nat start → natsænkning
|
||||
# - Tilstedeværelse - hjemme/væk skifter
|
||||
# - Ferietilstand - ferie til/fra
|
||||
# - HA genstart - genopret korrekt temp
|
||||
##################################################
|
||||
|
||||
- alias: "Varme - Genberegn: Morgen"
|
||||
id: varme_recalc_morgen
|
||||
description: "Slutter natsænkning - tidspunkt styret af input_datetime.varme_morgen_tid"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: input_datetime.varme_morgen_tid
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Nat"
|
||||
id: varme_recalc_nat
|
||||
description: "Starter natsænkning - tidspunkt styret af input_datetime.varme_aften_tid"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: input_datetime.varme_aften_tid
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Tilstedeværelse"
|
||||
id: varme_recalc_presence
|
||||
description: "Justerer temperaturer når family_presence ændres (hjemme/væk)"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.family_presence
|
||||
action:
|
||||
# Kort forsinkelse så person-sensorer er stabile
|
||||
- delay: "00:01:00"
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Ferie"
|
||||
id: varme_recalc_vacation
|
||||
description: "Skifter til ferie-/frosttemperatur når vacation_mode ændres"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.vacation_mode
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: HA genstart"
|
||||
id: varme_recalc_ha_start
|
||||
description: "Genopret korrekte temperaturer efter HA genstart"
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
action:
|
||||
# Vent til integrationer er loaded
|
||||
- delay: "00:01:00"
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Komforttemperatur ændret"
|
||||
id: varme_recalc_komfort_changed
|
||||
description: "Opdater varmeanlægget straks når en komforttemperatur justeres"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- input_number.varme_komfort_andreas
|
||||
- input_number.varme_komfort_daniel
|
||||
- input_number.varme_komfort_sovevaerelse
|
||||
- input_number.varme_komfort_kontor
|
||||
- input_number.varme_komfort_gang
|
||||
- input_number.varme_komfort_forgang
|
||||
- input_number.varme_komfort_lille_bad
|
||||
- input_number.varme_komfort_badevarelse
|
||||
- input_number.varme_komfort_stue
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Ferietilstand: Aktiver ved afrejse"
|
||||
id: varme_ferie_aktiver
|
||||
description: "Slår vacation_mode til automatisk på afrejsetidspunktet (vacation_start)"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: input_datetime.vacation_start
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.vacation_mode
|
||||
|
||||
- alias: "Varme - Ferieopvarmning: Start 2 dage før hjemkomst"
|
||||
id: varme_ferie_forvarm
|
||||
description: >
|
||||
Slår vacation_mode fra 2 dage inden vacation_end så huset er
|
||||
varmt ved hjemkomst. Kører dagligt ved morgen-tidspunktet.
|
||||
trigger:
|
||||
- platform: time
|
||||
at: input_datetime.varme_morgen_tid
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.vacation_mode
|
||||
state: "on"
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set end = states('input_datetime.vacation_end') %}
|
||||
{% if end not in ['unknown', 'unavailable', ''] %}
|
||||
{{ 0 < (as_timestamp(end) - as_timestamp(now())) < (2 * 86400) }}
|
||||
{% else %}
|
||||
false
|
||||
{% endif %}
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.vacation_mode
|
||||
@@ -0,0 +1,260 @@
|
||||
##################################################
|
||||
# Vindue-automationer (Aqara vinduesensorer)
|
||||
##################################################
|
||||
|
||||
### Varme: Genberegn ved vindue-ændring (åbner og lukker)
|
||||
### Script slukker klimaenhed hvis vindue er åbent, tænder igen ved lukning
|
||||
|
||||
- alias: "Varme - vindue åbner eller lukker"
|
||||
id: varme_vindue_trigger
|
||||
description: "Kalder varme_recalculate når et vindue eller terrassedøren skifter tilstand"
|
||||
mode: queued
|
||||
max: 10
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- binary_sensor.andreas_vindue
|
||||
- binary_sensor.daniel_vindue
|
||||
- binary_sensor.sovevaerelse_vindue
|
||||
- binary_sensor.lille_bad_vindue
|
||||
- binary_sensor.badevaerelse_vindue
|
||||
- binary_sensor.terrassedor
|
||||
to:
|
||||
- "on"
|
||||
- "off"
|
||||
for: "00:00:05"
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
### 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(', ') }}
|
||||
- variables:
|
||||
# Find den person der sidst skiftede væk fra home
|
||||
sidste_person: >-
|
||||
{% set people = [
|
||||
('person.claus_dethlefsen', 'notify.mobile_app_claus_iphone_15pro'),
|
||||
('person.anne_schusler_dethlefsen', 'notify.mobile_app_annes_iphone_14_pro'),
|
||||
('person.andreas_schusler_dethlefsen', 'notify.mobile_app_andreas_iphone_12'),
|
||||
('person.daniel_schusler_dethlefsen', 'notify.mobile_app_daniels_iphone_13_mini')
|
||||
] %}
|
||||
{% set ns = namespace(latest='2000-01-01T00:00:00+00:00', svc='notify.mobile_app_claus_iphone_15pro') %}
|
||||
{% for person_id, notify_svc in people %}
|
||||
{% set changed = states[person_id].last_changed | string %}
|
||||
{% if changed > ns.latest %}
|
||||
{% set ns.latest = changed %}
|
||||
{% set ns.svc = notify_svc %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ ns.svc }}
|
||||
# Altid send til Claus
|
||||
- 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
|
||||
# Send også til den der sidst forlod huset (hvis det ikke er Claus)
|
||||
- condition: template
|
||||
value_template: "{{ sidste_person != 'notify.mobile_app_claus_iphone_15pro' }}"
|
||||
- service: "{{ sidste_person }}"
|
||||
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: template
|
||||
value_template: "{{ is_state(trigger.entity_id, '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."
|
||||
@@ -0,0 +1,11 @@
|
||||
- binary_sensor:
|
||||
name: MQTT Broker TCP
|
||||
unique_id: mqtt_broker_tcp
|
||||
device_class: connectivity
|
||||
# Opdater host hvis MQTT-brokeren flyttes til en anden maskine.
|
||||
command: >-
|
||||
python3 -c "import socket; s=socket.socket(); s.settimeout(2);
|
||||
print('ON' if s.connect_ex(('10.0.0.142', 1883)) == 0 else 'OFF')"
|
||||
payload_on: "ON"
|
||||
payload_off: "OFF"
|
||||
scan_interval: 60
|
||||
@@ -0,0 +1,3 @@
|
||||
badevaerelse_manuel_tilstand:
|
||||
name: Badeværelse manuel tilstand
|
||||
initial: off
|
||||
@@ -0,0 +1,4 @@
|
||||
left_home_by_car:
|
||||
name: Forlod hjemmet i bil
|
||||
icon: mdi:car
|
||||
initial: false
|
||||
@@ -0,0 +1,3 @@
|
||||
gaester:
|
||||
name: "Gæster hjemme"
|
||||
icon: mdi:account-group
|
||||
@@ -1,3 +1,7 @@
|
||||
vis_alle_vedligehold:
|
||||
name: Vis alle vedligehold
|
||||
icon: mdi:eye-outline
|
||||
|
||||
dishwasher_reminder_snoozed:
|
||||
name: Opvaskemaskine - påmindelser snoozed
|
||||
icon: mdi:bell-sleep
|
||||
@@ -0,0 +1,7 @@
|
||||
roborock_manuelt_startet:
|
||||
name: Roborock manuelt startet
|
||||
icon: mdi:robot-vacuum
|
||||
|
||||
ploeneklipper_manuelt_startet:
|
||||
name: Plæneklipper manuelt startet
|
||||
icon: mdi:robot-mower
|
||||
@@ -0,0 +1,3 @@
|
||||
tesla_manual_override:
|
||||
name: Tesla manuel opladning
|
||||
icon: mdi:car-electric
|
||||
@@ -1,5 +1,12 @@
|
||||
vacation_start:
|
||||
name: Vacation Start
|
||||
has_date: true
|
||||
has_time: true
|
||||
initial: "2026-07-13 10:00:00"
|
||||
|
||||
vacation_end:
|
||||
name: Vacation End
|
||||
has_date: true
|
||||
has_time: true
|
||||
initial: "2026-07-27 12:00:00"
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
varme_morgen_tid:
|
||||
name: Varme - Morgen (nat slut)
|
||||
has_date: false
|
||||
has_time: true
|
||||
icon: mdi:weather-sunny
|
||||
|
||||
varme_aften_tid:
|
||||
name: Varme - Aften (nat start)
|
||||
has_date: false
|
||||
has_time: true
|
||||
icon: mdi:weather-night
|
||||
@@ -4,7 +4,7 @@ badevaerelse_timeout_day:
|
||||
max: 30
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 10
|
||||
initial: 5
|
||||
|
||||
badevaerelse_timeout_night:
|
||||
name: Badeværelse lys timeout nat
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
daniel_lux_threshold:
|
||||
name: Daniel lux grænse
|
||||
min: 0
|
||||
max: 500
|
||||
step: 5
|
||||
unit_of_measurement: lux
|
||||
initial: 90
|
||||
|
||||
daniel_timeout:
|
||||
name: Daniel lys timeout
|
||||
min: 1
|
||||
max: 60
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 10
|
||||
|
||||
daniel_brightness:
|
||||
name: Daniel lysstyrke
|
||||
min: 1
|
||||
max: 100
|
||||
step: 1
|
||||
unit_of_measurement: "%"
|
||||
initial: 100
|
||||
@@ -0,0 +1,23 @@
|
||||
gang_lux_threshold:
|
||||
name: Gang lux grænse
|
||||
min: 0
|
||||
max: 300
|
||||
step: 5
|
||||
unit_of_measurement: lux
|
||||
initial: 70
|
||||
|
||||
gang_timeout_day:
|
||||
name: Gang timeout dag
|
||||
min: 1
|
||||
max: 20
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 3
|
||||
|
||||
gang_timeout_night:
|
||||
name: Gang timeout nat
|
||||
min: 1
|
||||
max: 10
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 1
|
||||
@@ -0,0 +1,23 @@
|
||||
kontor_lux_threshold:
|
||||
name: Kontor lux grænse
|
||||
min: 0
|
||||
max: 500
|
||||
step: 5
|
||||
unit_of_measurement: lux
|
||||
initial: 60
|
||||
|
||||
kontor_timeout_day:
|
||||
name: Kontor timeout dag
|
||||
min: 1
|
||||
max: 60
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 5
|
||||
|
||||
kontor_timeout_night:
|
||||
name: Kontor timeout nat
|
||||
min: 1
|
||||
max: 30
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 2
|
||||
@@ -0,0 +1,15 @@
|
||||
shelly_bagdor_event_cnt:
|
||||
name: Shelly bagdoer event count
|
||||
min: -1
|
||||
max: 99999
|
||||
step: 1
|
||||
mode: box
|
||||
initial: 67
|
||||
|
||||
shelly_fordor_event_cnt:
|
||||
name: Shelly fordoer event count
|
||||
min: -1
|
||||
max: 99999
|
||||
step: 1
|
||||
mode: box
|
||||
initial: -1
|
||||
@@ -0,0 +1,39 @@
|
||||
stue_lux_threshold:
|
||||
name: Stue lux grænse
|
||||
min: 0
|
||||
max: 500
|
||||
step: 5
|
||||
unit_of_measurement: lux
|
||||
initial: 60
|
||||
|
||||
stue_timeout_morgen:
|
||||
name: Stue timeout morgen (06-16)
|
||||
min: 10
|
||||
max: 180
|
||||
step: 5
|
||||
unit_of_measurement: min
|
||||
initial: 30
|
||||
|
||||
stue_timeout_eftermiddag:
|
||||
name: Stue timeout eftermiddag (16-19)
|
||||
min: 10
|
||||
max: 240
|
||||
step: 5
|
||||
unit_of_measurement: min
|
||||
initial: 120
|
||||
|
||||
stue_timeout_aften:
|
||||
name: Stue timeout aften (19-00, TV slukket)
|
||||
min: 1
|
||||
max: 60
|
||||
step: 1
|
||||
unit_of_measurement: min
|
||||
initial: 5
|
||||
|
||||
stue_timeout_nat:
|
||||
name: Stue timeout nat (00-06)
|
||||
min: 5
|
||||
max: 120
|
||||
step: 5
|
||||
unit_of_measurement: min
|
||||
initial: 5
|
||||
@@ -0,0 +1,109 @@
|
||||
# Komforttemperaturer per rum (Roth gulvvarme)
|
||||
varme_komfort_andreas:
|
||||
name: Komfort - Andreas
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 19
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_daniel:
|
||||
name: Komfort - Daniel
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 19
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_sovevaerelse:
|
||||
name: Komfort - Soveværelse
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_kontor:
|
||||
name: Komfort - Kontor
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_gang:
|
||||
name: Komfort - Gang
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_forgang:
|
||||
name: Komfort - Forgang
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 24
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_lille_bad:
|
||||
name: Komfort - Lille bad
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 24
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_badevarelse:
|
||||
name: Komfort - Badeværelse
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 21.5
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_stue:
|
||||
name: Komfort - Stue
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 25
|
||||
icon: mdi:thermometer
|
||||
|
||||
# Globale sænkninger
|
||||
varme_nat_saenkning:
|
||||
name: Natsænkning
|
||||
min: 0
|
||||
max: 8
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 3
|
||||
icon: mdi:weather-night
|
||||
|
||||
varme_vaek_saenkning:
|
||||
name: Sænkning - ingen hjemme
|
||||
min: 0
|
||||
max: 8
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 3
|
||||
icon: mdi:home-export-outline
|
||||
|
||||
varme_ferie_temp:
|
||||
name: Ferietemperatur (frostbeskyttelse)
|
||||
min: 10
|
||||
max: 18
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 11
|
||||
icon: mdi:beach
|
||||
@@ -1,10 +1,3 @@
|
||||
#- platform: group
|
||||
# name: Gang
|
||||
# entities:
|
||||
# - light.fordelingsgang_1
|
||||
# - light.fordelingsgang_2
|
||||
# - light.fordelingsgang_3
|
||||
# - light.fordelingsgang_4
|
||||
# - light.fordelingsgang_5
|
||||
# Gang light group is defined in grupper.yaml (unique_id: lys_gang)
|
||||
|
||||
|
||||
|
||||
@@ -105,7 +105,6 @@
|
||||
name: Indkørsel
|
||||
unique_id: lys_indkorsel
|
||||
entities:
|
||||
- light.indkorsel_plug
|
||||
- light.udendors_forgang
|
||||
- light.hue_ambiance_lamp_1_2
|
||||
- light.hue_ambiance_lamp_1_3
|
||||
@@ -116,7 +115,6 @@
|
||||
unique_id: lys_udenfor
|
||||
entities:
|
||||
- light.garage
|
||||
- light.indkorsel_plug
|
||||
- light.fordoer
|
||||
- light.julelys
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
sensor:
|
||||
- name: "Shelly bagdoer batteri"
|
||||
state_topic: "shellies/shellybutton1-98CDAC1E5F42/sensor/battery"
|
||||
unit_of_measurement: "%"
|
||||
device_class: battery
|
||||
value_template: "{{ value | int(0) }}"
|
||||
|
||||
- name: "Shelly fordoer batteri"
|
||||
state_topic: "shellies/shellybutton1-C45BBE6A5696/sensor/battery"
|
||||
unit_of_measurement: "%"
|
||||
device_class: battery
|
||||
value_template: "{{ value | int(0) }}"
|
||||
@@ -1,3 +1,54 @@
|
||||
godnat_sovevaerelse:
|
||||
alias: Godnat - dæmp lys i soveværelse over 15 min
|
||||
mode: restart
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- light.claus
|
||||
- light.anne
|
||||
- light.sov_dor
|
||||
- light.sov_midt
|
||||
- light.sov_vindue
|
||||
data:
|
||||
brightness_pct: 40
|
||||
transition: 300
|
||||
- delay: "00:05:00"
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- light.claus
|
||||
- light.anne
|
||||
- light.sov_dor
|
||||
- light.sov_midt
|
||||
- light.sov_vindue
|
||||
data:
|
||||
brightness_pct: 10
|
||||
transition: 300
|
||||
- delay: "00:05:00"
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id:
|
||||
- light.claus
|
||||
- light.anne
|
||||
- light.sov_dor
|
||||
- light.sov_midt
|
||||
- light.sov_vindue
|
||||
data:
|
||||
brightness_pct: 1
|
||||
transition: 300
|
||||
- delay: "00:05:00"
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id:
|
||||
- light.claus
|
||||
- light.anne
|
||||
- light.sov_dor
|
||||
- light.sov_midt
|
||||
- light.sov_vindue
|
||||
data:
|
||||
transition: 5
|
||||
|
||||
bed_standard_colors:
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
|
||||
@@ -3,7 +3,7 @@ colorloopgang:
|
||||
use_blueprint:
|
||||
path: mdolnik/color_loop.yaml
|
||||
input:
|
||||
light: light.gang_3
|
||||
light: light.gang
|
||||
color_1:
|
||||
- 255
|
||||
- 38
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user