Nein, das ist kein JSON
sondern einfach html (also der interessante Teil...). Etwas anders formatiert:
Code: Alles auswählen
document.write("<table class='invisible'><tr class='invisible'><th class='invisible'><h3>Inverter</h3></th><th class='invisible'><h3></h3></th></tr><tr class='invisible'><td class='invisible' valign='top' align='center'>
<table>
<tr><th>Name</th><th>Value</th><th>Unit</th></tr>
<tr><td>P DC</td><td align='right'>2912.16</td><td>W</td></tr>
<tr><td>U DC</td><td align='right'> 406.61</td><td>V</td></tr>
<tr><td>I DC</td><td align='right'> 7.15</td><td>A</td></tr>
<tr><td>U AC</td><td align='right'> 239.36</td><td>V</td></tr>
<tr><td>I AC</td><td align='right'> 12.50</td><td>A</td></tr>
<tr><td>F AC</td><td align='right'> 49.97</td><td>Hz</td></tr>
<tr><td>P AC</td><td align='right'>2876.07</td><td>W</td></tr>
</table>
</td><td class='invisible' valign='top' align='center'></table></td></tr></table>");
So kannst Du die Struktur gut erkennen. Es gibt verschiedene Optionen, um die Daten zu extrahieren, die für mich einfachste Variante ist REGEX, kurz für Regular Expressions. Für P AC sähe das z.B. so aus:
Wobei dann der Teil innerhalb der Klammern als Wert übergeben wird.
Der Punkt . steht für ein beliebiges Zeichen, der Stern * steht für beliebig viele Wiederholungen des vorangestellten Zeichens. .* bedeutet also: eine beliebig lange Zeichenfolge beliebiger Zeichen. Dann folgt der "Schlüssel", der den richtigen Teil des Codes einleitet, der natürlich P AC enthalten muss. Danach folgen diverse weitere Zeichen, die man natürlich auch "intelligenter" zusammengefasst werden können, aber für eine erste Annäherung würde ich KISS empfehlen (Keep It Simple Stupid). Nach dem > folgt noch ein einzelnes Leerzeichen, welches beliebig oft vorkommen darf (auch keinmal, siehe Werte in den anderen Zellen der Tabelle). Jetzt folgt die Zeichenfolge, welche wir extrahieren wollen, die nur aus Zahlen und einem Punkt bestehen darf. \d steht für eine Ziffer, das Plus + für mindestens ein oder beliebig viele des vorhergehenden Zeichens... \. ist der Punkt als Zeichen (. ist ja ein reserviertes Zeichen, weshalb es escaped werden muss) gefolgt von wieder mindestens einer Ziffer. Falls Zahlen zwischendurch auch mal komplett ohne Nachkommastellen angezeigt werden (insbesondere evtl. ohne Dezimalpunkt) muss der REGEX Ausdruck geändert werden... Das ? sorgt dafür, dass der kürzestmögliche Match zurückgegeben wird. Abschließend folgt als erstes Zeichen, welches nicht extrahiert wird das < Zeichen und anschließend wieder eine beliebig lange Zeichenkette beliebiger Zeichen (also .*).
Grau ist alle Theorie
und es manchmal erstaunlich, über welche Fallen man stolpert, also keine Gelinggarantie, aber es könnte so passen
Damit Du REGEX verwenden kannst, musst Du es installieren
wird gerne mal übersehen...
An die anderen Werte kommst Du auf die gleiche Weise, nur der Schlüssel variiert in den vier Zeichen vorne. Du brauchst für jeden Wert ein eigenes Item, Du brauchst für jeden Wert eine Stelle, um das REGEX zu verwenden. Sinnvoll wäre vermutlich, jeweils einen eigenen Channel zu verwenden, obwohl es auch andere Optionen gibt. Du kannst REGEX direkt im Channel verwenden, das hat dann den Vorteil, dass Du auch eine Unit übergeben kannst (die steht ja dabei, lohnt sich aber nicht, die zu extrahieren, die Unit ist ja statisch). Wenn Du die Unit mit angibst, kannst Du von UoM profitieren.