Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

JoeALLb

Zitat von: ares am 15 Februar 2017, 20:50:41
Nicht 2 Readings, eher 2 Device mit jeweils 100 Readings.
Meine eigentliche Frage ist aber inzwischen geklärt - pro Get nur ein Regex. Hätte ja auch sein können, dass ich nur falsch gelesen habe und das doch irgendwie geht.
...aber pro Regex sind mehrere Fundstellen möglich, siehe mein Beispiel oben.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Zitat von: JoeALLb am 15 Februar 2017, 20:51:04
Nachtrag:
Sowas wie dies würde RAUMSOLLTEMP. HK1 und RAUMSOLLTEMP. HK2
jeweils in ein Reading übernehmen...
Ist doch genau das, was du suchst, oder?

attr TEST get21URL http://2.2.2.2/XXXX
attr TEST get21 Poll 1
attr TEST get21Regex RAUMSOLLTEMP. HK1\p{Any}*?value">([\d,.]+)\p{Any}*?HK2\p{Any}*?value">([\d,.]+)
attr TEST get21_1Name SollHK1
attr TEST get21_2Name SollHK2


Ich habe meinen Regex-Tester  mit dem in den Internals angezeigten String getestet, was dort auch funktioniert aber in fhem dann kein Ergebnis bringt.
attr ISGweb get10Regex RAUMSOLLTEMP\. HK1[^0-9]+([0-9,]+).+RAUMSOLLTEMP\. HK2[^0-9]+([0-9,]+)

Deinen Vorschlag habe ich wie folgt übernommen, obwohl mein Regex-Test damit nicht klar gekommen ist:
attr ISGweb get10Name ISGweb_10
attr ISGweb get10Poll 1
attr ISGweb get10URL http://192.168.0.134/?s=1,0
attr ISGweb get10CheckAllReadings 1
attr ISGweb get10Regex RAUMSOLLTEMP. HK1\p{Any}*?value">([\d,.]+)\p{Any}*?HK2\p{Any}*?value">([\d,.]+)
attr ISGweb get10_1Name SollHK1
attr ISGweb get10_2Name SollHK2


mit folgenden 2 Fehlermeldungen:
ISGweb: unknown attribute get10_1Name. Type 'attr ISGweb ?' for a detailed list.
ISGweb: unknown attribute get10_2Name. Type 'attr ISGweb ?' for a detailed list.

entspricht ja auch nicht der Doku
(get|set|reading)[0-9]+Regex

Folgende 2 Readings wurden wie in der Doku beschrieben erstellt:
ISGweb_10-1
ISGweb_10-2


JoeALLb

Zitat von: ares am 15 Februar 2017, 21:35:50
mit folgenden 2 Fehlermeldungen:
ISGweb: unknown attribute get10_1Name. Type 'attr ISGweb ?' for a detailed list.
ISGweb: unknown attribute get10_2Name. Type 'attr ISGweb ?' for a detailed list.

entspricht ja auch nicht der Doku
(get|set|reading)[0-9]+Regex


Ändere _ in - und es funktioniert.
Anbei ein funktionierendes Beispiel:


define xx HTTPMOD http://www.google.com 600
attr xx userattr get21-1Name get21-2Name get21Name get21Regex get21URL
attr xx get21-1Name Name1Version
attr xx get21-2Name Name2DEB
attr xx get21Name getName
attr xx get21Regex as of ([\d-\s]+)\p{Any}*?href\p{Any}*?href="([^"]+)
attr xx get21URL https://fhem.de/fhem.html
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Vielen Dank!
Hast Du auch noch eine gute Seite zum Testen der Regex inklusive {Any} bzw. wie kommst Du auf die Regex?

JoeALLb

die schreibe ich mittlerweile aus dem Kopf...
\p{Any} ist wie . jedoch mit zeilenwechsel.

wenn du
...RegOp=s
setzt, matched . auch auf newlines.

du könntest due den regexbuddy kaufen... sehr schönes programm.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Zitat von: JoeALLb am 16 Februar 2017, 10:20:29
die schreibe ich mittlerweile aus dem Kopf...
\p{Any} ist wie . jedoch mit zeilenwechsel.

