From fb19d1d641f3e0734e735d639fba2baa4ebaf3a1 Mon Sep 17 00:00:00 2001 From: Claus Dethlefsen Date: Thu, 18 Jun 2026 22:16:32 +0200 Subject: [PATCH] =?UTF-8?q?LinkTap=20hovedhane:=20omd=C3=B8b=20entities,?= =?UTF-8?q?=20dashboard-kort=20og=20automatik=20(=C3=A5bn=20f=C3=B8r=20zon?= =?UTF-8?q?er,=20luk=20efter,=20periodisk=20kapill=C3=A6rvanding)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .HA_VERSION | 2 +- configuration.yaml | 4 +- dashboards/views/05b_vanding.yaml | 88 ++++++++++++++++++- dashboards/views/06c_indkorsel_snapshots.yaml | 2 +- dokumenter/TODO.md | 13 +++ include/automations/doerklokke_bag2.yaml | 4 +- include/automations/doerklokke_for.yaml | 4 +- include/automations/vanding.yaml | 87 ++++++++++++++++++ include/binary_sensors/infrastructure.yaml | 10 +-- include/sensors/countdowns.yaml | 23 +---- include/sensors/dishwasher.yaml | 22 +---- include/templates/countdowns.yaml | 1 + secrets.yaml | 2 + www/mealie.json | 2 +- 14 files changed, 201 insertions(+), 63 deletions(-) create mode 100644 include/templates/countdowns.yaml diff --git a/.HA_VERSION b/.HA_VERSION index bb290cc..6784e1e 100755 --- a/.HA_VERSION +++ b/.HA_VERSION @@ -1 +1 @@ -2026.5.4 \ No newline at end of file +2026.6.3 \ No newline at end of file diff --git a/configuration.yaml b/configuration.yaml index eb45fb5..6d8cab0 100755 --- a/configuration.yaml +++ b/configuration.yaml @@ -80,9 +80,7 @@ frontend: # Integrations ################################################## -duckdns: - domain: !secret duckdns_domain - access_token: !secret duckdns_access_token +# duckdns: fjernet fra YAML i 2026.6 - konfigurer via UI (Settings > Integrations > DuckDNS) sonoff: username: !secret sonoff_username diff --git a/dashboards/views/05b_vanding.yaml b/dashboards/views/05b_vanding.yaml index c892a62..745fd1b 100644 --- a/dashboards/views/05b_vanding.yaml +++ b/dashboards/views/05b_vanding.yaml @@ -7,7 +7,93 @@ max_columns: 2 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 cards: - type: heading diff --git a/dashboards/views/06c_indkorsel_snapshots.yaml b/dashboards/views/06c_indkorsel_snapshots.yaml index 37ee2a9..b3e956a 100644 --- a/dashboards/views/06c_indkorsel_snapshots.yaml +++ b/dashboards/views/06c_indkorsel_snapshots.yaml @@ -5,5 +5,5 @@ panel: true cards: - type: iframe - url: /local/snapshots/indkorsel_loader.html?v=20260612061319 + url: /local/snapshots/indkorsel_loader.html?v=20260618215329 aspect_ratio: 100% diff --git a/dokumenter/TODO.md b/dokumenter/TODO.md index 1a9ada8..497bf60 100644 --- a/dokumenter/TODO.md +++ b/dokumenter/TODO.md @@ -46,3 +46,16 @@ ## 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). + + +## 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). diff --git a/include/automations/doerklokke_bag2.yaml b/include/automations/doerklokke_bag2.yaml index 689c393..7eaf80a 100644 --- a/include/automations/doerklokke_bag2.yaml +++ b/include/automations/doerklokke_bag2.yaml @@ -29,9 +29,9 @@ 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) + # Stop kun hvis samme counter som sidst (duplikat/periodisk wake-up) - condition: template - value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}" + value_template: "{{ new_cnt != old_cnt }}" # Bloker ringeklokke om natten (22-06) - condition: time after: '06:00:00' diff --git a/include/automations/doerklokke_for.yaml b/include/automations/doerklokke_for.yaml index 891c4a0..be93c35 100644 --- a/include/automations/doerklokke_for.yaml +++ b/include/automations/doerklokke_for.yaml @@ -30,9 +30,9 @@ 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) + # Stop kun hvis samme counter som sidst (duplikat/periodisk wake-up) - condition: template - value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}" + value_template: "{{ new_cnt != old_cnt }}" # Bloker ringeklokke om natten (22-06) - condition: time after: '06:00:00' diff --git a/include/automations/vanding.yaml b/include/automations/vanding.yaml index a87a901..b2e93fd 100644 --- a/include/automations/vanding.yaml +++ b/include/automations/vanding.yaml @@ -26,6 +26,9 @@ - switch.hojbed_1 - switch.hojbed_2 - switch.drivhus_drypvanding + - service: switch.turn_off + data: + entity_id: switch.hovedhane_linktap - alias: 'Vanding sikkerhedsstop nat kl. 23' trigger: @@ -41,4 +44,88 @@ - switch.hojbed_1 - switch.hojbed_2 - 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 diff --git a/include/binary_sensors/infrastructure.yaml b/include/binary_sensors/infrastructure.yaml index c416a04..6f53a0f 100644 --- a/include/binary_sensors/infrastructure.yaml +++ b/include/binary_sensors/infrastructure.yaml @@ -1,9 +1 @@ -- platform: command_line - 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 \ No newline at end of file +## Migreret til include/command_line/infrastructure.yaml (2026.6 - platform: command_line fjernet fra binary_sensor) \ No newline at end of file diff --git a/include/sensors/countdowns.yaml b/include/sensors/countdowns.yaml index 59a99cf..11b68e8 100644 --- a/include/sensors/countdowns.yaml +++ b/include/sensors/countdowns.yaml @@ -1,22 +1 @@ -## Set the dates in ~/.homeassistant/include/automations/countdown.yaml - - -- 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') }} +## Migreret til include/templates/countdowns.yaml (2026.6 - platform: template fjernet) diff --git a/include/sensors/dishwasher.yaml b/include/sensors/dishwasher.yaml index 654e067..4f21396 100644 --- a/include/sensors/dishwasher.yaml +++ b/include/sensors/dishwasher.yaml @@ -1,21 +1 @@ -- platform: template - 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 %} +## Migreret til include/templates/dishwasher.yaml (2026.6 - platform: template fjernet) diff --git a/include/templates/countdowns.yaml b/include/templates/countdowns.yaml new file mode 100644 index 0000000..6378763 --- /dev/null +++ b/include/templates/countdowns.yaml @@ -0,0 +1 @@ +## Sensorer allerede i include/templates/legacy_sensors.yaml - ingen duplikering diff --git a/secrets.yaml b/secrets.yaml index b344930..bcf8bcb 100644 --- a/secrets.yaml +++ b/secrets.yaml @@ -28,6 +28,8 @@ duckdns_domain: "anneclaus" duckdns_access_token: "91a5b5a9-7aaf-4135-b13c-a672c0000a7d" # 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 diff --git a/www/mealie.json b/www/mealie.json index 534cf35..6b78c5c 100644 --- a/www/mealie.json +++ b/www/mealie.json @@ -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"}}]} \ No newline at end of file +{"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"}}]} \ No newline at end of file