Seite 2 von 2

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 13. Okt 2023 21:54
von udo1toni
Du rechnest allerdings nicht mit Einheiten, sondern entfernst die Einheit (mit dem .doubleValue). Es ging ja darum, explizit mit Einheiten zu rechnen...

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 14. Okt 2023 11:04
von nw378
Das ist aber auch verzwickt....

Wobei das Teilen durch 3600000 (respektive 3600, je nachdem, ob man in Millis oder in Sekunden rechnet) und ein "h" dranoperieren ja kein wirklich smartes Arbeiten mit UoM ist.

Nächster Ansatz:

.items:

Code: Alles auswählen

Number:Time Sonnen_std  "Sonnenstunden"  {unit="h", stateDescription=""[pattern="%.3f h"]} 
Number:Time Sonne_delta {unit="s"}
.rules:

Code: Alles auswählen

var long lStart = now.toEpochSecond  

rule "Sonnenstunden"
  when Item Sonne changed  then                                               
    if (Sonne.state == ON) lStart = now.toEpochSecond                     
    else if (Sonne.state == OFF) {  
      if(previousState == NULL) return;
      Sonne_delta.postUpdate(now.toEpochSecond - lStart)
      Sonnen_std.postUpdate(((Sonnen_std.state as QuantityType<?>) + (Sonne_delta.state as QuantityType<?>)).toString)}
end
So geht's. Das Item Sonne_delta wird in Sekunden gefüttert (allerdings ist der postUpdate Wert auch ohne Einheit, just saying...).
Sonnen_std arbeitet in Stunden.
Hierbei stört mich aber, dass ich mit einem weiteren Item arbeiten muss.
Denn ich habe irgendwo mal aufgeschnappt, dass man innerhalb von rules nur mit Variablen rechnen soll, da openHAB Items ggf. mal zeitversetzt speichert. Damit stünde der aktuelle Wert bei der nächsten Code-Zeile nicht korrekt zur Verfügung.

Schöner wäre ja:

Code: Alles auswählen

var Sonnen_delta = 0|s as QuantityType<?>
      Sonnen_delta = (now.toEpochSecond - lStart)
aber dann erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Type mismatch: cannot convert from long to QuantityType<?>

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 14. Okt 2023 19:07
von udo1toni
nw378 hat geschrieben: 14. Okt 2023 11:04 Schöner wäre ja:

Code: Alles auswählen

var Sonnen_delta = 0|s as QuantityType<?>
      Sonnen_delta = (now.toEpochSecond - lStart)
aber dann erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Type mismatch: cannot convert from long to QuantityType<?>
Ja, das stimmt halt noch nicht...
Nächste Idee:

Code: Alles auswählen

var Sonnen_delta = new QuantityType<?>((now.toEpochSecond - lStart)|s)

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 15. Okt 2023 16:17
von nw378
Leider nein, hatte ich bereits probiert. Ist ein "mismatch".
Genauso wie

Code: Alles auswählen

var Sonnen_delta = new QuantityType<?>((now.toEpochSecond - lStart).toString +" s")
Das scheint aber am Datentyp zu liegen, mit Energy klappt's nämlich (macht hier keinen Sinn, nur zu Versuchszwecken):

Code: Alles auswählen

var Sonnen_delta = new QuantityType<Energy>((now.toEpochSecond - lStart).toString +" kWh")
Ist jetzt aber halb so wild, ich bleibe zunächst bei der double-Lösung. Vllt. kommt ja bei OH 4.2 o.ä. mal ein QuantityType<Time> dazu.

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 15. Okt 2023 17:56
von TomW80
Hey,

Danke für Eure Antworten.
Bin leider noch nicht dazu gekommen das zu testen.
Meld mich sobald ich es testen konnte.

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 16. Okt 2023 00:46
von udo1toni
Der Witz ist, es gibt ja die Einheit, es scheint nur, dass es an dieser Stelle etwas hakt. IC hhabe bei mir aber auch schon festgestellt, dass z.B. y als Größe auch nicht richtig funktioniert.
Eventuell müsste man mal im englischen Forum nachfragen...

Re: Betriebsstundenzähler auf Number:Time umstellen

Verfasst: 30. Okt 2023 23:23
von TomW80
Hallo zusammen,

ich bin jetzt auch mal dazugekommen das einzubauen. Funktioniert soweit. Danke.
Wenn ich mal etwas Zeit habe werde ich vielleicht mal im englischen Forum nachfragen.