Ankündigung

Einklappen
Keine Ankündigung bisher.

Seriellen String empfangen und item auslösen

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

    Seriellen String empfangen und item auslösen

    Hallo wertes Forum,

    Ich möchte zwei Serielle Strings z.B "Test\r" für den Schaltzustand ON & für den Schaltzustand OFF "Test1\r" mit jeweils einem carriage return zum ==> raspberry Pi senden, (von einem externen Gerät) openHAB soll dann in .item folgende Syntax auslösen.


    Hat jemand hierzu eine Idee oder Vorschlag.

    Besten Dank vorab, Gruß savana


    .item
    Code:
    Switch Test "Desk " <computer>(Wohn1)
    { http=">[ON:POST:http://192.168.178.2/xml/jsonswitch.php?id=1&set=1] >[OFF:POST:http://192.168.178.2/xml/jsonswitch.php?id=1&set=0]" }


    Hier unten in .rule müsste dann wahrscheinlich die Syntax eingepflegt werden??

    .rule
    Code:
    rule "Seriell"
    when
        Item Wohn1 received command
    then
        if(Wohn1.state==ON)
        {
              [COLOR=#FF0000]syntax[/COLOR]
        }
        
        else if(Wohn1.state==OFF)
        {
             [COLOR=#FF0000] syntax[/COLOR]
        }
    end
    Zuletzt geändert von savana; 10.03.2016, 21:08.

    #2
    Dazu ein paar Fragen:

    1. Was meinst Du mit seriellen Strings? Kommen die über die serielle Schnittstelle des Pi rein?

    2. Ich gehe mal davon aus, dass Dein openHAB auf dem Raspberry Pi läuft? Dann wäre die normale Herangehensweise, die serielle Schnittstelle des Pi openHAB zur Verfügung zu stellen und ein Item daran zu binden.

    3. Du zeigst ein Switch Item Test, welches per http etwas verschickt. In Deiner Rule triggerst Du auf ein Item Wohn1, welches nach Deiner Item-Definition eine Group wäre (die allerdings zumindest im Ausschnitt der .items-Datei nicht definiert ist). Hast Du Dir mal die Demo angeschaut und vor allem nachvollzogen, was wo passiert?

    Wenn auf dem Pi openHAB läuft, kannst Du die serielle Schnittstelle per serial Binding nutzen (ist anderswo schon recht auführlich erklärt worden - im >>Wiki<< ist auch genau erklärt, was man beim Pi dazu beachten muss)
    Das Einfachste wäre also, ein Item einzurichten:
    Code:
    Switch httpSwitch "Desk " { http=">[ON:POST:http://192.168.178.2/xml/jsonswitch.php?id=1&set=1] >[OFF:POST:http://192.168.178.2/xml/jsonswitch.php?id=1&set=0]" }
    String SeriellAMA0 "Serielle Schnittstelle" { serial="/dev/ttyAMA0" }
    welches dann eine rule triggern kann:
    Code:
    rule "AMA0 Empfang"
    when
        Item SeriellAMA0 received update
    then
        if (SeriellAMA0.state.toString=="Test\r")
            httpSwitch.sendCommand(OFF)
        else if (SeriellAMA0.state.toString=="Test1\r")
            httpSwitch.sendCommand(ON)
    end
    Folge dieses Codes: Wenn auf AMA0 die Zeichenfolge "Test\r" empfangen wird, wird per POST http://192.168.178.2/xml/jsonswitch.php?id=1&set=0 über Ethernet gesendet. Wenn auf AMA0 die Zeichenfolge "Test1\r" empfangen wird, wird per POST http://192.168.178.2/xml/jsonswitch.php?id=1&set=1 über Ethernet gesendet.

    Vielleicht habe ich Deine Frage aber auch nur falsch verstanden...

    Kommentar


      #3
      Hallo udo1toni,

      vielen Dank für deine Ausführliche Erklärung. Ich werde deinen Code gleich mal testen.

      Zu deinen Fragen

      1. Für mein jetziges vorhaben möchte ich serielle Strings empfangen.
      Beispiel: die seriellen Strings z.B Test & Test1 werden über die serielle Schnittstelle eines Laptops, zur seriellen Schnittstelle des Raspberry Pi gesendet.
      Diese seriellen Strings werden dann von openHAB (Raspberry Pi) ausgewertet und entsprechender Code wird ausgeführt. Wie von dir im Post #2 beschrieben

      2. Die serielle Schnittstelle des Raspberry ist soweit eingerichtet, ich kann über die serielle Schnittstelle des Rasperry via openHAB serielle Strings senden, diese Strings werden dann von einem Device ausgewertet, um eine Bestimmte Aktion auszuführen. Funktioniert absolut zuverlässig.

      3. hier habe ich vergessen die Gruppe mit anzugeben Group Wohn1 (ALL) ist bei mir im Code eingepflegt.

      Abschließend:
      Du hast meine Frage absolut richtig verstanden und beantwortet.

      Besten Dank nochmal.
      Gruß savana






      Kommentar


        #4
        Solange Du Rules für einzelne Items erstellst, solltest Du natürlich auch auf die einzelnen Items triggern, keinesfalls auf eine Gruppe.

        Wenn Du mehrere gleichartige Items hast, für die Du dann weitgehend identische Rules erstellen müsstest, kann es - je nach Anzahl Items - sinnvoll sein, die alle in eine Gruppe zu stecken und auf die Gruppe zu triggern.
        Dabei sind allerdings einige Dinge zu beachten, unter anderem musst Du dann in der Rule herausfinden, welches Item denn eine Änderung am Groupitem ausgelöst hat. Weiterhin funktionieren die Trigger eventuell anders als erwartet, z.B. was passiert, wenn in einer Gruppe zwei Items einen unterschiedlichen Zustand haben? Wenn die Gruppe z.B. OFF war und dann ON triggert, kann sie beim nächsten ON-Event keinen Change OFF->ON triggern, sie ist ja schon ON.
        Außerdem gibt es wohl (teilweise) mehrere Triggerereignisse, obwohl nur ein Item ein Update bekam - hab ich bei mir noch nicht beobachtet, aber es gibt dazu mehrere ernstzunehmende Beiträge, da müsste man also im Zweifelsfall auch eine Sicherung einbauen.

        Das triggern über Gruppen ist also eher ein Thema deutlich nach den ersten Gehversuchen

        Kommentar


          #5
          Hallo udo1toni,

          Danke für deine Ausführliche Beschreibung.

          ich habe deinen Code getestet siehe unten, dieser funktioniert einwandfrei, ich empfange die seriellen Strings vom Laptop. Der Switch Desk schaltet Ein und Aus.


          Nachdem ich deinen Code eingepflegt habe und meine anderen Funktionen prüfen wollte, habe ich festgestellt das ich jetzt keine seriellen Strings mehr senden kann. Also vom Raspberry Pi über die serielle Schnittstelle raus.

          Vieleicht hast du eine Idee was das sein kann ??

          Besten Dank vorab Gruß savana

          .item
          Code:
          Group Wohn1 (ALL)
          Switch httpSwitch "Desk " (Wohn1) { http=">[ON:POST:http://192.168.179.2/xml/jsonswitch.php?id=1&set=1] >[OFF:POST:http://192.168.179.2/xml/jsonswitch.php?id=1&set=0]" }
          String SeriellAMA0 "Serielle Schnittstelle" { serial="/dev/ttyAMA0" }

          .rule
          Code:
          rule "AMA0 Empfang"
          when
              Item SeriellAMA0 received update
          then
              if (SeriellAMA0.state.toString=="Test\r")
                  httpSwitch.sendCommand(OFF)
              else if (SeriellAMA0.state.toString=="Test1\r")
                  httpSwitch.sendCommand(ON)
          end
          Zuletzt geändert von savana; 12.03.2016, 10:38.

          Kommentar


            #6
            Wenn der Empfang geht, kannst Du an dieselbe Schnittstelle senden, indem Du SeriellAMA0.sendCommand("Mein String\r") verwendest. Eine serielle Schnittstelle, ein Item...

            Kommentar


              #7
              Hallo udo1toni,

              vielen Dank für deine Antwort.
              ich habe das ganze mal getestet wie von dir beschrieben siehe unten im Code, leider konnte ich die Strings "Mein String" und "Mein String1" nicht senden, bzw. am Laptop empfangen.

              Wenn ich von meinem Laptop die Strings Test oder Test1 zum Raspberry sende, wird die Syntax httpSwitch.sendCommand(OFF) und httpSwitch.sendCommand(ON) einwandfrei ausgeführt.

              Mir ist aufgefallen das in deinem Code aus post #2 die geschweiften Klammern in .rule gefehlt haben, ich habe diese nachgepflegt jetzt funktionieren wieder meine seriellen Strings, die aus dem Raspberry pi zum Laptop gesendet werden.

              Gruß savana

              .rule
              Code:
              import org.openhab.core.library.types.*
              import org.openhab.core.persistence.*
              import org.openhab.model.script.actions.*
              import org.joda.time.DateTime
              
              var Number counter = 1
              var Timer timer = null
              
              rule "AMA0 Empfang"
              when
                  Item SeriellAMA0 received update
              then
                  if (SeriellAMA0.state.toString=="Test\r")
                  [COLOR=#000000]{[/COLOR]
                  SeriellAMA0.sendCommand("Mein String\r")         <   zur Info, [I]hier wird entweder der rote oder der schwarze code eingesetzt[/I]
              [COLOR=#FF0000]    httpSwitch.sendCommand(OFF) [/COLOR]
                  }
                      
                  else if (SeriellAMA0.state.toString=="Test1\r")
                  {
                  SeriellAMA0.sendCommand("Mein String1\r")        <   zur Info, [I]hier wird entweder der rote oder der schwarze code eingesetzt[/I]
                   [COLOR=#FF0000]httpSwitch.sendCommand(ON)[/COLOR]
                  }
                      
              end
              .item
              Code:
              Switch httpSwitch "Desk " (Wohn1 )
              String SeriellAMA0 "Serielle Schnittstelle" { serial="/dev/ttyAMA0@9600" }

              Kommentar


                #8
                Die geschweiften Klammern brauchst Du, sobald mehr als ein Befehl ausgeführt werden soll. Du kannst also
                Code:
                rule
                when
                    [...]
                then
                    if(irgendeine bedingung)
                        genau ein befehl
                    else
                        genau ein anderer befehl
                end
                schreiben oder
                Code:
                rule
                when
                    [...]
                then
                    if(irgendeine bedingung) {
                        genau ein befehl }
                    else {
                        genau ein anderer befehl }
                end
                das bleibt sich gleich. Im zweiten Fall kannst Du aber abhängig von der Bedingung jeweils beliebig viele Befehle hintereinander ausführen lassen.

                Kommentar


                  #9
                  Hallo udo1toni,

                  besten Dank für deine Information.

                  Gruß savana

                  Kommentar

                  Lädt...
                  X