Raspberry Pi: MCP23017 für die Steuerung von Funksteckdosen

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.

4.71 avg. rating (94% score) - 7 votes

Ein Gedanke zu “Raspberry Pi: MCP23017 für die Steuerung von Funksteckdosen

  1. Pingback: Raspberry Pi: Funksteckdosen steuern mit openHAB | G-SURF

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Spamschutz * Time limit is exhausted. Please reload the CAPTCHA.