Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo,

anbei eine neue Version von HTTPMOD falls jemand schon mal testen möchte.
Folgendes ist neu / hat sich geändert:

1) Regexes werden beim Verarbeiten der Attribute bereits vorcompiliert und gespeichert, so dass sie später nicht bei jedem Parsen einer Seite neu compiliert werden müssen. Ich hoffe dass das die aktuellen Memory-Leaks in Perl umgeht, bin aber selbst noch am Testen.

2) Neues Attribut regexDecode
Damit kann man bei Bedarf auch den Wert eines Regex-Attributs durch die Perl-decode-Funktion schicken.
Ein typischer Wert wäre utf-8, je nach Plattform kann aber auch ein anderer Wert angebracht sein.

3) Neues Attribut bodyDecode
Damit kann man den Body der gelesenen HTTP-Response durch die Perl-Funktion decode schicken.
Hier kann man direkt ein Encoding wie utf-8 oder ISO-8859-1 angeben. Man kann aber als Wert auch auto angeben.
Dann sucht HTTPMOD nach einem charset-Header und übergibt den dort gefundenen Wert an decode.

Noch ein Hinweis zu den Test-Features, die ich bereits grob beschrieben habe:
Das Attribut dumpBuffers sollte gelöscht werden, bevor man die erzeugten Dateien wieder einliest.
Das Attribut memReading funktioniert sicher nicht auf allen Plattformen. Ich habe es auf einem Pi mit Stretch am Laufen um den von Fhem verwendeten Hauptspeicher zu überwachen.

Gruss
    Stefan

krikan

Hallo!

Für die Steuerung eines Saugroboters per REST-API benötige ich die HTTP Mehode PUT. In https://forum.fhem.de/index.php/topic,45176.msg909048.html#msg909048 gibt es einen Patch um das in HTTPMOD einzubauen. Der Patch hat es aber afaik noch nicht in das Modul geschafft. Kommt das noch?

Eine Integration von HTTP PUT in HTTPMOD würde u.a. die Verteilung von Geräte-Vorlagen per AttrTemplate vereinfachen. Meine derzeitige Lösung, das per curl oder direktem Aufruf von HttpUtils-Funktionen umzusetzen, führt zu ziemlichen Klimmzügen und mehreren FHEM-Devices.

Gruß, Christian

OdfFhem

@StefanStrobel

Hallo,

