Seite 1 von 2
Arbeitszeit ermitteln
Verfasst: 21. Apr 2021 17:12
von Sadi191
Hallo Zusammen,
ich nutze Openhab 3 und moechte gern eine Übersicht meiner Arbeitszeit schaffen.
Dafuer dachte ich an die Onlinezeiten meines Laptops.
Diese greife ich schon ueber das Network Binding und PingDevice ab. Funktioniert super, sodass ich auch eine Telegramm Nachricht bekommen, wenn der Laptop online, bzw. offline geht.
Allerdings fehlt mir nun die passende Idee, wie ich ermitteln kann, dass der Laptop zum Beispiel 40h in der letzten Woche online (=Arbeitszeit) war.
Hat jemand von euch eine Idee?
Ich danke Euch schonmal im Vorraus.
Re: Arbeitszeit ermitteln
Verfasst: 21. Apr 2021 21:20
von udo1toni
Ein direkter Weg wäre mir nicht bekannt, Du kannst aber einfach jedesmal, wenn sich der Zustand auf Online ändert, in einer Variablen einen Zeitstempel speichern und wenn sich der Zustand auf Offline ändert, vom aktuellen Zeitstempel den gespeicherten Zeitstempel abziehen, womit Du dann die Anzahl Sekunden im Online-Status erhältst (bzw. Millisekunden, aber das kann man ja durch 1000 teilen).
Diesen Wert speicherst Du mittels Persistence in einer Datenbank, z.B. in einem Item OnlineSekunden. Es ist wichtig, dass der Wert nur einmalig geschrieben wird, und nur in dem Moment, wo der Rechner Offline geht.
Anschließend kannst Du z.B. Samstags über den Aufruf OnlineSekunden.sumSince(now.minusDays(6).atStartOfDay) den aufsummierten Wert seit Montag abfragen.
Re: Arbeitszeit ermitteln
Verfasst: 22. Apr 2021 19:20
von Sadi191
klingt super. Kannst du mir Starthilfe geben?
"in einer Variablen einen Zeitstempel speichern" ... Wie koennte diese aussehen?
Re: Arbeitszeit ermitteln
Verfasst: 23. Apr 2021 21:25
von udo1toni
in einer *.rules Datei:
Code: Alles auswählen
// globale Variablen werden vor der ersten Rule definiert
var Long lStart = null
rule "eine rule"
when
Item irgendeinItem received command
then
var Number nDauer = null
if(receivedCommand == ON)
lStart = now.millis
else {
nDauer = ((now.millis - lStart)/1000).intValue
irgendeinItemDauer.postUpdate(nDauer)
}
end
Re: Arbeitszeit ermitteln
Verfasst: 25. Apr 2021 16:31
von Sadi191
Danke udo1toni,
leider bin ich noch nicht ganz so fit.
Koenntest du mir die rule fuer mein Item anpassen?
Ich habe folgendes Item fuer "Online gehen"
Code: Alles auswählen
val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxxxxxx")
rule "PC_Online"
when
Item Online changed from OFF to ON
then
telegramAction.sendTelegram("online")
end
Und "Offline gehen"
Code: Alles auswählen
val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxxxxxx")
rule "PC_Offline"
when
Item Online changed from ON to OFF
then
telegramAction.sendTelegram("offline")
end
Re: Arbeitszeit ermitteln
Verfasst: 26. Apr 2021 23:16
von udo1toni
Dann so:
Code: Alles auswählen
// globale Variablen werden vor der ersten Rule definiert
var Long lStart = null
rule "eine rule"
when
Item Item Online changed
then
var Number nDauer = null
if(Online.state == ON)
lStart = now.millis
else {
nDauer = ((now.millis - lStart)/1000).intValue
OnlineDauer.postUpdate(nDauer)
}
end
Natürlich musst Du noch das Number Item OnlineDauer anlegen. Es enthält nach dem Wechsel nach OFF die Anzahl Sekunden vom letzten Wechsel nach ON bis zum Wechsel nach OFF.
Re: Arbeitszeit ermitteln
Verfasst: 1. Mai 2021 15:28
von Sadi191
Hallo udo1toni,
auf die Gefahr hin, dass ich dich total langweile ...
Welchen Channel muss ich denn bei dem neu angelegten Item "OnlineDauer" angeben?
Aktuell habe ich folgendes:
Code: Alles auswählen
//PC online
Switch Online "PC online" <Network> { channel="network:pingdevice:bf430e50a0:online" }
Number OnlineDauer "Onlinezeit" <Network> ???
Re: Arbeitszeit ermitteln
Verfasst: 1. Mai 2021 23:41
von udo1toni
Na auf gar keinen Channel, schließlich wird der Wert ja über die Rule gesetzt. Das ist ein ungebundenes Item.
Re: Arbeitszeit ermitteln
Verfasst: 3. Mai 2021 16:07
von Sadi191
Hallo udo1toni,
irgendwo ist noch der Wurm drin. Darf ich dich noch einmal um deinen Rat bitten.
Hab jetzt noch einmal neugebaut.
ITEMS:
Code: Alles auswählen
//IPhone Onlinezeit
Switch IPhonePower "IphonePower" <Network> { channel="network:pingdevice:bf430e50a1:online" }
Number IPhoneDauer "Onlinezeit" <Network>
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.millis
else {
nDauer = ((now.millis - lStart)/1000).intValue
IPhoneDauer.postUpdate(nDauer)
}
end
Openhab Client:
Onlinezeit.jpg
Logging:
Onlinezeit2.jpg
Re: Arbeitszeit ermitteln
Verfasst: 4. Mai 2021 06:13
von udo1toni
Oh. Ja, unter OH3 gibt es kein Joda Time mehr, stattdessen ist JavaTime angesagt.
Probiere bitte mal, ob das Ersetzen von now.millis() durch now.get(ChronoField.MILLI_OF_SECOND) funktioniert. Der Ausdruck kommt zweimal im Code vor.