ProtoBoksi DIY-ohje

Ioniqin aurinkolataus Home Assistantilla

Ensimmäinen toimiva versio, jossa Hyundai Ioniqin latausta ohjataan Home Assistantilla, Ratio-laturilla ja OCPP:llä. Logiikassa on kolme lataustapaa: pelkkä aurinko, aurinko + halpa sähkö ja halpa sähkö sallittu. Lisäksi mukana on pakko päällä -override.

Home Assistant Ratio Electric Smart OCPP Hyundai Ioniq Electric Nordpool Aurinkosähkö

Idea lyhyesti

Kun talo alkaa myydä sähköä verkkoon, automaatio voi käynnistää sähköauton latauksen. Jos sähkö on halpaa, lataus voidaan sallia myös silloin, kun koko latausteho ei tule auringosta.

Tässä versiossa lataus toimii päälle/pois-periaatteella, koska Ioniq lataa tässä kokoonpanossa käytännössä noin 3,7 kW teholla, eikä portaattomasti säätyvä virta vielä tottele niin kuin pitäisi.

Miten latauslogiikka toimii?

Automaatio lukee talon verkkoon/verkosta kulkevaa tehoa, sähkön hintaa ja käyttäjän valitsemaa lataustapaa. Lataus käynnistetään vain silloin, kun valitun tilan ehdot täyttyvät.

1. Pelkkä aurinko Lataus käynnistyy vasta, kun sähköä viedään verkkoon riittävästi. Oletusraja tässä ohjeessa on 3400 W.
2. Aurinko ja halpa sähkö Lataus käynnistyy, kun sähköä menee verkkoon edes jonkin verran ja pörssisähkö on halpaa. Oletuksena 1000 W vientiä ja hinta alle 5 c/kWh.
3. Halpa sähkö sallittu Lataus voi käynnistyä pelkän halvan hinnan perusteella, vaikka aurinkoa ei juuri sillä hetkellä riittäisi.
Override: jos “Ioniq lataus pakolla päälle” on päällä, lataus käynnistetään ehdoista riippumatta. Tämä on arjen nappi tilanteeseen, jossa auto pitää vain saada ladattua.
Tila Käynnistyy kun... Pysähtyy kun...
Pelkkä aurinko Verkkoon vienti on vähintään asetetun rajan verran, esimerkiksi -3400 W. Talo alkaa ostaa sähköä verkosta yli 300 W 10 minuutin ajan.
Aurinko ja halpa sähkö Verkkoon vienti ylittää aurinko + halpa sähkö -rajan ja hinta on alle halvan sähkön rajan. Verkosta ostetaan yli sammutusrajan tai hinta ei enää ole halpa ja talo ostaa sähköä.
Halpa sähkö sallittu Hinta on alle halvan sähkön rajan tai aurinkoylijäämää on paljon. Hinta nousee yli rajan ja talo ostaa sähköä verkosta.
Tässä ohjeessa oletetaan, että sensor.sauna_grid_power on miinuksella silloin kun sähköä menee verkkoon päin. Jos siun mittari toimii toisinpäin, vertailumerkit pitää kääntää.

Tarvittavat osat ja entityt

Tässä ohjeessa käytetty kokoonpano:

Auto Hyundai Ioniq Electric.
Laturi Ratio Electric Smart, Home Assistantissa OCPP-integraation kautta.
Ohjaus Home Assistant, jossa automaatiot ja helperit.
Mittaus Talon verkkoon/verkosta teho, aurinkotuotanto ja Nordpool-hinta.

Tässä ohjeessa käytetyt entityt

Asia Entity ID
Verkosta ostettu / verkkoon myyty teho sensor.sauna_grid_power
Sähkön hinta sensor.nordpool_kwh_fi_eur_3_10_0255
Latauksen ohjaus switch.charger_charge_control
Latausteho sensor.charger_power_active_import
Tämän session energia sensor.charger_energy_session
Turvallisuus: tässä ohjeessa ei tehdä sähkötöitä eikä muuteta keskuksen tai laturin sisäisiä kytkentöjä. Ohje koskee valmiin sähköautolaturin ohjaamista Home Assistantilla. Sähköasennusten pitää olla kunnossa ja ammattilaisen tekemiä.

1. Helperit YAMLilla

Helperit voi tehdä myös Home Assistantin käyttöliittymästä, mutta tässä ne tehdään YAMLilla, jotta kokonaisuus on helpompi kopioida ja dokumentoida.

