Neue Version von HTTPMOD (mit get Kommando) zum Testen

Begonnen von StefanStrobel, 13 Februar 2015, 22:33:49

Vorheriges Thema - Nächstes Thema

andies

Genau, md5. Aber du bist auch drin, oder?


Gesendet von iPhone mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

amenomade

Ja, ich bin drin, guck am Ende:
Zitat<div class="unfold">
   <h2 i18n:id="expArea_receivedCalls">Angenommene Anrufe</h2>
   <div>
      <div class="c1c headline" style="padding-left: 18px; width: 420px;">
         <div class="frac4" style="width: 20%;">
            <span class="sortable {sort:{template:'addtakencalls', keys:['date', 'time', 'who'], defaultOrder:'down'}}" i18n:id="phone_list_col1">Datum</span>
         </div>
         <div class="frac4" style="width: 20%;">
            <span class="sortable {sort:{template:'addtakencalls', keys:['time', 'date', 'who'], defaultOrder:'down'}}" i18n:id="phone_list_col2">Uhrzeit</span>
         </div>
         <div class="frac4" style="width: 45%;">
            <span class="sortable {sort:{template:'addtakencalls', keys:['who'], defaultOrder:'down'}}" i18n:id="phone_list_col3">Nummer/Name</span>
         </div>
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

huhu

HTTP/1.1 200 OK Connection: close Content-Type: application/json Cache-Control: no-cache { "os selected": { "inside": "0", "outside": "8" }, "internal": { "temperature": "21.2" }, "channel1": { "temperature": "", "humidity": "" }, "channel2": { "temperature": "", "humidity": "" }, "channel3": { "temperature": "", "humidity": "" }, "channel4": { "temperature": "", "humidity": "" }, "channel5": { "temperature": "", "humidity": "" }, "channel6": { "temperature": "", "humidity": "" }, "channel7": { "temperature": "", "humidity": "" }, "channel8": { "temperature": "21.6", "humidity": "0" }, "channel9": { "temperature": "", "humidity": "" }, "channel10": { "temperature": "", "humidity": "" }, "owm": { "temperature": "18.0", "humidity": "72", "wind": "7.2", "rain": "0.0", "weather id": "801" } }

Hallo zusammen,
kann mir jemand unter die Arme greifen? Versuche über HTTPMOD ein json File auszulesen. Der o.g. Code ist die Ausgabe im Buf. Ich benötige eigentlich channel18, der mir aber dort nicht angezeigt wird?

Was muss ich alles angeben, um zb. die Temperatur von Channel8 in einem Reading angezeigt zu bekommen?

amenomade

#48
Versuch mal zuert mit dem Attribute decodeAllJason

Wegen Channel18... was nicht in der Antwort zurückkommt kann httpmod auch nicht bewerten...

Via Tapatalk
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

huhu

Danke, imit ExtractAllJSON bekomme ich alle Werte als Reading angezeigt, damit komme ich erstmal zurecht.
Dennoch bin ich natürlich an einem exakten Wert interessiert ;-)

amenomade

Du kannst probieren:
reading01Name TempChannel8
reading01JSON Channel8_temperature
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

andies

Kann ich nochmal Hilfe beim Parsen eines JSON bekommen? Das Speedport gibt eine unendliche lange JSON aus, die sieht so aus:

