Ankündigung

Einklappen
Keine Ankündigung bisher.

Serielle abfrage in HEX per SH Skript an openHAB übergeben

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

    Serielle abfrage in HEX per SH Skript an openHAB übergeben

    Hallo,

    ich bekomme von meiner Solar Anlage folgenden HEX Datensatz über die Serielle Schnittstelle.

    pi@raspberrypi:~ $ od -t x1 -w128 -N128 < /dev/ttyUSB0
    0000000 29 fc 3e 24 01 e5 01 51 03 4a 01 fd 00 00 00 b0 01 00 00 00 00 00 05 00 00 00 00 13 28 1d 08 12 6c 00 0b 00 00 00 6c 16 00 00 00 00 0a 00 00 00 00 00 00 e5 01 00 00 00 00 00 00 00 00 00 00 00 00 0e fc 3e 24 01 e5 01 51 03 4a 01 fd 00 00 00 b0 01 00 00 00 00 00 05 00 00 00 00 13 28 1d 08 12 6c 00 0b 00 00 00 6c 16 00 00 00 00 0a 00 00 00 00 00 00 e5 01 00 00 00 00 00 00 00 00 00 00
    0000200
    Da über das Serial binding nur Text reinkommt kann ich darüber leider nichts auswerten und muss die Daten wie oben beschrieben einlesen.

    Kann mir jemand helfen ein sh-Skript zu schreiben welches die Daten über "od -t x1 -w128 -N128 < /dev/ttyUSB0" abfragt, alles vor "FC 3E" abschneidet (da kann auch mehr vor stehen) und dann wie folgt zusammenfasst.

    fc 3e 24 01 = Header
    e5 01 = Temperatur1 Umrechnung von HEX 01 05 > 48,5 DEZ

    51 03 = Temperatur2 Umrechnung von HEX 03 51 > 84,9 DEZ
    etc.
    und dann als String an OpenHAB wie folgt übergibt.

    Temperatur1:48.5,Temperatur2:84.9, usw.....

    diese könnte ich dann per Regex in HAB in die items packen.

    Gruß Mirco

    #2
    Hallo,
    hast du denn die Daten schon im openHAB als String vorliegen?
    Den kann man parsen und die Werte herauslesen.

    Holger
    Zuletzt geändert von HolgerW; 30.08.2018, 18:41.

    Kommentar


      #3
      Hallo,

      die Daten hatte ich schon über das Serial binding in openHAB, jedoch wandelt das Binding die Daten gleich als STRING, und da kommt nur folgendes raus.
      77+9PIQBEWI9AYUC77+9AAAAXGIAAAAAAAAAAAAAFASYCBIVAB EAAAAVFGAAAAAAAAAAAAAA

      Ich benötige aber die HEX Werte um wie oben beschrieben den Header zu finden und die Daten zu extrahieren.

      Über andere Vorschläge bin ich natürlich dankbar.








      Kommentar


        #4
        Kannst du die serielle Ausgabe in eine Datei ausgeben?
        Ich mache das mit einer Datei aus dem Internet. Diese wird bei mir auf einem Raspi unter /home/pi gespeichert und dann per MQTT an openHAB übergeben (shell script).
        Wie man eine Datei direkt in openHAB einlesen kann weiss ich leider nicht.
        Wenn der String in openHab so vorliegt kann man den entsprechend parsen "0000000 29 fc 3e 24 01 e5 01 51 03 4a 01 fd 0 ..."

        Holger

        Kommentar


          #5
          Hallo,

          so ich bin ein gutes Stück weiter, ich habe jetzt den HEX String in einem item... Dies habe ich über ein Thing gelöst.
          Code:
          Thing exec:command:Solar [command="od -t x1 -w256 -N256 /dev/ttyUSB0", interval=15, timeout=10, transform="REGEX(.*fc 3e 24 01(.*)fc 3e 24 01.*)"]
          Das Ergebnis aus einem item "SolarRAW" muss ich nun in einer Rule zerlegen und high und Low Byte in eine Zahl wandeln, aber dies funktioniert leider nicht...

          Kann bitte jemand helfen?


          Code:
          import java.lang.*
              var string ParadigmaTEMP0
              var string ParadigmaTEMP1
              var Number nIntVal
          
          
          
          rule "Paradigma Werte"
           when
            Item SolarRAW changed
           then
          
            {
              ParadigmaTEMP0(SolarRAW.state.toString.split(" ").get(0))
              ParadigmaTEMP1(SolarRAW.state.toString.split(" ").get(1))
              nIntVal = Integer::parseInt(ParadigmaTEMP1.state.toString + ParadigmaTEMP0.state.toString, 16)
              Kollektortemperatur.postUpdate = nIntVal.floatValue()  / 100
                  }
          end

          Kommentar


            #6
            ich hatte mal aus dem String folgende Rule erstellt, vielleicht kannst du was daraus verwenden.
            Ich bin aber davon ausgegangen den gesamten String zu verarbeiten und suche die Position "fc 3e 24 01"
            Holger
            Code:
            rule "test_11"
            when  
                Time cron "0 * * * * ?"
            then
            
            var String text = "0000000 29 fc 3e 24 01 e5 01 51 03 4a 01 fd 00 00 00 b0 01 00 00 00 00 00 05 00 00 00 00 13 28 1d 08 12 6c 00 0b 00 00 "
            val String match = "fc 3e 24 01"
            
            var String[] buffer
            var Number wert
            var Integer position
            
                position = text.indexOf(match)
                if (position == 0) return
                
            logInfo("rule","test: an Position: " + position.toString)
                
                text = text.substring(position)
                
            logInfo("rule","test: neuer text: " + text)  //ergibt: fc 3e 24 01 e5 01 51 03 4a 01 fd ....
                buffer= text.split(" ")
                
                wert = ((Integer::parseInt(buffer.get(5),16) * 256) +
                        (Integer::parseInt(buffer.get(4),16))).floatValue / 10
            logInfo("rule","test: wert: " + wert.toString())
                
                wert = ((Integer::parseInt(buffer.get(7),16) * 256) +
                        (Integer::parseInt(buffer.get(6),16))).floatValue / 10
            logInfo("rule","test: wert: " + wert.toString())
            
            end

            Kommentar


              #7
              Hallo,

              ich habe es mal umgebaut, lese ich des Item SolarRAW richtig in "buffer" ein? und Schreibe ich "Kollektortemperatur" richtig zurück?

              Code:
              rule "Paradigma Werte"
              
              when
                Item SolarRAW changed or
                Time cron "* * * * * ?"
               then
               
               var String[] buffer
               var Number wert
                buffer = SolarRAW.state.toString.split(" ")
                wert = (((Integer::parseInt(buffer.get(1),16) * 256) + (Integer::parseInt(buffer.get(0),16))).floatValue / 10)
              
                Kollektortemperatur.postUpdate(wert)
              end
              Gruß Mirco

              Kommentar


                #8
                Hallo,
                "buffer" ist ein Stringarray und enthält die einzelnen Werte die vorher am Leerzeichen getrennt wurden.
                Mach dir doch mal Logausgaben dann siehst du die Werte.
                Den Time Cron solltest du rausnehmen wenn du Werte im SolarRAW regelmäßig erhältst, so wird die Rule wohl jede Sekunde ausgeführt, das ist nicht gut.
                Holger

                Kommentar


                  #9
                  Super,

                  einige kleine Anpassungen und nun läuft alles wie gewollt...

                  DANKE für die Hilfe

                  Kommentar

                  Lädt...
                  X