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:
#!/usr/bin/python import os from time import sleep from mcp23017 import mcp23017,pin lockfile_path='/tmp/openhab.lck' mcp23017_1=mcp23017(0,0x20) #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()
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