HomeAssistant ja ESP32/ESPHome

Liittynyt
17.10.2016
Viestejä
6 442
Aloitellaanpas ESP32 ja Homeassistant liittyvä keskusteluketju ettei kaikkea keskustelua tungeta tuohon Kotiautomaatio-ketjuun.

Itselläni ESP32:t ovat vielä matkalla mutta ensimmäisenä sovelluksena ajattelin liittää nykyisiä painonapeilla toimivia valoja automaatioon ESP32 avulla. Saan valoilta tilatiedon joko kärkitietona tai jänitetietona (24VDC), varmaankin kuiva kärki on kätevämpi. Valoilla on rinnakkaisohjaus sulkeutuvalla kärkitiedolla pulssitoimisena eli yksi pulssi -> valo päälle, toinen pulssi -> valo pois päältä ja tosiaan saan tilatiedon onko valo päällä vai pois kärkitiedolla eli kärki kiinni -> valo palaa, kärki auki -> valo sammuksissa.

ESPHomen dokumentaatiota lukemalla olen todennut että todennäköisesti saan kohtalaisen helposti kyllä annettua pulsseja tuolle valo-ohjaimelle ja vastaavasti saan tilatiedon luettua sieltä mutta siihen en löytänyt yhtäkkiä vastausta että saanko tehtyä jotenkin sellaisen toiminnon että HomeAssistantissa näkyisi samanlainen valokytkin kuin muissakin valoissa eli on/off-kytkin joka siis lukisi tilansa tuolta kärkitiedosta ja kun käyttöliittymässä (tai node-redissä) vaihtaisi kytkimen tilaa niin HomeAssistant antaisi ESP32:n kautta pulssin valo-ohjaimelle ja valo menisi päälle tai pois.

Luultavasti vastaus on ihan simppeli ja ilmeinen mutta näin ihan päässä mietittynä ja dokumentaatiota lukemalla tuo ei vain hahmotu. Ja varmaan asia olisi selkeämpi kun olisi ESPit käsillä niin voisi suoraan debugata mutta ajattelin kuitenkin ennalta kysyä että meneekö tämä ihan jollakin toiminnolla triviaalisti vai pitääkö tuohon oikeasti miettiä esim node-redissä joku oikea logiikka.
 
Eli tosiaan ajattelin että kytkentä olisi kuvan kaltainen. Vasemmalla on ESP32 jonka lähdöllä ohjattaisiin pulssilla olemassaolevan napin rinnalta kuvan mukaisesti (välissä olisi kyllä elektroniikkaa, suoraan ESP:n GPIO:oon en ajatellut 12V tuoda). Vastaavasti ESP:n tuloon saisin tilatiedon kun tuossa sysärissä (oikeasti monitoimirele impulssirelemoodissa) on yksi vaihtokärki vapaana. Valaisin on siis erillisellä 24V powerilla tuolla toisella kärjellä.

Miten ihmeessä tuollaisen saisi järkevästi näkymään HomeAssistantissa edes jokseenkin samaan tyyliin kuin muut valaisimet? Kaikenlaisia light-juttuja ja output-gpio -juttuja koitin kokeilla mutta jotenkin tuo nyt ei oikein lähde aukeamaan. Joko valokytkin HomeAssistantissa muuttuu ihan holtittomaksi, ohjaa lähtöä ihan väärin tai jotain muuta kummaa. Pitääkö tuohon ESPin konfiguraatioon tehdä joku sisäinen/virtuaalinen kytkin ja/tai käyttää light-componentin sijaan esim switchiä jonka vaan määrittelee lightin kaltaiseksi? Googlettamallakaan en oikein löytänyt mitään edes tuohon suuntaan viittaavaa esimerkkiä josta olisi päässyt vähän jäljille. Mielellään toteuttaisin tuon mahdollisimman pitkälle suoraan ESPissä, kyllähän tuon tietty saisi varmaan helposti Node-Redillä toteutettua jos tulon ja lähdön vaan määrittelisi täysin erillisinä, tuossa vaan on se että jos noihin valoihin tulee muita ohjauksia/automaatioita HomeAssistantissa tai Node-Redissä niin saattaa alkaa menemään vähän sotkuiseksi.

Tuo nykyinen siis toimii ihan kuin sysärillä ja napilla ohjattava valo yleensäkin, eli nappia painettaessa rele vetää ja jää vetäneeksi jolloin valo syttyy ja toisen kerran painettaessa rele päästää ja valo sammuu.

