[Gelöst:]RegEx liefert immer 1.0 anstelle des korrekten Wertes

Begonnen von josburg, 24 Januar 2016, 17:15:50

Vorheriges Thema - Nächstes Thema

josburg

Hallo,

ich möchte gerne vom Windmesser Mobile Alerts 10660 die entsprechenden Daten auslesen.
http://www.amazon.de/gp/product/B015WC8OUS/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B015WC8OUS&linkCode=as2&tag=jensosburaspu-21

Leider erhalte ich bei dem Ergebnis mittels RegEx immer den Wert "1.0"
Anbei mal der aktuell ausgelesene Datensatz:

{ "idx": 24602, "ts": 1453650673, "tx": 7178, "c": 1453650744, "pr": false, "ws": 0.1, "wg": 1.1, "wd": 10 }


Die Definition sieht folgendermaßen aus:

[b]reading01Name[/b]  WINDGESCHWINDIGKEIT
[b]reading01Regex[/b] "ws": (\d?\d.\d)

[b]reading02Name[/b]  BÖE
[b]reading02Regex[/b] "wg": (\d?\d.\d)

[b]reading03Name[/b] WINDRICHTUNG
[b]reading03Regex[/b] "wd": (\d?\d.\d)

[b]stateFormat[/b] {sprintf("%.1f m/s, Böe %.1f m/s, Windrichtung %.1f", ReadingsVal($name,"WINDGESCHWINDIGKEIT",0), ReadingsVal($name,"BÖE",0), ReadingsVal($name,"WINDRICHTUNG",0))}


Im Anhang dann noch das Bild des Ergebnis...

Laut Datensatz müsste jetzt doch bei Windgeschwindigkeit "0.1", bei Böe "1.1" und bei Windrichtung "10" angezeigt werden....?!?
Was mache ich falsch?

frank

ich spekuliere mal, hier geht es um httpmod.
besser als ein bilde ist immer ein "list <name>", da es mehr infos enthält und einfacher zu lesen ist.

versuche mal die doppelten anführungszeichen zu maskieren => \"
und für leerzeichen einen punkt zu setzen. ich würde folgendes versuchen:

reading01Regex \"ws\":.([\d\.]+)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

josburg

Zitat von: frank am 24 Januar 2016, 18:14:23
ich spekuliere mal, hier geht es um httpmod.
besser als ein bilde ist immer ein "list <name>", da es mehr infos enthält und einfacher zu lesen ist.

versuche mal die doppelten anführungszeichen zu maskieren => \"
und für leerzeichen einen punkt zu setzen. ich würde folgendes versuchen:

reading01Regex \"ws\":.([\d\.]+)

Hallo Frank,

vielen Dank für Deine Unterstützung - leider hat der Code von Dir bisher noch keine Veränderug gebracht.
Ich habe das Ergebnis von list im Anhang bereitgestellt - evtl. fällt Dir noch etwas auf?

Vielen Dank

Jens

Markus Bloch

#3
Hallo zusammen,

das Ergebnis ist völlig richtig, wenn man sich den output anschaut:

