html-text für sensoren umwandeln

frankrudolf

New member
Hallo,

ich versuche die Ausgabe meines Delios-Wechselrichters für home assistant aufzubearbeiten.
Leider gelingt es mir nicht. Wenn ich die Webseite des Wechselrichters aufrufe, zeigt mein Browser (Mozilla) die Daten so an:


VL1=226.7
IL1=2.3
PowerGrid=0.5
VS1=83
VS2=83
IS1=0.0
IS2=0.0
PowerPV=0.0
VBatt=48.5
IBatt=0.0
PowerBatt=0.0
PercentBattery=3
ACinvTemp=26.0
BatteryTemp=20.0
PowerHouse=0.5
InvFlag=1071

Mit Mozilla Hilfsprogramm kann man sich die Daten auch unformatiert anschauen:
unformatiert:

VL1=226.7</br>IL1=2.3</br>PowerGrid=0.5</br>VS1=83</br>VS2=83</br>IS1=0.0</br>IS2=0.0</br>PowerPV=0.0</br>VBatt=48.5</br>IBatt=0.0</br>PowerBatt=0.0</br>PercentBattery=3</br>ACinvTemp=26.0</br>BatteryTemp=20.0</br>PowerHouse=0.5</br>InvFlag=1071</br>

Ich habe verschiedene Beispiele - angepaßt an meine URL etc. versucht (Stichwort Scrape), doch leider gelingt es mir nicht, die Ausgaben des Wechselrichters so umzuwandeln, daß man mit diesen Werten Sensoren erzeugen kann.


Das nachfolgende Beispiel funktioniert jedenfalls nicht.

# ------------------------ API auslesen

scrape:
# Example configuration.yaml entry
- resource: http://192.168.44.27/raw_data.html
verify_ssl: false
sensor:
- name: "Gridspannung"
select: 'VL1'
value_template: '{{ value.split("=")[1] }}'
unit_of_measurement: 'V'
state_class: total_increasing
unique_id: "33"

Im Internet fand ich verschiedene Beispiele, z.B. mit grep , Textbestandteile zu tauschen, das schien mir aber dann doch etwas aufwendig.

Hat jemand aus der community vielleicht noch eine gute Idee?

Vielen Dank"
FrankRudolf
 
Hallo,
jetzt nach Einfügen des korrekt formatierten yaml-Textes noch mal meine Frage:

ich versuche die Ausgabe meines Delios-Wechselrichters für home assistant aufzubearbeiten.
Leider gelingt es mir nicht. Wenn ich die Webseite des Wechselrichters aufrufe, zeigt mein Browser (Mozilla) die Daten so an:


VL1=226.7
IL1=2.3
PowerGrid=0.5
VS1=83
VS2=83
IS1=0.0
IS2=0.0
PowerPV=0.0
VBatt=48.5
IBatt=0.0
PowerBatt=0.0
PercentBattery=3
ACinvTemp=26.0
BatteryTemp=20.0
PowerHouse=0.5
InvFlag=1071

Mit Mozilla Hilfsprogramm kann man sich die Daten auch unformatiert anschauen:
unformatiert:

VL1=226.7</br>IL1=2.3</br>PowerGrid=0.5</br>VS1=83</br>VS2=83</br>IS1=0.0</br>IS2=0.0</br>PowerPV=0.0</br>VBatt=48.5</br>IBatt=0.0</br>PowerBatt=0.0</br>PercentBattery=3</br>ACinvTemp=26.0</br>BatteryTemp=20.0</br>PowerHouse=0.5</br>InvFlag=1071</br>

Ich habe verschiedene Beispiele - angepaßt an meine URL etc. versucht (Stichwort Scrape), doch leider gelingt es mir nicht, die Ausgaben des Wechselrichters so umzuwandeln, daß man mit diesen Werten Sensoren erzeugen kann.


Das nachfolgende Beispiel funktioniert jedenfalls nicht.
YAML:
# ------------------------ API auslesen