wenn du
...RegOp=s
setzt, matched . auch auf newlines.

du könntest due den regexbuddy kaufen... sehr schönes programm.

Wenn Du die aus dem Kopf so schnell hinbekommst, kannst Du mir dann bitte mit folgenden Regex unter die Arme greien?

Problem 1 ist ein optionales Vorzeichen:
<tr class="odd">
  <td class="key">TEMP1</td>
  <td class="value">-12,3 °C</td>
</tr>
<tr class="odd">
  <td class="key">TEMP2</td>
  <td class="value">45,6 °C</td>
</tr>
<tr class="even">
  <td class="key round-leftbottom">TEMP3</td>
  <td class="value round-rightbottom">-32,1 °C</td>
</tr>
<tr class="even">
  <td class="key round-leftbottom">TEMP4</td>
  <td class="value round-rightbottom">65,4 °C</td>
</tr>


so klappt es leider nicht, mein Problem sind die möglichen Minus vorher:
TEMP1[^0-9]+([-0-9,]+)
TEMP2[^0-9]+([-0-9,]+)
TEMP3[^0-9]+([-0-9,]+)
TEMP4[^0-9]+([-0-9,]+)


Problem 2 ist, dass ich gerne 2 Regex verketten möchte um 1.179 zu erhalten:
<div class="fuel-price-type"><span>Diesel</span><span class="mtsk-label"> MTS-K Preis </span></div> <div class="price-box"> <div class="price-input" ng-class="{'price-dirty': dirty}"> <span ng-click="minus()" class="decrease-price">-</span><span class="price-field"><span ng-bind="display_preis">1.17 </span> <sup ng-bind="suffix">9</sup></span><span ng-click="plus()" class="increase-price">+</span> </div>

<span>Diesel</span>[^0-9]+([0-9\.]+)
suffix[^0-9]+([0-9\.]+)


Danke
Manfred

JoeALLb

#336
Für einen Kaffe, mach ich viel ;-)

Einfach kopieren und den Namen für temp1-4 anpassen
TEMP3\p{Any}+?>([-\d,]+)

Das zweite schau ich mir noch an
Mit einer Gruppe fällt mir nichts ein, aber so bekommst du es in zwei gruppen

Diesel.*?">([\d\.]+)(?:.*?suffix">)(\d+)
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Zitat von: JoeALLb am 17 Februar 2017, 15:24:21
Für einen Kaffe, mach ich viel ;-)

Einfach kopieren und den Namen für temp1-4 anpassen
TEMP3\p{Any}+?>([-\d,]+)

Das zweite schau ich mir noch an
Mit einer Gruppe fällt mir nichts ein, aber so bekommst du es in zwei gruppen

Diesel.*?">([\d\.]+)(?:.*?suffix">)(\d+)


Der Regex funktioniert, vielen Dank. Ich bin durch die Tipps schon viel weiter gekommen und würde den Kaffe daher nur zu gern spendieren. Ich habe mich jedoch nochmal in den Regex verrannt, vielleicht hast Du aber erneut aus dem Kopf eine schnelle Lösung.




MaxAge scheint nicht mit timestamp-on-change reading zu funktionieren. Außerdem sind derzeit 49 Seiten in einem Device geplant, da sich der Zielserver mit parallelen Zugriffen immer wieder aufhängt und so das MaxAge wahrscheinlich nicht ganz unproblematisch funktioniert. Zum Glück kann man aber für 2 Regex das gleiche reading als Ziel angeben und so hoffentlich das MaxAge durch 2 Regex ersetzen und so den Wert zusammen mit dem Rest aktualisieren was für meinen Fall sinnvoll ist.

Problem:
Die Seiten lassen sich über die Überschrift identifizieren. Einige der Seiten zeigen Schalter als SCHLÜSSELWÖRTER an, falls die Schalter an sind, ansonsten nichts. Ich würde die SCHLÜSSELWÖRTER gerne mit 1 (vorhanden) bzw. 0 (nicht vorhanden) als reading bekommen.

