Motivace
Homeassistant nedávno odstranil z core některé integrace zařízení připojených přímo na GPIO piny. Zprovoznění relé a teplotních čidel připojených na GPIO mi tak zabralo nějaký čas, třeba se někomu bude hodit tento návod.
Návod má 2 části.
V první je návod na integraci switchů / binárních senzorů pomocí remote-gpio. V mém případě jde o led a relé, ale obecně lze použít pro jakýkoliv spínač (switch) spínaný GPIO pinem v output módu. Stejným způsobem by také mělo být možné integrovat vstupní binární senzor (tedy stav GPIO pinu). Využívá se hass.io integrace remote_rpi_gpio.
V druhé části je návod na integraci teplotních čidel DS18B20 na one-wire busu na GPIO4 s pomocí owfs. Využívá se hass.io integrace 1-wire.
Během testování jsem zjistil, že integrace do hass.io funguje i pokud jsou senzory fyzicky připojeny k jinému Raspberry Pi, než na kterém běží Homeassistant. Jelikož jsem měl doma staré nevyužité Raspberry Pi 2B, bude moje finální konfigurace asi taková, že senzory a relé připojím k tomuto starému RPi2B a do Homeassistantu, který běží na Raspberry pi 3 se bude přenášet po síti (kdyby se něco hodně pokazilo, spálí se levnější RPi2B). Nicméně návod a funkčnost jsem ověřoval také při připojení senzorů a relé přímo na RPi3, na kterém běží homeasistant a rozdíl v integraci je jen v zadání IP při vzdáleném přístupu nebo localhost (127.0.0.1) pokud je na stejném RPi.
Mám RPi3 B+ s nainstalovaným 64bit Raspberry Pi OS Lite založeným na Debian 12 bookworm.
hostnamectl ... Operating System: Debian GNU/Linux 12 (bookworm) Kernel: Linux 6.1.0-rpi7-rpi-v8 Architecture: arm64
HA mám nainstalován a spuštěn přes docker
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9c5bede3cd5 ghcr.io/home-assistant/home-assistant:stable "/init" 5 days ago Up 5 days homeassistant
Na vzdáleném RPi2B mám 32bit Raspberry Pi OS Lite založeným na Debian 12 bookworm
Switche (LED Diody / relé) a binární senzory
Již dříve jsem povolil přes raspi config (sudo raspi-config) remote GPIO v sekci Interface.
Vycházím z návodu zde. Používá pigpiod – něco viz. zde.
Daemon pigpiod
U mne byl daemon vypnutý a zakázaný.
sudo systemctl status pigpiod ○ pigpiod.service - Daemon required to control GPIO pins via pigpio Loaded: loaded (/lib/systemd/system/pigpiod.service; disabled; preset: enabled) Drop-In: /etc/systemd/system/pigpiod.service.d └─public.conf Active: inactive (dead)
Povolil jsem samospouštění a nastartoval ho.
sudo systemctl enable pigpiod sudo systemctl start pigpiod sudo systemctl status pigpiod pigpiod.service - Daemon required to control GPIO pins via pigpio Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled; preset: enabled) Drop-In: /etc/systemd/system/pigpiod.service.d └─public.conf Active: active (running) since Sat 2024-01-06 10:40:46 CET; 7s ago Process: 56974 ExecStart=/usr/bin/pigpiod (code=exited, status=0/SUCCESS) Main PID: 56975 (pigpiod) Tasks: 4 (limit: 765) CPU: 704ms CGroup: /system.slice/pigpiod.service └─56975 /usr/bin/pigpiod
Lokální test LED přes python
Něco k python interfacu také zde. Také něco k GPIO Zero.
Nejprve nainstalujeme – pokud ještě nemáme.
sudo apt install python3-gpiozero python3-pigpio
Zapojíme LED na GPIO pin 17
Test 1
Vytvoříme soubor led1.py a do něj vložíme kód
from gpiozero import LED from time import sleep red = LED(17) while True: red.on() sleep(1) red.off() sleep(1)
a spustíme
PIGPIO_ADDR=127.0.0.1 python3 led1.py
Test 2
To samé s využitím PiGPIOFactory.
Vytvoříme soubor led2.py a do něj vložíme kód
from gpiozero import LED from gpiozero.pins.pigpio import PiGPIOFactory from time import sleep factory_local = PiGPIOFactory(host='127.0.0.1') #factory_Pi2B = PiGPIOFactory(host='192.168.1.4') led_1 = LED(17, pin_factory=factory_local) #led_2 = LED(17, pin_factory=factory_Pi2B) while True: led_1.on() # led_2.off() sleep(1) led_1.off() # led_2.on() sleep(1)
a spustíme
GPIOZERO_PIN_FACTORY=pigpio python3 led2.py
V obou případech blikám – hurá.
Lokální test relé
De fakto stejné jako LED jen jiný pin.
Zapojení mám následující:
TODO
A program:
# TEST Relay on GPIO PIN 22 - possible to use more RPIs at same time # run: # GPIOZERO_PIN_FACTORY=pigpio python3 /mnt/samba/finn/relay1.py from gpiozero import OutputDevice from gpiozero.pins.pigpio import PiGPIOFactory from time import sleep factory_local = PiGPIOFactory(host='127.0.0.1') #factory_Pi2B = PiGPIOFactory(host='192.168.1.4') relay_local = OutputDevice(22, pin_factory=factory_local, active_high=False, initial_value=False) #relay_Pi2B = OutputDevice(22, pin_factory=factory_Pi2B, active_high=False, initial_value=False) while True: relay_local.on() # switch on print("Relay is now " + ("on" if relay_local.value else "off")) # see if on or off sleep(1) relay_local.off() # switch off print("Relay is now " + ("on" if relay_local.value else "off")) # see if on or off sleep(1)
Relé se přepíná.
Integrace LED a relé do hass.io pomocí remote_rpi_gpio
Jedu podle návodu zde.
Environment variables v containeru
V návodu se píš, že pokud běží Homeassistant ve virtualizovaném prostředí (docker) možná bude třeba nastavit následující ENV proměnné. (Note that for virtual environments, you may need to set an environment variable when starting the environment to set the pin factory, for example: Environment = GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=YOUR_RPi_IP_ADDRESS).
Kontrola ENV proměnných v dockeru
docker exec homeassistant env
vidíme, že v seznamu nejsou – je třeba upravit command spouštění / update containeru.
docker stop homeassistant docker rm homeassistant
A nainstalujeme / nastartujeme znovu s nastavením ENV proměnných.
docker run -d --name homeassistant --privileged --restart=unless-stopped -e TZ=Europe/Prague -e GPIOZERO_PIN_FACTORY=pigpio -e PIGPIO_ADDR=127.0.0.1 -v ~/homeass:/config --network=host ghcr.io/home-assistant/home-assistant:stable
Úprava konfigurace
Pro remote_rpi_gpio není k dispozici možnost přidat vizuálně pomocí add integration, je třeba upravit configuration.yaml
sudo mcedit ~/homeass/configuration.yaml
a na konec soboru (za „scene: !include scenes.yaml“) jsem přidal následující:
switch: - platform: remote_rpi_gpio host: 127.0.0.1 ports: 17: Test Led on GPIO BCM 17 invert_logic: false - platform: remote_rpi_gpio host: 127.0.0.1 ports: 22: Test Relay on GPIO BCM 22 invert_logic: true
TODO – Nevím ještě jak přesně ten konfigurák funguje, toto je varianta, kdy se mi alespoň povedlo zajistit, že fungují obě tlačítka a každé má jinou logiku LED je HIGH = ON a relé je LOW = ON (parametr invert_logic).
Zkoušel jsem reload configuration, ale bez efektu, je tedy asi nutno po úpravě souboru restartovat.
Developer tools -> Check and restart -> Check configuration a pokud je OK tak poté „RESTART“
Po restartu se mi na „Overview“ objevilo toto
Kliknutím na „blesk“ vedle popisu vypnu či zapnu LEDku nebo relé.
Kliknutím na posuvník vedle „Switch“ přepnu obě najednou.
Do Logbooku se mi akce zapisuje podle toho na co jsem klikl.
Integrace switche vzdáleném počítači (RPi2B)
je obdobné jako u lokálního – tedy upravit configuration.yaml
sudo mcedit ~/homeass/configuration.yaml
a na konec soboru (za „scene: !include scenes.yaml“) jsem přidal následující – místo X.X.X.X bude IP remote mašiny:
switch: - platform: remote_rpi_gpio host: X.X.X.X ports: 23: Relay Radiators 1st floor invert_logic: false - platform: remote_rpi_gpio host: X.X.X.X ports: 24: Relay Water heater invert_logic: true
Poznámka: switch: musí být v konfiguráku asi jen jednou – nebo se mi alespoň chovalo divně pokud jsem tam dal víckrát. Ale za jeden switch: je možno kombinovat lokální i remote prvky.
Senzory teploty (DS18B20) na 1-wire busu
Zapojení:
TODO
Lokální test DS18B20
Jelikož je problematika 1-wire a jeho připojení k RPi poměrně složitá, přesunul jsem do separátního příspěvku.
Zde předpokládám připojení DS18B20 senzoru přímo k GPIO Raspberry Pi (GPIO4).
Mám v /boot/firmware/config.txt povoleno 1-wire (dtoverlay=w1-gpio,gpiopin=4).
S pomocí modulů w1-gpio a w1-term
Tato metoda je pro ověření funkčnosti zapojení, takto ale nebude fungovat v Homeassistant (podpora z hasss.io odstraněn a v 2022 a nyní již jen jako externí integrace, ale já jsem to netestoval).
V shellu
Pokud je povoleno v raspi-config , tak deamon na pozadí opakovaně načítá všechny připojené DS18B20 a pro každý senzor vytváří v /sys/bus/w1/devices/ adresář začínající „28-“ a do souboru w1_slave v něm ukládá načtená data. Stačí tedy vypsat tento soubor. u mně je adresář pojmenován 28-0300a279712e. To číslo za 28- je id daného DS18B20 (každý senzor má jiné aby bylo možno používat najednou a poznat, který je který).
t=18625 ve výpisu souboru znamená že je teplota 18,625 stupně celsia
cd /sys/bus/w1/devices/ ls -l total 0 lrwxrwxrwx 1 root root 0 Feb 2 19:10 28-0300a279712e -> ../../../devices/w1_bus_master1/28-0300a279712e lrwxrwxrwx 1 root root 0 Feb 2 19:10 w1_bus_master1 -> ../../../devices/w1_bus_master1 cd 28-0300a279712e xxx@xxxxxx:/sys/bus/w1/devices/28-0300a279712e $ cat w1_slave 2a 01 55 05 7f a5 a5 66 76 : crc=76 YES 2a 01 55 05 7f a5 a5 66 76 t=18625
Přes owfs
Podrobnější popis owfs instalace a zdrojů pro troubleshooting viz. tento příspěvek, kapitola owfs.
Instalace owfs
sudo apt-get install owfs
Nastavení owfs
Nastavení je v /etc/owfs.conf.
V konfiguraci je defaultně odkomentovaný řádek „server: FAKE = DS18S20,DS2405“. to se hodí pro testování serveru, kdy pak emuluje tyto 2 senzory. Pokud tedy senzory nemáte, dá se takto otestovat a ukáží se i v homeassistantu.
My ale máme připojeno a ověřeno že funguje, takže jdeme editovat (default si pro jistotu odzálohujeme).
sudo cp /etc/owfs.conf /etc/owfs.conf.example sudo mcedit /etc/owfs.conf
Minimální funkční verze, pokud chceme jen owserver na localhostu (což pro homeassistant stačí) je následující.
# w1 bus directly on GPIO (GPIO4 default) server: w1 = all server: port = localhost:4304
Pokud potřebujeme k owserveru přistupovat vzdáleně (homeassistant je na jiném počítači než kde jsou připojeny senzory a kde běží owserver) tak je třeba na posledním řádku vynechat localhost, bude tedy:
# w1 bus directly on GPIO (GPIO4 default) server: w1 = all server: port = 4304
Pro podrobnější popis konfigurace viz. tento příspěvek, kapitola owfs.
Podle mých zkušeností se po editaci konfiguráku služby z owfs restartují, ale můžeme pro jistotu vynutit.
sudo systemctl restart owserver.service
a zkontrolujeme, že běží
sudo systemctl status owserver.service ● owserver.service - Backend server for 1-wire control Loaded: loaded (/lib/systemd/system/owserver.service; enabled; preset: enabled) Active: active (running) since Sat 2024-02-03 18:12:21 CET; 7s ago ...
Integrace senzorů teploty do hass.io pomocí owfs
Integrace 1-wire, jež využívá owfs server, je součástí Home assisatnt jádra – není potřeba nic instalovat.
Přidání z GUI:
Settings -> Devices & services. Vpravo dole Add integration, vybrat 1-Wire a zadat adresu a port owfs serveru (normálně localhost a 4303).
Po zadání, by se v Devices měl objevit senam nalezených čidel.
Update stavu při hraní si s owfs
Když jsem testoval a hrál si z konfigurací owfs tak update po restartu owfs v default dasboardu hass.io byl v řádu sekund a to i v případě, že byl owserver remote. Nebylo potřeba nic dělat. Když jsem server stopnul, změnila se teplota na Unknown, jakmile znovu naběhlo, změnilo se po pá sekundách zase na aktuální teplotu.
Reload – update seznamu čidel
Pokud čidlo není k dispozici při inicializaci 1wire integrace (během restartu nebo reloadu) tak se vedle čidla ukazuje Unavailable.
Pokud je čidlo připojeno, lze v nastaveních znovu načíst seznam čidel na daném pinu (drátu) bez resetu celého homeassistantu.
Settings -> Devices & Services -> 1wire
V sekci Hubs zvolit, se kterým 1 wire interfacem chceme pracovat a na tři tečky vedle „CONFIGURE“ a v menu zvolit Reload.
Po reloadu jsou čidla dostupná (pokud jsou korektně připojena).
Pokud se stav nezmění je možný reset celého homeassistantu a kontrola zda jsou vidět v /sys/bus/w1/devices/ – viz zde. Že by v /sys/bus/w1/devices/ záznamy byly, owfs server běžel, ale homeasistant je po reload neviděl, se mi nestalo.
Integrace do hass.io bez owfs
Našel jsem pokračovatele k odstraněné původní 1-wire integraci v homassistantu. Tato integrace nepoužívá owfs. Je to zde, ale jelikož jsem zprovoznil owfs, tak jsem nezkoušel.
TODO ????
ha-rpi_gpio
checknout integraci ha-rpi_gpio na GITu. jestli nepodporuje něco navíc oproti remote_rpi_gpio.
MQTT
https://www.home-assistant.io/integrations/switch.mqtt/