ESPHomen käyttöönotto ja räätälöidyt komponentit

ESPHomen käyttöönotto ja räätälöidyt komponentit

ESPhome on helppokäyttöinen työkalu ESP8266 ja ESP32 mikrokontrollerien firmwaren tekoon mahdollistaen samalla laitteiden yhdistämisen Home Assistantiin. Sen käyttö perustuu yksinkertaisiin, mutta tehokkaisiin yaml-konfiguraatiotiedostoihin. Peruskäytössä ohjelmointitaitoja ei siis tarvita. Valmiita esimerkkejä ja kattava dokumentaatio löytyy ESPHomen -sivuilta. ESPHomea voi käyttää käytännössä kaikkien laitteiden kanssa, joissa on joko ESP8266 tai ESP32 mikrokontrolleri sisäänrakennettuna tai erillisten kehitysalustojen kuten tälläkin sivustolla usein mainitun Wemos D1 Minin kanssa.

ESPHome
ESPHome

ESPHomeen liitettävien anturien kirjo on laaja. Yhteen alustaan on mahdollista yhdistää yksi tai useampi anturi samanaikaisesti. Jos anturille ei löydy tukea suoraan, on sille myös mahdollista kirjoittaa oma komponentti. Tällöin tosin ohjelmointitaidot tulevat tarpeeseen.

ESPHomen asennus onnistuu helposti Pythonin PIP -pakettina tai Docker -konttina. Sen voi asentaa myös Home Assistantin lisäosana kunhan käytössä on Home Assistant OS tai Supervised -asennus.

ESPHomen käyttö tapahtuu joko sen Web-käyttöliittymän eli Dashboardin avulla tai suoraan komentoriviltä. Liitettävälle laitteelle kirjoitetaan yaml -muotoinen konfiguraatiotiedosto, jonka avulla järjestelmä tekee tarvittavan firmwaren. Laitteet ilmestyvät firmwaren päivityksen jälkeen Home Assistantiin kunhan myös Home Asistant ESPHome -integraatio on asennettu.

ESPHome
ESPHome Dashboard

Ensimmäisellä kerralla firmware on päivitettävä laitteeseen langallisesti USB-kaapelilla tai ohjelmointipinneihin kytkeytymällä esimerkiksi ESPHome-Flasherin avulla. Jatkossa firmware on mahdollista päivittää langattomasti OTA -ominaisuuden avulla, kunhan se on konfiguraatiotiedostossa sallittu.

Käytössäni on useita ESP8266 -laitteita kuten valojen ohjauksia, kosteushälytin sekä sähkönkulutuksen ja vedenkulutuksen seuranta. Ennen päivitystä uuteen kotiautomaatiopavelimeen, nämä laitteet oli toteutettu MySensorsin tai muun vastaavan firmwaren avulla. Palvelinvaihdoksen yhteydessä kaikki nämä saivat vaihtua ESPHomeen.

Valojen ohjaus Sonoff Basicin avulla

Aikaisemman Sonoff Basicin avulla toteutetun valo-ohjauksen vaihto ESPHomeen oli ehdottomasti joukon helpoin tehdä. Tätä varten käytin valmista esimerkkikonfiguraatiota, johon luonnollisesti vahdoin oman kotiverkkoni ja Home Assistantin tiedot.

esphome:
  name: valot
  platform: ESP8266
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: True
    name: "Sonoff Basic Button"
    on_press:
      - switch.toggle: relay

switch:
  - platform: gpio
    name: "Sonoff Basic Relay"
    pin: GPIO12
    id: relay

status_led:
  pin:
    number: GPIO13
    inverted: yes

Kosteushälytin

Aiempi MySensors:n avulla toteutettu kosteushälytin koostuu Wemos D1 Ministä, siihen liitetystä kosteusanturikaapelista ja muutamista peruskomponenteista. Laitteen mittaus perustuu kaapelin resistanssin muutokseen kosteuden lisääntyessä. Koodi oli aiemmin kirjoitettu itse, joten myös ESPHome tarvitsisi räätälöidyn komponentin.

Komponentin kirjoittaminen oli helppoa. Vanhasta koodista kopioitiin setup() ja loop() -funktioiden sisältö uuden räätälöidyn komponenttiluokan vastaaviin funktioihin. Tämän lisäksi anturiarvojen julkaisulle piti lisätä omat kutsut koodiin ja poistaa vanhat. Komponentin koodi ja anturin konfiguraatiotiedosto on ladattavissa GitHubista.

Sähkönkulutuksen seuranta

