IOTstack – základní instalace

IOTstack je zjednodušeně řečeno automatizované řešení, které nabízí zprovoznění spousty různých služeb naráz. Jeho nespornou výhodou je, že používá předpřipravené Docker kontejnery a tedy následná obnova je v řádu jednotek minut.

Obsahuje služby jako HomeBridge, Node-RED, Grafana, InfluxDB, deCONZ, Python a spoustu dalších, které jsou obvykle v rámci vlastního řešení smarthome využívané. A nyní již pojďme na konkrétní postup.

Základ návodu je převzat od Philla (Paraphrasera) a doplněný o několik detailů a zejména specifika dané potřebou fungování zejména deCONZ a Node-RED současně.

Pro úspěšnou instalaci se předpokládá, že již máte nainstalovaný Raspbian buď na SD kartě nebo ideálně na SSD disku. V případě používání deCONZ nutnost instalovat full verzi Raspbianu (kvůli GUI, respektive VNC)!

Také je potřeba mít aktivované SSH (stačí vytvořit prázdný soubor s názvem ssh v rootu karty, hned po vytváření image Raspbianu přes RPi Imager).


11.1.2022 – návod byl aktualizován, nicméně i přesto důrazně doporučuji využití řešení přes tzv. PiBuilder, které je nepoměrně rychlejší i komfortnější. Nicméně je třeba i následně pokračovat zde od kroku č. 6. Odkaz na PiBuilder:


Krok číslo 0 – nepovinné, ale doporučené

Aktualizace bootloaderu RPi dle následujícího návodu:
https://www.iotcz.cz/2021/03/06/navody/rpi-aktualizace-eeprom-bootloaderu-a-firmware/


Krok číslo 1

sudo apt update
sudo apt full-upgrade -y
sudo reboot

Krok číslo 2

Vyřešení problému se zamrzajícím RPi kvůli WiFi rozhraní. Popsáno zde: https://github.com/SensorsIot/IOTstack/issues/219

sudo bash -c "echo -e '\nallowinterfaces eth0,wlan0' >> /etc/dhcpcd.conf"
sudo systemctl daemon-reload
sudo systemctl restart dhcpcd
sudo reboot

Krok číslo 3 – instalace doporučených aplikací

sudo apt install -y acl curl dnsutils git iotop iperf jq mc mosquitto-clients nano nmap ruby sqlite3 subversion sysstat tcpdump uuid-runtime wget

Krok číslo 4 – instalace IOTstack

git clone -b master https://github.com/SensorsIot/IOTstack.git ~/IOTstack 
curl -fsSL https://get.docker.com | sh
sudo usermod -G docker -a $USER
sudo usermod -G bluetooth -a $USER
sudo apt install -y python3-pip python3-dev
sudo pip3 install -U docker-compose
sudo pip3 install -U ruamel.yaml==0.16.12 blessed

sudo reboot

Krok číslo 5

Pokud se jedná o obnovu již provozovaného IOTstack, tak nyní je přesně čas pro nakopírování zálohy a její rozbalení do složky /IOTstack/volumes/ a následované příkazy níže.

Pokud zálohu nemáte, pokračujte rovnou ve spuštění menu a vybrání volby Build Stack. V podmenu si vyberte, které služby chcete instalovat (mezerníkem) a pokračujte.

cd ~/IOTstack
./menu.sh

Osobně používám tyto služby (pro inspiraci):

  • Node-RED
  • HomeBridge (věci, které nejsou podporované v NR, můžete zkusit i zde)
  • Portainer-CE (správa služeb/kontejnerů na jednom místě)
  • Dozzle (logy ze všech služeb na jednom místě)
  • Grafana (vykreslování grafů z logovaných hodnot)
  • InfluxDB (nejvhodnější databáze pro logování IoT věcí)
  • deCONZ (pro ConBee II/RaspBee II)
  • TasmoAdmin (admistrace „tasmotizovaných“ věcí)
  • Eclipse-Mosquitto (MQTT broker)

