Ankündigung

Einklappen
Keine Ankündigung bisher.

REGEX Hilfe

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

    REGEX Hilfe

    Hallo,

    ich habe ein NET-AVR-IO Board, welches eine WebSeite mit Sensor-Werten bereit stellt. Diese Seite hat folgenden Inhalt:
    Code:
    <html><head></head><body>AT_Akt=-2,8
    AT_Min=-5,8
    AT_Max=20,3
    IT_Akt=1,6
    IT_Min=-1,0
    IT_Max=27,9
    Humi_Akt=63,7
    Humi_Min=23,2
    Humi_Max=66,6
    Taup_Akt=-4,6
    Taup_Min=-6,9
    Taup_Max=5,8
    Sonne=1018
    </body></html>
    Meine Frage nun, wie müsste eine HTTP-Binding REGEX ausehen?
    Ich habe bereits folgendes probiert:
    Code:
    Number Temperature_Greenhouse_Indoor_Actual "Aktuelle Innentemperatur [%.1f °C]" <temperature> (Greenhouse) { http="<[http://IP-des-AVR-NET-IO/daten.html:60000:REGEX(.*?IT_Akt=)]" }
    Doch es wird kein Wert extrahiert!

    Kann mir bitte jemand helfen? Irgendwie passt die REGEX wohl nicht...
    Danke

    Gruß
    Christian

    Mein EIB-Projekte:
    EIB-Interface -> Siemens N148/21 IP-Schnittstelle
    EIBD -> FritzBox 7170 WLAN Router
    linKNX -> Synology DS101j NAS
    Visu -> eigene PHP-Seiten

    #2
    Probiere mal
    Code:
    Number Temperature_Greenhouse_Indoor_Actual "Aktuelle Innentemperatur [%.1f °C]" <temperature> (Greenhouse) { http="<[http://IP-des-AVR-NET-IO/daten.html:60000:[COLOR=Red]'[/COLOR]REGEX(.*?IT_Akt=[COLOR=Red](.*,.).*)'[/COLOR]]" }
    Die innere Klammer wird zurück gegeben, das außenrum kennzeichnet den Match und den Rest der Datei, der ganze RegEx-Ausdruck muss noch mit Hochkomma versehen sein.

    Kommentar


      #3
      Nö, das mit den Hochkommas führte nur zu:
      Code:
      2015-02-23 19:34:07.573 [ERROR] [.service.AbstractActiveService] - Error while executing background thread HTTP Refresh Service
      java.lang.IllegalArgumentException: given transformation function ''REGEX(.*?IT_Akt=(.*,.).*)'' does not follow the expected pattern '<function>(<pattern>)'
          at org.openhab.binding.http.internal.HttpBinding.splitTransformationConfig(HttpBinding.java:221) ~[na:na]
          at org.openhab.binding.http.internal.HttpBinding.execute(HttpBinding.java:172) ~[na:na]
          at org.openhab.core.binding.AbstractActiveBinding$BindingActiveService.execute(AbstractActiveBinding.java:156) ~[na:na]
          at org.openhab.core.service.AbstractActiveService$RefreshThread.run(AbstractActiveService.java:173) ~[na:na]
      Danke

      Gruß
      Christian

      Mein EIB-Projekte:
      EIB-Interface -> Siemens N148/21 IP-Schnittstelle
      EIBD -> FritzBox 7170 WLAN Router
      linKNX -> Synology DS101j NAS
      Visu -> eigene PHP-Seiten

      Kommentar


        #4
        Zitat von cni Beitrag anzeigen
        Nö, das mit den Hochkommas führte nur zu:
        Stimmt. War spät gestern nacht...
        Egal, das mit den Hochkommata ist Quatsch (war in dem Beispiel bei dem ich nachgeschaut hatte so notiert, keine Ahnung, warum...)
        Allerdings die Sache mit der zweiten Klammer stimmt so.
        Schau mal hier da sind etliche REGEX-Beispiele angegeben.
        Wenn ich mich richtig erinnere, bewirkt die Notation (.*?) dass der kürzeste Match verwendet wird also z.B. bei der Zeichenkette Test123.45TTTTTTTest bewirkt dann REGEX(.*st(.*?)T.*) die Rückgabe von 123.45. Wichtig ist auch das Komma im Wert, das wird vermutlich nicht korrekt als Komma gewertet, da wirst Du wohl noch irgendwie eine Konvertierung vornehmen müssen.

        Kommentar


          #5
          Hi,

          ich vermute, mit der REGEX ist es problematisch das "," als einen
          Dezimalpunkt zu interpretieren.

          Hier eine Alternative:

          Bei meinem JeeLink bekomme ich auch einen String, den ich
          ich einfach in eine String-Variable packe.

          configurations/items/jeenode.items:
          Code:
          String  JeeLink1 "JeeLink1 [%s]"  (All)           { serial="/dev/ttyUSB0" }
          Und dann mit einer Rule zerlegen:
          (hier eine gekürzte Fassung, LCT1_Temp ist ein Number, basiert auf einem Beispielcode im Forum, hab' leider keine Referenz mehr.)

          configurations/rules/jeenode.rules:

          Code:
          import org.openhab.core.library.types.*
          
          rule "JeeLink1 Message Rx"
             when
                Item JeeLink1 changed
             then
                var String s = JeeLink1.state.toString.trim
                //logWarn("jeenode.rules", "JeeNode Rx:" + s)
                var String[] buffer = JeeLink1.state.toString.trim().split(" ")
                
                //OK 9 24 1 3 246 90
                if (buffer.get(0).contains("OK")) {
                        if (buffer.get(1).equals("9")) {
                            var Number hi = new Integer(buffer.get(4))
                            var Number lo = new Integer(buffer.get(5))
                            var Number t = ((hi * 256 + lo) - 1000) / 10.0
                            if (buffer.get(2).equals("52")) {
                                LCT1_Temp.postUpdate(t)      
                                LCT1_LastUpdate.postUpdate(new DateTimeType().toString)
                            }
                       }
                  } else {
                    logWarn("jeenode.rules", "JeeNode Rx Noise")
                }
          end

          Kommentar


            #6
            Ja, das mit dem Komma ist in der Tat richtig!

            Wenn ich:
            Code:
            String Greenhouse_Indoor_Temperature_Actual "Innentemperatur [%s °C]" <temperature> (Greenhouse) { http="<[http://IP-des-AVR-NET-IO/daten.html:60000:REGEX(.*?IT_Akt=.*?(.*?,.).*)]" }
            verwende, klappt es.

            Demnächst werde ich die Ausgabe-Seite des AVR-NET-IO umschreiben, so dass dieser die Werte mit . anstatt mit , aus giebt. Dann sollte auch Number als Format klappen.

            Nächste Ausbaustufe wäre dann, dass der AVR-NET-IO seine Werte per REST API an openHAB schickt...
            Danke

            Gruß
            Christian

            Mein EIB-Projekte:
            EIB-Interface -> Siemens N148/21 IP-Schnittstelle
            EIBD -> FritzBox 7170 WLAN Router
            linKNX -> Synology DS101j NAS
            Visu -> eigene PHP-Seiten

            Kommentar


              #7
              Hallo cni,

              hast du den REGEX Ausdruck schon mal so angepasst, dass der Teil in der Klammer nur Dezimalwerte auswertet?

              z. B.:
              Code:
               String Greenhouse_Indoor_Temperature_Actual "Innentemperatur [%s °C]" <temperature> (Greenhouse) { http="<[http://IP-des-AVR-NET-IO/daten.html:60000:REGEX(.*?IT_Akt=.*?([0-9\,]*).*)]" }
              Gruß mepi0011

              Kommentar


                #8
                Hallo mepi0011,

                nein, aber es funktioniert doch erst mal.
                Um Diagramme daraus zu generieren muss ja zwangsläufig Number als Datentyp benutzt werden, also werde ich um das Umschreiben der daten.html Seite nicht herum kommen.
                Oder? Gibt es denn eine Möglichkeit das , als . in der RegEx umzuwandeln?
                Danke

                Gruß
                Christian

                Mein EIB-Projekte:
                EIB-Interface -> Siemens N148/21 IP-Schnittstelle
                EIBD -> FritzBox 7170 WLAN Router
                linKNX -> Synology DS101j NAS
                Visu -> eigene PHP-Seiten

                Kommentar


                  #9
                  Hallo cni,

                  das Code-Beispiel das ich oben vorgeschlagen habe, solte auch das Komma mit auslesen (so zumindest die Theorie).

                  Danach muss noch String in Number geändert werden. Bitte mal testen!

                  Gruß
                  mepi0011

                  Kommentar


                    #10
                    Hallo, ich hab wahrscheinlich das selbe Problem, dass ich den Wert den ich von meiner Heizungssteuerung ( Z. Bsp. Raumtemperatur) bekomme, mit Komma getrennt ist.
                    Wenn ich mit Hilfe von REGEX einen "String" ausschneide, funktioniert das. Mit "Number" hab ich schon alles mögliche versucht. Ohne Erfolg....
                    Macht es für eine mögliche Weiterverarbeitung einen Unterschied ob der Wert ein "String" oder "Number" ist ? --> Wenn ich z.bsp auf Grund der bestimmten Raumtemperatur dann etwas steuern will ?

                    Danke für die Hilfe
                    Gruss Stefab

                    Kommentar


                      #11
                      Hallo, ich grabe hier einfach mal ein altes Thema wieder aus, der letzte Post ist zwar schon 2 Jahre her aber ich beziehe mich auf meinen Vorgänger.
                      Ich habe nach diesem Thread und allgmein durch dieses Forum schon viel herrausgefunden und rumprobiert, nur leider bin ich jetzt am Ende meines Wissens.
                      Ich habe leider das Problem das sich der String eben nicht weiterverarbeiten lässt, würde gerne meine Temperaturwerte im Chart darstellen nur da ist das Problem:

                      *.items
                      Code:
                      String                 Indoor_Temperature1         "Innen1 [%s°C]"         <temperature>         (Temperaturen)                 { http="<[arduino:5000:REGEX(.*?IN_1=(.*?.)IN_2=.*)]" }
                       String                Indoor_Temperature2         "Innen2  [%s°C]"         <temperature>         (Temperaturen)                 { http="<[arduino:5000:REGEX(.*IN_2=(.*?)IN_3=.*)]" }
                      String                Indoor_Temperature3         "Innen3 [%s°C]"         <temperature>         (Temperaturen)                 { http="<[arduino:5000:REGEX(.*IN_3=(.*?)IN_4=.*)]" }
                      String                Indoor_Temperature4         "Innen4 [%s°C]"         <temperature>         (Temperaturen)                 { http="<[arduino:5000:REGEX(.*IN_4=(.*?).*)]" }
                      die Items datei liefert mir ja nur den String und kein Number format zur weiterverarbeitung

                      ich beziehe die Daten nicht vom AVR-Net-IO sondern von einem Arduino Webserver der mir eine Seite als html hergibt.

                      Hat jemand einen Ansatz für mich wie sich das wandeln lässt?

                      viele GRüße Sebastian
                      Zuletzt geändert von Sebastian1701; 09.02.2017, 13:07.

                      Kommentar


                        #12
                        Vermutlich wäre es besser, einen anderen Transformation Service zu nutzen, also das Ganze nicht mit REGEX, sondern mit JS zu erschlagen. Dabei definierst Du ein Script, welches die Transformation übernimmt. Schau Dir mal https://github.com/openhab/openhab1-...mation-service an. Insbesondere gibt es häufiger mal das Problem, dass der String ein Komma statt eines Punktes als Dezimaltrennzeichen enthält, das lässt sich mit JS recht bequem lösen.

                        Kommentar

                        Lädt...
                        X