Gå til innhold
  • Bli medlem

Nordpool sensor for Home Assistant


hellowlol
 Del

Anbefalte innlegg

Apulanta skrev (19 minutter siden):

Hei, jeg er interessert i denne ESP32 -koden, jeg planlegger å ta med Nordpol -pris for hjemmeautomatisering og justere den elektriske tilstedeværelsen via ESP32 og legge til ESP32 modbus TCP -funksjon for å hente strømprisinformasjon for å kontrollere hjemmeautomatisering. Er den ESP32 -koden publisert et sted?

Det er ikke så mye kode, men mer en konfigurasjon av esphome. Dette er en tilleggsdel av Home Assistant for å integrere esp noder. ESPHome — ESPHome

 

esphome:
  name: varmtvannstank
  platform: ESP8266
  board: esp01_1m

wifi:
  ssid: "HEIME5.ORG"
  password: !secret heime_wifi
  domain: .lan
  #use_address: 10.0.0.46

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  #ap:
  #  ssid: "Varmtvannstank Fallback Hotspot"
  #  password: "okz8anWfZKFP"

#captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  reboot_timeout: 24h

ota:

globals:
  - id: state_automode
    type: bool
    restore_value: no
    initial_value: 'false'
    
  - id: heating
    type: bool
    restore_value: no
    initial_value: 'false'
    
  - id: heating_has_started
    type: bool
    restore_value: no
    initial_value: 'false'
  
  - id: low_temp
    type: bool
    restore_value: no
    initial_value: 'false'
  
  - id: seconds
    type: int
    restore_value: no
    initial_value: '0'
    
  - id: heating_time
    type: int
    restore_value: no
    initial_value: '0'

  - id: heating_totaltime
    type: int
    restore_value: no
    initial_value: '0'
    
  - id: heating_start
    type: int
    restore_value: no
    initial_value: '0'
    
  - id: last_temp
    type: float
    restore_value: no
    initial_value: '0.0'
  
  - id: last_value_from_ha
    type: int
    initial_value: '0'

switch:
  - platform: gpio
    pin: 12
    id: varmtvannstank_varme
    name: "varmtvannstank_varme"
    restore_mode: ALWAYS_OFF
    icon: "mdi:water-boiler"
    on_turn_on:
    - lambda: !lambda |-
        id(heating_time) = 0;
        id(heating_start) = id(homeassistant_time).utcnow().timestamp;
    on_turn_off:
    - sensor.template.publish:
        id: energy
        state: !lambda |-
          id(heating_totaltime) += id(heating_time);
          return id(heating_totaltime) / 1800.0;
  
  - platform: template
    name: "varmtvannstank_varmeautomatikk"
    id: automode
    icon: "mdi:water-boiler"
    lambda: |-
      return id(state_automode);
    turn_on_action:
      - globals.set:
          id: state_automode
          value: 'true'
      - globals.set:
          id: seconds
          value: '0'
    turn_off_action:
      - globals.set:
          id: state_automode
          value: 'false'

dallas:
  - pin: GPIO14
  
status_led:
  pin:
    number: GPIO13
    inverted: yes

sensor:
  - platform: dallas
    address: 0xC5000008FABF3328
    id: varmtvannstank_topp_temperatur
    name: "varmtvannstank_topp_temperatur"
    filters:
    - sliding_window_moving_average:
        window_size: 5
        send_every: 5
    on_value:
      then:
        - lambda: !lambda |-
            if(x < 45 && id(state_automode) == true)
            {
              id(varmtvannstank_varme).turn_on();
              id(low_temp) = true;
            }
            
            if(x > 46)
              id(low_temp) = false;
  
  - platform: dallas
    address: 0xFA0319A2796AD628
    id: varmtvannstank_bunn_temperatur
    name: "varmtvannstank_bunn_temperatur"
    filters:
    - sliding_window_moving_average:
        window_size: 5
        send_every: 5
    on_value:
      then:
        - lambda: !lambda |-
            if(x >= id(last_temp) + 0.35)
              id(heating_time) = id(homeassistant_time).utcnow().timestamp - id(heating_start) + 150;
            
            id(last_temp) = x;

  - platform: template
    id: energy
    name: "Energibruk varmtvann"
    unit_of_measurement: "kWh"
    icon: "mdi:power-plug"

binary_sensor:
  - platform: homeassistant
    id: pris1
    entity_id: binary_sensor.billigste_timer_1_1
    
  - platform: homeassistant
    id: pris2
    entity_id: binary_sensor.billigste_timer_1_2

  - platform: homeassistant
    id: pris3
    entity_id: binary_sensor.billigste_timer_1_3

  - platform: homeassistant
    id: pris4
    entity_id: binary_sensor.billigste_timer_1_4

  - platform: homeassistant
    id: pris5
    entity_id: binary_sensor.billigste_timer_1_5

  - platform: homeassistant
    id: pris6
    entity_id: binary_sensor.billigste_timer_1_6

interval:
  - interval: 4h
    then:
    - if:
        condition:
          - lambda: !lambda |-
              auto time_now = id(homeassistant_time).utcnow();
              
              if(time_now.timestamp - id(last_value_from_ha) > 600)
                return true;
              
              return false;
        then:
          - switch.turn_on: automode

  - interval: 1min
    then:
    - if:
        condition:
          - lambda: !lambda |-
              int t = (70.0 - (id(varmtvannstank_topp_temperatur).state*0.5 + id(varmtvannstank_bunn_temperatur).state*0.5)) * 404.30769;
              
              if(t > id(seconds))
                id(seconds) = t;

              if(id(pris6).state && id(seconds) > 5*3600)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 6");
                return true;
              }
              else if(id(pris5).state && id(seconds) > 4*3600)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 5");
                return true;
              }
              else if(id(pris4).state && id(seconds) > 3*3600)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 4");
                return true;
              }
              else if(id(pris3).state && id(seconds) > 2*3600)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 3");
                return true;
              }
              else if(id(pris2).state && id(seconds) > 3600)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 2");
                return true;
              }
              else if(id(pris1).state)
              {
                ESP_LOGD("main", "Setter i gang oppvarming for pris 1");
                return true;
              }
              else
              {
                ESP_LOGD("main", "I ventefase. Oppvarmingstid er %d sekunder. Låst på tid: %d",
                  id(seconds), id(heating_has_started));
                return false;
              }
        then:
          - if:
              condition:
                - lambda: !lambda |-
                    id(heating_has_started) = true;
                    
                    if(id(heating) == false && id(state_automode) == true)
                      return true;
                    else
                      return false;
              then:
                - lambda: !lambda 'id(heating) = true;'
                - switch.turn_on: varmtvannstank_varme
        else:
          - if:
              condition:
                - lambda: !lambda |-
                    id(heating_has_started) = false;
                    
                    if(id(heating) == true && id(state_automode) == true && id(low_temp) == false)
                      return true;
                    else
                      return false;
              then:
                - lambda: !lambda 'id(heating) = false;'
                - switch.turn_off: varmtvannstank_varme

time:
  - platform: homeassistant
    id: homeassistant_time
    timezone: "Europe/Oslo"
    on_time:
      - seconds: 0
        minutes: 0
        hours: 0
        then:
          - lambda: !lambda |-
              id(seconds) = 0;
              id(heating_totaltime) = 0;

text_sensor:
  - platform: homeassistant
    id: watchdog
    entity_id: sensor.time
    on_value:
      then:
        - lambda: !lambda |-
            auto time_now = id(homeassistant_time).utcnow();
            id(last_value_from_ha) = time_now.timestamp;

 

Lenke til kommentar
Del på andre sider

stigvi skrev (32 minutter siden):

Det er ikke så mye kode, men mer en konfigurasjon av esphome. Dette er en tilleggsdel av Home Assistant for å integrere esp noder. ESPHome — ESPHome

Hei,
Takk for raskt svar. Jeg trodde koden var en Arduino IDE -type for den ESP01 -plattformen som henter nordpoll www.nordpoolgroup.com dager pris ..

Lenke til kommentar
Del på andre sider

  • 4 uker senere...

Jeg sliter med å få v0.0.3 -koden til å spille. Har prøvd litt forskjellige endringer i sensor.py uten å komme i mål feilfritt.

Kan det være fordi jeg fremdeles er på HA v0.117.2 (core)/ python 3.7.3?

 

Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 485, in async_added_to_hass
Nov 18 15:07:48 hapi2 hass[1467]:     await self.check_stuff()
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 446, in check_stuff
Nov 18 15:07:48 hapi2 hass[1467]:     self._update(today)
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 297, in _update
Nov 18 15:07:48 hapi2 hass[1467]:     self._average = self._calc_price(data.get("Average"))
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 278, in _calc_price
Nov 18 15:07:48 hapi2 hass[1467]:     float(1 + self._vat)
Nov 18 15:07:48 hapi2 hass[1467]: TypeError: can only concatenate str (not "float") to str
 

Lenke til kommentar
Del på andre sider

LarsH skrev (På 18.11.2021 den 15.26):

Jeg sliter med å få v0.0.3 -koden til å spille. Har prøvd litt forskjellige endringer i sensor.py uten å komme i mål feilfritt.

Kan det være fordi jeg fremdeles er på HA v0.117.2 (core)/ python 3.7.3?

 

Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 485, in async_added_to_hass
Nov 18 15:07:48 hapi2 hass[1467]:     await self.check_stuff()
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 446, in check_stuff
Nov 18 15:07:48 hapi2 hass[1467]:     self._update(today)
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 297, in _update
Nov 18 15:07:48 hapi2 hass[1467]:     self._average = self._calc_price(data.get("Average"))
Nov 18 15:07:48 hapi2 hass[1467]:   File "/home/homeassistant/.homeassistant/custom_components/nordpool/sensor.py", line 278, in _calc_price
Nov 18 15:07:48 hapi2 hass[1467]:     float(1 + self._vat)
Nov 18 15:07:48 hapi2 hass[1467]: TypeError: can only concatenate str (not "float") to str
 

