Re: Jalousien nach Sonnenstand
Verfasst: 9. Mär 2021 21:23
Tja, die Idee sieht ja erst mal gut aus... aber 1. arbeitet Thread::sleep() mit Millisekunden - es wäre also Thread::sleep(150000) nötig. Das ist aber aus verschiedenen Gründen keine gute Idee. Stattdessen wäre ein Timer vonnöten. Und dann ist da noch die Sache, die Lamellen einfach so anzusteuern. Du weißt ja gar nicht, ob alle Jalousien gefahren wurden. Entsprechend muss üfr jede Jalousie getestet werden, auf welcher Höhe sie sich befindet. So:
Wenn tSchatten null ist, wird der Timer angelegt. Danach ist die Rule beendet.
Nach 150 Sekunden startet der Scheduler den Code, der im Lambda übergeben wurde (alles in den eckigen Klammern)
Der Code prüft einzeln für jede Jalousie, ob die Position die Beschattungsposition ist. Ist das der Fall, so wird bei der entsprechenden Jalousie der Lamellenwinkel eingestellt. Zum Schluss wird der Zeiger auf den Timer gelöscht, damit bei nächsten Mal wieder der Timer verwendet werden kann.
Code: Alles auswählen
val nElevationMin = 15
val nElevationMax = 65
val nAzimutMin = 150
val nAzimutMax = 260
val nIntensityMin = 150
val nCloudynessMax = 40
var Timer tSchatten = null
rule "Beschattung"
when
Item LokaleSonnendaten_Position_Elevation changed
then
if(SonnenschutzEG_Aktiv.state != ON)
return;
if(!(LokaleSonnendaten_Position_Elevation.state instanceof Number)) {
logWarn("shade","Elevation ungültig! Abbruch!")
return;
}
if(!(LokaleSonnendaten_Azimut.state instanceof Number)) {
logWarn("shade","Azimut ungültig! Abbruch!")
return;
}
val nElevation = (LokaleSonnendaten_Position_Elevation.state as Number).floatValue
val nAzimut = (LokaleSonnendaten_Azimut.state as Number).floatValue
var nIntens = 100
if(LokaleSonnendaten_DirekteStrahlung.state instanceof Number)
nIntens = (LokaleSonnendaten_DirekteStrahlung.state as DecimalType).intValue
var nCloud = 0
if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue
if(nElevation < nElevationMin || nElevation > nElevationMax || nAzimut < nAzimutMin || nAzimut > nAzimutMax || nIntens < nIntensityMin || nCloud > nCloudynessMax) {
logInfo("shade","Jalousien Wohn/Esszimmer Beschattung aus!")
} else {
logInfo("shade","Jalousien Wohn/Esszimmer Beschattung an!")
if((EGBlumenfenster.state as Number) < 10 && (EGBlumenfenster.state as Number) != 69)
EGBlumenfenster.sendCommand(69)
if((EGBalkontuere.state as Number) < 10 && (EGBalkontuere.state as Number) != 47)
EGBalkontuere.sendCommand(47)
if((EGTerassentuere.state as Number) < 10 && (EGTerassentuere.state as Number) != 47)
EGTerassentuere.sendCommand(47)
if((EGWohnzimmer.state as Number) < 10 && (EGWohnzimmer.state as Number) != 84)
EGWohnzimmer.sendCommand(84)
if(tSchatten === null)
tSchatten = createTimer(now.plusSeconds(150), [|
if((EGBlumenfenster.state as Number) == 69)
KNXDeviceJalousieaktor1126_BlumenfensterLamellen.sendCommand(50)
if((EGBalkontuere.state as Number) == 47)
KNXDeviceJalousieaktor1126_BalkontureLamellen.sendCommand(50)
if((EGTerassentuere.state as Number) == 47)
KNXDeviceJalousieaktor1126_TerassentureLamellen.sendCommand(50)
if((EGWohnzimmer.state as Number) == 84)
KNXDeviceJalousieaktor1126_WohnzimmerLamellen.sendCommand(50)
tSchatten = null
])
}
end
Nach 150 Sekunden startet der Scheduler den Code, der im Lambda übergeben wurde (alles in den eckigen Klammern)
Der Code prüft einzeln für jede Jalousie, ob die Position die Beschattungsposition ist. Ist das der Fall, so wird bei der entsprechenden Jalousie der Lamellenwinkel eingestellt. Zum Schluss wird der Zeiger auf den Timer gelöscht, damit bei nächsten Mal wieder der Timer verwendet werden kann.