Pokud jste si vybrali i Node-RED, tak vás ještě menu vyzve k vybrání předinstalovaných pluginů, ale zde doporučuji vše zrušit a pluginy si nainstalovat až v NodeREDu s použitím klasického Manage palette. Výhodou je, že pluginy potom budou přímo součástí zálohy.


Krok číslo 6 – oprava docker-compose.yml

Pokud jste si nainstalovali Node-RED a deCONZ (případně i plugin pro NR v HomeBridge), asi byste byli rádi provozovali tyto služby souběžně a tak, že spolu navzájem komunikují. Z tohoto důvodu je potřeba udělat menší úpravu (tzv. fix) vygenerované šablony.

Jedná se o soubor docker-compose.yml, který obsahuje kompletně vše, podle čeho se následně vytváří konfigurace pro spuštění stažených kontejnerů. Pro jeho editaci můžete využít například nainstalovaný mc (Midnight Commander, ale pozor, spouštěný jako sudo mc) a následné stisknutí klávesy F4 na daném souboru. Ti zdatnější využijí například přímo editor nano:

sudo nano ~/IOTstack/docker-compose.yml

V sekci nodered je třeba provést úpravu následovně – zakomentovat porty symbolem # a připsat network_mode: host a případně si doplnit časovou zónu, vše vyznačeno tučně v následujícím příkladu:

nodered:
  container_name: nodered
  build: ./services/nodered/.
  restart: unless-stopped
  user: "0"
  environment:
    - TZ=Europe/Prague
  network_mode: host
#  ports:
#    - "1880:1880"
  volumes:
    - ./volumes/nodered/data:/data
    - ./volumes/nodered/ssh:/root/.ssh
    - /var/run/docker.sock:/var/run/docker.sock
    - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
  devices:
    - "/dev/ttyAMA0:/dev/ttyAMA0"
    - "/dev/vcio:/dev/vcio"
    - "/dev/gpiomem:/dev/gpiomem"

Podobným způsobem je třeba upravit sekci deconz, kde je třeba přidat TZ (timezone – časovou zónu) na Europe/Prague:

deconz:
  image: deconzcommunity/deconz
  container_name: deconz
  restart: unless-stopped
  ports:
    - "8090:80"
    - "443:443"
    - "5901:5900"
  volumes:
    - ./volumes/deconz/:/opt/deCONZ
  devices:
    #ConBee II:
    - /dev/ttyACM0
  environment:
    - DECONZ_VNC_MODE=1
    - DECONZ_VNC_PASSWORD=changeme
    - DEBUG_INFO=1
    - DEBUG_APS=0
    - DEBUG_ZCL=0
    - DEBUG_ZDP=0
    - DEBUG_OTAU=0
    - TZ=Europe/Prague

Stejně tak je potřeba upravit sekci influxdb. Bohužel úplně nejnovější verze 2.x InfluxDB nepodporuje architekturu 32 bitové verze systému Raspbian na Raspberry Pi a proto je nutné používat stále verzi 1.8.x. Upravte tedy soubor tak, jak vidíte níže (změny vyznačeny opětovně tučně):

influxdb:
  container_name: influxdb
  image: "influxdb:1.8"
  restart: unless-stopped
  ports:
    - "8086:8086"
  environment:
    - TZ=Europe/Prague
    - INFLUXDB_HTTP_FLUX_ENABLED=false
    - INFLUXDB_REPORTING_DISABLED=false
    - INFLUXDB_HTTP_AUTH_ENABLED=false
    - INFLUX_USERNAME=nodered
    - INFLUX_PASSWORD=nodered
    - INFLUXDB_UDP_ENABLED=false
    - INFLUXDB_UDP_BIND_ADDRESS=0.0.0.0:8086
    - INFLUXDB_UDP_DATABASE=udp
  volumes:
    - ./volumes/influxdb/data:/var/lib/influxdb
    - ./backups/influxdb/db:/var/lib/influxdb/backup