aktuell "spiele" ich ein wenig mit dem offiziellen HTTPMOD-Modul (# $Id: 98_HTTPMOD.pm 19978 2019-08-10 12:51:48Z StefanStrobel $).

Dabei ist mir aufgefallen, dass es z.B. beim Attribut readingMaxAgeReplacementMode folgende Ungereimtheiten gibt:

  • Setzt man dieses Attribut erstmalig, wird automatisch folgender Text in userattr aufgenommen:
    readingMaxAgeReplacementMode readingMaxAgeReplacementMode:text,reading,internal,expression,delete
    ==> Attribut ist scheinbar doppelt definiert ...
  • Will man den Wert dieses Attributes über die Oberfläche ändern, wird keine Auswahlbox, sondern ein frei editierbares Textfeld präsentiert.
  • Löscht man dieses Attribut, wird es nicht aus userattr entfernt.
  • In der FHEM-Logdatei taucht folgende Zeile regelmäßig auf ...

2019.11.08 10:11:35 3: test_eq3: added hint :text,reading,internal,expression,delete to attr readingMaxAgeReplacementMode in userattr list

  • In der Device specific help finden sich widersprüchliche Aussagen über zulässige Werte dieses Attributes:

    • Zeilennummern basieren auf dem oben genannten Modulstand
    • Zeile 3563: reading values should be replaced. MaxAgeReplacementMode can be <code>text</code>, <code>expression</code> or <code>delete</code>. <br>
    • Zeile 3844: specifies how the replacement is interpreted: can be text, reading, internal, expression and delete.

Keine Ahnung, ob sich diese Auffälligkeit auch noch bei anderen Attributen zeigt ...
Bei der Verwendung von readingMaxAgeReplacementMode für die Ausführung beim Homematic-Firmware-Checker läuft alles wie erwartet ...

StefanStrobel

Hallo,

anbei eine neue Version zu Testen.

Neu ist die Unterstützung für HTTP PUT und ein Bugfix bei der Verwaltung der userattr-Attribute.
Zudem sind die oben beschriebenen Änderungen wegen dem Perl-Memory-Leak enthalten.

Es wäre schön wenn ein paar leute die Version testen und Feedback geben könnten.
Wenn es keine neuen Probleme gibt, würde ich die neue Version in ein paar Tagen einchecken.

Gruss
   Stefan

amenomade

Irgendwelche Abhängigkeit? Ich würde gerne testen, aber mein Fhem ist nicht das aktuellste
98_HTTPMOD.pm 19978 2019-08-10 12:51:48Z StefanStrobel

doif.js                    15546 2017-12-03 09:57:42Z Ellert
fhemweb.js                 20226 2019-09-22 07:51:07Z rudolfkoenig
fhemweb_readingsGroup.js   15189 2017-10-03 17:53:27Z justme1968
svg.js                     19667 2019-06-20 13:39:55Z rudolfkoenig


HttpUtils.pm 20037 2019-08-21 05:34:45Z rudolfkoenig
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel


amenomade

Beim "reload 98_HTTPMOD" kriege ich
Too many arguments for main::HTTPMOD_AddToQueue at ./FHEM/98_HTTPMOD.pm line 1599, near "))"
BEGIN not safe after errors--compilation aborted at ./FHEM/98_HTTPMOD.pm line 1784.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel

Ja, wegen der Erweiterung für HTTP PUT hat die Funktion einen zusätzlichen Parameter bekommen.
Bei einem Reload gibt es dann das erste Mal eine Fehlermeldung.
Nach einem Restart sollte alles passen.

Gruß
    Stefan

amenomade

#623
Dieses HTTPMOD funktioniert nicht mehr:
defmod Gezeiten_Papenburg HTTPMOD http://exnatura.de:9099/locations/2171.html 0
attr Gezeiten_Papenburg userattr reading101Name reading101RegOpt reading101Regex reading102Name reading102RegOpt reading102Regex
attr Gezeiten_Papenburg enableControlSet 1
attr Gezeiten_Papenburg reading101Name Hochwasser
attr Gezeiten_Papenburg reading101RegOpt gm
attr Gezeiten_Papenburg reading101Regex (^[\d\. :]{16}).*?Hochwasser
attr Gezeiten_Papenburg reading102Name Niedrigwasser
attr Gezeiten_Papenburg reading102RegOpt gm
attr Gezeiten_Papenburg reading102Regex (^[\d\. :]{16}).*?Niedrigwasser
attr Gezeiten_Papenburg room HTTPMODs
attr Gezeiten_Papenburg verbose 5


In der Log kriege ich:
2019.11.09 22:48:04 5: Gezeiten_Papenburg: UpdateReadingList created list of reading.* nums to parse during getUpdate as 101 102
2019.11.09 22:48:04 5: Gezeiten_Papenburg: Read starts parsing response to update with defined readings: 101,102
2019.11.09 22:48:04 4: Gezeiten_Papenburg: GetRegex found precompiled Regex for reading101
2019.11.09 22:48:04 5: Gezeiten_Papenburg: ExtractReading Hochwasser with regex /(?^:(^[\d\. :]{16}).*?Hochwasser)/gm ...
2019.11.09 22:48:04 5: Gezeiten_Papenburg: ExtractReading Hochwasser did not match
2019.11.09 22:48:04 4: Gezeiten_Papenburg: GetRegex found precompiled Regex for reading102
2019.11.09 22:48:04 5: Gezeiten_Papenburg: ExtractReading Niedrigwasser with regex /(?^:(^[\d\. :]{16}).*?Niedrigwasser)/gm ...
2019.11.09 22:48:04 5: Gezeiten_Papenburg: ExtractReading Niedrigwasser did not match
2019.11.09 22:48:04 4: Gezeiten_Papenburg: Read response to update didn't match any Reading
2019.11.09 22:48:04 5: Gezeiten_Papenburg: HandleSendQueue called, qlen = 0


Mit der alte Version (die jetzige aus svn):
2019.11.09 22:51:03 5: Gezeiten_Papenburg: UpdateReadingList created list of reading.* nums to parse during getUpdate as 101 102
2019.11.09 22:51:03 5: Gezeiten_Papenburg: Read starts parsing response to update with defined readings: 101,102
2019.11.09 22:51:03 5: Gezeiten_Papenburg: ExtractReading Hochwasser with regex /(^[\d\. :]{16}).*?Hochwasser/gm ...
2019.11.09 22:51:03 5: Gezeiten_Papenburg: 8 capture group(s), matchlist = 09.11.2019 14:44,10.11.2019 03:20,10.11.2019 15:17,11.11.2019 04:08,11.11.2019 15:50,12.11.2019 04:56,12.11.2019 16:24,13.11.2019 05:45
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-1 sets Hochwasser-1 to 09.11.2019 14:44
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-2 sets Hochwasser-2 to 10.11.2019 03:20
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-3 sets Hochwasser-3 to 10.11.2019 15:17
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-4 sets Hochwasser-4 to 11.11.2019 04:08
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-5 sets Hochwasser-5 to 11.11.2019 15:50
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-6 sets Hochwasser-6 to 12.11.2019 04:56
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-7 sets Hochwasser-7 to 12.11.2019 16:24
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading101-8 sets Hochwasser-8 to 13.11.2019 05:45
2019.11.09 22:51:03 5: Gezeiten_Papenburg: ExtractReading Niedrigwasser with regex /(^[\d\. :]{16}).*?Niedrigwasser/gm ...
2019.11.09 22:51:03 5: Gezeiten_Papenburg: 8 capture group(s), matchlist = 09.11.2019 21:23,10.11.2019 09:08,10.11.2019 22:06,11.11.2019 09:45,11.11.2019 22:49,12.11.2019 10:21,12.11.2019 23:32,13.11.2019 10:57
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-1 sets Niedrigwasser-1 to 09.11.2019 21:23
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-2 sets Niedrigwasser-2 to 10.11.2019 09:08
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-3 sets Niedrigwasser-3 to 10.11.2019 22:06
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-4 sets Niedrigwasser-4 to 11.11.2019 09:45
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-5 sets Niedrigwasser-5 to 11.11.2019 22:49
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-6 sets Niedrigwasser-6 to 12.11.2019 10:21
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-7 sets Niedrigwasser-7 to 12.11.2019 23:32
2019.11.09 22:51:03 4: Gezeiten_Papenburg: ExtractReading for reading102-8 sets Niedrigwasser-8 to 13.11.2019 10:57
2019.11.09 22:51:03 4: Gezeiten_Papenburg: Read response to update matched Reading(s) Hochwasser-1 Hochwasser-2 Hochwasser-3 Hochwasser-4 Hochwasser-5 Hochwasser-6 Hochwasser-7 Hochwasser-8 Niedrigwasser-1 Niedrigwasser-2 Niedrigwasser-3 Niedrigwasser-4 Niedrigwasser-5 Niedrigwasser-6 Niedrigwasser-7 Niedrigwasser-8
2019.11.09 22:51:03 5: Gezeiten_Papenburg: HandleSendQueue called, qlen = 0


Warum wird die Regex "ergänzt"?

EDIT: ansonsten funktionieren 10 andere HTTPMOD problemlos
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel

Hallo amenomade,

Um ein Memory-Leak in aktuellen Perl-Versionen zu umgehen versuche ich im Modul die Regexes gleich beim Verarbeiten der Attribute als compilierte Regexes zu speichern:

$hash->{CompiledRegexes}{$aName} = qr/$aVal/;


Die Ausgabe einer compilierten Regex sieht später etwas anders aus. Sie sollte sich aber genauso verhalten.
Das Problem dabei ist aber offenbar, dass die Regex-Optionen sich so nicht alle verwenden lassen.
Bei //g ist das kein Problem, //m kann man aber später beim Matchen mit einer compilierten Regex nicht mehr anhängen.
Deshalb klappt es bei Dir nicht mehr.
Schade...

Die alternativen Ideen um den Memory-Leak zu umgehen können meiner Meinung nach leider auch Nebenwirkungen haben.
Ich werde wohl die Compilierung der Regexes erst später zur Laufzeit machen und dann die Optionen bei qr// mit angeben müssen.
Neue Version ist auf dem Weg.

Vielen dank erstmal fürs Testen!

Gruss
   Stefan





amenomade

Kann man vielleicht RegOpt m  in (?m) in der Regex umwandeln?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#626
Also, es funktioniert mit der neue Version mit:
attr Gezeiten_Papenburg reading101RegOpt g
attr Gezeiten_Papenburg reading101Regex (?m)(^[\d\. :]{16}).*?Hochwasser
attr Gezeiten_Papenburg reading102RegOpt g
attr Gezeiten_Papenburg reading102Regex (?m)(^[\d\. :]{16}).*?Niedrigwasser


Log:
2019.11.10 18:04:17 5: Gezeiten_Papenburg: UpdateReadingList created list of reading.* nums to parse during getUpdate as 101 102
2019.11.10 18:04:17 5: Gezeiten_Papenburg: Read starts parsing response to update with defined readings: 101,102
2019.11.10 18:04:17 4: Gezeiten_Papenburg: GetRegex found precompiled Regex for reading101
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading Hochwasser with regex /(?^:(?m)(^[\d\. :]{16}).*?Hochwasser)/g ...
2019.11.10 18:04:17 5: Gezeiten_Papenburg: 8 capture group(s), matchlist = 10.11.2019 15:17,11.11.2019 04:08,11.11.2019 15:50,12.11.2019 04:56,12.11.2019 16:24,13.11.2019 05:45,13.11.2019 16:58,14.11.2019 06:34
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-1 sets Hochwasser-1 to 10.11.2019 15:17
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-2 sets Hochwasser-2 to 11.11.2019 04:08
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-3 sets Hochwasser-3 to 11.11.2019 15:50
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-4 sets Hochwasser-4 to 12.11.2019 04:56
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-5 sets Hochwasser-5 to 12.11.2019 16:24
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-6 sets Hochwasser-6 to 13.11.2019 05:45
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-7 sets Hochwasser-7 to 13.11.2019 16:58
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading101-8 sets Hochwasser-8 to 14.11.2019 06:34
2019.11.10 18:04:17 4: Gezeiten_Papenburg: GetRegex found precompiled Regex for reading102
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading Niedrigwasser with regex /(?^:(?m)(^[\d\. :]{16}).*?Niedrigwasser)/g ...
2019.11.10 18:04:17 5: Gezeiten_Papenburg: 8 capture group(s), matchlist = 10.11.2019 09:08,10.11.2019 22:06,11.11.2019 09:45,11.11.2019 22:49,12.11.2019 10:21,12.11.2019 23:32,13.11.2019 10:57,14.11.2019 00:15
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-1 sets Niedrigwasser-1 to 10.11.2019 09:08
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-2 sets Niedrigwasser-2 to 10.11.2019 22:06
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-3 sets Niedrigwasser-3 to 11.11.2019 09:45
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-4 sets Niedrigwasser-4 to 11.11.2019 22:49
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-5 sets Niedrigwasser-5 to 12.11.2019 10:21
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-6 sets Niedrigwasser-6 to 12.11.2019 23:32
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-7 sets Niedrigwasser-7 to 13.11.2019 10:57
2019.11.10 18:04:17 5: Gezeiten_Papenburg: ExtractReading for reading102-8 sets Niedrigwasser-8 to 14.11.2019 00:15
2019.11.10 18:04:17 4: Gezeiten_Papenburg: Read response matched 16, unmatch 0 Reading(s)
2019.11.10 18:04:17 5: Gezeiten_Papenburg: Read response to update matched Hochwasser-1 Hochwasser-2 Hochwasser-3 Hochwasser-4 Hochwasser-5 Hochwasser-6 Hochwasser-7 Hochwasser-8 Niedrigwasser-1 Niedrigwasser-2 Niedrigwasser-3 Niedrigwasser-4 Niedrigwasser-5 Niedrigwasser-6 Niedrigwasser-7 Niedrigwasser-8


Mit dem 's' modifier sollte es auch so gehen. Und in Kombination: (?xims) auch. Nur 'g' kann man nicht so machen. Das hängt mMn an den kleinen Unterschied vom 'g' modifier: siehe hier https://www.perlmonks.org/?node_id=608925
Zitatg affects the operation (match or substitution), not the regexp
xism options are toggles.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel

Hallo,

anbei ein neuer Versuch. Die Regex-Options werden jetzt je nach Art beim Compilieren der Regexes oder später beim Anwenden verwendet.
Damit sollten hoffentlich die bisherigen Definitionen ohne Anpassung laufen.
Freue mich über weiteres Testen und Feeback :-)