Jeg er usikker på hva som er grunnen her. Siden du selv har gjort endringer vil jeg anbefale at du tar det fresh install av nordpool componenten. Sett opp sensoren vil via gui uten noe template og enable debug logging. Hvis du fortsatt får feil åpner du en issue på github med loggen :)

Lenke til kommentar
Del på andre sider

Dette var feilmeldingen med den opprinnelige v0.0.3 -koden, som jeg hadde lastet på nytt i custom_components.

Siste forsøk var å kommentere ut alt nordpool-oppsett i  sensors.yaml, og dobbeltsjekke at det ikke var igjen noen nordpool -entiteter før en HA-restart.

Deretter: laste inn og konfigurere via "new integration". Samme feil.

Ser ut som denne svenske kameraten har vært borti noe lignende:

 

https://issueexplorer.com/issue/custom-components/nordpool/76

 

Men jeg har ikke dobbelt med "sensors:" -headers.

Skal teste enda litt til før jeg evt åpner en issue 🙂

Lenke til kommentar
Del på andre sider

Eirek skrev (På 1.10.2021 den 10.34):
  • En template sensor som inneholder en array med data om "inneværende time og fremover, med tilhørende priser". Man kan jo også tenke seg attributter eller nye sensorer som sier min, max og avg pris i samme periode - altså herfra og fremover.
  • Samme som den over, bare at man her begrenser den til å være herfra og x-antall timer fremover i tid
  • En template sensor hvor man f.eks sier "Gi meg klokkeslettet for starten på den billigste 3-timersperioden mellom f.eks kl 22 og 07:00". Tallet 3 er jo bare et eksempel med tanke på hvor mange timer man trenger bilen plugget i for å lade bilen opp til f.eks 80% ut fra gjeldende SOC.

 

Jeg tok det som en anledning til å utforske mulighetene i template. Dette er hva jeg kom frem til. Fikk ikke tid til å teste å lage sensor av dem, men all logikk du trenger bør være her. Lim den inn i template under Developer tool.

 

{% set today_price = states.sensor.nordpool_kwh_krsand_nok_3_09_025.attributes.today %}
{% set tomorrow_price = states.sensor.nordpool_kwh_krsand_nok_3_09_025.attributes.tomorrow %}

Dagens priser:
{{ today_price }}

Morgendagens priser:
{{ tomorrow_price }}

{% set current_hour =  now().hour -%}
Gjeldene time: {{ current_hour }}

Pris nå: {{ today_price[current_hour]}}

Videre priser i dag: {{ today_price[current_hour:]}}

{% set future_price = today_price[current_hour:] + tomorrow_price -%} 
Fremtidige priser: {{ future_price}}

Snitt av fremtidige priser: {{ future_price | average | round(3) }}
Min av fremtidige priser: {{ future_price | min | round(3) }}
Max av fremtidige priser: {{ future_price | max | round(3) }}

{% set night_start = 22 -%}
{% set night_end = 7 -%}
{% if night_start > night_end -%}
  {% set night_length = 24 - night_start + night_end -%}
  {% set night_prices = today_price[night_start:] + tomorrow_price[0:night_end] -%} 
{% else -%}
  {% set night_length = night_end - night_start -%}
  {% set night_prices = tomorrow_price[night_start:night_end] -%} 
{% endif -%}

{% set num_low_hours = 3 -%}
{% set considered_interval_start = night_length - num_low_hours +1 -%}



Natt priser: {{ night_prices }}
Snitt av fremtidige priser: {{ night_prices  | round(3) }}
Min av fremtidige priser: {{ night_prices | min | round(3) }}
Max av fremtidige priser: {{ night_prices | max | round(3) }}

{% set ns = namespace(current_best_average=1000, current_best_index=-1) -%}  
{% for price in night_prices[:considered_interval_start] -%}
  {% set current_average =  night_prices[loop.index0:loop.index0+3] | average -%}
  {% if current_average < ns.current_best_average -%}
    {%-set ns.current_best_average = current_average -%}
    {% set ns.current_best_index = loop.index0 -%}
  {% endif -%}
{% endfor -%}

{% set night_best_start = (night_start + ns.current_best_index) % 24 -%}

Beste {{ num_low_hours }} timers intervall i natt starter kl {{ night_best_start }} og snitt-prisen er {{ ns.current_best_average | round(3) }}

 

Endret av Jolo
  • Thanks 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.

 Del

×
×
  • Opprett ny...