Verständnisproblem mit HTTPMOD/RegEx - PV-Daten einer ECU-C von APSystems

Begonnen von hauwech, 21 Februar 2024, 15:40:49

Vorheriges Thema - Nächstes Thema

hauwech

Hallo zusammen,
ich komme irgendwie nicht weiter... Ich beschreibe mal kurz das Szenario.
Ich habe an meiner PV Anlage 7 Wechselrichter mit jeweils 2 Solarpaneln (APSystems DS3S). Die werden mit einer ECU-C von APSystems verwaltet. Ich habe bis jetzt die Werte der einzelnen Module mit dem APSystems Adapter von IOBroker aus der ECU-C ausgelesen und per MQTT an fhem gepublished. Es gibt aber ein Problem, für das ich bisher noch keine Informationen finden konnte. Die Datenschnittstelle der ECU-C steigt sporadisch immer wieder aus. Das macht sich bemerkbar, daß die Werte der IOBroker Datenpunkte nicht mehr aktualisiert werden. Das kann nach drei Tagen passieren, es kann aber auch mal sieben Tage funktionieren, es ist kein Muster erkennbar. Bis ich das jeweils bemerkt habe, ist die Statistik schon versaut. Die Datenlieferung läßt sich nur wieder in Gang setzen, indem man die ECU-C ausschaltet und wieder einschaltet. Das Webinterface der ECU-C ist aber trotzdem durchgängig verfügbar und aktualisiert auch die Werte der Solarmodule. Das hat mich auf die Idee gebracht, den Umweg über IOBroker zu umgehen und die Werte vom Webinterface mit HTTPMOD auszulesen. Damit habe ich aber keine Erfahrung und mit Regex habe ich bisher auch nur einfache Sachen gemacht. Wenn ich den HTML Quelltext der ECU-C Seite (http://ecu/index.php/realtimedata) anschaue, sehe ich die Daten aus der Tabelle (das ist nur ein Auszug des relevanten Teils):
. . .
<div class="table-responsive">
  <div>
            </div><div>
            </div><div>
            </div><div>
            </div><div>
            </div><div>
            </div><div>
            </div><table class="table table-condensed table-bordered">
    <thead>
      <tr>
        <th scope="col">Inverter ID</th>
        <th scope="col">Current Power</th>
        <th scope="col">DC Voltage</th>
        <th scope="col">Grid Frequency</th>
        <th scope="col">Grid Voltage</th>
        <th scope="col">Temperature</th>
        <th scope="col">Reporting Time</th>
      </tr>
    </thead>
    <tbody>
        <tr class="active">
        <td>702000290924-1 </td>
        <td> 17 W </td>
        <td> 40 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 231 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr class="active">
        <td>702000290924-2 </td>
        <td> 17 W </td>
        <td> 41 V </td>
        <td> 231 V </td>
      </tr>
         
        <tr>
        <td>702000294979-1 </td>
        <td> 18 W </td>
        <td> 41 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 231 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr>
        <td>702000294979-2 </td>
        <td> 17 W </td>
        <td> 42 V </td>
        <td> 231 V </td>
      </tr>
         
        <tr class="active">
        <td>702000326333-1 </td>
        <td> 18 W </td>
        <td> 42 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 232 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr class="active">
        <td>702000326333-2 </td>
        <td> 17 W </td>
        <td> 42 V </td>
        <td> 232 V </td>
      </tr>
         
        <tr>
        <td>702000333482-1 </td>
        <td> 19 W </td>
        <td> 41 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 228 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr>
        <td>702000333482-2 </td>
        <td> 17 W </td>
        <td> 42 V </td>
        <td> 228 V </td>
      </tr>
         
        <tr class="active">
        <td>702000300734-1 </td>
        <td> 18 W </td>
        <td> 41 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 229 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 19 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr class="active">
        <td>702000300734-2 </td>
        <td> 17 W </td>
        <td> 41 V </td>
        <td> 229 V </td>
      </tr>
         
        <tr>
        <td>702000301355-1 </td>
        <td> 18 W </td>
        <td> 41 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 228 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr>
        <td>702000301355-2 </td>
        <td> 18 W </td>
        <td> 41 V </td>
        <td> 228 V </td>
      </tr>
         
        <tr class="active">
        <td>702000297477-1 </td>
        <td> 17 W </td>
        <td> 41 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 50.0 Hz </td>
        <td> 231 V </td>
        <td rowspan="2" style="vertical-align: middle;"> 18 °C </td>
        <td rowspan="2" style="vertical-align: middle;"> 2024-02-21 09:27:14
 </td>
      </tr>
            <tr class="active">
        <td>702000297477-2 </td>
        <td> 18 W </td>
        <td> 41 V </td>
        <td> 231 V </td>
      </tr>
         
        </tbody>
  </table>

Interessant sind hier die Inverter-ID, Current Power, DC Voltage und vielleicht noch Temperatur und Timestamp.
Ich habe aber keine Idee, wie ich das mit Regex in HTTPMOD so formulieren kann, daß am Ende sinnvolle key-value Paare als Readings rauskommen. Vielleicht hat sich jemand schon mal den Kopf zerbrochen und kann mir auf die Sprünge helfen.

Gruß Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS

betateilchen

Wenn es eine einigermaßen klar strukturierte Tabelle ist, würde ich sowas überhaupt nicht über HTTPMOD machen, sondern mir eine eigene Funktion in meiner 99_myUtils.pm bauen. Dafür kann man dann eine der hervorragenden perl-Libraries verwenden, um Tabellen auf html-Seiten auszuwerten.

Das geht dann erfahrungsgemäß sehr viel schneller und einfacher als in HTTPMOD.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hauwech

Danke, gute Idee. Dann werde ich mir mal anschauen, wie ich das zu Fuß parsen kann.

Gruß Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS