Ankündigung

Einklappen
Keine Ankündigung bisher.

Lichtschalter Eingang über GPIO

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

    Lichtschalter Eingang über GPIO

    Hi erstmal.
    Ich bin neu hier im Forum und leider blutiger Anfänger was programmieren angeht.

    Ich beschäftige mich seit Tagen mit einem Projekt für mein Haus.
    Ich habe einen Raspberry Pi 3 Model B mit Rasbian Jessie und die neueste OpenHab Version.
    GPIO bindings sind installiert und WiringPi ebenfalls.

    Ich möchte sämtliche Lampen im Haus sowohl über App, als auch über den normalen Lichtschalter (Taster) einschalten können. Dabei soll mir in der App der Status der Lichter angezeigt werden.

    Mein Plan ist es, die Lampen direkt vom Raspberry ansteuern zu lassen, und die Lichtschalter nur ein Signal an den Raspberry senden zu lassen.

    Für einen Versuchsaufbau habe ich eine LED an GPIO4 angeschlossen und kann diese auch über mein Webinterface steuern (später soll dann da mal ein Relais anstatt der LED angeschlossen werden).

    Ebenso habe ich einen Taster an GPIO23 angeschlossen (Pull Down Widerstand). Im Terminal bekomme ich wenn ich den Taster nicht betätige eine 0 angezeigt und wenn er betätigt ist eine 1.


    Mein home.items file:

    // Gruppen
    // Raspberry Pi
    // GPIO

    Group gEG // Gruppe Erdgeschoss
    Group gOG // Gruppe Obergeschoss

    /*Licht*/
    Switch Licht_OG Wonzimmer "Licht Wohnzimmer" (gOG) { gpio="pin:4}
    ...

    Contact Taster { gpio="pin:23"}



    home.rules:
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    import org.openhab.core.types.Command
    import org.openhab.core.library.items.SwitchItem


    rule "LichtschalterWohnzimmer"
    when
    Item Taster changed
    then
    if (Taster.state == OPEN) {
    if (Licht_OG_Wohnzimmer == OFF) {
    sendCommand(Licht_OG_Wohnzimmer, ON)
    }
    if (Licht_OG_Wohnzimmer == ON) {
    sendCommand(Licht_OG_Wohnzimmer, OFF)
    }
    }
    end
    -----------------------------------------------------------------------------------------------------


    Leider bewirkt der Taster keine Veränderung.
    Wo könnte(n) mein(e) Fehler liegen?

    Wie gesagt, ist das absolutes Neuland für mich. Aber nach einer Woche probieren und googlen ohne Ergebniss, muss ich nun einmal nachfragen.
    Ich bedanke mich schon einmal im Voraus.

    Mfg David
    Zuletzt geändert von daviddddd; 14.12.2016, 14:53.

    #2
    Da ist ein Fehler in Deiner Rule:

    Code:
    rule "LichtschalterWohnzimmer"
    when
      Item Taster changed
    then
      if (Taster.state == OPEN) {
        if (Licht_OG_Wohnzimmer == OFF) {
          sendCommand(Licht_OG_Wohnzimmer, ON)
        }
        if (Licht_OG_Wohnzimmer == ON) {
          sendCommand(Licht_OG_Wohnzimmer, OFF)
        }
      }
    end
    Das Licht schaltet immer aus, da selbst wenn Du es einschaltest (Taster wurde gedrückt und Licht war aus => Licht geht an) mit dem folgenden Konstrukt das Licht wieder ausgeschaltet wird....

    Ein zusätzliches "else" kann Abhilfe schaffen, nur einer der beiden Pfade zu beschreiten....

    Andreas


    Kommentar


      #3
      Ich habe nun mal Versucht die rule auf ein Minimum zu reduzieren ob sich überhaupt etwas tut.

      Code:
      rule "LichtschalterWohnzimmer"
      when
      Item Taster changed
      then
      if (Taster.state == OPEN) {
      {sendCommand(Licht_OG_Wohnzimmer, ON)]
      
      end
      Aber es tut sich nichts. Wo könnte der Fehler noch liegen?
      Zuletzt geändert von daviddddd; 14.12.2016, 20:48.

      Kommentar


        #4
        Du hast in Deiner Mini-Rule die Klammern falsch.
        Du benötigst fü jede geöffnete Klammer auch wieder eine geschlossene Klammer.
        Die geschweiften Klammern legen einen Block fest.
        Die eckigen Klammern sind in Bezug auf die Timer vonnöten.

        Ich nehme an, Du wolltest so etwas schreiben:
        Code:
        rule "LichtschalterWohnzimmer"
        when
          Item Taster changed
        then
          if (Taster.state == OPEN)
          {
            Licht_OG_Wohnzimmer.sendCommand(ON)
          }
        end
        Grundsätzlich solltest Du Dir angewöhnen, mit den richtigen Einrückungen und die Position der Klammern durchgängig übersichtlich zu setzen.

        In Bezug auf SendCommand ist es sinnvoller die Methode (wie hier in meinem Beispiel) zu verwenden, als die Action (Dein Beispiel).
        Über die Methode ist die Chance größer, dass die richtigen Datentypen verwendet werden, da diese für das Item bekannt sind.
        Bei der Action wird es zu einem Ratespiel. ob diese den richtigen Datentyp herausfindet. Falls nicht, funktioniert es auch nicht.


        Und nun noch die Hilfestellung zu Deinem ersten Beispiel:
        Code:
        rule "LichtschalterWohnzimmer"
        when
          Item Taster changed
        then
          if (Taster.state == OPEN)
          {
            if (Licht_OG_Wohnzimmer.state == OFF)
            {
              Licht_OG_Wohnzimmer.sendCommand(ON)
            }
            else
            {
              Licht_OG_Wohnzimmer.sendCommand(OFF)
            }
          }
        end
        Damit wird auf alle Fälle nur einmal das Licht geschaltet (entweder EIN oder AUS), wenn die Rule ausgeführt wird...

        Kommentar


          #5
          Vielen vielen Dank.

          Dann muss das Problem wohl wo anders liegen.
          Denn leider passiert beim Druck auf den Taster nichts :-/



          Ist dieser denn in meinem home.items file mit:

          Code:
          Contact Taster { gpio="pin:23"}
          richtig definiert?

          Die Datei "value" im Verzeichnis /sys/class/gpio/gpio23 ändert sich von 0 auf 1 wenn der Taster betätigt ist.



          EDIT: Die rule an sich funktioniert. Wenn ich ein Zeitevent verwende, dann geht die LED an. Problem muss also beim Lesen des GPIO Input von OpenHab liegen. Da jemand eine Idee?
          Zuletzt geändert von daviddddd; 15.12.2016, 11:52.

          Kommentar


            #6
            Also als Tipp für ein Toggle:
            Code:
            rule "toggle Ausgang ItemX mit Eingang ItemY"
            when
                Item ItemY changed to OPEN
            then
                ItemX.sendCommand(if (ItemX.state = ON) OFF else ON)
            end
            Also grob: Wenn der Kontakt ItemY nach OPEN wechselt (vorher muss er also entweder undefined oder CLOSED gewesen sein) sende ein Kommando an ItemX, abhängig vom Zustand von ItemX, nämlich OFF, falls der Zustand ON ist, sonst ON)

            Wenn der Zustand in der Konsole korrekt angezeigt wird, wäre der nächste Schritt, in die events.log reinzuschauen, ob sich da was tut, wenn Du den Kontakt Schließt bzw. öffnest. Offensichtlich stimmen die Rechte, sonst ginge die LED ja nicht an, wenn die Rule per Zeit gesteuert wird.

            Kommentar


              #7
              Nach stundenlanger Google suche, sieht es so aus das ich nicht der einzige mit dem Problem bin.
              Openhab kann den Taster nicht einlesen. Nur einmal beim starten des Programms. Das heist, wenn ich meinen Raspberry starte, dann wird die LED einmal eingeschalten (bei if Taster.state =CLOSED) . Danach funktioniert der Taster nicht mehr.
              Eine Lösung zu dem Problem konnte ich bisher nicht finden. Alle Threads zu diesem Thema im Internet sind letztendlich ohne Lösung.

              Ich werde es nun mal auf einem anderen Weg probieren und mich in Scripte einlesen.

              Kommentar


                #8
                Wie ist der Taster angeschlossen?

                Kommentar


                  #9
                  Es funktioniert nun :-)
                  Hier eine Anleitung wenn jemand ein ähnliches Problem haben sollte:

                  Ich habe ein Script erstellt unter root/scripts mit dem Namen Taster.
                  Das script sieht folgendermasen aus:

                  Code:
                  #!/bin/bash
                  GPIO=$
                  INPUT=$(cat /sys/class/gpio/gpio23/value)
                  echo $INPUT
                  Das script muss ausführbar gemacht werden. (.sh)


                  Mein Item sieht so aus:
                  Code:
                  Number Taster { exec="<[scripts/Taster.sh 236 23:1:REGEX((.*?))]" }
                  Alles nur ergooglete Infos. Zusammenhänge verstehe ich selbst nicht ganz...

                  Meine rule:
                  Code:
                  rule "LichtschlaterWohnzimmer"
                  when
                       Item Taster changed    from 0 to 1
                  then
                     {
                          if (Licht_OG_Wohnzimmer.state == OFF)  
                     {    
                         Licht_OG_Wohnzimmer.sendCommand(ON)  
                      }  
                       else  
                      {    
                       Licht_OG_Wohnzimmer.sendCommand(OFF)
                      }
                  }
                  end
                  Hinzu kommt noch, das der GPIO23 beim booten als Input Port gesetzt werden muss.




                  Leider muss ich den Taster noch etwa eine halbe Sekunde gedrückt halten damit sich etwas tut.

                  Wie ich das ändern kann weis ich noch nicht. Jemand eine Idee?
                  Zuletzt geändert von daviddddd; 18.12.2016, 11:26.

                  Kommentar

                  Lädt...
                  X