scrape:
# Example configuration.yaml entry
  - resource: http://192.168.44.27/raw_data.html
    verify_ssl: false
    sensor:
      - name: "Gridspannung"
        select: 'VL1'
        value_template: '{{ value.split("=")[1]  }}'
        unit_of_measurement: 'V'
        state_class: total_increasing
        unique_id: "33"


Im Internet fand ich verschiedene Beispiele, z.B. mit grep , Textbestandteile zu tauschen, das schien mir aber dann doch etwas aufwendig.

Hat jemand aus der community vielleicht noch eine gute Idee?

Vielen Dank"
FrankRudolf
 
Ist es denn eine "richtige HTML-Seite" oder "nur Text in einer HTML-Seite"? Was wird angezeigt, wenn Du mit Rechtsklick => Seitenquelltext anzeigen (oder ähnliches, je nach Browser) selbigen betrachtest? Das select geht ja ansich auf CSS, und zumindest das was Du bisher übermittelt hast enthält kein solches.
 
Hallo Nival,
vielen Dank für die Antwort/Frage!
Mit Hilfe der Entwicklertools von Chrome konnte ich den Text dieser eigentlich simplen html-Seite auch darstellen - siehe nachfolgenden Code. Dass für 'select' immer CSS erforderlich ist, habe ich erst nach diversen Videos "wie Daten aus Webseite extrahieren" letztlich verstanden. In Word kann ich mit suchen/ersetzen auch relativ problemlos die html-Seite in ein json-Konstrukt umwandeln - mit z.B. sed, Perl oder tr wie in manchen Beiträgen beschrieben, habe ich es aber nicht hinbekommen (soll ja in Echtzeit jedesmal für HA gewandelt werden).
Vielen Dank nochmals für Ihre Unterstützung!
Frank Rudolf
HTML:
<html><head></head><body>VL1=231.4<br>IL1=0.0<br>PowerGrid=0.0<br>VS1=157<br>VS2=156<br>IS1=1.1<br>IS2=1.1<br>PowerPV=0.3<br>VBatt=49.2<br>IBatt=3.4<br>PowerBatt=0.2<br>PercentBattery=21<br>ACinvTemp=38.0<br>BatteryTemp=19.9<br>PowerHouse=0.5<br>InvFlag=1071<br></body></html>
 
@frankrudolf das ist doch wunderbar, damit können wir arbeiten. Gehen wir es mal Schritt für Schritt durch - Du hast jetzt einen Ansatzpunkt, nämlich den Selektor "body". Das ist dann natürlich grundsätzlich zu viel, aber unser Startpunkt. Versuch es einmal so:
YAML:
scrape:
  - resource: http://192.168.44.27/raw_data.html
    verify_ssl: false
    sensor:
      - name: "Gridspannung Test"
        select: 'body'
        value_template: '{{ value }}'

Dann Neustart und unter den Entwicklerwerkzeugen => Zustände nach diesem Sensor schauen - was hat er als Zustand stehen? Ist das erwartungsgemäß alles, was innerhalb von <body> steht, oder gibt es hier noch andere Probleme (z.B. wie in meinem nachgestellten grade, eben ohne diese Datei, ein "404: Not Found")? Einmal reinkopieren, als Code formatiert, wenn alles fein ist ziehen wir im nächsten Schritt die gewünschten Daten daraus.

Da wir hier sicher nicht nur eine Zahl bekommen sollten unit_of_measurement und state_class an dieser Stelle wirklich nicht angegeben werden, ne unique_id brauchen wir hier auch erstmal nicht - diesen Sensor werfen wir nachher wieder weg, wenn der "richtige" läuft.
 
Hallo Nival,
vielen Dank, das hat schon mal geholfen!
Wenn ich auf das Augensymbol der neuen Entität gehe, wird mir der aktuelle Inhalt angezeigt. Leider konnte ich nur einen Screensho davon machen;
Jetzt müsste ich diesen Text geeignet mit einem Tool zerlegen.
Einstweilen vielen Dank!
FrankRudolf

screeshot_Gridspannung_text.JPG
 
