Bluetooth-laitteiden kantaman parantaminen käyttämällä EspHomea keskittimenä.

Osa kotiautomaationi laitteista toimii vain bluetoothilla ja niissä on ikävä kyllä huono kantama. Onneksi tähän löytyy nyt hyvä ratkaisu eli EspHome, joka asennetaan Esp32:een. Samalla korjaantui myös ongelma Airthings-komponentissa, joka vaati että yhteys laitteeseen on saatavilla silloin kun Home Assistant käynnistetään. EspHome kuuntelee siis bluetoothia ja lähettää tiedot eteenpäin wifin kautta MQTT-sanomina. EspHomella voi tehdä paljon muutakin, mutta nämä nyt toimivat vain bluetooth-keskittiminä.

Keittiössä olevaan Esp32:een asensin Xiaomin kasvimittarien komponentin, joka siis lukee kaikkia viittä kasvimittariani ja lähettää tiedot eteenpäin MQTTnä. Samoin siinä on Airthings-komponentti, joka lukee olohuoneen ja keittiön Airthings Wave Plus-laitteet ja siirtää tiedot eteenpäin. Näin Home Assistantin Rasp4b:n bluetoothilta sai aika paljon pois työkuormaa. Sen bluetooth kun ei ole kaikkein luotettavin. 

Uima-altaalla olevaan Esp32:en vastuulle tuli puolestaan makuuhuoneen Airthings Wave Plus sekä sisäpihan Weber iGrill.


EspHome-sovellusta tarvitsee sinänsä käyttää vain kun asetuksia muutetaan. Koska minulla on HA Core, piti EspHome asentaa manuaalisesti. Yksinkertaisimmin se onnistui käyttämällä dockeria. Siltikin piti kokeilla montaa eri versiota kunnes löytyi sellainen joka suostui käynnistymään Rasp4b:ssäni.

Tein hakemiston esphome ja sijoitin sinne tiedoston compose.yaml

version: '3'
services:
  esphome:
    container_name: esphome
    image: ghcr.io/esphome/esphome:2022.9.4
    volumes:
      - /home/pi/esphome/config:/config
      - /etc/localtime:/etc/localtime:ro
    restart: always
    privileged: true
    network_mode: host

Tämän jälkeen komento
docker compose up
käynnisti EspHomen ja pääsin sen portaaliin kiinni.

Esp32 usb:llä kiinni koneeseen ja varmuuden vuoksi poistin api:n käytön kommunikointimuotona ja vaihdon sen MQTT:ksi. Näin ajattelin että HAn ja EspHomen versioilla ei ole niin paljoa yhteensopivuusongelmia.

Xiaomin ja Airthingsin komponentit löytyivät ihan vakiona, mutta Weberin iGrill piti asentaa custom komponenttina. Tämän vuoksi lisäsin vielä config-hakemiston alle custom_components-hakemiston ja lisäsin Esp32:n konfigurointitiedostoon sen mukaan. 

external_components:
 - source:
      type: local
      path: custom_components

Kävin lataamassa iGrill-komponentista 1.2-version ja asensin components-hakemistossa olevat custom_components-hakemistoon.

Github.com/bendikwa/esphome-igrill

Komponentin kääntäminen ei vain onnistunut, koska ilmoitti että puuttui stoi-funktio. Tämä ratkesi kun lisäsin funktion itse tiedostoon igrill/igrill.cpp ja vaihdoin kaikkiin funktion kutsuihin oman namespaceni stoi -> my::stoi.

namespace my
{
    int stoi( const std::string& str, std::size_t* pos = 0, int base = 10 )
    {
        const char* begin = str.c_str() ;
        char* end = nullptr ;
        long value = std::strtol( begin, &end, base ) ;

        if( errno == ERANGE || value > std::numeric_limits<int>::max() )
            throw std::out_of_range( "stoi: out ofrange" ) ;

        if( end == str.c_str() )
            throw std::invalid_argument( "stoi: invalid argument" ) ;

        if(pos) *pos = end - begin ;

        return value ;
    }
}

Tämän jälkeen kääntäminen meni läpi ja myös iGrillin tiedot olivat luettavissa.

Comments