Beispielseite (identifiziert durch TEXT1 vor dem SCHLÜSSELWORT und bei Bedarf TEXT2 nach dem SCHLÜSSELWORT:
beliebig > Überschrift > beliebig > SCHLÜSSELWORT1 > beliebig > Endetag > beliebig > konstante_Zahl_mit_0_und_1 > beliebig

der Positiv-Check funktionert:
Überschrift.+SCHLÜSSELWORT1.+Endetag.+([1])

den Negativ-Check bekomme ich aber auf Grund der beliebigen Texte vorher und nachher nicht hin, da es dadurch ja immer ein passendes Ergebnis gibt:
Überschrift.+(?!SCHLÜSSELWORT1).+Endetag.+([0])

und noch eine Frage zum obigen Beispiel:
Kann ich z.B. das Endetag direkt in 0/1 umwandeln oder bin ich auf die passende Zahl nach dem Endetag bzw. getMap angewiesen?

Danke
Manfred


JoeALLb

#338
Sorry Manfred,
vielleicht liegt es an der Uhrzeit, aber ich erkenne die Frage in deinem Text nicht.

Prinzipiell trifft dieser negativtext schon und funktioniert somit auch, in welchem Beispiel funktioniert er denn nicht korrekt?
Schick mir doch ein paar (vll. sogar mehrere Texte die es zu matchen gibt, dann kann man den regex "stabiler" bauen als wenn man ihn nur auf einen Text prüft.
Also Posiviv und Negativbeispiele...
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ares

Durch mein vieles Testen ist das userattr des device inzwischen sehr lang geworden, da beim Löschen von Attributen das userattr nicht mit bereinigt wird.
Wie bereinige ich das userattr am einfachsten?

StefanStrobel

Einfach löschen. Das Modul erzeugt die Einträge automatisch.

Gruss
   Stefan

ares

Zitat von: StefanStrobel am 22 Februar 2017, 22:53:10
Einfach löschen. Das Modul erzeugt die Einträge automatisch.

Gruss
   Stefan

Danke für die schnelle Antwort, Löschen habe ich mich nicht getraut.

Manfred

peterk_de

Hallo zusammen,

ich wollte mir die Messwerte  von einer nahgelegenen offiziellen  Luftüberwachungs-Station in FHEM holen. Die haben eine App (Lüsa), und Wireshark brachte folgende URL hervor:

http://www.mu.sachsen-anhalt.de/lau/luesa/tmp/LUESA-APP-json.txt

Nett. Nun wollte ich mir das mit HTTPMOD vornehmen und meine Messstation rauspopeln, allerdings komm ich mit den vorhandenen JSON-Filtern da nicht weit. Mit Regexen schon gar nicht (wobei, naja, auf jeden fall wäre das übel ;)) Ist irgendwie sowas wie JSONPath in Planung? Sonst muss ich mir da selbst mal was bauen...
FHEM auf Ubuntu-VM / 2xNUC Proxmox Cluster
UI: HomeKit, TabletUI, Grafana
IOdevs: 2xHueBridge, RaspiMatic-CCU, CUL868, 2xHarmonyHub, 6xRaspi-Roomnode mit CO2, VOC und lepresenced
Devices: 107xHomematic(IP), 96xPhilips Hue, 17xTECHEM, 12xBTLE, 8xSONOS, 2xHomeConnect, 1xShelly 3em, 1xNanoleaf ...

StefanStrobel

Hallo,

Bisher hatte ich keine Pläne JSONPath einzubauen, aber vermutlich wäre es kein großer Aufwand und ähnlich wie XPath zu machen.
Du kannst es gerne mal ausprobieren und einen Patch als Vorschlag posten.

Gruss
   Stefan

ares

Ich benötige "set[0-9]+IMap" mit einem Komma, bekomme die Syntax aber nicht ganz auf die Reihe.

ohne Komma im Pfad funktioniert es
attr MyDevive set01IMap /?s=1:path_1,  /?s=4:path_2
mit Komma splittet er leider ungewollt
attr MyDevive set01IMap /?s=1,2,3:path_1,  /?s=4,5,6:path_2

Kann mir bitte jemand unter die Arme greifen oder bestätigen dass dies aktuell nicht möglich ist?

Danke
Manfred