Lisää configuration.yaml-tiedostoon include-rivit. Jos siulla on nämä jo ennestään, älä lisää samoja otsikoita kahteen kertaan.
Luo samaan kansioon tiedostot input_booleans.yaml, input_numbers.yaml ja input_selects.yaml.
Tarkista konfiguraatio: Developer tools → YAML → Check configuration. Sen jälkeen käynnistä Home Assistant uudelleen.
configuration.yaml – include-rivit
# configuration.yaml

default_config:

frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
template: !include templates.yaml

input_boolean: !include input_booleans.yaml
input_number: !include input_numbers.yaml
input_select: !include input_selects.yaml
input_selects.yaml
# input_selects.yaml

ioniq_lataustapa:
  name: Ioniq lataustapa
  options:
    - Pelkkä aurinko
    - Aurinko ja halpa sähkö
    - Halpa sähkö sallittu
  initial: Aurinko ja halpa sähkö
  icon: mdi:car-electric
input_booleans.yaml
# input_booleans.yaml

ioniq_lataus_override:
  name: Ioniq lataus pakolla päälle
  icon: mdi:flash

ioniq_lataus_automatiikka:
  name: Ioniq latausautomatiikka käytössä
  icon: mdi:auto-mode
input_numbers.yaml
# input_numbers.yaml

ioniq_halpa_sahko_raja:
  name: Ioniq halvan sähkön raja
  min: 0
  max: 30
  step: 0.1
  unit_of_measurement: "c/kWh"
  icon: mdi:currency-eur
  mode: box
  initial: 5

ioniq_pelkka_aurinko_vientiraja:
  name: Ioniq pelkän auringon vientiraja
  min: 500
  max: 6000
  step: 100
  unit_of_measurement: "W"
  icon: mdi:solar-power
  mode: box
  initial: 3400

ioniq_aurinko_halpa_vientiraja:
  name: Ioniq aurinko + halpa sähkö vientiraja
  min: 0
  max: 6000
  step: 100
  unit_of_measurement: "W"
  icon: mdi:transmission-tower-export
  mode: box
  initial: 1000

ioniq_sammutus_ostoraja:
  name: Ioniq sammutuksen ostoraja
  min: 0
  max: 6000
  step: 100
  unit_of_measurement: "W"
  icon: mdi:transmission-tower-import
  mode: box
  initial: 2500

2. Automaatiot

Nämä lisätään automations.yaml-tiedoston loppuun. Jos käytät Home Assistantin automaatioeditoria, voi olla selkeintä tehdä automaatiot ensin UI:ssa ja muokata sen jälkeen YAML-näkymässä.

Automaatioissa on mukana viiveet, jotta lataus ei lähde päälle yhden sekunnin aurinkopiikistä eikä sammu heti pilven tullessa auringon eteen.
automations.yaml – käynnistys, pysäytys ja automatiikka pois
# automations.yaml
# Lisää nämä automations.yaml-tiedoston loppuun.
# Älä lisää erillistä automation:-otsikkoa, jos configuration.yaml sisältää rivin:
# automation: !include automations.yaml

