Domotica

De Raspberry Pi is een klein en veelzijdig computertje dat je kunt inzetten voor tal van taken. De minicomputer heeft een laag energieverbruik en is daardoor het ideale startpunt voor een eigen domoticasysteem waarmee je je huis bestuurt. Zo kan je via je pc, smartphone of tablet je verlichting aansturen, je huis op contact- en bewegingssensoren laat reageren en slimme scenario's voor je huis ontwikkelen.

De meeste domotica-controllers die in de handel verkrijgbaar zijn, kosten honderden euro's. En uiteindelijk is zo'n controller niet meer dan een minicomputer. Een Raspberry Pi is voldoende uitgerust om dezelfde taken uit te voeren.

De in de handel verkrijgbare domotica-controllers komen met software om je huis aan te sturen. Op de Raspberry Pi moet je die zelf nog installeren. Gelukkig bestaat er heel wat opensource domotica-software. Domoticz en Home Assistant behandelen we in de praktijkopdracht. Ook openHAB moet je bij je keuze zeker ook eens bekijken.

Met een browser surf je naar de domotica-controller software op jouw Raspberry Pi. Via deze webinterface stuur je de domotica-controller aan. Daarbij krijg je een overzicht van alle schakelaars, temperatuur- en vochtigheidssensoren, neerslag-, luchtdruk- en andere weersensoren, energiemeters, enz. De webinterface past zich automatisch aan je scherm aan; op mobiele apparaten krijg je een compactere weergave.

Toegang tot domotica-controllers van buiten het lokale netwerk is ook mogelijk, maar dan moet je wel eerst de beveiliging opkrikken. Gebruik gebruikersnamen en/of wachtwoorden om toegang tot de webinterface te krijgen. Gebruik versleutelde verbindingen zoals HTTPS, zodat wachtwoorden en gebruikersnamen niet leesbaar door de netwerkkabels lopen. Ook Tor netwerken zorgen voor een extra beveiligingslaag. Daarenboven moet je via een Dynamic DNS dienst zoals DuckDNS een internetnaam voor jouw netwerk instellen.

Domotica-controllers gebruiken lokalisatie-instellingen om de taal te bepalen, zonsopgang en -ondergang te berekenen. Handig om het gedrag van je schakelaars te configureren; denk aan een licht dat alleen 's nachts op een bewegingssensor reageert.

Je kunt ook waarschuwingen krijgen, bijvoorbeeld als je een raam laat openstaan wanneer je het huis verlaat. Notificaties krijg je via speciale apps op je smartphone of tablet of via een e-mail. Als je een draadloze temperatuursensor in je koelkast hebt staan, kan je een waarschuwing krijgen als de temperatuur te veel oploopt (je hebt bijvoorbeeld de koelkastdeur laten openstaan).

Je kunt schakelaars op basis van een tijdschema aansturen. Bijvoorbeeld na hoeveel tijd na zonsopgang of -ondergang of op welk tijdstip de schakelaar moet worden in- of uitgeschakeld. Je kunt daarbij weekdagen selecteren of een vaste datum. Ook kan je toeval aan het tijdstip toevoegen, wat handig is voor een realistische aanwezigheidssituatie als je inbrekers op afstand wilt houden.

Als je een aantal sensoren en schakelaars hebt geconfigureerd, toont de domotica-controller allerlei gegevens over je huis en ben je in staat om apparaten in je huis te besturen. Maar een echt domoticasysteem kan allerlei zaken automatisch besturen. Met het gebeurtenissensysteem van de domotica-controller configureer je eenvoudig allerlei complexe scenario's zonder dat je één letter programmeercode hoeft in te tikken. Stel dat je een lamp in de gang automatisch wilt laten aangaan als de voordeur opengaat, maar alleen als het donker is.

Maak een groep van diverse apparaten die je tegelijk wilt in- of uitschakelen met een timer, gebeurtenis of handmatig. Met een groep bedien je dus diverse schakelaars tegelijk als één schakelaar.

Wil je met één druk op de knop bepaalde apparaten inschakelen en andere uitschakelen, dan heb je een scène nodig. Elk apparaat die je aan een scène toevoegt, kan je een eigen opdracht geven (aan, uit, niveau van de dimmer). Een verschil met een groep is wel dat een scène niet kan worden in- of uitgeschakeld, je kunt deze alleen activeren.

Hardware

Om met domotica-apparaten te communiceren, heb je een transceiver nodig. Het voordeel van de Raspberry Pi is dat die diverse transceivers via USB of GPIO kan aansluiten om verschillende domoticaprotocollen te ondersteunen.

Z-Wave

Z-Wave ondersteun je op de Raspberry Pi met het RaZberry-dochterbordje op de GPIO-pinnen of met een usb-stick als de Aeotec Z-Stick Series 2 of raadpleeg de lijst met Z-Wave compatibele producten.

Voor je een Z-Wave apparaat kunt gebruiken, moet je het in je Z-Wave-netwerk opnemen (include). Bij het opnemen van een Z-Wave sensor in de domotica-controller heb je 20 seconden de tijd om de Z-Wave schakelaar in het Z-Wave netwerk op te nemen. De instructies daarvoor staan in de handleiding van het apparaat. Doorgaans heeft het toestel een klein knopje dat je moet indrukken. Is het opnemen gelukt, dan verschijnt het apparaat in de lijst met nodes. Indien dit niet het geval is, kijk je op de logpagina welke foutmelding je krijgt.

Controlled Comfort

Z-Wave is een tweewegssysteem: schakelaars geven feedback aan de controller over hun toestand (bijvoorbeeld aan of uit). Heb je dat niet nodig, dan is een systeem zoals COCO (Controlled Comfort, in Nederland KlikAanKlikUit of KAKU) een goedkopere oplossing. Dit stuur je op je Raspberry Pi aan met de RFX-trx433E USB 433.92 MHz Transceiver. Dat is een prijzig apparaatje, maar ondersteunt naast COCO allerlei protocollen die op 433,92 MHz werken, waaronder HomeEasy, X10 en ook allerlei sensoren van draadloze weerstations. De meerprijs voor de RFXCOM-transceiver ten opzichte van Z-Wave verdien je snel terug, doordat COCO-modules goedkoper zijn dan vergelijkbare Z-Wave-modules.

Insteon

Insteon is een volledig draadloos systeem dat communiceert via zowel RF (radio signalen) als het lichtnet. Binnen het systeem is elke module die gebruikt wordt tevens repeater, hierdoor wordt het bereik groter en de betrouwbaarheid groter. Dit principe wordt ook gebruikt door onder andere het Z-Wave protocol en wordt ook wel een "mesh netwerk" genoemd. Prijzen en producten kan je op deze webpagina terugvinden.

ZigBee

Zigbee is een open standaard voor draadloze verbindingen tussen apparaten op korte afstand. Het is bedoeld als aanvulling op Bluetooth en Wi-Fi. Het wordt gebruikt voor het doorsturen van sensorgegevens en voor het besturen van apparaten. Een Zigbee-verbinding is zeer robuust maar de bandbreedte en de transmissiesnelheid zijn in vergelijking met Bluetooth-, Wi-Fi- en andere draadloze verbindingen, gering. Zigbee is ontworpen voor toepassingen in de domotica, bijvoorbeeld om in een woning of een gebouw met minimale middelen op afstand de dimmers en de aan/uit-schakelaars van de verlichting te bedienen. Als transeiver gebruik je een USB-stick of een opsteekbordje. ZigBee producten kan je bij verschillende fabrikanten en winkels (bv. ROBBshop) vinden.

Thread

Ook Thread werkt zoals Z-Wave en ZigBee in een mesh-netwerk. Eigenlijk lijken alle drie deze smarthome protocollen veel op elkaar, maar werken ze net wat anders. Vooral bij Thread is duidelijk te zien dat er verschillen aanwezig zijn.

Z-Wave en Zigbee communiceren via hun eigen gecreëerde netwerken, maar Thread gebruikt een IP-netwerk. Hierdoor kunnen apparaten werkend via een Thread-verbinding gemakkelijker communiceren met wifi en mobiele netwerken.

Dit betekent dat het sneller en betrouwbaarder is in de communicatie tussen netwerken en je niet per se meer een speciale hub nodig hebt om je apparaten te verbinden met het internet. De Thread border router, die nodig is voor het verbinden met je wifi netwerk, is bijvoorbeeld al ingebouwd in de Apple HomePod en Apple TV 4K.

Thread laat al jouw apparaten rechtstreeks met elkaar praten. Ieder apparaat met Thread ingebouwd kan dus rechtstreeks communiceren met elkaar zonder dat hier een dienst of hub aan te pas hoeft te komen.

Op de Thread webpagina staat een lijst met Thread gecertificeerde apparaten.

Matter

Als reactie op de wirwar van domotica systemen, proberen verschillende gerenommeerde bedrijven samen een standaard te lanceren: Matter. Hoewel dit veel problemen zou oplossen, komt dit systeem maar niet van de grond. En dit ondanks de steun van verschillende grote fabrikanten die er maar niet in slagen producten op de markt te brengen die volledig met Matter bedient kunnen worden.

Open source systemen

Naast het commerciële Matter, bestaan er ook open source verbindingsstandaarden waarvoor wel producten op de markt zijn. Daar het open source standaarden zijn, kan elke fabrikant die dat wil het systeem in zijn producten opnemen.

MQTT

MQTT (Message Queuing Telemetry Transport) is een lichtgewicht netwerkprotocol dat berichten tussen apparaten transporteert. Het is gebaseerd op het "publiceer-abonneer" concept. Het protocol werkt meestal via TCP/IP, maar elk netwerkprotocol dat geordende, verliesvrije, bidirectionele verbindingen biedt, kan MQTT ondersteunen. Het is ontworpen voor verbindingen met externe locaties waar er beperkte middelen zijn en de behoefte aan snelheid beperkt is. Het protocol is een open OASIS-standaard en een ISO-aanbeveling (ISO/IEC 20922).

Tasmota

Tasmota is een open source besturingssysteem voor verschillende ESP-apparaten (sensors, schakelaars, lampen, enz.). Je kunt de Tasmota firmware zelf op compatibele apparaten zetten, wat niet altijd eenvoudig is, of apparaten kopen met Tasmota voorgeïnstalleerd (Tasmota Shop of Mediarath).

ESPHome

ESPHome is een alternatief voor Tasmota. Het wordt ontworpen en onderhouden door Home Assistant.

ESPEasy

ESP Easy is zoals Tasmota een gratis en open-source MCU-firmware voor het Internet of Things (IoT) en oorspronkelijk ontwikkeld door de LetsControlIt.com-gemeenschap (voorheen bekend als ESP8266.nu-gemeenschap). Het draait op ESP8266 Wi-Fi gebaseerde MCU (MicroController Unit) platforms voor IoT van Espressif Systems. De naam "ESP Easy" verwijst standaard naar de firmware en niet naar de hardware waarop het draait. Op een laag niveau werkt de ESP Easy firmware hetzelfde als de NodeMCU firmware en biedt ook een zeer eenvoudig besturingssysteem op de ESP8266. Het belangrijkste verschil tussen ESP Easy firmware en NodeMCU firmware is dat de eerste is ontworpen als een high-level toolbox die gewoon out-of-the-box werkt voor een vooraf gedefinieerde set van sensoren en actuatoren. Gebruikers sluiten eenvoudigweg aan en lezen/besturen via eenvoudige webverzoeken zonder zelf enige code te hoeven schrijven, inclusief firmware-upgrades met behulp van OTA-updates (Over The Air).

Lichtschakelaars

Om je verlichting aan of uit te schakelen bestaan er zowel voor Z-Wave als Controlled Comfort diverse oplossingen. Een lamp met stekker, zoals een staande lamp, sluit je aan op een stekkermodule die je in het stopcontact steekt. Voor je plafondverlichting gebruik je een inbouwmodule die je achter de wandschakelaar installeert of een module die je volledige wandschakelaar vervangt. Er bestaan ook schakelaars in de vorm van een fitting. Je draait die in een standaard E27-fitting, draait de lamp erin en je kunt de lamp daarna besturen. Al deze oplossingen bestaan in een eenvoudige aan/uit-versie of als dimmer. In het laatste geval moet je lamp dimbaar zijn.