Zitat{
  "success": true,
  "primarydomain": "www.data199.com",
  "phoneid": "032330673013",
  "result": {
    "devices": [
      {
        "deviceid": "0B07EB324C23",
        "devicetypeid": 11,
        "name": "Windsensor Gommels",
        "lang": "de",
        "lastseen": 1453657841,
        "lowbattery": false,
        "alertwasactive": false,
        "settings": {
          "wsalarmactive": false,
          "ws": 1.0,
          "wgalarmactive": false,
          "wg": 1.0,

Daher muss die Regexp folgendermaßen heißen:


reading01Name]  WINDGESCHWINDIGKEIT
reading01Regex (?s)"measurements"[^}]+"ws": (\d+\.\d+)

reading02Name  BÖE
reading02Regex (?s)"measurements"[^}]+"wg": (\d+\.\d+)

reading03Name WINDRICHTUNG
reading03Regex (?s)"measurements"[^}]+"wd": (\d+\.\d+)


Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Diese matcht dann auf:

Zitat{
  "success": true,
  "primarydomain": "www.data199.com",
  "phoneid": "032330673013",
  "result": {
    "devices": [
      {
        "deviceid": "0B07EB324C23",
        "devicetypeid": 11,
        "name": "Windsensor Gommels",
        "lang": "de",
        "lastseen": 1453657841,
        "lowbattery": false,
        "alertwasactive": false,
        "settings": {
          "wsalarmactive": false,
          "ws": 1.0,
          "wgalarmactive": false,
          "wg": 1.0,
          "wats": 360,
          "wdnalarmactive": true,
          "wdnnealarmactive": true,
          "wdnealarmactive": true,
          "wdenealarmactive": true,
          "wdealarmactive": true,
          "wdesealarmactive": true,
          "wdsealarmactive": true,
          "wdssealarmactive": true,
          "wdsalarmactive": true,
          "wdsswalarmactive": true,
          "wdswalarmactive": true,
          "wdwswalarmactive": true,
          "wdwalarmactive": true,
          "wdwnwalarmactive": true,
          "wdnwalarmactive": true,
          "wdnnwalarmactive": true
        },
        "measurements": [
          {
            "idx": 24653,
            "ts": 1453657841,
            "tx": 7195,
            "c": 1453658001,
            "pr": false,
            "ws": 0.1,
                "wg": 0.8,
                "wd": 11

           },

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

josburg

Hallo Markus,

vielen Dank für Deine Hilfe - manchmal sieht man den Wald vor lauter Bäumen nicht.

Vielleicht kannst Du mir nochmal weiterhelfen, als Anfänger tut man sich doch öfters schwer....
Für "Böe" und "Windgeschwindigkeit" funktioniert es dank Deiner Hilfe jetzt, aber Windrichtung wird immer noch mit "0.0" angezeigt.

Jetzt habe ich mir die Readings nochmal angeschaut und bemerkt, dass "Windrichtung" gar nicht angelegt ist, obwohl ich es als attr definiert habe (siehe Auszug aus list):

   Readings:
     2016-01-24 20:25:35   BÖE            2.7
     2016-01-24 20:25:35   WINDGESCHWINDIGKEIT 1.5
   Request:
     data       devicetoken=c469a2c5-2f82464f-a73969cc-e1e3bf15-2eb7db2b-2b2cc4fb-a87fd82a-f596ab77&vendorid=3D3BCADD-79C6-4AEE-9F8B-73C83C047122&phoneid=032330673013&version=1.21&build=248&executable=Mobile Alerts&bundle=de.synertronixx.remotemonitor&lang=de&timezoneoffset=60&timeampm=false&usecelsius=true&usemm=true&speedunit=1&timestamp=1453237425&requesttoken=07436acf2dce9a096aef931736865952&deviceids=0B07EB324C23,&measurementfroms=,0,0,0,0,0,&measurementcounts=,50,50,50,50,50,
     header     Content-Type: application/x-www-form-urlencoded
     ignoreredirects 0
     retryCount 0
     type       Update
     url        http://23.97.212.128:8080/api/v1/dashboard
Attributes:
   reading01Name WINDGESCHWINDIGKEIT
   reading01Regex (?s)"measurements".+?"ws": (\d+\.\d+)
   reading02Name BÖE
   reading02Regex (?s)"measurements".+?"wg": (\d+\.\d+)
   reading03Name WINDRICHTUNG
   reading03Regex (?s)"measurements".+?"wd": (\d+\.\d+)


Markus Bloch

Weil "wd" keinen Punkt im Value hat:

"wd": 11

Die Regexp also lauten muss:

   reading03Regex (?s)"measurements".+?"wd": (\d+)

Habe ich aber auch nicht drauf geachtet muss ich gestehen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

josburg

Hallo Markus,

super, vielen Dank. Den Thread habe ich auf "gelöst"  gesetzt.
Da ich den Eindruck habe, dass Du mir spontan die nächste Antwort geben kannst, hier noch ein Versuch - ansonsten lese ich erstmal wieder eine Weile weiter...

Zur Anzeige verwende ich FHEM TabletUI (FTUI) und möchte das "wind_direction" - Widget verwenden.
Der Mobile Alerts Sensor
http://www.amazon.de/gp/product/B015WC8OUS/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=B015WC8OUS&linkCode=as2&tag=jensosburaspu-21
gibt die Windrichtung ja numerisch aus, also:
wd = Windrichtung (0 = N, 1 = NNO, 2 = NO, 3 = ONO, 4 = O, ...., 12 = W, 13 = WNW, 14 = NW, 15 = NNW)


Das "wind_direction" - Widget nimmt, so wie ich die Anleitung hier verstehe https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/wind_direction, die Daten z.B. in Grad entgegen:

Attribute
direction

Reading mit der Windrichtung. Kann numerisch (0-360) oder in Textform ("NO") angegeben sein. Default: wind_direction


Wie setze ich jetzt die numerischen Werte der Windrichtung "0", "1", "2".....,"14", "15" um in die entsprechenden Grad-Zahlen?

Evtl. hast Du ja nochmal kurz Lust, mir zu helfen.

Viele Grüße
Jens

Markus Bloch

Ganz einfach. Am schnellsten und simpelsten würde ich den Wert "wd" nehmen und durch 15 teilen und dann mit 360 multiplizieren:

attr SENSOR_WINDGESCHWINDIGKEIT userReadings wind_direction_corrected:wind_direction { int(ReadingsVal("SENSOR_WINDGESCHWINDIGKEIT","wind_direction",0))/15*360 }

dadurch wird der Wert aus wind_direction genommen und folgendermaßen umgewandelt:

0 => 0°
1 => 24°
2 => 48°
3 => 72°

Dann in FTUI das neue Reading wind_direction_corrected nehmen.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)