Für das Tomato Pi – Projekt hatte ich verschiedene Ideen für die Steuerung einer Bewässerungsanlage. Das ist aber eine etwas längere Geschichte. In diesem Artikel geht es um den RF Link Transmitter WRL-10534, mit dem es möglich werden soll günstige Baumarkt-Funksteckdosen ein oder auszuschalten.
Zur Schaltung von Geräten kann man grundsätzlich auch zu einem Relais greifen. Diese müssen aber zum einen komplizierter beschaltet werden und zum Anderen bin ich ganz froh, wenn ich nicht direkt an 230 Volt ran muss. Kurzerhand habe ich mir einen entsprechenden Transmitter gekauft und schnell konnte auch schon eine billige Steckdose für den Garten geschaltet werden. Nun aber zum Aufbau des Ganzen.
Gekauft habe ich bei EXP-Tech für 3,42€. Fairer Preis, wenn das Ganze auch so läuft, wie ich mir das vorstelle. Sehr hilfreich war auch der Artikel Raspberry Pi – Erster Schritt zur Hausautomation bei IT Basic.
In meinem aktuellen Testaufbau sieht das in etwa wie auf dem Bild unten aus:
![433 Transceiver]()
Bei der Beschaltung orientiert man sich am Besten an die ANT-Beschriftung auf der rechten Seite.
Von Links gesehen ergibt sich dann folgendes Bild:
GND –> Pin 6
DATA –> Pin 11 bzw. GPIO 17
VCC –> Pin 2 bzw. 5 Volt
ANT –> Antenne (kann ein Kabel mit möglichst 17cm Länge sein)
Ich selbst habe entsprechende Downloads im Home-Verzeichnis durchgeführt:
Falls noch nicht geschehen installieren wir nun einiges zur Vorbereitung
sudo apt-get install git gcc python-dev python-setuptools git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
git clone https://github.com/WiringPi/WiringPi-Python.git
cd WiringPi-Python
git submodule update –init
python setup.py install
Damit GPIO17 auch durch den Benutzer erreichbar ist, müssen noch die Rechte angepasst werden. Das kann einfach in Nano erledigt werden.
sudo nano /etc/rc.local
Dann vor exit 0 einfach
sudo -u pi /usr/local/bin/gpio export 17 out
einfügen, schließen, speichern und neu starten.
Der Author von IT-Basic hat sich im Raspberry Pi – Forum beim Skript “elro_wiringpi.py” bedient. Ich habe es ihm nachgemacht.
Also “nano elro_wiringpi.py” und dann diesen Inhalt kopieren:
#!/usr/bin/env python
“”"
For switching Elro wall plugs using Python on Raspberry Pi with wiringPi Library.
from Dirk J. 2013
Requirements:
-WiringPi-Python Library
-433 Mhz Transmitter connected
-Export of GPIO port: gpio export <pin> out (pin=Broadcom GPIO number. Pin with connection
to ‘data’ of an 433Mhz Transmitter)
Example
$ gpio export 17 out # Exports pin 17 (e.g. in /etc/rc.local)
$ ./elro_wiringpi.py 8 1 # Switch D is turned on
This file uses wiringPi to output a bit train to a 433.92 MHz transmitter, allowing you
to control light switches from the Elro brand (AB440S). You need to export the pin before starting the
script. It does not require root permission
Credits:
This file is a just slightly modified version of “elropi.py” from by Heiko H. 2012:
http://pastebin.com/aRipYrZ6
It is changed to run without root by using WiringPi-Python instead of the RPi.GPIO library.
C++ source code written by J. Lukas:
http://www.jer00n.nl/433send.cpp
and Arduino source code written by Piepersnijder:
http://gathering.tweakers.net/forum/view_message/34919677
Some parts have been rewritten and/or translated.
This code uses the Broadcom GPIO pin naming.
For more on pin naming see: http://elinux.org/RPi_Low-level_peripherals
Version 1.0
“”"
import time
import wiringpi
class RemoteSwitch(object):
repeat = 10 # Number of transmissions
pulselength = 300 # microseconds
def __init__(self, unit_code, system_code=[1,1,1,1,1], pin=17):
”’
devices: A = 1, B = 2, C = 4, D = 8, E = 16
system_code: according to dipswitches on your Elro receivers
pin: according to Broadcom pin naming
”’
self.pin = pin
self.system_code = system_code
self.unit_code = unit_code
def switchOn(self):
self._switch(wiringpi.HIGH)
def switchOff(self):
self._switch(wiringpi.LOW)
def _switch(self, switch):
self.bit = [142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 136, 128, 0, 0, 0]
for t in range(5):
if self.system_code[t]:
self.bit[t]=136
x=1
for i in range(1,6):
if self.unit_code & x > 0:
self.bit[4+i] = 136
x = x<<1
if switch == wiringpi.HIGH:
self.bit[10] = 136
self.bit[11] = 142
bangs = []
for y in range(16):
x = 128
for i in range(1,9):
b = (self.bit[y] & x > 0) and wiringpi.HIGH or wiringpi.LOW
bangs.append(b)
x = x>>1
wiringpi.wiringPiSetupSys()
wiringpi.pinMode(self.pin,wiringpi.OUTPUT)
wiringpi.digitalWrite(self.pin,wiringpi.LOW)
for z in range(self.repeat):
for b in bangs:
wiringpi.digitalWrite(self.pin, b)
time.sleep(self.pulselength/1000000.)
if __name__ == ‘__main__’:
import sys
# Change the system_code[] variable below according to the dipswitches on your Elro receivers.
default_system_code = [1,1,1,1,1]
# change the pin accpording to your wiring
default_pin =17
if len(sys.argv) < 3:
print “usage: python %s int_unit_code int_state (e.g. ‘%s 2 1′ switches unit 2 on)” % \
(sys.argv[0], sys.argv[0])
sys.exit(1)
device = RemoteSwitch( unit_code= int(sys.argv[1]),
system_code=default_system_code,
pin=default_pin)
if int(sys.argv[2]):
device.switchOn()
else:
device.switchOff()
Das Skript ausführbar machen:
chmod u+x elro_wiringpi.py
Und testen können wir nun mit:
./elro_wiringpi.py 8 1
Der Sytax schaltet meine Billigsteckdose mit Gerätecode D ein. Es funktioniert.
Eigentlich bin ich mit dem Ergebnis schon ziemlich zufrieden. Darauf aufbauend wird man ziemlich viel basteln können, ohne eben direkt 230 Volt schalten zu müssen.
Trotzdem erschließt sich mir bisher nicht, wie man mit dem o.g. Transmitter eben auch Schaltbefehle empfängt. So könnte man Geräte eben durch den Pi und zeitgleich auch mit der Fernbedienung schalten und der Pi wüsste trotzdem ob entsprechende Geräte ein- oder ausgeschaltet sind.
Das wird vorerst eine andere Baustelle sein.