Innlegget er ment som et tips eller noe en kan dra nytte av til andre ting.
Når en lager en malsensor, vil denne malen evalueres hver gang en entitet som er brukt i malen, endres. Dette er stort sett ønskelig, men noen ganger er det en hindring. I eksempelet under, beregner jeg oppvarmingstid for VVB og setter en binær sensor til På i de billigste timene og i så mange timer som det er nødvendig å varme vann. Problemet oppstår når temperaturen i vannet øker og da vil beregnet oppvarmingstid synke. Dette lager kluss når en skal plukke de billigste timene. En kan starte å varme vann i den billigste timen, men når en kommer til den nest billigste kan oppvarmingstiden sunket så mye at denne timen utelates. Å varme vannet krever bare en time til og den billigste timen er jo nettopp passert.
Denne problemstillingen kan en omgå ved å bruke en ny funksjonalitet i HA. Så veldig ny er den derimot ikke. Mulig den har eksistert i et par år nå.
Det dreier seg om å skille trigger / evaluering av mal til noe en selv bestemmer. Det kan være tid, tilstand, hendelse eller egentlig hva som helst.
Dokumentasjon for dette, finner en her: https://www.home-assistant.io/docs/automation/trigger/ Triggere for automatisering er prikk lik triggere en kan bruke i maler og dokumentasjonen for disse er lik.
I eksempelet nedenfor, trigger jeg beregning av oppvarmingstid kun i start på hver time og kun hvis VVB er avslått. Så snart en starter på å varme vann, vil ikke ny oppvarmingstid bli beregnet. Unntaket er når en setter ny temperatur en skal varme til, bare for å ta med det og å vise at en kan ha mange triggere.
Etter min mening er dette en svært nyttig egenskap til mal-sensorer som ofte kan forenkle ganske mye.
template:
- trigger:
- platform: template
value_template: "{{ now().minute == 0 and states('sensor.effekt_varmtvann')|float(0) == 0 }}"
- platform: state
entity_id:
- input_number.vvb_temperatur
sensor:
- unique_id: vvb_heating_time
name: "vvb oppvarmingstid"
unit_of_measurement: 'h'
device_class: duration
state: >-
{{ ((states('input_number.vvb_temperatur')|float(80)
- average(states('sensor.varmtvannstank_topp_temperatur')|float(60),
states('sensor.varmtvannstank_senter_temperatur')|float(60),
states('sensor.varmtvannstank_bunn_temperatur')|float(60)))
/ (iif(float(states('sensor.effektbegrensing')) > 8, 1.0, 2.0) / 194.0 / 0.001163))|round(1) }}
- binary_sensor:
- unique_id: billigste_timer_vvb
name: billigste_timer_vvb
state: >-
{% set l=state_attr('pyscript.strompris', 'prices')[14:39]|sort(attribute='totalprice') %}
{% set t = now().hour %}
{% set d = now().day %}
{% set h = states('sensor.vvb_oppvarmingstid')|float(0) %}
{{ iif(h > 0, (t == as_datetime(l[0].start).hour and d == as_datetime(l[0].start).day), false)
or iif(h > 1, (t == as_datetime(l[1].start).hour and d == as_datetime(l[1].start).day), false)
or iif(h > 2, (t == as_datetime(l[2].start).hour and d == as_datetime(l[2].start).day), false)
or iif(h > 3, (t == as_datetime(l[3].start).hour and d == as_datetime(l[3].start).day), false)
or iif(h > 4, (t == as_datetime(l[4].start).hour and d == as_datetime(l[4].start).day), false)
or iif(h > 5, (t == as_datetime(l[5].start).hour and d == as_datetime(l[5].start).day), false)
or iif(h > 6, (t == as_datetime(l[6].start).hour and d == as_datetime(l[6].start).day), false) }}