(pahoittelen huonoa kuvaa, ei taas löytynyt mitään muuta kynää eikä tällä koneella ole oikein mitään järkevää piirtelyohjelmaa)
1613058589345.jpeg
 
No, täältä ei näköjään apuja löytynyt. Nyt nuo pulssiohjaukset ja tilatiedot ovat vähän hölmösti erikseen HomeAssistantissa mutta kyllä tuollakin tyylillä nyt pärjää. Pääasia kuitenkin että sai valot automaation piiriin ja Node-Redillä saa kyllä kikkailtua noiden erillisten päälläolotiedon ja ohjauksen kanssa.

Pistänpä tähän nyt tuon espin yaml-fileen sisällön (otin alkuosan pois missä on wifi-verkkojen määrittelyt ja itse espin tyyppi jne). Vielä pitäisi nimetä nuo järkevämmin ja vaihtaa noiden järjestys käänteiseksi, jossain välissä mulla on nuo 4 ohjausta ristissä mutta totesin että on helpompi softalla kääntää kuin lähteä aavistuksen hankalasta paikasta vaihelemaan piuhoja ristiin.

Lisäksi on kuva tuosta mun piirilevystä minkä jostain jämäpalasta tein tuohon olemassaolevaan valo-ohjaushässäkkään. Printillä siis vain ruuvirimat, itse ESP32 ja ULN2803 releohjausten välissä.
Koodi:
# Lamput ja niiden tilat
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO32
      mode: INPUT_PULLUP
      inverted: True
    name: "Valo 1"
    id: valo_tila1
    device_class: light
    filters:
      - delayed_on_off: 100ms
  - platform: gpio
    pin:
      number: GPIO33
      mode: INPUT_PULLUP
      inverted: True
    name: "Valo 2"
    id: valo_tila2
    device_class: light
    filters:
      - delayed_on_off: 100ms
  - platform: gpio
    pin:
      number: GPIO25
      mode: INPUT_PULLUP
      inverted: True
    name: "Valo 3"
    id: valo_tila3
    device_class: light
    filters:
      - delayed_on_off: 100ms
  - platform: gpio
    pin:
      number: GPIO26
      mode: INPUT_PULLUP
      inverted: True
    name: "Valo 4"
    id: valo_tila4
    device_class: light
    filters:
      - delayed_on_off: 100ms

switch:
  - platform: gpio
    pin: GPIO27
    id: valo_ohj1
    inverted: False
  - platform: template
    name: "Valo-ohjaus 1"
    turn_on_action:
    - switch.turn_on: valo_ohj1
    - delay: 300ms
    - switch.turn_off: valo_ohj1

  - platform: gpio
    pin: GPIO14
    id: valo_ohj2
    inverted: False
  - platform: template
    name: "Valo-ohjaus 2"
    turn_on_action:
    - switch.turn_on: valo_ohj2
    - delay: 300ms
    - switch.turn_off: valo_ohj2

  - platform: gpio
    pin: GPIO12
    id: valo_ohj3
    inverted: False
  - platform: template
    name: "Valo-ohjaus 3"
    turn_on_action:
    - switch.turn_on: valo_ohj3
    - delay: 300ms
    - switch.turn_off: valo_ohj3

  - platform: gpio
    pin: GPIO13
    id: valo_ohj4
    inverted: False
  - platform: template
    name: "Valo-ohjaus 4"
    turn_on_action:
    - switch.turn_on: valo_ohj4
    - delay: 300ms
    - switch.turn_off: valo_ohj4
esp32_piirilevy.png

edit:
Sain nyt valot nimettyä ja oikeaan järjestykseen softasta vaihtamalla, oli näköjään tuossa mun kytkennässä aivopieru ja tuli ajateltua "peilikuvana" joten tulot ja lähdöt olivat käänteisessä järjestyksessä. No big deal.

Lisäilin vähän toimintoja kun ESPissä oli tilaa jäljellä eli laitoin webbiserverin päälle ja laitoin sen lähettämään wifin tiedot HomeAssistantiin ja REST APIn kautta valvontajärjestelmään (Zabbix). Mulla on kaksi eri wifi-verkkoa johon IoT-laitteet saavat liittyä ja nyt tuo ESP kertoo kummassa verkossa on ja wifin signaalivoimakkuuden. Nuo tiedot menevät Zabbixin kantaan ja Grafana taas piirtelee signaalinvoimakkuudesta graafia.
Koodi:
# HTTP WWW server and REST API
web_server:
  port: 80
 
