Seite 1 von 1

Stunde des Jahres für weitere Berechnungen

Verfasst: 10. Apr 2020 11:35
von KellerK1nd
Hallihallo und frohe Oster euch,

Momentan hat man ja wieder ein wenig Zeit zum basteln. Ich würde gerne aus der aktuellen Zeit die laufenden Stunden des Jahres errechnen um den Stromverbrauch pro Stunde fortlaufend weiter berechnen zu können. Nur leider stecke ich da gerade fest. Aktuelle berechne ich das über einen Tag-Zähler der jeden Tag um 0:00 +1 gesetzt wird. Das würde ich gern auf das NTP Binding anwenden, weiß nur nicht wie ich aus der aktuellen Zeit beim Binding auf die Stunde umrechnen kann.

ITEMS:

Code: Alles auswählen

//Items aus dem NTP-Binding
DateTime    Datum           "Datum [%1$tA, %1$td.%1$tm.%1$tY]"  <calendar>  {channel="ntp:ntp:local:dateTime"}
DateTime    Zeit            "Zeit [%1$tH:%1$tM]"                <time>      {channel="ntp:ntp:local:dateTime"}
String      Datum_String    "Datum [%1$tA, %1$td.%1$tm.%1$tY]"  <calendar>  {channel="ntp:ntp:local:string"}
String      Zeit_String     "Zeit [%1$tH:%1$tM]"                <time>      {channel="ntp:ntp:local:string"}
//Jahrestag
Number  Tag_Zaehler                             "Tag des Jahres [%s]"           <calendar>          

Code: Alles auswählen

rule "Tag des Jahres hochzählen"
when
    Time cron "0 1 0 1/1 * ? *"
then
    Tag_Zaehler.sendCommand((Tag_Zaehler.state as Number) +1)
end

rule "Tag des Jahres am 1.1. zurücksetzen"
when
    Time cron "0 2 0 1 1 ? *"
then
    Tag_Zaehler.sendCommand(1)
end
Das klappt soweit auch. Jetzt würde ich aber gern den durschnittlichen Stromverbrauch pro Stunde unseren Haushalts berechnen, was wesentlich genauer als pro Tag ist, leider weiß ich nicht wie ich mir jetzt die Stunden des Jahres als Item speichern kann. Mein erster Ansatz:

Items:

Code: Alles auswählen

Number      Millisekunden   "Millisekunden %s"                              
Number      Sekunden        "Sekunden %s"                                   
Number      Minuten         "Minuten %s"                                    
Number      Stunden         "Stunden %s"                                    
Number      Tag_Zeit        "Tag %s"                                        
und Rule im Versuch:

Code: Alles auswählen

rule "aktuelle Zeit in verschiedene Werte"
when
    Item Zeit changed
then
    val calendar = java.util.Calendar::getInstance
    calendar.timeInMillis = now.millis
    Millisekunden.postUpdate(now.millis)
    Sekunden.postUpdate((Millisekunden.state as Number) /1000)
    Minuten.postUpdate((Sekunden.state as Number) /60)
    Stunden.postUpdate((Minuten.state as Number) /60)
    Tag_Zeit.postUpdate((Stunden.state as Number) /24)
end

Aber etwas stimmt an der Berechnung nicht, bzw. ist mein Ausgangspunkt falsch, jetzt muss es doch eine Möglichkeit geben. Vielleicht könnt ihr mir helfen.

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 10. Apr 2020 21:47
von violine21
Hallo,

so auf die Schnelle würde ich das in etwa so berechnen:

Code: Alles auswählen

fortlaufende Stunde = (now.toString("D") * 24) + now.toString("H")
fortlaufende Stunde des Jahres = (fortlaufender Tag des Jahres * 24 Std.) + aktuelle Stunde des Tages

So, habs mal getestet:

Code: Alles auswählen

logInfo("Zeitformat", "Stunde des Jahres: " + ((now.getDayOfYear() * 24) + now.getHourOfDay()))

Code: Alles auswählen

2020-04-10 21:59:15.006 [INFO ] [se.smarthome.model.script.Zeitformat] - Stunde des Jahres: 2445
leider weiß ich nicht wie ich mir jetzt die Stunden des Jahres als Item speichern kann.

Code: Alles auswählen

Number   Stunde_Jahr

Stunde_Jahr.postUpdate((now.getDayOfYear() * 24) + now.getHourOfDay())

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 14. Apr 2020 11:31
von KellerK1nd
Das sieht so schon mal nicht schlecht aus, melde mich.

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 14. Apr 2020 19:00
von udo1toni
Allerdings stimmt die Formel nicht ganz, getDayOfYear liefert ein Integer aus dem Wertebereich 1 - 366. Die Formel müsste also

Code: Alles auswählen

Stunde_Jahr.postUpdate(((now.getDayOfYear() - 1) * 24) + now.getHourOfDay())
lauten.

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 15. Apr 2020 19:30
von violine21
udo1toni hat geschrieben: 14. Apr 2020 19:00 Allerdings stimmt die Formel nicht ganz, getDayOfYear liefert ein Integer aus dem Wertebereich 1 - 366. Die Formel müsste also

Code: Alles auswählen

Stunde_Jahr.postUpdate(((now.getDayOfYear() - 1) * 24) + now.getHourOfDay())
lauten.
Hat das mit dem Schaltjahr zu tun?
So, habs mal getestet:
logInfo("Zeitformat", "Stunde des Jahres: " + ((now.getDayOfYear() * 24) + now.getHourOfDay()))
2020-04-10 21:59:15.006 [INFO ] [se.smarthome.model.script.Zeitformat] - Stunde des Jahres: 2445
Ich hatte das natürlich interessenhalber nachgerechnet und das Ergebnis stimmte auch ohne "-1".
2020-04-10 21:59
Januar 31Tage + Februar 29Tage + März 31Tage + 10Tage = 101Tage * 24h = 2424h + 21h = 2445h :?:

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 16. Apr 2020 00:33
von udo1toni
Tja, aber Du rechnest ja auch falsch. Am 10 April sind erst 9 Tage des April vollständig vergangen, der 10. Tag ist erst angebrochen.

31 Tage Januar + 29 Tage Februar + 31 Tage März = 91 Tage
+ am 10. April 9 vollständige Tage -> 100 Tage = 2400 Stunden.
plus 21 Sunden = 2421 Stunden...

Re: Stunde des Jahres für weitere Berechnungen

Verfasst: 16. Apr 2020 20:04
von violine21
Udo, ich hab mir gerade ordentlich vor den Kopf geklatscht :oops:
Ich wäre nicht im Traum darauf gekommen, das der 10. ja noch nicht vorbei ist.
Manchmal ist das Brett vorm Kopf ganz schön dick.