FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Guzzi-Charlie am 19 Juni 2025, 15:25:04

Titel: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Guzzi-Charlie am 19 Juni 2025, 15:25:04
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:
Wie kann ich die nun per attr reading..regExp auslesen? 
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: betateilchen am 19 Juni 2025, 17:09:17
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\.,]+)
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Guzzi-Charlie am 19 Juni 2025, 18:30:48
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: betateilchen am 19 Juni 2025, 19:49:59
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen [gelöst]
Beitrag von: Guzzi-Charlie am 19 Juni 2025, 19:59:26
OK, trotzdem nochmal Danke.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: betateilchen am 19 Juni 2025, 20:18:06
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.

Bildschirmfoto 2025-06-19 um 20.15.26.png

1welch unsinnige Bezeichnung...



---
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Guzzi-Charlie am 19 Juni 2025, 20:21:54
Danke, werde ich mich mal mit beschäftigen.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: passibe am 19 Juni 2025, 23:05:38
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Guzzi-Charlie am 20 Juni 2025, 14:25:46
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: betateilchen am 20 Juni 2025, 14:58:20
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Guzzi-Charlie am 20 Juni 2025, 15:18:43
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: betateilchen am 20 Juni 2025, 16:25:11
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.
Titel: Aw: Wert mit HTTPMOD aus WEB-Seite auslesen
Beitrag von: Prof. Dr. Peter Henning am 20 Juni 2025, 16:48:31
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