Domotica

Start dit hoofdstuk met een nieuwe reservekopie van de Basisimage.

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. openHAB en Domoticz behandelen we in de praktijkopdracht. Hoewel Home Assistant de populairste Domotica-controller voor de Raspberry Pi is, behandel ik deze niet meer in de cursus. Dit zijn mijn redenen:

Toch moet je bij je keuze zeker ook eens naar Home Assistant kijken.

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. OpenHAB biedt daarvoor een gratis service aan: myopenHAB.

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 7 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 (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. Hardware

    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.
    GPIO pinout
  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.
      GPIO pinout
    2. I2C temperatuursensor MCP9808
      GPIO pinout 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: no    pu | -- // GPIO2 = none
       3: no    pu | -- // GPIO3 = none
       4: no    pu | -- // GPIO4 = none
       5: no    pu | -- // GPIO5 = none
       6: no    pu | -- // GPIO6 = none
       7: no    pu | -- // GPIO7 = none
       8: no    pu | -- // GPIO8 = none
       9: no    pd | -- // GPIO9 = none
      10: no    pd | -- // GPIO10 = none
      11: no    pd | -- // GPIO11 = none
      12: no    pd | -- // GPIO12 = none
      13: no    pd | -- // GPIO13 = none
      14: no    pd | -- // GPIO14 = none
      15: no    pd | -- // GPIO15 = none
      16: no    pd | -- // GPIO16 = none
      17: no    pd | -- // GPIO17 = none
      18: no    pd | -- // GPIO18 = none
      19: no    pd | -- // GPIO19 = none
      20: no    pd | -- // GPIO20 = none
      21: no    pd | -- // GPIO21 = none
      22: no    pd | -- // GPIO22 = none
      23: no    pd | -- // GPIO23 = none
      24: no    pd | -- // GPIO24 = none
      25: no    pd | -- // GPIO25 = none
      26: no    pd | -- // GPIO26 = none
      27: no    pd | -- // GPIO27 = none
      28: ip    pd | lo // PCIE_RP1_WAKE/GPIO28 = input
      29: no    pu | hi // FAN_TACH/GPIO29 = none
      30: no    pu | -- // HOST_SDA/GPIO30 = none
      31: no    pu | -- // HOST_SCL/GPIO31 = none
      32: op dh pd | hi // ETH_RST_N/GPIO32 = output
      33: no    pd | lo // GPIO33 = none
      34: op dl pd | lo // CD0_IO0_MICCLK/GPIO34 = output
      35: no    pd | lo // CD0_IO0_MICDAT0/GPIO35 = none
      36: no    pd | lo // RP1_PCIE_CLKREQ_N/GPIO36 = none
      37: no    pd | lo // GPIO37 = none
      38: ip    pd | hi // CD0_SDA/GPIO38 = input
      39: ip    pd | hi // CD0_SCL/GPIO39 = input
      40: a2    pu | hi // CD1_SDA/GPIO40 = SDA4
      41: a2    pu | hi // CD1_SCL/GPIO41 = SCL4
      42: a2    pd | hi // USB_VBUS_EN/GPIO42 = VBUS_EN1
      43: a2    pu | hi // USB_OC_N/GPIO43 = VBUS_OC1
      44: op dh pd | hi // RP1_STAT_LED/GPIO44 = output
      45: op dl pd | lo // FAN_PWM/GPIO45 = output
      46: op dl pd | lo // CD1_IO0_MICCLK/GPIO46 = output
      47: no    pd | lo // 2712_WAKE/GPIO47 = none
      48: no    pd | lo // CD1_IO1_MICDAT1/GPIO48 = none
      49: op dh pd | hi // EN_MAX_USB_CUR/GPIO49 = output
      50: no    pd | -- // GPIO50 = none
      51: no    pd | -- // GPIO51 = none
      52: no    pu | -- // GPIO52 = none
      53: no    pu | hi // GPIO53 = none
      100: ip    pd | lo // GPIO0 = input
      101: op dh pu | hi // 2712_BOOT_CS_N/GPIO1 = output
      102: a6    pn | hi // 2712_BOOT_MISO/GPIO2 = VC_SPI0_MISO
      103: a5    pn | hi // 2712_BOOT_MOSI/GPIO3 = VC_SPI0_MOSI
      104: a6    pn | lo // 2712_BOOT_SCLK/GPIO4 = VC_SPI0_SCLK
      105: ip    pd | lo // GPIO5 = input
      106: ip    pd | lo // GPIO6 = input
      107: ip    pd | lo // GPIO7 = input
      108: ip    pd | lo // GPIO8 = input
      109: ip    pd | lo // GPIO9 = input
      110: ip    pd | lo // GPIO10 = input
      111: ip    pd | lo // GPIO11 = input
      112: ip    pd | lo // GPIO12 = input
      113: ip    pd | lo // GPIO13 = input
      114: a1    pd | lo // PCIE_SDA/GPIO14 = SPI_S_MOSI_OR_BSC_S_SDA
      115: a1    pd | lo // PCIE_SCL/GPIO15 = SPI_S_SCK_OR_BSC_S_SCL
      116: ip    pd | lo // GPIO16 = input
      117: ip    pd | lo // GPIO17 = input
      118: ip    pd | lo // GPIO18 = input
      119: ip    pd | lo // GPIO19 = input
      120: ip    pu | hi // PWR_GPIO/GPIO20 = input
      121: ip    pd | lo // 2712_G21_FS/GPIO21 = input
      122: ip    pd | lo // GPIO22 = input
      123: ip    pd | lo // GPIO23 = input
      124: a3    pn | lo // BT_RTS/GPIO24 = UART_RTS_0
      125: a4    pu | lo // BT_CTS/GPIO25 = UART_CTS_0
      126: a4    pn | hi // BT_TXD/GPIO26 = UART_TXD_0
      127: a4    pu | hi // BT_RXD/GPIO27 = UART_RXD_0
      128: op dh pd | hi // WL_ON/GPIO28 = output
      129: op dh pd | hi // BT_ON/GPIO29 = output
      130: a4    pn | lo // WIFI_SDIO_CLK/GPIO30 = SD2_CLK
      131: a4    pu | hi // WIFI_SDIO_CMD/GPIO31 = SD2_CMD
      132: a4    pd | hi // WIFI_SDIO_D0/GPIO32 = SD2_DAT0
      133: a3    pu | hi // WIFI_SDIO_D1/GPIO33 = SD2_DAT1
      134: a4    pn | hi // WIFI_SDIO_D2/GPIO34 = SD2_DAT2
      135: a3    pn | hi // WIFI_SDIO_D3/GPIO35 = SD2_DAT3
      200: ip    pd | hi // RP1_SDA/AON_GPIO0 = input
      201: ip    pd | hi // RP1_SCL/AON_GPIO1 = input
      202: op dh pd | hi // RP1_RUN/AON_GPIO2 = output
      203: op dl pd | lo // SD_IOVDD_SEL/AON_GPIO3 = output
      204: op dh pd | hi // SD_PWR_ON/AON_GPIO4 = output
      205: a6    pu | lo // SD_CDET_N/AON_GPIO5 = SD_CARD_PRES_G
      206: ip    pd | hi // SD_FLG_N/AON_GPIO6 = input
      207: ip    pd | lo // AON_GPIO7 = input
      208: ip    pd | lo // 2712_WAKE/AON_GPIO8 = input
      209: op dh pd | hi // 2712_STAT_LED/AON_GPIO9 = output
      210: ip    pd | lo // AON_GPIO10 = input
      211: ip    pd | lo // AON_GPIO11 = input
      212: ip    pd | lo // PMIC_INT/AON_GPIO12 = input
      213: a3    pu | hi // UART_TX_FS/AON_GPIO13 = VC_TXD0
      214: a3    pu | hi // UART_RX_FS/AON_GPIO14 = VC_RXD0
      215: ip    pd | lo // AON_GPIO15 = input
      216: ip    pu | hi // AON_GPIO16 = input
      232: a1    -- | hi // HDMI0_SCL/AON_SGPIO0 = HDMI_TX0_BSC_SCL
      233: a1    -- | hi // HDMI0_SDA/AON_SGPIO1 = HDMI_TX0_BSC_SDA
      234: a1    -- | hi // HDMI1_SCL/AON_SGPIO2 = HDMI_TX1_BSC_SCL
      235: a1    -- | hi // HDMI1_SDA/AON_SGPIO3 = HDMI_TX1_BSC_SDA
      236: a2    -- | hi // PMIC_SCL/AON_SGPIO4 = BSC_M2_SCL
      237: a2    -- | hi // PMIC_SDA/AON_SGPIO5 = BSC_M2_SDA
      Je merkt dat GPIO12 niet geconfigureerd is (none). De LED zal licht geven, als je de GPIO12 als uitgang hoog (binair 1) maakt. Je maakt van GPIO12 een uitgang (op - OutPut) met binaire waarde 1 (dh - Drive High):
      pi@raspberrypi:~ $ pinctrl set 12 op dh
      Controleer dit.
    3. De LED doof je door de GPIO 12 uitgang laag (dl - Drive Low) te maken:
      pi@raspberrypi:~ $ pinctrl set 12 op dl
    4. De werking van de drukknop kan je controleren door: GPIO 8 als ingang (Input, ip) met standaard hoge uitgang (Pull Up, pu) te configureren:
      pi@raspberrypi:~ $ pinctrl set 8 ip pu
      Daarna kunnen we de status van de drukknop opvragen:
      pi@raspberrypi:~ $ pinctrl get 8
        8: ip    pu | hi // GPIO8 = input
      Druk nu op de drukknop terwijl je de volgende opdracht uitvoert:
      pi@raspberrypi:~ $ pinctrl get 8
       8: ip    pu | lo // 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 Pi 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. Maak deze aan met de opdracht
      pi@raspberrypi:~ $ nano lichtschakelaar.sh
      Met de inhoud:

      #!/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 8 | grep -q " hi "
         if [ $? -eq 0 ]; then
           break
         fi
         sleep 1
       done
      }
      # Functie waarmee je wacht tot de drukknop wordt ingedrukt:
      wait_for_press () {
       while :
       do
         pinctrl get 8 | grep -q " lo "
         if [ $? -eq 0 ]; then
           break
         fi
         sleep 1
       done
      }
      # Hier begint ons programma
      # Initialiseer GPIO 8 als input met standaard hoog (pull up)
      pinctrl set 8 ip pu
      # 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

      Sla de programmacode op met de sneltoets Ctrl+x, daarna j, gevolgd door Return.

      Voor je dit script kunt uitvoeren, moet je het uitvoerbaar maken met de opdracht:
      pi@raspberrypi:~ $ chmod +x lichtschakelaar.sh
      Voer dit script uit met
      pi@raspberrypi:~ $ bash lichtschakelaar.sh
      Als dit script uitgevoerd wordt, wat moet je dan doen om de LED te laten oplichten? .....

      Om het script te beëindigen druk je Ctrl+c.

  4. 1-Wire en I²C

    Het Raspberry Pi OS bevat zeer veel stuurprogramma's (drivers), maar je moet ze wel activeren. Dit kan in het /boot/firmware/config.txt bestand. De gebruiksaanwijzing kan je online of lokaal op de Raspberry Pi raadplegen met de opdracht:
    pi@raspberrypi:~ $ nano /boot/overlays/README
    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/firmware/config.txt:
        pi@raspberrypi:~ $ sudo nano /boot/firmware/config.txt
        De volgende regel op het einde toe te voegen:
        dtoverlay=w1-gpio
        Deze regel werkt echter niet op een Raspberry Pi 5, daar gebruik je:
        dtoverlay=w1-gpio-pi5
      2. 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
      3. Herstart de Raspberry Pi om de aanpassingen te activeren.
      4. Nu moet je GPIO 4 als ingang met Pull Up configureren (waarschijnlijk is dit een fout in de drivers en is dit dus in de toekomst niet meer nodig):
        pi@raspberrypi:~ $ pinctrl set 4 ip pu
        pi@raspberrypi:~ $ pinctrl get 4
         4: ip    pu | hi // GPIO4 = input
      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-*/temperature 
        25062
        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/temperature). Dit laat toe meerdere 1-Wire sensoren op dezelfde GPIO pin aan te sluiten.
        De temperatuur wordt in de uitvoer weergegeven (25062) wat overeenkomt met 25,062 °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/firmware/config.txt:
        pi@raspberrypi:~ $ sudo nano /boot/firmware/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 
        32687
        De temperatuur wordt opnieuw weergegeven (32687) in m°C, wat overeenkomt met 32,687 °C. De afwijking 32,687 (MCP9808 meting) ten opzichte van 25,062 °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. Tasmota

    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.74/). 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.74/cm?cmnd=Power
      {"POWER":"OFF"}
      De schakelaar inschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.74/cm?cmnd=Power%20On
      {"POWER":"ON"}
      De schakelaar uitschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.74/cm?cmnd=Power%20Off
      {"POWER":"OFF"}
      De schakelaar omschakelen met:
      pi@raspberrypi:~ $ wget -qO- http://192.168.129.74/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. MQTT

    Om de gegevens van sensoren naar een domotica-controller te sturen, gaan we gebruik maken van MQTT. Daar MQTT een standaard is, ondersteunen zeer veel domotica (ook draadloze) sensoren, schakelaars, enz. MQTT. Al deze MQTT compatibele apparaten hebben een MQTT server (Broker) 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 2 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 (6.004 kB/s)         
      Voorheen niet geselecteerd pakket libdlt2:arm64 wordt geselecteerd.
      (Database wordt ingelezen ... 151626 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+deb12u12) ...
    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 scripts sturen we de gegevens van onze sensors door naar de MQTT server. Deze scripts plaatsen we in een map, die we aanmaken met:
      pi@raspberrypi:~ $ mkdir bin
      1. MQTT Drukknop
        1. Maak met de teksteditor nano het script voor de drukknop aan:
          pi@raspberrypi:~ $ nano bin/mqtt_drukknop.sh
          Met de volgende inhoud:

          #!/bin/bash
          # Stuur gpio 8 data (drukknop) naar de MQTT broker
          # Bij het opstarten is de drukknop niet actief
          power="OFF"
          # Drukknop aangelsoten op GPIO8
          gpio=8
          # Initialiseer de drukknop GPIO als input met standaard hoog (pull up)
          pinctrl set $gpio ip pu

          # Oneindig lang gaan we de stand van de drukknop opvragen
          # Breek het programma af met Ctrl+c
          while :
          do
          # Wacht tot de drukknop wordt ingedrukt
          while :
          do
            pinctrl get $gpio | grep -q " lo "
            if [ $? -eq 0 ]; then
              # Omschakelen
              if [ $power == "OFF" ]; then
                power="ON"
              else
                power="OFF"
              fi
              # Drukknop werd ingedrukt, verandering doorsturen naar MQTT Broker
              mosquitto_pub -h localhost -t stat/drukknop/POWER -m $power
              break;
            fi
            sleep 1
          done
          # Wacht tot de drukknop terug wordt losgelaten
          while :
          do
            pinctrl get $gpio | grep -q " hi "
            if [ $? -eq 0 ]; then
              break;
            fi
            sleep 1
           done
          done

        2. Na het opslaan en afsluiten van nano, maken we het script uitvoerbaar met:
          pi@raspberrypi:~ $ chmod +x bin/mqtt_drukknop.sh
        3. Om MQTT scripts te testen, heb je een tweede terminal nodig. Start een tweede terminal en voer de opdracht uit om alle ontvangen MQTT berichten weer te geven:
          pi@raspberrypi:~ $ mosquitto_sub -h localhost -v -t "#"
        4. In de eerste terminal start je het pas aangemaakte script:
          pi@raspberrypi:~ $ bin/mqtt_drukknop.sh
        5. Druk op de drukknop en in de tweede terminal verschijnt:
          stat/drukknop/POWER ON
          Let wel dat je de drukknop soms een tijdje moet indrukken, vanwege de sleep opdrachten. Deze sleep opdrachten zorgen ervoor dat de Raspberry Pi niet wordt overbelast bij het aftasten van de drukknop status.
        6. Laat de drukknop los en druk nogmaals op de drukknop. In de tweede terminal verschijnt:
          stat/drukknop/POWER OFF
          Hoewel we een drukcontact schakelaar (moment schakelaar) gebruiken, zorgt het script ervoor dat deze als een omschakelaar werkt.
        7. Om het drukknop script in de eerste terminal te stoppen, activeer je de eerste terminal en druk je op Ctrl+c. Stop ook het script in de tweede terminal.
      2. MQTT LED
        Voor de LED hebben we een MQTT ontvanger nodig die reageert op berichten van de domotica-controller. De LED moet namelijk oplichten/doven via deze domotica berichten.
        1. Maak met de teksteditor nano het script voor de LED aan:
          pi@raspberrypi:~ $ nano bin/mqtt_led.sh
          Met de volgende inhoud:

          #!/bin/bash
          # LED aangesloten op GPIO12
          gpio=12
          # Alleen luisteren naar berichten met het topic
          topic_name="stat/led/POWER/#"

          # Blijf constant luisteren
          while read message
          do
             # De volgende twee regels activeren om te testen
             timestamp=$(date)
             echo "$timestamp: $message"
             # Reageer op geldige berichten
             if [ $message == "ON" ]; then
               # LED laten oplichten
               pinctrl set $gpio op dh
             fi
             if [ $message == "OFF" ]; then
               # LED doven
               pinctrl set $gpio op dl
             fi
          # naar de MQTT berichten
          done < <(mosquitto_sub -t $topic_name)

        2. Na het opslaan en afsluiten van nano, maken we het script uitvoerbaar met:
          pi@raspberrypi:~ $ chmod +x bin/mqtt_led.sh
        3. Om dit script te testen hebben we opnieuw twee terminals nodig. In de eerste terminal starten we het te testen script:
          pi@raspberrypi:~ $ bin/mqtt_led.sh
        4. In de tweede terminal sturen we MQTT berichten waarop het te testen script moet reageren. De LED laat je oplichten met de MQTT bericht opdracht:
          pi@raspberrypi:~ $ mosquitto_pub -h localhost -t stat/led/POWER -m ON
          In de eerste terminal verschijnt een bericht:
          di 22 jul 2025 18:10:56 CEST: ON
          En de LED licht op.
        5. De LED kan je doven met de MQTT bericht opdracht:
          pi@raspberrypi:~ $ mosquitto_pub -h localhost -t stat/led/POWER -m OFF
          In de eerste terminal verschijnt het bericht:
          di 22 jul 2025 18:11:04 CEST: OFF
        6. Om het LED script in de eerste terminal te stoppen, activeer je de eerste terminal en druk je op Ctrl+c.
        7. Als het script naar behoren werkt, moeten de berichten in de terminal niet langer worden weergegeven. Deze dienen enkel om te zien script of het script goed werkt. Schakel de twee volgende regels uit door er commentaar regels van te maken:

             timestamp=$(date)
             echo "$timestamp: $message"

          M.a.w. zet er een # voor:

          #    timestamp=$(date)
          #    echo "$timestamp: $message"

        8. Om zeker te zijn, test je het script nogmaals. Nu mag alleen de LED zichtbaar reageren op de MQTT berichten.
      3. MQTT mcp9808
        Maak op een gelijkaardige manier het script om de temperatuur van de mcp9808 sensor uit te lezen en naar de MQTT broker te sturen.
        1. Het script noemen we mqtt_mcp9808.sh en maken we aan met nano:
          pi@raspberrypi:~ $ nano bin/mqtt_mcp9808.sh

          Met de volgende inhoud:

          #!/bin/bash
          # Stuur mcp9808 data naar de MQTT broker
          #
          while :
          do
           # 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"
           sleep 6
          done

        2. Na het opslaan en afsluiten van nano, maken we het script uitvoerbaar met:
          pi@raspberrypi:~ $ chmod +x bin/mqtt_mcp9808.sh
        3. Dit is terug een sensor. Met andere woorden test het nieuwe script zoals je dit deed bij de drukknop. Om de zes seconden, ontvangt de MQTT server een temperatuur bericht:
          mcp9808/temp 32.5
        4. Als dit werkt, kunnen we het doorsturen van de temperatuur tussen twee metingen verlengen tot 1 minuut of 60 seconden. M.a.w. pas de volgende regel

          sleep 6

          aan naar

          sleep 60

          Om zeker te zijn dat de aanpassing werkt, test je het script opnieuw.
      4. MQTT DS18B20
        1. Maak op een gelijkaardige manier het script om de temperatuur van de ds18b20 sensor uit te lezen en naar de MQTT broker te sturen.
          pi@raspberrypi:~ $ nano bin/mqtt_ds18b20.sh
          Met de volgende inhoud:

          #!/bin/bash
          # Stuur ds18b20 data naar de MQTT broker
          #
          # Initialiseer GPIO4
          pinctrl set 4 ip pu
          sleep 5
          while :
          do
           # De temperatuur ophalen
           temp=$(cat /sys/bus/w1/devices/28-*/temperature)
           # 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 ds18b20/temp -m "$temp"
           sleep 60
          done

        2. Maak het script uitvoerbaar en test het.
          ds18b20/temp 25.1
      5. MQTT Tasmota
        Externe apparaten (zoals draadloze schakelaars en sensoren) kunnen uit veiligheidsoverwegingen standaard geen contact maken met onze Mosquito MQTT server.
        1. 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.74","dn":"Tasmota","fn":["Tasmota",null,null,null,null,null,null,null],"hn":"tasmota-15D8A8-6312","mac":"F4CFA215D8A8","md":"Sonoff Basic","ty":0,"if":0,"cam":0,"ofln":"Offline","onln":"Online","state":["OFF","ON","TOGGLE","HOLD"],"sw":"15.0.1","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,-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,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":"2025-07-25T16:59:10"},"ver":1}
        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, surf je naar de webpagina van de Tasmota schakelaar
          1. Klik op de knop .
          2. Daarna op de knop .
          3. Plaats een vinkje bij de optie MQTT enable.
          4. Klik op de knop Save en laat de Tasmota schakelaar herstarten.
          5. Klik op de knop .
          6. Daarna op de knop .
          7. Bij Host() vul je het IP adres van onze Mosquito MQTT Broker in (onze Raspberry Pi).
          8. Aangezien we geen MQTT gebruiker en wachtwoord hebben ingesteld, mag je de velden User en Password wissen.
          9. Klik op de knop waardoor het Tasmota apparaat herstart om de aangepaste instellingen te activeren.
            Tasmota MQTT
            Opgelet: bij het (her)starten van een Tasmota apparaat kan het zeer lang duren (tot 24 uur) voor deze terug aan de WiFi van je router wordt gekoppeld. Blijkbaar reageren vooral moderne routers (Vb: Proximus-Box 4 - glasvezel) slecht op de aanvraag van stroombesparende IOT apparaten. Uiteindelijk krijgen ze wel een verbinding.
            De LED op het Tasmota apparaat blijft knipperen (foutmelding) zolang de WiFi verbinding niet is hersteld, maar ook tot de MQTT server correct reageert.
            M.a.w. controleer via een webbrowser de WiFi verbinding naar het Tasmota apparaat, zorg dat de MQTT server gestart is en correct werkt. Indien aan deze twee voorwaarden voldaan is en de LED blijft knipperen, controleer dan de MQTT instellingen van het Tasmota apparaat en de MQTT Broker. Herstart voor de zekerheid ook de Raspberry Pi.
      6. MQTT MP3 speler
        Het geluidssysteem van de Raspberry Pi werkt enkel voor de gewone gebruiker (standaard en dus meestal pi). Waardoor de meeste domotica software met een eigen gebruiker geen audio kunnen afspelen. Software die werkt met verschillende gebruikers is namelijk veel veiliger. We moeten dus alle geluidsopdrachten laten uitvoeren door de gewone gebruiker.
        1. Zorg dat er geluid kan afgespeeld worden via de Raspberry Pi: zie het hoofdstuk Musicbox.
        2. Moderne besturingssystemen starten het geluidssysteem en bijhorende hardware pas op als er geluid is. Dit is efficiënt naar energiegebruik en systeembelasting, maar zorgt wel voor het wegvallen van het eerste stukje geluid. M.a.w. zorg voor een wat langer geluidsfragment, liefst beginnend met een aanzwellend geluidsvolume. Een MP3 bestand met een alarmsignaal downloaden en naar de map $HOME/Music verplaatsen kan je met bijvoorbeeld de volgende opdracht:

          pi@raspberrypi:~ $ wget --output-document=$HOME/Music/burglar.mp3 https://partofthething.com/thoughts/wp-content/uploads/2016/08/burglar.mp3
          --2025-08-09 15:52:52--  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: ‘/home/pi/Music/burglar.mp3’
          
          /home/pi/Music/burglar.mp3   100%[==============================================>]   2,37M  1,93MB/s    in 1,2s    
          
          2025-08-09 15:52:54 (1,93 MB/s) - '‘/home/pi/Music/burglar.mp3’' opgeslagen [2489578/2489578]
          
          
        3. Maak het volgende script om een MP3 bestand af te spelen:
          pi@raspberrypi:~ $ nano bin/mqtt_mp3.sh

          Met de volgende inhoud:

          #!/bin/bash
          # MP3 bestand afspelen
          # Alleen luisteren naar berichten met het topic
          topic_name="sound/play/MP3/#"
           
          # Blijf constant luisteren
          while read message
          do
             # De volgende twee regels activeren om te testen
             timestamp=$(date)
             echo "$timestamp: $message"
             # Reageer op geldige berichten
             if test -f $message; then
               # Speel het bestand af
               paplay $message
             fi
          # naar de MQTT berichten
          done < <(mosquitto_sub -t $topic_name)

        4. Maak het uitvoerbaar:
          pi@raspberrypi:~ $ chmod +x bin/mqtt_mp3.sh
      7. MQTT autostart
        Het enige wat ons nu nog te doen staat is het automatisch starten van de MQTT scripts bij het opstarten van de Raspberry Pi.
        1. Om het te laten uitvoeren door de gebruiker pi, maak je de volgende autostart map aan:
          pi@raspberrypi:~ $ mkdir -p ~/.config/systemd/user/
        2. Om de MQTT scripts op de achtergrond als server (service) uit te voeren, maken we het volgende systeembestand aan:
          pi@raspberrypi:~ $ nano ~/.config/systemd/user/mqtt_autostart_@.service

          Met de volgende inhoud:

          [Unit]
          Description=Running Bash MQTT Scripts for %I
          After=mosquitto.service
          StartLimitIntervalSec=60
          StartLimitBurst=5
          [Service]
          Type=simple
          ExecStart=/home/pi/bin/mqtt_%i.sh
          Restart=on-failure
          [Install]
          WantedBy=default.target

        3. Elk MQTT script kunnen we nu starten met een systemd start opdracht. De volgende systemd opdracht start ons MQTT drukknop script:
          pi@raspberrypi:~ $ systemctl --user start mqtt_autostart_@drukknop.service

          Om het drukknop MQTT script met de bestandsnaam mqtt_drukknop.sh te starten, heeft de systemd service enkel het gedeelte drukknop uit de bestandsnaam nodig. De rest is voor de systemd service reeds bekend: pad (map): /home/pi/bin/ (pas pi aan als je niet de standaard gebruiker hebt ingesteld), bestandsnaam begint met mqtt_ en eindigt op .sh (zie regel ExecStart=/usr/sbin/mqtt_%i.sh). M.a.w. drukknop is het enige wat ontbreekt en geven we mee na het @-teken.

          Controleer met de volgende opdracht of het MQTT script goed gestart is.

          pi@raspberrypi:~ $ systemctl --user status mqtt_autostart_@drukknop.service
          mqtt_autostart_@drukknop.service - Running Bash MQTT Scripts for drukknop
              Loaded: loaded (/home/pi/.config/systemd/user/mqtt_autostart_@.service; disabled; preset: enabled)
              Active: active (running) since Sat 2025-08-09 16:26:15 CEST; 2min 15s ago
            Main PID: 13433 (mqtt_drukknop.s)
               Tasks: 2 (limit: 4761)
                 CPU: 497ms
              CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/app-mqtt_autostart_.slice/mqtt_autostart_@drukknop.service
                      ├─13433 /bin/bash /usr/sbin/mqtt_drukknop.sh
                      └─13862 sleep 1

          aug 09 16:26:15 raspberrypi systemd[992]: Started mqtt_autostart_@drukknop.service - Running Bash MQTT Scripts for drukknop.

          Breek deze opdracht indien nodig af met de toets q (Quit) en start de Mosquito opdracht om te ontvangen berichten te controleren. Test of het indrukken van de drukknop de gewenste MQTT berichten aflevert.

          Als alles werkt, kan je het script automatisch starten bij het starten van de Raspberry Pi:

          pi@raspberrypi:~ $ systemctl --user enable mqtt_autostart_@drukknop.service
          Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@drukknop.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.

          Als laatste test herstart je de Raspberry Pi en test je of het indrukken van de drukknop de gewenste MQTT berichten aflevert.

        4. Zorg dat ook de MQTT script voor de led, mcp9808 en ds18b20 automatisch opstarten.
          pi@raspberrypi:~ $ systemctl --user enable mqtt_autostart_@led.service
          Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@led.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.
          pi@raspberrypi:~ $ systemctl --user enable mqtt_autostart_@mcp9808.service
          Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@mcp9808.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.
          pi@raspberrypi:~ $ systemctl --user enable mqtt_autostart_@ds18b20.service
          Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@ds18b20.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.
        5. Enkel de MQTT MP3 speler moeten we nog testen. Start de systemd MQTT MP3 dienst:
          pi@raspberrypi:~ $ systemctl --user start mqtt_autostart_@mp3.service

          Test de MQTT MP3 ontvanger door het volgende MQTT bericht te sturen:

          pi@raspberrypi:~ $ mosquitto_pub -h localhost -t sound/play/MP3 -m $HOME/Music/burglar.mp3

          Het alarmsignaal moet nu te horen zijn. Je kunt het afspelen onderbreken met de opdracht:

          pi@raspberrypi:~ $ killall paplay

          Als dit werkt, mag de MQTT MP3 ontvanger automatisch starten:

          pi@raspberrypi:~ $ systemctl --user enable mqtt_autostart_@mp3.service
          Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@mp3.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.
          
          Test na het herstarten of alle MQTT scripts goed werken.
  7. OpenHAB

    1. OpenHAB installeren
      OpenHAB is geschreven in JAVA. We moeten dus eerst zorgen dat we JAVA programma's kunnen uitvoeren. Daarvoor installeer je een Java Runtime Environment (JRE). De standaard JRE van Raspberry Pi OS (Debian Bookworm) installeer je met
      pi@raspberrypi:~ $ sudo apt install default-jre
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar 
      Het volgende pakket is automatisch geïnstalleerd en is niet langer nodig:
        python3-v4l2
      Gebruik 'sudo apt autoremove' om het te verwijderen.
      De volgende extra pakketten zullen geïnstalleerd worden:
        ca-certificates-java default-jre-headless fonts-dejavu-extra java-common libatk-wrapper-java
        libatk-wrapper-java-jni libxxf86dga1 openjdk-17-jre openjdk-17-jre-headless x11-utils
      Voorgestelde pakketten:
        fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei | fonts-wqy-zenhei fonts-indic mesa-utils
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
        ca-certificates-java default-jre default-jre-headless fonts-dejavu-extra java-common libatk-wrapper-java
        libatk-wrapper-java-jni libxxf86dga1 openjdk-17-jre openjdk-17-jre-headless x11-utils
      0 opgewaardeerd, 11 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
      Er moeten 45,3 MB aan archieven opgehaald worden.
      Na deze bewerking zal er 203 MB extra schijfruimte gebruikt worden.
      Wilt u doorgaan? [J/n] 
      Ophalen:1 http://deb.debian.org/debian bookworm/main arm64 ca-certificates-java all 20230710~deb12u1 [11,9 kB]
      Ophalen:2 http://deb.debian.org/debian bookworm/main arm64 java-common all 0.74 [6.388 B]
      Ophalen:3 http://deb.debian.org/debian-security bookworm-security/main arm64 openjdk-17-jre-headless arm64 17.0.16+8-1~deb12u1 [42,8 MB]
      ...
      Ophalen:9 http://deb.debian.org/debian bookworm/main arm64 x11-utils arm64 7.7+5 [196 kB]
      Ophalen:10 http://deb.debian.org/debian bookworm/main arm64 libatk-wrapper-java all 0.40.0-3 [63,4 kB]
      Ophalen:11 http://deb.debian.org/debian bookworm/main arm64 libatk-wrapper-java-jni arm64 0.40.0-3 [49,4 kB]
      45,3 MB opgehaald in 5s (8.424 kB/s)                
      Voorheen niet geselecteerd pakket ca-certificates-java wordt geselecteerd.
      (Database wordt ingelezen ... 149902 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../00-ca-certificates-java_20230710~deb12u1_all.deb wordt voorbereid...
      Bezig met uitpakken van ca-certificates-java (20230710~deb12u1) ...
      ...
      Voorheen niet geselecteerd pakket libatk-wrapper-java-jni:arm64 wordt geselecteerd.
      Uitpakken van .../10-libatk-wrapper-java-jni_0.40.0-3_arm64.deb wordt voorbereid...
      Bezig met uitpakken van libatk-wrapper-java-jni:arm64 (0.40.0-3) ...
      Instellen van java-common (0.74) ...
      Instellen van libxxf86dga1:arm64 (2:1.1.5-1) ...
      Instellen van fonts-dejavu-extra (2.37-6) ...
      Instellen van x11-utils (7.7+5) ...
      Instellen van libatk-wrapper-java (0.40.0-3) ...
      Instellen van ca-certificates-java (20230710~deb12u1) ...
      No JRE found. Skipping Java certificates setup.
      Instellen van libatk-wrapper-java-jni:arm64 (0.40.0-3) ...
      Instellen van openjdk-17-jre-headless:arm64 (17.0.16+8-1~deb12u1) ...
      update-alternatives: /usr/lib/jvm/java-17-openjdk-arm64/bin/java wordt gebruikt om in de automatische modus in /usr/bin/java (java) te voorzien
      update-alternatives: /usr/lib/jvm/java-17-openjdk-arm64/bin/jpackage wordt gebruikt om in de automatische modus in /usr/bin/jpackage (jpackage) te voorzien
      update-alternatives: /usr/lib/jvm/java-17-openjdk-arm64/bin/keytool wordt gebruikt om in de automatische modus in /usr/bin/keytool (keytool) te voorzien
      update-alternatives: /usr/lib/jvm/java-17-openjdk-arm64/bin/rmiregistry wordt gebruikt om in de automatische modus in /usr/bin/rmiregistry (rmiregistry) te voorzien
      update-alternatives: /usr/lib/jvm/java-17-openjdk-arm64/lib/jexec wordt gebruikt om in de automatische modus in /usr/bin/jexec (jexec) te voorzien
      Bezig met afhandelen van triggers voor hicolor-icon-theme (0.17-2) ...
      Bezig met afhandelen van triggers voor gnome-menus (3.36.0-1.1) ...
      Bezig met afhandelen van triggers voor libc-bin (2.36-9+rpt2+deb12u12) ...
      ...
      Bezig met afhandelen van triggers voor fontconfig (2.14.1-4) ...
      Bezig met afhandelen van triggers voor desktop-file-utils (0.26-1) ...
      Bezig met afhandelen van triggers voor ca-certificates-java (20230710~deb12u1) ...
      Adding debian:ACCVRAIZ1.pem
      Adding debian:AC_RAIZ_FNMT-RCM.pem
      Adding debian:AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.pem
      ...
      Adding debian:vTrus_ECC_Root_CA.pem
      Adding debian:vTrus_Root_CA.pem
      Adding debian:XRamp_Global_CA_Root.pem
      done.
      Instellen van openjdk-17-jre:arm64 (17.0.16+8-1~deb12u1) ...
      Instellen van default-jre-headless (2:1.17-74) ...
      Instellen van default-jre (2:1.17-74) ...
      Uit de meldingen die voorbij flitsen, kan je afleiden dat openjdk-17-jre werd geïnstalleerd. Maar als je de vereisten (Requirements) voor openHAB 5 in de online installatie handleiding leest, heb je minstens Java 21 nodig. Geen paniek, oudere (Archived) versies (openHAB 4.3 gebruikt Java 17) kan je blijven installeren. Debian Trixie bevat standaard Java 21 maar is nog niet in Raspberry Pi OS opgenomen. M.a.w. hou de Raspberry Pi OS versies in het oog.

      openHAB wordt aangeboden in een speciaal daarvoor ingerichte softwarebron die je aan Raspberry Pi OS moet toevoegen. Eerst halen we de beveiligingssleutel op:

      pi@raspberrypi:~ $ curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor > openhab.gpg
      Deze nemen we op in het Raspberry Pi OS besturingssysteem met de volgende drie opdrachten:
      pi@raspberrypi:~ $ sudo mkdir /usr/share/keyrings
      mkdir: kan map ‘/usr/share/keyrings’ niet aanmaken: Bestand bestaat al
      pi@raspberrypi:~ $ sudo mv openhab.gpg /usr/share/keyrings
      pi@raspberrypi:~ $ sudo chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg
      De eerste opdracht mislukte omdat de map reeds bestond. Ik volg de handleiding, waarin dit ook vermeld staat.

      Dan kunnen we nu de stabiele (Official/Stable) openHAB softwarebron activeren:

      pi@raspberrypi:~ $ echo 'deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main' | sudo tee /etc/apt/sources.list.d/openhab.list
      deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main
      
      Vervolgens synchroniseren we de beschikbare lijst met softwarepakketten:
      pi@raspberrypi:~ $ sudo apt-get update
      Geraakt:1 http://deb.debian.org/debian bookworm InRelease
      Geraakt:2 http://deb.debian.org/debian-security bookworm-security InRelease                                        
      Geraakt:3 http://deb.debian.org/debian bookworm-updates InRelease                                                  
      Ophalen:4 http://archive.raspberrypi.com/debian bookworm InRelease [55,0 kB]                                       
      Ophalen:5 http://archive.raspberrypi.com/debian bookworm/main armhf Packages [555 kB]                 
      Ophalen:6 https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable InRelease [12,8 kB]
      Ophalen:7 https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable/main armhf Packages [7.413 B]
      Ophalen:8 https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable/main arm64 Packages [7.413 B]
      637 kB opgehaald in 1s (715 kB/s)
      Pakketlijsten worden ingelezen... Klaar
      En kunnen we een lijst met stabiele openHAB versies opvragen:

      pi@raspberrypi:~ $ apt list -a openhab
      Bezig met oplijsten... Klaar
      openhab/stable,stable 5.0.0-1 all
      openhab/stable,stable 4.3.6-1 all
      openhab/stable,stable 4.3.5-1 all
      ...
      openhab/stable,stable 3.0.2-1 all
      openhab/stable,stable 3.0.1-2 all
      openhab/stable,stable 3.0.0-1 all

      Daaruit blijkt dat de laatste versie van openHAB die nog werkt op Raspberry Pi OS Bookworm, versie 4.3.6-1 is. Deze openHAB versie installeer je met:

      pi@raspberrypi:~ $ sudo apt install openhab=4.3.6-1
      Pakketlijsten worden ingelezen... Klaar
      Boom van vereisten wordt opgebouwd... Klaar
      De statusinformatie wordt gelezen... Klaar  
      Het volgende pakket is automatisch geïnstalleerd en is niet langer nodig:
       python3-v4l2
      Gebruik 'sudo apt autoremove' om het te verwijderen.
      De volgende NIEUWE pakketten zullen geïnstalleerd worden:
       openhab
      0 opgewaardeerd, 1 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
      Er moeten 111 MB aan archieven opgehaald worden.
      Na deze bewerking zal er 123 MB extra schijfruimte gebruikt worden.
      Ophalen:1 https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable/main arm64 openhab all 4.3.6-1 [111 MB]
      111 MB opgehaald in 13s (8.291 kB/s)                                                                                
      Voorheen niet geselecteerd pakket openhab wordt geselecteerd.
      (Database wordt ingelezen ... 150339 bestanden en mappen momenteel geïnstalleerd.)
      Uitpakken van .../openhab_4.3.6-1_all.deb wordt voorbereid...
      Bezig met uitpakken van openhab (4.3.6-1) ...
      Instellen van openhab (4.3.6-1) ...
      [openHAB] Please use the following commands to launch openHAB on a system restart.
                 sudo /bin/systemctl daemon-reload
                 sudo /bin/systemctl enable openhab.service

      [openHAB] You can start openHAB manually by executing the command:
                 sudo /bin/systemctl start openhab.service

      Om te voorkomen dat bij elke upgrade openHAB naar een hogere versie wordt opgewaardeerd (zal toch telkens mislukken), kan je dit indien gewenst (maar niet verplicht) blokkeren met:
      pi@raspberrypi:~ $ sudo apt-mark hold openhab
      openhab is ingesteld op te handhaven.
      Handig om te weten:

      Heb je bij het leren werken met openHAB teveel onherstelbare fouten gemaakt (al doende leer je, ook van de fouten), begin dan helemaal opnieuw door openHAB te resetten. Je kunt openHAB resetten door de volgende pakketten te verwijderen:

      pi@raspberrypi:~ $ sudo apt purge openhab openhab-addons
      En openHAB opnieuw te installeren:
      pi@raspberrypi:~ $ sudo apt install openhab=4.3.6-1

      Start openHAB met de opdracht:

      pi@raspberrypi:~ $ sudo /bin/systemctl start openhab.service
      Controleer of openHAB goed werkt:

      pi@raspberrypi:~ $ sudo systemctl status openhab.service  
      openhab.service - openHAB - empowering the smart home
          Loaded: loaded (/lib/systemd/system/openhab.service; disabled; preset: enabled)
          Active: active (running) since Sat 2025-07-26 18:15:02 CEST; 5min ago
            Docs: https://www.openhab.org/docs/
                  https://community.openhab.org
        Main PID: 22169 (java)
           Tasks: 117 (limit: 4761)
             CPU: 1min 22.479s
          CGroup: /system.slice/openhab.service
                  └─22169 /usr/bin/java -XX:-UsePerfData -Dopenhab.home=/usr/share/openhab -Dopenhab.conf=/etc/openhab ->

      jul 26 18:15:02 raspberrypi systemd[1]: Started openhab.service - openHAB - empowering the smart home.

      Breek de opdracht af met de q toets.
      Activeer het automatisch opstarten van openHAB bij het opstarten van de Raspberry Pi:
      pi@raspberrypi:~ $ sudo systemctl enable openhab.service 
      Created symlink /etc/systemd/system/multi-user.target.wants/openhab.service → /lib/systemd/system/openhab.service.
    2. Zodra openHAB is geïnstalleerd en gestart, start je de gebruikersinterface door naar http://localhost:8080 te surfen. Vanaf een andere computer vervang je localhost door het adres of de hostnaam van de Raspberry Pi (vb: http://raspberrypi.local:8080).

      Eerst maak je een administrator account aan (zorg dat je de gebruikersnaam en bijhorende wachtwoord straks nog weet):
      openHAB account

      Nadat je een beheerdersgebruiker hebt aangemaakt, wordt je stapsgewijs door de eerste configuratie geleid. Begin met het instellen van jouw taal, regio en tijdzone.
      openHAB Regio
      Klik op de knop

      Je kunt nu jouw locatie instellen, of deze stap overslaan en later voltooien.
      openHAB Locatie
      De locatie gegevens zijn o.a. nodig voor het berekenen van de zonsopgang en -ondergang. De breedtegraad (Latitude) en lengtegraad (Longitude) zijn de coördinaten van jouw woonplaats die je via een kaart (Map) kunt instellen. Na het instellen van de locatie verschijnt de knop waarop je klikt om door te gaan.

      openHAB stelt voor om de Persistence uitbreidingen (add-ons) te installeren. Lees de getoonde informatie en beslis of je de add-on wenst.
      openHAB Persistence
      Laten we deze installeren.

      Je hebt nu de mogelijkheid om nog meer openHAB-add-ons te installeren. Het openHAB-systeem voert een automatische scan uit om domotica-apparatuur en -software op jouw Raspberry Pi en thuisnetwerk (LAN) te detecteren. Op basis van het scanresultaat worden aanbevolen add-ons voorgesteld om te installeren. Je kunt de lijst met add-ons aanpassen. Doe dit echter alleen als je al weet dat je specifieke add-ons nodig hebt (bijvoorbeeld als je een upgrade uitvoert vanaf een ouder openHAB-systeem). Of sla deze stap over als je de add-ons liever later afzonderlijk installeert. Je kunt add-ons altijd later installeren/verwijderen, zodat je jouw systeem in de loop van de tijd kunt aanpassen en verbeteren.
      openHAB add-ons
      Hoewel we straks de MQTT Binding nodig hebben, schakel je deze nu uit. Later tonen we hoe je een add-on kunt toevoegen. Klik op de knop .

      Wacht tot de add-ons geïnstalleerd zijn. Klaar. Klik op de koppeling Aan de slag.

    3. openHAB MQTT
      Daarstraks hebben we de MQTT Bindings niet geïnstalleerd, hoewel we die nodig hebben om onze sensoren en actuatoren aan openHAB te koppelen. Op de volgende manier voeg je de MQTT Bindings add-on (of andere) toe aan openHAB.

      Open in het linker paneel de categorie Instellingen en activeer het onderdeel Things.
      openHAB Things
      Elk domoticasysteem gebruikt een eigen woordenschat om zaken aan te duiden. Lees de informatie om te achterhalen wat Things in openHAB betekend. Klik onderaan rechts op ronde blauwe knop om de MQTT service toe te voegen.

      openHAB More bindings
      Klik op de knop .

      Opnieuw wordt een automatische scan uitgevoerd. Indien de MQTT Binding add-on niet wordt voorgesteld, vul je in het Search bindings tekstvak mqtt in.
      openHAB MQTT Binding
      Klik op de knop van de gevonden MQTT Binding add-on. Indien dit niet werkt, vernieuw je de webpagina (opnieuw laden met F5). Webbrowsers werken met een cache om sneller te werken, maar dit geeft als nadeel dat aanpassingen niet altijd werken.

      openHAB Install MQTT Binding
      Installeer de MQTT Binding ().

      Soms lijkt het dat de installatie blijft duren (draaiend pictogram), is deze na een tijdje klaar. Zichtbaar in de categorie Add-on Winkel. Dit is opnieuw te wijten aan de browser cache.
      openHAB Add-on Winkel

      Ga terug naar de pagina om een Thing toe te voegen (Instellingen > Things > + knop onderaan rechts).
      openHAB Things
      Om de MQTT Bindings te activeren, klik je op de Binding MQTT Binding.

      openHAB Bridge
      Om onze MQTT Broker met openHAB te verbinden, klik je op de knop van de MQTT Broker.

      Begin met het ingeven van een unieke ID (MQTTBroker) in één woord. Dit kan achteraf niet meer gewijzigd worden. Het label wordt automatisch aangevuld, hoewel je dit zelf kunt aanpassen. Daar we een MQTT Broker gebruiken zonder gebruiker en bijhorend wachtwoord moet je de optie Show advanced niet activeren. Nu nog enkel het MQTT Broker Hostname/IP veld invullen (localhost = MQTT Broker werkt op hetzelfde apparaat als openHAB).
      openHAB New MQTT Broker
      Klik op de knop Create Thing.

      Indien alle gegevens correct werden ingevoerd, verschijnt er een nieuw Thing met de naam MQTT Broker en deze moet ONLINE zijn, m.a.w. de MQTT Broker is verbonden met openHAB.
      openHAB MQTT Online

    4. openHAB LED
      Nu openHAB een verbinding heeft met de MQTT Broker kunnen ze berichten uitwisselen. We beginnen met het aansturen van de LED. M.a.w. openHAB stuurt berichten naar de MQTT Broker waardoor ze door ons script wordt verwerkt.

      Klik op de Things pagina op de + knop.
      openHAB Things
      Klik op de Binding MQTT Binding.

      openHAB Generetic MQTT Things
      Klik op het toe te voegen Thing Generic MQTT Thing (generic = zelf in te stellen).

      Geef de LED een uniek Thing ID (één woord): MQTTLED en een herkenbaar Label: MQTT LED.
      Klik op de Bridge en activeer de daarstraks gedefinieerde MQTT Broker (mqtt:broker:MQTTBoker).
      openHAB Things
      Klik op de knop .

      De MQTT LED verschijnt ONLINE op de Things pagina.
      openHAB Things
      Klik op MQTT LED Thing om deze in te stellen.

      Activeer het tabblad Channels.
      openHAB Things
      Klik op de knop Add Channel.

      Geef de Channel een uniek ID: MQTTLED en een herkenbaar Label: MQTT LED. Een beschrijving kan ook handig zijn, maar is niet verplicht.
      Het Channel type is in ons geval een On/Off Switch, het MQTT LED script schakelt de LED namelijk in of uit.
      Daar ons eenvoudig MQTT LED script geen toestand naar de MQTT Broker kan sturen, laten we de tekstveld MQTT State Topic leeg (lees ook steeds de begeleidende informatie bij de in te vullen velden).
      De MQTT Command topic is in ons geval (zie MQTT LED script) stat/led/POWER. Je kunt de nodige MQTT berichten ook nagaan via de opdracht mosquitto_sub -h localhost -v -t "#" waarmee je alle ontvangen MQTT berichten kunt weergeven.
      Het tekstveld Custom On/Open Value geef je de waarde ON en Custom Off/Closed Value de waarde OFF (zie MQTT LED script).
      openHAB Things
      Klik op de knop .

      De MQTT LED channel verschijnt op de pagina. Klik op de MQTT LED channel.
      openHAB Things
      Klik op Add Link to item....

      Activeer de optie Create a new Item.
      Geef het Item een unieke Name: MQTTLED en een herkenbaar Label: MQTT LED.
      Het type blijft Switch en als Category geef je (selecteer je) light. Het gaat hier namelijk om een lichtschakelaar. Dit bepaalt ook het pictogram.
      Het gaat nog steeds om een lichtschakelaar, waardoor je voor de Semantic Class de Switch en voor de Semantic Property een Light selecteert.
      openHAB Things
      Klik helemaal onderaan op de knop .

      De MQTT LED met lamp pictogram verschijnt op de pagina.
      Je kunt nu het MQTT LED Item testen. Klik daarvoor op het item MQTT LED.
      openHAB Things
      Klik op de weergave van de schakelaar (grijs met onderaan een witte bol) om de LED te laten oplichten.
      De schakelaar krijgt een oranje kleur en het pictogram van de lamp een gele kleur.
      Test eveneens of je de LED ook terug kunt uitschakelen. Indien dit niet werkt, controleer je naast de openHAB MQTT LED instellingen ook de status van onze mqtt_autostart_@led.service dienst:

      pi@raspberrypi:~ $ systemctl --user status mqtt_autostart_@led.service
      Desnoods herstart je de Raspberry Pi.
    5. openHAB drukknop
      Een drukknop is een sensor (invoer-apparaat) met twee toestanden (binair: aan of uit). Om deze aan openHAB toe te voegen, ga je als volgt te werk.

      Activeer de Things pagina en klik op de + knop om een Thing toe te voegen.

      Aangezien de drukknop eveneens via de MQTT Broker werkt, klik je op de MQTT Binding.

      Ga verder naar Generic MQTT Thing.

      Geef het drukknop Thing een uniek ID: MQTTDrukknop, een Label: MQTT Drukknop en selecteer als Bridge de MQTT Broker. Klik tenslotte op .

      Klik op de Things pagina op de MQTT Drukknop en activeer het tabblad Channels. Klik op de knop Add Channel.

      Geef het drukknop Channel een uniek ID: MQTTDrukknop en Label: MQTT Drukknop. Het Channel type wordt opnieuw een On/Off Switch waarbij het veld MQTT State Topic: stat/drukknop/POWER (ontvanger) wordt. De Custom On/Open Value is ON en Custom Off/Closed krijgt de waarde OFF. Klik op de knop .

      Open de MQTT Drukknop Channel en klik op Add Link to Item....

      Activeer de optie Create a new item. Geef het item de Name: MQTTDrukknop, het Label: MQTT Drukknop. Als Category geef (selecteer) je in switch. De Semantic Class wordt eveneens Switch. De Semantic Property blijft op None staan. Klik onderaan op de knop .

      Test de werking van de drukknop.

    6. openHAB mcp9808
      De MCP9808 meet de temperatuur, dus ook een sensor zoals de drukknop.
      Probeer zelf een MQTT MCP9808 item aan te maken en hou rekening met:

      Aangezien we van de MQTT Broker een getal terug krijgen, wordt het Channel Type een Number Value. Op de Link Channel to item pagina, kan je bij Dimension (eenheden) Temperature (°C) selecteren.

      Na het aanmaken van de Link, moet na een tijdje (slechts 1 meting per minuut) een getal verschijnen (temperatuur).
    7. openHAB DS18B20
      Herhaal de werkwijze om de 1-wire DS18B20 temperatuur sensor toe te voegen.
    8. openHAB Tasmota
      De volgende video toont hoe je te werk moet gaan om een Tasmota schakelaar toe te voegen. De video start pas bij de uitleg om de Tasmota schakelaar toe te voegen, maar kan wel teruggespoeld worden.
    9. openHAB Model

      Nu we verschillende sensors en actuatoren aan openHAB hebben toegevoegd, is het tijd om deze in groepen in te delen. Dit zorgt ook voor een gebruiksvriendelijker overzicht. In openHAB gebeurt dit via Model. Hoewel er verschillende methoden zijn om items in een Model te plaatsen (zie onderstaande video), toon ik er hier één van.

      Activeer bij de Instellingen het onderdeel Model. Nu worden alle items onder elkaar weergegeven.
      openHAB Model
      Eerst zorgen we voor een functionele indeling, bijvoorbeeld op basis van plaatsen in het huis. Zorg dat er geen enkel item geselecteerd is (klik op vrij gedeelte). Klik daarna in het rechter paneel op Add Location.

      Er verschijnt in het overzicht (middenpaneel) een (New Item) en in het rechter paneel een formulier. Geef het item een Name: Klaslokaal en een Label: Klaslokaal. Geef (en/of selecteer) bij Category: groundfloor.
      openHAB Model
      Scroll wat naar beneden en klik op de knop .

      Daar veel van de in dit voorbeeld gebruikte items op onze Raspberry Pi zijn aangesloten, gaan we in de locatie Klaslokaal een sublocatie aanmaken. Zorg dat Klaslokaal geselecteerd is.
      openHAB Model
      En klik op Add Location

      Geef het item een Name: Raspberrypi en een Label: Raspberry Pi. We laten de Category leeg, m.a.w. je hoeft niet altijd een Category te selecteren. OpenHab laat ook toe om nieuwe Categorieën aan te maken. Let ook op keuzelijst Parent Groups, daar staat Klaslokaal, want we hadden deze locatie op voorhand geselecteerd. De Parent Groups zorgt ervoor dat dit item in de locatie Klaslokaal zal terecht komen.
      openHAB Model
      Klik op de knop . Klik op de driehoek voor de locatie Klaslokaal om de onderliggende locaties weer te geven.

      Om de sensors, actuators en andere items naar een locatie te verplaatsen, selecteer je een item, bijvoorbeeld MQTT Drukknop.
      openHAB Model
      Klik in het rechter paneel op ⌄ Edit.

      openHAB Model
      Scroll in het rechter paneel wat naar beneden en klik bij Parent Groups op Select.

      Selecteer de locatie waarin je het item wilt plaatsen: Raspberry Pi.
      openHAB Model
      Klik rechts bovenaan op Sluiten (rood woord).

      Nu je een Parents Groups hebt toegewezen, verschijnt onderaan een Save knop.
      openHAB Model
      Klik op de knop .

      Plaats de items MQTT DS18B20, MQTT LED en MQTT MCP9808 in de locatie Raspberry Pi.
      MQTT Tasmota plaats je in de locatie Klaslokaal. Dit wordt het resultaat:
      openHAB Model

      Om het uiteindelijke resultaat te bewonderen, klik je in het linker paneel bovenaan op het openHAB logo. Je komt nu terecht in het lege Overzicht. Activeer onderaan de categorie Locaties
      openHAB Overzicht
      Mocht je geen of niet alle locaties zien, vergeet dan niet de webpagina eens te vernieuwen (opnieuw laden met F5). Webbrowsers werken met een cache om sneller te werken, maar dit geeft als nadeel dat aanpassingen niet altijd worden weergegeven. Klik op de locatie Raspberry Pi om alle items in deze locatie weer te geven.

      openHAB Overzicht
      De de toestand van de sensoren op deze locatie kan je hier bekijken, maar ook de aanwezige actuatoren (MQTT LED) bedienen.

      Deze locatie sluit je bovenaan rechts met de x knop. Onderstaande video toont hoe je met het onderdeel Model in openHAB werkt.

      Je kunt nog veel verder gaan in het opmaken van de structuur en lay-out. Maar neem zeker in het begin niet teveel hooi op de vork. Ter info: de volgende video:

    10. openHAB Rules
      Tot nu toe hebben we openHAB via Things met apparaten verbonden, de apparaten met Items gemodelleerd en hoe je een display kunt bouwen om je huis te bedienen. Maar dat alles komt neer op huisbediening, niet op automatisering. Om huisautomatisering te creëren, moeten we gedragingen definiëren. In openHAB worden gedragingen gedefinieerd met behulp van Rules (regels). Bijna alles wat je maar kunt bedenken, kan worden gedaan, zolang je maar een relevante gebeurtenis hebt om het te starten en toegang hebt tot de gegevens die nodig zijn om te beslissen wat er moet gebeuren.

      openHAB is een gebeurtenisgestuurd (events) systeem. Dat betekent dat wanneer er een gebeurtenis plaatsvindt, delen van openHAB die op die gebeurtenis letten, kunnen reageren. Sommige regels worden geactiveerd wanneer een gebeurtenis waarbij een item verandert plaatsvindt, om bepaald gedrag te creëren.

      Het gewenste gedrag is bijvoorbeeld dat een lamp (in ons voorbeeld weergegeven door het item MQTT LED) wordt ingeschakeld wanneer er op een knop wordt gedrukt (in ons voorbeeld weergegeven door het item MQTT Drukknop). Om dit gedrag te creëren, kunnen we een regel maken die wordt geactiveerd wanneer het item MQTT Drukknop omschakelt van OFF naar ON, waarna het commando ON naar het item MQTT LED wordt verzonden.

      Activeer bij de Instellingen het onderdeel Rules. Klik rechts onderaan op de om een regel toe te voegen. Geef de regel een unieke Rule ID: LichtAan en een veelzeggend Label: Licht Aan.
      openHAB Rules
      Klik op Add Trigger (gebeurtenis waarop gereageerd moet worden).

      Onze drukknop is een Item, m.a.w. klik op Item Event. Open de locatie Klaslokaal en daarna Raspberry Pi (zie Model). Selecteer het item MQTT Drukknop.
      openHAB Rules
      Klik bovenaan rechts op Pick.

      Activeer de optie changed en geef het invulveld from state de waarde OFF. Het invulveld to state krijgt de waarde ON. M.a.w. als de toestand van de drukknop verandert van OFF naar ON, moet er iets gebeuren.
      openHAB Rules
      Klik rechts bovenaan op Save.

      Klik op Add Action (wat moet er dan gebeuren). Onze lamp (LED) is een Item, m.a.w. klik op Item Action. Open de locatie Klaslokaal en daarna Raspberry Pi. Selecteer het item MQTT LED.

      Klik bovenaan rechts op Pick. Activeer de optie send a command en activeer de optie ON.
      openHAB Rules
      Klik rechts bovenaan op Save.

      Dit is het resultaat:
      openHAB Rules
      Klik rechts bovenaan op Save (Ctrl-S) om de regel aan te maken.

      openHAB Rules
      Je kunt actie testen door op de blauwe holle pijl te klikken. De LED moet nu oplichten. De regel zelf test je door pagina met Locaties (via openHAB logo links bovenaan) te activeren. Open de locatie Raspberry Pi. Schakel de MQTT LED uit en zorg dat de MQTT Drukknop op OFF staat. Druk nu op de drukknop tot de waarde van de drukknop naar ON verandert. De regel zal ervoor zorgen dat daardoor de LED automatisch oplicht.
      openHAB Rules

      Een tweede regel is nodig om MQTT LED met de MQTT Drukknop terug uit te schakelen. Maak deze regel nu zelf aan. Dit wordt het.
      openHAB Rules
      Test de nieuwe regel en pas deze desnoods aan tot ze werkt Let daarbij goed op de toestand van de MQTT Drukknop (ON/OFF) en de MQTT LED.

    11. openHAB Scripts

      Om energie te besparen, worden lampen soms automatisch na een bepaalde tijd uitgeschakeld (denk aan de verlichting in de traphal van een appartement). Om dit in openHAB te verwezenlijken, gaan we een script schrijven.

      Activeer bij de Instellingen het onderdeel Scripts. Klik rechts onderaan op de om een script toe te voegen. Geef het script een uniek Script ID: LichtTraphal en een veelzeggend Label: Licht Traphal. Activeer de optie Design with Blockly.
      openHAB Scripts
      Klik helemaal onderaan de pagina op de knop .

      Na een tijdje verschijnt een grafische programmeeromgeving.
      openHAB Scripts
      De grafische programmeeromgeving is bedoeld om het zo eenvoudig mogelijk te houden, maar dit maakt het allemaal nogal omslachtig. Sleep vanuit de groep Items & Things de send command ... to ... structuur naar het rechter paneel.

      Pas de value aan naar ON.
      Pas het item Myitem aan naar MQTTLED.

      Sleep vanuit de groep Timers & Delay het blok wait for .... ms naar het rechter paneel tot juist onder de send command ON to MQTTLED structuur. Deze groep klikt vast aan de send command structuur.

      Voeg daaronder terug een send command .... to .... toe en pas deze aan om de MQTTLED uit te schakelen.
      openHAB Scripts
      Klik rechts bovenaan op Save (Ctrl-S). Om het script te testen, kan je onderaan klikken op Run Now (Ctrl-R). De LED licht dan 1 seconde (= 1000 ms) op.

      Als het script werkt, kan je de duurtijd aanpassen naar 3 minuten (3 * 60 * 1000 = 180000 ms). Vergeet niet op te slaan.

      Dit script moet uitgevoerd worden als er op de drukknop wordt gedrukt. Activeer daarvoor het onderdeel Rules
      Klik op de regel Licht Aan.
      Klik op de actie send command ON to MQTTLED.
      Klik op Then (staat nu uiterst rechts op verstuur een commando).
      Activeer de optie uitvoeren van scènes, scripts & rules.
      Klik op Scenes, scripts & rules.
      Activeer het script Licht Traphal en klik rechts bovenaan op Sluiten.
      openHAB Scripts
      Klik rechts bovenaan op Save.
      openHAB Scripts
      Sla de aangepaste regel op door rechts bovenaan te klikken op Save (Ctrl-S). En test de werking van de aangepaste regel.

      Je zult merken, dat je bij het drukken op de drukknop binnen de 3 minuten van het script de LED dooft door de regel LED Uit. Daarenboven blijft de toestand van de drukknop op ON staan, waardoor je tweemaal op de drukknop moet drukken om het licht opnieuw aan te zetten. M.a.w. de drukknop die nu werkt als een Aan/Uit schakelaar moet werken als een contact schakelaar. M.a.w. elke druk op de drukknop moet zorgen dat het licht 3 minuten blijft branden, daarna moet de drukknop terug de toestand OFF krijgen.

      Eerst schakel je in het onderdeel Rules de regel Licht Uit door op de pauze knop (Disable (Ctrl-D)) te klikken.
      openHAB Rules
      Vergeet niet op te slaan. Je kunt ook ongebruikte regels verwijderen, maar doe dit pas als je zeker weet dat de nieuwe automatisatie goed werkt. Gepauzeerde regels kan je later terug activeren, als je de oude automatisatie opnieuw wilt gebruiken. Na de testperiode mag je niet vergeten de niet langer noodzakelijke regels te verwijderen. Zo hou je een beter overzicht.

      Om van de drukknop een contact schakelaar te maken, voeg je de regel Licht Aan een trigger toe waardoor het licht ook wordt ingeschakeld bij het veranderen van de drukknop toestand van ON naar OFF.
      openHAB Rules

      Bij het testen kan je in het logboek volgen wat er in openHAB gebeurt. Om de meldingen in het logboek te volgen, start je in het Onwikkelgereedschap de Log Viewer.
      openHAB Log Viewer

      We waarderen onze drukknop op naar een alarmschakelaar. Vanzelfsprekend zou je de drukknop kunnen vervangen door een bewegingssensor (PIR) of een andere inbraakdetectieschakelaar. Daarbij moet een alarmsignaal afgaan. We gebruiken daarvoor een MP3 bestand die we eerder gedownload hebben om de MQTT MP3 speler te maken.

      Activeer de Things pagina en klik op de + knop om een Thing toe te voegen.

      Aangezien de MP3 speler eveneens via de MQTT Broker werkt, klik je op de MQTT Binding.

      Ga verder naar Generic MQTT Thing.

      Geef de MP3 speler Thing een uniek ID: MQTTPlayMP3, een Label: MQTT Play MP3 en selecteer als Bridge de MQTT Broker. Klik tenslotte op .

      Klik op de Things pagina op de MQTT Play MP3 en activeer het tabblad Channels. Klik op de knop Add Channel.

      Geef het MQTT Play MP3 Channel een uniek ID: MQTTPlayMP3 en Label: MQTT Play MP3. Het Channel type wordt Text Value (sturen in tekstvorm een pad en bestandsnaam) waarbij het veld MQTT Command Topic: sound/play/MP3 (zender) wordt. Klik op de knop .

      Open de MQTT Play MP3 Channel en klik op Add Link to Item....

      Activeer de optie Create a new item. Geef het item de Name: MQTTPlayMP3, het Label: MQTT Play MP3. Als Category geef (selecteer) je in Alarm. De Semantic Class wordt eveneens Alarm. De Semantic Property mag Noise worden. De Direct Parent Groups wordt Raspberrypi, het geluid wordt door de Raspberry Pi afgespeeld. Klik onderaan op de knop .

    12. Zorg dat je het script Licht Traphal kunt aanpassen. Pas het script aan tot:
      openHAB Scripts
      Sla de aanpassing op en test deze. Je kunt het volume regelen via de volumeregelaar in het systeemvak van de Raspberry Pi.

    13. OpenHAB lijkt in het begin moeilijk, maar is zeer veelzijdig. Door zijn populariteit vind je 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 openHAB zelf. Veel succes.
  8. Domoticz

    Tijd voor een andere domotica-controller. Hoewel ze ongeveer gelijktijdig ontstonden Domoticz in 2012 en openHAB in 2011 verschillen ze door de gebruikte programmeertaal zowel qua vormgeving als qua techniek. Op het eerste zicht lijkt Domoticz 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. Domoticz installeren:
      1. Voor we van start gaan met Domoticz stoppen we openHAB met de opdracht:
        pi@raspberrypi:~ $ sudo systemctl stop openhab.service
      2. openHAB schakel je bij het opstarten van de Raspberry Pi uit met:
        pi@raspberrypi:~ $ sudo systemctl disable openhab.service
          Removed "/etc/systemd/system/multi-user.target.wants/openhab.service".
      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, gebruik daarbij de standaard voorgestelde instellingen.
    2. Domoticz bedien en configureer je met een webpagina.
      1. Surf op de Raspberry Pi naar http://localhost:8080 of http://127.0.0.1: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.
    3. Laten we ook nu weer beginnen met het aansturen de LED via MQTT berichten. We beginnen met het koppelen van de Mosquito (zie Mosquito server installeren) MQTT server aan Domoticz:
      1. Activeer bij Instellingen de pagina Hardware.
      2. We voegen de Mosquito Broker toe met als

        Naam: MQTT Broker
        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 . Deze wordt dan bovenaan de pagina in de hardwarelijst weergeven van waaruit je geselecteerde hardware kunt aanpassen en verwijderen.
        Domoticz Mosquito
      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 Hardware
      4. Nu kunnen we voor het LED MQTT bericht een virtuele sensor aanmaken. Klik bij de MQTT Dummy Hardware op de knop . Geef de virtuele sensor de Naam MQTT LED en gebruik als Sensor Type Schakelaar.
      5. Activeer bij Instellingen de pagina Apparaten.
        Domoticz Apparaten
      6. Om te achterhalen welk MQTT bericht Domoticz stuurt als je het licht in- of uitschakelt, voer je de volgende opdracht uit:
        pi@raspberrypi:~ $ mosquitto_sub -h localhost -v -t "domoticz/#"
        Om het licht om te schakelen, klik je in Domoticz op de pagina met de Apparaten op het lamp pictogram van de regel MQTT LED. Bij het inschakelen verschijnt bij de mosquito_sub opdracht:
        domoticz/out {
                "Battery" : 255,
                "LastUpdate" : "2025-08-11 17:50:39",
                "RSSI" : 12,
                "description" : "",
                "dtype" : "Light/Switch",
                "hwid" : "3",
                "id" : "00014051",
                "idx" : 1,
                "name" : "MQTT LED",
                "nvalue" : 1,
                "org_hwid" : "3",
                "stype" : "Switch",
                "svalue1" : "0",
                "switchType" : "On/Off",
                "unit" : 1
        }
        En bij het uitschakelen:
        domoticz/out {
                "Battery" : 255,
                "LastUpdate" : "2025-08-11 17:50:41",
                "RSSI" : 12,
                "description" : "",
                "dtype" : "Light/Switch",
                "hwid" : "3",
                "id" : "00014051",
                "idx" : 1,
                "name" : "MQTT LED",
                "nvalue" : 0,
                "org_hwid" : "3",
                "stype" : "Switch",
                "svalue1" : "0",
                "switchType" : "On/Off",
                "unit" : 1
        }
        
        Domoticz gebruikt voor MQTT communicatie JSON, een courante methode om gegevens te transporteren. Het enige verschil in de bovenstaande JSON berichten is de waarde "nvalue" : 0, of "nvalue" : 1,. Druk Ctrl+c om de mosquito_sub opdracht af te breken.
      7. Daarmee weten we genoeg om een MQTT ontvanger script voor Domoticz te schrijven:
        pi@raspberrypi:~ $ nano bin/mqtt_domoticz.sh
        Met de volgende inhoud:

        #!/bin/bash
        # LED aangesloten op GPIO12
        gpio=12

        # Alleen luisteren naar berichten van Domoticz
        topic_name="domoticz/out/#"

        # Blijf constant luisteren
        while read message
        do
           # Activeer de volgende twee regels om te testen
        #    timestamp=$(date)
        #    echo "$timestamp: $message"

           if [ "$message" == "{" ]; then
             # initialiseer JSON bericht
             json=$message
           else # Vul JSON bericht verder aan
             json+=$message
             if [ "$message" == "}" ]; then
               # Einde JSON bericht: verwerken
               # Tekstwaarde van name opzoeken
               name=$(echo $json | grep -o '"name" : "[^"]*' | grep -o '[^"]*$')
               if [ "$name" == "MQTT LED" ]; then
                 # Numerieke waarde van nvalue opzoeken
                 nvalue=$(echo $json | grep -o '"nvalue" : [^,]*' | grep -Eo '[0-9]+$')
                 if [ $nvalue == "1" ]; then
                   # LED laten oplichten
                   pinctrl set $gpio op dh
                 elif [ $nvalue == "0" ]; then
                   # LED doven
                   pinctrl set $gpio op dl
                 fi
               fi
             fi
           fi
        # naar de MQTT berichten
        done < <(mosquitto_sub -t $topic_name)

        Maak het script uitvoerbaar:

        pi@raspberrypi:~ $ chmod +x bin/mqtt_domoticz.sh

        Test het script met de opdracht:

        pi@raspberrypi:~ $ bin/mqtt_domoticz.sh

        Schakel in Domoticz het licht aan en terug uit en controleer of de LED oplicht en terug dooft. Breek het mqtt_domoticz.sh script af met Ctrl+c.

        Start het mqtt_domoticz.sh automatisch met de opdracht:

        pi@raspberrypi:~ $ systemctl --user enable --now mqtt_autostart_@domoticz.service
        Created symlink /home/pi/.config/systemd/user/default.target.wants/mqtt_autostart_@domoticz.service → /home/pi/.config/systemd/user/mqtt_autostart_@.service.

        Dankzij de optie --now werd het script ook gestart. Test dit door opnieuw in Domotizc de LED om te schakelen.

    4. Om de drukknop aan Domoticz toe te voegen, gaan we op dezelfde manier te werk:
      1. Activeer via Instellingen de Hardware pagina.
      2. Klik op de knop van de MQTT hardware:

        Naam: MQTT Drukknop
        Sensor Type: Schakelaar

      3. Activeer bij Instellingen de pagina Apparaten.
        Domoticz Apparaten
      4. Je kunt de werking testen door de volgende opdracht uit te voeren, zorg er wel voor dat idx waarde overeenkomt met de waarde in de Domoticz tabel (zie afbeelding):
        pi@raspberrypi:~ $ mosquitto_pub -h localhost -t "domoticz/in" -m '{"command": "switchlight", "idx": 2, "switchcmd": "On" }'
        In de Data kolom van de MQTT Drukknop moet On verschijnen. Dit kan je ook waarnemen op de pagina met de Schakelaars.
        Domoticz Schakelaars
        De opdracht met het MQTT bericht om de drukknop uit te schakelen is:
        pi@raspberrypi:~ $ mosquitto_pub -h localhost -t "domoticz/in" -m '{"command": "switchlight", "idx": 2, "switchcmd": "Off" }'
      5. De volgende stap bestaat uit het aanpassen van ons mqtt_drukknop.sh script om de drukknop toestand ook naar Domoticz te sturen:
        pi@raspberrypi:~ $ nano bin/mqtt_drukknop.sh
        Dit wordt het aangepaste script:

        #!/bin/bash
        # Stuur gpio 8 data (drukknop) naar de MQTT broker
        # Bij het opstarten is de drukknop niet actief
        power="OFF"
        # Drukknop aangelsoten op GPIO8
        gpio=8
        # Initialiseer de drukknop GPIO als input met standaard hoog (pull up)
        pinctrl set $gpio ip pu
        # Domoticz Apparaat Idx waarde
        idx=2

        # Oneindig lang gaan we de stand van de drukknop opvragen
        # Breek het programma af met Ctrl+c
        while :
        do
        # Wacht tot de drukknop wordt ingedrukt
        while :
        do
          pinctrl get $gpio | grep -q " lo "
          if [ $? -eq 0 ]; then
            # Omschakelen
            if [ $power == "OFF" ]; then
              power="ON"
              mosquitto_pub -h localhost -t "domoticz/in" -m '{"command": "switchlight", "idx": '$idx', "switchcmd": "On" }'
            else
              power="OFF"
              mosquitto_pub -h localhost -t "domoticz/in" -m '{"command": "switchlight", "idx": '$idx', "switchcmd": "Off" }'
            fi
            # Drukknop werd ingedrukt, verandering doorsturen naar MQTT Broker
            mosquitto_pub -h localhost -t stat/drukknop/POWER -m $power
            break;
          fi
          sleep 1
        done
        # Wacht tot de drukknop terug wordt losgelaten
        while :
        do
          pinctrl get $gpio | grep -q " hi "
          if [ $? -eq 0 ]; then
            break;
          fi
          sleep 1
         done
        done

        Herstart het aangepaste script om deze te activeren:

        pi@raspberrypi:~ $ systemctl --user restart mqtt_autostart_@drukknop.service

        Controleer of Domoticz reageert op het indrukken van de drukknop.

      6. Je kunt op de pagina Schakelaars de Drukknop een ander pictogram geven via de knop . Pas de optie Schakelaar type bijvoorbeeld aan naar Contact. En bevestig de aanpassing met de knop .
    5. Nu willen we natuurlijk dat als we de drukknop indrukken, de LED oplicht.
      1. Eerst moeten we de verschillende toestanden (states) van de drukknop nagaan. Dit kan via het menu Instellingen op de pagina Apparaten. De toestand kan je vinden in de kolom Data van de Drukknop. Bij mij krijgt de Drukknop de toestand Open indien de drukknop is uitgeschakeld. Wanneer de drukknop is ingeschakeld, heeft die bij mij de toestand Closed.
      2. Daarna 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).
      3. Maak een nieuwe gebeurtenis ( tabbladknop) van het type (scripttaal) Blockly.
      4. Activeer de optie met de Aan knop.
      5. Geef de gebeurtenis een naam: LED aan.
      6. 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.
      7. 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.
      8. 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).
      9. We moeten de toestand van de drukknop nagaan. Sleep uit de groep Devices > Switches het M-R pictogram naar het eerste gaatje van de vergelijking. Zorg dat Drukknop achter M-R staat (vervolgkeuzelijst).
      10. 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.
      11. Voor het Do gedeelte van de If Do structuur ga je op dezelfde manier te werk. Het volledige script wordt:
        Blockly Domoticz script
      12. In mensentaal: als de drukknop wordt ingeschakeld, moet de LED ingeschakeld worden. Klik op de knop Opslaan om het script op te slaan.
      13. Druk op de drukknop om het script te testen (afhankelijk van de begintoestand van de drukknop, moet je soms een tweede keer drukken), de LED moet oplichten.
      14. Herhaal deze werkwijze om de LED uit te schakelen als de drukknop wordt uitgeschakeld.
      15. Test de aanpassingen.
    6. 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 is het handiger met 1 minuut vertraging te werken. Al vlug merk je dat je daarna de drukknop tweemaal moet indrukken om de LED te doen oplichten, de drukknop toestand blijft namelijk op Closed staan. Om de LED bij elke omschakeling 10 minuten te laten oplichten, moet je ook het script LED uit aanpassen om de LED 10 minuten te laten oplichten.
    7. De Tasmota schakelaar, 1-Wire en I2C temperatuursensor gaan we eveneens via MQTT aan Domoticz koppelen:
      1. We beginnen met de voorbereidingen in Domoticz:
        1. Activeer bij Instellingen de pagina Hardware.
        2. 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.
        3. Maak een tweede virtuele sensor voor de I2C temperatuursensor met de Naam I2C Temperatuur en als Type Temperatuur.
        4. 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.
        5. Controleer de aangemaakte virtuele sensoren bij Instellingen op de pagina Apparaten.
          Domoticz Virtual sensors
          Let op: De kolom Data zal pas van waarden voorzien worden na het koppelen van de sensoren en de 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 .
        2. Indien de knop niet aanwezig is, voer je de volgende bewerkingen uit:
          1. Daarna op de knop .
          2. Plaats een vinkje bij de optie MQTT enable.
          3. Klik op de knop Save en laat de Tasmota schakelaar herstarten.
        3. Klik op 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.
        4. 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 de MQTT scripts voor Home Assistant (zie Gegevens ophalen en doorsturen naar de MQTT server) uit voor Domoticz:
          pi@raspberrypi:~ $ nano bin/mqtt_mcp9808.sh
          En passen het script aan tot:

          #!/bin/bash
          # Stuur mcp9808 data naar de MQTT broker
          #
          # Domoticz Apparaat Idx waarde
          idx=4

          while :
          do
           # 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"
           # Temperatuur doorsturen naar Domoticz
           mosquitto_pub -h localhost -t domoticz/in -m '{"idx":'$idx',"nvalue":0,"svalue":"'$temp'"}'
           sleep 60
          done

          Herstart het mqtt_mcp9808.sh:

          pi@raspberrypi:~ $ systemctl --user restart mqtt_autostart_@mcp9808.service
          En voor de 1-Wire temperatuur sensor:
          pi@raspberrypi:~ $ nano bin/mqtt_ds18b20.sh
          Passen we het script aan tot:

          #!/bin/bash
          # Stuur ds18b20 data naar de MQTT broker
          #
          # Domoticz Apparaat Idx waarde
          idx=5

          # Initialiseer GPIO4
          pinctrl set 4 ip pu
          sleep 6
          while :
          do
           # De temperatuur ophalen
           temp=$(cat /sys/bus/w1/devices/28-*/temperature)
           # 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 ds18b20/temp -m "$temp"
           # Temperatuur doorsturen naar Domoticz
           mosquitto_pub -h localhost -t domoticz/in -m '{"idx":'$idx',"nvalue":0,"svalue":"'$temp'"}'
           sleep 60
          done

          Herstart het mqtt_ds18b20.sh:

          pi@raspberrypi:~ $ systemctl --user restart mqtt_autostart_@ds18b20.service
          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 op de Domoticz MQTT webpagina.
        2. Na het opslaan zien we de temperaturen na een tijdje in Domoticz verschijnen.
    8. Om het jouw medebewoners gemakkelijker te maken kun je in Domoticz zelf een bedieningspaneel (dashboard) aanmaken.
      1. Activeer daarvoor de pagina Schakelaars.
      2. Domoticz meldt hier de toestand van de schakelaars. Klik in het LED paneel op het picogram met de lamp om de LED aan en terug uit te zetten. Via de -knop kom je te weten wanneer de LED heeft gebrand. Met de knop keer je terug naar de pagina met de lampen.
      3. Met de knop kan je de werking van de LED aanpassen.
      4. Met de knop kan je bepalen wanneer de lamp in- en uitgeschakeld wordt (bijvoorbeeld voor tuinverlichting).
      5. Met de knop kan je meldingen instellen bij het in- of uitschakelen van de LED.
      6. 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.
      7. Op dezelfde manier kan je via de pagina Temperatuur de twee temperatuurmetingen op het Dashboard weergeven.
      8. Na het plaatsen van alle onderdelen op het Dashboard (activeren van de sterren), krijg je het volgende Dashboard:
        Domoticz
    9. Afsluitende video over Domoticz:

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

, vrijdag 2 juni 2023 19:28