LinkTap hovedhane: omdøb entities, dashboard-kort og automatik (åbn før zoner, luk efter, periodisk kapillærvanding)
This commit is contained in:
+1
-1
@@ -1 +1 @@
|
|||||||
2026.5.4
|
2026.6.3
|
||||||
+1
-3
@@ -80,9 +80,7 @@ frontend:
|
|||||||
# Integrations
|
# Integrations
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
duckdns:
|
# duckdns: fjernet fra YAML i 2026.6 - konfigurer via UI (Settings > Integrations > DuckDNS)
|
||||||
domain: !secret duckdns_domain
|
|
||||||
access_token: !secret duckdns_access_token
|
|
||||||
|
|
||||||
sonoff:
|
sonoff:
|
||||||
username: !secret sonoff_username
|
username: !secret sonoff_username
|
||||||
|
|||||||
@@ -7,7 +7,93 @@ max_columns: 2
|
|||||||
|
|
||||||
sections:
|
sections:
|
||||||
|
|
||||||
# 💧 Jordfugt – målere
|
# Hovedhane (LinkTap) – central afspærring før zonerne
|
||||||
|
- type: grid
|
||||||
|
cards:
|
||||||
|
- type: heading
|
||||||
|
heading: Hovedhane (LinkTap)
|
||||||
|
icon: mdi:water-pump
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: valve.hovedhane_linktap
|
||||||
|
name: Hovedhane
|
||||||
|
icon: mdi:water
|
||||||
|
features:
|
||||||
|
- type: valve-open-close
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: binary_sensor.hovedhane_linktap_is_watering
|
||||||
|
name: Vander nu
|
||||||
|
icon: mdi:sprinkler
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_plan_mode_string
|
||||||
|
name: Vandingsplan
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_remain_duration
|
||||||
|
name: Tilbageværende
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_battery
|
||||||
|
name: Batteri
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_signal
|
||||||
|
name: Signal
|
||||||
|
|
||||||
|
- type: entities
|
||||||
|
title: Manuel kørsel
|
||||||
|
entities:
|
||||||
|
- entity: number.hovedhane_linktap_watering_duration
|
||||||
|
name: Varighed (min)
|
||||||
|
- entity: number.hovedhane_linktap_watering_volume
|
||||||
|
name: Volumengrænse (0 = fra)
|
||||||
|
- entity: switch.hovedhane_linktap
|
||||||
|
name: Tænd/sluk vand
|
||||||
|
|
||||||
|
# Hovedhane – flow & status
|
||||||
|
- type: grid
|
||||||
|
cards:
|
||||||
|
- type: heading
|
||||||
|
heading: Hovedhane – flow & status
|
||||||
|
icon: mdi:gauge
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_speed
|
||||||
|
name: Flowhastighed
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_volume
|
||||||
|
name: Volumen denne kørsel
|
||||||
|
|
||||||
|
- type: tile
|
||||||
|
entity: sensor.hovedhane_linktap_total_duration
|
||||||
|
name: Samlet varighed
|
||||||
|
|
||||||
|
- type: glance
|
||||||
|
title: Alarmer & tilstand
|
||||||
|
show_state: true
|
||||||
|
columns: 3
|
||||||
|
entities:
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_linked
|
||||||
|
name: Forbundet
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_paused
|
||||||
|
name: Sat på pause
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_manual_mode
|
||||||
|
name: Manuel
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_leaking
|
||||||
|
name: Lækage
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_clogged
|
||||||
|
name: Tilstoppet
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_cutoff
|
||||||
|
name: Vandstop-fejl
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_broken
|
||||||
|
name: Defekt
|
||||||
|
- entity: binary_sensor.hovedhane_linktap_is_fall
|
||||||
|
name: Faldet
|
||||||
|
|
||||||
|
# �💧 Jordfugt – målere
|
||||||
- type: grid
|
- type: grid
|
||||||
cards:
|
cards:
|
||||||
- type: heading
|
- type: heading
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ panel: true
|
|||||||
|
|
||||||
cards:
|
cards:
|
||||||
- type: iframe
|
- type: iframe
|
||||||
url: /local/snapshots/indkorsel_loader.html?v=20260612061319
|
url: /local/snapshots/indkorsel_loader.html?v=20260618215329
|
||||||
aspect_ratio: 100%
|
aspect_ratio: 100%
|
||||||
|
|||||||
@@ -46,3 +46,16 @@
|
|||||||
|
|
||||||
## Gitea External HTTPS Access
|
## 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).
|
- [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).
|
||||||
|
|
||||||
|
|
||||||
|
## Hemmeligheder i 1Password (Mulighed A)
|
||||||
|
**Baggrund:** `secrets.yaml` indeholder brugernavne, tokens m.m. i fritekst. Home Assistant kræver plaintext på disk ved indlæsning, men kilden kan flyttes til 1Password så hemmeligheder fjernes fra git-historik.
|
||||||
|
|
||||||
|
**Mulighed A — Generér `secrets.yaml` fra 1Password ved deploy:**
|
||||||
|
1. Log selv ind i 1Password CLI: `op signin` (gøres manuelt — ingen master-password deles)
|
||||||
|
2. Opret `secrets.yaml.tpl` med `op://`-referencer i stedet for værdier, fx `tesla_token: "op://HomeAssistant/Tesla/credential"`
|
||||||
|
3. Generér den rigtige fil ved deploy: `op inject -i secrets.yaml.tpl -o secrets.yaml`
|
||||||
|
4. Tilføj `secrets.yaml` til `.gitignore` og commit kun `secrets.yaml.tpl` (med `op://`-referencer, ingen rigtige værdier)
|
||||||
|
5. Evt. lille deploy-script der kører `op inject` automatisk
|
||||||
|
|
||||||
|
**Reel gevinst:** Fjerner hemmeligheder fra git, ikke fra disken (HA kræver plaintext på disk uanset).
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
||||||
battery={{ trigger.payload_json.battery | default('?') }}%
|
battery={{ trigger.payload_json.battery | default('?') }}%
|
||||||
entity_id: input_number.shelly_bagdor_event_cnt
|
entity_id: input_number.shelly_bagdor_event_cnt
|
||||||
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
|
# Stop kun hvis samme counter som sidst (duplikat/periodisk wake-up)
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
|
value_template: "{{ new_cnt != old_cnt }}"
|
||||||
# Bloker ringeklokke om natten (22-06)
|
# Bloker ringeklokke om natten (22-06)
|
||||||
- condition: time
|
- condition: time
|
||||||
after: '06:00:00'
|
after: '06:00:00'
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
event_cnt={{ new_cnt }} (old={{ old_cnt }})
|
||||||
battery={{ trigger.payload_json.battery | default('?') }}%
|
battery={{ trigger.payload_json.battery | default('?') }}%
|
||||||
entity_id: input_number.shelly_fordor_event_cnt
|
entity_id: input_number.shelly_fordor_event_cnt
|
||||||
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
|
# Stop kun hvis samme counter som sidst (duplikat/periodisk wake-up)
|
||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
|
value_template: "{{ new_cnt != old_cnt }}"
|
||||||
# Bloker ringeklokke om natten (22-06)
|
# Bloker ringeklokke om natten (22-06)
|
||||||
- condition: time
|
- condition: time
|
||||||
after: '06:00:00'
|
after: '06:00:00'
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
- switch.hojbed_1
|
- switch.hojbed_1
|
||||||
- switch.hojbed_2
|
- switch.hojbed_2
|
||||||
- switch.drivhus_drypvanding
|
- switch.drivhus_drypvanding
|
||||||
|
- service: switch.turn_off
|
||||||
|
data:
|
||||||
|
entity_id: switch.hovedhane_linktap
|
||||||
|
|
||||||
- alias: 'Vanding sikkerhedsstop nat kl. 23'
|
- alias: 'Vanding sikkerhedsstop nat kl. 23'
|
||||||
trigger:
|
trigger:
|
||||||
@@ -41,4 +44,88 @@
|
|||||||
- switch.hojbed_1
|
- switch.hojbed_1
|
||||||
- switch.hojbed_2
|
- switch.hojbed_2
|
||||||
- switch.drivhus_drypvanding
|
- switch.drivhus_drypvanding
|
||||||
|
- service: switch.turn_off
|
||||||
|
data:
|
||||||
|
entity_id: switch.hovedhane_linktap
|
||||||
|
|
||||||
|
# --- Hovedhane (LinkTap) – central afspærring før zonerne ---
|
||||||
|
|
||||||
|
- alias: 'Hovedhane åbn når en zone starter'
|
||||||
|
mode: queued
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id:
|
||||||
|
- switch.hojbed_1
|
||||||
|
- switch.hojbed_2
|
||||||
|
- switch.hojbed_3
|
||||||
|
- switch.drivhus_drypvanding
|
||||||
|
to: 'on'
|
||||||
|
action:
|
||||||
|
# Åbn hovedhanen med lang sikkerhedsvarighed (120 min = maks) så LinkTap
|
||||||
|
# ikke selv lukker midt i en vanding. Lukkes eksplicit når alle zoner er
|
||||||
|
# slukket (eller af sikkerhedsstop-automationerne).
|
||||||
|
- service: linktap.start_watering
|
||||||
|
target:
|
||||||
|
entity_id: valve.hovedhane_linktap
|
||||||
|
data:
|
||||||
|
seconds: 7200
|
||||||
|
|
||||||
|
- alias: 'Hovedhane luk når alle zoner er slukket'
|
||||||
|
mode: queued
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id:
|
||||||
|
- switch.hojbed_1
|
||||||
|
- switch.hojbed_2
|
||||||
|
- switch.hojbed_3
|
||||||
|
- switch.drivhus_drypvanding
|
||||||
|
to: 'off'
|
||||||
|
for: '00:00:25'
|
||||||
|
condition:
|
||||||
|
- condition: state
|
||||||
|
entity_id:
|
||||||
|
- switch.hojbed_1
|
||||||
|
- switch.hojbed_2
|
||||||
|
- switch.hojbed_3
|
||||||
|
- switch.drivhus_drypvanding
|
||||||
|
state: 'off'
|
||||||
|
action:
|
||||||
|
- service: switch.turn_off
|
||||||
|
data:
|
||||||
|
entity_id: switch.hovedhane_linktap
|
||||||
|
|
||||||
|
- alias: 'Hovedhane kapillærkasser periodisk vanding'
|
||||||
|
mode: single
|
||||||
|
trigger:
|
||||||
|
- platform: time
|
||||||
|
at: '12:00:00'
|
||||||
|
condition:
|
||||||
|
# Kør kun tirsdag og fredag
|
||||||
|
- condition: time
|
||||||
|
weekday:
|
||||||
|
- tue
|
||||||
|
- fri
|
||||||
|
# Spring over ved regn eller aktiv regn-forsinkelse
|
||||||
|
- condition: state
|
||||||
|
entity_id: binary_sensor.annes_vanding_rainsensor
|
||||||
|
state: 'off'
|
||||||
|
- condition: numeric_state
|
||||||
|
entity_id: number.annes_vanding_rain_delay
|
||||||
|
below: 1
|
||||||
|
# Kør kun hvis ingen zonevanding er i gang
|
||||||
|
- condition: state
|
||||||
|
entity_id:
|
||||||
|
- switch.hojbed_1
|
||||||
|
- switch.hojbed_2
|
||||||
|
- switch.hojbed_3
|
||||||
|
- switch.drivhus_drypvanding
|
||||||
|
state: 'off'
|
||||||
|
action:
|
||||||
|
# Åbn kun hovedhanen i 15 min – fylder kapillærkassernes flydventiler.
|
||||||
|
# LinkTap lukker selv efter varigheden (instant mode).
|
||||||
|
- service: linktap.start_watering
|
||||||
|
target:
|
||||||
|
entity_id: valve.hovedhane_linktap
|
||||||
|
data:
|
||||||
|
seconds: 900
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1 @@
|
|||||||
- platform: command_line
|
## Migreret til include/command_line/infrastructure.yaml (2026.6 - platform: command_line fjernet fra binary_sensor)
|
||||||
name: Zigbee USB dongle tilsluttet
|
|
||||||
unique_id: zigbee_usb_dongle_connected
|
|
||||||
device_class: connectivity
|
|
||||||
command: >-
|
|
||||||
[ -c /dev/ttyUSB0 ] && echo ON || echo OFF
|
|
||||||
payload_on: "ON"
|
|
||||||
payload_off: "OFF"
|
|
||||||
scan_interval: 60
|
|
||||||
@@ -1,22 +1 @@
|
|||||||
## Set the dates in ~/.homeassistant/include/automations/countdown.yaml
|
## Migreret til include/templates/countdowns.yaml (2026.6 - platform: template fjernet)
|
||||||
|
|
||||||
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
dage_til_jul:
|
|
||||||
friendly_name: "Dage til jul"
|
|
||||||
# unit_of_measurement: "dage"
|
|
||||||
value_template: >-
|
|
||||||
{{ states('sensor.nedtaelling_juleaften') }}
|
|
||||||
|
|
||||||
dage_til_nytaar:
|
|
||||||
friendly_name: "Dage til nytår"
|
|
||||||
# unit_of_measurement: "dage"
|
|
||||||
value_template: >-
|
|
||||||
{{ states('sensor.nedtaelling_nytaar') }}
|
|
||||||
|
|
||||||
dage_til_ferie:
|
|
||||||
friendly_name: "Dage til ferie"
|
|
||||||
# unit_of_measurement: "dage"
|
|
||||||
value_template: >-
|
|
||||||
{{ states('sensor.nedtaelling_ferie') }}
|
|
||||||
|
|||||||
@@ -1,21 +1 @@
|
|||||||
- platform: template
|
## Migreret til include/templates/dishwasher.yaml (2026.6 - platform: template fjernet)
|
||||||
sensors:
|
|
||||||
dishwasher_remaining_minutes:
|
|
||||||
friendly_name: "Opvask tid tilbage"
|
|
||||||
unit_of_measurement: "min"
|
|
||||||
value_template: >
|
|
||||||
{% set val = states('sensor.dishwasher_remaining_time_2') %}
|
|
||||||
|
|
||||||
{% if val in ['unknown','unavailable',''] %}
|
|
||||||
0
|
|
||||||
|
|
||||||
{% elif ':' in val %}
|
|
||||||
{% set parts = val.split(':') %}
|
|
||||||
{{ (parts[0] | int * 60) + (parts[1] | int) }}
|
|
||||||
|
|
||||||
{% elif 'min' in val %}
|
|
||||||
{{ val.replace('min','') | int }}
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
{{ val | int(0) }}
|
|
||||||
{% endif %}
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
## Sensorer allerede i include/templates/legacy_sensors.yaml - ingen duplikering
|
||||||
@@ -28,6 +28,8 @@ duckdns_domain: "anneclaus"
|
|||||||
duckdns_access_token: "91a5b5a9-7aaf-4135-b13c-a672c0000a7d"
|
duckdns_access_token: "91a5b5a9-7aaf-4135-b13c-a672c0000a7d"
|
||||||
# https://www.splitbrain.org/blog/2017-08/10-homeassistant_duckdns_letsencrypt
|
# https://www.splitbrain.org/blog/2017-08/10-homeassistant_duckdns_letsencrypt
|
||||||
|
|
||||||
|
tesla_username: claus.dethlefsen@gmail.com
|
||||||
|
tesla_password: frup-REY3jut
|
||||||
|
|
||||||
# ########################################
|
# ########################################
|
||||||
synology_url: 10.0.0.142:5000
|
synology_url: 10.0.0.142:5000
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
{"count": 7, "items": [{"date": "2026-06-16", "recipe": {"name": "Hotdogs", "slug": "hotdogs"}}, {"date": "2026-06-14", "recipe": {"name": "Koteletter i fad", "slug": "koteletter-i-fad"}}, {"date": "2026-06-13", "recipe": {"name": "Ribeye og kartofler og salat", "slug": ""}}, {"date": "2026-06-12", "recipe": {"name": "Pasta aglio e olio \u2013 pasta med hvidl\u00f8g og olie", "slug": "pasta-aglio-e-olio-pasta-med-hvidlog-og-olie"}}, {"date": "2026-06-17", "recipe": {"name": "Rester fra mandag (One pot pasta)", "slug": ""}}, {"date": "2026-06-16", "recipe": {"name": "Rester fra s\u00f8ndag (Indisk curry)", "slug": ""}}, {"date": "2026-06-15", "recipe": {"name": "One Pot Pasta med K\u00f8dsovs", "slug": "one-pot-pasta-med-kodsovs"}}]}
|
{"count": 8, "items": [{"date": "2026-06-19", "recipe": {"name": "Okse tacos", "slug": "okse-tacos"}}, {"date": "2026-06-20", "recipe": {"name": "Bagte s\u00f8de kartofler med fyld", "slug": "bagte-sode-kartofler-med-fyld"}}, {"date": "2026-06-20", "recipe": {"name": "Engelsk b\u00f8f ", "slug": ""}}, {"date": "2026-06-18", "recipe": {"name": "M\u00f8rbradb\u00f8ffer med bl\u00f8de l\u00f8g og fl\u00f8desauce", "slug": "morbradboffer-med-blode-log-og-flodesauce"}}, {"date": "2026-06-24", "recipe": {"name": "Rester fra mandag (Tortellini i fad)", "slug": ""}}, {"date": "2026-06-23", "recipe": {"name": "Rester fra s\u00f8ndag (Kylling med cornflakes)", "slug": ""}}, {"date": "2026-06-22", "recipe": {"name": "Tortellini i fad", "slug": "tortellini-i-fad"}}, {"date": "2026-06-21", "recipe": {"name": "Kylling med cornflakes", "slug": "kylling-med-cornflakes"}}]}
|
||||||
Reference in New Issue
Block a user