- id: ioniq_lataus_kaynnistys
  alias: Ioniq lataus - käynnistys
  description: Käynnistää Ioniqin latauksen valitun lataustavan mukaan.
  mode: single

  trigger:
    - platform: state
      entity_id: input_boolean.ioniq_lataus_override
      to: "on"

    - platform: template
      value_template: >
        {% set grid_w = states('sensor.sauna_grid_power') | float(0) %}

        {# Nordpool voi olla joko €/kWh tai c/kWh. Muutetaan tarvittaessa senteiksi. #}
        {% set price_raw = states('sensor.nordpool_kwh_fi_eur_3_10_0255') | float(999) %}
        {% set price_c = price_raw * 100 if price_raw < 1 else price_raw %}

        {% set mode_now = states('input_select.ioniq_lataustapa') %}
        {% set halpa_raja = states('input_number.ioniq_halpa_sahko_raja') | float(5) %}
        {% set aurinko_raja = states('input_number.ioniq_pelkka_aurinko_vientiraja') | float(3400) %}
        {% set aurinko_halpa_raja = states('input_number.ioniq_aurinko_halpa_vientiraja') | float(1000) %}

        {% set charger_off = is_state('switch.charger_charge_control', 'off') %}
        {% set automatiikka_on = is_state('input_boolean.ioniq_lataus_automatiikka', 'on') %}
        {% set override_on = is_state('input_boolean.ioniq_lataus_override', 'on') %}

        {{
          charger_off and (
            override_on
            or
            (
              automatiikka_on and (
                (
                  mode_now == 'Pelkkä aurinko'
                  and grid_w <= (aurinko_raja * -1)
                )
                or
                (
                  mode_now == 'Aurinko ja halpa sähkö'
                  and grid_w <= (aurinko_halpa_raja * -1)
                  and price_c <= halpa_raja
                )
                or
                (
                  mode_now == 'Halpa sähkö sallittu'
                  and (
                    price_c <= halpa_raja
                    or grid_w <= (aurinko_raja * -1)
                  )
                )
              )
            )
          )
        }}
      for: "00:05:00"

  condition:
    - condition: state
      entity_id: switch.charger_charge_control
      state: "off"

  action:
    - service: switch.turn_on
      target:
        entity_id: switch.charger_charge_control

    - service: logbook.log
      data:
        name: Ioniq lataus
        message: Lataus käynnistettiin automaattisesti valitun lataustavan perusteella.
        entity_id: switch.charger_charge_control


- id: ioniq_lataus_pysaytys
  alias: Ioniq lataus - pysäytys
  description: >
    Pysäyttää Ioniqin latauksen, jos valitun lataustavan ehdot eivät enää täyty.
    Override estää automaattisen pysäytyksen.
  mode: restart

  trigger:
    - platform: template
      value_template: >
        {% set grid_w = states('sensor.sauna_grid_power') | float(0) %}

        {# Nordpool voi olla joko €/kWh tai c/kWh. Muutetaan tarvittaessa senteiksi. #}
        {% set price_raw = states('sensor.nordpool_kwh_fi_eur_3_10_0255') | float(999) %}
        {% set price_c = price_raw * 100 if price_raw < 1 else price_raw %}

        {% set mode_now = states('input_select.ioniq_lataustapa') %}
        {% set halpa_raja = states('input_number.ioniq_halpa_sahko_raja') | float(5) %}
        {% set sammutus_raja = states('input_number.ioniq_sammutus_ostoraja') | float(2500) %}

        {% set charger_on = is_state('switch.charger_charge_control', 'on') %}
        {% set automatiikka_on = is_state('input_boolean.ioniq_lataus_automatiikka', 'on') %}
        {% set override_on = is_state('input_boolean.ioniq_lataus_override', 'on') %}

        {{
          charger_on
          and automatiikka_on
          and not override_on
          and (
            (
              mode_now == 'Pelkkä aurinko'
              and grid_w > 300
            )
            or
            (
              mode_now == 'Aurinko ja halpa sähkö'
              and (
                grid_w > sammutus_raja
                or
                (
                  price_c > halpa_raja
                  and grid_w > 300
                )
              )
            )
            or
            (
              mode_now == 'Halpa sähkö sallittu'
              and price_c > halpa_raja
              and grid_w > 300
            )
          )
        }}
      for: "00:10:00"

  condition:
    - condition: state
      entity_id: switch.charger_charge_control
      state: "on"

    - condition: state
      entity_id: input_boolean.ioniq_lataus_override
      state: "off"

  action:
    - service: switch.turn_off
      target:
        entity_id: switch.charger_charge_control

    - service: logbook.log
      data:
        name: Ioniq lataus
        message: Lataus pysäytettiin automaattisesti, koska valitun lataustavan ehdot eivät enää täyttyneet.
        entity_id: switch.charger_charge_control


- id: ioniq_lataus_automatiikka_pois
  alias: Ioniq lataus - automatiikka pois
  description: >
    Pysäyttää latauksen heti, kun Ioniqin latausautomatiikka kytketään pois päältä.
    Jos override on päällä, latausta ei pysäytetä.
  mode: single

  trigger:
    - platform: state
      entity_id: input_boolean.ioniq_lataus_automatiikka
      to: "off"

  condition:
    - condition: state
      entity_id: switch.charger_charge_control
      state: "on"

    - condition: state
      entity_id: input_boolean.ioniq_lataus_override
      state: "off"

  action:
    - service: switch.turn_off
      target:
        entity_id: switch.charger_charge_control

    - service: logbook.log
      data:
        name: Ioniq lataus
        message: Lataus pysäytettiin, koska latausautomatiikka kytkettiin pois päältä.
        entity_id: switch.charger_charge_control

3. Dashboard

Tämä on kokonainen Home Assistant -näkymä nimellä Auton lataus. Se on jaettu videota varten siististi osiin: aurinkolatauksen ohjaus, tilanne, rajat, laturin tiedot, latausvirta, energia, historia ja diagnostiikka.

Jos liität tämän olemassa olevaan dashboardiin, varmista ettet vahingossa korvaa muita näkymiä. Helpoin tapa on luoda uusi dashboard/näkymä ja liittää tämä sinne YAML-tilassa.
Dashboard YAML – Auton lataus
views:
  - title: Auton lataus
    path: auton-lataus
    icon: mdi:ev-station
    type: sections
    max_columns: 4
    sections:
      - type: grid
        cards:
          - type: heading
            heading: Aurinkolataus - ohjaus
            heading_style: title

          - type: tile
            entity: input_boolean.ioniq_lataus_automatiikka
            name: Automatiikka käytössä
            icon: mdi:auto-mode
            color: green
            features:
              - type: toggle

          - type: tile
            entity: input_select.ioniq_lataustapa
            name: Lataustapa
            icon: mdi:car-electric
            color: blue

          - type: tile
            entity: input_boolean.ioniq_lataus_override
            name: Pakko päällä / override
            icon: mdi:flash
            color: red
            features:
              - type: toggle

          - type: tile
            entity: switch.charger_charge_control
            name: Latauksen ohjaus
            icon: mdi:ev-plug-type2
            color: amber
            features:
              - type: toggle

      - type: grid
        cards:
          - type: heading
            heading: Aurinkolataus - tilanne
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.sauna_grid_power
                name: Verkosta ostettu / myyty
                icon: mdi:transmission-tower
                color: amber

              - type: tile
                entity: sensor.nordpool_kwh_fi_eur_3_10_0255
                name: Sähkön hinta
                icon: mdi:currency-eur
                color: blue

              - type: tile
                entity: sensor.charger_power_active_import
                name: Latausteho
                icon: mdi:flash
                color: amber

              - type: tile
                entity: sensor.charger_energy_session
                name: Tämän session energia
                icon: mdi:battery-charging
                color: blue

      - type: grid
        cards:
          - type: heading
            heading: Aurinkolataus - rajat
            heading_style: title

          - type: entities
            title: Säädettävät rajat
            show_header_toggle: false
            entities:
              - entity: input_number.ioniq_halpa_sahko_raja
                name: Halvan sähkön raja

              - entity: input_number.ioniq_pelkka_aurinko_vientiraja
                name: Pelkän auringon vientiraja

              - entity: input_number.ioniq_aurinko_halpa_vientiraja
                name: Aurinko + halpa sähkö vientiraja

              - entity: input_number.ioniq_sammutus_ostoraja
                name: Sammutuksen ostoraja

      - type: grid
        cards:
          - type: heading
            heading: Latauksen tilanne
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.charger_status
                name: Laturin tila
                icon: mdi:ev-station
                color: green

              - type: tile
                entity: sensor.charger_status_connector
                name: Pistokkeen tila
                icon: mdi:power-plug
                color: blue

              - type: tile
                entity: sensor.charger_energy_session
                name: Tämän session energia
                icon: mdi:battery-charging
                color: blue

              - type: tile
                entity: sensor.charger_time_session
                name: Session aika
                icon: mdi:timer-outline
                color: grey

      - type: grid
        cards:
          - type: heading
            heading: Ratio-laturi
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: switch.charger_availability
                name: Laturi käytettävissä
                icon: mdi:check-network
                color: green
                features:
                  - type: toggle

              - type: tile
                entity: switch.charger_charge_control
                name: Latauksen ohjaus
                icon: mdi:ev-plug-type2
                color: amber
                features:
                  - type: toggle

              - type: tile
                entity: sensor.charger_status
                name: Laturin tila
                icon: mdi:ev-station
                color: green

              - type: tile
                entity: sensor.charger_status_connector
                name: Pistokkeen tila
                icon: mdi:power-plug
                color: blue

      - type: grid
        cards:
          - type: heading
            heading: Latausvirta
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: number.charger_maximum_current
                name: Maksimivirta
                icon: mdi:current-ac
                color: amber
                features:
                  - type: numeric-input

              - type: tile
                entity: sensor.charger_current_offered
                name: Tarjottu virta
                icon: mdi:current-ac
                color: amber

              - type: tile
                entity: sensor.charger_current_import
                name: Virta autoon
                icon: mdi:current-ac
                color: blue

              - type: tile
                entity: sensor.charger_voltage
                name: Jännite
                icon: mdi:sine-wave
                color: green

      - type: grid
        cards:
          - type: heading
            heading: Teho ja energia
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.charger_power_active_import
                name: Latausteho
                icon: mdi:flash
                color: amber

              - type: tile
                entity: sensor.charger_energy_session
                name: Tämän session energia
                icon: mdi:battery-charging
                color: blue

              - type: tile
                entity: sensor.charger_energy_active_import_register
                name: OCPP kokonaisenergia
                icon: mdi:counter
                color: grey

              - type: tile
                entity: sensor.charger_soc
                name: Akun varaustaso
                icon: mdi:battery
                color: green

      - type: grid
        cards:
          - type: heading
            heading: Lataushistoria
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.ioniq_lataus_paiva
                name: Tänään ladattu
                icon: mdi:ev-station
                color: blue

              - type: tile
                entity: sensor.ioniq_lataus_kuukausi
                name: Tässä kuussa
                icon: mdi:calendar-month
                color: green

              - type: tile
                entity: sensor.ioniq_lataus_vuosi
                name: Tänä vuonna
                icon: mdi:calendar
                color: amber

              - type: tile
                entity: sensor.charger_energy_active_import_register
                name: OCPP kokonaisenergia
                icon: mdi:counter
                color: grey

      - type: grid
        cards:
          - type: heading
            heading: Auto / sessio
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.charger_soc
                name: Akun varaustaso
                icon: mdi:battery
                color: green

              - type: tile
                entity: sensor.charger_time_session
                name: Session aika
                icon: mdi:timer-outline
                color: blue

              - type: tile
                entity: sensor.charger_transaction_id
                name: Transaction ID
                icon: mdi:identifier
                color: grey

              - type: tile
                entity: sensor.charger_stop_reason
                name: Pysäytyksen syy
                icon: mdi:stop-circle-outline
                color: red

      - type: grid
        cards:
          - type: heading
            heading: Manuaaliohjaus
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: button
                entity: button.charger_unlock
                name: Avaa lukitus
                icon: mdi:lock-open
                tap_action:
                  action: toggle

              - type: button
                entity: button.charger_reset
                name: Käynnistä laturi uudelleen
                icon: mdi:restart
                tap_action:
                  action: toggle

      - type: grid
        cards:
          - type: heading
            heading: Yhteys ja diagnostiikka
            heading_style: title

          - square: false
            type: grid
            columns: 2
            cards:
              - type: tile
                entity: sensor.charger_heartbeat
                name: Heartbeat
                icon: mdi:heart-pulse
                color: red

              - type: tile
                entity: sensor.charger_latency_ping
                name: Ping
                icon: mdi:lan-connect
                color: blue

              - type: tile
                entity: sensor.charger_latency_pong
                name: Pong
                icon: mdi:lan-check
                color: green

              - type: tile
                entity: sensor.charger_reconnects
                name: Uudelleenyhdistykset
                icon: mdi:connection
                color: amber

              - type: tile
                entity: sensor.charger_error_code
                name: Virhekoodi
                icon: mdi:alert-circle-outline
                color: red

              - type: tile
                entity: sensor.charger_version_firmware
                name: Firmware
                icon: mdi:chip
                color: grey

4. Käyttöönotto ja testaus

Tarkista että helperit näkyvät Home Assistantissa: input_select.ioniq_lataustapa, input_boolean.ioniq_lataus_override, input_boolean.ioniq_lataus_automatiikka ja input_number-rajat.
Tarkista että switch.charger_charge_control todella käynnistää ja pysäyttää latauksen. Testaa ensin käsin ennen automaatiota.
Laita Automatiikka käytössä päälle ja valitse lataustavaksi Aurinko ja halpa sähkö.
Tarkista että sensor.sauna_grid_power menee miinukselle silloin, kun sähköä viedään verkkoon.
Tarkista että sähkön hinta näkyy järkevänä arvona. Ohjeen automaatio muuttaa €/kWh-arvon senteiksi, jos anturin arvo on alle 1.
Kokeile overridea. Kun Pakko päällä / override laitetaan päälle, latauksen pitäisi käynnistyä ehdoista riippumatta.

5. Vianhaku

Lataus ei käynnisty

Tarkista ensin nämä:

Lataus ei pysähdy

Tarkista nämä:

Latausvirran säätö ei toimi

Tässä versiossa lataus tehdään päälle/pois-logiikalla. Vaikka Home Assistantissa näkyisi number.charger_maximum_current, auto ja laturi eivät välttämättä tottele muutosta halutulla tavalla.

Jos virransäätö saadaan myöhemmin toimimaan luotettavasti, tästä voi tehdä paremman version, jossa Home Assistant säätää latausta portaittain aurinkoylijäämän mukaan.

Entityt ovat eri nimisiä

Vaihda YAML-koodeihin omat entity ID:t. Tärkeimmät vaihdettavat ovat: sensor.sauna_grid_power, sensor.nordpool_kwh_fi_eur_3_10_0255 ja switch.charger_charge_control.

Päivitykset ja jatkoideat

Tämä on ensimmäinen toimiva versio. Jatkossa tähän voisi lisätä:

ProtoBoksi-ajatus tässäkin: ensin tehdään toimiva versio, sitten parannetaan.