Betriebsstunden erfassen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Betriebsstunden erfassen

Beitrag von KellerK1nd »

So jetzt habe ich ein Problem bei dem ich nicht weiterkomme, aufgrund meiner noch mangelnder Erfahrung mit dem Errechnen diverser Werte.

Meine Items:

Code: Alles auswählen

//RX-A2050
Number  Yamaha_RXA2050_BetriebsstundenZaehler   "Betriebsstunden [%d]"                  <receiver>          
String  Yamaha_RXA2050_Betriebsstunden          "Betriebsstunden RX-A2050 [%s Stunden]" <receiver>          
Mit dieser Regel erfasse ich als Counter die "Betriebszeit" meines Yamaha Receivers:

Code: Alles auswählen

rule "RX-A2050 Bertriebsstunden"
when
    Time cron "0/1 * * * * ?"
then
    if(Yamaha_RXA2050_Power.state == ON){
        var Number Zaehler_RX_A2050 = Yamaha_RXA2050_BetriebsstundenZaehler.state as DecimalType
        Zaehler_RX_A2050=Zaehler_RX_A2050+1
        Yamaha_RXA2050_BetriebsstundenZaehler.postUpdate(Zaehler_RX_A2050)
    }
end
Jede Sekunde wird der Counter für die Betriebszeit um eins erhöht. Das funktioniert auch. Mittels folgender Regel, errechne ich mir die Sekunden in Stunden, Minuten und Sekunden um:

Code: Alles auswählen

rule "Aktualisiere_Betriebsstunden_Anzeige"
when
    Item Yamaha_RXA2050_BetriebsstundenZaehler changed
then
    var String h
    var Number H
    var String m
    var Number M
    var String s
    var Number S
    
    /*berechne Stunden */
    S = Yamaha_RXA2050_BetriebsstundenZaehler.state as Number                           //Erfassen der gezählten Ticks als Nummer
    H = (S/3600).intValue                                                               //Errechnen der Gesamtstunden
    h = H.toString
    S = S-H*3600                                                                        //Errechne die Sekunden

    /* berechne Minuten */
    M = (S/60).intValue                                                                 //Errechne die Minuten
    if (M <=9) m = "0" + M.toString                                                     //Wenn Minuten <=9, dann füge "0" zum String hinzu
    else m = M.toString                                                                 //Direkte Ausgabe zum String für Minuten

    /* berechne sekunden */
    S = S-M*60                                                                          //Errechne Sekunden
    if (S <=9) s = "0" + S.toString                                                     //Wenn Sekunden <=9, dann füger "0" zum String hinzu
    else s = S.toString                                                                 //Direkte Ausgabe zum String für Sekunden


    Yamaha_RXA2050_Betriebsstunden.postUpdate(h+":"+m+":"+s)
end
Jetzt bekomm ich aber mittlerweile eine Stundenanzeige >16000 und das finde ich optisch nicht ansprechend, daher würde ich gern die Stunden auf 24h Anzeige Umbauen und als Zusatzinformation Tage anzeigen. Quasi: 66 Tage 5:25:39 Stunden, als Beispiel.
Könnt ihr mir dabei helfen? Die Umrechnung auf Tage ist ja kein Problem.

Code: Alles auswählen

...
    var String d
    var Number D
    D = ((Yamaha_RXA2050_BetriebsstundenZaehler.state as Number)/86400).intValue        //Errechnen der Ticks(Sekunden) in Tage
    d = D.toString                                                                      //Direkte Ausgabe zum String für Tage
...
    Yamaha_RXA2050_Betriebsstunden.postUpdate(d+" Tage "+h+":"+m+":"+s)
Mit diesen Zeilen würde ich den Code ergänzen, die Tage werden auch angezeigt, nur wie bekomme ich die Stundenanzeige umgebaut, das max. 23 Stunden angezeigt werden und bei >=23 Stunden die Stundenanzeige wieder auf 0 springt?

Eventuell kennt ihr auch einen einfacheren Code und ich mach es nur unnötig kompliziert.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Betriebsstunden erfassen

Beitrag von Tokamak »

Es gibt zwei Operatoren, / zum Teilen und % für den Rest nach Zeilung. Sie werden häufig auch div und mod genannt.

Vielleicht hilft dir der Code als Basis

Code: Alles auswählen

    val int inputSekunden=(Yamaha_RXA2050_BetriebsstundenZaehler.state as Number).intValue()
    val int tage=inputSekunden / (60*60*24)
    var int restSekunden=inputSekunden % (60*60*24)
    val int stunden=restSekunden / (60*60)
    restSekunden=restSekunden % (60*60)
    val int minuten=restSekunden / 60
    val int sekunden=restSekunden % 60
    logInfo("Test",tage+" Tage, "+stunden+" Stunden, "+minuten+" Minuten, "+sekunden+" Sekunden")
Grundsätzlich würde ich dir davon abraten, eine Rule jede Sekunde feuern zu lassen. Zum einen kann man das mit einem Timer besser lösen, der mit dem Verärker gestartet und gestoppt wird.
Zum anderen denke darüber nach, ob die Genauigkeit von Sekunden wirklich benötigt wird.
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

Antworten