# Wifi information
sensor:
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s

text_sensor:
  - platform: wifi_info
    ip_address:
      name: ESP IP Address
    ssid:
      name: ESP Connected SSID
    bssid:
      name: ESP Connected BSSID
    mac_address:
      name: ESP Mac Wifi Address

# ESPHome version
  - platform: version
    name: "ESPHome Version"
    hide_timestamp: True
 
Viimeksi muokattu:
Laita nuo tilatiedon binary sensorit internal sensoreiksi siten etteivät ne näy HA: n frontendille. Poista niiltä siis name mutta jätä id. Sitten päivitä noiden frontendille näkyvien template switchien tilatieto kun binary sensorin tila muuttuu kuten tässä dokkareista otetussa esimerkissä:

YAML:
binary_sensor:
  - platform: gpio
    # ...
    on_state:
      then:
        - switch.turn_off: relay_1

Triggerit pitää olla on_press ja on_release että saat on ja off tilat. on_state kertoo vain että tila muuttui, ei miksi tilaksi se muuttui.

Tässä tietysti korvaat tuon switch.turn_offin switch.template.publishilla jotta se päivittää tilaa eikä yritä sammuttaa sitä. Tässä esimerkkiä:

YAML:
# Example configuration entry
switch:
  - platform: template
    name: "Template Switch"
    id: template_swi

# in some trigger
on_...:
  - switch.template.publish:
      id: template_swi
      state: ON

  # Templated
  - switch.template.publish:
      id: template_swi
      state: !lambda 'return true;'

Silloin HA:ssa näkyvän (template)switchin pitäisi toimia
 
Viimeksi muokattu:
Kiitoksia, pitääpä huomenissa kokeilla. Luulisin ainakin ymmärtäneeni suunnilleen tuon toimintaperiaatteen, kattoo kuin käy... Onneksi ei noihin kyseisen ESPin asioihin ole vielä kerinnyt automatioita sun muuta tekemään niin on vielä helppo muutella. Juuri sopivasti alkaa huomisen työpäivän jälkeen parin päivän minitalviloma niin on aikaa nysvätä.
 
Teoriassa tuon pitäisi olla niinkin yksinkertaista että vaihdat kaikki nuo binary sensorit tällaisiksi:

YAML:
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO32
      mode: INPUT_PULLUP
      inverted: True
    #name: "Valo 1" tämä pois niin ei näy HA:ssa
    id: valo_tila1
    #device_class: light tämä turha koska ei näy HA:ssa
    filters:
      - delayed_on_off: 100ms
    on_release:
      - switch.template.publish:
        id: template_switch_1
        state: OFF
    on_press:
      - switch.template.publish:
        id: template_switch_1
        state: ON
    #tai miten päin nämä tilat onkaan
Kaikki templatet tällaisiksi (itse gpio switchit saa olla kuten ovat):
YAML:
switch:
  - platform: gpio
    pin: GPIO27
    id: valo_ohj1
    inverted: False
  - platform: template
    name: "Valo-ohjaus 1"
    #Lisää id johon binary sensor viittaa
    id: template_switch_1
    #Riittääkö pelkkä turn_on_action vai osaako myös sammuttaa valon?
    turn_on_action:
    - switch.turn_on: valo_ohj1
    - delay: 300ms
    - switch.turn_off: valo_ohj1
HA:ssa nämä näkyvät nyt switcheinä eikä valoina kuten todennäköisesti haluat, joten joudut muuttamaan ne siellä valoiksi. Ellei sitten tuo template switch-komponentti hyväksy device_class: light:ia. Dokkareissa ei mainintaa.
 
Kiitoksia! Noilla vinkeillä sain nuo valot ja niiden kytkimet haluamakseni.

Tuossa esimerkissä oli sisennysvirhe tuossa switch.template.publish -rivin jälkeen, seuraavat rivit (id ja state) pitää olla sisennetty pykälän pidemmälle. Ja tosiaan kun aikaisemmin tuo oma turaukseni vain käytti kytkintä on-asennossa, ei tarvinnut olla noissa template-switcheissä turn_off_actionia mutta nyt kun kytkin toimii oikein niin nyt tarvitsee.

Noista esimerkeistä kyllä oppi taas todella paljon, jotenkin tuo homma ei avautunut ollenkaan kun ESPHomen sivuilta dokumentaatiota tavasi useampaankin kertaan.
 
