MQTT = Message Queuing Telemetry Transport en wordt gebruikt door apparaten die berichten versturen. Dit bericht wordt dan verstuurd met behulp van MQTT waarin o.a. een id staat. Indien het device een id heeft voor AAN en een ander id voor UIT, dan worden dus twee verschillende berichten gestuurd, afhankelijk van de status van het device. Dit is dus uitermate handig voor het ‘slimme huis’!

Nu dienen deze MQTT-berichten dus allereerst opgevangen te worden en daarvoor kan een Raspberry Pi gebruikt worden waarop een ‘MQTT Broker‘ wordt geïnstalleerd. Een MQTT-Broker is een stukje software dat berichten kan ontvangen en opslaat in een ‘topic‘. Dat ‘topic’ kan uitgelezen worden door een ‘MQTT-Client‘ die de rechten heeft om hetzelfde ‘topic’ te lezen. Een MQTT broker voor de Raspberry Pi is ‘Mosquitto‘.

Mosquitto

De installatie van Mosquitto gaat alsvolgt:

$ sudo apt update
$ sudo apt install mosquitto
$ sudo systemctl enable --now mosquitto

Hiermee draait de MQTT broker met anonymous toegang en om dat uit te zetten zodat een username/password vereist is, wordt het bestand /etc/mosquitto/mosquitto.conf aangepast met extra regels:

allow_anonymous false
password_file /etc/mosquitto/passwordfile

Het password-bestand wordt alsvolgt aangemaakt waarbij voor de eerste user een password wordt gevraagd:

$ cd /etc/mosquitto
$ sudo mosquitto_passwd -c passwordfile mqtt_user1
...
$ sudo mosquitto_passwd -b passwordfile mqtt_user2 password
$ sudo systemctl restart mosquitto

RF-Bridge

De apparaten die gebruikt gaan worden voor het ‘slimme huis’ kunnen niet zelf MQTT berichten versturen maar doen dat via een RF-Bridge. De apparaten versturen een signaal via 433MHz en de RF-Bridge vangt dit op. Vervolgens stuurt de RF-Bridge een aangepast signaal door naar de MQTT-Broker met hierin het id van het apparaat. Een goedkope RF-Bridge voor Sonoff devices is bv. deze: https://www.sonoff.nl/a-52550339/accessoires/sonoff-rf-bridge-433-controller/#description

Om deze RF-Bridge te kunnen gebruiken zonder een cloud-abonnement dient deze ge-flashed te worden met andere firmware en om deze met Home Assistant te kunnen gebruiken is Tasmota het best geschikt. Op de pagina lees je hoe dit flashen gedaan kan worden. Eenmaal geflashed en opnieuw gestart kan de RF-Bridge geconfigureerd worden voor het doorgeven van berichten naar MQTT Broker. Op het Console van de RF-Bridge kun je de berichten voorbij zien komen:

Versturen van test-berichten met Raspberry Pi

Voor de Raspbery Pi is er een 433MHz zendertje beschikbaar dat aangesloten wordt op de GPIO poort en ziet er zo uit:

Met een paar female-to-female jumpers wordt het bordje aangesloten op de Raspberry Pi en een Python script kan gebruikt worden om berichten te versturen. Het rpi-rf_send.py script:

!/usr/bin/env python3
import argparse
import logging
 
from rpi_rf import RFDevice
 
logging.basicConfig(level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S',
                     format='%(asctime)-15s - [%(levelname)s] %(module)s: %(message)s',)
 
parser = argparse.ArgumentParser(description='Sends a decimal code via a 433/315MHz GPIO device')
parser.add_argument('code', metavar='CODE', type=int,help="Decimal code to send")
parser.add_argument('-g', dest='gpio', type=int, default=17,help="GPIO pin (Default: 17)")
parser.add_argument('-p', dest='pulselength', type=int, default=None,help="Pulselength (Default: 350)")
parser.add_argument('-t', dest='protocol', type=int, default=None,help="Protocol (Default: 1)")
parser.add_argument('-l', dest='length', type=int, default=None,help="Codelength (Default: 24)")
parser.add_argument('-r', dest='repeat', type=int, default=10,help="Repeat cycles (Default: 10)")

args = parser.parse_args()
 
rfdevice = RFDevice(args.gpio)
rfdevice.enable_tx()
rfdevice.tx_repeat = args.repeat
 
if args.protocol:
     protocol = args.protocol
else:
     protocol = "default"
if args.pulselength:
     pulselength = args.pulselength
else:
     pulselength = "default"
if args.length:
     length = args.length
else:
     length = "default"

logging.info(str(args.code) +
              " [protocol: " + str(protocol) +
              ", pulselength: " + str(pulselength) +
              ", length: " + str(length) +
              ", repeat: " + str(rfdevice.tx_repeat) + "]")
 
rfdevice.tx_code(args.code, args.protocol, args.pulselength, args.length)
rfdevice.cleanup()

Nu kan een commando gegeven worden om een 433MHz-bericht te versturen naar de RF-Bridge:

$ ./rpi-rf_send.py 1234

In het console van Tasmota komen de berichten binnen. Bijvoorbeeld:

20:58:10 MQT: tele/rf-bridge/RESULT = {"Time":"2021-01-24T22:10:59","RfReceived":{"Sync":11210,"Low":460,"High":1300,"Data":1234,"RfKey":"None"}}

Hierbij zijn de volgende gegevens belangrijk voor Home Assistant:

  • tele/rf-bridge/RESULT
  • {…”RfReceived”:…{“Data”:1234…}}

Het eerste deel, MQT, geeft aan dat de ‘topic‘ /tele/rf-bridge/RESULT gebruikt wordt en de ‘message’ zelf is in json-formaat en daaruit willen we dus de data filteren.

Versturen van berichten met HomeBridge

Met een MQTT-plugin voor HomeBridge kan ook van daaruit berichten worden gestuurd naar de MQTT-Broker. Kijk hier voor het instellen op HomeBridge!

Home Assistant

Sensor

Allereerst dienen er een paar regels code toegevoegd te worden aan ‘configuration.yaml‘ om een schakelaar van het type ‘binary-sensor‘ aan te maken:

binary-sensor:
  - platform: mqtt
    name: Testcode
    state_topic: "tele/rf-bridge/RESULT"
    value_template: '{{value_json.RfReceived.Data}}'
    payload_on: "1234"
    payload_off: "4321"
    device_class: door
    qos: 1 

waarmee we aangeven dat de waarde ‘1234’ de deur open doet staan en ‘4321’ de deur dicht. De ‘value-template‘ wordt gebruikt indien de inhoud van het bericht in json-formaat is. Deze binary-sensor kunnen we nu bv. in een dashboard plaatsen.

Test

$ ./rpi-rf_send.py 1234
$ ./rpi-rf_send.py 4321

en uiteraard kan daar dan ook een Automatisering aan gekoppeld worden.

Switch

In de configuration.yaml kan de volgende switch aangemaakt te worden:

switch:
  - platform: mqtt
    name: "Test switch"
    state_topic: "stat/testswitch/POWER"
    value_template: "{{ value_json.POWER }}"
    command_topic: "cmnd/testswitch/POWER"
    payload_on: "ON"
    payload_off: "OFF"
    retain: true

Hier zorgt de ‘command_topic’ ervoor dat er commando’s gestuurd kunnen worden waarop MQTT zal reageren en de payload gebruikt om het device aan of uit te zetten. In Home Assistant kan hiervoor dan een kaart gemaakt worden.