Aikaisemmin rakentamani sähkönkulutuksen seuranta koostuu Wemos D1 Mini Pro:sta ja siihen yhdistetystä valoanturista. Sähkön kulutus saadaan sähkömittarin ledin valopulssit laskemalla. ESPHomessa on tätä varten valmiiksi sopivat pulssien laskentaan tehdyt mallit:

esphome:
  name: sahkon-kulutus
  platform: ESP8266
  board: d1_mini_pro

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: !secret ota_password
  
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

sensor:
  - platform: pulse_counter
    pin: 5
    unit_of_measurement: 'W'
    name: 'Hetkellinen kulutus'
    filters:
      - multiply: 6 # (60s/10000 pulses per kWh)

    total:
      name: "Kumulatiivinen kulutus"
      unit_of_measurement: "kWh"
      accuracy_decimals: 2
      filters:
        - multiply: 0.0001 # (60s/10000 pulses per kWh)

Vedenkulutuksen seuranta

Myös vedenkulutuksen seuranta perustuu sähkönkulutuksen tavoin pulssien laskemiseen. Alustana on tässä Wemos D1 Mini ja siinä laser-valon heijastusta mittaava anturointi. Firmwaressa erona on että anturin raakadataa on käsiteltävä matemaattisesti enemmän kuin ESPHomen filtterit kykenevät, joten tätäkin varten ESPHomeen piti kirjoittaa oma  räätälöity komponentti. Komponentin koodi ja anturin konfiguraatiotiedosto on ladattavissa GitHubista.

Useita antureita yhteen

Aiemmassa järjestelmässä Raspberry Pi:n GPIO -nastoissa oli kiinni anturit sisilmanlaadun mittaukselle, ilmanvaihtokoneen jäteilman lämpötilalle sekä ilmanvaihtokoneen tehostukseen käytettävät releet. Sisäilmanlaadun uudesta anturista kirjoitin erillisen jutun jo aiemmin. Kaikki edellä mainitut komponentit on uudessa järjestelmässä kytketty Olimex ESP32-EVB -alustaan ja niille on kirjoitettu yhteinen konfiguraatiotiedosto:

esphome:
  name: anturialusta
  platform: ESP32
  board: esp32-evb

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: !secret ota_password

ethernet:
  type: LAN8720
  mdc_pin: GPIO23
  mdio_pin: GPIO18
  clk_mode: GPIO0_IN
  phy_addr: 0
  
  manual_ip:
    static_ip: x.x.x.x
    gateway: y.y.y.y
    subnet: z.z.z.z

switch:
  - platform: gpio
    name: "Ilmanvaihdon tehostus"
    pin: 32

  - platform: gpio
    name: "Takkakytkin"
    pin: 33

dallas:
  - pin: GPIO14

i2c:
  sda: GPIO13
  scl: GPIO16

sensor:
  - platform: dallas
    address: 0x0C000802C9B83B10
    name: "Nilan jäteilma"

  - platform: scd30
    co2:
      name: "CO2-pitoisuus"
      accuracy_decimals: 1
    temperature:
      name: "Lämpötila"
      accuracy_decimals: 1
    humidity:
      name: "Suhteellinen kosteus"
      accuracy_decimals: 1

Juotin kytkentälevyn palalle Dupont-naaarasliittimet ja näistä johtimet ESP32:n GPIO-pinneihin. Suunnittelin ja tulostin koko komeudelle kotelon. Kytkentälevyn liittimet tulevat kotelon kannesta läpi helpon kytkennän mahdollistamiseksi.

Olimex ESP32-EVB kotelo
Olimex ESP32-EVB kotelo

Uponor KNXRF -termostaatit

Aikaisemman Uponorin KNXRF -termostaattien seurannan toteuttaminen ESPHomen avulla oli ehdottomasti työläin projekti tässä listatuista. Aiemmin Raspberry Pi:n GPIO-nastoihin yhdistetty RF-moduuli liitettiin nyt ESP32:een ja samalla koko koodi piti kirjoittaa uusiksi. Löytämäni, lupaavalta vaikuttanut koodi ei ensiyrittämällä toiminut, vaan aiheutti järjestelmällisen kaatumisen käynnistyksen yhteydessä muistiongelmien vuoksi. Ongelman selvittelyyn ja samalla koodin sovittamiseen omaan käyttötarkoitukseen kului yllättävän paljon aikaa. Lopputuloksena yksinkertaistettu ESPHome -komponentti, joka löytyy GitHubista.