Jetzt müsste ich diesen Text geeignet mit einem Tool zerlegen.
Hmhmm ich gehe mal davon aus, dass <br> dennoch da ist, auch wenn es in dieser Anzeige unterschlagen wird.

Ich habe mir das mal kurzerhand mit dem Quellcode von Dir nachgebaut in den Entwicklerwerkzeugen:
YAML:
{% set value = 'VL1=231.4<br>IL1=0.0<br>PowerGrid=0.0<br>VS1=157<br>VS2=156<br>IS1=1.1<br>IS2=1.1<br>PowerPV=0.3<br>VBatt=49.2<br>IBatt=3.4<br>PowerBatt=0.2<br>PercentBattery=21<br>ACinvTemp=38.0<br>BatteryTemp=19.9<br>PowerHouse=0.5<br>InvFlag=1071<br>' %}
Und davon ausgehend gibt es zwei Möglichkeiten, eine kurze (wenn Du Dir sicher bist, dass der gewüschte Wert immer an der gleichen Stelle steht):
YAML:
{{ value.split("<br>")[0].split("=")[1] }}
und eine lange (wenn Du nach der Bezeichnung suchen lassen und dann den Wert ausgeben möchtest):
YAML:
{% for elem in value.split("<br>") %}{% set this_elem = elem.split("=") %}{% if this_elem[0] == "VL1" %}{{ this_elem[1] }}{% endif -%}{% endfor %}
Versuch das dann jetzt mal als value_template einzutragen. Wenn das funktioniert könnte noch ein | float (0) Sinn machen (anzunehmen, dass es aktuell String ist, alles andere würde keinen Sinn machen), und dann dürfte es in den originalen Sensor übermittelt werden.
 
Hallo Nival,
danke für Ihre Mühe!

Habe zwei Sensoren erzeugt, GridspannungTest2 und GridspannungTest3
Ihr erster Vorschlag in GridspannungTest2 zeigt: 226.0IL1
Ihr zweiter Vorschlag in GridspannungTest3 zeigt: 226.0IL1
so dass wahrscheinlich das <br> nicht mehr da ist - mittels "Werkzeuge für Webentwickler" im Browser habe ich trotz 'Suchen ' leider den String nicht finden können, sondern nur den bereits von HA ausgegebenen Wert:
HTML:
<ha-state-icon style="" data-domain="sensor" data-state="226.0IL1"></ha-state-icon>

Soweit meine Ergebnisse.

FrankRudolf
 
Okay, das ist jetzt nicht so schön. Du könntest noch versuchen, ob </br> anstelle von <br> zieht, andernfalls - das geht jetzt aber wieder davon aus, dass es immer in der gleichen Reihenfolge steht - wäre das erstmal eine Option:
YAML:
{{ value | regex_replace('.*VL1=','') | regex_replace('IL1.*','') }}
Das schneidet im ersten Schritt alles vor und inklusive "VL1=" weg, im zweiten alles ab und inklusive "IL1", lässt also nur den gewünschten Wert über. Nicht ganz so elegant, aber machbar.

Edit, geht doch eleganter - bin positiv überrascht, dass HA diese Möglichkeiten auch bietet:
YAML:
{{ (value | regex_replace('.*VL1=','') | regex_replace('(?<!\d)\D+.*',''))[:-1] }}

Dann ist es wieder egal, was dahinter steht. Gehe hierbei aber davon aus, dass es immer float ist - also im Zweifel .0 bei theoretischem int. Sollte das nicht der Fall sein bliebe noch die Option, davon auszugehen, dass die folgende Bezeichnung mit einem Großbuchstaben A-Z beginnt, dann wäre es sogar wieder simpler:
YAML:
{{ value | regex_replace('.*VL1=','') | regex_replace('[A-Z]+.*','') }}
 
