Seite 1 von 1

Rechnen mit Sinus und Cosinus

Verfasst: 16. Aug 2018 23:24
von SmartHomer
Hallo zusammen,

ich möchte in OH2 mit Trigonometrische Funktionen rechnen. Mein Problem ist jedoch, dass die entsprechende . rules Datei sehr lange läuft bis ich Werte ausgegeben bekomme. Mit lange meine ich ca. 3h.

Ich rufe den Sinus bzw. Cosinus in openhab mit Math::sin bzw. Math::cos auf. Wenn ich in meiner rules. Datei ohne Sinus und Cosinus rechne bekomme ich relativ zügig (1-2 Minuten) die Werte ausgegeben. Hat hier jemand bereits Lösungsansätze, wie das Rechnen mit Sinus und Cosinus schneller durchläuft. Kann es sein, dass der Zugriff auf die Bibliothek für die Sinus und Cosinus Berechnung sehr lange braucht?

Hier habe ich mal zum besseren Verständnis meine .rules Datei

Code: Alles auswählen

//__________________________________
// Import Bereich
//__________________________________

// import java.lang.Math.*

//__________________________________
// Variablen Deklaration
//__________________________________

var Number Prognose_PV_Leistung_0
var Number Prognose_PV_Leistung_1

var Number Cosinus_Thetta_0
var Number Cosinus_Thetta_1

    var Number Sonnendeklination_Grad_0
    var Number Sonnendeklination_Grad_1
    var Number Sonnendeklination_Grad_2
    var Number Sonnendeklination_Grad_3
    var Number Sonnendeklination_Grad_4

    var Number Sonnendeklination_Bogen_0
    var Number Sonnendeklination_Bogen_1
    var Number Sonnendeklination_Bogen_2
    var Number Sonnendeklination_Bogen_3
    var Number Sonnendeklination_Bogen_4

    var Number Zeitgleichung_0
    var Number Zeitgleichung_1
    var Number Zeitgleichung_2
    var Number Zeitgleichung_3
    var Number Zeitgleichung_4

    var Number Stundenwinkel_Grad_0
    var Number Stundenwinkel_Grad_1

    var Number Stundenwinkel_Bogen_0
    var Number Stundenwinkel_Bogen_1

    var Number Tageszahl_0
    var Number Tageszahl_1
    var Number Tageszahl_2
    var Number Tageszahl_3
    var Number Tageszahl_4

    var Number Hour_0
    var Number Hour_1
    var Number Hour_2
    var Number Hour_3
    var Number Hour_4
    var Number Hour_5
    var Number Hour_6
    var Number Hour_7


val int Strahlungsintensitaet_Sonne = 1050
val int Gesamtflaeche_PV_Anlage = 40
val double Wirkungsgrad_PV_Module = 0.15

val double Breitengrad_Grad = 48.80
var double Breitengrad_Bogen
val double Azimutabweichung_Grad = 45.00
var double Azimutabweichung_Bogen
val double Aufstellwinkel_PV_Module_Grad = 30.00
var double Aufstellwinkel_PV_Module_Bogen

var double Latitude = 48.801619
var double Longitude = 9.677863

//__________________________________
// Rules Deklaration
//__________________________________

rule "Testberechnung"
when
     Time cron "0 0/1 * * * ?"
then
    
    Breitengrad_Bogen = (Breitengrad_Grad/180)*Math::PI
    logInfo("pvcalc", "Breitengrad_Bogen: {} rad",Breitengrad_Bogen)

    Azimutabweichung_Bogen = (Azimutabweichung_Grad/180)*Math::PI
    logInfo("pvcalc", "Azimutabweichung_Bogen: {} rad",Azimutabweichung_Bogen)

    Aufstellwinkel_PV_Module_Bogen = (Aufstellwinkel_PV_Module_Grad/180)*Math::PI
    logInfo("pvcalc", "Aufstellwinkel_PV_Module_Bogen: {} rad",Aufstellwinkel_PV_Module_Bogen)

    Tageszahl_0 = now.getDayOfYear
    Tageszahl_1 = now.getDayOfYear + 1
    Tageszahl_2 = now.getDayOfYear + 2
    Tageszahl_3 = now.getDayOfYear + 3
    Tageszahl_4 = now.getDayOfYear + 4

    logInfo("pvcalc", "Tageszahl_0: {} ",Tageszahl_0)
    logInfo("pvcalc", "Tageszahl_1: {} ",Tageszahl_1)
    logInfo("pvcalc", "Tageszahl_2: {} ",Tageszahl_2)
    logInfo("pvcalc", "Tageszahl_3: {} ",Tageszahl_3)
    logInfo("pvcalc", "Tageszahl_4: {} ",Tageszahl_4)

    Hour_0 = ((((UnixTime_Clouds_0.state as Number).intValue) % 86400)/3600).intValue
    Hour_1 = ((((UnixTime_Clouds_1.state as Number).intValue) % 86400)/3600).intValue // genauer ==> now.getHourOfDay + 1
    Hour_2 = ((((UnixTime_Clouds_2.state as Number).intValue) % 86400)/3600).intValue
    Hour_3 = ((((UnixTime_Clouds_3.state as Number).intValue) % 86400)/3600).intValue 
    Hour_4 = ((((UnixTime_Clouds_4.state as Number).intValue) % 86400)/3600).intValue
    Hour_5 = ((((UnixTime_Clouds_5.state as Number).intValue) % 86400)/3600).intValue
    Hour_6 = ((((UnixTime_Clouds_6.state as Number).intValue) % 86400)/3600).intValue
    Hour_7 = ((((UnixTime_Clouds_7.state as Number).intValue) % 86400)/3600).intValue
    logInfo("pvcalc", "Hour_0: {} Uhr",Hour_0)
    logInfo("pvcalc", "Hour_1: {} Uhr",Hour_1)
    logInfo("pvcalc", "Hour_2: {} Uhr",Hour_2)
    logInfo("pvcalc", "Hour_3: {} Uhr",Hour_3)
    logInfo("pvcalc", "Hour_4: {} Uhr",Hour_4)
    logInfo("pvcalc", "Hour_5: {} Uhr",Hour_5)
    logInfo("pvcalc", "Hour_6: {} Uhr",Hour_6)
    logInfo("pvcalc", "Hour_7: {} Uhr",Hour_7)

    Sonnendeklination_Grad_0 = 23.45*Math::sin(((((284+Tageszahl_0)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_1 = 23.45*Math::sin(((((284+Tageszahl_1)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_2 = 23.45*Math::sin(((((284+Tageszahl_2)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_3 = 23.45*Math::sin(((((284+Tageszahl_3)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_4 = 23.45*Math::sin(((((284+Tageszahl_4)*360)/365).doubleValue)*((Math::PI/180).doubleValue)) 
    logInfo("pvcalc", "Sonnendeklination_Grad_0: {} °",Sonnendeklination_Grad_0)
    logInfo("pvcalc", "Sonnendeklination_Grad_1: {} °",Sonnendeklination_Grad_1)
    logInfo("pvcalc", "Sonnendeklination_Grad_2: {} °",Sonnendeklination_Grad_2)
    logInfo("pvcalc", "Sonnendeklination_Grad_3: {} °",Sonnendeklination_Grad_3)
    logInfo("pvcalc", "Sonnendeklination_Grad_4: {} °",Sonnendeklination_Grad_4)

    Sonnendeklination_Bogen_0 = (Sonnendeklination_Grad_0/180)*Math::PI  
    Sonnendeklination_Bogen_1 = (Sonnendeklination_Grad_1/180)*Math::PI  
    Sonnendeklination_Bogen_2 = (Sonnendeklination_Grad_2/180)*Math::PI  
    Sonnendeklination_Bogen_3 = (Sonnendeklination_Grad_3/180)*Math::PI  
    Sonnendeklination_Bogen_4 = (Sonnendeklination_Grad_4/180)*Math::PI  
    logInfo("pvcalc", "Sonnendeklination_Bogen_0: {} rad",Sonnendeklination_Bogen_0)
    logInfo("pvcalc", "Sonnendeklination_Bogen_1: {} rad",Sonnendeklination_Bogen_1)
    logInfo("pvcalc", "Sonnendeklination_Bogen_2: {} rad",Sonnendeklination_Bogen_2)
    logInfo("pvcalc", "Sonnendeklination_Bogen_3: {} rad",Sonnendeklination_Bogen_3)
    logInfo("pvcalc", "Sonnendeklination_Bogen_4: {} rad",Sonnendeklination_Bogen_4)


    var Number Zwischenergebnis_Zeitgleichung_0_Argument_1 = ((0.0337*Tageszahl_0+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_0_Argument_2 = ((0.01787*Tageszahl_0-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_1 = ((0.0337*Tageszahl_1+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_2 = ((0.01787*Tageszahl_1-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_1 = ((0.0337*Tageszahl_2+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_2 = ((0.01787*Tageszahl_2-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_1 = ((0.0337*Tageszahl_3+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_2 = ((0.01787*Tageszahl_3-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_1 = ((0.0337*Tageszahl_4+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_2 = ((0.01787*Tageszahl_4-0.168).doubleValue)

    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_0_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_0_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_0_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_0_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_1_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_1_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_1_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_1_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_2_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_2_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_2_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_2_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_3_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_3_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_3_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_3_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_4_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_4_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_4_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_4_Argument_2)

    Zeitgleichung_0 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_0_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_0_Argument_2))
    Zeitgleichung_1 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_1_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_1_Argument_2))
    Zeitgleichung_2 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_2_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_2_Argument_2))
    Zeitgleichung_3 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_3_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_3_Argument_2))
    Zeitgleichung_4 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_4_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_4_Argument_2))

    logInfo("pvcalc", "Zeitgleichung_0: {} ???",Zeitgleichung_0)
    logInfo("pvcalc", "Zeitgleichung_1: {} ???",Zeitgleichung_1)
    logInfo("pvcalc", "Zeitgleichung_2: {} ???",Zeitgleichung_2)
    logInfo("pvcalc", "Zeitgleichung_3: {} ???",Zeitgleichung_3)
    logInfo("pvcalc", "Zeitgleichung_4: {} ???",Zeitgleichung_4)


    Stundenwinkel_Grad_0 = 15.0 * (Hour_0.doubleValue - (15.0-Longitude)/15.0 - 12.0 + Zeitgleichung_0/60.0)
    logInfo("pvcalc", "Stundenwinkel_Grad_0: {} °",Stundenwinkel_Grad_0)
    Stundenwinkel_Grad_1 = 15.0 * (Hour_1.doubleValue - (15.0-Longitude)/15.0 - 12.0 + Zeitgleichung_0/60.0)
    logInfo("pvcalc", "Stundenwinkel_Grad_1: {} °",Stundenwinkel_Grad_1)

    Stundenwinkel_Bogen_0 = (Stundenwinkel_Grad_0/180)*Math::PI
    logInfo("pvcalc", "Stundenwinkel_Bogen_0: {} rad",Stundenwinkel_Bogen_0)
    Stundenwinkel_Bogen_1 = (Stundenwinkel_Grad_1/180)*Math::PI
    logInfo("pvcalc", "Stundenwinkel_Bogen_1: {} rad",Stundenwinkel_Bogen_1)

    Cosinus_Thetta_0 = (Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)-(Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Stundenwinkel_Bogen_0.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen)*Math::cos(Stundenwinkel_Bogen_0.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::sin(Azimutabweichung_Bogen)*Math::sin(Stundenwinkel_Bogen_0.doubleValue)))
    logInfo("pvcalc", "Cosinus_Thetta_0: {} rad",Cosinus_Thetta_0)
    Cosinus_Thetta_1 = (Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)-(Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Stundenwinkel_Bogen_1.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen)*Math::cos(Stundenwinkel_Bogen_1.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::sin(Azimutabweichung_Bogen)*Math::sin(Stundenwinkel_Bogen_1.doubleValue)))
    logInfo("pvcalc", "Cosinus_Thetta_1: {} rad",Cosinus_Thetta_1)

    if (Cosinus_Thetta_0 < 0) {
        Prognose_PV_Leistung_0 = 0
    }
    else { Prognose_PV_Leistung_0 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_0.doubleValue*(1-((Number_Clouds_0.state as DecimalType).doubleValue)/100)
    }
    logInfo("pvcalc", "Prognose_PV_Leistung_0: {} W",Prognose_PV_Leistung_0)
    logInfo("pvcalc", "Strahlungsintensitaet_Sonne: {} W/m²",Strahlungsintensitaet_Sonne)
    logInfo("pvcalc", "Gesamtflaeche_PV_Anlage: {} m²",Gesamtflaeche_PV_Anlage)
    logInfo("pvcalc", "Wirkungsgrad_PV_Module: {} ",Wirkungsgrad_PV_Module)
    logInfo("pvcalc", "Number_Clouds_0: {} ",Number_Clouds_0)
    if (Cosinus_Thetta_1 < 0) {
        Prognose_PV_Leistung_1 = 0
    }
    else { Prognose_PV_Leistung_1 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_1.doubleValue*(1-((Number_Clouds_1.state as DecimalType).doubleValue)/100)
    }
    logInfo("pvcalc", "Prognose_PV_Leistung_1: {} W",Prognose_PV_Leistung_1)
    logInfo("pvcalc", "Number_Clouds_1: {} ",Number_Clouds_1)

end

Re: Rechnen mit Sinus und Cosinus

Verfasst: 17. Aug 2018 14:17
von hr3
Da es dazu ganz viel anzumerken gibt, möchte ich mich auf das wesentliche beschränken.

Die Rule scheint ganz schön mächtig zu sein. Aber nicht so, dass openHAb damit nicht zurecht kommt.
Wäre schon hilfreich zu wissen, was du einsetzt. Ich habe 2.3.0 auf einem Raspi3 für den Test verwendet.
Wenn schon, dann würde ich sie so aufbauen, dass die Dinge die einmalig/einmal am Tag passieren müssen, auch nur einmalig/einmal am Tag laufen, usw..
Verwende die optimalen Datei-Typen, damit nicht unnötig konvertiert werden muß.
Zerlege die Formeln so, dass Teil-Berechnungen die mehrfach vorkommen nur einmal passieren.
Deaktiviere die logInfo-Ausgabe sobald du sie nicht mehr benötigst.

Nun zum Entscheidenden:
Ich hab die Rule für den Test nur einmal laufen lassen. (wenn sie bei dir stündlich gestartet wird und dann Stunden läuft, wird sie parallel diverse male ausgeführt, was die performance nicht gerade verbessert).
Deine Version bringt diesen Fehler:

Code: Alles auswählen

2018-08-17 12:46:13.889 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_4_Argument_1: 8.3171 
2018-08-17 12:46:13.895 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Testberechnung': An error occurred during the script execution: null
Nach dieser ersten Änderung

Code: Alles auswählen

/*    var Number Zwischenergebnis_Zeitgleichung_0_Argument_1 = ((0.0337*Tageszahl_0+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_0_Argument_2 = ((0.01787*Tageszahl_0-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_1 = ((0.0337*Tageszahl_1+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_2 = ((0.01787*Tageszahl_1-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_1 = ((0.0337*Tageszahl_2+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_2 = ((0.01787*Tageszahl_2-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_1 = ((0.0337*Tageszahl_3+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_2 = ((0.01787*Tageszahl_3-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_1 = ((0.0337*Tageszahl_4+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_2 = ((0.01787*Tageszahl_4-0.168).doubleValue)*/

    val Zwischenergebnis_Zeitgleichung_0_Argument_1 = ((0.0337*Tageszahl_0+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_0_Argument_2 = ((0.01787*Tageszahl_0-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_1_Argument_1 = ((0.0337*Tageszahl_1+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_1_Argument_2 = ((0.01787*Tageszahl_1-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_2_Argument_1 = ((0.0337*Tageszahl_2+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_2_Argument_2 = ((0.01787*Tageszahl_2-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_3_Argument_1 = ((0.0337*Tageszahl_3+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_3_Argument_2 = ((0.01787*Tageszahl_3-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_4_Argument_1 = ((0.0337*Tageszahl_4+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_4_Argument_2 = ((0.01787*Tageszahl_4-0.168).doubleValue)
läuft alles inerhalb von ca. 700 Millis durch. Immer noch viel, aber eine Basis.

Code: Alles auswählen

2018-08-17 13:57:39.543 [INFO ] [clipse.smarthome.model.script.pvcalc] - Breitengrad_Bogen: 0.8517206749732327 rad
2018-08-17 13:57:39.552 [INFO ] [clipse.smarthome.model.script.pvcalc] - Azimutabweichung_Bogen: 0.7853981633974483 rad
2018-08-17 13:57:39.560 [INFO ] [clipse.smarthome.model.script.pvcalc] - Aufstellwinkel_PV_Module_Bogen: 0.5235987755982988 rad
2018-08-17 13:57:39.580 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_0: 229 
2018-08-17 13:57:39.584 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_1: 230 
2018-08-17 13:57:39.588 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_2: 231 
2018-08-17 13:57:39.593 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_3: 232 
2018-08-17 13:57:39.597 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_4: 233 
2018-08-17 13:57:39.656 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_0: 0 Uhr
2018-08-17 13:57:39.660 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_1: 0 Uhr
2018-08-17 13:57:39.664 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_2: 0 Uhr
2018-08-17 13:57:39.669 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_3: 0 Uhr
2018-08-17 13:57:39.673 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_4: 0 Uhr
2018-08-17 13:57:39.677 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_5: 0 Uhr
2018-08-17 13:57:39.684 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_6: 0 Uhr
2018-08-17 13:57:39.689 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_7: 0 Uhr
2018-08-17 13:57:39.743 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_0: 13.1223682034257 °
2018-08-17 13:57:39.986 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_1: 12.785888283637266 °
2018-08-17 13:57:39.990 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_2: 12.44561962920727 °
2018-08-17 13:57:39.994 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_3: 12.101663069081644 °
2018-08-17 13:57:39.998 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_4: 11.754120525012375 °
2018-08-17 13:57:40.014 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_0: 0.22902854471163576877565 rad
2018-08-17 13:57:40.018 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_1: 0.22315583990057422512903 rad
2018-08-17 13:57:40.022 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_2: 0.21721703598008115223769 rad
2018-08-17 13:57:40.025 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_3: 0.21121386082611602448778 rad
2018-08-17 13:57:40.029 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_4: 0.20514810514649138806131 rad
2018-08-17 13:57:40.057 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_0_Argument_1: 8.1823 
2018-08-17 13:57:40.060 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_0_Argument_2: 3.9242299999999997 
2018-08-17 13:57:40.064 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_1_Argument_1: 8.216000000000001 
2018-08-17 13:57:40.067 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_1_Argument_2: 3.9421 
2018-08-17 13:57:40.070 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_2_Argument_1: 8.2497 
2018-08-17 13:57:40.074 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_2_Argument_2: 3.95997 
2018-08-17 13:57:40.077 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_3_Argument_1: 8.2834 
2018-08-17 13:57:40.081 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_3_Argument_2: 3.9778399999999996 
2018-08-17 13:57:40.085 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_4_Argument_1: 8.3171 
2018-08-17 13:57:40.088 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_4_Argument_2: 3.99571 
2018-08-17 13:57:40.124 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_0: -4.21601773417374 ???
2018-08-17 13:57:40.128 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_1: -4.001159197945616 ???
2018-08-17 13:57:40.132 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_2: -3.777191030436718 ???
2018-08-17 13:57:40.135 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_3: -3.5442891341967666 ???
2018-08-17 13:57:40.140 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_4: -3.3026410398558035 ???
2018-08-17 13:57:40.151 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Grad_0: -186.3761414 °
2018-08-17 13:57:40.165 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Grad_1: -186.3761414 °
2018-08-17 13:57:40.171 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Bogen_0: -3.25287732157383077333693 rad
2018-08-17 13:57:40.179 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Bogen_1: -3.25287732157383077333693 rad
2018-08-17 13:57:40.204 [INFO ] [clipse.smarthome.model.script.pvcalc] - Cosinus_Thetta_0: -0.6762762488867162 rad
2018-08-17 13:57:40.230 [INFO ] [clipse.smarthome.model.script.pvcalc] - Cosinus_Thetta_1: -0.6762762488867162 rad
2018-08-17 13:57:40.235 [INFO ] [clipse.smarthome.model.script.pvcalc] - Prognose_PV_Leistung_0: 0 W
2018-08-17 13:57:40.239 [INFO ] [clipse.smarthome.model.script.pvcalc] - Strahlungsintensitaet_Sonne: 1050 W/m²
2018-08-17 13:57:40.242 [INFO ] [clipse.smarthome.model.script.pvcalc] - Gesamtflaeche_PV_Anlage: 40 m²
2018-08-17 13:57:40.245 [INFO ] [clipse.smarthome.model.script.pvcalc] - Wirkungsgrad_PV_Module: 0.15 
2018-08-17 13:57:40.249 [INFO ] [clipse.smarthome.model.script.pvcalc] - Number_Clouds_0: Number_Clouds_0 (Type=NumberItem, State=1, Label=null, Category=null) 
2018-08-17 13:57:40.254 [INFO ] [clipse.smarthome.model.script.pvcalc] - Prognose_PV_Leistung_1: 0 W
2018-08-17 13:57:40.258 [INFO ] [clipse.smarthome.model.script.pvcalc] - Number_Clouds_1: Number_Clouds_1 (Type=NumberItem, State=1, Label=null, Category=null) 

Re: Rechnen mit Sinus und Cosinus

Verfasst: 17. Aug 2018 14:41
von udo1toni
Welche Hardware verwendest Du? Grundsätzlich muss ich sagen, ja, man kann letztlich alles in openHAB machen, da die Rule Engine Turing-vollständig ist, es ist aber mehr als fraglich, ob das sinnvoll ist.

Ich glaube, ich habe das schon in einem anderen Thread zum gleichen Thema erklärt: Solche Berechnungen gehören nicht in die Rule Engine, so etwas macht man in einem externen Script, welches z.B. in PHP oder einer anderen Sprache Deiner Wahl geschrieben ist und außerhalb openHAB die Berechnung auf Anforderung liefert.
Deine Rule triggert einmal pro Minute, falls sie tatsächlich nach drei Stunden ein Ergebnis liefert, bedeutet das, dass Dein openHAB keinerlei Rules ausführen kann, denn die Rule wird fünfmal gestartet und danach ist Schicht.

Die Rule läuft bei mir innerhalb ca. 160 Millisekunden durch, openHAB2 läuft bei mir auf einer virtuellen Maschine mit einem Kern und 1GByte Arbeisspeicher (64bit, debian stretch), z.B. ein Raspberry Pi 3 sollte ungefähr in der gleichen Größenordnung liegen, was Leistungsfähigkeit betrifft.

Wobei ich die Stunden und die Bewölkung kurzerhand durch Zahlen ersetzt habe, da ich nicht weiß, wie die entsprechenden Items aussehen, aber das sind ja nun nicht die komplexen Berechnungen...

Code: Alles auswählen

2018-08-17 14:43:00.004 [INFO ] [clipse.smarthome.model.script.pvcalc] - Rule getriggert
2018-08-17 14:43:00.008 [INFO ] [clipse.smarthome.model.script.pvcalc] - Breitengrad_Bogen: 0.8517206749732327 rad
2018-08-17 14:43:00.010 [INFO ] [clipse.smarthome.model.script.pvcalc] - Azimutabweichung_Bogen: 0.7853981633974483 rad
2018-08-17 14:43:00.012 [INFO ] [clipse.smarthome.model.script.pvcalc] - Aufstellwinkel_PV_Module_Bogen: 0.5235987755982988 rad
2018-08-17 14:43:00.017 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_0: 229 
2018-08-17 14:43:00.018 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_1: 230 
2018-08-17 14:43:00.018 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_2: 231 
2018-08-17 14:43:00.019 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_3: 232 
2018-08-17 14:43:00.020 [INFO ] [clipse.smarthome.model.script.pvcalc] - Tageszahl_4: 233 
2018-08-17 14:43:00.022 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_0: 14 Uhr
2018-08-17 14:43:00.023 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_1: 15 Uhr
2018-08-17 14:43:00.023 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_2: 16 Uhr
2018-08-17 14:43:00.024 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_3: 17 Uhr
2018-08-17 14:43:00.025 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_4: 18 Uhr
2018-08-17 14:43:00.025 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_5: 19 Uhr
2018-08-17 14:43:00.026 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_6: 20 Uhr
2018-08-17 14:43:00.026 [INFO ] [clipse.smarthome.model.script.pvcalc] - Hour_7: 21 Uhr
2018-08-17 14:43:00.036 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_0: 13.1223682034257 °
2018-08-17 14:43:00.037 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_1: 12.785888283637266 °
2018-08-17 14:43:00.037 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_2: 12.44561962920727 °
2018-08-17 14:43:00.038 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_3: 12.101663069081644 °
2018-08-17 14:43:00.039 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Grad_4: 11.754120525012375 °
2018-08-17 14:43:00.040 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_0: 0.22902854471163576877565 rad
2018-08-17 14:43:00.041 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_1: 0.22315583990057422512903 rad
2018-08-17 14:43:00.042 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_2: 0.21721703598008115223769 rad
2018-08-17 14:43:00.042 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_3: 0.21121386082611602448778 rad
2018-08-17 14:43:00.043 [INFO ] [clipse.smarthome.model.script.pvcalc] - Sonnendeklination_Bogen_4: 0.20514810514649138806131 rad
2018-08-17 14:43:00.047 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_0_Argument_1: 8.1823 
2018-08-17 14:43:00.048 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_0_Argument_2: 3.9242299999999997 
2018-08-17 14:43:00.048 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_1_Argument_1: 8.216000000000001 
2018-08-17 14:43:00.049 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_1_Argument_2: 3.9421 
2018-08-17 14:43:00.049 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_2_Argument_1: 8.2497 
2018-08-17 14:43:00.050 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_2_Argument_2: 3.95997 
2018-08-17 14:43:00.051 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_3_Argument_1: 8.2834 
2018-08-17 14:43:00.052 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_3_Argument_2: 3.9778399999999996 
2018-08-17 14:43:00.052 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_4_Argument_1: 8.3171 
2018-08-17 14:43:00.053 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zwischenergebnis_Zeitgleichung_4_Argument_2: 3.99571 
2018-08-17 14:43:00.058 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_0: -4.21601773417374 ???
2018-08-17 14:43:00.058 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_1: -4.001159197945616 ???
2018-08-17 14:43:00.059 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_2: -3.777191030436718 ???
2018-08-17 14:43:00.060 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_3: -3.5442891341967666 ???
2018-08-17 14:43:00.060 [INFO ] [clipse.smarthome.model.script.pvcalc] - Zeitgleichung_4: -3.3026410398558035 ???
2018-08-17 14:43:00.062 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Grad_0: 23.623858600000002 °
2018-08-17 14:43:00.064 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Grad_1: 38.6238586 °
2018-08-17 14:43:00.064 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Bogen_0: 0.41231411808623657196238 rad
2018-08-17 14:43:00.065 [INFO ] [clipse.smarthome.model.script.pvcalc] - Stundenwinkel_Bogen_1: 0.67411349541341047666307 rad
2018-08-17 14:43:00.070 [INFO ] [clipse.smarthome.model.script.pvcalc] - Cosinus_Thetta_0: 0.9793947708395601 rad
2018-08-17 14:43:00.074 [INFO ] [clipse.smarthome.model.script.pvcalc] - Cosinus_Thetta_1: 0.94642093152754 rad
2018-08-17 14:43:00.075 [INFO ] [clipse.smarthome.model.script.pvcalc] - Prognose_PV_Leistung_0: 2776.5841753301524 W
2018-08-17 14:43:00.076 [INFO ] [clipse.smarthome.model.script.pvcalc] - Strahlungsintensitaet_Sonne: 1050 W/m²
2018-08-17 14:43:00.077 [INFO ] [clipse.smarthome.model.script.pvcalc] - Gesamtflaeche_PV_Anlage: 40 m²
2018-08-17 14:43:00.077 [INFO ] [clipse.smarthome.model.script.pvcalc] - Wirkungsgrad_PV_Module: 0.15 
2018-08-17 14:43:00.078 [INFO ] [clipse.smarthome.model.script.pvcalc] - Number_Clouds_0: 0.55 
2018-08-17 14:43:00.079 [INFO ] [clipse.smarthome.model.script.pvcalc] - Prognose_PV_Leistung_1: 2683.1033408805756 W
2018-08-17 14:43:00.080 [INFO ] [clipse.smarthome.model.script.pvcalc] - Number_Clouds_1: 0.55 

Re: Rechnen mit Sinus und Cosinus

Verfasst: 17. Aug 2018 14:56
von hr3
Für stündlich würde ich diesen CRON_TAB nehmen: "0 0 * ? * * *"
Auf meinem Win10-PC läuft es innerhalb von 100 Milli-Sekunden

Re: Rechnen mit Sinus und Cosinus

Verfasst: 17. Aug 2018 17:52
von SmartHomer
Zerlege die Formeln so, dass Teil-Berechnungen die mehrfach vorkommen nur einmal passieren.
Ich habe versucht Zwischenergebnisse zu berechnen soweit es geht.
Deaktiviere die logInfo-Ausgabe sobald du sie nicht mehr benötigst.
Nimmt die logInfo so viel Zeit in Anpsruch?
Nach dieser ersten Änderung
was hast du konkret geändert? Einfach die Variablen Deklaration ausgeklammert?
läuft alles inerhalb von ca. 700 Millis durch
Das wäre ein Traum :-)
Deine Rule triggert einmal pro Minute
Ich habe den Trigger auf einmal pro Minute gesetzt, damit ich sehe wie lange die rule benötigt um zu starten. Oder was genau bedeutet bzw. macht der Trigger?

Code: Alles auswählen

Time cron "0 0/1 * * * ?"
Welche Hardware verwendest Du?
Ich verwende einen Raspberry Pi 3 auf diesem habe ich openHABian installiert und openHAB 2.3.0 als Version installiert.
2018-08-17 14:43:00.004 [INFO ] [clipse.smarthome.model.script.pvcalc] - Rule getriggert
Wie kann ich die rule manuel triggern?

Die Stunden und die Bewölkung frage ich über das http Binding über openweathermap ab. Kann es sein das diese Abfrage so lange dauert?

Ich glaube bei mir dauert die Initialisierung sehr lange. Wenn die rule einmal durchgelaufen ist, dann bekomme ich alle Werte minütlich ausgelesen und es läuft. Ich habe auch versucht die Berechnung in mehreren .rules Dateien durchzuführen.

Muss ich irgendwelche Einstellungen vornehmen damit die rule schneller durchläuft?

Re: Rechnen mit Sinus und Cosinus

Verfasst: 18. Aug 2018 01:19
von udo1toni
2018-08-17 14:43:00.004 [INFO ] [clipse.smarthome.model.script.pvcalc] - Rule getriggert
Diese logZeile habe ich ganz zu Beginn der Rule mit eingebaut, um sicher zu sein, einen Zeitstempel zu Beginn der Rule zu bekommen.

Zum Systemstart sind vermutlich etliche Items noch gar nicht gesetzt. Dadurch wird es auch Fehlermeldungen hageln, was wiederum viel Zeit kostet, was dann dazu führt, dass das System länger braucht, um sich komplett zu initialisieren... Die Rule selbst läuft aber nicht langsamer, weil die Werte eingesammelt werden, die Rule arbeitet ausschließlich mit schon vorhandenen Werten.

Eine einfache Maßnahme ist, zu Beginn der Rule zu prüfen, dass alle Items, die Du verwenden willst, auch einen gültigen Wert haben:

Code: Alles auswählen

then
    if(!(UnixTime_Clouds_0.state instanceof Number)) return;
    if(!(Number_Clouds_0.state instanceof Number)) return;
Diese beiden Zeilen zu Beginn der Rule brechen die Ausführung der Rule ab, falls diese beiden Items keinen Zahlenwert beinhalten. Somit kommt es zu keiner Fehlermeldung. Da ich gerade keinen Raspberrry Pi3 zum Testen da habe, weiß ich leider auch nciht, wie lange das System zum Start braucht, aber ich gehe von ca. 15 Minuten aus, bis openHAB2 so weit läuft, dass es vernünftig arbeitet, vorausgesetzt, es passieren keine Dinge, die den Start weiter verzögern. Entsprechend wäre es wichtig, alle Rules danach abzuklopfen, dass keine großartigen Fehler auftreten, wenn items nicht initialisiert sind (siehe die zwei Codezeilen).

Die Rule als solche wäre natürlich wesentlich eleganter, wenn sie nicht solch ein Spaghetticode wäre, gerade wenn mehrere gleichartige Items oder Variablen berechnet werden, bietet es sich an, hier mit Gruppen zu arbeiten.

Du definierst zu Beginn etliche Konstanten (val), dann errechnest Du aber bei jedem Lauf der Rule aus diesen Konstanten andere Fixwerte, das ist natürlich in höchstem Maße ineffizient. Genauso verwendest Du fünfzehn mal die Funktion math::pi, welches ebenfalls eine Konstante ist, übrigens an jeder einzelnen Stelle math::pi/180 (Punktrechnung kann immer umgestellt werden), womit du 15 Berechnungen durchführst, die Du Dir komplett schenken könntest.
Die logInfo()-Zeilen sind sicherlich sinnvoll, um zu prüfen, dass die Rule wie gewünscht arbeitet, zur Laufzeit könnte aber die Masse auf logDebug() geändert werden, damit verlierst Du die Zeilen nicht, sie werden aber nur noch aktiv, wenn Du den Logger für pvcalc auf DEBUG setzt.
Eine logInfo() Zeile zu Beginn und am Ende er Rule verrät Dir schnell, wie lange die Rule wirklich zur Abarbeitung brauchte.

Ach so, da Du auch innerhalb der Cosinus_Thetta Formel unnötig etliche Konstanten berechnest: eventuell wäre es hilfreich, einmalid die Konstanten in einer Rule zu berechnen, die per system started getriggert wird, also gedes mal, wenn die Rules-Datei verändert wird oder openHAB neu startet. Damit könntest Du weiterhin Winkel usw. in Klartext hin schreiben, aer die Berechnungen würden nur noch einmalig ausgeführt, nicht bei jedem Durchlauf erneut.

Re: Rechnen mit Sinus und Cosinus

Verfasst: 18. Aug 2018 15:35
von SmartHomer
Ich verstehe aber nicht, wieso bei mir die gepostete Rule. So lange benötigt bis sie durchläuft.

Code: Alles auswählen

//__________________________________
// Import Bereich
//__________________________________

// import java.lang.Math.*

//__________________________________
// Variablen Deklaration
//__________________________________

var Number Prognose_PV_Leistung_0
var Number Prognose_PV_Leistung_1

var Number Cosinus_Thetta_0
var Number Cosinus_Thetta_1

    var Number Sonnendeklination_Grad_0
    var Number Sonnendeklination_Grad_1
    var Number Sonnendeklination_Grad_2
    var Number Sonnendeklination_Grad_3
    var Number Sonnendeklination_Grad_4

    var Number Sonnendeklination_Bogen_0
    var Number Sonnendeklination_Bogen_1
    var Number Sonnendeklination_Bogen_2
    var Number Sonnendeklination_Bogen_3
    var Number Sonnendeklination_Bogen_4

    var Number Zeitgleichung_0
    var Number Zeitgleichung_1
    var Number Zeitgleichung_2
    var Number Zeitgleichung_3
    var Number Zeitgleichung_4

    var Number Stundenwinkel_Grad_0
    var Number Stundenwinkel_Grad_1

    var Number Stundenwinkel_Bogen_0
    var Number Stundenwinkel_Bogen_1

    var Number Tageszahl_0
    var Number Tageszahl_1
    var Number Tageszahl_2
    var Number Tageszahl_3
    var Number Tageszahl_4

    var Number Hour_0
    var Number Hour_1
    var Number Hour_2
    var Number Hour_3
    var Number Hour_4
    var Number Hour_5
    var Number Hour_6
    var Number Hour_7


val int Strahlungsintensitaet_Sonne = 1050
val int Gesamtflaeche_PV_Anlage = 40
val double Wirkungsgrad_PV_Module = 0.15

val double Breitengrad_Grad = 48.80
var double Breitengrad_Bogen
val double Azimutabweichung_Grad = 45.00
var double Azimutabweichung_Bogen
val double Aufstellwinkel_PV_Module_Grad = 30.00
var double Aufstellwinkel_PV_Module_Bogen

var double Latitude = 48.801619
var double Longitude = 9.677863

//__________________________________
// Rules Deklaration
//__________________________________

rule "Testberechnung"
when
     Time cron "0 0/1 * * * ?"
then
    logInfo("pvcalc", "Rule getriggert")

    Breitengrad_Bogen = (Breitengrad_Grad/180)*Math::PI
    logInfo("pvcalc", "Breitengrad_Bogen: {} rad",Breitengrad_Bogen)

    Azimutabweichung_Bogen = (Azimutabweichung_Grad/180)*Math::PI
    logInfo("pvcalc", "Azimutabweichung_Bogen: {} rad",Azimutabweichung_Bogen)

    Aufstellwinkel_PV_Module_Bogen = (Aufstellwinkel_PV_Module_Grad/180)*Math::PI
    logInfo("pvcalc", "Aufstellwinkel_PV_Module_Bogen: {} rad",Aufstellwinkel_PV_Module_Bogen)

    Tageszahl_0 = now.getDayOfYear
    Tageszahl_1 = now.getDayOfYear + 1
    Tageszahl_2 = now.getDayOfYear + 2
    Tageszahl_3 = now.getDayOfYear + 3
    Tageszahl_4 = now.getDayOfYear + 4

    logInfo("pvcalc", "Tageszahl_0: {} ",Tageszahl_0)
    logInfo("pvcalc", "Tageszahl_1: {} ",Tageszahl_1)
    logInfo("pvcalc", "Tageszahl_2: {} ",Tageszahl_2)
    logInfo("pvcalc", "Tageszahl_3: {} ",Tageszahl_3)
    logInfo("pvcalc", "Tageszahl_4: {} ",Tageszahl_4)

    Hour_0 = 18//((((UnixTime_Clouds_0.state as Number).intValue) % 86400)/3600).intValue
    Hour_1 = 21//((((UnixTime_Clouds_1.state as Number).intValue) % 86400)/3600).intValue // genauer ==> now.getHourOfDay + 1
    Hour_2 = 24//((((UnixTime_Clouds_2.state as Number).intValue) % 86400)/3600).intValue
    Hour_3 = 3//((((UnixTime_Clouds_3.state as Number).intValue) % 86400)/3600).intValue 
    Hour_4 = 6//((((UnixTime_Clouds_4.state as Number).intValue) % 86400)/3600).intValue
    Hour_5 = 9//((((UnixTime_Clouds_5.state as Number).intValue) % 86400)/3600).intValue
    Hour_6 = 12//((((UnixTime_Clouds_6.state as Number).intValue) % 86400)/3600).intValue
    Hour_7 = 15//((((UnixTime_Clouds_7.state as Number).intValue) % 86400)/3600).intValue
    logInfo("pvcalc", "Hour_0: {} Uhr",Hour_0)
    logInfo("pvcalc", "Hour_1: {} Uhr",Hour_1)
    logInfo("pvcalc", "Hour_2: {} Uhr",Hour_2)
    logInfo("pvcalc", "Hour_3: {} Uhr",Hour_3)
    logInfo("pvcalc", "Hour_4: {} Uhr",Hour_4)
    logInfo("pvcalc", "Hour_5: {} Uhr",Hour_5)
    logInfo("pvcalc", "Hour_6: {} Uhr",Hour_6)
    logInfo("pvcalc", "Hour_7: {} Uhr",Hour_7)

    Sonnendeklination_Grad_0 = 23.45*Math::sin(((((284+Tageszahl_0)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_1 = 23.45*Math::sin(((((284+Tageszahl_1)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_2 = 23.45*Math::sin(((((284+Tageszahl_2)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_3 = 23.45*Math::sin(((((284+Tageszahl_3)*360)/365).doubleValue)*((Math::PI/180).doubleValue))
    Sonnendeklination_Grad_4 = 23.45*Math::sin(((((284+Tageszahl_4)*360)/365).doubleValue)*((Math::PI/180).doubleValue)) 
    logInfo("pvcalc", "Sonnendeklination_Grad_0: {} °",Sonnendeklination_Grad_0)
    logInfo("pvcalc", "Sonnendeklination_Grad_1: {} °",Sonnendeklination_Grad_1)
    logInfo("pvcalc", "Sonnendeklination_Grad_2: {} °",Sonnendeklination_Grad_2)
    logInfo("pvcalc", "Sonnendeklination_Grad_3: {} °",Sonnendeklination_Grad_3)
    logInfo("pvcalc", "Sonnendeklination_Grad_4: {} °",Sonnendeklination_Grad_4)

    Sonnendeklination_Bogen_0 = (Sonnendeklination_Grad_0/180)*Math::PI  
    Sonnendeklination_Bogen_1 = (Sonnendeklination_Grad_1/180)*Math::PI  
    Sonnendeklination_Bogen_2 = (Sonnendeklination_Grad_2/180)*Math::PI  
    Sonnendeklination_Bogen_3 = (Sonnendeklination_Grad_3/180)*Math::PI  
    Sonnendeklination_Bogen_4 = (Sonnendeklination_Grad_4/180)*Math::PI  
    logInfo("pvcalc", "Sonnendeklination_Bogen_0: {} rad",Sonnendeklination_Bogen_0)
    logInfo("pvcalc", "Sonnendeklination_Bogen_1: {} rad",Sonnendeklination_Bogen_1)
    logInfo("pvcalc", "Sonnendeklination_Bogen_2: {} rad",Sonnendeklination_Bogen_2)
    logInfo("pvcalc", "Sonnendeklination_Bogen_3: {} rad",Sonnendeklination_Bogen_3)
    logInfo("pvcalc", "Sonnendeklination_Bogen_4: {} rad",Sonnendeklination_Bogen_4)


    /*    var Number Zwischenergebnis_Zeitgleichung_0_Argument_1 = ((0.0337*Tageszahl_0+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_0_Argument_2 = ((0.01787*Tageszahl_0-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_1 = ((0.0337*Tageszahl_1+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_1_Argument_2 = ((0.01787*Tageszahl_1-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_1 = ((0.0337*Tageszahl_2+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_2_Argument_2 = ((0.01787*Tageszahl_2-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_1 = ((0.0337*Tageszahl_3+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_3_Argument_2 = ((0.01787*Tageszahl_3-0.168).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_1 = ((0.0337*Tageszahl_4+0.465).doubleValue)
    var Number Zwischenergebnis_Zeitgleichung_4_Argument_2 = ((0.01787*Tageszahl_4-0.168).doubleValue)*/

    val Zwischenergebnis_Zeitgleichung_0_Argument_1 = ((0.0337*Tageszahl_0+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_0_Argument_2 = ((0.01787*Tageszahl_0-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_1_Argument_1 = ((0.0337*Tageszahl_1+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_1_Argument_2 = ((0.01787*Tageszahl_1-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_2_Argument_1 = ((0.0337*Tageszahl_2+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_2_Argument_2 = ((0.01787*Tageszahl_2-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_3_Argument_1 = ((0.0337*Tageszahl_3+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_3_Argument_2 = ((0.01787*Tageszahl_3-0.168).doubleValue)
    val Zwischenergebnis_Zeitgleichung_4_Argument_1 = ((0.0337*Tageszahl_4+0.465).doubleValue)
    val Zwischenergebnis_Zeitgleichung_4_Argument_2 = ((0.01787*Tageszahl_4-0.168).doubleValue)

    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_0_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_0_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_0_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_0_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_1_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_1_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_1_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_1_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_2_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_2_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_2_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_2_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_3_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_3_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_3_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_3_Argument_2)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_4_Argument_1: {} ",Zwischenergebnis_Zeitgleichung_4_Argument_1)
    logInfo("pvcalc", "Zwischenergebnis_Zeitgleichung_4_Argument_2: {} ",Zwischenergebnis_Zeitgleichung_4_Argument_2)

    Zeitgleichung_0 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_0_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_0_Argument_2))
    Zeitgleichung_1 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_1_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_1_Argument_2))
    Zeitgleichung_2 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_2_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_2_Argument_2))
    Zeitgleichung_3 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_3_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_3_Argument_2))
    Zeitgleichung_4 =  60.0*(-0.171*Math::sin(Zwischenergebnis_Zeitgleichung_4_Argument_1)-0.1299*Math::sin(Zwischenergebnis_Zeitgleichung_4_Argument_2))

    logInfo("pvcalc", "Zeitgleichung_0: {} ???",Zeitgleichung_0)
    logInfo("pvcalc", "Zeitgleichung_1: {} ???",Zeitgleichung_1)
    logInfo("pvcalc", "Zeitgleichung_2: {} ???",Zeitgleichung_2)
    logInfo("pvcalc", "Zeitgleichung_3: {} ???",Zeitgleichung_3)
    logInfo("pvcalc", "Zeitgleichung_4: {} ???",Zeitgleichung_4)


    Stundenwinkel_Grad_0 = 15.0 * (Hour_0.doubleValue - (15.0-Longitude)/15.0 - 12.0 + Zeitgleichung_0/60.0)
    logInfo("pvcalc", "Stundenwinkel_Grad_0: {} °",Stundenwinkel_Grad_0)
    Stundenwinkel_Grad_1 = 15.0 * (Hour_1.doubleValue - (15.0-Longitude)/15.0 - 12.0 + Zeitgleichung_0/60.0)
    logInfo("pvcalc", "Stundenwinkel_Grad_1: {} °",Stundenwinkel_Grad_1)

    Stundenwinkel_Bogen_0 = (Stundenwinkel_Grad_0/180)*Math::PI
    logInfo("pvcalc", "Stundenwinkel_Bogen_0: {} rad",Stundenwinkel_Bogen_0)
    Stundenwinkel_Bogen_1 = (Stundenwinkel_Grad_1/180)*Math::PI
    logInfo("pvcalc", "Stundenwinkel_Bogen_1: {} rad",Stundenwinkel_Bogen_1)

    Cosinus_Thetta_0 = (Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)-(Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Stundenwinkel_Bogen_0.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen)*Math::cos(Stundenwinkel_Bogen_0.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::sin(Azimutabweichung_Bogen)*Math::sin(Stundenwinkel_Bogen_0.doubleValue)))
    logInfo("pvcalc", "Cosinus_Thetta_0: {} rad",Cosinus_Thetta_0)
    Cosinus_Thetta_1 = (Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)-(Math::sin(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Breitengrad_Bogen)*Math::cos(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Stundenwinkel_Bogen_1.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Breitengrad_Bogen)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::cos(Azimutabweichung_Bogen)*Math::cos(Stundenwinkel_Bogen_1.doubleValue))+(Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Aufstellwinkel_PV_Module_Bogen)*Math::sin(Azimutabweichung_Bogen)*Math::sin(Stundenwinkel_Bogen_1.doubleValue)))
    logInfo("pvcalc", "Cosinus_Thetta_1: {} rad",Cosinus_Thetta_1)

    if (Cosinus_Thetta_0 < 0) {
        Prognose_PV_Leistung_0 = 0
    }
    else { Prognose_PV_Leistung_0 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_0.doubleValue*(1-(55/100))

//	else { Prognose_PV_Leistung_0 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_0.doubleValue*(1-((Number_Clouds_0.state as DecimalType).doubleValue)/100)
    }
    logInfo("pvcalc", "Prognose_PV_Leistung_0: {} W",Prognose_PV_Leistung_0)
    logInfo("pvcalc", "Strahlungsintensitaet_Sonne: {} W/m²",Strahlungsintensitaet_Sonne)
    logInfo("pvcalc", "Gesamtflaeche_PV_Anlage: {} m²",Gesamtflaeche_PV_Anlage)
    logInfo("pvcalc", "Wirkungsgrad_PV_Module: {} ",Wirkungsgrad_PV_Module)
    logInfo("pvcalc", "Number_Clouds_0: {} ",Number_Clouds_0)
    if (Cosinus_Thetta_1 < 0) {
        Prognose_PV_Leistung_1 = 0
    }
    else { Prognose_PV_Leistung_1 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_1.doubleValue*(1-(65/100))

//	else { Prognose_PV_Leistung_1 = Strahlungsintensitaet_Sonne*Gesamtflaeche_PV_Anlage*Wirkungsgrad_PV_Module*Cosinus_Thetta_1.doubleValue*(1-((Number_Clouds_1.state as DecimalType).doubleValue)/100)
    }
    logInfo("pvcalc", "Prognose_PV_Leistung_1: {} W",Prognose_PV_Leistung_1)
    logInfo("pvcalc", "Number_Clouds_1: {} ",Number_Clouds_1)

end
Wie könnte ich den Code vereinfachen ?

Re: Rechnen mit Sinus und Cosinus

Verfasst: 19. Aug 2018 13:33
von udo1toni
Eine reine Laufzeitoptimierung ergibt sich schon mal, indem man Konstanten nur einmalig berechnet:

Code: Alles auswählen

var double pi180
var double Breitengrad_Bogen
var double Azimutabweichung_Bogen
var double Aufstellwinkel_PV_Module_Bogen
var double dLong
var double dsBcA
var double dcBsAcAz
var double dcBcA
var double dsBsAcAz
var double dsAsAz


//__________________________________
// Rules Deklaration
//__________________________________

rule "Variablen initialisieren"
when
    System started
then
    pi180 = Math::PI / 180
    Breitengrad_Bogen = Breitengrad_Grad * pi180
    Azimutabweichung_Bogen = Azimutabweichung_Grad * pi180
    Aufstellwinkel_PV_Module_Bogen = Aufstellwinkel_PV_Module_Grad * pi180
    dLong = (15.0-Longitude)/15.0 - 12.0
    dsBcA = Math::sin(Breitengrad_Bogen) * Math::cos(Aufstellwinkel_PV_Module_Bogen)
    dcBsAcAz = Math::cos(Breitengrad_Bogen) * Math::sin(Aufstellwinkel_PV_Module_Bogen) * Math::cos(Azimutabweichung_Bogen)
    dcBcA = Math::cos(Breitengrad_Bogen) * Math::cos(Aufstellwinkel_PV_Module_Bogen)
    dsBsAcAz = Math::sin(Breitengrad_Bogen) * Math::sin(Aufstellwinkel_PV_Module_Bogen) * Math::cos(Azimutabweichung_Bogen)
    dsAsAz = Math::sin(Aufstellwinkel_PV_Module_Bogen) * Math::sin(Azimutabweichung_Bogen)
	
    logInfo("pvcalc", "Breitengrad_Bogen: {} rad",Breitengrad_Bogen)
    logInfo("pvcalc", "Azimutabweichung_Bogen: {} rad",Azimutabweichung_Bogen)
    logInfo("pvcalc", "Aufstellwinkel_PV_Module_Bogen: {} rad",Aufstellwinkel_PV_Module_Bogen)
    
end
Alle aufgeführten Werte sind fix, das heißt, es reicht, sie beim Systemstart zu berechnen. Die lustigen Variablennamen ergeben sich aus
d = double
s = sinus
c = cosinus
B = Breitengrad(Bogen)
A = Aufstellwinkel(Bogen)
Az = Azimutabweichung(Bogen)

Da es mathematisch keinen Unterschied macht, ob man a / 180 * pi oder a * pi / 180 rechnet, kann die Variable pi180 in der Hauptrule zwölfmal verwendet werden.
openHAB beherrscht die mathematischen Grundregeln, das heißt (a * b) + c = a * b + c und a + ( b * c ) = a + b * c. Entsprechend kannst Du massig Klammern weg lassen.
Durch die Verwendung der (konstanten) Variablen sparst Du also in der Hauptrule pro Cosinus_theta 12 sinus/cosinus-Funktionen, weiterhin 12 Aufrufe von pi/180 und immerhin zweimal die Berechnung des Längengrads

Code: Alles auswählen

    Cosinus_Thetta_0 = Math::sin(Sonnendeklination_Bogen_0.doubleValue)*dsBcA-Math::sin(Sonnendeklination_Bogen_0.doubleValue)*dcBsAcAz+Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Stundenwinkel_Bogen_0.doubleValue)*dcBcA+Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::cos(Stundenwinkel_Bogen_0.doubleValue)*dsBsAcAz+Math::cos(Sonnendeklination_Bogen_0.doubleValue)*Math::sin(Stundenwinkel_Bogen_0.doubleValue)*dsAsAz 
Wäre dann die aktualisierte Formel.
Weiterhin hast Du natürlich jede Menge Variablen, die sich einmal täglich ändern, die könnte man also gemeinsam in einer Rule berechnen, die einmal täglich aufgerufen wird.

Soweit ich verstanden habe, ist ein Großteil der enthaltenen Variablen entweder nur zum Zwischenspeichern von Werten gedacht, die zur Laufzeit berechnet werden, oder für die zukünftige Erweiterung der Vorhersage, also weitere Cosinus_theta Funktionen.
Variablen, die sich bei jedem Aufruf ändern, solltest Du innerhalb der Rule definieren, da sie außerhalb oder auch rule-übergreifend keine Verwendung finden können.

Was ich nicht verstehe, ist, was Du mit der Zahl, die letztlich hintern raus kommt, anfangen willst.
Das Ganze ist ja eine Prognose wie hoch die zu erwartende Leistungsabgabe der PV-Anlage sein wird. Aber was nützt Dir das?
Zum Einschalten von Großverbrauchern wird das Modell nur sehr eingeschränkt zu brauchen sein, da PV-Anlagen nun mal extrem selbst auf kleinste Wolken reagieren.
Ich schreibe seit ca. 2 Jahren den Tagesverlauf meiner PV-Anlage mit. Wo z.B. die Sonnenfinsternis 2017 (?) gut vorhersagbar gewesen wäre ;) sind kurze Einbrüche durch Wolken teilweise im Sekundentakt sichtbar. Die letzten Wochen wolkenlosen Himmels waren da ein bisschen was anderes, aber dann kann man sich die ganze Berechnung auch schenken.

Achso...

now.getDayOfYear liefert den Tag im Jahr. now.getDayOfYear + 1 liefert nicht den nächsten Tag im Jahr! Korrekt wäre hier now.plusDays(1).getDayOfYear. Der Unterschied wird am 31.12. deutlich...
Innerhalb Deiner Berechnungen addierst Du auch noch 284, letztlich verschiebst Du damit ja nur die Sinus/Cosinus-Funktion um ca. -70°. Ich kenne die zugrunde liegenden Formeln nicht, frage mich aber schon, ob dort eventuell auch plusDays(284) oder minusDays(72) korrekt wäre.
Gleiches gilt natürlich sinngemäß auch für die Stunde. now.plusHours(6).getHourOfDay bleibt im Zahlenraum 0 bis 23, während now.getHourOfDay + 6 im Zahlenraum 6 bis 29 liegt. (Dieser Teil ist momentan ja inaktiv)