Ankündigung

Einklappen
Keine Ankündigung bisher.

ASCII Daten über TCP empfangen und auswerten

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

    ASCII Daten über TCP empfangen und auswerten

    Ich bräuchte mal einen Denkanstoß.

    Ich möchte die Daten eines 1 Wire Controllers auswerten. Es wird zyklisch ein String gesendet, der die Daten sämtlicher angeschlossener Sensoren enthält.

    Ich muss also den String empfangen, zerlegen, die Messwert extrahieren und dann Items zuordnen. Auf einer SPS habe ich sowas schonmal gemacht. Nur weiß ich nicht welche "Werkzeuge" ich in openHAB verwenden kann.

    Was wäre ein Lösungsansatz in openHAB? Das TCP Binding läuft anscheinend nicht stabil?

    #2
    Es gibt ein OneWire Binding. Hilft das?

    Kommentar


      #3
      Leider nein. In meinem Fall liegen die 1 Wire Daten schon durch den 1 Wire Controller aufbereitet als ASCII String vor. Das Binding ist dazu da Daten für einen bestimmten Sensor direkt aus dem 1 Wire Server abzuholen soweit wie ich das sehe.

      Kommentar


        #4
        Ah. Ich dachte, mit dem OWServer könntest Du auf den Controller zugreifen. Aber das ist wohl nur ein bestimmter Controller.

        Dann ginge es tatsächlich über das http Binding.
        Wie sieht denn der String aus, kannst Du ein konkretes Beispiel posten?

        openHAB bietet von Haus aus z.B. JSONPATH, mit dem man JSON abfragen kann, genauso steht XPath und XSLT zur Verfügung, eventuell köntest Du auch mit REGEX glücklich werden, schlimmstenfalls mit JavaScript, welches Dir dann alle Freiheiten gibt, einen empfangenen String auseinander zu nehmen.

        Kommentar


          #5
          So sieht das aus. Im Augenblick gehören immer zwei Zeilen zusammen. Einmal die Zeile mit EVT, dann ein Carriage return und dann die Zeile für Sensor 1. Für jeden weiteren Sensor würde dann entsprechend mehr kommen.

          Putty-1-wire.JPG

          Kommentar


            #6
            Grob sieht es erstmal so aus:
            Code:
            String OWinput { tcp="<[192.168.0.110:3000:'REGEX((.*))']"}
            Damit kommt der gesamte Text rein.
            Code:
            Number OWinput { tcp="<[192.168.0.110:3000:'REGEX(.*1_OWD1|(.*))']"}
            Damit kommt nur der Teil nach 1_OWD1| rein, also der numerische Wert.
            Wenn es mehrere Sensoren in der Liste gibt, ist es natürlich sinnvoller, den Input unbearbeitet zu lassen und in einer Rule den String zu zerlegen. Sieht dann so aus:
            Code:
            Group gSensoren
            String OWinput { tcp="<[192.168.0.110:3000:default]"}
            Number OWSensor1_OWD1 "OWD1 [%d]" (gSensoren)
            Number OWSensor1_OWD2 "OWD2 [%d]" (gSensoren)
            Number OWSensor1_OWD3 "OWD3 [%d]" (gSensoren)
            d.h., für jeden Sensor gibt es ein eigenes Item, welches aber keine Bindung hat. Diese Items sind alle in einer Gruppe. Die Namen enthalten einen Unterstrich und danach den Text vor dem Messwert.
            Code:
            rule "OWinput auslesen"
            when
                Item OWinput changed
            then
                gSensoren.members.forEach[i|
                    val String sReg = "(.*1_"+i.name.split("_").get(1)+"|(.*))"
                    val Number nWert = transform("REGEX",sReg,OWinput.state)
                    i.postUpdate(nWert)
                ]
            end
            Die Rule triggert jedesmal, wenn sich der String geändert hat, der über das Item rein kommt.
            Wenn die Rule triggert, wird der Code nach dem then ausgeführt.
            Die erste Zeile erzeugt ein Schleife, die alle Member der Gruppe gSensoren durchläuft.
            Für jedes Item wird aus dem Itemnamen ein REGEX-String errechnet.
            Anschließend wird der REGEX-String verwendet, um den numerischen Wert zu extrahieren. Dieser Wert wird anschließend in das Item gespeichert.
            Zuletzt geändert von udo1toni; 06.02.2019, 23:40.

            Kommentar


              #7
              Vielen Dank! Das werde ich ausprobieren

              Aber das TCP Binding brauch ich dazu oder?

              Kommentar


                #8
                Ja, irgendwie musst Du ja die Daten rein bekommen.

                Kommentar


                  #9
                  Donnerknall: Du hast nicht zufällig den Esera 1-wire Controller aus diesem Beitrag hier?

                  Ich überlege auch schon wie ich die Daten nach OpenHAB bekomme. Die Varianten scheinen mir mittels TCP Binding oder über NodeRed -> MQTT. Letzteres erscheint mir aber deutlich aufwändiger. Allerdings gibt es ja beim TCP Binding diesen Bug der die Stabilität beeinträchtigt. Nun weiß ich nicht ob der Bug im Server und im Client Fall auftritt. Also entweder ist das Binding der Client und holt die Daten beim Controller ab oder andersherum - Controller schickt (als Client) seine Daten an das Binding (Server).
                  Wie läuft denn der Controller bisher? Wie viele Geräte hängen bei Dir am Bus?
                  Hast Du ein Testsystem? Vielleicht kannst Du das TCP-Binding (als Server) einfach mal testen?

                  Kommentar


                    #10
                    Genau diesen Controller. Der lag fast 5 Jahre in der Schublade weil ich mich dann doch damals fürs Wiregate entschieden habe. Das will ich aber mittelfristig ersetzen.
                    Im Augenblick hab ich nur einen Sensor dranhängen zum Testen.

                    Kommentar


                      #11
                      Wenn das Teil einigermaßen verbreitet ist, wäre es eine Idee, ein passendes Addon zu schreiben. Vielleicht fragt ihr mal im englischen Forum (ich könnte mir auch vorstellen, dass schon jemand daran arbeitet...)

                      Kommentar


                        #12
                        Zitat von udo1toni Beitrag anzeigen
                        Vielleicht fragt ihr mal im englischen Forum (ich könnte mir auch vorstellen, dass schon jemand daran arbeitet...)
                        Ja, habe ich vor ein paar Tagen schon gemacht. Hier der Post. Leider bisher mit "mäßigem" Erfolg. Ich habe auch bei Esera mal per Kontaktformular angefragt. Leider auch ohne Antwort bisher.


                        Donnerknall: Wäre cool wenn Du das wie von udo1toni oben geschrieben mal mit dem TCP/UDP binding testen könntest.

                        Kommentar


                          #13
                          So ein Zufall, ich habe Anfang der Woche mit Esera wegen dem Thema telefoniert
                          War sehr nettes und informatives Gespräch.

                          Ich will das die Tage mal ausprobieren wenn ich Zeit dazu finde.

                          Kommentar


                            #14
                            So, also ich hab mir mal das TCP Binding installiert auf meiner Testumgebung mit OH2.4.

                            Dann hab ich mir mal die tcp.cfg angesehen. Laut openHAB Doku sollten die Parameter für die meisten Anwendungen nur optional sein. Folgende Parameter hab ich im Augenblick eingestellt:
                            Code:
                            # Port to listen for incoming connections
                            port=5003
                            # Interval between reconnection attempts when recovering from a communication error,
                            # in seconds
                            retryinterval=5
                            # Allow masks in ip:port addressing, e.g. 192.168.0.1:* etc
                            addressmask=true
                            # Timeout - or 'refresh interval', in milliseconds, of the worker thread
                            refreshinterval=250
                            # Used character set
                            charset=ASCII
                            Dann hab ich folgendes Item angelegt:
                            Code:
                            String OWinput { tcp="<[192.168.0.110:5000:'REGEX((.*))']"}
                            Nachdem das aber noch nicht erfolgreich war hab ich Sicherheitshalber mal openHAB neu gestartet.

                            Hier ist ein Screenshot der Console. Alles was die TCP Geschichte betrifft hab ich mal gelb markiert.

                            Das Item bekommt kein Update. Ich sehe auch nicht in der Console, das irgendwas empfangen wird. Weiter bin ich leider noch nicht.
                            TCP_Binding_Console.JPG

                            Edit: Eine Verbindung zum 1-Wire Controller muss aber aufgebaut worden sein, meine aktive Putty Verbindung wurde nämlich unterbrochen.
                            Zuletzt geändert von Donnerknall; 12.02.2019, 16:58.

                            Kommentar


                              #15
                              Hi, hast du den 1wire controller auch auf “lesen” konfiguriert? Da gab es doch einen Hinweis auf verschiedene Modi im Handbuch (bin gerade unterwegs und kann nicht nachsehen).

                              Kommentar

                              Lädt...
                              X