Kiitoksia! Noilla vinkeillä sain nuo valot ja niiden kytkimet haluamakseni.

Tuossa esimerkissä oli sisennysvirhe tuossa switch.template.publish -rivin jälkeen, seuraavat rivit (id ja state) pitää olla sisennetty pykälän pidemmälle. Ja tosiaan kun aikaisemmin tuo oma turaukseni vain käytti kytkintä on-asennossa, ei tarvinnut olla noissa template-switcheissä turn_off_actionia mutta nyt kun kytkin toimii oikein niin nyt tarvitsee.

Noista esimerkeistä kyllä oppi taas todella paljon, jotenkin tuo homma ei avautunut ollenkaan kun ESPHomen sivuilta dokumentaatiota tavasi useampaankin kertaan.
Nojoo, ulkomuistista selaimeen YAML:ia, jonka suuri fani en ole -> yksi sisennysvirhe on aika hyvin ;) Hyvä että toimii.

Tuo ESPHome ei tosiaan ole kaikkein intuitiivisin koodata mutta sillä pystyy tekemään juttuja jotka olisivat hyvin hankalia tai mahdottomia tehdä ESPEasylla tai Tasmotalla. Tosin en ole niitä pitkään aikaan testannut joten niissäkin on varmasti kehitys kehittynyt. ESPHomen vahvuus on tuo lähes pomminvarma integraatio HomeAssistantiin jolloin ei tarvitse turata MQTT:n kanssa jolla tietysti on omat vahvuutensa.
 
Juu, minäkään en mikään YAML-fani ole, siinä on muutamia ärsyttäviä ominaisuuksia mutta tosiaan kun tuo ESPHome integroituu niin kivasti HomeAssistantiin niin vaikuttaa kohtalaisen helpolta ratkaisulta. Pitäisi varmaan taas palautella C++:aakin vähän mieleen kun sillä näyttäisi saavan tehtyä kaikenlaisia custom-juttuja ESPHomeen. Taitaa olla jo liki 10v kun sitäkin tuli viimeksi koodattua.

Muutenkin HomeAssistant ja ESPHome on suoranaista juhlaa siihen verrattuna kun aiempi kotiautomaatio oli täysin itse koodattu ja se alkoi käydä aika raskaaksi yksin ylläpitää.
 
Onkos joku viritellyt LDR-vastuksia valoisuuden mittaukseen ESP32:lla? Itse ajattelin mitata muunmuassa parvekkeelle näkyvää valoisuutta jonka perusteella voisi tehdä valaistusohjauksia, mahdollisesti myös jossain vaiheessa voisi sisätiloissakin muutamia valoisuuksia mitata muutamaan juttuun. Mietin vaan että noilla LDR:illä tuo resistanssialue on kovin suuri, eli mittasin laatikosta löytyneitä yksilöitä ja pimeässä resistanssi on jotain 4Mohm luokkaa ja kirkkaimmassa valaistuksessa mitä sain aikaiseksi oli jotain 2kohm luokkaa. Mietin vaan kuinka häiriöherkkiä tuollaiset ovat jos on vähänkään enemmän piuhaa ESP:n ja anturin välillä ja tarvitseeko tuota esim shuntata jotenkin. En ole vielä testikonfiguraatiota kerinnyt tekemään mutta jotain tämäntapaista ajattelin:
Koodi:
sensor:
  - platform: resistance
    sensor: source_sensor
    configuration: UPSTREAM
    resistor: 82.0kOhm
    name: Valoisuusanturi
  - platform: adc
    id: source_sensor
    pin: GPIO26
Tuo 82kOhm vähän epäilyttää, onko tuo järkevä arvo vai pitäisikö tuota jotenkin saada pienemmäksi. Tuo on siis arvioitu ihan excelöimällä eri vastusarvoilla ja valoisuusarvoilla ja kokeilemalla millaisella vastusarvolla käppyrä alkoi näyttää edes suunnilleen järkevältä. Mitään hurjan tarkkaa ei ole tarkoitus saada kuitenkaan ainakaan toistaiseksi aikaiseksi, kunhan nyt erottaisi täysin pimeän, hämärän, normaalin valaistustason ja erityisen kirkkaan valon erikseen. Ehkä mä olen vaan ylivarovainen kun en ole tottunut että mittauspiirin vastusarvot lähestyy 100kOhm.
 
