[gelöst] HTTPMOD - Mehrfachausgabe (Schleife)

Begonnen von Pi_01, 15 April 2020, 10:50:15

Vorheriges Thema - Nächstes Thema

Pi_01

Hallo,
ich bin FHEM-Neueinsteiger und konnte nun mein erstes Projekt mittels HTTPMOD erfolgreich umsetzen:

define MeinDevice1 HTTPMOD https://.... 600
attr MeinDevice1 enableControlSet 1
attr MeinDevice1 reading03Name MeinErsterInhalt
attr MeinDevice1 reading03Regex MeinRegulaererAusdruck
attr MeinDevice1 stateFormat MeinErsterInhalt


Dieser Code liefert mir immer genau 1 Treffer/Ergebnis.

Der gesuchte reguläre Ausdruck / String existiert auf der Webseite aber mehrfach, und ich möchte auch alle Treffer ausgeben lassen.
Bei der klassichen Programmierung kann man ja mit Schleifen arbeiten. Mir fehlt aber völlig der Ansatz, wie ich das in FHEM umsetzen kann. Was muss ich wo definieren, damit nicht der erste Treffer berücksichtigt wird, sondern ALLE Treffer? Und wo kann ich eine Schleife einbauen, damit auch alle Treffer ausgegeben werden?

Ich wäre für jede Unterstützung dankbar!

frank

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

Pi_01

Danke für die prompte Antwort.
Ich kann auf die Inhalte jetzt zwar gezielt über die Nummer zugreifen, z.B.

attr MeinDevice1 stateFormat MeinErsterInhalt-10
attr MeinDevice1 stateFormat MeinErsterInhalt-11
attr MeinDevice1 stateFormat MeinErsterInhalt-12


aber wie kann ich alle Inhalte automatisch ausgeben? (mittels Schleife?)


frank

alle readings automatisch funktioniert nicht auf knopfdruck, leider.

1. attr stateFormat erlaubt perl code. dort kannst du dann zb eine funktion aufrufen, in der deine "schleife" abläuft.
mit "attr showMatched" hättest du ein reading in httpmod, das alle readingnamen enthält. also readingnamen extrahieren und die schleife füttern, ....

2. bau dir besser eine readingsgroup, siehe wiki.
die sammelt automatisch alles ein, was du willst, und nebenbei wird auch alles formatiert.
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

jkriegl

Verstehe ich die Frage richtig? dann probier
attr MeinDevice1 stateFormat MeinErsterInhalt-10 MeinErsterInhalt-11 MeinErsterInhalt-12
Rpi 3/4, buster, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

Beta-User

...das ist aber dann unschön, wenn es nicht immer dieselbe Anzahl ist...

Mind. in den attrTemplates zu Tasmota- und Homematic-Updates gibt es dynamsichen, aber deutlich komplizierteren Code, der ggf. ein passendes Ergebnis liefert: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template#L531. Das basiert auf "älterem" Code, der irgendwo im Wiki zu finden ist (bzw. dem im template verlinkten Thread), der mit myUtils arbeitet und nicht den ganzen Code im Device beherbergt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

frank

Zitat von: jkriegl am 15 April 2020, 16:00:30
Verstehe ich die Frage richtig?
in deinem vorschlag fehlt: automatisch.
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

Pi_01

Zitat von: frank am 15 April 2020, 14:36:23
alle readings automatisch funktioniert nicht auf knopfdruck, leider.

1. attr stateFormat erlaubt perl code. dort kannst du dann zb eine funktion aufrufen, in der deine "schleife" abläuft.
mit "attr showMatched" hättest du ein reading in httpmod, das alle readingnamen enthält. also readingnamen extrahieren und die schleife füttern, ....

2. bau dir besser eine readingsgroup, siehe wiki.
die sammelt automatisch alles ein, was du willst, und nebenbei wird auch alles formatiert.

Danke für die Rückmeldung.
Für einen Neueinsteiger wie mich ist manchmal auch das Wiki zu "abstrakt" geschrieben, zumindest finde ich nicht die Antwort auf meine Fragen.

Nochmal zurück zu meinem Code:
define MeinDevice1 HTTPMOD https://.... 600
attr MeinDevice1 enableControlSet 1
attr MeinDevice1 reading03RegOpt g
attr MeinDevice1 reading03Name MeinErsterInhalt
attr MeinDevice1 reading03Regex MeinRegulaererAusdruck
attr MeinDevice1 stateFormat MeinErsterInhalt


Das HTTPMOD-Modul finde ich schon Klasse, weil man sehr einfach eine komplette Webseite parsen kann.
Das Ergebnis aus "MeinRegulaererAusdruck" wird in die Variable "MeinErsterInhalt" geschrieben, die ich dann über "stateFormat" unkompliziert ausgeben kann.

Ich möchte jetzt aber "MeinErsterInhalt" in Form eines Arrays in einem eigenen Script weiterverarbeiten.

OK, eine Datei names "99_myUtils.pm" wurde schon angelegt, und darin befindet sich meine Funktion

sub test123{
  return("hello world");
}


Was ich jetzt überhaupt nicht verstehe: wie kann ich den kompletten Inhalt des Attributs "MeinErsterInhalt" (muss ja eine Art Array sein) in meine Funktion "test123" integrieren, damit ich INNERHALB meiner Funktion mit "MeinErsterInhalt" weiterarbeiten kann?

Und wie kann ich test123 wiederum in stateFormat integrieren?

Der Code
attr MeinDevice1 stateFormat MeinErsterInhalt test123
funktioniert nicht. Soll heißen: der Inhalt aus test123 wird nicht ausgegeben.

frank

#8
die fhem-bibel (commandRef) hätte dir gezeigt, dass die syntax für stateFormat bei verwendung von perl folgendermassen lautet:

attr <device> stateFormat {in dieser klammer ist nur perl code erlaubt}

also zb
attr MeinDevice1 stateFormat {return ReadingsVal($name,"MeinErsterInhalt","").": ".test123();}

edit: fehler behoben.
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

frank

das return beim stateformat code könnte auch html code liefern. damit kannst du formatieren und farbe ins spiel bringen.
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

Pi_01

Zitat von: frank am 15 April 2020, 18:11:08
die fhem-bibel (commandRef) hätte dir gezeigt, dass die syntax für stateFormat bei verwendung von perl folgendermassen lautet:

attr <device> stateFormat {in dieser klammer ist nur perl code erlaubt}

also zb
attr MeinDevice1 stateFormat {return ReadingsVal($name,"MeinErsterInhalt","").": ".test123();}

edit: fehler behoben.

Vielen Dank Frank, du bist mir eine große Hilfe!

Wie schaffe ich jetzt noch das Gegenstück?

-->

define MeinDevice1 HTTPMOD https://.... 600
attr MeinDevice1 enableControlSet 1
attr MeinDevice1 reading03RegOpt g
attr MeinDevice1 reading03Name MeinErsterInhalt
attr MeinDevice1 reading03Regex MeinRegulaererAusdruck


Wie kriege ich den vollständigen Inhalt aus "MeinErsterInhalt" in meine eigene Funktion "test123"?
Ich stelle mir das so vor:

sub test123{
@geparsterWebseite_mehrereTrefferAlsArrayGespeichert = wieLautetDerCodeUm"MeinErsterInhalt"zuImportieren?;
foreach (@geparsterWebseite_mehrereTrefferAlsArrayGespeichert){
#Hier kommt mein weiterer Code
}
}

Pi_01

Ich hoffe ich konnte mein Anliegen richtig erklären.
Der Code
define MeinDevice1 HTTPMOD https://.... 600
attr MeinDevice1 enableControlSet 1
attr MeinDevice1 reading03Name MeinErsterInhalt
attr MeinDevice1 reading03Regex MeinRegulaererAusdruck
attr MeinDevice1 stateFormat MeinErsterInhalt


wurde erweitert mit der Zeile
attr MeinDevice1 reading03RegOpt g

Dies bewirkt, dass nicht nur der 1 Treffer berücksichtigt wird, sondern ALLE Treffer.

Blöd ist jetzt nur, dass nur jene Treffer ausgegeben werden, die ich über das stateFormat-Attribut gezielt anspreche (z.b. MeinErsterInhalt-1, MeinErsterInhalt-2, MeinErsterInhalt-3, MeinErsterInhalt-45 usw).
Daher möchte ich den vollständigen Inhalt aus MeinErsterInhalt in einer Schleife weiterverarbeiten (innerhalb einer eigenen Funktion in 99_myUtils.pm).

"MeinDevice1" (dazu zählt auch der Inhalt "MeinErsterInhalt") wurde über das FHEM-Webfrontend zusammengebaut.

Aber wie kann ich jetzt innerhalb meiner eigenen Funktion (diese liegt bekanntlich in 99_myUtils.pm) auf die Variable/Array/Attribut "MeinErsterInhalt" zugreifen?

frank

"MeinErsterInhalt-x" -> das ist der name eines readings.
"MeinDevice1"       -> das ist der name des devices des readings

wie im letzten bsp gezeigt, erhält man den wert zb über die perl funktion ReadingsVal().

den weiteren abriss habe ich auch beschrieben
Zitat1. attr stateFormat erlaubt perl code. dort kannst du dann zb eine funktion aufrufen, in der deine "schleife" abläuft.
mit "attr showMatched" hättest du ein reading in httpmod, das alle readingnamen enthält. also readingnamen extrahieren und die schleife füttern, ....

ungetestet:
my @readings = split(' ',ReadingsVal("MeinDevice1","MATCHED",""));


hast du dir readingsgroup angeschaut?
damit schiesst du dein fhem nicht so schnell ab.  8)
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

Pi_01

Jetzt habe ich es begriffen, danke Frank!

Innerhalb der eigenen Funktion muss der Code wie folgt lauten:

$variable = ReadingsVal("MeinDevice1","MeinErsterInhalt","");

Ganz ehrlich, mit der Standard-Doku wäre ich nie auf diesen Syntax gekommen!