Compare commits

..

1 Commits

169 changed files with 2067 additions and 15607 deletions
+1 -1
View File
@@ -1 +1 @@
2026.5.1
2026.2.2
-57
View File
@@ -1,57 +0,0 @@
---
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).
-61
View File
@@ -1,61 +0,0 @@
---
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.
+45 -76
View File
@@ -1,87 +1,56 @@
# Ignore everything globally
# Example .gitignore file for your config dir.
# An * ensures that everything will be ignored.
.DS_Store
._*
custom_components/
blueprints/
dwains-dashboard/
tts/
www/
backups/
include/.DS_Store
old*
# System / runtime folders
.storage/
.cloud/
.google.token/
.Rproj.user/
.cache/
# You can whitelist files/folders with !, these will not be ignored.
!*.yaml
!.gitignore
!*.md
!.travis.yml
!fake_privkey.pem
!fake_fullchain.pem
!.HA_VERSION
!customize
!www/*
!include/*
!custom_components/*
!include/*.yaml
!include/automations/*.yaml
!include/binary_sensors/*.yaml
!include/groups/*.yaml
!include/input/*.yaml
!include/input/select/*.yaml
!include/input/datetime/*.yaml
!include/input/number/*.yaml
!include/lights/*.yaml
!include/panels/*.yaml
!include/resources/*.yaml
!include/scripts/*.yaml
!include/sensors/*.yaml
!include/shell_commands/*.yaml
!include/switches/*.yaml
!themes/*
!python_scripts/*
!view/*.yaml
!view/cards/*.yaml
# Logs / DB / temp
*.log*
*.db*
.com*
# Ignore folders.
.storage
.cloud
.google.token
# Sensitive files
# Ensure these YAML files are ignored, otherwise your secret data/credentials will leak.
ip_bans.yaml
secrets.yaml
known_devices.yaml
configuration_full.yaml
configuration_minimal.yaml
.env.infrastructure
.Rproj.user
# --- Whitelist core files ---
!*.yaml
!*.md
!.gitignore
!.travis.yml
!*.pem
!.HA_VERSION
!customize
# --- Re-ignore macOS metadata files inside whitelisted dirs ---
include/**/.DS_Store
include/**/._*
# --- Whitelist directories ---
!www/
!include/
!themes/
!python_scripts/
!dashboards/
# --- Explicitly include all YAML in dashboards subdirs ---
!dashboards/**/*.yaml
# --- Local machine / editor files ---
.vscode/
.google.token
.ha_run.lock
# --- Generated or local-only root YAML files ---
/automations.yaml
/scenes.yaml
/scripts.yaml
# --- Local scratch / exports ---
/image/
/ssl/
/oldautomations.yaml
/oldscratch.yaml
/oldscripts.yaml
# --- Local media snapshots and downloads ---
/www/snapshots/
/www/affalddk/
/www/community/
/www/indkorsel_snapshot.jpg
/www/indkorsel_snapshot_1.jpg
/www/indkorsel_snapshot_2.jpg
/www/media/Halloween-doorbell.mp3
/www/tesla_y.jpg
# --- Local helper scripts not used in git ---
/python_scripts/scene_generator.py
# --- Temporary backup workspace ---
/tmp_backups/
/python_scripts/update_climate.py
# log files
*.log*
*.db*
.com*
include/automations/lys_have.yaml
+1 -41
View File
@@ -1,3 +1,4 @@
## Installation of home-assistant on Synology
Follow https://www.home-assistant.io/installation/alternative/:
@@ -85,47 +86,6 @@ 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
+12 -44
View File
@@ -6,7 +6,7 @@ default_config:
homeassistant:
name: !secret name
external_url: "https://ha.anneclaus.dk"
external_url: "http://anneclaus.duckdns.org:8123"
internal_url: "http://dethlefsen:8123"
auth_providers:
- type: homeassistant
@@ -27,7 +27,6 @@ http:
trusted_proxies:
- 127.0.0.1
- 10.0.0.142
- 172.17.0.0/16 # Docker bridge (NPM)
logger:
default: warning
@@ -39,7 +38,6 @@ logger:
homeassistant.components.discovery: error
homeassistant.components.dlna_dmr: error
async_upnp_client: error
automower_ble: critical
recorder:
purge_keep_days: 7
@@ -55,6 +53,13 @@ recorder:
zone: !include include/zone/zones.yaml
input_boolean:
first_run:
initial: off
first_run_eve:
initial: off
first_run_stue:
initial: off
timer:
indkorsel:
@@ -91,26 +96,15 @@ google_assistant:
service_account: !include SERVICE_ACCOUNT.json
report_state: true
##################################################
# gardin-gruppe
##################################################
cover:
- platform: group
name: Alle gardiner
entities:
- cover.hojre
- cover.midt
- cover.syd
- cover.venstre
- cover.terrasse_dor
climate:
- platform: touchline
host: !secret touchlineIP
##################################################
# Modular Includes
##################################################
template: !include_dir_merge_list include/templates/
template: !include_dir_merge_named include/templates/
group: !include_dir_merge_named include/groups/
sensor: !include_dir_merge_list include/sensors/
automation: !include_dir_merge_list include/automations/
@@ -119,34 +113,8 @@ device_tracker: !include include/device_trackers.yaml
input_datetime: !include_dir_merge_named include/input/datetime/
input_number: !include_dir_merge_named include/input/number/
input_select: !include_dir_merge_named include/input/select/
input_boolean: !include_dir_merge_named include/input/boolean/
input_text: !include_dir_merge_named include/input/text/
light: !include_dir_merge_list include/lights/
panel_iframe: !include_dir_merge_named include/panels/
script: !include_dir_merge_named include/scripts/
shell_command: !include_dir_merge_named include/shell_commands/
switch: !include_dir_merge_list include/switches/
browser_mod:
lovelace:
resource_mode: yaml
resources:
- url: /hacsfiles/lovelace-xiaomi-vacuum-map-card/xiaomi-vacuum-map-card.js
type: module
- url: /hacsfiles/button-card/button-card.js
type: module
- url: /hacsfiles/custom-gauge-card/custom-gauge-card.js
type: module
- url: /local/community/apexcharts-card/apexcharts-card.js
type: module
- url: /local/community/lovelace-mushroom/mushroom.js
type: module
dashboards:
lovelace:
mode: yaml
filename: ui-lovelace.yaml
title: Home
icon: mdi:home-assistant
show_in_sidebar: true
-548
View File
@@ -1,548 +0,0 @@
title: Overblik
path: home
icon: mdi:home
cards:
# 🌤️ Vejr + dato + sol
- type: vertical-stack
cards:
- type: weather-forecast
entity: weather.norgardsvej
show_forecast: true
- type: glance
columns: 5
show_icon: true
show_name: true
show_state: true
entities:
- entity: sensor.dato
name: Dato
icon: mdi:calendar
- entity: sensor.solopgang
name: Sol op
icon: mdi:weather-sunset-up
- entity: sensor.solnedgang
name: Sol ned
icon: mdi:weather-sunset-down
- entity: binary_sensor.arbejdsdag
name: I dag
icon: mdi:briefcase
- entity: binary_sensor.arbejdsdagimorgen
name: I morgen
icon: mdi:briefcase-outline
# 👨‍👩‍👧‍👦 Familien
- type: glance
entities:
- entity: person.daniel_schusler_dethlefsen
name: Daniel
- entity: person.claus_dethlefsen
name: Claus
- entity: person.anne_schusler_dethlefsen
name: Anne
- entity: person.andreas_schusler_dethlefsen
name: Andreas
- entity: binary_sensor.family_presence
name: Familie
# 🪟 Gardiner
- type: grid
columns: 6
square: false
cards:
- type: button
name: ""
icon: mdi:blinds-open
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.alle_lidt_nede
- type: button
name: ""
icon: mdi:blinds
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.n22_alt_ned
- type: button
name: ""
icon: mdi:blinds-horizontal
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.morgen
- type: button
name: ""
icon: mdi:window-shutter
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.syd_ned_venstre_halvt_ned
- type: button
name: ""
icon: mdi:television-ambient-light
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.n22_tv
- type: button
name: ""
icon: mdi:silverware-fork-knife
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.n22_spisetid
# 🧹 Støvsuger
- type: horizontal-stack
cards:
- type: custom:button-card
entity: sensor.roborock_last_clean_end_compact
show_icon: false
show_name: true
show_state: true
name: Sidst kørt
tap_action:
action: none
hold_action:
action: none
styles:
card:
- padding: 8px
name:
- font-size: 11px
- color: var(--secondary-text-color)
- padding-bottom: 4px
state:
- white-space: normal
- word-break: break-word
- line-height: 1.2
- font-size: 13px
- text-align: center
- type: button
name: Køkken
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
- type: button
name: Syd
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_syd
- type: button
name: Mop
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
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:
- type: custom:button-card
entity: input_datetime.ploeneklipper_sidst_koert
show_icon: false
show_name: true
show_state: true
name: Sidst klippet
tap_action:
action: none
styles:
card:
- padding: 8px
name:
- font-size: 11px
- color: var(--secondary-text-color)
- padding-bottom: 4px
state:
- white-space: normal
- word-break: break-word
- line-height: 1.2
- font-size: 13px
- text-align: center
- type: button
name: Klip
icon: mdi:robot-mower
tap_action:
action: call-service
service: lawn_mower.start_mowing
target:
entity_id: lawn_mower.husqvarna_automower
- type: button
name: Stop
icon: mdi:home-import-outline
tap_action:
action: call-service
service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
# 💡 Lys kontrol
- type: horizontal-stack
cards:
- type: tile
entity: light.indendorslamper
name: Indenfor
icon: mdi:lightbulb-group
tap_action:
action: toggle
hold_action:
action: more-info
show_state: true
- type: tile
entity: light.udendorslamper
name: Udenfor
icon: mdi:outdoor-lamp
tap_action:
action: toggle
hold_action:
action: more-info
show_state: true
- type: tile
entity: binary_sensor.garageport
name: Garage
features_position: bottom
vertical: false
tap_action:
action: call-service
service: cover.toggle
target:
entity_id: cover.anne
show_state: true
# 🎵 Sonos
- type: grid
columns: 3
square: false
cards:
- type: button
name: Stop alt
icon: mdi:stop-circle-outline
tap_action:
action: call-service
service: media_player.media_stop
target:
entity_id:
- media_player.stue
- media_player.andreas
- media_player.daniel
- media_player.kokken
- media_player.alrum
- media_player.badevaerelse
- media_player.sovevaerelse
- media_player.lille_badevaerelse
- type: button
name: P3 i bad
icon: mdi:radio
tap_action:
action: call-service
service: media_player.select_source
target:
entity_id: media_player.badevaerelse
data:
source: "0 DR P3"
- type: button
name: P3 i alrum
icon: mdi:radio
tap_action:
action: call-service
service: media_player.select_source
target:
entity_id: media_player.alrum
data:
source: "0 DR P3"
- type: button
name: Daily Mix bad
icon: mdi:music-circle-outline
tap_action:
action: call-service
service: media_player.select_source
target:
entity_id: media_player.badevaerelse
data:
source: "Andreas Daily Mix 1"
- type: button
name: Daily Mix køkken
icon: mdi:music-circle-outline
tap_action:
action: call-service
service: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 1"
- type: button
name: Family Mix 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"
# 🔊 Receiver presets
- type: grid
columns: 4
square: false
cards:
- type: button
name: Sonos
icon: mdi:speaker-multiple
tap_action:
action: call-service
service: script.receiver_sonos_mch_stereo
- type: button
name: TV Dolby
icon: mdi:television-speaker
tap_action:
action: call-service
service: script.receiver_tv_dolby_digital
- type: button
name: TV Stereo
icon: mdi:surround-sound
tap_action:
action: call-service
service: script.receiver_tv_mch_stereo
- type: horizontal-stack
cards:
- type: vertical-stack
cards:
- type: button
name: ""
icon: mdi:power
tap_action:
action: call-service
service: media_player.turn_off
target:
entity_id: media_player.denon_avr_x2300w
- type: button
name: ""
icon: mdi:volume-plus
tap_action:
action: call-service
service: script.receiver_volume_up_5
- type: button
name: ""
icon: mdi:volume-minus
tap_action:
action: call-service
service: script.receiver_volume_down_5
# 🍽️ Hjemmeknapper
- type: grid
columns: 2
square: false
cards:
- type: button
name: Der er mad
icon: mdi:silverware-fork-knife
tap_action:
action: call-service
service: script.mad_announcement
- type: button
name: TV hygge
icon: mdi:television-ambient-light
tap_action:
action: call-service
service: script.tv_hygge_announcement
# 🗑️ Affald
- type: glance
columns: 3
show_icon: true
show_name: false
show_state: true
entities:
- entity: sensor.affalddk_norgardsvej_22_restaffald
icon: mdi:trash-can-outline
- entity: sensor.affalddk_norgardsvej_22_papir_plast
icon: mdi:recycle
- entity: sensor.affalddk_norgardsvej_22_haveaffald
icon: mdi:leaf
# ⚡ El-priser
- type: vertical-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
span:
start: hour
stacked: false
header:
show: true
title: El-priser næste 24 timer
show_states: true
colorize_states: true
now:
show: true
label: Nu
all_series_config:
stroke_width: 0
apex_config:
chart:
height: 260
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 2
tickAmount: 5
plotOptions:
bar:
columnWidth: 82%
borderRadius: 3
series:
- entity: sensor.energi_data_service
name: Pris
type: column
float_precision: 2
unit: ' kr/kWh'
show:
in_header: raw
in_chart: true
data_generator: |
const startOfHour = new Date();
startOfHour.setMinutes(0, 0, 0);
const endTime = startOfHour.getTime() + (24 * 60 * 60 * 1000);
const rawToday = entity.attributes.raw_today || [];
const rawTomorrow = entity.attributes.tomorrow_valid ? (entity.attributes.raw_tomorrow || []) : [];
const forecast = entity.attributes.forecast || [];
const allKnown = [...rawToday, ...rawTomorrow];
const data = [];
const seen = new Set();
const pushPoint = (item) => {
const timestamp = new Date(item.hour).getTime();
if (Number.isNaN(timestamp) || timestamp < startOfHour.getTime() || timestamp >= endTime || seen.has(timestamp)) {
return;
}
const price = Number(item.price);
if (Number.isNaN(price)) {
return;
}
seen.add(timestamp);
data.push({ x: timestamp, y: price });
};
allKnown.forEach(pushPoint);
if (data.length < 24) {
forecast.forEach(pushPoint);
}
data.sort((left, right) => left.x - right.x);
const trimmed = data.slice(0, 24);
if (!trimmed.length) {
return [];
}
const prices = trimmed.map((item) => item.y);
const minPrice = Math.min(...prices);
const maxPrice = Math.max(...prices);
const mix = (start, end, ratio) => Math.round(start + ((end - start) * ratio));
const toHex = (value) => value.toString(16).padStart(2, '0');
const rgbToHex = (red, green, blue) => `#${toHex(red)}${toHex(green)}${toHex(blue)}`;
const colorByValue = (value) => {
if (maxPrice === minPrice) {
return '#16a34a';
}
const normalized = (value - minPrice) / (maxPrice - minPrice);
if (normalized <= 0.5) {
const ratio = normalized / 0.5;
return rgbToHex(
mix(22, 250, ratio),
mix(163, 204, ratio),
mix(74, 21, ratio)
);
}
const ratio = (normalized - 0.5) / 0.5;
return rgbToHex(
mix(250, 220, ratio),
mix(204, 38, ratio),
mix(21, 38, ratio)
);
};
return trimmed.map((item) => ({
x: item.x,
y: item.y,
fillColor: colorByValue(item.y)
}));
# 🏠 Hus kontrol
- type: entities
title: Modes
entities:
- entity: input_boolean.guests_mode
name: Vi har gæster
icon: mdi:account-group
- entity: input_boolean.vacation_mode
name: 🌴 Vacation Mode
- entity: input_datetime.vacation_end
name: Slutter
- type: conditional
conditions:
- condition: numeric_state
entity: sensor.antal_vedligeholdskort
above: 0
card:
type: tile
entity: sensor.antal_vedligeholdskort
name: Vedligehold
icon: mdi:wrench-cog
-304
View File
@@ -1,304 +0,0 @@
title: Andreas
path: andreas
icon: mdi:face-man
type: sections
sections:
- type: grid
cards:
- type: heading
heading: Musik
- type: media-control
entity: media_player.andreas
name: Sonos Andreas
- type: grid
columns: 2
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.andreas
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.andreas
data:
source: "1 Family Mix"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Spil dansk
icon: mdi:music-note
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.andreas
data:
source: "3 Spil dansk dag - Danske tracks"
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.andreas
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.andreas
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.andreas
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.andreas
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.andreas
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.andreas
data:
source: "Andreas Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: grid
cards:
- type: heading
heading: Lys
- type: horizontal-stack
cards:
- type: custom:button-card
entity: light.andreas_vaerelse
name: Værelse
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: custom:button-card
entity: light.andreas_lysstrip
name: Lysstrip
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: custom:button-card
entity: light.andreas_stol
name: Stol
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: grid
cards:
- type: heading
heading: Klima
- type: tile
entity: sensor.sovevaerelse_stue_temperatur
name: Temperatur
- type: tile
entity: sensor.sovevaerelse_stue_luftfugtighed
name: Luftfugtighed
- type: tile
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
heading: Alarmer
- type: tile
entity: switch.sonos_alarm_445
name: Hverdage 6.30
- type: grid
cards:
- type: heading
heading: Automatik
- type: tile
entity: switch.andreas_colorloop_toggle
name: Colorloop
- type: tile
entity: switch.andreas_motionlys_toggle
name: Motionlys
-308
View File
@@ -1,308 +0,0 @@
title: Daniel
path: daniel
icon: mdi:face-man-outline
type: sections
sections:
- type: grid
cards:
- type: heading
heading: Musik
- type: media-control
entity: media_player.daniel
name: Sonos Daniel
- type: grid
columns: 2
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.daniel
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.daniel
data:
source: "1 Family Mix"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Spil dansk
icon: mdi:music-note
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.daniel
data:
source: "3 Spil dansk dag - Danske tracks"
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.daniel
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.daniel
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.daniel
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.daniel
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.daniel
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.daniel
data:
source: "Daniel Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: grid
cards:
- type: heading
heading: Lys
- type: horizontal-stack
cards:
- type: custom:button-card
entity: light.daniels_vaerelse
name: Værelse
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: custom:button-card
entity: light.daniel_lysstrip
name: Lysstrip
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: custom:button-card
entity: light.bamse
name: Bamse
show_state: false
tap_action:
action: toggle
hold_action:
action: more-info
styles:
card:
- padding: 8px 6px
- height: 72px
icon:
- width: 22px
name:
- font-size: 11px
- white-space: normal
- word-break: break-word
- line-height: 1.15
- type: grid
cards:
- type: heading
heading: Klima
- type: tile
entity: sensor.sovevaerelse_daniel_temperatur
name: Temperatur
- type: tile
entity: sensor.sovevaerelse_daniel_luftfugtighed
name: Luftfugtighed
- type: tile
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
heading: Alarmer
- type: tile
entity: switch.sonos_alarm_377
name: Hverdage 6.15
- type: tile
entity: switch.sonos_alarm_3471
name: Lørdage 6.00
- type: grid
cards:
- type: heading
heading: Automatik
- type: tile
entity: switch.daniel_colorloop_toggle
name: Colorloop
- type: tile
entity: switch.daniel_motionlys_toggle
name: Motionlys
-177
View File
@@ -1,177 +0,0 @@
title: Sovevaerelse
path: sovevaerelse
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
heading: Musik
- type: media-control
entity: media_player.sovevaerelse
name: Sonos Sovevaerelse
- type: grid
columns: 2
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.sovevaerelse
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.sovevaerelse
data:
source: "1 Family Mix"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: grid
cards:
- type: heading
heading: Lysautomatik
- type: tile
entity: automation.lys_sovevaerelse_dag_arbejdsdag
name: Dag (arbejdsdag)
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_dag_ikke_arbejdsdag
name: Dag (ikke arbejdsdag)
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_aften
name: Aften
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat
name: Godnat 1
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat_2
name: Godnat 2
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat_3
name: Godnat 3
tap_action:
action: toggle
- type: tile
entity: automation.sluk_lys_i_sovevaerelse
name: Sluk uden bevaegelse
tap_action:
action: toggle
- type: grid
cards:
- type: heading
heading: Alarm og Wakeup
- type: tile
entity: automation.turn_on_alarms_soft_wakeup
name: Soft wakeup automatik
tap_action:
action: toggle
- type: tile
entity: automation.turn_on_alarms_andreas
name: Alarm automatik (hverdage)
tap_action:
action: toggle
- type: tile
entity: automation.turn_on_alarms_andreas_saturdays
name: Alarm automatik (loerdag)
tap_action:
action: toggle
- type: grid
cards:
- type: heading
heading: Klima (Netatmo)
- type: tile
entity: sensor.sovevaerelse_temperatur
name: Temperatur
- type: tile
entity: sensor.sovevaerelse_luftfugtighed
name: Luftfugtighed
- 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
-696
View File
@@ -1,696 +0,0 @@
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
-115
View File
@@ -1,115 +0,0 @@
title: Stue
path: stue
icon: mdi:sofa
type: sections
sections:
# 🎵 Musik
- type: grid
cards:
- type: heading
heading: Musik
- type: media-control
entity: media_player.stue
name: Sonos Stue
- type: media-control
entity: media_player.alrum
name: Sonos Alrum
- type: media-control
entity: media_player.denon_avr_x2300w
name: Denon AVR
# 💡 Lys (kompakt + alle lys)
- type: grid
columns: 3
square: false
cards:
- type: heading
heading: Lys
- type: tile
entity: light.livingroom
name: Alle lys
icon: mdi:lightbulb-group
tap_action:
action: toggle
- type: tile
entity: light.raket
name: Raket
tap_action:
action: toggle
- type: tile
entity: light.spisebord
name: Spisebord
tap_action:
action: toggle
- type: tile
entity: light.syd
name: Syd
tap_action:
action: toggle
- type: tile
entity: light.panton
name: Panton
tap_action:
action: toggle
- type: tile
entity: light.pendle
name: Pendle
tap_action:
action: toggle
# 🪟 Gardiner (kompakt)
- type: grid
columns: 3
square: false
cards:
- type: heading
heading: Gardiner
- type: tile
entity: cover.alle_gardiner
name: Alle
icon: mdi:blinds
- type: tile
entity: cover.hojre
name: Højre
- type: tile
entity: cover.midt
name: Midt
- type: tile
entity: cover.syd
name: Syd
- type: tile
entity: cover.venstre
name: Venstre
- type: tile
entity: cover.terrasse_dor
name: Terrasse
# 🌡️ Temperatur
- type: grid
cards:
- type: heading
heading: Temperatur
- type: tile
entity: sensor.stue_motion_temperatur
name: Temperatur
-215
View File
@@ -1,215 +0,0 @@
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
-513
View File
@@ -1,513 +0,0 @@
title: Varme
path: varme
icon: mdi:radiator
type: sections
max_columns: 2
sections:
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Andreas
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.sovevaerelse_stue_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature_2
name: Hue
- 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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Daniel
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.sovevaerelse_daniel_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature
name: Hue
- 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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Sovevaerelse
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.sovevaerelse_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_1_temperature_2
name: Hue sovevaerelse
- entity: sensor.hue_motion_sensor_1_temperature
name: Skab Claus
- entity: sensor.temperature
name: Skab Anne
- 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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Kontor
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.kontor_motion_temperatur
name: Hue
- 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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Gang
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.gang_sensor_temperature
name: Hue
- 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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Badeværelse
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.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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Stue
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.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:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Forgang
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.forgang_sensor_temperature
name: Hue
- 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: 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 (15)
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)
-352
View File
@@ -1,352 +0,0 @@
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)
@@ -1,9 +0,0 @@
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%
-124
View File
@@ -1,124 +0,0 @@
title: Støvsuger
path: vacuum
icon: mdi:robot-vacuum
type: sections
sections:
# 🧹 Oversigt
- type: grid
cards:
- type: heading
heading: Støvsuger
# Statisk kortbillede uden overlay
- type: picture-entity
entity: image.roborock_s8_pro_ultra_map_0
name: Kort
- type: tile
entity: sensor.roborock_s8_pro_ultra_status
name: Status
- type: tile
entity: sensor.roborock_s8_pro_ultra_vacuum_error
name: Fejl
- type: tile
entity: binary_sensor.roborock_s8_pro_ultra_cleaning
name: Rengøring i gang
# 🏠 Rum-knapper
- type: grid
cards:
- type: button
name: Køkken + Bryggers
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
- type: button
name: Syd
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_syd
- type: button
name: Syd + Mop
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_syd_vask
- type: button
name: Følg mop
icon: mdi:floor-plan
tap_action:
action: call-service
service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop
# 📊 Historik
- type: grid
cards:
- type: history-graph
title: Rengøringshistorik
entities:
- sensor.roborock_s8_pro_ultra_status
hours_to_show: 24
refresh_interval: 60
# ⚙️ Automations-knapper
- type: grid
cards:
- type: heading
heading: Automations
- type: button
name: Rengør hele huset
icon: mdi:home
tap_action:
action: call-service
service: vacuum.start
target:
entity_id: vacuum.roborock_s8_pro_ultra
- type: button
name: Start mop
icon: mdi:water
tap_action:
action: call-service
service: vacuum.start
target:
entity_id: vacuum.roborock_s8_pro_ultra
data:
mode: mop # kun hvis integrationen understøtter mop mode
- type: button
name: Stop
icon: mdi:stop
tap_action:
action: call-service
service: vacuum.stop
target:
entity_id: vacuum.roborock_s8_pro_ultra
# ⚠️ Dock status
- type: grid
cards:
- type: tile
entity: sensor.roborock_s8_pro_ultra_dock_error
name: Dock fejl
-216
View File
@@ -1,216 +0,0 @@
title: Energi
path: energi
icon: mdi:flash
type: sections
sections:
# ⚡ Strømpris
- type: grid
cards:
- type: heading
heading: Strømpris
- type: tile
entity: sensor.energi_data_service
name: Nuværende pris (kr/kWh)
- type: history-graph
title: Strømpris sidste 24 timer
entities:
- sensor.energi_data_service
hours_to_show: 24
refresh_interval: 60
# 🏠 Hjemmets energiforbrug
- type: grid
cards:
- type: heading
heading: Forbrug
- type: sensor
entity: sensor.home_energy_usage
name: Aktuelt forbrug
- type: history-graph
title: Forbrug sidste 24 timer
entities:
- sensor.home_energy_usage
hours_to_show: 24
refresh_interval: 60
- type: history-graph
title: Forbrug sidste 7 dage
entities:
- sensor.home_energy_usage
hours_to_show: 168
refresh_interval: 300
# 🔋 Batteri / lager
- type: grid
cards:
- type: heading
heading: Batteri
- type: sensor
entity: sensor.home_battery_level
name: Batteri %
- type: sensor
entity: sensor.home_battery_charge
name: Ladehastighed
# 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
heading: Automations
- type: button
name: Stop opladning Tesla
icon: mdi:car-electric
tap_action:
action: call-service
service: tesla.stop_charge
target:
entity_id: vacuum.snowywhite
- type: button
name: Start opladning Tesla
icon: mdi:car-electric
tap_action:
action: call-service
service: tesla.start_charge
target:
entity_id: vacuum.snowywhite
- type: button
name: Tænd/Sluk tungt forbrug
icon: mdi:flash
tap_action:
action: toggle
entity: switch.heavy_load
-129
View File
@@ -1,129 +0,0 @@
title: Tesla
path: tesla
icon: mdi:car-electric
cards:
# 🔋 Batteri & Opladning
- type: vertical-stack
cards:
- type: gauge
entity: sensor.batteri
name: Batteri
min: 0
max: 100
severity:
green: 50
yellow: 20
red: 0
unit: '%'
- type: gauge
entity: sensor.raekkevidde_km
name: Rækkevidde
min: 0
max: 600
severity:
green: 400
yellow: 150
red: 0
unit: 'km'
- type: entities
entities:
- entity: binary_sensor.snowywhite_charging
name: Oplader nu?
- entity: sensor.charging_rate_km_h
name: Ladehastighed (km/t)
- entity: sensor.energy_added_kwh
name: Energi tilføjet (kWh)
- entity: sensor.snowywhite_charger_power
name: Charger power (kW)
- entity: sensor.snowywhite_time_charge_complete
name: Forventet fuld opladning
- type: horizontal-stack
cards:
- type: button
name: Start opladning
icon: mdi:flash
tap_action:
action: call-service
service: script.tesla_force_start_charging
- type: button
name: Stop opladning
icon: mdi:flash-off
tap_action:
action: call-service
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
name: Billigste vindue
- entity: sensor.tesla_charge_hours_needed
name: Timer nødvendige
- entity: input_datetime.tesla_charge_deadline
name: Klar senest
- entity: input_datetime.tesla_last_start
name: Sidste start
- entity: number.snowywhite_charge_limit
name: Lademål
- entity: binary_sensor.snowywhite_charger
name: Tilsluttet lader
# 📈 Faktisk opladning
- type: history-graph
title: Faktisk opladning sidste 24 timer
entities:
- entity: sensor.charging_numeric
name: Lader nu
- entity: sensor.charging_rate_km_h
name: Ladehastighed
- entity: sensor.energy_added_kwh
name: Energi tilføjet
hours_to_show: 24
refresh_interval: 60
# 🚗 Døre & Lås
- type: entities
title: Døre & Lås
entities:
- binary_sensor.snowywhite_doors
- binary_sensor.snowywhite_windows
- binary_sensor.snowywhite_parking_brake
- binary_sensor.snowywhite_user_present
- sensor.snowywhite_shift_state
# 🌡️ Temperatur
- type: horizontal-stack
cards:
- type: sensor
entity: sensor.snowywhite_temperature_inside
name: Inde (°C)
- type: sensor
entity: sensor.snowywhite_temperature_outside
name: Ude (°C)
# 📍 Lokation / Ankomst
- type: entities
title: Ankomst / Distance
entities:
- sensor.snowywhite_arrival_time
- sensor.snowywhite_distance_to_arrival
# 🔧 Vedligeholdelse / Alerts
- type: entities
title: Vedligeholdelse / Alerts
entities:
- sensor.snowywhite_tpms_front_left
- sensor.snowywhite_tpms_front_right
- sensor.snowywhite_tpms_rear_left
- sensor.snowywhite_tpms_rear_right
- sensor.snowywhite_data_last_update_time
-28
View File
@@ -1,28 +0,0 @@
title: Kort
path: map
icon: mdi:map
type: sections
max_columns: 1
sections:
- type: grid
cards:
- type: heading
heading: Familien live
- 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
File diff suppressed because it is too large Load Diff
-842
View File
@@ -1,842 +0,0 @@
title: Lys
path: lys
icon: mdi:lightbulb-multiple
type: sections
max_columns: 3
sections:
- type: grid
columns: 3
square: false
cards:
- type: heading
heading: Globalt
- type: custom:mushroom-light-card
entity: light.alle_lys
name: Alle lys
icon: mdi:lightbulb-group
use_light_color: true
show_brightness_control: true
collapsible_controls: true
secondary_info: state
- type: custom:mushroom-light-card
entity: light.indendorslamper
name: Indendors
icon: mdi:home-lightbulb
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udendorslamper
name: Udendors
icon: mdi:outdoor-lamp
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-template-card
primary: Taend alt
secondary: Hele huset
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.alle_lys
- type: custom:mushroom-template-card
primary: Sluk alt
secondary: Hele huset
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.alle_lys
- type: custom:mushroom-template-card
primary: Taend inde
secondary: Alle indendors
icon: mdi:home-lightbulb
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.indendorslamper
- type: custom:mushroom-template-card
primary: Sluk inde
secondary: Alle indendors
icon: mdi:home-lightbulb-outline
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.indendorslamper
- type: custom:mushroom-template-card
primary: Taend ude
secondary: Alle udendors
icon: mdi:string-lights
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.udendorslamper
- type: custom:mushroom-template-card
primary: Sluk ude
secondary: Alle udendors
icon: mdi:string-lights-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.udendorslamper
- type: grid
cards:
- type: heading
heading: Stue
- type: custom:mushroom-light-card
entity: light.livingroom
name: Stue samlet
icon: mdi:sofa
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Bright
secondary: Scene
icon: mdi:brightness-7
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_bright
- type: custom:mushroom-template-card
primary: Annes favorit
secondary: Scene
icon: mdi:heart-outline
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_annes_favorit
- type: custom:mushroom-template-card
primary: Relax
secondary: Scene
icon: mdi:sofa-outline
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_relax_minus_syd
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.monthly_color_scene
- type: custom:mushroom-template-card
primary: Raketloop
secondary: Script
icon: mdi:rocket-launch
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.raketloop
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.raket
name: Raket
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spisebord
name: Spisebord
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.syd
name: Syd
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.panton
name: Panton
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.pendle1
name: Pendle 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.pendle2
name: Pendle 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Andreas
- type: custom:mushroom-light-card
entity: light.andreas_vaerelse
name: Andreas samlet
icon: mdi:bed
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:white-balance-sunny
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.andreas_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.andreas_color_scene
- type: custom:mushroom-template-card
primary: Andreasloop
secondary: Toggle
icon: mdi:sync
entity: switch.andreas_colorloop_toggle
tap_action:
action: toggle
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.andreas_lysstrip
name: Lysstrip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.andreas_stol
name: Stol
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Daniel
- type: custom:mushroom-light-card
entity: light.daniels_vaerelse
name: Daniel samlet
icon: mdi:bed
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:white-balance-sunny
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.daniel_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.daniel_color_scene
- type: custom:mushroom-template-card
primary: Danielloop
secondary: Toggle
icon: mdi:sync
entity: switch.daniel_colorloop_toggle
tap_action:
action: toggle
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.daniel_lysstrip
name: Lysstrip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bamse
name: Bamse
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Sovevaerelse
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend alle
secondary: Sovevaerelse
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
- type: custom:mushroom-template-card
primary: Sluk alle
secondary: Sovevaerelse
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:weather-night
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.bed_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.bed_color_scene
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.claus
name: Claus
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.anne
name: Anne
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_dor
name: Dor
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_midt
name: Midt
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_vindue
name: Vindue
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Badevaerelse
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend alle
secondary: Badevaerelse
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.bad_nw
- light.bad_ne
- light.bad_sw
- light.bad_se
- light.spejl1
- light.spejl2
- light.badevaerelse_2
- type: custom:mushroom-template-card
primary: Sluk alle
secondary: Badevaerelse
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.bad_nw
- light.bad_ne
- light.bad_sw
- light.bad_se
- light.spejl1
- light.spejl2
- light.badevaerelse_2
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.bad_nw
name: Bad NV
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_ne
name: Bad NO
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_sw
name: Bad SV
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_se
name: Bad SO
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spejl1
name: Spejl 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spejl2
name: Spejl 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.badevaerelse_2
name: Ekstra bad
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Gang og forgang
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend gang
secondary: Fordelingsgang
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.fordelingsgang_1
- light.fordelingsgang_2
- light.fordelingsgang_3
- light.fordelingsgang_4
- light.fordelingsgang_5
- type: custom:mushroom-template-card
primary: Sluk gang
secondary: Fordelingsgang
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.fordelingsgang_1
- light.fordelingsgang_2
- light.fordelingsgang_3
- light.fordelingsgang_4
- light.fordelingsgang_5
- type: custom:mushroom-light-card
entity: light.forgang
name: Forgang
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.fordelingsgang_1
name: Gang 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_2
name: Gang 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_3
name: Gang 3
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_4
name: Gang 4
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_5
name: Gang 5
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Ude og have
- type: custom:mushroom-light-card
entity: light.udendorslamper
name: Alle udelys
icon: mdi:pine-tree
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Have standard
secondary: Script
icon: mdi:flower-outline
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.have_standard_colors
- type: custom:mushroom-template-card
primary: Have farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.have_color_scene
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.garage
name: Garage
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordoer
name: Fordor
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udendors_forgang
name: Forgang ude
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.indkorsel_plug
name: Indkorsel
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_1
name: Have spot 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_2
name: Have spot 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_3
name: Have spot 3
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Julelys
- type: custom:mushroom-light-card
entity: light.julelys
name: Alt julelys
icon: mdi:string-lights
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.ronnebaer
name: Ronnebaer
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.koste
name: Koste
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.terasse
name: Terrasse
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.paradis
name: Paradis
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udetrae
name: Udetrae
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.on_off_plug_2
name: Juleplug
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Ovrige
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.sauna
name: Sauna
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.strip
name: Strip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sonoff_10006a2cdd
name: Sonoff ekstra
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)
-13
View File
@@ -1,13 +0,0 @@
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
-19
View File
@@ -1,19 +0,0 @@
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
-13
View File
@@ -1,13 +0,0 @@
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
-92
View File
@@ -1,92 +0,0 @@
## 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
-8
View File
@@ -1,8 +0,0 @@
services:
unifi:
container_name: jacobalberty-unifi-1
image: jacobalberty/unifi:latest
restart: always
network_mode: host
volumes:
- /volume1/docker/unifi:/var/lib/unifi
-48
View File
@@ -1,48 +0,0 @@
# 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).
-111
View File
@@ -1,111 +0,0 @@
# 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
-6
View File
@@ -1,6 +0,0 @@
# Google Keep basis-indkøbsliste
# En vare per linje. Linjer der starter med # ignoreres.
# Eksempel:
# Mælk
# Toiletpapir
# Bananer
@@ -1,41 +0,0 @@
# 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.
-85
View File
@@ -1,85 +0,0 @@
# 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 35 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*
-173
View File
@@ -1,173 +0,0 @@
# Ø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 |
-289
View File
@@ -1,289 +0,0 @@
# 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 |
-338
View File
@@ -1,338 +0,0 @@
# 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
@@ -1,509 +0,0 @@
# 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.
@@ -1,248 +0,0 @@
# 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.**
@@ -1,262 +0,0 @@
# 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
-252
View File
@@ -1,252 +0,0 @@
# 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``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.
-91
View File
@@ -1,91 +0,0 @@
# 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 | 184192 | 188192 | 184 | Stærk, tæt på koordinator |
| stik_andreas | 184192 | 188192 | 184 | Stærk, tæt på koordinator |
| stik_soveværelse | 76192 | 76188 | 84 | Svingende — route-afhængig |
| stik_quooker | 144152 | 124148 | 144 | God |
| stik_sonos_stue | 108152 | 108152 | 148 | God |
| stik_lillebad | 112136 | 112136 | 144 | OKGod |
| stik_daniel | — | 100120 | 92 | OK |
| stik_bryggers | 100132 | 100132 | 108 | OK |
| stik_bad | 40104 | 96144 | 144 | Forbedret |
| stik_kontor | 5296 | 7296 | 96 | Forbedret |
| stik_fryser | 5684 | 5684 | 84 | Forbedret |
| stik_indkørsel | 4480 | 56124 | 84 | OK efter genstart |
| garageport sensor | 4092 | 5292 | 84 | Bedste måling! |
| badevarelse | 108136 | 108136 | 144 | God |
| stue | 84116 | 84116 | 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 4080
- **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`
+2 -14
View File
@@ -2,21 +2,9 @@
trigger:
platform: state
entity_id: binary_sensor.indkorsel_sensor_motion
to: 'on'
conditions:
to: 'on' condition:
- condition: template
value_template: >-
{% 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:
value_template: "{{ states('input_number.ai_gemini_calls_today') | int < 20 }}" actions:
- action: script.overvaagning
metadata: {}
data: {}
+48 -20
View File
@@ -7,10 +7,6 @@
- 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
@@ -35,8 +31,6 @@
- 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
@@ -53,6 +47,30 @@
- service: homeassistant.turn_off
entity_id: switch.sonos_alarm_445
- alias: 'Turn on alarms Andreas Tuesdays'
trigger:
platform: time
at: '20:05:20'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'on'
action:
- service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1824
- alias: 'Turn off alarms Andreas Tuesdays'
trigger:
platform: time
at: '20:00:20'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'off'
action:
- service: homeassistant.turn_off
entity_id: switch.sonos_alarm_1824
- alias: 'Turn on alarms Andreas Saturdays'
trigger:
platform: time
@@ -64,8 +82,6 @@
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
@@ -86,8 +102,6 @@
- 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
@@ -113,8 +127,6 @@
- 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
@@ -140,8 +152,6 @@
- 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
@@ -169,8 +179,6 @@
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
@@ -193,10 +201,6 @@
- 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
@@ -214,3 +218,27 @@
- 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,13 +29,10 @@
action:
- variables:
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:
- light.indkorsel_2
- light.extended_color_light_1
- light.garage
lights_to_turn_on: >
{{ lights | select('is_state','off') | list }}
@@ -48,17 +45,9 @@
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
+66 -67
View File
@@ -1,69 +1,68 @@
- id: hue_switch_garage_and_lights
alias: Hue switch - garage og lys
mode: restart
- id: '1691939802290'
alias: Åbn garage ved tryk på 1
description: ''
trigger:
- platform: device
domain: hue
device_id: 5f6b41e54f3226acd9c9ab54a3acb527
type: initial_press
subtype: 1
id: open_garage
- platform: device
domain: hue
device_id: 5f6b41e54f3226acd9c9ab54a3acb527
type: long_press
subtype: 1
id: close_garage
- platform: device
domain: hue
device_id: 5f6b41e54f3226acd9c9ab54a3acb527
type: initial_press
subtype: 4
id: lights_off
- platform: device
domain: hue
device_id: 5f6b41e54f3226acd9c9ab54a3acb527
type: long_press
subtype: 4
id: lights_on
- device_id: 5f6b41e54f3226acd9c9ab54a3acb527
domain: hue
platform: device
type: initial_press
subtype: 1
unique_id: 4b8a056e-973f-48cf-8a19-3586f6b05dcf
condition: []
action:
- choose:
- conditions:
- condition: trigger
id: open_garage
sequence:
- condition: state
entity_id: binary_sensor.garageport
state: "off"
- service: cover.toggle
target:
entity_id: cover.anne
- conditions:
- condition: trigger
id: close_garage
sequence:
- condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
target:
entity_id: cover.anne
- conditions:
- condition: trigger
id: lights_off
sequence:
- service: light.turn_off
target:
entity_id: light.alle_lys
- conditions:
- condition: trigger
id: lights_on
sequence:
- service: light.turn_on
target:
entity_id: light.alle_lys
- device_id: 3bc3eab99b46dae3e469bfa4060ce0f5
domain: cover
entity_id: 4bd9c13b7bb0cc3245e38211ded2be92
type: open
mode: single
- id: '1691941083623'
alias: Sluk alt lys ved tryk på 0
description: ''
trigger:
- device_id: 5f6b41e54f3226acd9c9ab54a3acb527
domain: hue
platform: device
type: initial_press
subtype: 4
unique_id: f97d54a1-2283-4fb0-8709-b873a310732b
condition: []
action:
- service: light.turn_off
data: {}
target:
entity_id: light.alle_lys
mode: single
- id: '1691941222856'
alias: Tænd alt lyset ved langt tryk på 0
description: ''
trigger:
- device_id: 5f6b41e54f3226acd9c9ab54a3acb527
domain: hue
platform: device
type: long_press
subtype: 4
unique_id: f97d54a1-2283-4fb0-8709-b873a310732b
condition: []
action:
- service: light.turn_on
data: {}
target:
entity_id: light.alle_lys
mode: single
- id: '1692023138692'
alias: Luk garage ved langt tryk på '1'
description: ''
trigger:
- device_id: 5f6b41e54f3226acd9c9ab54a3acb527
domain: hue
platform: device
type: long_press
subtype: 1
unique_id: 4b8a056e-973f-48cf-8a19-3586f6b05dcf
condition: []
action:
- device_id: 3bc3eab99b46dae3e469bfa4060ce0f5
domain: cover
entity_id: 4bd9c13b7bb0cc3245e38211ded2be92
type: close
mode: single
@@ -3,16 +3,8 @@
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
- service: notify.mobile_app_clausiphone15
data:
message: "Der er nogen i indkørslen"
# - service: script.sonos_say
+35 -40
View File
@@ -1,46 +1,42 @@
- alias: "Der er nogen i huset"
mode: single
trigger:
- platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion_2
to: "on"
- platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
to: "on"
- platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion_2
to: "on"
- platform: state
entity_id: binary_sensor.bad_motion_sensor_motion
to: "on"
- platform: state
entity_id: binary_sensor.gang_sensor_motion
to: "on"
- platform: state
entity_id: binary_sensor.forgang_sensor_motion
to: "on"
condition:
- condition: state
entity_id: binary_sensor.family_presence
state: "off"
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state:
- cleaning
- returning
action:
- service: notify.mobile_app_claus_iphone_15pro
- alias: 'Der er nogen i huset'
trigger:
- platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion_2
to: 'on'
- platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
to: 'on'
- platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion_2
to: 'on'
- platform: state
entity_id: binary_sensor.bad_motion_sensor_motion
to: 'on'
- platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'on'
- platform: state
entity_id: binary_sensor.forgang_sensor_motion
to: 'on'
condition:
- condition: state
entity_id: group.nogen_hjemme
state: 'Away'
action:
- service: notify.mobile_app_clausiphone
data:
message: >-
Der er nogen i huset.
Bevægelse registreret af {{ trigger.to_state.name or trigger.entity_id }}.
message: "Der er nogen i huset"
# - service: script.sonos_say
# data:
# sonos_entity: media_player.alrum
# volume: 0.4
# delay: '00:00:05'
# message: 'Der er nogen i indkørslen'
- service: scene.create
data:
scene_id: before
snapshot_entities:
- light.pendle1
- light.pendle1
- service: light.turn_on
data:
entity_id: light.pendle1
@@ -49,8 +45,7 @@
flash: long
- delay: 2
- service: scene.turn_on
target:
entity_id: scene.before
entity_id: scene.before
+430
View File
@@ -0,0 +1,430 @@
# 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_clausiphone15
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_clausiphone15
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_clausiphone15
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_clausiphone15
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
+262 -113
View File
@@ -10,32 +10,6 @@
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
@@ -53,28 +27,39 @@
- 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: notify.mobile_app_clausiphone15
data:
message: Det ringer på bagdøren (2) - 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.8
volume_level: 0.5
target:
entity_id: media_player.andreas
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.andreas
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/doorbell.mp3
media_content_id: media-source://media_source/local/german-shephard.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell.mp3
title: german-shephard.mp3
thumbnail:
media_class: music
children_media_class:
@@ -82,95 +67,259 @@
- {}
- 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 - doublepress
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - doublepress
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
- 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
- service: notify.mobile_app_clausiphone15
data:
message: Det ringer på bagdøren (2) - 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:
lydfil: dog-barking-2-bullmastiff.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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 - triple-press
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - triple-press
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
- 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
- service: notify.mobile_app_clausiphone15
data:
message: Det ringer på bagdøren (2) - 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:
lydfil: two-tone-chime.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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 - long-press
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - long-press
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:
@@ -1,21 +0,0 @@
- 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
+327 -121
View File
@@ -11,61 +11,51 @@
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
- service: notify.mobile_app_clausiphone15
data:
message: Det ringer på fordøren
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på fordøren
- 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:
lydfil: "{{ lille_bad_lydfil }}"
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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:
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
@@ -80,104 +70,320 @@
- 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: "06:00:00"
before: "23:59:00"
sequence:
- service: scene.turn_on
target:
entity_id: scene.forgang_bright
default:
- service: scene.turn_on
target:
entity_id: scene.forgang_dimmed
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
- 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
- service: notify.mobile_app_clausiphone15
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:
lydfil: german-shephard.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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
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
- service: notify.mobile_app_clausiphone15
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:
lydfil: dog-barking-2-bullmastiff.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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
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
- service: notify.mobile_app_clausiphone15
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:
lydfil: two-tone-chime.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
volume_level: 0.5
target:
entity_id: tts.google_ai_tts
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
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
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:
+10 -13
View File
@@ -4,16 +4,16 @@
trigger:
- platform: state
entity_id: binary_sensor.garageport
to: "on"
entity_id: cover.anne
to: "open"
- platform: time
at: "21:00:00"
condition:
- condition: state
entity_id: binary_sensor.garageport
state: "on"
entity_id: cover.anne
state: "open"
action:
- delay: "00:05:00"
@@ -21,12 +21,12 @@
- repeat:
while:
- condition: state
entity_id: binary_sensor.garageport
state: "on"
entity_id: cover.anne
state: "open"
sequence:
- service: notify.mobile_app_claus_iphone_15pro
- service: notify.mobile_app_clausiphone15
data:
title: "Garageport"
message: "Garageporten er åben. Skal garageporten lukkes?"
@@ -51,8 +51,8 @@
action: IGNORE_GARAGE_ANNE
- platform: state
entity_id: binary_sensor.garageport
to: "off"
entity_id: cover.anne
to: "closed"
timeout: "00:30:00"
@@ -62,10 +62,7 @@
- condition: template
value_template: "{{ wait.trigger.event.data.action == 'CLOSE_GARAGE_ANNE' }}"
sequence:
- condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
- service: cover.close_cover
target:
entity_id: cover.anne
- stop: "Garage lukket via notifikation"
-60
View File
@@ -1,60 +0,0 @@
- alias: 'Gardiner - alle lidt nede arbejdsdag'
trigger:
- platform: time
at: '07:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
action:
- service: scene.turn_on
target:
entity_id: scene.alle_lidt_nede
- alias: 'Gardiner - alle lidt nede ikke arbejdsdag'
trigger:
- platform: time
at: '09:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
action:
- service: scene.turn_on
target:
entity_id: scene.alle_lidt_nede
- alias: 'Gardiner - morgen arbejdsdag'
trigger:
- platform: time
at: '06:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
action:
- service: scene.turn_on
target:
entity_id: scene.morgen
- alias: 'Gardiner - morgen ikke arbejdsdag'
trigger:
- platform: time
at: '07:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
action:
- service: scene.turn_on
target:
entity_id: scene.morgen
- alias: 'Gardiner - alt ned kl 21'
trigger:
- platform: time
at: '21:00:00'
action:
- service: scene.turn_on
target:
entity_id: scene.n22_alt_ned
-1
View File
@@ -14,7 +14,6 @@
data:
group_members:
- media_player.badevaerelse
- media_player.lille_badevaerelse
- media_player.sovevaerelse
- media_player.stue
- media_player.alrum
@@ -1,53 +0,0 @@
- 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
@@ -1,26 +0,0 @@
- id: ingen_hjemme_sluk_lys_og_sonos
alias: "Ingen hjemme - sluk lys og Sonos"
mode: single
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: "off"
for:
minutes: 2
action:
- service: light.turn_off
target:
entity_id: light.indendorslamper
- service: media_player.media_stop
target:
entity_id:
- media_player.stue
- media_player.andreas
- media_player.daniel
- media_player.kokken
- media_player.alrum
- media_player.badevaerelse
- media_player.sovevaerelse
- media_player.lille_badevaerelse
- media_player.kontor
-10
View File
@@ -10,8 +10,6 @@
- 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:
@@ -21,9 +19,6 @@
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:
@@ -36,8 +31,6 @@
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:
@@ -47,9 +40,6 @@
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:
+11 -11
View File
@@ -5,14 +5,14 @@
to: 'home'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Mor kommer hjem'
- alias: 'Daniel kommer hjem (mor)'
trigger:
platform: state
entity_id: device_tracker.unifi_daniel
entity_id: device_tracker.daniels_iphone_7_3
to: 'home'
action:
@@ -23,18 +23,18 @@
- alias: 'Daniel kommer hjem'
trigger:
platform: state
entity_id: device_tracker.unifi_daniel
entity_id: device_tracker.daniels_iphone_7_3
to: 'home'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Daniel kommer hjem'
- alias: 'Andreas kommer hjem (mor)'
trigger:
platform: state
entity_id: device_tracker.unifi_andreas
entity_id: device_tracker.andreas_iphone_12
to: 'home'
action:
@@ -46,11 +46,11 @@
- alias: 'Andreas kommer hjem'
trigger:
platform: state
entity_id: device_tracker.unifi_andreas
entity_id: device_tracker.andreas_iphone_12
to: 'home'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Andreas kommer hjem'
@@ -74,7 +74,7 @@
to: 'Skole'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Andreas ankommer til skole'
@@ -85,7 +85,7 @@
from: 'Skole'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Andreas tager fra skole'
@@ -110,7 +110,7 @@
to: 'Østre Alle'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Daniel ankommer til skole'
@@ -121,7 +121,7 @@
from: 'Skole'
action:
service: notify.mobile_app_claus_iphone_15pro
service: notify.mobile_app_clausiphone15
data:
message: 'Daniel tager fra skole'
+1 -5
View File
@@ -35,15 +35,11 @@
value_template: >
{% set t = now().strftime('%H%M') | int %}
{% if is_state('binary_sensor.arbejdsdag','on') %}
{{ 700 <= t <= 1945 }}
{{ 630 <= t <= 1945 }}
{% else %}
{{ 1000 <= t <= 2030 }}
{% endif %}
# Ikke syg
- condition: template
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
sequence:
- service: light.turn_on
+2 -126
View File
@@ -1,27 +1,3 @@
- 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
@@ -31,12 +7,6 @@
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:0022:00)
@@ -79,104 +49,10 @@
- platform: state
entity_id: binary_sensor.badevaerelse_bevaegelse
to: "off"
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 %}
for:
minutes: 3 # Standard nat-timeout, kan ændres til 10 for dag, osv.
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
+86 -52
View File
@@ -1,60 +1,94 @@
- id: daniel_motion_lys
alias: Daniel lys via bevaegelse
mode: restart
# - 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
trigger:
- platform: state
- alias: 'Lys Daniel dag - arbejdsdag'
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
to: "on"
id: motion_on
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'
action:
- service: homeassistant.turn_on
target:
entity_id: light.daniels_vaerelse
data:
brightness_pct: 100
- platform: state
- alias: 'Lys Daniel dag - ikke arbejdsdag'
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
to: "off"
id: motion_off
to: 'on'
condition:
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_2_illuminance
below: 90
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: time
after: '10:00:00'
before: '19:45:00'
action:
- service: homeassistant.turn_on
target:
entity_id: light.daniels_vaerelse
data:
brightness_pct: 100
variables:
lux_limit: "{{ states('input_number.daniel_lux_threshold') | int }}"
brightness: "{{ states('input_number.daniel_brightness') | int }}"
timeout: "{{ states('input_number.daniel_timeout') | int }}"
# - 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
action:
- 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: "{{ brightness }}"
# 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.hue_motion_sensor_2_motion
state: "off"
- service: light.turn_off
target:
entity_id: light.daniels_vaerelse
- 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
-87
View File
@@ -1,87 +0,0 @@
- id: forgang_motion_lys
alias: Forgang lys via bevægelse
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.forgang_bevaegelse
to: "on"
condition:
- condition: numeric_state
entity_id: sensor.forgang_sensor_illuminance
below: 60
action:
- choose:
- conditions:
- condition: time
after: "06:00:00"
before: "23:59:00"
sequence:
- service: scene.turn_on
target:
entity_id: scene.forgang_bright
default:
- service: scene.turn_on
target:
entity_id: scene.forgang_dimmed
- id: forgang_motion_sluk_dag
alias: Sluk forgang lys efter 10 min uden bevægelse
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.forgang_bevaegelse
to: "off"
condition:
- condition: time
after: "06:00:00"
before: "23:59:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.forgang_bevaegelse
to: "on"
timeout: "00:10:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.forgang_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.forgang
- id: forgang_motion_sluk_nat
alias: Sluk forgang lys efter 5 min uden bevægelse om natten
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.forgang_bevaegelse
to: "off"
condition:
- condition: or
conditions:
- condition: time
before: "06:00:00"
- condition: time
after: "23:59:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.forgang_bevaegelse
to: "on"
timeout: "00:05:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.forgang_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.forgang
+163 -60
View File
@@ -1,68 +1,171 @@
- id: gang_motion_lys
alias: Gang lys via bevægelse
mode: restart
trigger:
- platform: state
- alias: 'Lys i gang - arbejdsdag - dag'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: "on"
id: motion_on
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'
action:
- service: scene.turn_on
data:
entity_id: scene.gang_bright
# brightness: 255
# color_temp: 396
- platform: state
- alias: 'Sluk Lys i gang - arbejdsdag - dag'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: "off"
id: motion_off
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
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 %}
- 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
action:
- choose:
- 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
data:
entity_id: light.gang_2
# 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
target:
entity_id: scene.gang_bright
########## NIGHT
# 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
target:
entity_id: scene.gang_daempet_nat
- 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:
- 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
data:
entity_id: light.gang_2
- 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:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: time
after: '22:00:10'
before: '08:00:00'
action:
- service: light.turn_off
data:
entity_id: light.gang_2
# 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.gang_sensor_motion
state: "off"
- service: light.turn_off
target:
entity_id: light.gang
+4 -4
View File
@@ -26,8 +26,8 @@
- alias: 'Lys Garage - tænd hvis garage åbner'
trigger:
platform: state
entity_id: binary_sensor.garageport
to: 'on'
entity_id: cover.anne
to: 'open'
action:
- service: scene.turn_on
data:
@@ -36,8 +36,8 @@
- alias: 'Sluk lys garage 5 min efter lukning'
trigger:
platform: state
entity_id: binary_sensor.garageport
to: 'off'
entity_id: cover.anne
to: 'closed'
for:
minutes: 5
action:
+14 -58
View File
@@ -1,5 +1,4 @@
- id: kontor_motion_lys
alias: Kontor lys via bevægelse
- alias: Kontor lys motion
mode: restart
trigger:
@@ -7,74 +6,31 @@
entity_id: binary_sensor.kontor_motion_bevaegelse
to: "on"
condition:
- condition: template
value_template: >
{{ states('sensor.kontor_belysningsstyrke') | int <
states('input_number.kontor_lux_threshold') | int }}
variables:
timeout: >
{% if now().hour >= 6 and now().hour < 22 %}
{{ states('input_number.kontor_timeout_day') | int }}
{% else %}
{{ states('input_number.kontor_timeout_night') | int }}
{% endif %}
action:
- service: scene.turn_on
target:
entity_id: scene.kontor_klar
- id: kontor_motion_sluk_dag
alias: Sluk kontor lys efter 10 min uden bevægelse
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse
to: "off"
condition:
- condition: time
after: "06:00:00"
before: "23:59:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse
to: "on"
timeout:
minutes: "{{ states('input_number.kontor_timeout_day') | int }}"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.kontor_motion_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.strip
- id: kontor_motion_sluk_nat
alias: Sluk kontor lys efter 5 min uden bevægelse om natten
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse
to: "off"
condition:
- condition: or
conditions:
- condition: time
before: "06:00:00"
- condition: time
after: "23:59:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse
to: "on"
timeout:
minutes: "{{ states('input_number.kontor_timeout_night') | int }}"
continue_on_timeout: true
to: "off"
- delay:
minutes: "{{ timeout }}"
- condition: state
entity_id: binary_sensor.kontor_motion_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.strip
-109
View File
@@ -1,109 +0,0 @@
- id: skab_claus_motion_lys
alias: Lys skab Claus
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
to: "on"
condition:
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_1_illuminance
below: 90
action:
- choose:
- conditions:
- condition: time
after: "06:00:00"
before: "23:59:00"
sequence:
- service: light.turn_on
target:
entity_id: light.skab_1
data:
brightness_pct: 100
rgb_color: [20, 255, 127]
default:
- service: scene.turn_on
target:
entity_id: scene.skab_daempet
- id: skab_claus_motion_sluk
alias: Sluk lys i skab Claus
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
to: "off"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
to: "on"
timeout: "00:01:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
state: "off"
- service: light.turn_off
target:
entity_id: light.skab_1
- id: skab_anne_motion_lys
alias: Lys skab Anne
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.motion
to: "on"
condition:
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_1_illuminance_2
below: 90
action:
- choose:
- conditions:
- condition: time
after: "06:00:00"
before: "23:59:00"
sequence:
- service: light.turn_on
target:
entity_id: light.skab_1
data:
brightness_pct: 100
rgb_color: [254, 11, 255]
default:
- service: scene.turn_on
target:
entity_id: scene.skab_daempet
- id: skab_anne_motion_sluk
alias: Sluk lys i skab Anne
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.motion
to: "off"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.motion
to: "on"
timeout: "00:01:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.motion
state: "off"
- service: light.turn_off
target:
entity_id: light.skab_1
-15
View File
@@ -6,10 +6,6 @@
- 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
@@ -29,10 +25,6 @@
- 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:
@@ -55,10 +47,6 @@
- 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:
@@ -173,9 +161,6 @@
- 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:
-138
View File
@@ -1,138 +0,0 @@
- id: stue_motion_lys
alias: Stue lys via bevaegelse
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "on"
id: motion_on
- 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: 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: 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:
entity_id: scene.stue_annes_favorit
default:
- service: scene.turn_on
target:
entity_id: scene.stue_relax_minus_syd
# 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
# 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"
- condition: state
entity_id: media_player.samsung_s95ca_55_3
state: "off"
- service: light.turn_off
target:
entity_id: light.livingroom
-32
View File
@@ -1,32 +0,0 @@
- id: lys_syd_taend_ved_macbook_aktiv
alias: Tænd lys syd ved aktiv MacBook
mode: single
trigger:
- platform: state
entity_id: binary_sensor.clauss_macbook_air_2_active
to: "on"
condition:
- condition: numeric_state
entity_id: sensor.stue_motion_belysningsstyrke
below: 60
action:
- service: light.turn_on
target:
entity_id: light.syd
- id: lys_syd_sluk_ved_macbook_inaktiv
alias: Sluk lys syd ved inaktiv MacBook
mode: single
trigger:
- platform: state
entity_id: binary_sensor.clauss_macbook_air_2_active
to: "off"
action:
- service: light.turn_off
target:
entity_id: light.syd
+3 -21
View File
@@ -16,9 +16,6 @@
- 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:
@@ -33,9 +30,6 @@
- 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:
@@ -49,9 +43,6 @@
- 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:
@@ -61,9 +52,6 @@
- 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'
@@ -90,9 +78,6 @@
- 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:
@@ -112,11 +97,8 @@
# entity_id: sun.sun
# state: below_horizon
action:
- service: light.turn_off
data:
entity_id: light.indkorsel_2
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
service: light.turn_off
data:
entity_id: light.indkorsel_2
+7 -13
View File
@@ -19,10 +19,7 @@
entity_id:
- light.drivhus
- light.paradis
- condition: template
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
- service: homeassistant.turn_on
entity_id: light.extended_color_light_1
- light.extended_color_light_1
- alias: 'Sluk lys ved garage'
trigger:
@@ -32,15 +29,12 @@
for:
minutes: 10
action:
- service: homeassistant.turn_off
data:
entity_id:
- light.drivhus
- light.paradis
- condition: template
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
- service: homeassistant.turn_off
entity_id: light.extended_color_light_1
service: homeassistant.turn_off
data:
entity_id:
- light.drivhus
- light.paradis
- light.extended_color_light_1
-22
View File
@@ -1,22 +0,0 @@
- 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,128 +1,51 @@
- id: garage_auto_claus_presence
- id: garage_auto_claus_distance
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
- platform: numeric_state
entity_id: sensor.claus_distance_home
below: 40
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
- platform: numeric_state
entity_id: sensor.claus_distance_home
above: 60
id: leaving
condition:
- condition: time
after: "05:00:00"
before: "23:00:00"
after: "05:30:00"
before: "22:30:00"
- condition: state
entity_id: device_tracker.snowywhite_location_tracker
state: "home"
action:
- choose:
# ÅBN via telefon: garage lukket + forlod hjemmet i bil
# ÅBN
- conditions:
- condition: trigger
id: arriving
- condition: state
entity_id: binary_sensor.garageport
state: "off"
# Vi ved at brugeren kørte hjemmefra
- condition: state
entity_id: input_boolean.left_home_by_car
state: "on"
entity_id: cover.anne
state: "closed"
sequence:
- service: cover.toggle
- service: cover.open_cover
target:
entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage åbnet (ankomst i bil)"
# ÅBN via bil-tracker: telefon allerede hjemme + forlod i bil
- conditions:
- condition: trigger
id: car_arriving
- condition: state
entity_id: binary_sensor.garageport
state: "off"
- condition: state
entity_id: device_tracker.claus_iphone_15pro
state: "home"
- condition: state
entity_id: input_boolean.left_home_by_car
state: "on"
sequence:
- service: cover.toggle
target:
entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage åbnet (bil-tracker ankomst)"
# LUK: garage åben + forlader hjemmet => kører i bil
# LUK
- conditions:
- condition: trigger
id: leaving
- condition: state
entity_id: binary_sensor.garageport
state: "on"
entity_id: cover.anne
state: "open"
sequence:
# Markér at vi kørte hjemmefra (bruges ved ankomst)
- service: input_boolean.turn_on
target:
entity_id: input_boolean.left_home_by_car
- delay: "00:00:30"
# Dobbelttjek at garagen stadig er åben efter forsinkelsen
- condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
- service: cover.close_cover
target:
entity_id: cover.anne
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage lukket (afrejse i bil)"
mode: single
max_exceeded: silent
-178
View File
@@ -1,178 +0,0 @@
- id: dishwasher_plan_cheapest_night_run
alias: Opvaskemaskine - plan billigste natkørsel
mode: single
trigger:
- platform: state
entity_id: sensor.energi_data_service
- platform: time
at: "13:10:00"
variables:
best_start_ts: >
{% set raw = (state_attr('sensor.energi_data_service', 'raw_today') or []) + (state_attr('sensor.energi_data_service', 'raw_tomorrow') or []) %}
{% set ns = namespace(prices=[], candidates=[]) %}
{% set fallback_ts = as_timestamp(today_at('23:50')) | int %}
{% for item in raw %}
{% set dt_source = item.start if item.start is defined else item.hour if item.hour is defined else item.time if item.time is defined else none %}
{% if dt_source %}
{% if item.price is defined %}
{% set price = item.price | float(999) %}
{% elif item.value is defined %}
{% set price = item.value | float(999) %}
{% else %}
{% set price = 999 %}
{% endif %}
{% set ns.prices = ns.prices + [{'ts': as_timestamp(as_datetime(dt_source)) | int, 'price': price}] %}
{% endif %}
{% endfor %}
{% set tomorrow_midnight = (as_timestamp(today_at('00:00')) | int) + 86400 %}
{% set candidate_starts = [
as_timestamp(today_at('21:00')) | int,
as_timestamp(today_at('22:00')) | int,
as_timestamp(today_at('23:00')) | int,
tomorrow_midnight,
tomorrow_midnight + 3600,
tomorrow_midnight + 7200
] %}
{% for base in candidate_starts %}
{% set total = namespace(value=0, missing=false) %}
{% for offset in range(4) %}
{% set target = base + (offset * 3600) %}
{% set matches = ns.prices | selectattr('ts', 'eq', target) | list %}
{% if matches | count > 0 %}
{% set total.value = total.value + (matches[0].price | float(999)) %}
{% else %}
{% set total.missing = true %}
{% endif %}
{% endfor %}
{% if not total.missing %}
{% set ns.candidates = ns.candidates + [{'ts': base, 'total': total.value}] %}
{% endif %}
{% endfor %}
{% set sorted = ns.candidates | sort(attribute='total') %}
{{ (sorted | first).ts if (sorted | count) > 0 else fallback_ts }}
action:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.dishwasher_next_start
data:
timestamp: "{{ best_start_ts | int }}"
- id: dishwasher_start_planned_night_run
alias: Opvaskemaskine - start planlagt natkørsel
mode: single
trigger:
- platform: time
at: input_datetime.dishwasher_next_start
condition:
- condition: template
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.dishwasher_fjernbetjening
state: "on"
sequence:
- service: button.press
target:
entity_id: button.dishwasher_start
default:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Opvaskemaskine venter på remote control"
message: "Planlagt natkørsel kunne ikke startes, fordi fjernbetjening ikke er slået til."
- id: dishwasher_remote_control_hourly_reminder
alias: Opvaskemaskine - påmindelse om remote control
mode: single
trigger:
- platform: time_pattern
minutes: "/15"
condition:
- condition: template
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: "{{ 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: "⚠️ 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
-195
View File
@@ -1,195 +0,0 @@
- 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:
- platform: time
at: '09:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.family_presence
state: 'on'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen startede IKKE kl. 9 - der er nogen hjemme."
- conditions:
- condition: or
conditions:
- condition: state
entity_id: weather.home
attribute: condition
state: 'rainy'
- condition: state
entity_id: weather.home
attribute: condition
state: 'pouring'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen startede IKKE kl. 9 - det regner."
default:
- 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 startet."
- alias: 'Plæneklipper - dock arbejdsdag'
description: 'Send plæneklipper hjem kl 13 på arbejdsdage'
trigger:
- platform: time
at: '13:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
action:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er sendt hjem (kl. 13 stop)."
- alias: 'Plæneklipper - stop ved regn'
description: 'Send plæneklipper hjem hvis det begynder at regne'
trigger:
- platform: state
entity_id: weather.home
attribute: condition
to: 'rainy'
- platform: state
entity_id: weather.home
attribute: condition
to: 'pouring'
condition:
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
action:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er sendt hjem - det begyndte at regne."
- alias: 'Plæneklipper - stop når nogen kommer hjem'
description: 'Send plæneklipper hjem når nogen ankommer'
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: 'on'
condition:
- 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:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
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."
@@ -1,194 +0,0 @@
- alias: Presence Simulation - Tidsblokke (realistisk)
mode: restart
trigger:
- platform: time
at: "07:00:00"
- platform: time
at: "12:00:00"
- platform: time
at: "18:00:00"
condition:
- condition: state
entity_id: input_boolean.presence_simulation
state: "on"
action:
- variables:
lights_morning:
- light.livingroom
- light.indkorsel_2
- light.andreas_vaerelse
- light.bedroom
- light.daniels_vaerelse
- light.forgang
lights_midday:
- light.livingroom
lights_evening:
- light.livingroom
- light.indkorsel_2
- light.andreas_vaerelse
- light.bedroom
- light.daniels_vaerelse
- light.forgang
rand_music: "{{ range(0,100) | random }}"
- choose:
# 🌅 MORGEN
- conditions:
- condition: time
after: "06:59:00"
before: "12:00:00"
sequence:
- repeat:
for_each: "{{ lights_morning }}"
sequence:
- service: light.turn_on
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(30,180) | random }}"
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- delay:
minutes: "{{ range(10,30) | random }}"
- repeat:
for_each: "{{ lights_morning | reverse }}"
sequence:
- service: light.turn_off
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(20,120) | random }}"
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- choose:
- conditions:
- condition: template
value_template: "{{ rand_music < 20 }}"
sequence:
- service: media_player.play_media
target:
entity_id: media_player.kokken
data:
media_content_type: music
media_content_id: "spotify:playlist:37i9dQZF1EVHGWrwldPRtj"
- delay:
minutes: "{{ range(5,15) | random }}"
- service: media_player.media_stop
target:
entity_id: media_player.kokken
# 🌤️ MIDDAG
- conditions:
- condition: time
after: "11:59:00"
before: "18:00:00"
sequence:
- repeat:
for_each: "{{ lights_midday }}"
sequence:
- service: light.turn_on
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(60,300) | random }}"
- delay:
minutes: "{{ range(5,20) | random }}"
- repeat:
for_each: "{{ lights_midday | reverse }}"
sequence:
- service: light.turn_off
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(30,180) | random }}"
- choose:
- conditions:
- condition: template
value_template: "{{ rand_music < 30 }}"
sequence:
- service: media_player.play_media
target:
entity_id: media_player.kokken
data:
media_content_type: music
media_content_id: "spotify:playlist:37i9dQZF1EVHGWrwldPRtj"
- delay:
minutes: "{{ range(5,15) | random }}"
- service: media_player.media_stop
target:
entity_id: media_player.kokken
# 🌙 AFTEN
- conditions:
- condition: time
after: "17:59:00"
before: "22:30:00"
sequence:
- repeat:
for_each: "{{ lights_evening }}"
sequence:
- service: light.turn_on
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(20,120) | random }}"
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- delay:
minutes: "{{ range(15,60) | random }}"
- repeat:
for_each: "{{ lights_evening | reverse }}"
sequence:
- service: light.turn_off
target:
entity_id: "{{ repeat.item }}"
- delay:
seconds: "{{ range(20,120) | random }}"
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- choose:
- conditions:
- condition: template
value_template: "{{ rand_music < 50 }}"
sequence:
- service: media_player.play_media
target:
entity_id: media_player.kokken
data:
media_content_type: music
media_content_id: "spotify:playlist:37i9dQZF1EVHGWrwldPRtj"
- delay:
minutes: "{{ range(10,20) | random }}"
- service: media_player.media_stop
target:
entity_id: media_player.kokken
+9
View File
@@ -0,0 +1,9 @@
- alias: Reset AI Gemini Calls Daily
trigger:
platform: time
at: '00:00:00'
action:
- service: input_number.set_value
data:
entity_id: input_number.ai_gemini_calls_today
value: 0
+56 -224
View File
@@ -1,242 +1,74 @@
# 🏠 Track hvornår huset bliver tomt
- id: track_house_empty_time
alias: Track House Empty Time
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: "off"
- platform: homeassistant
event: start
condition:
- condition: state
entity_id: binary_sensor.family_presence
state: "off"
action:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.house_became_empty
data:
timestamp: "{{ now().timestamp() }}"
# 🔄 Reset daglig tæller
- id: roborock_reset_daily_counter
alias: Roborock Reset Daily Counter
trigger:
- platform: time
at: "00:00:00"
action:
- service: input_number.set_value
target:
entity_id: input_number.roborock_auto_runs_today
data:
value: 0
# 🤖 Smart rengøring
- id: roborock_smart_cleaning_start
alias: Roborock Smart Cleaning Start
- id: roborock_smart_cleaning
alias: Roborock Smart Cleaning
mode: single
trigger:
- platform: state
- id: house_empty
platform: state
entity_id: binary_sensor.family_presence
to: "off"
for: "00:05:00"
for: "00:30: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) }}"
- id: someone_home
platform: state
entity_id: binary_sensor.family_presence
to: "on"
- id: midnight
platform: time
at: "00:00:00"
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') }}"
roborock_battery: "{{ states('sensor.roborock_s8_pro_ultra_batteri') | int(0) }}"
roborock_state: "{{ states('vacuum.roborock_s8_pro_ultra') }}"
roborock_status: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}"
roborock_error: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}"
- choose:
# 🔹 Reset daglig tæller ved midnat
- conditions:
- condition: template
value_template: >
{{
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
}}
- condition: trigger
id: midnight
sequence:
- service: input_number.set_value
target:
entity_id: input_number.roborock_auto_runs_today
data:
value: 0
# 🔹 Start rengøring hvis huset har været tomt i 30 min
- conditions:
- condition: trigger
id: house_empty
- condition: numeric_state
entity_id: input_number.roborock_auto_runs_today
below: 2
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: docked
- condition: numeric_state
entity_id: vacuum.roborock_s8_pro_ultra
attribute: battery_level
above: 20
sequence:
- service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
- wait_template: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
timeout: "00:02:00"
- service: input_number.increment
target:
entity_id: input_number.roborock_auto_runs_today
- choose:
- conditions:
- condition: template
value_template: "{{ wait.completed }}"
sequence:
- service: input_number.increment
target:
entity_id: input_number.roborock_auto_runs_today
# 🔹 Stop robotten hvis nogen kommer hjem
- conditions:
- condition: trigger
id: someone_home
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "🧹 Roborock startet"
message: >
Hus har været tomt i {{
((as_timestamp(now()) - state_attr('input_datetime.house_became_empty','timestamp')) / 60) | int
}} min.
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: cleaning
- conditions:
- 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 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) }}.
Batteri: {{ states('sensor.roborock_s8_pro_ultra_batteri') }}%.
Cleaned area: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaned_area') | default('ukendt', true) }}.
Cleaning time: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaning_time') | default('ukendt', true) }}.
default:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "️ Roborock ikke startet"
message: >
Smart rengøring blev sprunget over.
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 }}%.
# 🏠 Stop når nogen kommer hjem
- id: roborock_stop_when_home
alias: Roborock Stop When Someone Comes Home
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: "on"
condition:
- 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
target:
entity_id: vacuum.roborock_s8_pro_ultra
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "🏠 Roborock stoppet"
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
mode: single
trigger:
- platform: time
at: "10:00:00"
condition:
- condition: state
entity_id: binary_sensor.family_presence
state: "off"
- condition: state
entity_id: binary_sensor.arbejdsdag
state: "on"
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: "cleaning"
action:
- service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_syd
# 🧽 Syd vask på arbejdsdage mandag og onsdag
- id: roborock_syd_workday_mop
alias: Roborock vask syd på arbejdsdage mandag og onsdag
mode: single
trigger:
- platform: time
at: "12:00:00"
condition:
- condition: state
entity_id: binary_sensor.family_presence
state: "off"
- condition: state
entity_id: binary_sensor.arbejdsdag
state: "on"
- condition: time
weekday:
- mon
- wed
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: "cleaning"
action:
- service: button.press
target:
entity_id: button.roborock_s8_pro_ultra_syd_vask
sequence:
- service: vacuum.return_to_base
target:
entity_id: vacuum.roborock_s8_pro_ultra
+67
View File
@@ -0,0 +1,67 @@
- alias: 'Lys skab Claus'
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
to: 'on'
condition:
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_1_illuminance
below: 90
- condition: time
after: '06:00:00'
before: '23:00:00'
action:
- service: homeassistant.turn_on
target:
entity_id: light.skab_1
data:
brightness_pct: 100
rgb_color: [20, 255, 127]
- alias: 'Sluk lys i skab Claus'
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_1_motion
to: 'off'
for:
minutes: 1
action:
service: homeassistant.turn_off
data:
entity_id:
- light.skab_1
- alias: 'Lys skab Anne'
trigger:
platform: state
entity_id: binary_sensor.motion
to: 'on'
condition:
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_1_illuminance_2
below: 90
- condition: time
after: '06:00:00'
before: '23:00:00'
action:
- service: homeassistant.turn_on
target:
entity_id: light.skab_1
data:
brightness_pct: 100
rgb_color: [254, 11, 255]
- alias: 'Sluk lys i skab'
trigger:
platform: state
entity_id: binary_sensor.motion
to: 'off'
for:
minutes: 1
action:
service: homeassistant.turn_off
data:
entity_id:
- light.skab_1
@@ -1,39 +0,0 @@
- 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
-11
View File
@@ -1,11 +0,0 @@
- alias: Vacation Mode - Start via dashboard
description: Aktiverer presence simulation, når Vacation Mode tændes fra dashboardet
trigger:
- platform: state
entity_id: input_boolean.vacation_mode
to: "on"
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.presence_simulation
-89
View File
@@ -1,89 +0,0 @@
##################################################
# 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
+7 -12
View File
@@ -3,19 +3,14 @@
- platform: template
value_template: >
{% set deadline_ts = as_timestamp(states('input_datetime.tesla_charge_deadline')) %}
{% if deadline_ts %}
{% set now_ts = as_timestamp(now()) %}
{{ (deadline_ts - now_ts) <= 3600 }}
{% else %}
false
{% endif %}
{% set now_ts = as_timestamp(now()) %}
{{ (deadline_ts - now_ts) <= 3600 }} # 1 time = 3600 sekunder
condition:
- condition: template
value_template: >
{{
states('sensor.snowywhite_battery') | float(0)
< states('number.snowywhite_charge_limit') | float(100)
}}
- condition: numeric_state
entity_id: sensor.tesla_kwh_needed
above: 0
action:
- service: switch.turn_on
target:
-47
View File
@@ -1,47 +0,0 @@
- alias: Tesla set charge deadline at 13:00
id: tesla_set_charge_deadline_daily
trigger:
- 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:
entity_id: input_datetime.tesla_charge_deadline
data:
datetime: >
{{ (now() + timedelta(days=1))
.replace(hour=7, minute=0, second=0, microsecond=0) }}
mode: single
- alias: Tesla set charge deadline when plugged in
id: tesla_set_charge_deadline_on_plug
trigger:
- platform: state
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:
entity_id: input_datetime.tesla_charge_deadline
data:
datetime: >
{{ (now() + timedelta(days=1))
.replace(hour=7, minute=0, second=0, microsecond=0) }}
mode: single
+25 -63
View File
@@ -1,82 +1,44 @@
- alias: Tesla smart charging PRO
id: tesla_smart_charging_pro
mode: restart
- alias: Tesla smart charging v3
mode: single
trigger:
- platform: time_pattern
minutes: "/5"
- platform: time_pattern
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') %}
{{ deadline not in ['unknown','unavailable',''] and as_timestamp(deadline) > as_timestamp(now()) }}
- condition: state
entity_id: binary_sensor.snowywhite_charger
state: "on"
- condition: time
before: input_datetime.tesla_charge_deadline
action:
- variables:
should_charge: "{{ is_state('binary_sensor.tesla_charge_now','on') }}"
currently_charging: "{{ is_state('switch.home_charging', 'on') }}"
last_start: "{{ states('input_datetime.tesla_last_start') }}"
last_start_ts: >
{% if last_start not in ['unknown','unavailable',''] %}
{{ as_timestamp(last_start) }}
{% else %}
0
{% endif %}
runtime: "{{ as_timestamp(now()) - last_start_ts }}"
- choose:
# -------------------------
# START CHARGING
# -------------------------
- conditions:
- condition: template
value_template: "{{ should_charge }}"
- condition: state
entity_id: binary_sensor.tesla_charge_now
state: "on"
sequence:
- if:
- condition: template
value_template: "{{ not currently_charging }}"
then:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.tesla_last_start
data:
datetime: "{{ now().isoformat() }}"
# Reset hvis session står i connected_finished
- choose:
- conditions:
- condition: template
value_template: "{{ states('sensor.home_charger_mode') == 'connected_finished' }}"
sequence:
- service: switch.turn_off
target:
entity_id: switch.home_charging
- delay: "00:00:05"
- service: switch.turn_on
target:
entity_id: switch.home_charging
- service: switch.turn_on
target:
entity_id: switch.home_charging
# -------------------------
# STOP CHARGING (med hysterese)
# -------------------------
- conditions:
- condition: template
value_template: "{{ currently_charging and not should_charge and runtime > 3600 }}"
- condition: state
entity_id: binary_sensor.tesla_charge_now
state: "off"
sequence:
- 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
@@ -1,14 +1,11 @@
# template for "Tesla stop when charged"
- alias: Tesla stop when charged
trigger:
- platform: template
value_template: >
{{ (states('sensor.snowywhite_battery')|float(0)) >=
(states('number.snowywhite_charge_limit')|float(100)) }}
{{ states('sensor.snowywhite_battery')|float >=
states('number.snowywhite_charge_limit')|float }}
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.tesla_manual_override
- service: switch.turn_off
target:
entity_id: switch.home_charging
-2
View File
@@ -10,8 +10,6 @@
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
-27
View File
@@ -1,27 +0,0 @@
- alias: Vacation Mode - Stop ved slutdato
trigger:
- platform: time_pattern
minutes: "/1"
condition:
- condition: state
entity_id: input_boolean.vacation_mode
state: "on"
- condition: template
value_template: >
{% set dt = states('input_datetime.vacation_end') %}
{{ dt not in ['unknown','unavailable',''] and
now() >= as_datetime(dt) }}
action:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.vacation_mode
- input_boolean.presence_simulation
- service: media_player.media_stop
target:
entity_id:
- media_player.kokken
@@ -1,28 +0,0 @@
- alias: Vacation Mode - Recovery efter restart
trigger:
- platform: homeassistant
event: start
condition:
- condition: state
entity_id: input_boolean.vacation_mode
state: "on"
action:
- choose:
- conditions:
- condition: template
value_template: >
{% set dt = states('input_datetime.vacation_end') %}
{{ dt not in ['unknown','unavailable',''] and
now() >= as_datetime(dt) }}
sequence:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.vacation_mode
- input_boolean.presence_simulation
default:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.presence_simulation
@@ -1,16 +0,0 @@
- alias: Vacation Mode - Manuel stop
trigger:
- platform: state
entity_id: input_boolean.vacation_mode
to: "off"
action:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.presence_simulation
- service: media_player.media_stop
target:
entity_id:
- media_player.kokken
+12 -2
View File
@@ -1,2 +1,12 @@
### Kontor-varme styres nu af script.varme_recalculate (include/scripts/varme_styring.yaml)
### Denne fil er beholdt tom for fremtidige manuelle overrides
### 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
-112
View File
@@ -1,112 +0,0 @@
##################################################
# 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
-260
View File
@@ -1,260 +0,0 @@
##################################################
# 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."
-11
View File
@@ -1,11 +0,0 @@
- 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
-3
View File
@@ -1,3 +0,0 @@
badevaerelse_manuel_tilstand:
name: Badeværelse manuel tilstand
initial: off
-4
View File
@@ -1,4 +0,0 @@
left_home_by_car:
name: Forlod hjemmet i bil
icon: mdi:car
initial: false
-3
View File
@@ -1,3 +0,0 @@
gaester:
name: "Gæster hjemme"
icon: mdi:account-group
-7
View File
@@ -1,7 +0,0 @@
vis_alle_vedligehold:
name: Vis alle vedligehold
icon: mdi:eye-outline
dishwasher_reminder_snoozed:
name: Opvaskemaskine - påmindelser snoozed
icon: mdi:bell-sleep
-7
View File
@@ -1,7 +0,0 @@
roborock_manuelt_startet:
name: Roborock manuelt startet
icon: mdi:robot-vacuum
ploeneklipper_manuelt_startet:
name: Plæneklipper manuelt startet
icon: mdi:robot-mower
-3
View File
@@ -1,3 +0,0 @@
tesla_manual_override:
name: Tesla manuel opladning
icon: mdi:car-electric

Some files were not shown because too many files have changed in this diff Show More