Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Styring av varmtvannsbereder med Nordpool og rene HA automasjoner


sbarmen

Anbefalte innlegg

Jeg har lekt litt med dette siste dagene og kommet frem til en løsning som jeg liker. Kort fortalt har jeg nordpool satt opp med virkelige priser, med strømstøtte og natt-tarriff osv osv. Så den viser hva det faktisk koster. Se her (takk til @stigvi for masse inspirasjon): 


Jeg har tidligere brukt priceanalyzer og Node-Red men ikke vært fornøyd fordi jeg får plutselige problemer pga feil på integrasjon eller annet. Nå har jeg brukt bare rene HA automasjoner som skal sikre at det ikke blir et problem. 

Neste krav er at du har satt opp VVB som en climate sensor. Jeg har en temperatur sensor på VVB og et smart relé for å bryte strømmen. Temp sensor er ESP32 med en dallas_temp sensor styrt av ESPHome. Koden for ESPhome er som følger: 
 

one_wire:
  - platform: gpio
    pin: GPIO21

sensor:
  - platform: dallas_temp
    address: 0xXXXXXXXXXXXXXXXX
    name: "Water Heater Temperature"
    unit_of_measurement: "°C"
    force_update: true

bluetooth_proxy: 
  active: true

 

Climate sensor settes opp i configuration.yaml (fordi du får ikke satt maks/min temp i GUI). Unique_id setter du til hva du vil, da kan du endre navn o.l. i GUI om du ønsker, men ikke påkrevd. Fordelen med at det er en climate sensor er at jeg aldri skrur av VVB. Den vil ha en "failsafe" på low temp. Det betyr at man er ganske trygg på at det aldri blir helt iskaldt vann. For å ytterligere sikre mot dette kan du redusere utslagene i automasjonen (juster ned / opp med bare 5 eller 10 grader f.eks.). 
 

climate:
  - platform: generic_thermostat
    unique_id: 123nn342wwkjnee234
    name: Varmtvannsbereder
    heater: switch.varmtvannsbereder
    target_sensor: sensor.water_heater_temperature
    min_temp: 30
    max_temp: 80
    ac_mode: false
    target_temp: 65


Min automasjon akkurat nå er å sjekke prisen kvart på hver time, for å se om neste timen er veldig dyr, eller veldig billig sammenlignet med denne timen ( mer enn 20% differanse opp eller ned). Dersom det er tilfelle pusher vi temperaturen kraftig opp eller ned siste kvarteret. Så når Nordpool integrasjonen setter ny pris på hel time så sjekker automasjonen igjen. Dersom det er en billig time (low_price fra nordpool) så setter den ned temperaturen. Dyre timer er valgt som de 12 dyreste timene i døgnet og da setter vi ned temperaturen på climate sensoren. Jeg har også en nedjustering av temperaturen fra 00 til 05, da lader typisk også elbilen (egen automasjon for å passe på effektmaks) men dette kan jo droppes eventuelt. Til sist, dersom ingen av de andre tingene slår inn så setter man "default temperatur". 

Default temperatur er basert på egen hjelper som jeg kaller VVB Target. Den har jeg satt opp som hjelper i HA. I denne automasjonen bruker jeg 2 hjelpere, en input number for target temperatur, og en input_boolean for å kunne gjøre det slik at brukeren kan endre target temperatur selv på climate sensoren. 

image.thumb.png.d372fdd62c906d701c719ac33cf54904.png

 

Når automasjonen kjører og justerer temperaturen så slår den på input_boolean.vvb_auto_update, så "vet" den neste automasjonen at det er automatisk justering av VVB temp som pågår. Dersom brukeren skifter temperatur på climate sensoren manuelt så skjer ikke dette og da justeres Måltemp input_number. 

 

Automasjon for å justere temp automatisk på VVB: 

 

alias: Optimal styring av varmtvannsbereder basert på strømpriser
trigger:
  - platform: time_pattern
    minutes: 45
    id: kvart-på
  - platform: state
    entity_id: sensor.nordpool
    attribute: current_price
    id: ny-pris
  - platform: homeassistant
    event: start
    id: ny-pris
