Für die Steuerung meiner Funksteckdosen der Marke Elro mit meinem Raspberry Pi verwende ich die im letzten Artikel beschriebenen Klassen mcp23017
und pin
. Die verwendete Hardware wird in diesem Srtikel beschrieben.
Funktionsweise
Um einen Schaltvorgang durchzuführen, werden jeweils zwei Pins des MCP23017 auf Masse gelegt:
- GPIOB 0 oder 1 für aus bzw. an
- Der Pin, der die jeweiliege Funksteckdose anspricht
Die Elro-Steckdosen (und die diversen kompatiblen Geräte) werden über 10 DIP-Schalter konfiguriert. Die ersten 5 sind die die Konfiguration der Hausadresse zuständig. Mit den zweiten 5 wird die Steckdose als a,b,c,d oder e konfiguriert. Für jede der 32 möglichen Hausadressen können also 5 Steckdosen adressiert werden. Das ergebit in der Summer 5 * 32 = 160 Geräte.
Die Ein- und Ausschaltvorgänge werden mit Hilfe der Funktionen turn_on()
und turn_off()
realisiert. Beide Funktionen benötigen jeweils eine Hausadresse und eine deifnierte Funksteckdose als Parameter.
Die Hausadresse wird innerhalb dieser Funktionen mit Hilfe der Funktion set_houseid()
festgelegt.
Sind die Hausadresse und die zu verwendende Steckdose sowie der Schaltvorgang definiert, wird jeweils für einen Zeitraum von einer halben Sekunde die Funkübertragung mit Hilfe der Funktion send_data()
aktiviert.
Hier der komplette Quellcode:
[python]
#!/usr/bin/python
import os
from time import sleep
from mcp23017 import mcp23017,pin
lockfile_path=’/tmp/openhab.lck‘
mcp23017_1=mcp23017(0,0×20)
#Schalter an und aus
swon=pin(mcp23017_1,"gpiob",1)
swoff=pin(mcp23017_1,"gpiob",0)
#Schalter a bis e
swa=pin(mcp23017_1,"gpioa",2)
swb=pin(mcp23017_1,"gpioa",1)
swc=pin(mcp23017_1,"gpioa",0)
swd=pin(mcp23017_1,"gpiob",3)
swe=pin(mcp23017_1,"gpiob",2)
#Senden
swte=pin(mcp23017_1,"gpiob",7)
#Pins fuer Hausadresse
swa1=pin(mcp23017_1,"gpioa",7)
swa2=pin(mcp23017_1,"gpioa",6)
swa3=pin(mcp23017_1,"gpioa",5)
swa4=pin(mcp23017_1,"gpioa",4)
swa5=pin(mcp23017_1,"gpioa",3)
def set_houseid(id):
id=str(id)
if len(id)==5:
if id[0]=="1":
swa1.disable()
else:
swa1.setx()
if id[1]=="1":
swa2.disable()
else:
swa2.setx()
if id[2]=="1":
swa3.disable()
else:
swa3.setx()
if id[3]=="1":
swa4.disable()
else:
swa4.setx()
if id[4]=="1":
swa5.disable()
else:
swa5.setx()
def islocked():
return os.path.exists(lockfile_path)
try:
lockfile=(lockfile_path, ‚r‘)
return True
except:
return False
def setlock():
try:
pid=os.getpid
lockfile=open(lockfile_path, ‚w+‘)
lockfile.write(str(pid))
lockfile.close
return True
except:
return False
def releaselock():
try:
os.remove(lockfile_path)
return True
except:
return False
def waitlock():
if islocked():
locked=True
while locked == True:
sleep(0.5)
locked=islocked()
#send_data() enables the TE pin for 0.5 seconds
def send_data():
swte.enable()
sleep(0.5)
swte.disable()
sleep(0.1)
def turn_on(switch,houseid):
waitlock()
setlock()
set_houseid(houseid)
swon.disable()
switch.disable()
send_data()
swon.setx()
switch.setx()
releaselock()
def turn_off(switch,houseid):
waitlock()
setlock()
set_houseid(houseid)
swoff.disable()
switch.disable()
send_data()
swoff.setx()
switch.setx()
releaselock()
[/python]
Download rcplug.py
Im nächsten Artikel zeige ich, wie diesem Code ein Kommandozeilen-Tool geschrieben werden kann, mit dem der Raspberry Pi Funksteckdosen steuern kann. Außerdem wird die Verwendung des Tools für die Anbindung an die offene Automatisierungslösung openHAB erklärt.
Pingback: Raspberry Pi: Funksteckdosen steuern mit openHAB | G-SURF