Gruss
   Stefan

Hardlife

Zitat von: StefanStrobel am 11 November 2019, 20:19:18
anbei ein neuer Versuch. Die Regex-Options werden jetzt je nach Art beim Compilieren der Regexes oder später beim Anwenden verwendet.
Damit sollten hoffentlich die bisherigen Definitionen ohne Anpassung laufen.

Ich habe jetzt die Entwicklung nicht im Detail verfolgt...
Aber ich habe die Version seit Vorgestern am Laufen und damit ist kein Speicheranstieg mehr festzustellen...  :)

Vielen Dank für al die Arbeit, die da reingesteckt wurde.
Vielleicht kann man das Modul bei Zeiten nach ein paar Tests ja mit den offiziellen Sourcen ausliefern.

LG,
Hardlife
Raspi 4B
nanoCUL-868 & 433,JeeLink,milight,Signalduino,GPIO-433er-Sender/Empfänger, GPIO-Infrarot,GSM-Stick für SMS
MAX!-Heizungssteuerung,Intertechno-V1-Steckdosen + V3-Dimmer,"Flamingo FA21RF"-Funk-Rauchmelder
433er-China-Bewegungsmelder,"Voltcraft CO20"-Stick,LaCrosse-Temperatur,Revolt-NC5462

andies

