Seite 2 von 2

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 18:24
von Sadi191
Habe nun folgende Rule:

Code: Alles auswählen

// globale Variablen werden vor der ersten Rule definiert
var Long lStart = null

rule "IPhoneOnlineZeit"
when
    Item IPhonePower changed
then
    var Number nDauer = null

    if(IPhonePower.state == ON)
        lStart = now.get(ChronoField.MILLI_OF_SECOND)
    else {
        nDauer = ((now.get(ChronoField.MILLI_OF_SECOND) - lStart)/1000).intValue
        IPhoneDauer.postUpdate(nDauer)
    }
end
und bekomme im Logging folgende Meldung:

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 18:37
von udo1toni
Dann versuch mal “now.toInstant().toEpochMilli() statt now.millis

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 18:56
von Sadi191
Klasse, es hat funktioniert.
Nun bekomm ich nach jeder Onlinezeit die Sekunden angezeigt:
OnlineZeit.jpg
Kann man es jetzt noch so einrichten, dass es nicht immer ueberschrieben wird, wenn sich der Status von OFF auf ON aendert?

Was stelle ich mir vor?
Es waere toll, wenn ich z.B. an einem Samstag sehe, wieviel Minuten ich in der Woche (Mo-Fr) online war.

Realistisch?

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 19:06
von udo1toni
Du kannst (das hatte ich, glaube ich, oben geschrieben) das Number Item persistieren. Das darf nur bei einem Update passieren, und der Wert des Items muss zwingend immer von 0 beginnen (das macht die Rule aber schon). Als Persistence Service solltest Du etwas verwenden, was nicht verlustbehaftet ist, beispielsweise MySQL. openHAB legt dann automatisch bei jedem ON->OFF Wechsel einen Datensatz an. Aus einer Rule kann man dann die Summe seit einem bestimmten Zeitpunkt auslesen. So eine Rule könnte alle paar Minuten angestoßen werden und dann die Summe seit letztem Montag, 7 Uhr ausgeben (gerne auch plus die aktuelle Laufzeit, falls das Gerät gerade ON ist).

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 19:16
von Sadi191
Vielen Dank fuer deine Unterstuetzung, aber ich glaub jetzt wird es zu komplex fuer mich.
Dachte nicht, dass es so kompliziert ist. :shock:
Ich danke dir trotzdem vielmals.

Re: Arbeitszeit ermitteln

Verfasst: 5. Mai 2021 22:23
von udo1toni
Na, wieso komplex? Falls Du kein MySQL nutzen willst, kannst Du natürlich auch auf andere Persistence Services ausweichen. rrd4j ist schon eingebaut, es wird halt nur nicht richtig funktionieren, weil rrd4j die Messwerte mittelt, womit dann sumSince als Funktion nur für kurze Zeiträume funktioniert. Ich fürchte, eine Woche wird da nicht zuverlässig funktionieren (wobei... Versuch macht kluch, oder so).

Was Du natürlich auch machen kannst, ist, den Wert "manuell" aufzusummieren, das wäre dann eine Rule, die Montag z.B. um 6 Uhr das Zähler-Item auf 0 setzt, anschließend wird bei jedem Ausschalten die aktuelle Einschaltdauer zum aktuellen Stand addiert. Dann musst Du nur mit mapDB persistieren, damit das Zähler-Item bei einem Neustart seinen Wert behält (wobei der Neustart bei eingeschaltetem Gerät zu vermeiden ist, denn beim Neustart geht die Einschaltzeit verloren, es kann also dann für diesen Einschaltzeitraum keine Dauer angegeben werden). Das sähe so aus:

Code: Alles auswählen

// globale Variablen werden vor der ersten Rule definiert
var Long lStart = null

rule "IPhoneOnlineZeit"
when
    Item IPhonePower changed
then
    var Number nDauer = null

    if(IPhonePower.state == ON)
        lStart = now.toInstant().toEpochMilli()
    else {
        nDauer = ((now.toInstant().toEpochMilli() - lStart)/1000).intValue
        IPhoneDauer.postUpdate(nDauer + if(IPhoneDauer.state instanceof Number) (IPhoneDauer.state as Number) else 0)
    }
end

rule "Reset iPhoneDauer"
when
    Time cron "0 0 6 ? * MON" // Montags um 06:00:00 Uhr
then
    iPhoneDauer.postUpdate(0)
end
Nun wird also die Laufzeit jeweils am Ende aufaddiert und Montags um 6 Uhr wird das Item genullt.

Re: Arbeitszeit ermitteln

Verfasst: 10. Mai 2021 17:54
von Sadi191
Hallo Udo,
heute hat die Rule das erste mal gegriffen.

Ich war mit meinem Rechner von 8 - 17 Uhr online. Zurueckgegeben hat er mir einen Wert von 4036.0.

Um welche Einheit handelt es sich da?

Re: Arbeitszeit ermitteln

Verfasst: 11. Mai 2021 05:36
von udo1toni
Das sind Sekunden. Offensichtlich ist da etwas grundsätzlich schief gegangen (z.B. wurde das Gerät nicht die gesamte Zeit online erkannt).