Status von Dummy-Items persistieren (rrd4j)

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Hannes
Beiträge: 14
Registriert: 3. Aug 2023 12:25
Answers: 0

Status von Dummy-Items persistieren (rrd4j)

Beitrag von Hannes »

Guten Tag,

da es für meinen alten Wechselrichter leider kein OH-Binding gibt, lese ich die Werte in einer Rule jede Minute per Aufruf einer URL am WR aus, welche mir die aktuellen Werte als XML zurückliefert.

Diese werden dann in folgenden (Dummy)-Items gespeichert:

Code: Alles auswählen

//Photovoltaik
String PV_Power "PV Power [%s W]" <energy> (PV_Eaton)
String PV_Temp  "PV Temperatur [%s C]" <temperature> (PV_Eaton)
String PV_VPV   "PV VPV [%s V]" <energy> (PV_Eaton)
String PV_IAC   "PV Wechselstromstärke [%s A]" <battery> (PV_Eaton)
String PV_Today "PV Tagesleistung [%s kWh]" <pressure> (PV_Eaton)
String PV_Total "PV Gesamtleistung [%s kWh]" <pressure> (PV_Eaton)
String PV_Laufz "PV Laufzeit h [%s]" <time> (PV_Eaton)
Leider fehlt mir hier aber - im Gegensatz zu allen anderen Items/Things die über ein Binding verfügen und mittels rrd4j automatisch persistiert werden - die Historie.

Muss die Persistierung für Dummy-Items explizit eingeschaltet werden und falls ja, wie geht das?

Vielen Dank,
Hannes

Benutzeravatar
udo1toni
Beiträge: 14565
Registriert: 11. Apr 2018 18:05
Answers: 227
Wohnort: Darmstadt

Re: Status von Dummy-Items persistieren (rrd4j)

Beitrag von udo1toni »

String Items enthalten Strings. Du brauchst zwingend Number Werte.
Kannst Du bitte Deine vollständige Rule hier teilen?
Der eingeschlagene Weg ist eine Möglichlkeit, aber ziemlich sicher nicht die eleganteste Variante, denn es gibt mit dem http Binding und XPATH als Transformation Service eigentlich alle Werkzeuge, um die Daten ohne Rule in einzelne Channel zu bringen.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.7, LXC), mit openHABian eingerichtet

Hannes
Beiträge: 14
Registriert: 3. Aug 2023 12:25
Answers: 0

Re: Status von Dummy-Items persistieren (rrd4j)

Beitrag von Hannes »

Hallo Udo,

danke für deine rasche Antwort.

Hier meine Rule, die ich für das Auslesen vom XML verwende:

Code: Alles auswählen

rule "PV Logger"
when
    Time cron "0 * 8-19 ? * * *" // Jede Minute von 08:00 - 19:00 Uhr
then
    val String url = sendHttpGetRequest("http://10.0.0.55/status.xml")

    PV_Power.sendCommand(transform("XPATH", "/response/gauge_power", url))
    PV_Temp.sendCommand(transform("XPATH", "/response/gauge_temp", url))
    PV_VPV.sendCommand(transform("XPATH", "/response/gauge_vpv", url))
    PV_IAC.sendCommand(transform("XPATH", "/response/gauge_iac", url))
    PV_Today.sendCommand(transform("XPATH", "/response/energy_today", url))
    PV_Total.sendCommand(transform("XPATH", "/response/energy_total", url))
    PV_Laufz.sendCommand(transform("XPATH", "/response/hours_total", url)) 
end
So schaut das XML aus, welches ich vom Wechselrichter unter der oben angeführten URL bekomme:

Code: Alles auswählen

<response>
<gauge_power>32</gauge_power>
<gauge_temp>36.5</gauge_temp>
<gauge_vpv>180.4</gauge_vpv>
<gauge_iac>0.2</gauge_iac>
<energy_today>8.800</energy_today>
<energy_total>703.0</energy_total>
<hours_total>1422</hours_total>
<time_stamp>20230916 
17:47</time_stamp>
</response>
Danke,
Hannes

Benutzeravatar
udo1toni
Beiträge: 14565
Registriert: 11. Apr 2018 18:05
Answers: 227
Wohnort: Darmstadt

Re: Status von Dummy-Items persistieren (rrd4j)

Beitrag von udo1toni »

Eine frage habe ich noch vergessen, die nach der openHAB Version. Ab openHAB3 geht es auf jeden Fall mit dem http2/3 Binding los.
Ich gebe hier die Definition als Text über *.things Dateien an, das Thing lässt sich aber ebenso gut über die UI erstellen, die Parameter stehen ohne Einschränkung auch dort zur Verfügung.

Code: Alles auswählen

Thing http:url:pvlog "FooPV Logger" [
    baseURL="http://10.0.0.55/status.xml",
    refresh=60
 ] {
        Channels:
         Type number : gPower "Gauge Power"  [ stateTransformation="XPATH:/response/gauge_power",  unit="W" ]
         Type number : gTemp  "Gauge Temp"   [ stateTransformation="XPATH:/response/gauge_temp",   unit="°C" ]
         Type number : gVPV   "Gauge VPV"    [ stateTransformation="XPATH:/response/gauge_vpv",    unit="V" ]
         Type number : gIAC   "Gauge IAC"    [ stateTransformation="XPATH:/response/gauge_iac",    unit="A" ]
         Type number : eToday "Energy today" [ stateTransformation="XPATH:/response/energy_today", unit="kWh" ]
         Type number : eTotal "Energy total" [ stateTransformation="XPATH:/response/energy_total", unit="kWh" ]
         Type number : hTotal "Hours total"  [ stateTransformation="XPATH:/response/hours_total",  unit="h" ]
 }
