Met 433MHz zend- en ontvangstmodules kun je in je home automation verschillende apparaten automatiseren die normaal met een RF 433 MHz draadloze afstandsbediening werken.
Het bekendste voorbeeld zijn de klikaanklikuit stopcontactsetjes die je overal kunt kopen. Ze worden vooral gebruikt voor het op afstand bedienen van traditionele schemerlampen.
Verschillende goedkope varianten van die setjes kun je ook met de Raspberry Pi bedienen in je domotica-systeem. Je hebt daarvoor twee elektronische schakelingen nodig: een zendmodule en een ontvangstmodule voor de 433MHz UHF-band (LPD433, low power device 433 MHz).
Online wordt op verschillende plaatsen goed uitgelegd hoe het een en ander werkt en hoe je een klikaanklikuit-setje met de Pi kunt automatiseren. Daar vind je ook de Python-scripts Links hieronder:
https://pypi.org/project/rpi-rf/
https://www.piddlerintheroot.com/rf-433-mhz/
https://www.instructables.com/Super-Simple-Raspberry-Pi-433MHz-Home-Automation/
Hoe het werkt
Kopieer de twee scripts receive.py en send.py naar de home-directory van gebruiker pi.
Start eerst receive.py. Dit script scan automatisch alle apparaten die op 433MHz zenden in de directe omgeving. Gebruik de afstandsbediening van je klikaanklikuit-setje om codes te genereren. Elk ontvangen signaal verschijnt op een nieuwe regel. Schrijf het codecijfer, de pulslengte en het protocolnummer op. Die heb je nodig als input voor het script send.py.
Stop het script receive.py met Ctrl+C en start het script send.py. Je kunt dan een foutmelding en uitleg. Dit script verwacht namelijk drie parameters: pulselength (-p) , protocol (-t) en CODE. Dit laatste is de cijferreeks die bij receive als eerste achter de dubbele punt staat. Een voorbeeld:
python3 send.py -p 396 -t 1 32
Voorbereidingen
sudo apt-get install python3-pip sudo pip3 install rpi-rf
Scripts
receive.py:
#!/usr/bin/env python3 # receive.py import argparse import signal import sys import time import logging from rpi_rf import RFDevice rfdevice = None # pylint: disable=unused-argument def exithandler(signal, frame): rfdevice.cleanup() sys.exit(0) 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='Receives a decimal code via a 433/315MHz GPIO device') parser.add_argument('-g', dest='gpio', type=int, default=27, help="GPIO pin (Default: 27)") args = parser.parse_args() signal.signal(signal.SIGINT, exithandler) rfdevice = RFDevice(args.gpio) rfdevice.enable_rx() timestamp = None logging.info("Listening for codes on GPIO " + str(args.gpio)) while True: if rfdevice.rx_code_timestamp != timestamp: timestamp = rfdevice.rx_code_timestamp logging.info(str(rfdevice.rx_code) + " [pulselength " + str(rfdevice.rx_pulselength) + ", protocol " + str(rfdevice.rx_proto) + "]") time.sleep(0.01) rfdevice.cleanup()
send.py:
#!/usr/bin/env python3 #send.py 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)") args = parser.parse_args() rfdevice = RFDevice(args.gpio) rfdevice.enable_tx() if args.protocol: protocol = args.protocol else: protocol = "default" if args.pulselength: pulselength = args.pulselength else: pulselength = "default" logging.info(str(args.code) + " [protocol: " + str(protocol) + ", pulselength: " + str(pulselength) + "]") rfdevice.tx_code(args.code, args.protocol, args.pulselength) rfdevice.cleanup()