Pozn. v případě, že chcete používat Dozzle a pokud používáte i jiné služby (typicky Oscam, tak musíte port 8889 změnit zde na třeba 9087):

dozzle:
  container_name: dozzle
  image: amir20/dozzle:latest
  restart: unless-stopped
  ports:
    - "9087:8080"
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

Obecně platí, že je potřeba si hlídat přiřazené porty různým službám, protože následně může dojít k jejich vzájemné kolizi. Jedná se o jeden ze základních problémů.


Krok číslo 7 – finální spuštění

docker-compose up -d

Po provedení tohoto příkazu dojde k samotnému sestavování všech služeb. Po dokončení budou již služby automaticky spuštěné a můžete přistupovat na jednotlivé porty (pro nodered například http://IP_vaseho_RPi:1880).


Krok číslo 8 – volitelné nastavení aliasů

Pro zjednodušené ovládání celého prostřední z CLI samotného SSH doporučuji nastavit aliasy:


Krok číslo 9 – nastavení zálohování

Velkou výhodou IOTstack je možnost zálohování všeho například na Dropbox. K tomuto tématu můžete pokračovat na další článek s návodem:


Zde chci pod čarou poděkovat Paraphraserovi, který je pro mne opravdu nekonečnou studnicí informací, podpory, návodů a postřehů, na základě kterých píši i tyto články a návody.

$ s myšlenky na „$ s“
  1. Building mosquitto
    Sending build context to Docker daemon  10.24kB
    Step 1/9 : FROM eclipse-mosquitto:latest
     ---> 24a85c54a50e
    Step 2/9 : RUN apk update && apk add --no-cache rsync tzdata
     ---> Running in 2780f0cd9288
    fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/armhf/APKINDEX.tar.gz
    fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/armhf/APKINDEX.tar.gz
    ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/main: temporary error (try again later)
    WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/main: No such file or directory
    ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/community: temporary error (try again later)
    WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/community: No such file or directory
    2 errors; 20 distinct packages available
    The command '/bin/sh -c apk update && apk add --no-cache rsync tzdata' returned a non-zero code: 2
    ERROR: Service 'mosquitto' failed to build : Build failed
    

    vyřešeno zde: https://github.com/gliderlabs/docker-alpine/issues/334#issuecomment-879368146

    1. Tohle ale neni problem pri instalaci, kdy uz je pritomna nova verze (sem tam je vhodne v adresari IOTstack spustit git pull a aktualizovat si cely projekt). Nicmene pokud se uz jedna o delsi dobu bezici Mosquitto, tak je vhodne jej od zakladu predelat, protoze muzou nastat problemy, ktere jsou popsany zde:
      https://github.com/SensorsIot/IOTstack/issues/331

      Je tedy vhodne zmigrovat na nove reseni, ktere jiz neni pres image, ale tzv. buildovane (rozdily popsane v jinem clanku zde na webu).

      V docker-compose.yml to tedy znamena toto:

       mosquitto:
        container_name: mosquitto
        build: ./.templates/mosquitto/.
        restart: unless-stopped
        environment:
         - TZ=Etc/UTC
        ports:
         - "1883:1883"
        volumes:
         - ./volumes/mosquitto/config:/mosquitto/config
         - ./volumes/mosquitto/data:/mosquitto/data
         - ./volumes/mosquitto/log:/mosquitto/log
         - ./volumes/mosquitto/pwfile:/mosquitto/pwfile
      

      Samozrejme si to chce overit vsechny cesty ve /volumes, ze odpovidaji novym a taky mit aktualni verzi skriptu z Githubu (pres prikaz git pull, aby byl pritomen i soubor Dockerfile v /.templates/mosquitto/ pro build).

  2. Aktualizován návod kvůli změně výchozího image u Deconz.

Napsat komentář: Martin Čert Zrušit odpověď na komentář