Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Nach meinem Verständnis verbirgt sich in der Berechnung des Sonnenstands eine (kleine) Ungenauigkeit, da die Tageszahl aus Monat, Tag und Stunde zusammengesetzt wird, dabei aber für jeden abgelaufenen Monat 30 Tage angenommen werden. Im Mittel stimmt das zwar, eleganter erscheint mir aber, die Funktion now.getDayOfYear zu verwenden, die direkt den korrekten Tag des Jahres ausgeben sollte - für das logging ist natürlich das Klartextdatum angenehmer...
Es ist ja eh eine Berechnungsmethode die nur ungefähre Werte ermittelt (die aber für die praktische Anwendung in der Hausautomatisierung vollkommen reichen). Der Fehler durch die Methode dürfte wahrscheinlich größer sein als der durch die Bestimmung des Datums, genau kann ich es aber nicht sagen.
Interessehalber hab ich auch mal die aufwändigere Version von ABC der Astronomie umgesetzt (tagesgenau) und lasse mir beide Varianten parallel anzeigen. Aktuell kommen beide auf 5:26 Uhr als Sonnenaufgang (Differenz also < 1min) und -1.3° bzw. -0.97° Sonnenhöhe, Azimut sind 308,9° zu 308,78°, die Berechnung wird aber auch nur alle paar Minuten ausgeführt. Die Unterschiede halte ich für praktisch zu vernachlässigen.
Die genauere Variante hab ich aber schon in C umgesetzt und übermittle die Werte per Rest-API, in einer Regel wäre mir das viel zu aufwändig gewesen.
Kann mir jemand sagen, wie ich anhand dieser Berechnungen an sonnigen Tagen die Rollos zur Beschattung nutzen kann? Welcher Wert ist da relevant? Ich habe schon versucht herauszufinden, welche Werte angezeigt werden, wenn die Sonne anfängt durch Fester X zu scheinen, aber ich bilde mir ein, dass die Werte jeden Tag anders sind (bei wolkenlosem Himmel ;-))
Mit Sun_Azimut bekommst du die Sonnenposition horizontal - also "um dein Haus herum". Sun_Height ist die Höhe überm Horizont.
Die minimale/Sonnenaufgang und maximale/Mittag Sonnenhöhe ändert sich stetig im Jahresverlauf.
Du kannst z.B. deine Hausseiten als Switches definieren um so die gezielte Beschattung zu steuern. Wenn die Sonne (Azimut) in einem bestimmten Bereich ist, soll der Schalter ein sonst aus sein.
In den Google Groups gibt es eine erweiterte Regel, die auch die Beleuchtung der vier Hausseiten berechnet: Klick
Dazu muss oben in der Regel noch die Ausrichtung des Hauses konfiguriert werden.
Aber Achtung: die Regel hat bei der Berechnung der Differenz zu GMT noch einen Bug der jeweils beim Tageswechsel auftritt. Der läßt sich aber wie folgt korrigieren:
Ersetze
var localgmtdiff = local_time.get(java::util::Calendar::HOUR_OF_DAY) - hour //Timezone
Durch
var localgmtdiff = local_time.get(java::util::Calendar::ZONE_OFFSET)/3600000
Die Sonnenstandsberechnung im Sample-Wiki hat den Bug, zumindest auf den ersten Blick, nicht.
Die erweiterte Regel ist ja nicht von mir, daher würde ich die ungerne in das Wiki eintragen ohne den Autor und auch den ursprünglichen Ersteller (lexikon.astronomie,info) zu fragen.
// import the decimal type as we refer to it in a rule
import org.openhab.core.library.types.DecimalType
// Constants
var Number K = 0.017453
// Change this reflecting your destination
var Number latitude = 59.580000
var Number longitude = 06.000000
var Number counter
rule "Set Sun sonnenhoehe and Dawn States"
when
Time cron "0 0/5 * * * ?"
then
var Number tageszahl
var Number deklination
var Number zeitgleichung
var Number stundenwinkel
var Number x
var Number y
var Number sonnenhoehe Ich bekomme bei der Variablen sonnenhoehe die Fehlermeldung:
"Multiple markers at this line
- The value of the local variable sonnenhoehe is not used
- Duplicate variable name 'sonnenhoehe'"
var Number azimut
var month = now.getMonthOfYear
var day = now.getDayOfMonth
var hour = now.getHourOfDay
var minute = now.getMinuteOfHour
...in der Formel wird bei sonnenhoehe folgendes geplottet:
"Incompatible types. Expected org.openhab.core.library.items.NumberItem
but was java.math.BigDecimal"
var break = hour.doubleValue + (minute.doubleValue/60.0) <= 12.0 + (15.0-longitude)/15.0 - zeitgleichung/60.0
if (break) {
azimut = Math::acos(y.doubleValue) / K
} else {
azimut = 360.0 - Math::acos(y.doubleValue) / K
}
logDebug("Sun.rules", "Calculated new SunHeight angle '" + sonnenhoehe + "°'")
logDebug("Sun.rules", "Calculated new Azimut angle '" + azimut + "°'")
// Berechnungen auf den Bus schicken ...
Sun_Height.postUpdate(sonnenhoehe)
Sun_Azimut.postUpdate(azimut)
end
rule "calculate dawn"
when
Item Sun_Height changed
then
Sun_Dawn_Solar.postUpdate( if (Sun_Height.state < 0) ON else OFF )
Sun_Dawn_Civil.postUpdate( if (Sun_Height.state < -6) ON else OFF )
Sun_Dawn_Nautical.postUpdate( if (Sun_Height.state < -12) ON else OFF )
Sun_Dawn_Astronomical.postUpdate( if (Sun_Height.state < -18) ON else OFF)
end
In der Regel "calculate dawn" bekomme ich die folgende Fehlermeldung:"Multiple markers at this line
- Couldn't resolve reference to JvmIdentifiableElement 'postUpdate'.
- This expression is not allowed in this context, since it doesn't
cause any side effects.
- Couldn't resolve reference to JvmIdentifiableElement 'Sun_Dawn_Solar'."
rule "switch on outdoor-lights at sunset"
when
Item Sun_Dawn_Astronomical changed to ON
then
Light_Outdoor_Frontdoor.sendCommand(ON)
Light_Outdoor_Carport.sendCommand(ON)
Light_Outdoor_Balcony.sendCommand(ON)
end
rule "switch off outdoor-lights at sunrise"
when
Item Sun_Dawn_Astronomical changed to OFF
then
Light_Outdoor_Frontdoor.sendCommand(OFF)
Light_Outdoor_Carport.sendCommand(OFF)
Light_Outdoor_Balcony.sendCommand(OFF)
end
Die Definitionen der Auf- und Untergänge sind zwar ganz interessant, aber beim Schalten einer Aussenbeleuchtung mit dieser Regel und den Standard-Werte der Sonnenhöhe erreicht man meines Erachtens mit 0, -6, -12 oder gar mit -18 nicht wirklich den gewünschten Effekt!
Besser wäre ein Schalter:
Sun_Dawn_Personal.postUpdate( if (Sun_Height < - 1) ON else OFF)
Sun_Dawn_Personal. postUpdate( if (Sun_Height < - 2) ON else OFF)
So mache ich das schon länger, aber selbst das ist je nach Wetterlage unbefriedigend, dazu schwankt die Helligkeit zu sehr z.B. mit der Bewölkung. Aktuell nehme ich daher noch die Helligkeitswerte eines KNX-BM hinzu, warte aber eigentlich auf den Wiregate Helligkeitssensor für außen.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar