Wert mit HTTPMOD aus WEB-Seite auslesen

Begonnen von Guzzi-Charlie, 19 Juni 2025, 15:25:04

Vorheriges Thema - Nächstes Thema

Guzzi-Charlie

Hallo,
ich möchte drei verschiedene Werte (PV-Leistung) aus einem entfernten Standort über eine vom Betreiber bereitgestellte WEB-Seite mit FHEM auslesen.

Ich habe es schon mit Hilfe des HTTPMOD-Wiki's und verschiedenen anderen Forenbeiträgen versucht, aber ich bekomme es leider nicht hin.
Vielleicht kann mir mal Jemand Hilfestellung geben. Das HTTPMOD-Device habe ich angelegt und auch das die drei Attribut reading01Name, reading02Name, reading03Name.

Dies ist die Zeile im Quelltext der WEB-Seite um die es geht:
<input type="hidden" name="form:j_idt84" value="de" /><div id="form:accordeonPanel" class="ui-accordion ui-widget ui-helper-reset ui-hidden-container" role="tablist" data-widget="widget_form_accordeonPanel"><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-state-active ui-corner-top" role="tab" aria-expanded="true"><span class="ui-icon ui-icon-triangle-1-s"></span><a href="#" tabindex="-1">Jahresübersicht</a></h3><div id="form:accordeonPanel:j_idt85" class="ui-accordion-content ui-helper-reset ui-widget-content" role="tabpanel" aria-hidden="false"><div id="form:accordeonPanel:yearPanel" class="ui-outputpanel ui-widget"><div style="vertical-align:middle;"><button id="form:accordeonPanel:j_idt87" name="form:accordeonPanel:j_idt87" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt87',update:'form:accordeonPanel:yearImageId form:accordeonPanel:yearTextId form:accordeonPanel:yearInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-w"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt87_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt87',{id:'form:accordeonPanel:j_idt87'});</script><span id="form:accordeonPanel:yearTextId" style="font-size:18px; font-weight:bold; vertical-align:middle; padding-left:15px; padding-right:15px;">2025</span><button id="form:accordeonPanel:j_idt88" name="form:accordeonPanel:j_idt88" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt88',update:'form:accordeonPanel:yearImageId form:accordeonPanel:yearTextId form:accordeonPanel:yearInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-e"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt88_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt88',{id:'form:accordeonPanel:j_idt88'});</script></div><img id="form:accordeonPanel:yearImageId" src="charts/year/1F7E73D4777A5200332A327A6CA1F4C9/20250201/de" height="300" width="560" /><span id="form:accordeonPanel:yearInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>11.674,83</b>&nbsp;kWh&nbsp;(<b>524,71</b>&nbsp;kWh/kWp) | CO<sub>2</sub>-Vermeidung&nbsp;=&nbsp;<b>7.004,90</b>&nbsp;kg</p></span></div></div><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" aria-expanded="false"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#" tabindex="-1">Monatsübersicht</a></h3><div id="form:accordeonPanel:j_idt89" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"><div id="form:accordeonPanel:monthPanel" class="ui-outputpanel ui-widget"><div style="vertical-align:middle;"><button id="form:accordeonPanel:j_idt91" name="form:accordeonPanel:j_idt91" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt91',update:'form:accordeonPanel:monthImageId form:accordeonPanel:monthTextId form:accordeonPanel:monthInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-w"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt91_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt91',{id:'form:accordeonPanel:j_idt91'});</script><span id="form:accordeonPanel:monthTextId" style="font-size:18px; font-weight:bold; vertical-align:middle; padding-left:15px; padding-right:15px;">Jun 2025</span><button id="form:accordeonPanel:j_idt92" name="form:accordeonPanel:j_idt92" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt92',update:'form:accordeonPanel:monthImageId form:accordeonPanel:monthTextId form:accordeonPanel:monthInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-e"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt92_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt92',{id:'form:accordeonPanel:j_idt92'});</script></div><img id="form:accordeonPanel:monthImageId" src="charts/month/1F7E73D4777A5200332A327A6CA1F4C9/20250619/de" height="300" width="560" /><span id="form:accordeonPanel:monthInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>1.573,47</b>&nbsp;kWh&nbsp;(<b>70,72</b>&nbsp;kWh/kWp) | CO<sub>2</sub>-Vermeidung&nbsp;=&nbsp;<b>944,08</b>&nbsp;kg</p></span></div></div><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" aria-expanded="false"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#" tabindex="-1">Tagesübersicht</a></h3><div id="form:accordeonPanel:j_idt93" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"><div id="form:accordeonPanel:dayPanel" class="ui-outputpanel ui-widget"><div style="vertical-align:middle;"><button id="form:accordeonPanel:j_idt95" name="form:accordeonPanel:j_idt95" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt95',update:'form:accordeonPanel:dayPanel'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-w"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt95_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt95',{id:'form:accordeonPanel:j_idt95'});</script><span style="font-size:18px; font-weight:bold; vertical-align:middle; padding-left:15px; padding-right:15px;">19. Jun 2025</span><button id="form:accordeonPanel:calendarButton" name="form:accordeonPanel:calendarButton" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:calendarButton'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-calendar"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:calendarButton_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_calendarButton',{id:'form:accordeonPanel:calendarButton'});</script><button id="form:accordeonPanel:j_idt97" name="form:accordeonPanel:j_idt97" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt97',update:'form:accordeonPanel:dayPanel'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-e"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt97_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt97',{id:'form:accordeonPanel:j_idt97'});</script></div><img src="charts/day/1F7E73D4777A5200332A327A6CA1F4C9/20250619/de" height="300" width="560" /><span title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>84,11</b>&nbsp;kWh&nbsp;(<b>3,78</b>&nbsp;kWh/kWp) | CO<sub>2</sub>-Vermeidung&nbsp;=&nbsp;<b>50,47</b>&nbsp;kg</p></span></div></div><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" aria-expanded="false"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#" tabindex="-1">Jahresertrag</a></h3><div id="form:accordeonPanel:j_idt116" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"><div id="form:accordeonPanel:returnPanel" class="ui-outputpanel ui-widget"><div style="vertical-align:middle;"><button id="form:accordeonPanel:j_idt118" name="form:accordeonPanel:j_idt118" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt118',update:'form:accordeonPanel:returnImageId form:accordeonPanel:returnTextId form:accordeonPanel:returnInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-w"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt118_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt118',{id:'form:accordeonPanel:j_idt118'});</script><span id="form:accordeonPanel:returnTextId" style="font-size:18px; font-weight:bold; vertical-align:middle; padding-left:15px; padding-right:15px;">2025</span><button id="form:accordeonPanel:j_idt119" name="form:accordeonPanel:j_idt119" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" onclick="PrimeFaces.ab({source:'form:accordeonPanel:j_idt119',update:'form:accordeonPanel:returnImageId form:accordeonPanel:returnTextId form:accordeonPanel:returnInfoId'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-triangle-1-e"></span><span class="ui-button-text ui-c">ui-button</span></button><script id="form:accordeonPanel:j_idt119_s" type="text/javascript">PrimeFaces.cw('CommandButton','widget_form_accordeonPanel_j_idt119',{id:'form:accordeonPanel:j_idt119'});</script></div><img id="form:accordeonPanel:returnImageId" src="charts/return/1F7E73D4777A5200332A327A6CA1F4C9/20250201/de" /><span id="form:accordeonPanel:returnInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>11.674,83</b>&nbsp;kWh&nbsp;(<b>524,71</b>&nbsp;kWh/kWp) | CO<sub>2</sub>-Vermeidung&nbsp;=&nbsp;<b>7.004,90</b>&nbsp;kg</p></span></div></div><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" aria-expanded="false"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#" tabindex="-1">Gesamtübersicht</a></h3><div id="form:accordeonPanel:j_idt120" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"><div id="form:accordeonPanel:allYearsPanel" class="ui-outputpanel ui-widget"><img id="form:accordeonPanel:allYearImageId" src="charts/all/1F7E73D4777A5200332A327A6CA1F4C9/-/de" height="300" width="560" /><span id="form:accordeonPanel:allYearsInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>11.803,41</b>&nbsp;kWh | CO<sub>2</sub>-Vermeidung&nbsp;=&nbsp;<b>7.082,05</b>&nbsp;kg</p></span></div></div><h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" role="tab" aria-expanded="false"><span class="ui-icon ui-icon-triangle-1-e"></span><a href="#" tabindex="-1">Prognose</a></h3><div id="form:accordeonPanel:j_idt121" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"><table cellpadding="5" style="width:100%; text-align:center">Darin verstecken sich die gewünschten Werte:
  • Jahreswert  yearInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>11.674,83</b>&nbsp;kWh
  • Monatswert monthInfoId" title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>1.573,47</b>&nbsp;kWh
  • Tageswert   span title=""><p style="font-size:12px">Energie&nbsp;=&nbsp;<b>84,11</b>&nbsp;kWh
Wie kann ich die nun per attr reading..regExp auslesen? 
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

betateilchen

Erste Frage: Hast Du die Zeile aus dem Browser kopiert oder aus dem content, der tatsächlich in HTTPMOD ankommt und angezeigt wird, wenn das Attribut showBody gesetzt ist?

Zitat von: Guzzi-Charlie am 19 Juni 2025, 15:25:04Wie kann ich die nun per attr reading..regExp auslesen?

zum Beispiel so:

yearInfoId".{56}<b>([\d\.,]+)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Guzzi-Charlie

Hallo,

vielen Dank für die superschnelle UND zielführende Hilfe. Es hat bei meinen Versuchen auch deshalb immer mit einer Fehlermeldung geendet weil ich statt "..Regex" tatsächlich wie im Post "..regExp" geschrieben hatte. Da hab ich den Wald vor lauter Bäumen nicht gesehen.

Die Zeile hatte ich tatsächlich direkt aus dem Quelltext der Web-Seite kopiert.

Hab es gerade getestet und es funktioniert. Trotzdem würde ich gerne verstehen wie die von Dir gepostete Befehlszeile funktioniert. Ich habe diese kryptischen Filterbedingungen noch nie so richtig verstanden. Es wäre schön, wenn Du das nochmal etwas näher erklären könntest.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