Alustana tälle on käytetty NodeMCU-32S:ää. Suunnittelin ja tulostin sille yksinkertaisen kotelon:

NodeMCU kotelo
NodeMCU kotelo

12 thoughts on “ESPHomen käyttöönotto ja räätälöidyt komponentit

  1. Moi, ja heti alkuun kiitokset hienosta blogista, luettua on tullut pitkään. Tätä Uponor-knx:ää olen nyt tutkaillut ja testaillut, toteutuksesi näyttäisi ratkaisevan juurikin käsissäni olevan ongelman. Hiukan vaan jää epäselväksi kun tuolla esphome-esimerkissä annetaan nippu mac-osoitteita, nämä lienevät kuunneltavien antureiden osoiteet, mutta onkos niiden selvittämiseen joku tapa esphomen kanssa? Vai tarviiko ensin laittaa tuo raspi-versio ajoon jotta nuo saa jotenkin kaivettua.

    1. Kiitos kommenteistasi! Täytyy ihan alkuun myöntää että tämä ei enää ole aivan kirkkaimmassa muistissa. MAC-osoitteet ovat juurikin kuunneltavien termareiden osoitteet. Itselläni nämä oli entuudestaan jo tiedossa raspi-version ajoilta, joten niitä ei tarvinut ESPHomea varten selvittää. Pikaisella tarkastelulla knx_rf.h:n lopussa kaikki löydetyt knx-anturit käydään läpi, mutta vain listatut mac-osoitteet raportoidaan eteenpäin ESPHomen kautta. Tähän tarvisi siis lisätä loggausrivi löydetyille antureille.

      1. Jooh, eli tulkitsin nuo id:t oikein.

        Lisäsin tuonne rivin 224 tuon if-rakenteen alkuun, eli jokainen saapuva id logataan debug-tasolla:

        // Only publish when temperature is received and is above threshold to filter outliers
        if (knxdata.target_address == 1 && knxdata.temperature > 16) {

        ESP_LOGD(”KNX”, ”Get message from: %s”, knxdata.sensor_id);

        if (!strcmp(knxdata.sensor_id,id1)) {
        temperature1->publish_state(knxdata.temperature);

        ja logiin rupesi ilmestymään id:itä tyyliin
        [13:08:59][D][KNX:224]: Get message from: 0074000045CB

  2. Moi,
    itseänikin kiinnosti juuri tämä KNXRF osuus.

    Iso kiitos Kimmolle tästä päivityksestä! Kiitos myös Tepolle tuosta MAC-osoitteiden selvityksestä!
    Itse hommasin jo keväällä CC11010:n ja yritin sitä saada toimimaan ESP8266:n kanssa, mutta osaaminen ehkä loppui hieman kesken ja homma jäi hautumaan. Tämän postauksen avulla sain homman toimimaan yhdessä illassa, vaikka en ole koskaan ESPHomea käyttänyt aikaisemmin.

  3. Hei

    Onko tuo kerroin tosissaan 6 ? Itse en saa järkeviä lukemia tällä

    sensor:
    – platform: pulse_counter
    pin: 5
    unit_of_measurement: ’W’
    name: ’Hetkellinen kulutus’
    filters:
    – multiply: 6 # (60s/10000 pulses per kWh)

    1. Tuo kerroin riipouu mittarista, kuinka monta pulssia kWh on. Kannattaa ehkä myös tarkistaa, rekisteröikö pulssilakuri kaikki mittarin lähettämät pulssit.

      1. Jostain syystä ei kyllä rekisteröi kaikkia pulsseja. Otsalampun strobo-välkkeestä laski kyllä järkeviä lukemia mutta vilkusta näyttää muutamia pulsseja (6-8). Mystistä

        1. Itse kokeilin aikanaan LDR-fotoresistoria enkä saanut sitä pelaamaan luotettavasti, vaan se toimi kuvaamallasi tavalla. Vaihdoin anturin fotodiodiin ja se on nyt pelannut vuosia luotettavasti. Kannattaa kokeilla yrittää blokata kaikkea muuta valoa osumasta anturiin ja säätää anturin herkkyyttä mikäli mahdollista.

          1. Hei

            Vaihdoin koodissa pulse_counter -> pulse_meter ja homma alkoi pelittää

          2. Hyvä että sait toimimaan. Käytännössä pulse_counter laskee tehon tietylle ajanjaksolle ja pulse_meter joka pulssilla. Käytännön ero siis nopeudessa.

Vastaa käyttäjälle Teppo Peruuta vastaus

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *