Ankündigung

Einklappen
Keine Ankündigung bisher.

Logic und Howto für 433Mhz Steckdosen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Logic und Howto für 433Mhz Steckdosen

    Hallo,
    ich habe jetzt eine Zeit lang damit verbracht die 433Mhz Steckdosen aus dem Baumarkt

    Suchergebnis auf Amazon.de für: CSL steckdose

    über die SmartVisu mit UZSU etc. schaltbar zu machen. Der WAF ist wegen der nahenden Weihnachtszeit bei uns enorm hoch weil so die ganze Weihnachtsdeko für einen relativ schmalen Taler 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 sprechen
    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/...owall=&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. Daher ladet euch 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 diese mit wiringPiSetup() zu wiringPiSetupSys() um auch Nicht-Root Benutzern zu gestatten einen Befehl zu senden.

    Insgesamt muss das dann so aussehen:

    Code:
    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

    Code:
    /usr/smarthome/rcswitch-pi/send 10000 1 1
    und
    Code:
    /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:

    Code:
    #!/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 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.

    Code:
     [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.
    Code:
    [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.

    Bei mir läuft das ganze jetzt seit 2 Wochen fehlerfrei und schaltet meine Zirkulationspumpe brav an und aus.

    Viel Spass und "schöne Weihnachten.

    Carsten

    #2
    Interessante Alternative zu den deutlich teureren CUL-Lösungen.

    Man hät vier unabhängige (Funk-)Kanäle?

    Kommentar


      #3
      Nein, es sind deutlich mehr. Du legst z.B. in 4 Funksteckdosen den Systemcode fest. z.B. 10000 und stellst den Gerätecode je auf 1,2,3 oder 4. Wenn Du weitere Funksteckdosen hast, machst du einfach den nächsten Systemcode auf z.B. 10001 und kannst dort wieder die Gerätecodes 1-4 vergeben. Das ganze geht für jede Kombination von 00000 - 11111.

      Ich denke damit sollte die Anzahl der möglichen Endgeräte für einen normalen Haushalt nicht ausgeschöpft werden können.

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

      Was ich im oberen Post vergessen habe und Sicherheitsrelevant ist.

      Jeder kann sich natürlich mit einer Fernbedienung 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 Raspi zu tun.

      Grüße
      Carsten

      Kommentar


        #4
        Hallo Carsten,

        erst einmal vielen Dank für diese Anleitung! Sie hat mir schon sehr geholfen
        Ich habe gestern versucht den ./send Befehl zu implementieren. Soweit funktioniert es ganz gut, leider habe ich es noch nicht hin bekommen, dass ich den Befehl ohne sudo senden kann, obwohl ich wiringPiSetupSys() verwendet habe.

        Bezüglich "mySwitch.send(unitCode, 24);" habe ich jedoch ein paar Fragen:
        1. Wieso nutzt du nicht die vorgegebenen Befehle mit ON/OFF?
        2. Dieser Befehl arbeitet, so wie ich die Doku verstanden habe, nur mit Binärwerten. Müsste man hier nicht den systemCode, unitCode und command zu einem Binärwert umwandeln und dann übergeben? Hintergrund ist, dass es so bei mir nicht funktioniert. Ich vermute auch, weil hier nur der unitCode übergeben wird. Weiß jemand was die 24 bedeutet?

        VG

        Sebastian

        P.S.: Bin gerade noch dabei, die Logic zu implementieren, musste aber leider aufhören, weil die Augen schon zugefallen sind

        Kommentar


          #5
          Denn sie wissen nicht was sie tun. :/ Sorry! Bei mir hatte das "ohne-Root-senden" mit dieser Anleitung auf Anhieb geklappt. Deswegen hatte ich mich gar nicht mit den eigentlichen CPP-Quellcodes beschäftigt.

          Leider.
          Denn das Beispiel ist für Befehle wie `./send ab 2604607 1` ausgelegt. Der UnitCode ist dort schon der eindeutige Bezeichner für ein Schaltgerät und muss nicht in Kombination mit dem SystemCode gesendet werden.

          Ich geb Dir heute abend nochmal eine Info warum das bei mir trotzdem Funktioniert.

          Grüße
          Carsten

          Kommentar


            #6
            Hallo Carsten,

            oh das ist super! Vielen Dank dir =)

            VG

            Sebastian

            Kommentar


              #7
              Hallo,
              du hattest recht. Mein einfach kopiertes Beispiel funktioniert nicht. Ich hab es oben schon aktualisiert. in der send.cpp muss

              Code:
              mySwitch.switchOn(systemCode, unitCode);
              und
              Code:
              mySwitch.switchOff(systemCode, unitCode);
              beibehalten werden.

              Ab Zeile 113 werden stehen hier im Quellcode auch nochmal die Funktionsdeklarationen wie switchOn() aufgerufen werden muß um unterschiedliche Endgeräte anzusprechen.

              Kommentar


                #8
                Hallo Carsten,

                danke dir schon mal für den Code. Bei mir funktioniert es soweit ganz gut.

                Leider habe ich Probleme die Funksteckdosen in die HTML einzubinden.
                Hättest du hier ein Beispiel für mich?

                Habe folgendes probiert, leider funktioniert es aber nicht

                Code:
                {{ basic.flip('Funksteckdosen.System1.TasteA', 'Funksteckdosen.System1.TasteA', '1', '0')}}
                Danke dir schon mal =)

                Schöne Grüße

                Sebastian

                Kommentar


                  #9
                  Hallo Carsten,

                  danke dafür. Es wäre toll wenn Du das ins Wiki packen würdest. Hier geht es sonst leider zu schnell unter.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Hallo,

                    wollte gerade die Steckdosen ebenfalls in Betrieb nehmen, scheitere aber schon an WiringPi. Habe mich genau an die Anleitung gehalten, allerdings kommt nach dem letzten Befehl "./build" der Fehler

                    wiringPi Build script
                    =====================
                    WiringPi Library
                    sudo: make: command not found
                    ./build: 59: ./build: make: not found

                    Make Failed...

                    Auch wenns gerade mit sh.py nichts am Hut hat, vielleicht hat ja jemand einen Tip für mich, woran es liegen könnte. Habe den Raspi B mit dem Smarthome.py-Image

                    Danke!
                    Grüße
                    Günther

                    Kommentar


                      #11
                      Zitat von SchnickSchnuck Beitrag anzeigen
                      Hallo,

                      wiringPi Build script
                      =====================
                      WiringPi Library
                      sudo: make: command not found
                      ./build: 59: ./build: make: not found

                      Make Failed...
                      hey, wie mir scheint kennt dein Raspi den Compiler nicht.

                      Ich bin jetzt nicht der Debian Guru, aber vielleicht reicht einfach eine Installation aus

                      sudo apt-get install make


                      Grüße
                      Carsten

                      Kommentar


                        #12
                        Hi Carsten,

                        besten Dank!
                        scheinbar gibt's einige Befehle nicht in der abgespeckten smarthome Version.
                        konnte alles mit
                        apt-get install make
                        apt-get install gcc und
                        apt-get install g++ ans Laufen bekommen.

                        Grüße
                        Grünther

                        Kommentar


                          #13
                          Hallo zusammen,

                          Vielen Dank erstmal für die gute Anleitung!

                          Ich habe das jetzt soweit auch alles gemacht, allerdings scheitere ich gerade daran, das ganze als nicht-root zum laufen zu bekommen.
                          Wenn ich alles nach Anleitung mache, schaltet gar nichts.

                          Wenn ich dann in send.cpp den port wieder zurück auf 0 setzte, und dann anstatt
                          Code:
                          wiringPiSetupSys()
                          wieder
                          Code:
                          wiringPiSetup()
                          aufrufe, geht der ./send 11111 1 1 Befehl.
                          Bevor ich send zum ersten mal kompiliert habe, habe ich mit
                          Code:
                          gpio export 17 out
                          den Port exportiert. Meine Export-Table sieht jetzt so aus:
                          Code:
                           +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
                           | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
                           +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
                           |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
                           |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
                           |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
                           |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
                           |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
                           |  17 |   0 | GPIO. 0 |  OUT | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
                           |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
                           |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
                           |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
                           |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
                           |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
                           |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
                           |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
                           |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
                           |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
                           |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
                           |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
                           |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
                           |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
                           |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
                           +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
                           | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
                           +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
                          Hat jemand eine Idee an was das liegen kann?

                          Gruß,
                          //giase


                          Kommentar


                            #14
                            Und noch ein bisschen mehr info: Ich habe wiringPi im debug-modus kompiliert. Die Ausgabe ist für den sudo sowie den nicht-sudo Befehl die gleiche.

                            sudo
                            Code:
                            smarthome@raspberrypi ~/rcswitch-pi $ sudo /home/smarthome/rcswitch-pi/send 10100 1 0
                            wiringPi: wiringPiSetup called
                            piboardRev: Hardware: Hardware    : BCM2709
                            
                            piboardRev: Revision string: Revision    : a01041
                            piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0
                            piboardRev: last4Chars are: "1041"
                            piBoardRev: Returning revision: 2
                            piboardId: Revision string: Revision    : a01041
                            sending systemCode[10100] unitCode[1] command[0]
                            nicht-sudo:
                            Code:
                            smarthome@raspberrypi ~/rcswitch-pi $ /home/smarthome/rcswitch-pi/send 10100 1 1
                            wiringPi: wiringPiSetupSys called
                            piboardRev: Hardware: Hardware    : BCM2709
                            
                            piboardRev: Revision string: Revision    : a01041
                            piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0
                            piboardRev: last4Chars are: "1041"
                            piBoardRev: Returning revision: 2
                            sending systemCode[10100] unitCode[1] command[1]
                            Beim ersten passiert was, beim zweiten leider nicht.

                            Ich kann mit
                            Code:
                            gpio write 0 1
                            oder
                            Code:
                            gpio write 0 0
                            den GPIO 0 auf High bzw Low schalten, das funktioniert auch ohne sudo.

                            Wo hängt das denn hier??

                            Kommentar


                              #15
                              Nochmal ein update:

                              Nachdem ich folgendes ausführe, geht jetzt auch das Kommando als nicht-root:
                              Code:
                              sudo  /usr/local/bin/gpio export 17 out
                              sudo chown -R smarthome:smarthome /sys/class/gpio/
                              Dabei funktioniert das ganze nur, wenn ich gpio export als der user aufrufe, der danach auch ./send aufrufen möchte. D.h. als root muss ich
                              Code:
                               [COLOR=#454545][FONT=Helvetica][SIZE=12px]sudo -u smarthome /usr/local/bin/gpio export 17 out[/SIZE][/FONT][/COLOR]
                              aufrufen. Wenn ich das als root aufrufe funktioniert das mit dem user smarthome schon nicht mehr.

                              D.h. das ganze ist äußerst sensibel gegenüber Rechten.

                              Jetzt meine Frage: Als welcher user läuft denn smarthome.py normalerweise (habe nach Anleitung installiert)?

                              Gruß,
                              //giase

                              Kommentar

                              Lädt...
                              X