Ich habe eine Frage zu HTTPMOD. Ich lese ein reading via regex ein und manchmal gibt es ein und manchmal gibt es mehrere matches. Demzufolge wird einmal in die Readings X10-1 bis X10-3 eingelesen, ein ander Mal dagegen in das Reading X10.

Gibt es einen einfachen Weg dafür zu sorgen, dass bei genau einem Match in X10-1 und nicht X10 geschrieben wird?



Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      5dc9c0f6-f33f-1115-c949-88ea61862d72d796
   Interval   0
   LASTSEND   1573592640.69029
   MainURL   
   ModuleVersion 3.5.9 - 13.2.2019
   NAME       BVG
   NOTIFYDEV  global
   NR         359156
   NTFY_ORDER 50-BVG
   STATE      <font color="green">27</font> / <font color="green">47</font> / <font color="green">51</font>
   TRIGGERTIME 0
   TRIGGERTIME_FMT
   TYPE       HTTPMOD
   addr       https://transport.stefan-biermann.de:443
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900051371&provider=Bvg&limit=20
   header     
   host       transport.stefan-biermann.de
   httpheader HTTP/1.1 200 OK
Date: Tue, 12 Nov 2019 21:04:01 GMT
Server: Apache/2.4.29 (Ubuntu)
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Type: application/json
Content-Length: 655
Connection: close
   httpversion 1.0
   hu_blocking 0
   hu_filecount 16
   hu_port    443
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /publictransportapi/rest/departure/FHEM?from=900051371&provider=Bvg&limit=20
   protocol   https
   redirects  0
   timeout    30
   url        https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900051371&provider=Bvg&limit=20
   value      0
   OLDREADINGS:
   QUEUE:
   READINGS:
     2019-11-12 22:04:01   X10             18
     2019-11-12 21:35:13   X10-1           27
     2019-11-12 21:35:13   X10-2           47
     2019-11-12 21:31:16   X10-3           51
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       get01
     url        https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900051371&provider=Bvg&limit=20
     value      0
   defptr:
     readingBase:
       X10        get
       X10-1      get
       X10-2      get
       X10-3      get
     readingNum:
       X10        01
       X10-1      01
       X10-2      01
       X10-3      01
     readingOutdated:
     readingSubNum:
       X10-1      -1
       X10-2      -2
       X10-3      -3
     requestReadings:
       get01:
         X10        get 01
         X10-1      get 01-1
         X10-2      get 01-2
         X10-3      get 01-3
   sslargs:
Attributes:
   get01Name  X10
   get01Name-01 X10-1
   get01Name-02 X10-2
   get01Name-03 X10-3
   get01RegOpt g
   get01Regex \[\"X10\"\,\"S\+U Zoologischer Garten\"\,\"(\d\d)\"\]
   get01URL   https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900051371&provider=Bvg&limit=20
   group      Info
   room       Info
   stateFormat { FarbeEinfuegen(ReadingsNum($name,"X10-1",0))." / ".FarbeEinfuegen(ReadingsNum($name,"X10-2",0))." / ".FarbeEinfuegen(ReadingsNum($name,"X10-3",0)) }
   timeout    30
     userattr   get01Name get01Name-01 get01Name-02 get01Name-03 get01RegOpt get01Regex get01URL reading01RegOp
webcmd holen
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