Seite 1 von 1

OH rechnet falsch

Verfasst: 1. Jun 2022 17:16
von MirkoB
Hallo ich wieder,

In einer DSL Rule errechne ich einen Wert (Zeile 36). Die Rule läuft auch sauer durch, jedoch kommt ein falsches Ergebnis heraus.

Code: Alles auswählen

aRollo = Math::tan(sunElevation) * b          // Berechnung der Fensteröffnung gemäß Sonnenstand
selbst wenn ich die Variablen durch echte Werte ersetzte, stimmt das Ergebnis nicht.

Code: Alles auswählen

var Number  BelDecke = null

var Number preJalFenster // Ist-Zustand Jalousie Fenster Wohnzimmer
var Number preJalTuer    // Ist-Zustand Jalousie Balkontür
var Number preJalWest       // Ist-Zustand Jalousie Fenster West Wohnzimmer 
                            
var  double  sunEnd     // Sonnenuntergang in Variable setzen
val  double   b = 2.3        // Constante "b" Abstand TV - Fenster UK
val  double  c = 2.74      // Constante "c" Abstand TV - Fenster OK 
val  double   a = 1.57      // Constante "a" Höhen Fenster
var  double  aRollo = 0         // Variable "a" Abstand UK Fenster - UK Rollo
var  double  sunElevation 
var  double  wAlpha  = 0       // Winkel Alpha 



rule "Wohnzimmer TV "


when
Item  TESTSCHALTER changed 

then 

var Number preJalFenster = WohnzimmerRolloFenster_Steuerung0offen100geschlossen.state as Number // Ist-Zustand Jalousie Fenster Wohnzimmer
var Number preJalTuer  = WohnzimmerRolloTuer_Steuerung0offen100geschlossen.state as Number      // Ist-Zustand Jalousie Balkontür
var Number preJalWest = WohnzimmerRolloWest_Steuerung0offen100geschlossen.state as Number       // Ist-Zustand Jalousie Fenster West Wohnzimmer 
val SwitchNum = if (WohnzimmerLicht_Betrieb.state == ON) 1 else 0                               // Ist-Zustand Deckenlicht
val  sunEnd  = (LokaleSonnendaten_AstroDusk_Start.state as DateTimeType).getZonedDateTime()     // Sonnenuntergang in Variable setzen

//val day_start = (AstroSunData_Rise_StartTime.state as DateTimeType)
//val evening_start = (AstroSunData_Set_StartTime.state as DateTimeType).getZonedDateTime()
sunElevation = (LokaleSonnendaten_Position_Elevation.state as QuantityType<Number>).doubleValue

aRollo = Math::tan(sunElevation) * b          // Berechnung der Fensteröffnung gemäß Sonnenstand
var Number aRolloProzent = ((aRollo * 100)/a)  // Umstellen der Öffnunggrösse aus Prozent
logInfo("TV_Sonnenstand", "Tangens aus Variable sunElevation"+ " " + Math::tan(sunElevation) )
logInfo("TV_Sonnenstand", "Fensteröffnung Variable aRollo " + aRollo)
logInfo("TV_Sonnenstand", "Fensteröffnung in Variable aRolloProzent" + "  " + aRolloProzent)
logInfo("TV_Sonnenstand", "Sonnenstand Variable sunElevation" + " "+ sunElevation)


logInfo ("Sonnenaufgang um ",""+ sunEnd)


    if (now.isAfter(sunEnd))
        { logInfo("TV-Modus", "nach Sonnenuntergang")
        }


    if((now.isBefore(sunEnd)) && (WZBalkontur_FKswitch.state == (ON)))
        { logInfo("TV-Modus", "vor Sonnenuntergang")
        
        }

end


Zur Fehlersuche habe ich im Log die einzelnen Variablenwerte anzeigen lassen.

Code: Alles auswählen

2022-06-01 17:06:36.564 [INFO ] [hab.core.model.script.TV_Sonnenstand] - Sonnenstand Variable sunElevation 37.85849688964969
2022-06-01 17:06:36.589 [INFO ] [hab.core.model.script.TV_Sonnenstand] - Tangens aus Variable sunElevation 0.16074855440426897
2022-06-01 17:06:36.593 [INFO ] [hab.core.model.script.TV_Sonnenstand] - Fensteröffnung Variable aRollo 0.36972167512981857
2022-06-01 17:06:36.597 [INFO ] [hab.core.model.script.TV_Sonnenstand] - Fensteröffnung in Variable aRolloProzent  23.549151282154046
2022-06-01 17:06:36.603 [INFO ] [hab.core.model.script.TV_Sonnenstand] - Sonnenstand Variable sunElevation 37.85849688964969
Wird noch lustiger: Nach Änderungen in der Rule, egal welcher Art. Kommt als Ergebnis immer ein negativer Wert raus. Nach Neustart von OH ist der Wert wieder Positiv.

Müssen vielleicht noch irgendwelche Bibliothek geladen werden?

Stört Euch bitte nicht an dem chaotischen Rest , ist noch lange nicht fertig.... :?

Re: OH rechnet falsch

Verfasst: 1. Jun 2022 19:29
von udo1toni
Frage 1: ist das die richtige Funktion? Manchmal heißen Funktionen im englischen anders als im deutschen (bei Tangens bin ich mir halt nicht zu 100% sicher, ob der nicht anders heißt)
Frage 2: Welches Maß wird verwendet? 360° für einen Vollkreis, 400° für einen Vollkreis, oder am Ende zwei Pi (Ähhhh... Bogenmaß?)

Re: OH rechnet falsch

Verfasst: 1. Jun 2022 19:33
von pauliv_de
Ich habe zwar keine Lösung, aber vielleicht hilft dieser Link
https://www.openhab.org/docs/configurat ... onversions
dort gibt es einen Hinweis... Take care with maths around Quantity Types. While you can freely mix units in many cases, there are pitfalls. ....

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 07:26
von MirkoB
udo1toni hat geschrieben: 1. Jun 2022 19:29 Frage 1: ist das die richtige Funktion? Manchmal heißen Funktionen im englischen anders als im deutschen (bei Tangens bin ich mir halt nicht zu 100% sicher, ob der nicht anders heißt)
Frage 2: Welches Maß wird verwendet? 360° für einen Vollkreis, 400° für einen Vollkreis, oder am Ende zwei Pi (Ähhhh... Bogenmaß?)
Frage1: keine Ahnung
Frage2: ich gehen von einem 360° Kreis aus . Ich bekomme die Daten aus dem Astro Binding , Lokale Sonnedaten , Höhenwinkel

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 08:33
von udo1toni
MirkoB hat geschrieben: 2. Jun 2022 07:26 Frage2: ich gehen von einem 360° Kreis aus . Ich bekomme die Daten aus dem Astro Binding , Lokale Sonnedaten , Höhenwinkel
Für den Eingangswert: Ja, Astro basiert auf 360° Vollkreis. Aber was erwartet Math::tan()?

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 14:48
von rfu
Java Math.tan() erwartet einen Radiant... https://www.javatpoint.com/java-math-tan-method

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 17:47
von MirkoB
Danke, muss ich mir mal ansehen ;)

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 17:51
von MirkoB
mal ne schnelle Skizze . Ziel ist es mein Rollo immer soweit herunter zu fahren, das es gerade so nicht blendet.

Re: OH rechnet falsch

Verfasst: 2. Jun 2022 19:44
von udo1toni
Gut, dann bekommt man die passende Formel z.B. hier: https://de.wikipedia.org/wiki/Radiant_(Einheit) (2π/360 °)