Itse itselleni vastaten, niinkuin epäilinkin tuo ei toimi kunnolla suoraan noin että LDR on plusan puolella ja 82k vastus miinuksen puolella. On epävakaa, antaa välillä arvoksi NaN, välillä miinusmerkkisiä ohmeja sun muuta. Ja tuo hatusta ravistettu GPIO26 ei ollutkaan ADC-pinni joten se taisi vaihtua GPIO32:n.

Nyt olen muutaman päivän experimentoinut eri vastusarvojen kanssa (LDR:n rinnalla vastus ja tuon toisen vastuksen arvoja muutellut). Tällä hetkellä taitaa olla 33k LDR:n rinnalla ja 10k alapuolella ja alkaa vaikuttaa jo kohtalaiselta mutta vaikuttaisi että ainakin LDR:n rinnalla olevaa vastusta pitää vielä kasvattaa ja muutenkin vähän hienosäätää tuota. Pitää taas vähän excelöidä noita arvoja ja katsoa jos löytäisi seuraavat kokeiltavat arvot. Tällä hetkellä siis vastusarvo kyllä säätyy kivasti valoisuuden mukaan mutta oleellisin säätöalue osuu käyrän loivaan kohtaan aika pahasti joten vastusalue osuu 29kohm - 34kohm välille joten suurikin valaistuksen muutos muuttaa arvoa vain vähän.

Ongelmahan tässä on että ESP32:n ADC tuntuu muuttuvan varsin epävakaaksi kun vastusarvot nousevat kovin suuriksi ja kun tuo LDR on megaohmeja pimeässä päässä ja ehkä pari kiloa kirkkaassa. Lisäksi kun tuo LDR ei ole lineaarinen niin pitää koittaa saada normaalivalaistuksen (yö, ei valoja, vain ikkunasta tuleva valo <-> päivä, mahdollisesti lamppuja ja auringonvalo) alue toimimaan parhaiten että saa riittävästi tresholdia tuohon.
 
Ongelmahan tässä on että ESP32:n ADC tuntuu muuttuvan varsin epävakaaksi kun vastusarvot nousevat kovin suuriksi ja kun tuo LDR on megaohmeja pimeässä päässä ja ehkä pari kiloa kirkkaassa. Lisäksi kun tuo LDR ei ole lineaarinen niin pitää koittaa saada normaalivalaistuksen (yö, ei valoja, vain ikkunasta tuleva valo <-> päivä, mahdollisesti lamppuja ja auringonvalo) alue toimimaan parhaiten että saa riittävästi tresholdia tuohon.
Auttaako asiaa, jos käytät LDR:n sijasta LED:iä? Esimerkki
 
Auttaako asiaa, jos käytät LDR:n sijasta LED:iä? Esimerkki
Tuo varmaan vaatisi oparia tuon ESP:n kanssa kaveriksi ja oli vähän ideana minimoida komponentit ja muu turaaminen ja virittely. Tuon LDR:n saisin kyllä jollain oparilla kivasti sopivalle säätöalueelle mutta tällä kerralla ajattelin selvitä ihan parilla vastuksella.

Tällä hetkellä on varmaan viides variaatio menossa pelkillä vastuksilla tehtävästä jännitejaosta ja nyt vaikuttaisi arvot aika järkeviltä. Nyt LDR:n arvoista pystyy helposti päättelemään koska on yö tai päivä ja vähän eri valaistusolosuhteitakin. Itseasiassa tällä hetkellä taitaa olla käytössä 33k LDR:n rinnalla ja alapuolen jännitejakovastus taitaa olla joku 18k tai 22k joilla on tähän mennessä tullut paras lopputulos.

Aluksi mulla oli suunnittelu/mitoitusexcelissä kaavassa virhe joka ajoi vähän hakoteille noiden arvojen arvonnassa mutta nyt on sekin korjattu :D

Pitää varmaan joku päivä tehdä tuosta kytkennästä vähän koekytkentälevyä tukevampi tekele ja sijoittaa LDR suunnilleen siihen paikkaan mihin ajattelin ja testata vielä kertaalleen muutama päivä että tuo toimii riittävän hyvin. Kämpässä "terrorisoivien" kissojen takia kun ei viitsi koko koekytkentäalustaa pistää loppusijoituspaikkaan kun rontit rupeaisivat kuitenkin leikkimään sillä...
 

Statistiikka

Viestiketjuista
258 669
Viestejä
4 495 554
Jäsenet
74 270
Uusin jäsen
Jautio

Hinta.fi

Back
Ylös Bottom