Zuletzt bearbeitet:
Hallo Nival,
Ihr Vorschlag hat funktioniert!
Nachfolgend der Auszug aus der configuration.yaml.
Da es dunkel ist, kommen vom Solardach keine Werte (dennoch haben sich in HA VS1 und VS2 geändert, während sich die entsprechenden Daten vom Wechselrichter nicht geändert haben.
Wie kann ich dem System HA mitteilen, dass die ermittelten Werte Zahlen sind?

Vielen Dank nochmals für Ihre Beratung!

FrankRudolf

YAML:
# ------------------------ API auslesen
scrape:
  - resource: http://192.168.44.27/raw_data.html
    verify_ssl: false
    sensor:
      - name: "Delios_VL1"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*VL1=','') | regex_replace('IL1.*','') }} "
        unique_id: "33"
        
      - name: "Delios_IL1"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*IL1=','') | regex_replace('PowerGrid.*','') }} "
        unique_id: "34"
        
      - name: "Delios_PowerGrid"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*PowerGrid=','') | regex_replace('VS1.*','') }} "
        unique_id: "35"
        
      - name: "Delios_VS1"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*VS1=','') | regex_replace('VS2.*','') }} "
        unique_id: "36"
        
      - name: "Delios_VS2"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*VS2=','') | regex_replace('IS1.*','') }} "
        unique_id: "37"
        
      - name: "Delios_IS1"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*IS1=','') | regex_replace('IS2.*','') }} "
        unique_id: "38"
        
      - name: "Delios_IS2"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*IS2=','') | regex_replace('PowerPV.*','') }} "
        unique_id: "39"
        
      - name: "Delios_PowerPV"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*PowerPV=','') | regex_replace('VBatt.*','') }} "
        unique_id: "40"
        
      - name: "Delios_VBatt"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*VBatt=','') | regex_replace('IBatt.*','') }} "
        unique_id: "41"
        
      - name: "Delios_IBatt"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*IBatt=','') | regex_replace('PowerBatt.*','') }} "
        unique_id: "42"
        
      - name: "Delios_PowerBatt"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*PowerBatt=','') | regex_replace('PercentBattery.*','') }} "
        unique_id: "43"
        
      - name: "Delios_PercentBattery"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*PercentBattery=','') | regex_replace('ACinvTemp.*','') }} "
        unique_id: "44"
        
      - name: "Delios_ACinvTemp"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*ACinvTemp=','') | regex_replace('BatteryTemp.*','') }} "
        unique_id: "45"
        
        
      - name: "Delios_BatteryTemp"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*BatteryTemp=','') | regex_replace('PowerHouse.*','') }} "
        unique_id: "46"
        
        
      - name: "Delios_PowerHouse"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*PowerHouse=','') | regex_replace('InvFlag.*','') }} "
        unique_id: "47"
        
        
      - name: "Delios_InvFlag"
        select: 'body'
        value_template:  " {{ value | regex_replace ('.*InvFlag=','') | regex_replace('IL1.*','') }} "
        unique_id: "48"
 
Okay, also die allereinfachste Variante - gut, solange sich an dem Format nichts ändert wird das passen, wenn doch mal, siehe Ergänzungen oben.

Wie kann ich dem System HA mitteilen, dass die ermittelten Werte Zahlen sind?
Da kommen wir zum oben erwähnten |float(0) dahinter.

Ein Filter bezieht sich grundsätzlich auf das, was (direkt) vor ihm steht. Hier wollen wir aber nicht nur "das letzte", sondern "alles" konvertieren, wir brauchen also Klammern. Das wäre bei dem ersten Sensor also:
YAML:
      - name: "Delios_VL1"
        select: 'body'
        value_template:  " {{ (value | regex_replace ('.*VL1=','') | regex_replace('IL1.*','')) | float(0) }} "
        unique_id: "33"
Eine öffnende Klammer vor allem, eine schließende danach, danach konvertieren und in Klammern nach dem float nochmal ein Defaultwert, falls mal nichts ankommt (um Fehler zu vermeiden).

Wenn das getan ist kannst Du auch unit_of_measurement und state_class wieder hinzufügen, bzw. solltest es, wenn es Deinem Ziel dienlich ist (ich betrachte das nur aus Programmierersicht und nutze HA selber nicht aktiv, kann das also nicht beurteilen).
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.543
Beiträge
46.533
Mitglieder
4.179
Neuestes Mitglied
CColli
Zurück
Oben