Homeassistant a GPIO na RPi3

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/

 

 

 

Zveřejnit odpověď

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*