betateilchen

Zitat von: Guzzi-Charlie am 19 Juni 2025, 18:30:48Es wäre schön, wenn Du das nochmal etwas näher erklären könntest.

Das werde ich nicht tun, sorry.

Grundlagen zu regex gibt es jede Menge im Internet, das muss niemand auch noch per copy und paste hier ins Forum kopieren. Du kannst das im Internet selbst nachlesen und versuchen zu verstehen. Das ist überhaupt nichts FHEM-spezifisches.

Gib einfach mal "regex grundlagen" in die Suchmaschine Deiner Wahl ein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Guzzi-Charlie

- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

betateilchen

Wenn Du Deinen html-code auf regex101.com einträgst und dann meine gepostete regex auf der gleiche Seite verwendest, bekommst Du im Fenster "Explanation" jeden einzelnen Teil der "kryptischen Filterbedingung"1 erklärt.

Du darfst diesen Dateianhang nicht ansehen.

1welch unsinnige Bezeichnung...



---
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Guzzi-Charlie

Danke, werde ich mich mal mit beschäftigen.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

passibe

Genau, Seiten wie regex101.com sind sehr gut, nicht nur zum erklären, sondern auch zum erstellen von Regexes. ChatGPT kann übrigens auch einigermaßen vernünftig regex erklären/erstellen.

Guzzi-Charlie

Sorry, aber ich muß nochmal nerven. Ich habe mich schon mit der regex101.com beschäftigt und habe jetzt auch die gestrige regex-Funktion soweit verstanden, aber bei einer weiteren WEB-Seite, aus der ich Daten auslesen möchte, komme ich nicht weiter.

Bei der WEB-Seite von Gestern befinden sich der Suchstring und das Ergebnis in einer Zeile.

Bei der neuen WEB-Seite sind der Suchstring (Solarstromertrag vom Vortag) und das Ergebnis (52.611.00) mehrere Zeilen (mit Zeilenumbrüchen, Leerzeichen und Tabs) voneinander entfernt. Die Suche funktioniert aber nur in der gleichen Zeile. Ich habe zwar auch schon herausgefunden das es einen Modifier "m" gibt mit dem man wohl über mehrere Zeilen suchen kann, aber ich finde keine Erklärungen dazu wie man den anwendet. Das übersteigt scheinbar mal wieder meine Fähigkeiten.

<h2 class="text-left">Solarstromertrag vom Vortag</h2>
           
       
     
  </div>
</div>





<div class="col-xs-12">
    <div class="row">
        <div class="col-sm-4">
            <div class="subheading">
                19.06.2025 Uhr
            </div>
        </div>
        <div class="col-sm-4">
            <div class="subheading">
                52.611.00
                kWh
            </div>
        </div>
        <div class="col-sm-4">
        </div>
    </div>
</div>
Die Daten sind direkt aus dem httpbody von FHEM kopiert.

Ich möchte den kWh-Wert "52.611.00" auslesen.

Kann man evtl. auch rückwärts suchen? Die Einheit "kWh" gibt es nur einmal auf der WEB-Seite und die kommt direkt nach dem Wert, allerdings auch wieder nicht in der gleichen Zeile, sondern eine Zeile danach.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

betateilchen

#9
Du denkst viel zu kompliziert. Überlege doch einfach, wonach Du suchen möchtest:

"nach einer Zahl, die aus ZIffern und Punkten besteht, nach der ein Zeilenumbruch und dann Leerzeichen kommen, bis kWh auftaucht"

Das geht ganz ohne modifier...

([\d\.]+)\n.*kWh
Wobei eine Darstellung, bei der sowohl das Tausendertrennzeichen als auch die Dezimaltrennung durch einen Punkt gekennzeichnet werden, sehr strange ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Guzzi-Charlie

OK, vielen Dank.
Das war ja einfach und verstanden habe ich es glaube jetzt auch, aber so richtig meine Welt ist das nicht. Da verknoten sich bei mir alle Hirnwindungen.

Das bekommt man wirklich nur hin wenn man einen regex-Computer im Kopf hat, oder mit Hilfsmitteln wie regex101.com.

Was die bei dem Format geritten hat weiß ich auch nicht. Normal ist das jedenfalls nicht, aber das bekomme ich schon hingebogen.
- RasPi 5: Cuno-V2 -2x KS300,JeeLink -13x EC3000
- Stromzähler: 6x SDM120M,9x XTM100A,38x DRS110M,3x eHz
- LAN: IT-GW 34x RMF-R1(Roll-Mot.),- 1x Loxone MSgo
- WLAN: 89x Shelly,12x Gosund SP111,16x D1-Mini,15x Sonoff Basic,85x 1wire T-Sens.
- DECT: 6x DECT200,11x DECT301,-HmIP: 3x FalmotC12,16x WTH2

betateilchen

Zitat von: Guzzi-Charlie am 20 Juni 2025, 15:18:43Das bekommt man wirklich nur hin wenn man einen regex-Computer im Kopf hat

Nein. Man muss nur in der Lage sein, die eigentliche Aufgabe so einfach zu formulieren wie irgend möglich.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Prof. Dr. Peter Henning

Zitat von: Guzzi-Charlie am 20 Juni 2025, 15:18:43Das bekommt man wirklich nur hin wenn man einen regex-Computer im Kopf hat
Äh - nö. Ein "General Purpose Computer" im Kopf - mit hinreichender Leistung - genügt vollkommen.

LG

pah