Der Parameter unit steht ab ~ OH3.4 zur Verfügung, bei einer älteren Version lässt Du den weg.

Die passenden Items dazu (ebenfalls als Text... siehe oben):

Code: Alles auswählen

Number:Power             PV_Power "Leistung"        {channel="http:url:pvlog:gPower",   unit="W",   stateDescription=""[pattern="%.1f W"]}
Number:Temperature       PV_Temp  "Temperatur"      {channel="http:url:pvlog:gTemp",    unit="°C",  stateDescription=""[pattern="%.1f °C"]}
Number:ElectricPotential PV_VPV   "Spannung"        {channel="http:url:pvlog:gVPV",     unit="V",   stateDescription=""[pattern="%.1f V"]}
Number:ElectricCurrent   PV_IAC   "Strom"           {channel="http:url:pvlog:gIAC",     unit="A",   stateDescription=""[pattern="%.1f A"]}
Number:Energy            PV_Today "Arbeit heute"    {channel="http:url:pvlog:eToday",   unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Number:Energy            PV_Total "Arbeit gesamt"   {channel="http:url:pvlog:eTotal",   unit="kWh", stateDescription=""[pattern="%.1f kWh"]}
Number:Time              PV_Laufz "Betriebsstunden" {channel="http:url:pvlog:hTotal",   unit="h",   stateDescription=""[pattern="%.1f h"]}
Hier steht der Parameter unit ab OH4.0 zur Verfügung.
Nutzt Du unit im Channel, so ist die Verwendung des passenden UoM (Unit of Measurement) Items dringend zu empfehlen, ab OH4 ist dann der Parameter unit verpflichtend (gehört zu den Metadaten).
In künftigen Versionen von openHAB wird die Verwendung von UoM zwingend sein, wenn der Channel als QuantityType (das ist der Datentyp für UoM) zur Verfügung steht - momentan ist es lediglich empfohlen. Es ist also empfehlenswert, sich in das Thema einzuarbeiten, um später gerüstet zu sein.

Unter der Voraussetzung, dass ich die Einheiten korrekt geraten habe :) und die Parameter so zur Verfügung stehen (also OH4.x), hast Du anschließend die Daten als Zahlen mit Einheit im Item vorliegen.
Falls die Einheit im Channel falsch ist (z.B. mA statt A, oder Wh statt kWh) kannst Du die Einheit dort einfach passend ändern, siehe auch https://www.openhab.org/docs/concepts/u ... ement.html als Liste der möglichen Einheiten. Und ganz wichtig: auch exotischere Einheiten (z.B. d°C, zehntel ° Celsius, also die Temperatur, aber mit um eine Stelle nach rechts verschobenem Komma) sind hier möglich.
Die unit im Item bestimmt, in welcher Form die Daten in der Persistence landen, es ist also ganz wichtig, dass diese Größe schon zu Beginn korrekt gewählt wird, sie sollte später nicht mehr geändert werden, sonst entstehen unschöne Sprünge in den Charts und Fehler in Summen- und Durchschnittsberechnungen.
In welcher Form der Wert angezeigt wird, ist hingegen zu jedem Zeitpunkt änderbar über das Pattern.
Alle drei Parameter (unit im Channel, unit im verlinkten Item und pattern des selben Items) sind unabhängig voneinander, müssen aber logischerweise innerhalb der Einheit korrekt sein. Du kannst die Temperatur aber ohne weiteres in d°C empfangen, in K speichern und in °F anzeigen lassen (ohne Dich mit Umrechnungsfaktoren oder Kommaverschiebung rumschlagen zu müssen - das ist der große Pluspunkt von UoM).

Zur Not kannst Du UoM auch komplett weg lassen, dann halt ohne unit Parameter in den Channels und ohne QuantityType Items (nur Number).
Bei XPATH kämpfe ich immer etwas mit dem anzugebenden Path, allerdings sollte der identisch zu dem in der Rule sein.

Solltest Du noch mit openHAB2 unterwegs sein, so gibt es evtl. irgendwo in den Tiefen der englischen Community noch einen Link auf das http2 Binding, das leider nie offiziell Teil von openHAB2 war - ich habe es aber erfolgreich verwendet und kann notfalls auch die *.jar zur Verfügung stellen (bin aber gerade nicht Zuhause...) Unter openHAB2 steht UoM für http nicht zur Verfügung.
Ansonsten bliebe immer noch der Weg über das http1 Binding, welches ohne Einschränkungen auch in openHAB2 zur Verfügung steht. Allerdings geht damit auch noch der Witz der Transformation verloren :) so dass Du am Ende doch eine Rule bräuchtest.

Wenn alle Stricke reißen, kannst Du aber zumindest immer noch die Rule anpassen, so dass aus den gelieferten Strings per Float::parseFloat(<String>) aus dem gelieferten Text direkt eine Zahl erzeugt wird.
Falls die Zahl ein Komma statt eines Punktes als Dezimaltrenner beinhaltet, müsste das zuvor entsprechend ersetzt werden, da die DSL zwingend mit Punkt als Dezimaltrenner arbeitet.
openHAB4.2.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.7, LXC), mit openHABian eingerichtet

Hannes
Beiträge: 14
Registriert: 3. Aug 2023 12:25
Answers: 0

Re: Status von Dummy-Items persistieren (rrd4j)

Beitrag von Hannes »

Hallo Udo,

ich verwende openHAB 4.0.1 - Release Build.
Ja, was soll ich sagen? Reinkopiert und funktioniert! :D

Diese Lösung ist natürlich eleganter als eine Rule und Persistence funktioniert nun auch.
Vielen Dank, für den tollen Input und die ausführliche Antwort / Erklärung.

LG und einen schönen Sonntag,
Hannes

Antworten