Praktijk opdracht
  1. GPIO Pinout Eerst hebben we wat domotica apparaten nodig. Vroeger werden domotica apparaten via kabels met de centrale domotica-controller verbonden, maar dat was een heel karwei. Vandaag wordt meestal gekozen voor draadloze verbindingen met de domotica-controller, dit is minder goed te beveiligen, maar veel eenvoudiger te installeren. Om kennis te maken met domotica maken we deze zelf en sluiten we deze aan op de GPIO pennen van de Raspberry Pi.
    1. Schakel voor je begint de Raspberry Pi uit.
    2. Sluit de Pi Camera aan op de Raspberry Pi.
    3. We gebruiken een drukknop als sensor, prik deze op een experimenteerbord en sluit deze met draadverbindingen aan op een massa-pin (bijvoorbeeld pin 20) en GPIO8 (pen 24) van de Raspberry Pi. GPIO staat voor General Purpose Input/Output. Een extra condensator van bijvoorbeeld 0,1µF (niet verplicht) tussen de aansluitingen van de drukknop (zie afbeelding) zorgt voor het opvangen van storingen. Een interactieve (klik voor meer informatie) pinconfiguratie kan je vinden op pinout.xyz.
    4. LED aansluitingen We gebruiken een LED als uitvoer. Prik op het experimenteerbord een weerstand van 270 ohm met daaraan de anode van de LED. De kathode van de LED sluit je met een draadverbinding aan op een massa-pin (bijvoorbeeld pin 34) van de Raspberry Pi. Het losse uiteinde van de weerstand sluit je met een draadverbinding aan op GPIO12 (pin 32) van de Raspberry Pi. Als de uitgang GPIO12 hoog wordt (+3,3 volt) zal de LED oplichten. De weerstand beperkt de stroom door de LED, waardoor deze niet doorbrandt en kortsluiting veroorzaakt. Als de uitgang GPIO12 laag wordt (0 volt, dezelfde spanning als massa) loopt er geen stroom door de LED en dooft deze.
  2. Extra voor iedereen die wil werken met 1-Wire en I2C elektronica. De hier gebruikte onderdelen worden enkel als voorbeeld gebruikt, andere 1-Wire en I2C elektronica kan je op een gelijkaardige manier gebruiken. Raadpleeg echter steeds de handleidingen en/of datasheets.
    1. 1-Wire temperatuursensor DS18B20.
    2. I2C temperatuursensor MCP9808
      MCP9808
  3. Controleer nog een laatste keer de verbindingen en start de Raspberry Pi.
    1. Controleer of de Pi Camera werkt.
    2. Om de configuratie van de GPIO pennen weer te geven, gebruik je:
      pi@raspberrypi:~ $ pinctrl
       0: ip    pu | hi // ID_SDA/GPIO0 = input
       1: ip    pu | hi // ID_SCL/GPIO1 = input
       2: ip    pu | hi // SDA1/GPIO2 = input
       3: ip    pu | hi // SCL1/GPIO3 = input
       4: ip    pu | hi // GPIO_GCLK/GPIO4 = input
       5: ip    pu | hi // GPIO5 = input
       6: ip    pu | hi // GPIO6 = input
       7: ip    pu | hi // SPI_CE1_N/GPIO7 = input
       8: ip    pu | hi // SPI_CE0_N/GPIO8 = input
       9: ip    pd | lo // SPI_MISO/GPIO9 = input
      10: ip    pd | lo // SPI_MOSI/GPIO10 = input
      11: ip    pd | lo // SPI_SCLK/GPIO11 = input
      12: ip    pd | lo // GPIO12 = input
      13: ip    pd | lo // GPIO13 = input
      14: ip    pn | hi // TXD1/GPIO14 = input
      15: ip    pu | hi // RXD1/GPIO15 = input
      16: ip    pd | lo // GPIO16 = input
      17: ip    pd | lo // GPIO17 = input
      18: ip    pd | lo // GPIO18 = input
      19: ip    pd | lo // GPIO19 = input
      20: ip    pd | lo // GPIO20 = input
      21: ip    pd | lo // GPIO21 = input
      22: ip    pd | lo // GPIO22 = input
      23: ip    pd | lo // GPIO23 = input
      24: ip    pd | lo // GPIO24 = input
      25: ip    pd | lo // GPIO25 = input
      26: ip    pd | lo // GPIO26 = input
      27: ip    pd | lo // GPIO27 = input
      28: a5    pu | hi // RGMII_MDIO/GPIO28 = RGMII_MDIO
      29: a5    pd | lo // RGMIO_MDC/GPIO29 = RGMII_MDC
      30: a3    pu | lo // CTS0/GPIO30 = CTS0
      31: a3    pn | lo // RTS0/GPIO31 = RTS0
      32: a3    pn | hi // TXD0/GPIO32 = TXD0
      33: a3    pu | hi // RXD0/GPIO33 = RXD0
      34: a3    pn | hi // SD1_CLK/GPIO34 = SD1_CLK
      35: a3    pu | hi // SD1_CMD/GPIO35 = SD1_CMD
      36: a3    pu | hi // SD1_DATA0/GPIO36 = SD1_DAT0
      37: a3    pu | hi // SD1_DATA1/GPIO37 = SD1_DAT1
      38: a3    pu | hi // SD1_DATA2/GPIO38 = SD1_DAT2
      39: a3    pu | hi // SD1_DATA3/GPIO39 = SD1_DAT3
      40: a0    pn | lo // PWM0_MISO/GPIO40 = PWM1_0
      41: a0    pn | lo // PWM1_MOSI/GPIO41 = PWM1_1
      42: op -- pu | lo // STATUS_LED_G_CLK/GPIO42 = output
      43: ip    pu | hi // SPIFLASH_CE_N/GPIO43 = input
      44: a1    pu | hi // SDA0/GPIO44 = SDA0
      45: a1    pu | hi // SCL0/GPIO45 = SCL0
      46: ip    pu | lo // RGMII_RXCLK/GPIO46 = input
      47: ip    pu | lo // RGMII_RXCTL/GPIO47 = input
      48: ip    pd | lo // RGMII_RXD0/GPIO48 = input
      49: ip    pd | lo // RGMII_RXD1/GPIO49 = input
      50: ip    pd | lo // RGMII_RXD2/GPIO50 = input
      51: ip    pd | lo // RGMII_RXD3/GPIO51 = input
      52: ip    pd | lo // RGMII_TXCLK/GPIO52 = input
      53: ip    pd | lo // RGMII_TXCTL/GPIO53 = input
      Je merkt dat GPIO12 als ingang (input) staat geconfigureerd. De LED zal licht geven, als je de GPIO12 uitgang hoog (binair 1) maakt: Je maakt van GPIO12 een uitgang (op) met binaire waarde 1 (dh):
      pi@raspberrypi:~ $ pinctrl set 12 op dh
      Controleer dit.
    3. De LED doof je door de BCM 27 uitgang laag (dl) te maken:
      pi@raspberrypi:~ $ pinctrl set 12 op dl
    4. De werking van de drukknop kan je controleren met:
      pi@raspberrypi:~ $ pinctrl get 8
       8: ip    pu | hi // SPI_CE0_N/GPIO8 = input
      Druk nu op de drukknop terwijl je de volgende opdracht uitvoert:
      pi@raspberrypi:~ $ pinctrl get 8
       8: ip    pu | lo // SPI_CE0_N/GPIO8 = input
      Als de drukknop niet ingedrukt is, wordt hi weergegeven, met een ingedrukte knop wordt lo weergegeven.
    5. Als één van de domotica apparaten (Pi Camera, LED of drukknop) niet werkt, schakel je de Raspberry Py uit en controleer je de bedrading. M.a.w. zorg dat alles werkt voor je verder gaat.
    6. Een andere test is het script lichtschakelaar.sh:

      #!/bin/bash
      # Eerst definiëren we enkele functies
      # Functie waarmee je wacht tot de drukknop niet wordt ingedrukt:
      wait_for_release () {
        while :
        do
          pinctrl get grep -" hi "
          if $? -eq ]; then
            break
          fi
          sleep 1
        done
      }
      # Functie waarmee je wacht tot de drukknop wordt ingedrukt:
      wait_for_press () {
        while :
        do
          pinctrl get grep -" lo "
          if $? -eq ]; then
            break
          fi
          sleep 1
        done
      }
      # Hier begint ons programma
      # Oneindig lang gaat de LED bij het drukken op de drukknop oplichten 
      # Breek het programma af met Ctrl+c
      while :
      do
        wait_for_press
        pinctrl set 12 op dh
        wait_for_release
        pinctrl set 12 op dl
      done

      Voor je dit script kunt uitvoeren, moet je het uitvoerbaar maken met de opdracht:
      pi@raspberrypi:~ $ chmod +x lichtschakelaar.sh
      Als dit script uitgevoerd wordt, wat moet je dan doen om de LED te laten oplichten? .....
  4. Extra: 1-Wire en I2C gebruiken:
    Het Raspberry Pi OS bevat zeer veel stuurprogramma's (drivers), maar je moet ze wel activeren. Dit kan in het /boot/config.txt bestand.
    Python liefhebbers kunnen ook gebruik maken van Python stuurprogramma's, deze worden meestal geleverd door de leverancier. Bijvoorbeeld Adafruit voor DS18B20 en MCP9808.
    1. 1-Wire (DS18B20)
      1. Eerst activeren we 1-Wire door in de bootconfiguratie /boot/config.txt:
        pi@raspberrypi:~ $ sudo nano /boot/config.txt
      2. De volgende regel op het einde toe te voegen:
        dtoverlay=w1-gpio
      3. Daarna kunnen we de drivers activeren om onze temperatuursensor uit te lezen door in de stuurprogrammaconfiguratie /etc/modules:
        pi@raspberrypi:~ $ sudo nano /etc/modules
        De volgende twee regels met stuurprogramma's toe te voegen:
        w1-gpio
        w1-therm
      4. Herstart de Raspberry Pi om de aanpassingen te activeren.
      5. De temperatuur kan je nu uitlezen via het bestand /sys/bus/w1/devices/28-*/w1_slave met de opdracht:
        pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-*/w1_slave 
        28 01 55 05 7f a5 a5 66 f0 : crc=f0 YES
        28 01 55 05 7f a5 a5 66 f0 t=18500
        Het sterretje (*) in de mapnaam zorgt dat je alle mappen die beginnen met 28- bekijkt. Elke sensor heeft namelijk zijn eigen map (vb: /sys/bus/w1/devices/28-030297943884/w1_slave). Dit laat toe meerdere 1-Wire sensoren op dezelfde GPIO pin aan te sluiten.
        De temperatuur wordt in de tweede regel weergegeven (t=18500) wat overeenkomt met 18,500 °C (dus steeds met drie cijfers na de komma, die je zelf moet plaatsen). Of m.a.w. in m°C (milligraden Celsius).
    2. I2C (MCP9808)
      1. Eerst activeren we I2C en de driver door in de bootconfiguratie /boot/config.txt:
        pi@raspberrypi:~ $ sudo nano /boot/config.txt
        Voeg na deze regel
        #dtparam=i2c_arm=on
        De volgende twee regels toe:
        dtparam=i2c_arm=on
        dtoverlay=i2c-sensor,jc42
        De eerste regel activeert de I2C bus en de tweede regel het stuurprogramma voor de MCP9808.
      2. Herstart de Raspberry Pi om de aanpassingen te activeren.
      3. De temperatuur kan je nu uitlezen via het bestand /sys/bus/i2c/devices/1-0018/hwmon/hwmon3/temp1_input met de opdracht. De mappenstructuur kan iets afwijken naargelang het gebruikte MCP9808 bordje, de leverancier, enz.
        pi@raspberrypi:~ $ cat /sys/bus/i2c/devices/1-0018/hwmon/hwmon3/temp1_input 
        26125
        De temperatuur wordt opnieuw weergegeven (26125) in m°C, wat overeenkomt met 26,125 °C. De afwijking 26,125 (MCP9808 meting) ten opzichte van 18,500 °C (DS18B20 meting) is te wijten aan het feit dat de MCP9808 op een HAT-bord geplaatst werd, juist boven de Raspberry Pi die warmte afgeeft.
  5. Extra: Tasmota apparaat gebruiken:

    Wie de Tasmota firmware zelf op een compatibele sensor of schakelaar wil installeren kan de handleiding op de website van Tasmota vinden. Tasmota sensors en schakelaars werken via het WiFi netwerk en moet je dus koppelen (handleiding).

    1. Daarna bepaal je via jouw router wat het IP adres van het Tasmota apparaat is. Reserveer op de router dan meteen het IP adres voor dit Tasmota apparaat, waardoor het Tasmota apparaat steeds hetzelfde IP adres van de router krijgt.
    2. Surf met een browser met het HTTP protocol naar het gevonden IP adres (vb: http://192.168.129.40/). Op de weergeven webpagina kan je het Tasmota apparaat dan bedienen.
    3. Domotica controllers maken gebruik van MQTT of http URL's met opdrachten om het Tasmota apparaat te bedienen. Zo kan je de status van een Tasmota schakelaar opvragen met de opdracht:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.40/cm?cmnd=Power
      {"POWER":"OFF"}
      De schakelaar inschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.40/cm?cmnd=Power%20On
      {"POWER":"ON"}
      De schakelaar uitschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.40/cm?cmnd=Power%20Off
      {"POWER":"OFF"}
      De schakelaar omschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.40/cm?cmnd=Power%20Toggle
      {"POWER":"ON"}
      Zelfs het bijwerken van de Tasmota firmware zelf is mogelijk. Alle opdrachten kan je vinden op de webpagina Commands.
  6. Tijd om een domotica-controller te installeren. Home Assistant is een jong project, met een nogal eigenwijze manier van configureren. Daar tegenover staat een modern design met ongelooflijk veel mogelijkheden. Home Assistant is een open source Python programma, waaraan iedereen die dat wil eraan kan meewerken.
    1. Voor je de installatie start, ga je naar goede gewoonte het systeem upgraden.
    2. De installatiehandleiding voor de Raspberry Pi vind je op de webpagina van HomeAssistant. Wie de installatie niet zelf wenst uit te voeren, kan een kant en klaar image downloaden en op de micro-SD kaart zetten. Kant en klare images zijn zeer eenvoudig te gebruiken, maar hebben het nadeel dat ze minder flexibel zijn, minder eenvoudig te onderhouden zijn en je afhankelijk bent van de maker van het image. Om HomeAssistant manueel op de Raspberry Pi te installeren, installeer je de volgende pakketten die nodig zijn om HomeAssistant te bouwen (compileren) en te gebruiken:
      pi@raspberrypi:~ $ sudo apt install -y python3 python3-dev python3-venv python3-pip bluez libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libopenjp2-7 libtiff6 libturbojpeg0-dev tzdata ffmpeg liblapack3 liblapack-dev libatlas-base-dev
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar 
      python3 is reeds de nieuwste versie (3.11.2-1+b1).
      python3 staat ingesteld op handmatig geïnstalleerd.
      python3-dev is reeds de nieuwste versie (3.11.2-1+b1).
      python3-dev staat ingesteld op handmatig geïnstalleerd.
      python3-venv is reeds de nieuwste versie (3.11.2-1+b1).
      python3-venv staat ingesteld op handmatig geïnstalleerd.
      python3-pip is reeds de nieuwste versie (23.0.1+dfsg-1+rpt1).
      bluez is reeds de nieuwste versie (5.66-1+rpt1).
      bluez staat ingesteld op handmatig geïnstalleerd.
      zlib1g-dev is reeds de nieuwste versie (1:1.2.13.dfsg-1).
      zlib1g-dev staat ingesteld op handmatig geïnstalleerd.
      build-essential is reeds de nieuwste versie (12.9).
      libopenjp2-7 is reeds de nieuwste versie (2.5.0-2).
      libopenjp2-7 staat ingesteld op handmatig geïnstalleerd.
      libtiff6 is reeds de nieuwste versie (4.5.0-6+deb12u1).
      libtiff6 staat ingesteld op handmatig geïnstalleerd.
      tzdata is reeds de nieuwste versie (2023c-5+deb12u1).
      ffmpeg is reeds de nieuwste versie (8:5.1.4-0+rpt1+deb12u1).
      liblapack3 is reeds de nieuwste versie (3.11.0-2).
      liblapack3 staat ingesteld op handmatig geïnstalleerd.
      De volgende extra pakketten zullen geïnstalleerd worden:
        automake autotools-dev libatlas3-base libjpeg62-turbo-dev m4
      Voorgestelde pakketten:
        autoconf-archive gnu-standards autoconf-doc libtool gettext libatlas-doc liblapack-doc libssl-doc m4-doc
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
        autoconf automake autotools-dev libatlas-base-dev libatlas3-base libffi-dev libjpeg-dev libjpeg62-turbo-dev liblapack-dev
        libssl-dev libturbojpeg0-dev m4
      0 opgewaardeerd, 12 nieuw geïnstalleerd, 0 te verwijderen en 6 niet opgewaardeerd.
      Er moeten 12,7 MB aan archieven opgehaald worden.
      Na deze bewerking zal er 72,1 MB extra schijfruimte gebruikt worden.
      Ophalen:1 http://deb.debian.org/debian bookworm/main arm64 m4 arm64 1.4.19-3 [276 kB]
      Ophalen:2 http://deb.debian.org/debian bookworm/main arm64 autoconf all 2.71-3 [332 kB]
      Ophalen:3 http://deb.debian.org/debian bookworm/main arm64 autotools-dev all 20220109.1 [51,6 kB]
      Ophalen:4 http://deb.debian.org/debian bookworm/main arm64 automake all 1:1.16.5-1.3 [823 kB]     
      Ophalen:5 http://deb.debian.org/debian bookworm/main arm64 libatlas3-base arm64 3.10.3-13 [2.537 kB]
      Ophalen:6 http://archive.raspberrypi.com/debian bookworm/main arm64 libssl-dev arm64 3.0.11-1~deb12u2+rpt1 [2.303 kB]
      Ophalen:7 http://deb.debian.org/debian bookworm/main arm64 libatlas-base-dev arm64 3.10.3-13 [2.655 kB]
      Ophalen:8 http://deb.debian.org/debian bookworm/main arm64 libffi-dev arm64 3.4.4-1 [56,0 kB]
      Ophalen:9 http://deb.debian.org/debian bookworm/main arm64 libjpeg62-turbo-dev arm64 1:2.1.5-2 [292 kB]
      Ophalen:10 http://deb.debian.org/debian bookworm/main arm64 libjpeg-dev arm64 1:2.1.5-2 [71,8 kB]
      Ophalen:11 http://deb.debian.org/debian bookworm/main arm64 liblapack-dev arm64 3.11.0-2 [3.065 kB]
      Ophalen:12 http://deb.debian.org/debian bookworm/main arm64 libturbojpeg0-dev arm64 1:2.1.5-2 [234 kB]
      12,7 MB opgehaald in 1s (9.131 kB/s)         
      Voorheen niet geselecteerd pakket m4 wordt geselecteerd.
      (Database wordt ingelezen ... 144814 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../00-m4_1.4.19-3_arm64.deb wordt voorbereid...
      Bezig met uitpakken van m4 (1.4.19-3) ...
      Voorheen niet geselecteerd pakket autoconf wordt geselecteerd.
      Uitpakken van .../01-autoconf_2.71-3_all.deb wordt voorbereid...
      Bezig met uitpakken van autoconf (2.71-3) ...
      Voorheen niet geselecteerd pakket autotools-dev wordt geselecteerd.
      Uitpakken van .../02-autotools-dev_20220109.1_all.deb wordt voorbereid...
      Bezig met uitpakken van autotools-dev (20220109.1) ...
      Voorheen niet geselecteerd pakket automake wordt geselecteerd.
      Uitpakken van .../03-automake_1%3a1.16.5-1.3_all.deb wordt voorbereid...
      Bezig met uitpakken van automake (1:1.16.5-1.3) ...
      Voorheen niet geselecteerd pakket libatlas3-base:arm64 wordt geselecteerd.
      Uitpakken van .../04-libatlas3-base_3.10.3-13_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libatlas3-base:arm64 (3.10.3-13) ...
      Voorheen niet geselecteerd pakket libatlas-base-dev:arm64 wordt geselecteerd.
      Uitpakken van .../05-libatlas-base-dev_3.10.3-13_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libatlas-base-dev:arm64 (3.10.3-13) ...
      Voorheen niet geselecteerd pakket libffi-dev:arm64 wordt geselecteerd.
      Uitpakken van .../06-libffi-dev_3.4.4-1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libffi-dev:arm64 (3.4.4-1) ...
      Voorheen niet geselecteerd pakket libjpeg62-turbo-dev:arm64 wordt geselecteerd.
      Uitpakken van .../07-libjpeg62-turbo-dev_1%3a2.1.5-2_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libjpeg62-turbo-dev:arm64 (1:2.1.5-2) ...
      Voorheen niet geselecteerd pakket libjpeg-dev:arm64 wordt geselecteerd.
      Uitpakken van .../08-libjpeg-dev_1%3a2.1.5-2_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libjpeg-dev:arm64 (1:2.1.5-2) ...
      Voorheen niet geselecteerd pakket liblapack-dev:arm64 wordt geselecteerd.
      Uitpakken van .../09-liblapack-dev_3.11.0-2_arm64.deb wordt voorbereid...
      Bezig met uitpakken van liblapack-dev:arm64 (3.11.0-2) ...
      Voorheen niet geselecteerd pakket libssl-dev:arm64 wordt geselecteerd.
      Uitpakken van .../10-libssl-dev_3.0.11-1~deb12u2+rpt1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libssl-dev:arm64 (3.0.11-1~deb12u2+rpt1) ...
      Voorheen niet geselecteerd pakket libturbojpeg0-dev:arm64 wordt geselecteerd.
      Uitpakken van .../11-libturbojpeg0-dev_1%3a2.1.5-2_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libturbojpeg0-dev:arm64 (1:2.1.5-2) ...
      Instellen van libatlas3-base:arm64 (3.10.3-13) ...
      update-alternatives: /usr/lib/aarch64-linux-gnu/atlas/libblas.so.3 wordt gebruikt om in de automatische modus in /usr/lib/aarch64-linux-gnu/libblas.so.3 (libblas.so.3-aarch64-linux-gnu) te voorzien
      update-alternatives: /usr/lib/aarch64-linux-gnu/atlas/liblapack.so.3 wordt gebruikt om in de automatische modus in /usr/lib/aarch64-linux-gnu/liblapack.so.3 (liblapack.so.3-aarch64-linux-gnu) te voorzien
      Instellen van m4 (1.4.19-3) ...
      Instellen van libffi-dev:arm64 (3.4.4-1) ...
      Instellen van libatlas-base-dev:arm64 (3.10.3-13) ...
      update-alternatives: /usr/lib/aarch64-linux-gnu/atlas/libblas.so wordt gebruikt om in de automatische modus in /usr/lib/aarch64-linux-gnu/libblas.so (libblas.so-aarch64-linux-gnu) te voorzien
      update-alternatives: /usr/lib/aarch64-linux-gnu/atlas/liblapack.so wordt gebruikt om in de automatische modus in /usr/lib/aarch64-linux-gnu/liblapack.so (liblapack.so-aarch64-linux-gnu) te voorzien
      Instellen van libturbojpeg0-dev:arm64 (1:2.1.5-2) ...
      Instellen van autotools-dev (20220109.1) ...
      Instellen van libjpeg62-turbo-dev:arm64 (1:2.1.5-2) ...
      Instellen van libssl-dev:arm64 (3.0.11-1~deb12u2+rpt1) ...
      Instellen van liblapack-dev:arm64 (3.11.0-2) ...
      Instellen van autoconf (2.71-3) ...
      Instellen van automake (1:1.16.5-1.3) ...
      update-alternatives: /usr/bin/automake-1.16 wordt gebruikt om in de automatische modus in /usr/bin/automake (automake) te voorzien
      Instellen van libjpeg-dev:arm64 (1:2.1.5-2) ...
      Bezig met afhandelen van triggers voor libc-bin (2.36-9+rpt2+deb12u3) ...
      Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
    3. Voor de veiligheid van het Domoticasysteem wordt er naast de standaard gebruiker de gebruiker homeassistant aangemaakt, enkel en alleen om HomeAssistant te draaien. Deze gebruiker geven we enkel de rechten die nodig zijn voor HomeAssistant. Zo voegen we de homeassistant gebruiker toe aan de groep dialout (waardoor je Z-Wave en Zigbee controllers kunt gebruiken) en aan de groep gpio (waardoor je de GPIO aansluitingen van de Raspberry Pi kunt gebruiken).
      pi@raspberrypi:~ $ sudo useradd -rm homeassistant -G dialout,gpio,i2c
    4. Daarna maken we een map aan waarin HomeAssistant mag werken:
      pi@raspberrypi:~ $ cd /srv
      pi@raspberrypi:/srv $ sudo mkdir homeassistant
      pi@raspberrypi:/srv $ sudo chown homeassistant:homeassistant homeassistant
    5. Om nog veiliger te werken, creëren we voor HomeAssitant een virtuele omgeving waarbinnen Homeassistant kan en moet werken:
      pi@raspberrypi:/srv $ sudo -u homeassistant -H -s
      homeassistant@raspberrypi:/srv $ cd /srv/homeassistant
      homeassistant@raspberrypi:/srv/homeassistant $ python3 -m venv .
      homeassistant@raspberrypi:/srv/homeassistant $ source bin/activate
    6. Je merkt aan de verandering van de prompt, dat je nu in een virtuele omgeving werkt. Voor we de installatie van HomeAssistant zelf starten, hebben me nog één python onderdeel nodig:
      (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ python3 -m pip install wheel
      Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
      Collecting wheel
        Downloading https://www.piwheels.org/simple/wheel/wheel-0.42.0-py3-none-any.whl (65 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.4/65.4 kB 349.7 kB/s eta 0:00:00
      Installing collected packages: wheel
      Successfully installed wheel-0.42.0
    7. Nu kunnen we HomeAssistant installeren:
      (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant
      Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
      Collecting homeassistant
        Downloading homeassistant-2023.12.4-py3-none-any.whl (33.0 MB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 33.0/33.0 MB 3.0 MB/s eta 0:00:00
      Collecting aiohttp==3.9.1
        Downloading aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 5.7 MB/s eta 0:00:00
      Collecting aiohttp-cors==0.7.0
        Downloading https://www.piwheels.org/simple/aiohttp-cors/aiohttp_cors-0.7.0-py3-none-any.whl (27 kB)
      Collecting aiohttp-fast-url-dispatcher==0.3.0
        Downloading https://www.piwheels.org/simple/aiohttp-fast-url-dispatcher/aiohttp_fast_url_dispatcher-0.3.0-py3-none-any.whl (8.9 kB)
      Collecting aiohttp-zlib-ng==0.1.1
        Downloading https://www.piwheels.org/simple/aiohttp-zlib-ng/aiohttp_zlib_ng-0.1.1-py3-none-any.whl (7.8 kB)
      Collecting astral==2.2
        Downloading https://www.piwheels.org/simple/astral/astral-2.2-py2.py3-none-any.whl (30 kB)
      Collecting attrs==23.1.0
        Downloading https://www.piwheels.org/simple/attrs/attrs-23.1.0-py3-none-any.whl (61 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 kB 1.7 MB/s eta 0:00:00
      Collecting atomicwrites-homeassistant==1.4.1
        Downloading https://www.piwheels.org/simple/atomicwrites-homeassistant/atomicwrites_homeassistant-1.4.1-py2.py3-none-any.whl (7.1 kB)
      Collecting awesomeversion==23.11.0
        Downloading https://www.piwheels.org/simple/awesomeversion/awesomeversion-23.11.0-py3-none-any.whl (13 kB)
      Collecting bcrypt==4.0.1
        Downloading bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl (583 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 583.6/583.6 kB 5.5 MB/s eta 0:00:00
      Collecting certifi>=2021.5.30
        Downloading https://www.piwheels.org/simple/certifi/certifi-2023.11.17-py3-none-any.whl (162 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 162.5/162.5 kB 2.6 MB/s eta 0:00:00
      Collecting ciso8601==2.3.0
        Downloading ciso8601-2.3.0.tar.gz (26 kB)
        Installing build dependencies ... done
        Getting requirements to build wheel ... done
        Preparing metadata (pyproject.toml) ... done
      Collecting httpx==0.25.0
        Downloading https://www.piwheels.org/simple/httpx/httpx-0.25.0-py3-none-any.whl (75 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 75.7/75.7 kB 1.2 MB/s eta 0:00:00
      Collecting home-assistant-bluetooth==1.10.4
        Downloading home_assistant_bluetooth-1.10.4.tar.gz (10 kB)
        Installing build dependencies ... done
        Getting requirements to build wheel ... done
        Preparing metadata (pyproject.toml) ... done
      Collecting ifaddr==0.2.0
        Downloading https://www.piwheels.org/simple/ifaddr/ifaddr-0.2.0-py3-none-any.whl (12 kB)
      Collecting Jinja2==3.1.2
        WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))': /simple/jinja2/Jinja2-3.1.2-py3-none-any.whl
        Downloading https://www.piwheels.org/simple/jinja2/Jinja2-3.1.2-py3-none-any.whl (133 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 1.7 MB/s eta 0:00:00
      Collecting lru-dict==1.2.0
        Downloading lru_dict-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (30 kB)
      Collecting PyJWT==2.8.0
        Downloading https://www.piwheels.org/simple/pyjwt/PyJWT-2.8.0-py3-none-any.whl (22 kB)
      Collecting cryptography==41.0.7
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.1/4.1 MB 6.0 MB/s eta 0:00:00
      Collecting pyOpenSSL==23.2.0
        Downloading https://www.piwheels.org/simple/pyopenssl/pyOpenSSL-23.2.0-py3-none-any.whl (59 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 59.0/59.0 kB 1.1 MB/s eta 0:00:00
      Collecting orjson==3.9.9
        Downloading orjson-3.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (141 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 141.4/141.4 kB 2.8 MB/s eta 0:00:00
      Collecting packaging>=23.1
        Downloading https://www.piwheels.org/simple/packaging/packaging-23.2-py3-none-any.whl (53 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.0/53.0 kB 1.1 MB/s eta 0:00:00
      Requirement already satisfied: pip>=21.3.1 in ./lib/python3.11/site-packages (from homeassistant) (23.0.1)
      Collecting python-slugify==4.0.1
        Downloading https://www.piwheels.org/simple/python-slugify/python_slugify-4.0.1-py2.py3-none-any.whl (7.0 kB)
      Collecting PyYAML==6.0.1
        Downloading PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (732 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 732.2/732.2 kB 6.4 MB/s eta 0:00:00
      Collecting requests==2.31.0
        Downloading https://www.piwheels.org/simple/requests/requests-2.31.0-py3-none-any.whl (62 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.6/62.6 kB 1.2 MB/s eta 0:00:00
      Collecting typing-extensions<5.0,>=4.8.0
        Downloading https://www.piwheels.org/simple/typing-extensions/typing_extensions-4.9.0-py3-none-any.whl (32 kB)
      Collecting ulid-transform==0.9.0
        Downloading ulid_transform-0.9.0.tar.gz (14 kB)
        Installing build dependencies ... done
        Getting requirements to build wheel ... done
        Preparing metadata (pyproject.toml) ... done
      Collecting voluptuous==0.13.1
        Downloading https://www.piwheels.org/simple/voluptuous/voluptuous-0.13.1-py3-none-any.whl (35 kB)
      Collecting voluptuous-serialize==2.6.0
        Downloading https://www.piwheels.org/simple/voluptuous-serialize/voluptuous_serialize-2.6.0-py3-none-any.whl (6.8 kB)
      Collecting yarl==1.9.2
        Downloading yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (278 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 278.2/278.2 kB 5.0 MB/s eta 0:00:00
      Collecting multidict<7.0,>=4.5
        Downloading multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (120 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 120.1/120.1 kB 2.3 MB/s eta 0:00:00
      Collecting frozenlist>=1.1.1
        Downloading frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (273 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 273.3/273.3 kB 4.3 MB/s eta 0:00:00
      Collecting aiosignal>=1.1.2
        Downloading https://www.piwheels.org/simple/aiosignal/aiosignal-1.3.1-py3-none-any.whl (7.6 kB)
      Collecting zlib-ng>=0.2.0
        Downloading zlib_ng-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (98 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.5/98.5 kB 2.8 MB/s eta 0:00:00
      Collecting pytz
        Downloading https://www.piwheels.org/simple/pytz/pytz-2023.3.post1-py3-none-any.whl (502 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 502.5/502.5 kB 3.8 MB/s eta 0:00:00
      Collecting cffi>=1.12
        Downloading cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (466 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 466.6/466.6 kB 6.0 MB/s eta 0:00:00
      Collecting httpcore<0.19.0,>=0.18.0
        Downloading https://www.piwheels.org/simple/httpcore/httpcore-0.18.0-py3-none-any.whl (76 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 76.0/76.0 kB 1.1 MB/s eta 0:00:00
      Collecting idna
        Downloading https://www.piwheels.org/simple/idna/idna-3.6-py3-none-any.whl (61 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.6/61.6 kB 348.5 kB/s eta 0:00:00
      Collecting sniffio
        Downloading https://www.piwheels.org/simple/sniffio/sniffio-1.3.0-py3-none-any.whl (10 kB)
      Collecting MarkupSafe>=2.0
        Downloading MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (28 kB)
      Collecting text-unidecode>=1.3
        WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))': /simple/text-unidecode/text_unidecode-1.3-py2.py3-none-any.whl
        Downloading https://www.piwheels.org/simple/text-unidecode/text_unidecode-1.3-py2.py3-none-any.whl (78 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.2/78.2 kB 1.5 MB/s eta 0:00:00
      Collecting charset-normalizer<4,>=2
        Downloading charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (136 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 136.6/136.6 kB 3.4 MB/s eta 0:00:00
      Collecting urllib3<3,>=1.21.1
        Downloading https://www.piwheels.org/simple/urllib3/urllib3-2.1.0-py3-none-any.whl (104 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.6/104.6 kB 1.5 MB/s eta 0:00:00
      Collecting pycparser
        Downloading https://www.piwheels.org/simple/pycparser/pycparser-2.21-py2.py3-none-any.whl (119 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 119.7/119.7 kB 2.7 MB/s eta 0:00:00
      Collecting anyio<5.0,>=3.0
        Downloading https://www.piwheels.org/simple/anyio/anyio-4.2.0-py3-none-any.whl (85 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.5/85.5 kB 1.6 MB/s eta 0:00:00
      Collecting h11<0.15,>=0.13
        Downloading https://www.piwheels.org/simple/h11/h11-0.14.0-py3-none-any.whl (58 kB)
           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.3/58.3 kB 1.8 MB/s eta 0:00:00
      Building wheels for collected packages: ciso8601, home-assistant-bluetooth, ulid-transform
        Building wheel for ciso8601 (pyproject.toml) ... done
        Created wheel for ciso8601: filename=ciso8601-2.3.0-cp311-cp311-linux_aarch64.whl size=38486 sha256=e4fa43f960d5a812f49ee2e3ef9895d98cbe3036afae9a7727d3c79e760d4b8a
        Stored in directory: /home/homeassistant/.cache/pip/wheels/46/71/ef/cfdc4d0d1c74f03770038ab17e496fe8339cc573426e03ef1a
        Building wheel for home-assistant-bluetooth (pyproject.toml) ... done
        Created wheel for home-assistant-bluetooth: filename=home_assistant_bluetooth-1.10.4-cp311-cp311-manylinux_2_36_aarch64.whl size=252657 sha256=857124187f2696c28be262f8ec8ba3068a75c7a136da7fd2b1a0950c540f4afc
        Stored in directory: /home/homeassistant/.cache/pip/wheels/ee/65/0a/99f17a69d1521fff1c532108a90d2cf2b18aec79c72d1dae8f
        Building wheel for ulid-transform (pyproject.toml) ... done
        Created wheel for ulid-transform: filename=ulid_transform-0.9.0-cp311-cp311-manylinux_2_36_aarch64.whl size=172439 sha256=8d235d4477e1cc193221039f43a6cdb7d438134941099cd0b885d3390bfc8779
        Stored in directory: /home/homeassistant/.cache/pip/wheels/d6/66/ab/d998d6676d2a06033db82433a9c2324b236b160ec8352b82d4
      Successfully built ciso8601 home-assistant-bluetooth ulid-transform
      Installing collected packages: voluptuous, text-unidecode, pytz, lru-dict, ifaddr, ciso8601, zlib-ng, voluptuous-serialize, urllib3, ulid-transform, typing-extensions, sniffio, PyYAML, python-slugify, PyJWT, pycparser, packaging, orjson, multidict, MarkupSafe, idna, home-assistant-bluetooth, h11, frozenlist, charset-normalizer, certifi, bcrypt, awesomeversion, attrs, atomicwrites-homeassistant, astral, yarl, requests, Jinja2, cffi, anyio, aiosignal, httpcore, cryptography, aiohttp, pyOpenSSL, httpx, aiohttp-zlib-ng, aiohttp-fast-url-dispatcher, aiohttp-cors, homeassistant
      Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.3 PyJWT-2.8.0 PyYAML-6.0.1 aiohttp-3.9.1 aiohttp-cors-0.7.0 aiohttp-fast-url-dispatcher-0.3.0 aiohttp-zlib-ng-0.1.1 aiosignal-1.3.1 anyio-4.2.0 astral-2.2 atomicwrites-homeassistant-1.4.1 attrs-23.1.0 awesomeversion-23.11.0 bcrypt-4.0.1 certifi-2023.11.17 cffi-1.16.0 charset-normalizer-3.3.2 ciso8601-2.3.0 cryptography-41.0.7 frozenlist-1.4.1 h11-0.14.0 home-assistant-bluetooth-1.10.4 homeassistant-2023.12.4 httpcore-0.18.0 httpx-0.25.0 idna-3.6 ifaddr-0.2.0 lru-dict-1.2.0 multidict-6.0.4 orjson-3.9.9 packaging-23.2 pyOpenSSL-23.2.0 pycparser-2.21 python-slugify-4.0.1 pytz-2023.3.post1 requests-2.31.0 sniffio-1.3.0 text-unidecode-1.3 typing-extensions-4.9.0 ulid-transform-0.9.0 urllib3-2.1.0 voluptuous-0.13.1 voluptuous-serialize-2.6.0 yarl-1.9.2 zlib-ng-0.4.0
    8. Bij de eerste start van HomeAssistant worden afhankelijke (voor HomeAssistant noodzakelijke) pakketten geïnstalleeerd en wordt een basisconfiguratie aangemaakt. Dit kan tot 10 minuten duren.
      (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ hass
      Unable to find configuration. Creating default one in /home/homeassistant/.homeassistant
      2023-12-29 18:40:39.701 WARNING (MainThread) [homeassistant.bootstrap] Waiting on integrations to complete setup: analytics
      Bij mij liep het aanmaken van de configuratie verschillende keren vast. Dan onderbreek je Home Assistant door Ctrl+C te drukken (soms meerdere malen, bij elke mislukte integration) en start hass opnieuw. Wees daarbij geduldig, bij mij waren meerdere herstarten nodig om Home Assistant zonder fouten op te starten, ook na de configuratie via de webinterface (zie volgende puntje).
    9. Je kunt HomeAssistant nu bereiken door met een browser te surfen naar http://raspberrypi.local:8123, waarbij je raspberrypi vervangt door de netwerknaam van jouw Raspberry Pi. Als dit niet werkt, gebruik je http://ipadres:8123, waarbij ipadres overeenkomt met het IP adres van jouw Raspberry Pi.
    10. De eerste stap bestaat uit het aanmaken van een HomeAssistant beheerder. Vul de nodige gegevens in (en zorg dat je deze onthoudt of opschrijft) en maak een HomeAssistant beheerder aan.
    11. Klik op de knop CREËER MIJN SMART HOME.
    12. Zorg voor een correcte locatie en lees en bevestig de volgende dialoogvensters.
    13. Om Home Assistant terug af te sluiten, druk je in de terminal waar je Home Assistant hebt opgestart op Ctrl+C. In het browservenster verschijnt de melding Verbinding verbroken. Opnieuw verbinden….
  7. Nu Home Assistant werkt, kunnen we Home Assistant automatisch laten starten.
    1. Daarvoor verlaten we de beveiligde HomeAssistant virtuele omgeving met de volgende opdrachten:
      (homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ deactivate
      homeassistant@raspberrypi:/srv/homeassistant $ exit
      exit
      pi@raspberrypi:/srv $ cd
      pi@raspberrypi:~ $
    2. Start als systeembeheerder de teksteditor nano met het opstartscript /etc/systemd/system/home-assistant@homeassistant.service.
      pi@raspberrypi:~ $ sudo nano /etc/systemd/system/home-assistant@homeassistant.service
      Plaats daarin het volgende opstartscript:
      [Unit]
      Description=Home Assistant
      After=network-online.target
      
      [Service]
      # Activeer de volgende regel om de start van HomeAssistant 30 seconden uit te stellen
      #ExecStartPre=/usr/bin/sleep 30
      Type=simple
      User=%i
      WorkingDirectory=/home/%i/.homeassistant
      ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant"
      RestartForceExitStatus=100
      
      [Install]
      WantedBy=multi-user.target
    3. Breng het opstartsysteem op de hoogte van het nieuwe script:
      pi@raspberrypi:~ $ sudo systemctl --system daemon-reload
    4. Activeer ons opstartscript:
      pi@raspberrypi:~ $ sudo systemctl enable home-assistant@homeassistant
    5. Start het opstartscript zonder de Raspberry Pi te herstarten:
    6. pi@raspberrypi:~ $ sudo systemctl start home-assistant@homeassistant
    7. Deze keer verschijnt er geen uitvoer op het scherm. Deze kan je wel opvragen met:
      pi@raspberrypi:~ $ sudo systemctl status home-assistant@homeassistant
       home-assistant@homeassistant.service - Home Assistant
           Loaded: loaded (/etc/systemd/system/home-assistant@homeassistant.service; enabled; preset: enabled)
           Active: active (running) since Sat 2023-12-30 14:57:25 CET; 2min 57s ago
         Main PID: 1992 (hass)
            Tasks: 13 (limit: 1578)
              CPU: 44.278s
           CGroup: /system.slice/system-home\x2dassistant.slice/home-assistant@homeassistant.service
                   └─1992 /srv/homeassistant/bin/python3 /srv/homeassistant/bin/hass -c /home/homeassistant/.homeassistant
      
      dec 30 14:57:25 raspberrypi systemd[1]: Started home-assistant@homeassistant.service - Home Assistant.
      Druk op de toets q om deze opdracht af te sluiten.
    8. Herstart de Raspberry Pi. Home Assistant moet nu automatisch starten. Controleer of Home Assistant correct is opgestart. Mocht dit niet het geval zijn, probeer dan de opstart van Home Assistant 30 seconden te vertragen door de regel ExecStartPre=/usr/bin/sleep 30 in het opstartscript te activeren (hekje vooraan verwijderen).
  8. Om gebruik te kunnen maken van de GPIO pinnen van de Raspberry Pi moeten we Home Assistant uitbreiden met een aantal scripts. Aangezien we Home Assistant uitbreiden, moeten we ons aanmelden als homeassistant gebruiker en werken in zijn home map. Dit kan met de volgende twee opdrachten:
    pi@raspberrypi:~ $ sudo -u homeassistant -H -s
    homeassistant@raspberrypi:/home/pi $ cd
    Download de scripts van de GitHub pagina van de ontwikkelaar met de opdracht:
    homeassistant@raspberrypi:~ $ wget https://github.com/thecode/ha-rpi_gpio/archive/refs/heads/main.zip
    --2023-12-30 15:21:52--  https://github.com/thecode/ha-rpi_gpio/archive/refs/heads/main.zip
    Herleiden van github.com (github.com)... 140.82.121.3
    Verbinding maken met github.com (github.com)|140.82.121.3|:443... verbonden.
    HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
    Locatie: https://codeload.github.com/thecode/ha-rpi_gpio/zip/refs/heads/main [volgen...]
    --2023-12-30 15:21:52--  https://codeload.github.com/thecode/ha-rpi_gpio/zip/refs/heads/main
    Herleiden van codeload.github.com (codeload.github.com)... 140.82.121.10
    Verbinding maken met codeload.github.com (codeload.github.com)|140.82.121.10|:443... verbonden.
    HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
    Lengte: niet-opgegeven [application/zip]
    Wordt opgeslagen als: ‘main.zip’
    
    main.zip                                 [ <=>                                                                ]  22,64K  --.-KB/s    in 0,01s   
    
    2023-12-30 15:21:52 (2,19 MB/s) - '‘main.zip’' opgeslagen [23186]
    Pak het gedownloade ZIP archief uit met:
    homeassistant@raspberrypi:~ $ unzip main.zip
    Archive:  main.zip
    a0aeb432e2376ede8e275efaa0d346363d4106f8
       creating: ha-rpi_gpio-main/
       creating: ha-rpi_gpio-main/.github/
     extracting: ha-rpi_gpio-main/.github/FUNDING.yml  
      inflating: ha-rpi_gpio-main/.github/dependabot.yml  
      inflating: ha-rpi_gpio-main/.github/release-drafter.yml  
       creating: ha-rpi_gpio-main/.github/workflows/
      inflating: ha-rpi_gpio-main/.github/workflows/hacs.yml  
      inflating: ha-rpi_gpio-main/.github/workflows/hassfest.yml  
      inflating: ha-rpi_gpio-main/.github/workflows/release-drafter.yml  
      inflating: ha-rpi_gpio-main/.github/workflows/stale.yaml  
      inflating: ha-rpi_gpio-main/.github/workflows/test.yml  
      inflating: ha-rpi_gpio-main/.gitignore  
      inflating: ha-rpi_gpio-main/.pre-commit-config.yaml  
      inflating: ha-rpi_gpio-main/LICENSE  
      inflating: ha-rpi_gpio-main/README.md  
      inflating: ha-rpi_gpio-main/bandit.yaml  
       creating: ha-rpi_gpio-main/custom_components/
       creating: ha-rpi_gpio-main/custom_components/rpi_gpio/
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/__init__.py  
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/binary_sensor.py  
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/cover.py  
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/manifest.json  
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/services.yaml  
      inflating: ha-rpi_gpio-main/custom_components/rpi_gpio/switch.py  
      inflating: ha-rpi_gpio-main/hacs.json  
      inflating: ha-rpi_gpio-main/info.md  
      inflating: ha-rpi_gpio-main/legacy-config.md  
      inflating: ha-rpi_gpio-main/pylintrc  
      inflating: ha-rpi_gpio-main/requirements_lint.txt
    En kopieer de map met de scripts naar Home Assistant:
    homeassistant@raspberrypi:~ $ cp -r ha-rpi_gpio-main/custom_components .homeassistant/
    Om de uitbreiding in Home Assistant op te nemen, herstarten we Home Assistant met de volgende opdrachten:
    homeassistant@raspberrypi:~ $ exit
    exit
    pi@raspberrypi:~ $ sudo systemctl restart home-assistant@homeassistant
    pi@raspberrypi:~ $ sudo -u homeassistant -H -s
    homeassistant@raspberrypi:/home/pi $ cd
  9. Het configuratiebestand van Home Assistant gebruikt een structuur die lijkt op HTML en XML, namelijk Yet Another Markup Language (YAML).
    1. Met een teksteditor kan je de configuratie ~/.homeassistant/configuration.yaml aanpassen.
      homeassistant@raspberrypi:~ $ nano ~/.homeassistant/configuration.yaml
      Voeg de volgende regels toe om de LED in en uit te schakelen (schakelen doe je met een switch):
      switch:
        platform: rpi_gpio
        ports:
          12: Led
        invert_logic: false
      De LED is namelijk verbonden met BCM12 (port 12) via de Rasprberry Pi GPIO pennen (rpi_gpio). De naam Led mag je vrij kiezen en verschijnt in het onderdeel Toestanden op de webpagina van Home Assistant (zie volgende punt). De regels die je nodig hebt voor een bepaald domotica apparaat of dienst staan beschreven op de webpagina Available components.
    2. Om een nieuwe configuratie te kunnen testen op fouten, activeer je in de categorie Ontwikkelhulpmiddelen het onderdeel YAML-configuratie. Klik op de knop Configuratie controleren om de configuratiebestanden te testen. Bij fouten in de configuratiebestanden, krijg je Notificaties en kan je een beschrijving terugvinden in het Logboek.
    3. Om de aanpassingen toe te passen, moet je Home Assistant herstarten. Dit doe je op de webpagina van Home Assistant via Ontwikkelhulpmiddelen/YAML-configuratie.
    4. Activeer op de webpagina het onderdeel Overzicht. Er is een extra paneel verschenen met alle Schakelaars (switch) met daarin de Led schakelaar. Klik op het knopje om de LED te laten oplichten. De schakelaar wordt blauw om aan te duiden dat de schakelaar is ingeschakeld en de LED oplicht.
    5. Schakel de LED terug uit.
    6. Klik je op de naam van de schakelaar (Led) of zijn pictogram en de Led krijgt een eigen venster. Een knopje bovenaan rechts in dit venster toont de Geschiedenis van de schakelaar. In technische termen noemen we dit het logboek.
    7. Sluit het log-venster door ernaast te klikken.
  10. Tijd om de drukknop in Home Assistant op te nemen.
    1. Een drukknop is een sensor (invoer-apparaat) met twee toestanden (binair: aan of uit). Voeg de volgende regels toe aan het configuratiebestand van Home Assistant:
      binary_sensor:
        platform: rpi_gpio
        ports:
          8: Drukknop
      De binaire sensor is verbonden met de Raspberry Pi GPIO pennen (rpi_gpio) op BCM8 en krijgt als naam Drukknop. Home Assistant zorgt ervoor dat de BCM8 hoog is indien de schakelaar open is. Bij een gesloten schakelaar wordt BCM8 door de schakelaar verbonden met de massa en dus laag getrokken.
    2. Na het aanpassen van het configuratiebestand zorg je dat Home Assistant de nieuwe instellingen gebruikt.
    3. Je ziet nu in het onderdeel Overzicht op de webpagina van Home Assistant in het paneel Binaire sensor een pictogram met de naam Drukknop staan. Door het drukken op de drukknop moet de toestand veranderen (vinkje/geen vinkje).
    4. Indien dit niet correct werkt, is dit te wijten aan dender waarbij de schakelaar niet eenduidig hoog of laag doorgeeft. Dit kan je oplossen door het signaal dat van de schakelaar als volgt te verbeteren:
      1. Softwarematig: voeg aan de configuratie van de binary_sensor de eigenschap bouncetime met een hogere waarde toe. Let bij het ingeven van nieuwe instellingen steeds op het correct inspringen van de regels, de volgende regel begint met twee spaties.
          bouncetime: 200
        Standaard heeft deze de waarde 50.
      2. Hardwarematig: hoewel de Raspberry Pi GPIO ingangen reeds voorzien zijn van inschakelbare pull-up weerstanden (50k ohm), kan je het signaal verbeteren door zelf een 5k ohm tussen de GPIO-ingang en de 3,3 volt power pin te monteren. De drukknoppen leveren een nog beter signaal als je er een 0,1 µF condensator over plaatst (parallel) (zie Raspberry-gpio-python en Avoiding False Hits with RPI.GPIO Edge Detection). Door tussen de drukknop en de GPIO pennen een elektronisch circuit, zoals bij goede domotica sensors het geval is, te plaatsen wordt het signaal nog beter.
      3. Een combinatie van software en hardware oplossingen.
  11. Pas echt leuk wordt het als je de LED kunt bedienen met de drukknop en via Home Assistant. We moeten dus zorgen dat Home Assistant de LED laat branden als de toestand van de drukknop verandert.
    1. Open het Automatisatie configuratiebestand met:
      homeassistant@raspberrypi:~ $ nano ~/.homeassistant/automations.yaml
    2. Vervang alle inhoud van het automations.yaml configuratiebestand door:
      - alias: Schakel Led aan
        trigger:
        - entity_id: binary_sensor.drukknop
          from: 'off'
          platform: state
          to: 'on'
        action:
        - service: switch.turn_on
          entity_id: switch.led
      Het configuratiebestand automations.yaml bevat alle taken die automatisch uitgevoerd moeten worden. Het - teken duidt de start van de eerste automatisatie taak aan. De alias is de naam van de taak. De trigger is de gebeurtenis die de taak in gang zet, hier wordt de toestand (state) van de sensor binary_sensor.druknop gecontroleerd. Als deze de toestand 'on' (ingeschakeld) is, wordt de actie (action) uitgevoerd. De actie (action) die bij het voorkomen van de gebeurtenis (trigger) wordt uitgevoerd, is het inschakelen (switch.turn_on) van de schakelaar switch.led. De entity_id's en state van de verschillende domotica apparaten kan je terugvinden bij de Ontwikkelhulpmiddelen op het tabblad Statussen. In ons geval gaat het om de schakelaar switch.led.
    3. Test of je de LED nog kunt in- en uitschakelen via het Switch paneel. Raadpleeg bij problemen het Logboek.
    4. Test of je een uitgeschakelde LED kunt inschakelen door op de drukknop te drukken. Zoals je merkt werkt dit alleen als de Drukknop toestand overgaat van niet ingeschakeld naar ingeschakeld. Om de LED via de drukknop uit te schakelen, moet je de volgende regels in het automations.yaml configuratiebestand toevoegen:
      - alias: Schakel Led uit
        trigger:
        - entity_id: binary_sensor.drukknop
          from: 'on'
          platform: state
          to: 'off'
        action:
        - service: switch.turn_off
          entity_id: switch.led
    Bij het testen blijkt al vlug dat een "Momentary" schakelaar (enkel contact bij het indrukken) niet geschikt is als gewone schakelaar (omschakelaar). Voor de volgende toepassing is een contactschakelaar dan weer ideaal.
  12. Om energie te besparen, worden lampen soms automatisch na een bepaalde tijd uitgeschakeld (denk aan de verlichting in de traphal van een appartement). Dit kan in het scripts.yaml configuratiebestand:
    homeassistant@raspberrypi:~ $ nano ~/.homeassistant/scripts.yaml
    Voor onze tijdschakelaar voer je de volgende regels aan het scripts.yaml configuratiebestand van Home Assistant toe (let ook hier weer op het correct inspringen, zeker bij de eerste regel die begint met twee spaties):
      timed_led:
        alias: "LED laten branden en timer starten"
        sequence:
          # Eventuele oude timer resetten
          - service: script.turn_off
            data:
               entity_id: script.timer_off
          - service: switch.turn_on
            data:
              entity_id: switch.led    
          # Nieuwe timer starten   
          - service: script.turn_on
            data:
              entity_id: script.timer_off
    
      timer_off:
        alias: "Schakel de LED na 10 minuten uit"
        sequence:
          - delay:
              minutes: 10
          - service: switch.turn_off
            data:
              entity_id: switch.led
    We gebruiken twee scripts. Het script timed_led zorgt voor het resetten van een vorige timer (iemand heeft binnen de 10 minuten nogmaals op de drukknop geduwd), schakelt daarna de LED in en start de timer. Het script timer_off wacht (delay) 10 minuten en schakelt daarna de led uit. Om dit script te testen, zorg je voor 1 minuut vertraging. Daarenboven moet je de actie bij het inschakelen van de drukknop aanpassen naar:
      action:
      - service: homeassistant.turn_on
        entity_id: script.timed_led
    Waardoor het script timed_led wordt uitgevoerd bij het inschakelen van de drukknop.
  13. We waarderen onze drukknop op naar een alarmschakelaar.
    1. Daarbij moet een alarmsignaal afgaan. We gebruiken daarvoor een MP3 bestand dat we downloaden:
      homeassistant@raspberrypi:~ $ wget https://partofthething.com/thoughts/wp-content/uploads/2016/08/burglar.mp3
      --2024-01-03 16:31:45--  https://partofthething.com/thoughts/wp-content/uploads/2016/08/burglar.mp3
      Herleiden van partofthething.com (partofthething.com)... 198.199.93.72
      Verbinding maken met partofthething.com (partofthething.com)|198.199.93.72|:443... verbonden.
      HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
      Lengte: 2489578 (2,4M) [audio/mpeg]
      Wordt opgeslagen als: ‘burglar.mp3’
      
      burglar.mp3                       100%[============================================================>]   2,37M  1,69MB/s    in 1,4s    
      
      2024-01-03 16:31:47 (1,69 MB/s) - '‘burglar.mp3’' opgeslagen [2489578/2489578]
      Nog leuker wordt het als je zelf een MP3 bestand in elkaar zet (bijvoorbeeld met een gevaarlijk blaffende hond).
    2. De homeassistant gebruiker kan het MP3 bestand enkel afspelen, als deze lid is van de groep audio (toegang heeft tot de audio hardware van de Raspberry Pi):
      homeassistant@raspberrypi:~ $ exit
      exit
      pi@raspberrypi:~ $ sudo usermod -a -G audio homeassistant
    3. Daarenboven heb je voor het afspelen van MP3 bestanden speciale software nodig. Voor WAV bestanden niet. Ons burglar MP3 bestand zet je om naar een WAV bestand met de volgende opdracht:
      pi@raspberrypi:~ $ sudo -u homeassistant -H -s
      homeassistant@raspberrypi:/home/pi $ cd
      homeassistant@raspberrypi:~ $ ffmpeg  -hide_banner -i burglar.mp3 burglar.wav
      Input #0, mp3, from 'burglar.mp3':
        Metadata:
          title           : burglar alarm
        Duration: 00:01:45.64, start: 0.025057, bitrate: 188 kb/s
        Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 188 kb/s
          Metadata:
            encoder         : LAME3.99r
      Stream mapping:
        Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
      Press [q] to stop, [?] for help
      Output #0, wav, to 'burglar.wav':
        Metadata:
          INAM            : burglar alarm
          ISFT            : Lavf59.27.100
        Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
          Metadata:
            encoder         : Lavc59.37.100 pcm_s16le
      size=   18190kB time=00:01:45.59 bitrate=1411.2kbits/s speed= 186x    
      video:0kB audio:18190kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000537%
      
    4. Test het afspelen van het WAV bestand door de homeassistant gebruiker en regel tegelijkertijd het volume af:
      homeassistant@raspberrypi:~ $ aplay --device hw:CARD=Headphones,DEV=0 burglar.wav
      Playing WAVE 'burglar.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
      Ik heb het afspelen van het WAV bestand afgebroken met Ctrl+c.
    5. Bovenstaande opdracht gebruikt de analoge audio uitgang van de Raspberry Pi. Een overzicht van de op de Raspberry Pi aanwezige audio apparaten, geef je weer met de opdracht:
      homeassistant@raspberrypi:~ $ aplay -L
      null
          Discard all samples (playback) or generate zero samples (capture)
      default
          Default Audio Device
      sysdefault
          Default Audio Device
      lavrate
          Rate Converter Plugin Using Libav/FFmpeg Library
      samplerate
          Rate Converter Plugin Using Samplerate Library
      speexrate
          Rate Converter Plugin Using Speex Resampler
      jack
          JACK Audio Connection Kit
      oss
          Open Sound System
      pulse
          PulseAudio Sound Server
      speex
          Plugin using Speex DSP (resample, agc, denoise, echo, dereverb)
      upmix
          Plugin for channel upmix (4,6,8)
      vdownmix
          Plugin for channel downmix (stereo) with a simple spacialization
      hw:CARD=vc4hdmi0,DEV=0
          vc4-hdmi-0, MAI PCM i2s-hifi-0
          Direct hardware device without any conversions
      ...
      default:CARD=Headphones
          bcm2835 Headphones, bcm2835 Headphones
          Default Audio Device
      sysdefault:CARD=Headphones
          bcm2835 Headphones, bcm2835 Headphones
          Default Audio Device
      dmix:CARD=Headphones,DEV=0
          bcm2835 Headphones, bcm2835 Headphones
          Direct sample mixing device
      usbstream:CARD=Headphones
          bcm2835 Headphones
          USB Stream Output
    6. Open het scripts configuratiebestand van Home Assistant en voeg de volgende stap (sequence) toe aan het script timed_led:
            # Inbraakalarm
            - service: script.turn_on
              data:
                entity_id: script.burglar
      
      Dit start het script burglar als je de drukknop indrukt. Vanzelfsprekend zou je de drukknop kunnen vervangen door een bewegingssensor (PIR) of een andere inbraakdetectieschakelaar.
    7. Voeg aan de scripts configuratiebestand (configuration.yaml) het burglar script toe:
        burglar:
          alias: Inbraakalarm
          sequence:
            - service: shell_command.intruder_music
      Dit script voert een terminalopdracht (shell command) uit dat beschreven wordt in de intruder_music opdracht.
    8. Voeg in het configuratiebestand de shell_command sectie toe met de intruder_music opdracht:
      shell_command:
        intruder_music: aplay --device hw:CARD=Headphones,DEV=0 /home/homeassistant/burglar.wav
    9. Test het inbraakalarm door Home Assistant te herstarten en op de drukknop te drukken.
    10. Onderbreek het afspelen van het WAV bestand in de terminal:
      homeassistant@raspberrypi:~ $ killall aplay
  14. We breiden ons inbraakalarm uit met momentopnames, met andere woorden bij het detecteren van een inbraakalarm nemen we een aantal foto's via de Pi Camera (beveiligingscamera):
    1. Gelijkaardig als bij het afspelen van geluid, kan de homeassistant gebruiker enkel foto's nemen als deze lid is van de groep video (toegang heeft tot de Pi Camera van de Raspberry Pi):
      homeassistant@raspberrypi:~ $ exit
      exit
      pi@raspberrypi:~ $ sudo usermod -a -G video homeassistant
    2. Ook de software om foto's te nemen, moet je installeren:
      pi@raspberrypi:~ $ sudo apt install rpicam-apps
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar 
      De volgende extra pakketten zullen geïnstalleerd worden:
        libboost-program-options1.74.0
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
        libboost-program-options1.74.0 rpicam-apps
      0 opgewaardeerd, 2 nieuw geïnstalleerd, 0 te verwijderen en 1 niet opgewaardeerd.
      Er moeten 634 kB aan archieven opgehaald worden.
      Na deze bewerking zal er 4.328 kB extra schijfruimte gebruikt worden.
      Wilt u doorgaan? [J/n] 
      Ophalen:1 http://deb.debian.org/debian bookworm/main arm64 libboost-program-options1.74.0 arm64 1.74.0+ds1-21 [317 kB]
      Ophalen:2 http://archive.raspberrypi.com/debian bookworm/main arm64 rpicam-apps arm64 1.4.1-1 [317 kB]           
      634 kB opgehaald in 1s (701 kB/s)                                                 
      Voorheen niet geselecteerd pakket libboost-program-options1.74.0:arm64 wordt geselecteerd.
      (Database wordt ingelezen ... 149544 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../libboost-program-options1.74.0_1.74.0+ds1-21_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libboost-program-options1.74.0:arm64 (1.74.0+ds1-21) ...
      Voorheen niet geselecteerd pakket rpicam-apps wordt geselecteerd.
      Uitpakken van .../rpicam-apps_1.4.1-1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van rpicam-apps (1.4.1-1) ...
      Instellen van libboost-program-options1.74.0:arm64 (1.74.0+ds1-21) ...
      Instellen van rpicam-apps (1.4.1-1) ...
      Bezig met afhandelen van triggers voor libc-bin (2.36-9+rpt2+deb12u3) ...
    3. Om Home Assistant verder te configureren, moet je je terug als homeassistant gebruiker aanmelden:
      pi@raspberrypi:~ $ sudo -u homeassistant -H -s
      homeassistant@raspberrypi:/home/pi $ cd
    4. Nu pas je het inbraakalarmscript van Home Assistant aan zodat er voor het afgaan van het alarmsignaal een foto wordt genomen:
        burglar:
          alias: Inbraakalarm
          sequence:
            - service: shell_command.snapshot
              data:
                  filename: /home/homeassistant/snapshot.jpg
            - delay:
                  seconds: 1
            - service: shell_command.intruder_music
      Na het maken van de foto, wordt nog één seconde gewacht (delay) om het alarmsignaal af te spelen. Dit zorgt ervoor dat de inbreker niet weet wanneer en hoe die werd betrapt.
    5. Zoals je merkt wordt in het inbraakalarmscript een nieuwe terminal opdracht uitgevoerd, m.a.w. vul de sectie shell_command aan met de snapshot opdracht:
        snapshot: rpicam-still --nopreview -o {{filename}}
    6. Controleer of de nieuwe instelling werkt. Bijvoorbeeld met de volgende opdracht:
      homeassistant@raspberrypi:~ $ ls -l snapshot.jpg 
      -rw-r--r-- 1 homeassistant homeassistant 1253634  4 jan 15:31 snapshot.jpg
      Kijk daarbij vooral naar het tijdstip, dit moet overeenkomen met het activeren van het inbraakalarm.
  15. Nu we een foto hebben, kunnen we die doormailen. Zo worden we verwittigd dat het inbraakalarm is afgegaan en zien we wat er gebeurde. Zijn er echte inbrekers aan het werk of komen de buren de planten water geven. Daarnaast hebben we een foto in handen, zelfs als ons alarmsysteem vakkundig wordt gemolesteerd:
    1. Eerst voeren we de e-mail gegevens in het configuratiebestand (configuration.yaml) in met een sectie (vervang daarbij de fictieve gegevens door jouw eigen email-gegevens):
      notify:
        name: emailer
        platform: smtp
        server: smtp-mail.outlook.com
      #  port: 587
        sender: voor.naam@outlook.com
        encryption: starttls
        username: voor.naam@outlook.com
        password: sterkwachtwoord
        recipient: voor.naam@outlook.com
      
      homeassistant:
        allowlist_external_dirs:
          - "/home/homeassistant"
      De server is de computer die de mail moet verwerken (Proximus: relay.proximus.be, Telenet: smtp.telenet.be). De instelling sender bevat het e-mail adres van degene die de mail verzendt. De recipient is het e-mail adres van de persoon die de e-mail zal ontvangen. De regels die beginnen met een # zijn uitgeschakeld en enkel noodzakelijk als de e-mail provider dit vereist.

      Met de laatste drie regels maken we bestanden in de map /home/homeassistant beschikbaar voor verwerking door Home Assistant, m.a.w. de aangemaakte foto.

    2. Om effectief een e-mail te versturen, voeg je na de 1 seconde wachttijd en voor het afspelen van het geluidsbestand een notificatie toe aan het burglar inbraakalarmscript:
            - service: notify.emailer
              data:
                  title: 'Inbraakalarm'
                  message: 'Er wordt in het appartement ingebroken!!'
                  data:
                      images:
                          - /home/homeassistant/snapshot.jpg
    3. Test het inbraakalarm en controleer of je een e-mail met een foto kreeg.
    4. Raadpleeg de documentatie van HomeAssistant en bepaal hoe je e-mail kunt sturen naar een GMail adres. GMail is een veelzijdig en veel gebruikte dienst en is dan ook extra beveiligd waardoor je zonder aanpassingen in GMail zelf geen geautomatiseerde mails kunt versturen.
  16. Om het alarmsignaal overtuigend te laten overkomen, sluit je de Raspberry Pi aan op uw stereo installatie en zorg je dat er bij een inbraakalarm de stereo installatie wordt ingeschakeld en het volume luid staat voor je het alarmsignaal ten gehore brengt. Maar dit is voor een andere keer.
  17. Extra om de 1-Wire temperatuursensor DS18B20 aan Home Assistant toe te voegen:
    1. Home Assistant ondersteunt enkel nog 1-Wire aangesloten op draadloze sensoren. We gaan dus een server opzetten om de 1-Wire apparaten die op de Raspberry Pi aangesloten zijn via het netwerk door te geven. We gebruiken daarvoor OWFS. Om de owsserver te kunnen installeren, melden we de homeassistant gebruiker af:
      homeassistant@raspberrypi:~ $ exit
      exit
    2. En installeren we de OWFS software:
      pi@raspberrypi:~ $ sudo apt install owfs ow-shell
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar 
      De volgende extra pakketten zullen geïnstalleerd worden:
        libfuse2 libow-3.2-4 owfs-common owfs-fuse owftpd owhttpd owserver
      Voorgestelde pakketten:
        owfs-doc
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
        libfuse2 libow-3.2-4 ow-shell owfs owfs-common owfs-fuse owftpd owhttpd owserver
      0 opgewaardeerd, 9 nieuw geïnstalleerd, 0 te verwijderen en 5 niet opgewaardeerd.
      Er moeten 570 kB aan archieven opgehaald worden.
      Na deze bewerking zal er 2.871 kB extra schijfruimte gebruikt worden.
      Wilt u doorgaan? [J/n] 
      Ophalen:1 http://deb.debian.org/debian bookworm/main arm64 owfs-common all 3.2p4+dfsg1-4.1 [14,4 kB]
      Ophalen:2 http://deb.debian.org/debian bookworm/main arm64 libow-3.2-4 arm64 3.2p4+dfsg1-4.1+b1 [286 kB]
      ...
      Ophalen:8 http://deb.debian.org/debian bookworm/main arm64 owfs-fuse arm64 3.2p4+dfsg1-4.1+b1 [20,8 kB]
      Ophalen:9 http://deb.debian.org/debian bookworm/main arm64 owfs all 3.2p4+dfsg1-4.1 [6.012 B]
      570 kB opgehaald in 0s (3.525 kB/s)   
      Voorheen niet geselecteerd pakket owfs-common wordt geselecteerd.
      (Database wordt ingelezen ... 150938 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../0-owfs-common_3.2p4+dfsg1-4.1_all.deb wordt voorbereid...
      Bezig met uitpakken van owfs-common (3.2p4+dfsg1-4.1) ...
      ...
      Voorheen niet geselecteerd pakket owfs wordt geselecteerd.
      Uitpakken van .../8-owfs_3.2p4+dfsg1-4.1_all.deb wordt voorbereid...
      Bezig met uitpakken van owfs (3.2p4+dfsg1-4.1) ...
      Instellen van libfuse2:arm64 (2.9.9-6+b1) ...
      Instellen van owfs-common (3.2p4+dfsg1-4.1) ...
      
      Creating config file /etc/owfs.conf with new version
      Instellen van ow-shell (3.2p4+dfsg1-4.1+b1) ...
      Instellen van libow-3.2-4:arm64 (3.2p4+dfsg1-4.1+b1) ...
      ...
      Instellen van owftpd (3.2p4+dfsg1-4.1+b1) ...
      Created symlink /etc/systemd/system/multi-user.target.wants/owftpd.service → /lib/systemd/system/owftpd.service.
      Instellen van owfs-fuse (3.2p4+dfsg1-4.1+b1) ...
      Created symlink /etc/systemd/system/multi-user.target.wants/owfs.service → /lib/systemd/system/owfs.service.
      Instellen van owfs (3.2p4+dfsg1-4.1) ...
      Bezig met afhandelen van triggers voor libc-bin (2.36-9+rpt2+deb12u3) ...
      Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
    3. Daarna configureren we OWFS:
      pi@raspberrypi:~ $ sudo nano /etc/owfs.conf
    4. Schakel de testhardware uit door er commentaar van te maken, m.a.w. zet er een # voor:
      #server: FAKE = DS18S20,DS2405
    5. Omdat OWSF de 1-Wire hardware zou vinden, plaats je onder de volgende twee regels:
      # USB device: DS9490
      #server: usb = all
      de regel:
      server: device = w1
    6. Sla de aanpassingen op en verlaat nano.
    7. Je kunt de aanpassingen activeren door de OWFS server te herstarten:
      pi@raspberrypi:~ $ sudo systemctl restart owserver.service
      pi@raspberrypi:~ $ sudo systemctl restart owhttpd.service
      De tweede opdracht herstart de webtoegang tot de OWFS server. Je kan die bereiken door te surfen naar http://raspberrypi.local:2121/. Klik op de koppeling 28.843894970203 en je komt op de pagina waar je onder andere de temperatuur kunt aflezen.
    8. Als alles naar behoren werkt, kunnen we de temperatuursensor aan Home Assistant toevoegen. Daarvoor activeer je in Home Assistant het onderdeel Instellingen.
    9. Open het onderdeel Apparaten & diensten.
    10. Klik op de knop .
    11. Zoek naar 1-Wire.
    12. Het dialoogvenster Serverdetails instellen heeft standaard de correcte waarden. Localhost betekent dat de sensor is aangesloten op hetzelfde apparaat als Home Assistant. Poort 4304 is de standaard OWFS poort. M.a.w. klik op de knop .
    13. Er verschijnt opnieuw een dialoogvenster met de gevonden apparaten (temperatuursensor). Bij Gelukt! klik je op de knop .
    14. De temperatuursensor staat nu in het Overzicht van Home Assistant.
  18. MQTT

    Home Assistant ondersteunt geen i2c apparaten, we gaan deze keer een MQTT server opzetten om data afkomstig van i2c apparaten naar Home Assistant te sturen. Daar MQTT een standaard is, ondersteunen zeer veel domotica (ook draadloze) sensoren, schakelaars, enz. MQTT. Al deze MQTT compatibele apparaten hebben een MQTT server nodig om hun gegevens naar toe te sturen.
    1. MQTT server installeren

      Installeer de Mosquito MQTT server met de volgende opdracht:
      pi@raspberrypi:~ $ sudo apt install -y mosquitto mosquitto-clients
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar 
      De volgende extra pakketten zullen geïnstalleerd worden:
        libdlt2 libmosquitto1
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
        libdlt2 libmosquitto1 mosquitto mosquitto-clients
      0 opgewaardeerd, 4 nieuw geïnstalleerd, 0 te verwijderen en 5 niet opgewaardeerd.
      Er moeten 633 kB aan archieven opgehaald worden.
      Na deze bewerking zal er 1.883 kB extra schijfruimte gebruikt worden.
      Ophalen:1 http://deb.debian.org/debian bookworm/main arm64 libdlt2 arm64 2.18.8-6 [54,4 kB]
      Ophalen:2 http://deb.debian.org/debian bookworm/main arm64 libmosquitto1 arm64 2.0.11-1.2+deb12u1 [85,9 kB]
      Ophalen:3 http://deb.debian.org/debian bookworm/main arm64 mosquitto arm64 2.0.11-1.2+deb12u1 [384 kB]
      Ophalen:4 http://deb.debian.org/debian bookworm/main arm64 mosquitto-clients arm64 2.0.11-1.2+deb12u1 [109 kB]
      633 kB opgehaald in 0s (3.553 kB/s)    
      Voorheen niet geselecteerd pakket libdlt2:arm64 wordt geselecteerd.
      (Database wordt ingelezen ... 151038 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../libdlt2_2.18.8-6_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libdlt2:arm64 (2.18.8-6) ...
      Voorheen niet geselecteerd pakket libmosquitto1:arm64 wordt geselecteerd.
      Uitpakken van .../libmosquitto1_2.0.11-1.2+deb12u1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libmosquitto1:arm64 (2.0.11-1.2+deb12u1) ...
      Voorheen niet geselecteerd pakket mosquitto wordt geselecteerd.
      Uitpakken van .../mosquitto_2.0.11-1.2+deb12u1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van mosquitto (2.0.11-1.2+deb12u1) ...
      Voorheen niet geselecteerd pakket mosquitto-clients wordt geselecteerd.
      Uitpakken van .../mosquitto-clients_2.0.11-1.2+deb12u1_arm64.deb wordt voorbereid...
      Bezig met uitpakken van mosquitto-clients (2.0.11-1.2+deb12u1) ...
      Instellen van libmosquitto1:arm64 (2.0.11-1.2+deb12u1) ...
      Instellen van mosquitto-clients (2.0.11-1.2+deb12u1) ...
      Instellen van libdlt2:arm64 (2.18.8-6) ...
      Instellen van mosquitto (2.0.11-1.2+deb12u1) ...
      Created symlink /etc/systemd/system/multi-user.target.wants/mosquitto.service → /lib/systemd/system/mosquitto.service.
      Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...
      Bezig met afhandelen van triggers voor libc-bin (2.36-9+rpt2+deb12u3) ...
    2. Met de volgende opdracht zorgen we dat de MQTT server automatisch start:
      pi@raspberrypi:~ $ sudo systemctl enable mosquitto.service
      Synchronizing state of mosquitto.service with SysV service script with /lib/systemd/systemd-sysv-install.
      Executing: /lib/systemd/systemd-sysv-install enable mosquitto
    3. Gegevens ophalen en doorsturen naar de MQTT server

      Met behulp van een script sturen we de temperatuur van onze MCP9808 sensor door naar de MQTT server. Maak met de teksteditor nano het script aan:
      pi@raspberrypi:~ $ sudo nano /usr/sbin/mcp9808_mqtt.sh
      Met de volgende inhoud:
      #!/bin/bash
      # mcp9808_mqtt.sh - send mcp9808 data to MQTT broker
      #
      
      # De temperatuur ophalen
      temp=$(cat /sys/bus/i2c/devices/1-0018/hwmon/hwmon3/temp1_input)
      # Omrekenen naar van m°C naar °C met 1 cijfer na de komma
      temp=$(echo "scale=1; $temp / 1000" | bc)
      # Temperatuur doorsturen naar MQTT Broker
      mosquitto_pub -h localhost -t mcp9808/temp -m "$temp"
    4. Na het opslaan en afsluiten van nano, maken we het script uitvoerbaar met:
      pi@raspberrypi:~ $ sudo chmod +x /usr/sbin/mcp9808_mqtt.sh
    5. Om dit script op de achtergrond als server (service) uit te voeren, maken we het volgende systeembestand aan:
      pi@raspberrypi:~ $ sudo nano /etc/systemd/system/mcp9808_mqtt.service
      Met de volgende inhoud:
      [Unit]
      Description=Send MCP9808 temp to MQTT Broker
      [Service]
      Type=simple
      ExecStart=/usr/sbin/mcp9808_mqtt.sh
    6. Om met deze service elke minuut een temperatuur door te sturen, maken we een timer aan met:
      pi@raspberrypi:~ $ sudo nano /etc/systemd/system/mcp9808_mqtt.timer
      Met de volgende inhoud:
      [Unit]
      Description=Run mcp9808_mqtt every minute
      
      [Timer]
      OnCalendar=*-*-* *:*:00
      Unit=mcp9808_mqtt.service
      
      [Install]
      WantedBy=timers.target
    7. Nu we alle onderdelen hebben, kunnen we de timer automatisch laten starten bij het opstarten van de Raspberry Pi:
      pi@raspberrypi:~ $ sudo systemctl enable mcp9808_mqtt.timer 
      Created symlink /etc/systemd/system/timers.target.wants/mcp9808_mqtt.timer → /etc/systemd/system/mcp9808_mqtt.timer.
    8. Je kunt de timer ook manueel starten met:
      pi@raspberrypi:~ $ sudo systemctl start mcp9808_mqtt.timer
    9. Je kunt het doorgeven van de MCP9808 temperatuurmeting aan MQTT testen met:
      pi@raspberrypi:~ $ mosquitto_sub -h localhost -v -t mcp9808/temp
      mcp9808/temp 28.1 °C
      Indien alles werkt zoals het hoort, krijg je elke minuut een waarde op het scherm. Breek de opdracht af met de sneltoets Ctrl+c.
    10. MQTT sensorwaarden in Home Assistant integreren

      Eerst koppelen we Home Assistant aan de MQTT server. We gebruiken daarvoor de Home Assistant webpagina.
    11. Activeer in Home Assistant het onderdeel Instellingen.
    12. Open het onderdeel Apparaten & diensten.
    13. Klik op de knop .
    14. Zoek naar mqtt.
    15. Open de categorie MQTT.
    16. Ga door naar MQTT.
    17. Uiteindelijk krijg je het MQTT dialoogvenster. Het enige wat je hier moet invullen is de hostnaam of het IP-adres van de Broker. In ons geval localhost (hetzelfde apparaat).
    18. Klik op de knop VERZENDEN.
    19. Klik op de knop VOLTOOIEN.
    20. Klik nu bij Geconfigureerd op het paneel MQTT.
    21. Klik in het paneel Integratie-items op de koppeling CONFIGUREREN.
    22. Vul in het paneel Luisteren naar 'onderwerp' bij Onderwerp om op te abonneren ons onderwerp (topic) in: mcp9808/temp.
    23. Klik op de koppeling BEGIN MET LUISTEREN. Daaronder moet nu elke minuut een temperatuurmeting verschijnen.
    24. Om de temperatuurmetingen in het Overzicht weer te geven en Home Assistant ermee aan de slag te laten gaan, moeten we opnieuw het configuratiebestand aanpassen. Dat kunnen we enkel door ons aan te melden als homeassistant gebruiker:
      pi@raspberrypi:~ $ sudo -u homeassistant -H -s
      homeassistant@raspberrypi:/home/pi $ cd
    25. We passen de configuratie aan met nano:
      homeassistant@raspberrypi:~ $ nano ~/.homeassistant/configuration.yaml
      En voegen de volgende regels toe:
      mqtt:
        sensor:
          - name: "Temperatuur Raspberry Pi"
            state_topic: "mcp9808/temp"
            device_class: temperature
            unit_of_measurement: "°C"
    26. Sla de aanpassing op, controleer de configuratie en herstart Home Assistant om de sensor in het Overzicht weer te geven.
    27. Daar we klaar zijn met het configureren van Home Assistant, kunnen we terug afmelden:
      homeassistant@raspberrypi:~ $ exit
      exit
  19. Tasmota WiFi schakelaar toevoegen aan Home Assistant.
    1. Daarvoor gebruiken we terug MQTT. Externe apparaten (zoals draadloze schakelaars en sensoren) kunnen uit veiligheidsoverwegingen standaard geen contact maken met onze Mosquito MQTT server. We geven de toestemming door in het configuratiebestand met nano:
      pi@raspberrypi:~ $ sudo nano /etc/mosquitto/mosquitto.conf
      De volgende regels achteraan toe te voegen:
      listener 1883 0.0.0.0
      allow_anonymous true
    2. Na het opslaan en afsluiten van nano, herstarten we de Mosquito MQTT server:
      pi@raspberrypi:~ $ sudo systemctl restart mosquitto.service
    3. Je kunt naar alle MQTT berichten luisteren, met de volgende opdracht:
      pi@raspberrypi:~ $ mosquitto_sub -h localhost -v -t "#"
      tele/tasmota_15D8A8/LWT Online
      tasmota/discovery/F4CFA215D8A8/config {"ip":"192.168.129.40","dn":"Tasmota","fn":["Tasmota",null,null,null,null,null,null,null],"hn":"tasmota-15D8A8-6312","mac":"F4CFA215D8A8","md":"Sonoff Basic","ty":0,"if":0,"ofln":"Offline","onln":"Online","state":["OFF","ON","TOGGLE","HOLD"],"sw":"13.3.0","t":"tasmota_15D8A8","ft":"%prefix%/%topic%/","tp":["cmnd","stat","tele"],"rl":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"swc":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],"swn":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"btn":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"so":{"4":0,"11":0,"13":0,"17":0,"20":0,"30":0,"68":0,"73":0,"82":0,"114":0,"117":0},"lk":0,"lt_st":0,"bat":0,"dslp":0,"sho":[],"sht":[],"ver":1}
      tasmota/discovery/F4CFA215D8A8/sensors {"sn":{"Time":"2024-01-09T17:45:08"},"ver":1}
      mcp9808/temp 29.5
    4. En als je een Tasmota (of ander apparaat) aan de Mosquito MQTT server (broker) op de Raspberry Pi hebt gekoppeld, verschijnen alle berichten op het scherm.
    5. Om een Tasmota schakelaar aan onze MQTT Broker te koppelen, klik je op de webpagina van de Tasmota schakelaar op de knop . Daarna op de knop . Bij Host() vul je het IP adres van onze Mosquito MQTT Broker in (onze Raspberry Pi). Aangezien we geen MQTT gebruiker en wachtwoord hebben ingesteld, mag je de velden User en Password wissen. Klik op de knop waardoor het Tasmota apparaat herstart om de aangepaste instellingen te activeren.
    6. Het enige wat ons nu nog te doen staat is het toevoegen van de Tasmota schakelaar aan Home Assistant. Activeer daarvoor op de Home Assistant webpagina het onderdeel Instellingen.
    7. Open het onderdeel Apparaten & diensten.
    8. Klik op de knop .
    9. Zoek naar tasmota.
    10. Klik op het item Tasmota.
    11. Klik in het dialoogvenster met de vraag Wil je Tasmota instellen? op de knop .
    12. Klik in het dialoogvenster met Gelukt! op de knop .
    13. In het onderdeel Overzicht vind je nu de Tasmota schakelaar en kan je hem bedienen.
      Home Assistant
  20. Zoals alle software en systemen, moet je HomeAssistant regelmatig opwaarderen (updaten). Let op dit kan lang duren en heeft veel schijfruimte nodig (zeker niet uitvoeren op een SD-kaart van 8GB):
    sudo -u homeassistant -H -s
    source /srv/homeassistant/bin/activate
    pip3 install --upgrade homeassistant
  21. Home Assistant lijkt in het begin moeilijk, maar is zeer veelzijdig. Door zijn hoge populariteit vind je enorm veel instructie video's op het internet. Daarnaast bestaan er ook veel geschreven stap voor stap handleiding. En misschien de belangrijkste bron van informatie kan je vinden op de webpagina van Home Assistant zelf. Veel succes.
  22. Tijd voor een andere domotica-controller. Home Assistant is een modern voorbeeld, zowel qua vormgeving als qua techniek. Domoticz is een conservatiever voorbeeld. Domoticz bestaat al veel langer dan Home Assistant en is dus volwassener. Op het eerste zicht lijkt Domotics eenvoudiger om mee te werken, maar hoe meer je wilt, hoe complexer het wordt. Dit is vooral te wijten aan de mengelmoes van gebruikte technieken.
    1. Voor we van start gaan met Domoticz stoppen we Home Assistant met de opdracht:
      pi@raspberrypi:~ $ sudo systemctl stop home-assistant@homeassistant.service
    2. Home Assistant schakel je bij het opstarten van de Raspberry Pi uit met:
      pi@raspberrypi:~ $ sudo systemctl disable home-assistant@homeassistant.service
      Removed "/etc/systemd/system/multi-user.target.wants/home-assistant@homeassistant.service".
      Je kunt Home Assistant volledig van de SD kaart verwijderen met de opdracht:
      pi@raspberrypi:~ $ sudo rm -r /home/homeassistant
    3. Download en installeer de software:
      pi@raspberrypi:~ $ sudo bash -c "$(curl -sSfL https://install.domoticz.com)"
    4. Volg de richtlijnen van de installatie-assistent.
  23. Daarna maken we de GPIO pinnen voor Domoticz toegankelijk. Voeg daarvoor als systeembeheerder met de teksteditor
    pi@raspberrypi:~ $ sudo nano /etc/init.d/domoticz.sh
    De volgende inhoud toe aan het einde van het opstartscript /etc/init.d/domoticz.sh:
    echo 12 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio12/direction
    echo 8 > /sys/class/gpio/export
    echo in > /sys/class/gpio/gpio8/direction
    echo 1 > /sys/class/gpio/gpio8/active_low
    Regel 1 en 3 maken Domoticz duidelijk dat we GPIO12 en GPIO8 gebruiken. Regel 2 maakt Domoticz duidelijk dat we GPIO12 als uitgang gebruiken voor de LED. Regel 4 zorgt dat we GPIO8 in Domoticz gebruiken om de stand van de drukknop door te geven.
  24. Domoticz bedien en configureer je met een webpagina.
    1. Surf op de Raspberry Pi naar http://localhost:8080 of vanaf een ander apparaat naar http://raspberrypi.local:8080. Je moet je aanmelden met de standaard gebruikersnaam admin met het wachtwoord domoticz. Automatisch wordt je doorgestuurd naar het Dashboard van Domoticz. Dit is een startpagina die je zelf kunt samenstellen.
    2. Bovenaan rechts op de webpagina staan menuknoppen met pictogrammen. Indien deze knoppen geen tekst bevatten, maak je het venster breder om de knopnamen zichtbaar te maken.
    3. We beginnen met de instellingen die je kunt bereiken via het menu Setup met het pictogram met een moersleutel en schroevendraaier. Selecteer in het vervolgmenu Settings.
    4. Verander de taal (Language) naar Nederlands (Dutch).
    5. De locatie gegevens zijn nodig voor het berekenen van de zonsopgang en -ondergang. De breedtegraad (Latitude) en lengtegraad (Longitude) zijn de coördinaten van uw woonplaats de je via een dialoogvenster (koppeling Here) kunt bepalen. Bepaal de locatie van uw woonplaats en vul deze in. Om de instellingen toe te passen, klik je op de knop Apply Settings.
    6. Om het wachtwoord aan te passen open je het vervolgmenu Instellingen en selecteer je Mijn profiel. Geef het oude (standaard) wachtwoord in en tweemaal het nieuwe wachtwoord. Dit moet je zeker doen als je van plan bent Domoticz te gebruiken. Als je Domoticz ook buiten jouw eigen lokale netwerk wilt bedienen, bijvoorbeeld via het internet op verplaatsing, heb je een MyDomoticz account nodig.
  25. Laten we ook nu weer beginnen met de LED.
    1. Eerst en vooral moeten we Domoticz vertellen welke domotica hardware we gebruiken. Dit is in ons geval de GPIO poort van de Raspberry Pi. De voorbereidingen hebben we in het opstartscript al uitgevoerd. Om Domoticz daarvan op de hoogte te brengen, open je het menu Instellingen en activeer je de pagina Hardware.
    2. Geef de toe te voegen hardware een Naam (bijvoorbeeld: GPIO Raspberry Pi). Het Type hardware wordt in ons geval Generic sysfs GPIO. De Gegevens Timeout is voor onze toepassing van geen belang.
    3. Voeg de pas ingestelde hardware toe door op de knop Toevoegen te klikken. Deze wordt dan in de hardwarelijst weergeven van waaruit je geselecteerde hardware kunt aanpassen en verwijderen.
    4. Nu kan je de LED aangesloten op GPIO12 in Domoticz aansturen. Activeer via Instellingen de pagina Apparaten. Om onze LED toe te voegen, klik je in de regel met Unit 12 (GPIO12) op de groene ronde knop met het pijltje (Apparaat toevoegen).
    5. Geef de Lamp de Naam LED.
    6. Klik op de knop Apparaat toevoegen om de LED schakelaar aan de pagina met lampen toe te voegen.
    7. Activeer de pagina Schakelaars.
    8. Domoticz meldt dat de LED Uit staat. Klik in het LED paneel op het picogram met de lamp om de LED aan en terug uit te zetten. Via de Log-knop kom je te weten wanneer de LED heeft gebrand. Met de knop Terug keer je terug naar de pagina met de lampen.
    9. Met de knop Aanpassen kan je de werking van de LED aanpassen.
    10. Met de knop Timers kan je bepalen wanneer de lamp in- en uitgeschakeld wordt (bijvoorbeeld voor tuinverlichting).
    11. Met de knop Notificaties kan je meldingen instellen bij het in- of uitschakelen van de LED.
    12. Door op het ster pictogram te klikken, voeg je de LED toe aan de Dashboard pagina waardoor je deze van daaruit kunt bedienen. Doen en testen.
  26. Dan is het nu de beurt aan onze drukknop.
    1. Activeer de pagina Apparaten. Om de drukknop toe te voegen, klik je in de regel van GPIO8 op de groene ronde knop met het pijltje. Deze keer geef je de schakelaar de naam Drukknop.
    2. Activeer de pagina Schakelaars.
    3. Druk de drukknop een tijdje in en laat deze daarna terug los. Na een tijdje wordt eerst toestand Dicht en daarna de toestand Open weergegeven. De Domoticz webpagina zal de drukknop pas als gesloten weergeven (opmerken) als je langdurig op de drukknop drukt.
  27. Nu willen we natuurlijk dat als we de drukknop indrukken, de LED oplicht.
    1. Daarvoor selecteer je in het menu Instellingen in het submenu Meer opties de pagina Gebeurtenissen. Op deze pagina kan je scripts schrijven die een actie uitvoeren bij het voorkomen van een gebeurtenis (event).
    2. Maak een nieuwe gebeurtenis van het type (scripttaal) Blockly.
    3. Activeer de optie met de Aan knop.
    4. Geef de gebeurtenis een naam: LED aan.
    5. Bij Trigger (webpagina desnoods breder maken om alle onderdelen zichtbaar te maken) selecteer je de soort gebeurtenis waarop gereageerd moet worden, in ons geval een gebeurtenis afkomstig van het domotica apparaat (Device) Drukknop.
    6. De grafische programmeeromgeving is bedoeld om het zo eenvoudig mogelijk te houden, maar dit maakt het allemaal nogal omslachtig. Sleep vanuit de groep Control de Als-Dan (bovenste If Do) structuur naar het middelste paneel.
    7. Vanuit de groep Logic sleep je het onderdeel om twee onderdelen te vergelijken (bovenste pictogram) tot het past in het If gedeelte (je hoort een klik als het past).
    8. We moeten de toestand van de drukknop nagaan. Sleep uit de groep Devices > Switches het A-F pictogram naar het eerste gaatje van de vergelijking. Zorg dat Drukknop achter A-F staat (vervolgkeuzelijst).
    9. Sleep uit de groep Logic het derde pictogram met de toestand On naar het tweede gaatje van de vergelijking. Verander met de vervolgkeuzelijst de toestand On naar Closed. De toestand waarin de drukknop zich bevindt, kan je weergeven door terwijl je op de drukknop drukt op de knop Show current states te klikken.
    10. Voor het Do gedeelte van de If Do structuur ga je op dezelfde manier te werk. Het volledige script wordt:
      Blockly Domoticz script
    11. In mensentaal: als de drukknop ingedrukt wordt, moet de LED ingeschakeld worden. Klik op de knop Opslaan om het script op te slaan.
    12. Druk op de drukknop om het script te testen, de LED moet oplichten.
    13. Herhaal deze werkwijze om de LED uit te schakelen als je niet op de drukknop drukt.
    14. Test uw aanpassingen.
  28. Nu willen we de LED na 10 minuten automatisch uitschakelen (traphal situatie).
    1. Pas het script LED Aan als volgt aan:
      Blockly Tmer script
    2. Dit aanpaste script zorgt dat de LED 10 minuten oplicht en dan automatisch terug wordt uitgeschakeld. Bij het testen (handiger met 1 minuut vertraging) merk je al vlug dat dit niet werkt. De LED wordt direct bij het loslaten van de drukknop uitgeschakeld. Dit komt door het script dat je schreef voor het uitschakelen van de LED. Met andere woorden, deactiveer dit script met de knop en het script LED Aan werkt perfect.
  29. De 1-Wire en I2C temperatuursensor gaan we via MQTT aan Domoticz toevoegen:
    1. We beginnen met de voorbereidingen in Domoticz:
      1. Activeer bij Instellingen de pagina Hardware.
      2. We voegen de Mosquito Broker toe met als

        Naam: Mosquito
        Type: MQTT Client Gateway with LAN interface
        Remote address:: 127.0.0.1
        Onderwerp IN voorvoegsel: domoticz/in
        Onderwerp UIT voorvoegsel: domoticz/out

        De rest van de instellingen mag je standaard laten staan. De Onderwerp IN en UIT voorvoegsels staan normaal ook al goed. Klik op de knop .
      3. Daarna maken we om MQTT berichten te verwerken op dezelfde manier MQTT Hardware toe met als

        Naam: MQTT
        Type: Dummy (Does nothing, use for virtual switches only)

        Domoticz Mosquito
      4. Nu kunnen we per MQTT bericht een virtuele sensor aanmaken. We beginnen met een Tasmota schakelaar door bij de MTTQ Dummy Hardware te klikken op de knop . Geef de virtuele sensor de Naam Tasmota en gebruik als Sensor Type Schakelaar.
      5. Maak een tweede virtuele sensor voor de I2C temperatuursensor met de Naam I2C Temperatuur en als Type Temperatuur.
      6. De laatste viruele sensor die je aanmaakt is voor de 1-Wire temperatuursensor en geef je de Naam 1-Wire Temperatuur en het Type Temperatuur.
      7. Controleer de aangemaakte virtuele sensoren bij Instellingen op de pagina Apparaten.
        Domoticz Virtual sensors
        Let op: de afbeelding hierboven toont reeds Data zoals temperaturen en Off, bij jullie komt deze data pas binnen na het koppelen van de sensoren en Tasmota schakelaar aan onze Mosquito MQTT Broker.
    2. Tijd om de sensoren, de Tasmota schakelaar en Domoticz via onze MQTT Broker te koppelen:
      1. Klik op de webpagina van de Tasmota schakelaar op de knop . Daarna op de knop . Bij Host() vul je het IP adres van onze Mosquito MQTT Broker in (onze Raspberry Pi). Aangezien we geen MQTT gebruiker en wachtwoord hebben ingesteld, mag je de velden User en Password wissen. Klik op de knop waardoor het Tasmota apparaat herstart om de aangepaste instellingen te activeren.
      2. Ga opnieuw naar en klik op . Voor een Tasmota schakelaar vul je bovenaan bij Idx 1 het Idx getal in dat je kunt terugvinden op de Apparaten pagina bij de Tasmota virtuele sensor in de derde kolom (3 in mijn voorbeeld, zie afbeelding). Klik op de knop .
    3. Om de I2C en 1-Wire temperatuursensor via MQTT aan Domoticz te koppelen, breiden we het script die we voor Home Assistant gebruikten uit.
      1. We breiden het MQTT script voor Home Assistant uit voor Domoticz:
        pi@raspberrypi:~ $ sudo nano /usr/sbin/mcp9808_mqtt.sh
        En passen het script aan tot:
        #!/bin/bash
        # mcp9808_mqtt.sh - send mcp9808 data to MQTT broker
        #
        
        # De temperatuur ophalen
        temp=$(cat /sys/bus/i2c/devices/1-0018/hwmon/hwmon3/temp1_input)
        # Omrekenen naar van m°C naar °C
        temp=$(echo "scale=1; $temp / 1000" | bc)
        # Temperatuur doorsturen naar MQTT Broker
        mosquitto_pub -h localhost -t mcp9808/temp -m "$temp"
        mosquitto_pub -h localhost -t domoticz/in -m '{"idx":4,"nvalue":0,"svalue":"'$temp'"}'
        
        # send ds18b20 data to MQTT broker
        #
        
        # De temperatuur ophalen
        temp=$(cat /sys/bus/w1/devices/28-*/w1_slave | tail -1 | awk -F 't=' '{ print$2 }')
        # Omrekenen naar van m°C naar °C
        temp=$(echo "scale=1; $temp / 1000" | bc)
        # Temperatuur doorsturen naar MQTT Broker
        mosquitto_pub -h localhost -t domoticz/in -m '{"idx":5,"nvalue":0,"svalue":"'$temp'"}'
        Bij de mosquitto_pub met het onderwerp (topic) domoticz/in moet de "idx":5 waarde overeenkomen met de Idx bij Apparaten in Domoticz. Meer info kan je vinden bij Domoticz MQTT webpagina.
      2. Na het opslaan zien we de temperaturen na een tijdje in Domoticz verschijnen.
  30. Na het plaatsen van alle onderdelen op het Dashboard (activeren van de sterren), krijg je het volgende Dashboard:
    Domoticz
  31. Afsluitende video over Domoticz:

Openbare reacties op deze pagina (kunnen door alle bezoekers gelezen worden)

, vrijdag 2 juni 2023 19:28