Jalousien nach Sonnenstand

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

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:

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
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

udo1toni hat geschrieben: 9. Mär 2021 21:23 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.
My 5 Cent, und weil ich ja auch versuche die Dinge zu verstehen ;)

Sollte eine Jalousie nach der eingestellten Zeit (warum auch immer und die Spanne ist ja sehr großzügig) die Zielposition nicht erreicht haben, werden die Lamellen auch zu keinem Zeitpunkt verstellt, oder?

Fazit: Der Zeitpunkt zum Start der Abfrage darf nicht zu knapp gewählt werden?
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Genau. Besser wäre es, zu erkennen, dass die Jalousie gestoppt wurde. ein knx Aktor meldet gewöhnlich den Status am Ende der Fahrt, das wäre also durchaus eine Möglichkeit. Man könnte dann pro Jalousie eine Rule anlegen (oder das Ganze auch als generalisierte Rule für alle Jalousien definieren... ist dann aber etwas komplexer), die bei Änderung des Status den Status auf die Autoposition überprüft und bei entsprechender Position direkt die Lamellen dreht. dazu muss aber verhindert werden, dass der Befehl Item.sendCommand(47) direkt zu einem Update des Status auf 47 führt (das macht openHAB als default).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Markus_JE
Beiträge: 138
Registriert: 6. Okt 2019 13:20
Answers: 0

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hallo zusammen,

könntet ihr mich nochmals unterstützen.
Um die Regel weiter auszubauen würde ich gerne
noch einen Fensterkontakt einbauen welcher im geöffneten Zustand verweigert das diese eine Jalousie sich schließt.

item:

Code: Alles auswählen

String HmIPSWDM00155BE9908337_State 
Die Jalousie welche es betreffen würde wäre:

Code: Alles auswählen

EGTerassentuere
Rule:

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

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Na ja, Du musst ja nur eine zusätzliche Bedingung einfügen. Codeschnipsel:

Code: Alles auswählen

    } 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 && HmIPSWDM00155BE9908337_State.state != "OPEN") // <- hier die Änderung
            EGTerassentuere.sendCommand(47)
Es muss also nur das && HmIPSWDM00155BE9908337_State.state != "OPEN" ergänzt werden. Ich gehe davon aus, dass OPEN der String ist, welcher anzeigt, dass die Tür geöffnet ist.

Eigentlich sollten Tür- und Fensterkontakte als Contact Item eingebunden werden. Ich habe kein homematic, weshalb ich nicht weiß, ob es hier besondere Gründe für das String Item gibt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Markus_JE
Beiträge: 138
Registriert: 6. Okt 2019 13:20
Answers: 0

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hallo Udo,

ich habe das item auf contact eingestellt. Das war mir leider nicht bekannt.
Vielen Dank einmal mehr für deine schnelle Hilfe.

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Hast Du getestet, dass das Item auch korrekt funktioniert?

Dann wären die Anführungszeichen überflüssig.

Code: Alles auswählen

... && HmIPSWDM00155BE9908337_State.state != OPEN)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Markus_JE
Beiträge: 138
Registriert: 6. Okt 2019 13:20
Answers: 0

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hi Udo,

hab es mit dem item als contact getestet.
Funktioniert super!!

Erneut vielen Dank!!

Markus_JE
Beiträge: 138
Registriert: 6. Okt 2019 13:20
Answers: 0

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hi Udo,

jetzt hätte ich noch ein weiteres Thema.
Ich würde gerne die Jalousien nach oben fahren lassen wenn die Bedienungen nicht mehr erfüllt sind.
Hierfür würde ich gerne zusätzlich noch eine (Uhr)Zeit einbauen von wann bis wann das hoch fahren aktiviert sein soll.
Da ich ja nicht will das in der Nacht die Jalousien sich öffnen.

Ist das möglich in die Rule zu packen?

Rule:

Code: Alles auswählen

val nElevationMin = 15 //15
val nElevationMax = 65 //65
val nAzimutMin = 140 //140
val nAzimutMax = 260 //260
val nIntensityMin = 150 //150
val nCloudynessMax = 80 //80
var Timer tSchatten = null

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    if(SonnenschutzEG_Aktiv.state != ON)
        return;

//    if(!(LokaleSonnendaten_DiffuseStrahlung.state instanceof Number)) {
//       logWarn("shade","DiffuseStrahlung! Abbruch!")
//       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)	//&& HmIPSWDM00155BE9908337_State.state != "OPEN")
            EGBlumenfenster.sendCommand(69)
        if((EGBalkontuere.state as Number) < 10 && (EGBalkontuere.state as Number) != 47)		//&& HmIPSWDM00155BE9908337_State.state != "OPEN")
            EGBalkontuere.sendCommand(47)
        if((EGSchiebetuere.state as Number) < 10 && (EGSchiebetuere.state as Number) != 47 		  && FensterkontaktSchiebetuere_State.state != OPEN)
            EGSchiebetuere.sendCommand(47)
        if((EGWohnzimmer.state as Number) < 10 && (EGWohnzimmer.state as Number) != 84)			//&& HmIPSWDM00155BE9908337_State.state != "OPEN")
            EGWohnzimmer.sendCommand(84)
        if(tSchatten === null)
            tSchatten = createTimer(now.plusSeconds(60), [|
				logInfo("FILE", "Timer abgelaufen Jalousien Lamellen werden verstellt")
                if((EGBlumenfenster.state as Number) == 69)
                    KNXDeviceJalousieaktor1126_BlumenfensterLamellen.sendCommand(47)	
                if((EGBalkontuere.state as Number) == 47)
                    KNXDeviceJalousieaktor1126_BalkontureLamellen.sendCommand(35)	
                if((EGSchiebetuere.state as Number) == 47)
                    KNXDeviceJalousieaktor1126_TerassentureLamellen.sendCommand(54) 
                if((EGWohnzimmer.state as Number) == 84)
                    KNXDeviceJalousieaktor1126_WohnzimmerLamellen.sendCommand(30)
                tSchatten = null
            ])
    }
	
end

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Ja, klar, in dem letzten If-Block (dessen else-Block die gesamte Beschattungssteuerung beinhaltet) kannst Du ja locker eine entsprechende Bedingung (Uhrzeit) einbauen und die Jalousien fahren lassen.

Code: Alles auswählen

    if(nElevation < nElevationMin || nElevation > nElevationMax || nAzimut < nAzimutMin || nAzimut > nAzimutMax || nIntens < nIntensityMin || nCloud > nCloudynessMax) {
        logInfo("shade","Jalousien Wohn/Esszimmer Beschattung aus!")
        if(now.getHourOfDay > 7 && now.getHourOfDay < 19) {
            if((EGBlumenfenster.state as Number) == 69)
                EGBlumenfenster.sendCommand(0)
            if((EGBalkontuere.state as Number) == 47)
                EGBalkontuere.sendCommand(0)
            if((EGSchiebetuere.state as Number) == 47)
                EGSchiebetuere.sendCommand(0)
            if((EGWohnzimmer.state as Number) == 84)
                EGWohnzimmer.sendCommand(0)
        }
    } else {
Falls die Rule unter OH3 laufen soll, muss man statt now.getHourOfDay ZonedDateTime.now.getHour verwenden. Natürlich kann man auch die Minute und die Sekunde berücksichtigen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten