From 9c5da39bf59e851d1a93718afb2d755e89e3a40c Mon Sep 17 00:00:00 2001 From: Claus Dethlefsen Date: Sat, 20 Jun 2026 18:38:06 +0200 Subject: [PATCH] =?UTF-8?q?Vanding:=20forsider=C3=A6kke=20med=20sidst=20va?= =?UTF-8?q?ndet,=20smart-knap,=20liter=20og=20tid=20pr.=20bed;=20kapill?= =?UTF-8?q?=C3=A6r=20default=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configuration.yaml | 14 ++++ dashboards/views/01_home.yaml | 105 +++++++++++++++++++++++++++- include/automations/vanding.yaml | 55 +++++++++++++++ include/input/datetime/vanding.yaml | 6 ++ include/input/number/vanding.yaml | 2 +- include/sensors/vanding.yaml | 9 +++ include/templates/vanding.yaml | 75 ++++++++++++++++++++ 7 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 include/templates/vanding.yaml diff --git a/configuration.yaml b/configuration.yaml index 6d8cab0..b5235b4 100755 --- a/configuration.yaml +++ b/configuration.yaml @@ -70,6 +70,20 @@ utility_meter: source: input_number.nattis cycle: daily + # Liter vandet i dag – fordelt på zoner via tariffer. + # Hovedhanen (LinkTap) er eneste flowmåler, og zonerne kører skiftevis, + # så den aktive tarif sættes når en zone (eller kapillærkasse) starter. + vanding_liter: + name: "Vanding liter i dag" + source: sensor.hovedhane_linktap_volume + cycle: daily + tariffs: + - hb1 + - hb2 + - hb3 + - drivhus + - kapillaer + python_script: diff --git a/dashboards/views/01_home.yaml b/dashboards/views/01_home.yaml index c46cb84..8b94e64 100644 --- a/dashboards/views/01_home.yaml +++ b/dashboards/views/01_home.yaml @@ -463,7 +463,110 @@ cards: target: entity_id: lawn_mower.husqvarna_automower - # 💡 Lys kontrol + # � Vanding + - type: horizontal-stack + cards: + - type: custom:button-card + entity: sensor.vanding_sidst_vandet_compact + show_icon: false + show_name: true + show_state: true + name: Sidst vandet + 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: Smart vanding + icon: mdi:sprinkler-variant + entity: script.vanding_hojbed_skiftevis + tap_action: + action: toggle + + - type: custom:button-card + entity: sensor.vanding_liter_i_dag_total + icon: mdi:water + show_icon: true + show_name: true + show_state: true + name: Liter i dag + tap_action: + action: none + hold_action: + action: none + custom_fields: + breakdown: | + [[[ + const n = (id) => { const s = states[id]; return s ? Math.round(parseFloat(s.state) || 0) : 0; }; + return `Ærter ${n('sensor.vanding_liter_hb1')} · Kart. ${n('sensor.vanding_liter_hb2')} · Rab. ${n('sensor.vanding_liter_hb3')}` + + `
Drivhus ${n('sensor.vanding_liter_drivhus')} · Kapillær ${n('sensor.vanding_liter_kapillaer')}`; + ]]] + styles: + card: + - padding: 8px + name: + - font-size: 11px + - color: var(--secondary-text-color) + state: + - font-size: 15px + - font-weight: bold + custom_fields: + breakdown: + - font-size: 9px + - color: var(--secondary-text-color) + - padding-top: 3px + - line-height: 1.3 + + - type: custom:button-card + entity: sensor.vanding_tid_i_dag_total + icon: mdi:timer-sand + show_icon: true + show_name: true + show_state: true + name: Tid i dag + tap_action: + action: none + hold_action: + action: none + custom_fields: + breakdown: | + [[[ + const m = (id) => { const s = states[id]; return s ? Math.round((parseFloat(s.state) || 0) * 60) : 0; }; + const cap = () => { const s = states['sensor.vanding_kapillaer_tid_i_dag']; return s ? Math.round(parseFloat(s.state) || 0) : 0; }; + return `Ærter ${m('sensor.vanding_hojbed_1_i_dag')} · Kart. ${m('sensor.vanding_hojbed_2_i_dag')} · Rab. ${m('sensor.vanding_hojbed_3_i_dag')}` + + `
Drivhus ${m('sensor.vanding_drivhus_i_dag')} · Kapillær ${cap()}`; + ]]] + styles: + card: + - padding: 8px + name: + - font-size: 11px + - color: var(--secondary-text-color) + state: + - font-size: 15px + - font-weight: bold + custom_fields: + breakdown: + - font-size: 9px + - color: var(--secondary-text-color) + - padding-top: 3px + - line-height: 1.3 + + # �💡 Lys kontrol - type: horizontal-stack cards: - type: tile diff --git a/include/automations/vanding.yaml b/include/automations/vanding.yaml index 72715c3..370d650 100644 --- a/include/automations/vanding.yaml +++ b/include/automations/vanding.yaml @@ -130,9 +130,64 @@ action: # Åbn kun hovedhanen i 15 min – fylder kapillærkassernes flydventiler. # LinkTap lukker selv efter varigheden (instant mode). + - service: select.select_option + target: + entity_id: select.vanding_liter + data: + option: kapillaer - service: linktap.start_watering target: entity_id: valve.hovedhane_linktap data: seconds: 900 +# --- Forside: sidst vandet & liter-måler pr. zone --- + +- alias: 'Vanding – opdater sidst vandet' + description: 'Sætter tidsstempel når en zone eller hovedhanen begynder at vande' + mode: queued + trigger: + - platform: state + entity_id: + - switch.hojbed_1 + - switch.hojbed_2 + - switch.hojbed_3 + - switch.drivhus_drypvanding + to: 'on' + - platform: state + entity_id: binary_sensor.hovedhane_linktap_is_watering + to: 'on' + action: + - service: input_datetime.set_datetime + target: + entity_id: input_datetime.vanding_sidst_vandet + data: + datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}" + +- alias: 'Vanding – vælg liter-tarif efter aktiv zone' + description: 'Skifter utility_meter-tarif så liter bogføres på det rette bed' + mode: queued + trigger: + - platform: state + entity_id: switch.hojbed_2 # Højbed 1 – Ærter + to: 'on' + id: hb1 + - platform: state + entity_id: switch.hojbed_1 # Højbed 2 – Kartofler + to: 'on' + id: hb2 + - platform: state + entity_id: switch.drivhus_drypvanding # Højbed 3 – Rabarber + to: 'on' + id: hb3 + - platform: state + entity_id: switch.hojbed_3 # Drivhus + to: 'on' + id: drivhus + action: + - service: select.select_option + target: + entity_id: select.vanding_liter + data: + option: "{{ trigger.id }}" + diff --git a/include/input/datetime/vanding.yaml b/include/input/datetime/vanding.yaml index 563bf98..03b32ff 100644 --- a/include/input/datetime/vanding.yaml +++ b/include/input/datetime/vanding.yaml @@ -26,3 +26,9 @@ vanding_sikkerhedsstop_nat: has_time: true initial: "23:59:00" icon: mdi:alarm-off + +vanding_sidst_vandet: + name: Vanding – sidst vandet + has_date: true + has_time: true + icon: mdi:sprinkler-variant diff --git a/include/input/number/vanding.yaml b/include/input/number/vanding.yaml index 91f8917..884c88b 100644 --- a/include/input/number/vanding.yaml +++ b/include/input/number/vanding.yaml @@ -41,7 +41,7 @@ vanding_kapillaer_antal: min: 0 max: 10 step: 1 - initial: 3 + initial: 6 icon: mdi:counter # Fugtigheds-mål per højbed (%) diff --git a/include/sensors/vanding.yaml b/include/sensors/vanding.yaml index 3bd28c3..c094f82 100644 --- a/include/sensors/vanding.yaml +++ b/include/sensors/vanding.yaml @@ -29,3 +29,12 @@ type: time start: "{{ today_at() }}" end: "{{ now() }}" +# Samlet tid hovedhanen (LinkTap) har vandet i dag – dækker både zoner og +# kapillærkasser, da alt vand passerer hovedhanen. +- platform: history_stats + name: vanding_hovedhane_i_dag + entity_id: binary_sensor.hovedhane_linktap_is_watering + state: "on" + type: time + start: "{{ today_at() }}" + end: "{{ now() }}" \ No newline at end of file diff --git a/include/templates/vanding.yaml b/include/templates/vanding.yaml new file mode 100644 index 0000000..5e3bca2 --- /dev/null +++ b/include/templates/vanding.yaml @@ -0,0 +1,75 @@ +# Vanding – afledte sensorer til forside-rækken + +# Kompakt "sidst vandet" (samme stil som støvsugerens "Sidst kørt") +- trigger: + - platform: homeassistant + event: start + - platform: state + entity_id: input_datetime.vanding_sidst_vandet + - platform: time_pattern + hours: "/1" + sensor: + - name: "Vanding sidst vandet compact" + unique_id: vanding_sidst_vandet_compact + icon: mdi:sprinkler-variant + state: > + {% set raw = states('input_datetime.vanding_sidst_vandet') %} + {% if raw in ['unknown', 'unavailable', '', none] %} + Aldrig + {% else %} + {% set dt = as_local(as_datetime(raw)) %} + {% if dt is none %} + Ukendt + {% elif dt.date() == now().date() %} + i dag {{ dt.strftime('%H:%M') }} + {% elif dt.date() == (now() - timedelta(days=1)).date() %} + i går {{ dt.strftime('%H:%M') }} + {% else %} + {% set weekdays = ['man', 'tir', 'ons', 'tor', 'fre', 'lør', 'søn'] %} + {{ weekdays[dt.weekday()] }} {{ dt.strftime('%d/%m %H:%M') }} + {% endif %} + {% endif %} + +# Kumuleret vandingstid og liter i dag +- sensor: + # Samlet vandingstid i dag (minutter) = hovedhanens vandetid + - name: "Vanding tid i dag total" + unique_id: vanding_tid_i_dag_total + unit_of_measurement: "min" + icon: mdi:timer-sand + state: > + {{ (states('sensor.vanding_hovedhane_i_dag') | float(0) * 60) | round(0) }} + + # Kapillærkasser i dag (minutter) = hovedhane minus de fire zoner + - name: "Vanding kapillaer tid i dag" + unique_id: vanding_kapillaer_tid_i_dag + unit_of_measurement: "min" + icon: mdi:cup-water + state: > + {% set hovedhane = states('sensor.vanding_hovedhane_i_dag') | float(0) %} + {% set zoner = (states('sensor.vanding_hojbed_1_i_dag') | float(0)) + + (states('sensor.vanding_hojbed_2_i_dag') | float(0)) + + (states('sensor.vanding_hojbed_3_i_dag') | float(0)) + + (states('sensor.vanding_drivhus_i_dag') | float(0)) %} + {% set cap = [hovedhane - zoner, 0] | max %} + {{ (cap * 60) | round(0) }} + + # Samlet liter i dag = summen af tarif-tællerne + - name: "Vanding liter i dag total" + unique_id: vanding_liter_i_dag_total + unit_of_measurement: "L" + device_class: water + state_class: total + icon: mdi:water + state: > + {% set ns = namespace(t=0) %} + {% set kilder = [ + 'sensor.vanding_liter_hb1', + 'sensor.vanding_liter_hb2', + 'sensor.vanding_liter_hb3', + 'sensor.vanding_liter_drivhus', + 'sensor.vanding_liter_kapillaer'] %} + {% for s in kilder %} + {% set ns.t = ns.t + (states(s) | float(0)) %} + {% endfor %} + {{ ns.t | round(1) }}