#!/usr/bin/env python
"""
"elropi.py" for switching Elro devices using Python on Raspberry Pi
by Heiko H. 2012
This file uses RPi.GPIO to output a bit train to a 433.92 MHz transmitter, allowing you
to control light switches from the Elro brand.
Credits:
This file is mostly a port from C++ and Wiring to Python and the RPi.GPIO library, based on
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 by default, which can be changed in the
"GPIOMode" class variable below.
For more on pin naming see: http://elinux.org/RPi_Low-level_peripherals
Version 1.0
"""
import time
import RPi.GPIO as GPIO
class RemoteSwitch(object):
repeat = 10 # Number of transmissions
pulselength = 300 # microseconds
GPIOMode = GPIO.BCM
def __init__(self, device, key=[1,1,1,1,1], pin=4):
'''
devices: A = 1, B = 2, C = 4, D = 8, E = 16
key: according to dipswitches on your Elro receivers
pin: according to Broadcom pin naming
'''
self.pin = pin
self.key = key
self.device = device
GPIO.setmode(self.GPIOMode)
GPIO.setup(self.pin, GPIO.OUT)
def switchOn(self):
self._switch(GPIO.HIGH)
def switchOff(self):
self._switch(GPIO.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.key[t]:
self.bit[t]=136
x=1
for i in range(1,6):
if self.device & x > 0:
self.bit[4+i] = 136
x = x<<1
if switch == GPIO.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 GPIO.HIGH or GPIO.LOW
bangs.append(b)
x = x>>1
GPIO.output(self.pin, GPIO.LOW)
for z in range(self.repeat):
for b in bangs:
GPIO.output(self.pin, b)
time.sleep(self.pulselength/1000000.)
if __name__ == '__main__':
import sys
GPIO.setwarnings(False)
if len(sys.argv) < 3:
print "usage:sudo python %s int_device int_state (e.g. '%s 2 1' switches device 2 on)" % \
(sys.argv[0], sys.argv[0])
sys.exit(1)
# Change the key[] variable below according to the dipswitches on your Elro receivers.
default_key = [1,0,0,0,1]
# change the pin accpording to your wiring
default_pin =17
device = RemoteSwitch( device= int(sys.argv[1]),
key=default_key,
pin=default_pin)
if int(sys.argv[2]):
device.switchOn()
else:
device.switchOff()