condition: []
action:
  - variables:
      current_price: "{{ states('sensor.nordpool') | float }}"
      next_price: >
        {% set now = now().hour %}  {% set next_price =
        state_attr('sensor.nordpool', 'today')[now + 1] if now < 23 else
        state_attr('sensor.nordpool', 'tomorrow')[0] %} {{ next_price }}
      low_price_threshold: "{{ state_attr('sensor.nordpool', 'off_peak_2') }}"
      high_price_threshold: "{{ state_attr('sensor.nordpool', 'max') }}"
      current_setpoint: "{{ states('input_number.vvb_target') | float }}"
      price_change_threshold: 0.2
      today_prices: "{{ state_attr('sensor.nordpool', 'today') }}"
      sorted_prices: "{{ today_prices | sort(reverse=True) }}"
      top_12_prices: "{{ sorted_prices[:12] }}"
  - service: input_boolean.turn_on
    target:
      entity_id:
        - input_boolean.vvb_auto_update
    data: {}
  - choose:
      - conditions:
          - condition: trigger
            id: kvart-på
          - condition: template
            value_template: "{{ next_price / current_price <= (1 - price_change_threshold) }}"
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: climate.varmtvannsbereder
              temperature: "{{ current_setpoint - 20 }}"
      - conditions:
          - condition: trigger
            id: kvart-på
          - condition: template
            value_template: "{{ next_price / current_price >= (1 + price_change_threshold) }}"
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: climate.varmtvannsbereder
              temperature: "{{ current_setpoint + 20 }}"
      - conditions:
          - condition: trigger
            id: kvart-på
        sequence: []
        alias: Når utløst kvart på og ingenting skal gjøres (unngå at default handling kjøres)
      - conditions:
          - condition: trigger
            id: ny-pris
          - condition: template
            value_template: >
              {% set now = now().hour %} {{ today_prices[now] in top_12_prices
              }}
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: climate.varmtvannsbereder
              temperature: "{{ current_setpoint - 15 }}"
      - conditions:
          - condition: trigger
            id: ny-pris
          - condition: state
            entity_id: sensor.nordpool
            attribute: low_price
            state: true
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: climate.varmtvannsbereder
              temperature: "{{ current_setpoint + 15 }}"
      - conditions:
          - condition: time
            after: "00:00:00"
            before: "05:00:00"
        sequence:
          - service: climate.set_temperature
            data:
              entity_id: climate.varmtvannsbereder
              temperature: "{{ current_setpoint - 15 }}"
    default:
      - service: climate.set_temperature
        data:
          entity_id: climate.varmtvannsbereder
          temperature: "{{ current_setpoint }}"
  - service: input_boolean.turn_off
    target:
      entity_id:
        - input_boolean.vvb_auto_update
    data: {}
mode: single

 

Automasjon for å justere måltemp sensor hjelper. Denne lagrer så en ny måltemp med samme offset som gjeldende innstilling. Så f.eks., dersom vi nå er på en dyr time og vi har justert ned varmen med 15 grader så kan input_number.vvb_target stå på 65 grader, climate sensoren er da på 50 grader. Dersom du justerer climate opp med 5 grader, til 55, så vil input_number.vvb_target lagres til 55+15, altså 70 grader. 
 

alias: Oppdater varmtvannsbereder måltemp hjelper
description: >-
  Denne automasjonen endrer hjelperen som er måltemperaturen til
  varmtvannsberederen. Den sjekker at ikke automasjonen har endret prisen først,
  og så setter den setpunkt med samme offset som climate sensoren har i
  øyeblikket. 
trigger:
  - platform: state
    entity_id: climate.varmtvannsbereder
    attribute: temperature
condition:
  - condition: state
    entity_id: input_boolean.vvb_auto_update
    state: "off"
action:
  - variables:
      current_setpoint: "{{ state_attr('climate.varmtvannsbereder', 'temperature') | float }}"
      previous_setpoint: "{{ trigger.from_state.attributes.temperature | float }}"
      stored_target: "{{ states('input_number.vvb_target') | float }}"
  - choose:
      - conditions:
          - condition: template
            value_template: "{{ previous_setpoint == stored_target }}"
        sequence:
          - service: input_number.set_value
            data:
              entity_id: input_number.vvb_target
              value: "{{ current_setpoint }}"
      - conditions:
          - condition: template
            value_template: "{{ previous_setpoint != stored_target }}"
        sequence:
          - service: input_number.set_value
            data:
              entity_id: input_number.vvb_target
              value: "{{ current_setpoint + (stored_target - previous_setpoint) }}"
mode: single


Dette er work-in-progress, men så langt fungerer det ganske godt. Neste skritt er at jeg skal sette opp samme logikk på to varmekabler på badene, og så kan det brukes på varme i andre rom slik som stue, kjøkken, soverom osv. Fordelen med å gjøre det på denne måten er at du får god WAF. Dersom kona skifter temp på climate sensorene i GUI eller på veggen, så fungerer det som forventet. Håper dette kan være nyttig for noen. 🙂

Endret av sbarmen
Liten fix i automasjon
  • Like 1
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.