[
  {
    "vartype": "value",
    "varid": "device_name",
    "varvalue": "Speedport W 724V"
  },
... ##hier steht jetzt eine Menge, mich interessieren diese Werte ab jetzt
  {
    "vartype": "template",
    "varid": "adddialedcalls",
    "varvalue": [
      {
        "vartype": "value",
        "varid": "id",
        "varvalue": "0"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_date",
        "varvalue": "30.05.2017"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_time",
        "varvalue": "15:52:32"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_who",
        "varvalue": "0815" ## <== diese Nummer möchte ich haben, zusammen mit der duration und dem Datum
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_duration",
        "varvalue": "722"
      }
    ]
  },
  {
    "vartype": "template",
    "varid": "adddialedcalls",
    "varvalue": [
      {
        "vartype": "value",
        "varid": "id",
        "varvalue": "1"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_date",
        "varvalue": "30.05.2017"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_time",
        "varvalue": "15:30:47"
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_who",
        "varvalue": "0816"  ## <== hier die zweite Nummer
      },
      {
        "vartype": "value",
        "varid": "dialedcalls_duration",
        "varvalue": "1294"
      }
    ]
  },
... und so geht das jetzt über 132 mal weiter ...

Wie extrahiert man dieses Monstrum?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

amenomade

Guck erstmal was ExtractAllJSON ergibt, und mach deine Regex entsprechend.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

andies

Sorry, habe ich vergessen zu schreiben. Das Problem ist, dass dann ein vergleichbares Monstrum entsteht:

100_varid adddialedcalls                     2017-05-31 18:57:31
100_vartype template                        2017-05-31 18:57:31
100_varvalue_01_varid id                  2017-05-31 18:57:31
100_varvalue_01_vartype value         2017-05-31 18:57:31
100_varvalue_01_varvalue 80           2017-05-31 18:57:31
100_varvalue_02_varid dialedcalls_date 2017-05-31 18:57:31
100_varvalue_02_vartype value          2017-05-31 18:57:31
100_varvalue_02_varvalue 02.05.2017 2017-05-31 18:57:31
100_varvalue_03_varid dialedcalls_time 2017-05-31 18:57:31
100_varvalue_03_vartype value        2017-05-31 18:57:31
100_varvalue_03_varvalue 15:21:11 2017-05-31 18:57:31
100_varvalue_04_varid dialedcalls_who 2017-05-31 18:57:31
100_varvalue_04_vartype value        2017-05-31 18:57:31
100_varvalue_04_varvalue 0815       2017-05-31 18:57:31
100_varvalue_05_varid dialedcalls_duration 2017-05-31 18:57:31
100_varvalue_05_vartype value       2017-05-31 18:57:31
100_varvalue_05_varvalue 496        2017-05-31 18:57:31
101_varid adddialedcalls                  2017-05-31 18:57:31

und die erste Zahl, hier 100 bzw 101, scheint nicht stabil zu sein. Jedenfalls weiß ich nicht, ob das nicht auch 70 oder so sein könnte. Stabil ist nur "dialedcalls".
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Zitat von: amenomade am 31 Mai 2017, 19:32:34
Guck erstmal was ExtractAllJSON ergibt, und mach deine Regex entsprechend.
Also was ich tun könnte, ist die klassische Regex nehmen. Denn die Einträge sehen im Grunde alle so aus:

{"vartype":"value","varid":"id","varvalue":"0"},
{"vartype":"value","varid":"takencalls_date","varvalue":"31.05.2017"},
{"vartype":"value","varid":"takencalls_time","varvalue":"21:15:56"},
{"vartype":"value","varid":"takencalls_who","varvalue":"Unbekannt"},
{"vartype":"value","varid":"takencalls_duration","varvalue":"2887"}

Die erste Zahl, die 0, die läuft dann von 0 (letzter Anruf) bis 140 (allererster Anruf vor X Tagen) oder was auch immer und dann kann ich den Tag, die Uhrzeit, die Nummer und die Dauer (in Sekunden) abfragen. Da aber der Response eine "reine" JSON ist, wollte ich eigentlich auch get01JSON verwenden und gerade nicht get01Regex. Aber das dürfte sehr kompliziert werden.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Also, ich habe jetzt eine Lösung mit "klassischen" Regex. Klappt an sich, nur ist das mächtig umständlich. Die angenommenen und die herausgehenden Anrufe haben eine duration in dem JSON, die verpassten sinnvollerweise nicht. Damit gelingt es mir nur mit zwei verschiedenen Regex, die Daten zu erfassen  - einmal regex für angenommene/ausgehende, nämlich so

attr Speedport get1Regex \[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"([a-z]*)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"(\d*)"}

und einmal für die verpassten Anrufe
attr Speedport get2Regex \[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"(missedcalls)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"}

Was mich daran stört ist, dass ich nun für beide Regex jeweils eine eigene Login-Prozedur definieren müsste und beide mit einem eigenen get-Befehl aufgerufen müssten! Meine Idee, es so zu definieren
attr Speedport get1CheckAllReadings 1
führt nicht dazu, dass mit dem Aufruf von get1 auch gleichzeitig get2 abgeholt wird. Ich dachte, das würde das Attribut leisten?
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

StefanStrobel

Hallo,

checkAllReadings führt dazu, dass alle Readings ausgewertet werden, die mit readingXYName bzw. readingXYRegex etc. definiert sind.

Alternativ kann man eine Regex auch mit mehreren capture groups definieren und so aus einer Regex mehrere Readings erzeugen.

Eine Login-Sequenz gilt nicht nur für ein einzelnes get sondern für alle Abfragen innerhalb des HTTPMOD-Geräts. Sie wir ausgelöst wenn die reAuthRegex matcht und mit den sid-Attributen definiert.

Gruss
   Stefan

andies

Zitat von: StefanStrobel am 02 Juni 2017, 20:03:02
checkAllReadings führt dazu, dass alle Readings ausgewertet werden, die mit readingXYName bzw. readingXYRegex etc. definiert sind.
Das klappt bei mir nicht. Ich habe es so definiert
defmod Speedport HTTPMOD none 0
attr Speedport userattr CheckAllReadings:0,1 get1AutoNumLen get1Header1 get1Header2 get1JSON get1Name get1RegOpt get1Regex get1URL get2Name get2Regex sid1Data sid1Header sid1IdRegex sid1Name sid1URL sid2Data sid2Header1 sid2Header2 sid2URL
attr Speedport CheckAllReadings 1
attr Speedport enableCookies 1
attr Speedport extractAllJSON 0
attr Speedport get1AutoNumLen 2
attr Speedport get1Header1 Content-Type: application/json
attr Speedport get1Header2 Referer: http://speedport.ip/html/login/index.html?lang=de
attr Speedport get1Name Telefonliste
attr Speedport get1RegOpt g
attr Speedport get1Regex \[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"([a-z]*)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"(\d*)"}
attr Speedport get1URL http://speedport.ip/data/PhoneCalls.json?_lang=de&_tn=$sid
attr Speedport get2Name Anrufeverpasst
attr Speedport get2Regex \[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"(missedcalls)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"}
attr Speedport reAuthRegex Melden Sie sich an, um Ihren Speedport zu konfigurieren
attr Speedport removeBuf 1
attr Speedport room System
attr Speedport sid1Header Content-Type: text/html
attr Speedport sid1IdRegex _httoken = (\d*)
attr Speedport sid1URL http://speedport.ip/html/login/index.html?lang=de
attr Speedport sid2Data password=XXXXXXXXXXXXXXXXXXXX&showpw=0&httoken=$sid
attr Speedport sid2Header1 Content-Type: application/json
attr Speedport sid2Header2 Referer: http://speedport.ip/html/login/index.html?lang=de
attr Speedport sid2URL http://speedport.ip/data/Login.json

und Telefonliste wird angelegt, aber Anrufeverpasst nicht. Beide Regex sind in Ordnung - die habe ich jeweils bei get1regex eingesetzt und dann jeweils die angenommenen bzw die verpassten Anrufe erhalten. Aber in verschiedenen get1 und get2 geht es, trotz CheckAllReadings, bei mir nicht. Wo ist da der Fehler?

FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

amenomade

Zitat von: CommandRef(get|set)[0-9]*URL
URL to be requested for the get or set command. If this option is missing, the URL specified during define will be used.

defmod Speedport HTTPMOD none 0
...
attr Speedport get2Name Anrufeverpasst
attr Speedport get2Regex \[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"(missedcalls)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"}

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

andies

Danke! Ich habe jetzt
attr Speedport get2URL http://speedport.ip/data/PhoneCalls.json?_lang=de&_tn=$sid
hinzugefügt, das gab aber kein anderes Ergebnis. Die Readings beinhalten nicht die verpassten Anrufe. Der Logfile sagt auch nix:

2017.06.03 11:10:18 5: Speedport: ExtractReading Telefonliste with regex /\[{"vartype":"value","varid":"id","varvalue":"[0-5]"},{"vartype":"value","varid":"([a-z]*)_date","varvalue":"([\d\.]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([\d:]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"([a-zA-Z0-9]*)"},{"vartype":"value","varid":"[a-z_]*","varvalue":"(\d*)"}/g ...
2017.06.03 11:10:18 5: Speedport: 60 capture group(s), matchlist =
...
2017.06.03 11:10:18 4: Speedport: ExtractReading for get1-59 sets Telefonliste-59 to 0173XXXXXX
2017.06.03 11:10:18 4: Speedport: ExtractReading for get1-60 sets Telefonliste-60 to 134
2017.06.03 11:10:18 4: Speedport: Read response to get1 matched Reading(s) Telefonliste-01 Telefonliste-02 Telefonliste-03 Telefonliste-04...

und get2 fehlt.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann