Rechnen mit Sinus und Cosinus
Verfasst: 16. Aug 2018 23:24
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
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