Skip to content

433Mhz Steckdosen mit Smarthome und Raspberry Pi steuern

Netsrac80 edited this page Oct 28, 2014 · 13 revisions

Ich habe jetzt eine Zeit lang damit verbracht die 433Mhz Steckdosen aus dem Baumarkt

433 Mhz Steckdosen bei Amazon

über die SmartVisu mit UZSU etc. schaltbar zu machen. Damit kann für einen relativ schmalen Taler alles via Tablet und Zeitschaltuhr schaltbar gemacht werden kann.

Hier nun für euch meine Erkenntnisse:

1. Ihr benötigt Hardware um euren Raspi auf 433Mhz Sendefähig zu machen. Ich habe diese verwendet:

Sende-und Empfangsmodul

Um die mit dem Raspi zu verbinden sind 3 Stück Female-Female Steckbrücken und Schrumpfschlauch zum späteren Einpacken der Sendeplatine hilfreich.

Steckbrücken

2. Raspi lernt funken Der Raspi muss über die GPIO-Schnittstellen mit dem Sendemodul sprechen können. Dafür gibt es ein vorgefertigtes Projekt das alles super erklärt hier:

https://raspiprojekt.de/anleitungen/schaltungen/28-433-mhz-funksteckdosen-schalten.html?showall=&start=1

Haltet euch daran und nutzt GPIO17.

Wichtig!!: Anhand der Anleitung darf nur root Schaltbefehle absetzen.

Damit würde allerdings das ganze nicht im SmartHome laufen. Ladet euch daher die Software von Github herunter wie in der Anleitung oben angegeben. Exportiert dann den GPIO in der Kommandozeile mit "gpio export 17 out" damit dieser Port auch als Nicht-Root genutzt werden kann.

Im Verzeichniss der heruntergeladenen Software findet ihr die Datei send.cpp. Ändert in dieser wiringPiSetup() zu wiringPiSetupSys() um auch Nicht-Root Benutzern zu gestatten einen Befehl zu senden.

Insgesamt muss das dann so aussehen:

int PIN = 17;
char* systemCode = argv[1];
int unitCode = atoi(argv[2]);
int command = atoi(argv[3]);

if (wiringPiSetupSys() == -1) return 1;
   printf("sending systemCode[%s] unitCode[%i] command[%i]\n", systemCode, unitCode, command);
   RCSwitch mySwitch = RCSwitch();
   mySwitch.enableTransmit(PIN);

switch(command) {
    case 1:
        mySwitch.switchOn(systemCode, unitCode);
        break;
    case 0:
        mySwitch.switchOff(systemCode, unitCode);
        break;
    default:

Im Anschluss nochmal mit "make" kompilieren. Jetzt solltet ihr auch als Nicht-Root mit ./send [Systemcode] [Gerätecode] [An/Aus] eine Steckdose schalten können. Systemcode und Gerätecode sind hier nochmal beschrieben. Das sieht von Steckdose zu Steckdose unterschiedlich aus.

Bei mir würde das heißen das ich mit

/usr/smarthome/rcswitch-pi/send 10000 1 1und /usr/smarthome/rcswitch-pi/send 10000 1 0

Eine Steckdose An- bzw. Abschalten kann. So wird es hier auch nochmal erklärt.


Im logic-Verzeichniss habe ich eine Datei steckdose.py angelegt:

#!/usr/bin/env python
logger.info("Steckdosenlogik gestartet")
import os
if trigger['value'] is not None:
    source_item = sh.return_item(trigger['source'])
    os.popen("/usr/smarthome/rcswitch-pi/send "+ source_item.conf['systemcode'] +" "+ source_item.conf['geraetecode'] +" "+ str(int(trigger['value']== True )))
    os.popen("/usr/smarthome/rcswitch-pi/send "+ source_item.conf['systemcode'] +" "+ source_item.conf['geraetecode'] +" "+ str(int(trigger['value']== True )))
    os.popen("/usr/smarthome/rcswitch-pi/send "+ source_item.conf['systemcode'] +" "+ source_item.conf['geraetecode'] +" "+ str(int(trigger['value']== True )))
    output = os.popen("/usr/smarthome/rcswitch-pi/send "+ source_item.conf['systemcode'] +" "+ source_item.conf['geraetecode'] +" "+ str(int(trigger['value']== True ))).readlines()
    logger.info(output)

Der Pfad "/usr/smarthome/rcswitch-pi/send" muss von euch entsprechend angepasst werden. Warum der Befehl 4x gesendet wird? 433Mhz ist nur einseitig. Das heißt, ihr wisst nicht ob der Befehl empfangen wurde. Daher sind die 4 Aufrufe einfach eine Sicherheit für mich.

/items/smartvisu.conf definiert die einzelnen Steckdosen mit SystemCode und Gerätecode. Der Abschnitt mit der UZSU ist optional und mit knx_listen kann die Steckdose auch über KNX geschalten werden.

[Funksteckdosen]    
    [[System1]]    
        name = System1
         [[[TasteA]]]
            type = bool
            visu = yes
            enforce_updates = yes
            systemcode = 10101
            geraetecode = 1
            knx_dpt = 1
            knx_listen = 5/0/0
            [[[[uzsu]]]]
                type=dict
                uzsu_item=Funksteckdosen.System1.TasteA
                cache=True
                visu_acl=rw        

/etc/logic.conf Hier werden meine Items überwacht und entsprechend die Logic aufgerufen.

[steckdose]
    filename = steckdose.py
    watch_item = Funksteckdosen.System1.Zirkulation |  Funksteckdosen.System1.Stern| Funksteckdosen.System1.TasteA |  Funksteckdosen.System1.TasteB | Funksteckdosen.System1.TasteC |  Funksteckdosen.System1.TasteD

In der SmartVisu wird diese Steckdose wie ein normaler Schalter eingefügt.

Sendeleistung erweitern: Am Sendemodul findet ihr ein kleines Loch mit der Beschriftung ANT. Dort habe ein Stück Kupferdraht mit 17,5cm Länge angelötet. Damit funkt das Modul jetzt auch durch mein gesamtes Eigenheim. Noch besser wären wohl 35cm Antennenlänge weil dies 1/2 der Wellenlänge von 433Mhz entspricht, aber den Platz hat nicht jeder.

Der Vorteil: Ihr könnt jetzt für ca. 9€ einen Schaltausgang überall im Haus nachrüsten. Stehlampen, Zirkulationspumpe, Weihnachtsbaum etc.

Der Nachteil: 433 Mhz ist nur 1-Kanal. Der Zustand in einer Visu kann also vom tatsächlichen Zustand abweichen. Daher wirklich nur für sicherheitsunkritische Dinge nutzen.

Es gibt von diesem System auch Lampensockel und Außensteckdosen falls jemand den Weihnachtsbaum im Garten auch schalten möchte.

Wichtig für Sicherheitsfragen!

Jeder kann sich natürlich mit einer Fernbedienung von diesem Funksteckdosensystem vor eurer Haus/Wohnung stellen und die Endgeräte ebenfalls an- und abschalten. Er muss dazu nur den Systemcode wissen/raten. Das ist aber ein generelles "Problem" dieser 433Mhz Technik und hat nichts speziell mit der Anwendung im Raspberry Pi zu tun.

Fragen und Ergänzungen bitte hier im Forum posten: knx-user-forum.de/smarthome-py/38147-logic-und-howto-fuer-433mhz-steckdosen.html