Jalousien nach Sonnenstand

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

udo1toni hat geschrieben: 6. Mär 2021 10:26 Das VerODERn ist hier schon in Ordnung, es geht darum, dass die Rollläden nur dann in die Beschattung gehen sollen, wenn alle Parameter oberhalb des Minimum und unterhalb des Maximum sind.
?? Wenn der eine oder andere Parameter eintrifft, müsste es doch auch in die Beschattung gehen, wenn nur eines zutrifft??
Sprich: Wenn es Tag ist oder Nacht, gehe ich raus => ich gehe immer raus

Oder wo stehe ich auf dem Schlauch??

Wenn alles zur gleichen Zeit eintreffen muss, würde ich dies verUNDen??
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Es gibt in der if-Anweisung drei Bedingungen, welche in Frage kommen,
nElevation < nElevationMin
nAzimut < nAzimutMin
nIntens < nIntensityMin

Eigentlich sollte ide Formatierung keine Rolle spielen, aber zum Testen:

Code: Alles auswählen

val nElevationMin = 0          //  10
val nElevationMax = 300        //  45
val nAzimutMin = 0             // 130
val nAzimutMax = 210           // 210
val nIntensityMin = 0          //  80
val nCloudynessMax = 110       //  40

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    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 Number).floatValue

    var nCloud = 0
    if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
        nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue

    logInfo("shade","Elevation: Min({}) Max({}) aktuell:{}",nElevationMin,nElevationMax,nElevation)
    logInfo("shade","   Azimut: Min({}) Max({}) aktuell:{}",nAzimutMin,nAzimutMax,nAzimut)
    logInfo("shade","Intensity: Min({}) aktuell:{}",nIntensityMin,nIntens)
    logInfo("shade","    Cloud: Max({}) aktuell:{}",nCloudynessMax,nCloud)

    if(nElevation < nElevationMin || nElevation > nElevationMax || nAzimut < nAzimutMin || nAzimut > nAzimutMax || nIntens < nIntensityMin || nCloud > nCloudynessMax) {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
    } else {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(50)
        DGKind.sendCommand(50)
    }
end
Falls das immer noch zu eine Fehlermeldung führt, nehmen wir die if- Anweisung auseinander:

Code: Alles auswählen

val nElevationMin = 0          //  10
val nElevationMax = 300        //  45
val nAzimutMin = 0             // 130
val nAzimutMax = 210           // 210
val nIntensityMin = 0          //  80
val nCloudynessMax = 110       //  40

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    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 Number).floatValue

    var nCloud = 0
    if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
        nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue

    logInfo("shade","Elevation: Min({}) Max({}) aktuell:{}",nElevationMin,nElevationMax,nElevation)
    logInfo("shade","   Azimut: Min({}) Max({}) aktuell:{}",nAzimutMin,nAzimutMax,nAzimut)
    logInfo("shade","Intensity: Min({}) aktuell:{}",nIntensityMin,nIntens)
    logInfo("shade","    Cloud: Max({}) aktuell:{}",nCloudynessMax,nCloud)

    var Boolean bSchatten = true

    logInfo("shade","Vergleich Minimum Elevation")
    if(nElevation < nElevationMin)
        bSchatten = false
    logInfo("shade","Vergleich Maximum Elevation")
    if(nElevation > nElevationMax)
        bSchatten = false
    logInfo("shade","Vergleich Minimum Azimut")
    if(nAzimut < nAzimutMin)
        bSchatten = false
    logInfo("shade","Vergleich Maximum Azimut")
    if(nAzimut > nAzimutMax)
        bSchatten = false
    logInfo("shade","Vergleich Minimum Intensity")
    if(nIntens < nIntensityMin
        bSchatten = false
    logInfo("shade","Vergleich Maximum Bewölkung")
    if(nCloud > nCloudynessMax)
        bSchatten = false

    if(!bSchatten)
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
    } else {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(50)
        DGKind.sendCommand(50)
    }
end
Hier geht es aber nur um die Eingrenzung des Fehlers. openHAB ist durchaus in der Lage, beliebig komplexe Bool'sche Operationen durchzuführen.
wenn der Fehler auftritt, kann man an dem vorhergehenden logeintrag ablesen, wo es geknallt hat.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

int5749 hat geschrieben: 6. Mär 2021 10:41
udo1toni hat geschrieben: 6. Mär 2021 10:26 Das VerODERn ist hier schon in Ordnung, es geht darum, dass die Rollläden nur dann in die Beschattung gehen sollen, wenn alle Parameter oberhalb des Minimum und unterhalb des Maximum sind.
?? Wenn der eine oder andere Parameter eintrifft, müsste es doch auch in die Beschattung gehen, wenn nur eines zutrifft??
Sprich: Wenn es Tag ist oder Nacht, gehe ich raus => ich gehe immer raus

Oder wo stehe ich auf dem Schlauch??

Wenn alles zur gleichen Zeit eintreffen muss, würde ich dies verUNDen??
Schau Dir die Bedingung genau an. Ist das Minimum Azimut unterschritten -> aus
Ist das Maximum Azimut überschritten -> aus
Nur falls der Azimut innerhalb des Bereichs zwischen Minimum und Maximum liegt, trifft keine der beiden Bedingungen zu.
Selbiges gilt für Elevation.
Die beiden Werte Intensity und Bewölkung haben hingegen nur einen Grenzwert, der eine darf nicht unterschritten werden, der andere darf nicht überschritten werden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hallo zusammen,

ich habe das mal so getestet wie von dir Udo beschrieben ohne das auseinandernehmen (wie du es geschrieben hast)
Rule:

Code: Alles auswählen

val nElevationMin = 0          //  10
val nElevationMax = 300        //  45
val nAzimutMin = 0             // 130
val nAzimutMax = 210           // 210
val nIntensityMin = 0          //  80
val nCloudynessMax = 110       //  40

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    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 Number).floatValue

    var nCloud = 0
    if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
        nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue

    logInfo("shade","Elevation: Min({}) Max({}) aktuell:{}",nElevationMin,nElevationMax,nElevation)
    logInfo("shade","   Azimut: Min({}) Max({}) aktuell:{}",nAzimutMin,nAzimutMax,nAzimut)
    logInfo("shade","Intensity: Min({}) aktuell:{}",nIntensityMin,nIntens)
    logInfo("shade","    Cloud: Max({}) aktuell:{}",nCloudynessMax,nCloud)

    if(nElevation < nElevationMin || nElevation > nElevationMax || nAzimut < nAzimutMin || nAzimut > nAzimutMax || nIntens < nIntensityMin || nCloud > nCloudynessMax) {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
    } else {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(50)
        DGKind.sendCommand(50)
    }
end
Danach kam erneut diese Meldung

Code: Alles auswählen

2021-03-06 13:13:29.576 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(0) Max(300) aktuell:34.798164

2021-03-06 13:13:29.581 [INFO ] [org.openhab.core.model.script.shade ] -    Azimut: Min(0) Max(210) aktuell:191.5189

2021-03-06 13:13:29.585 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:323.96976

2021-03-06 13:13:29.589 [INFO ] [org.openhab.core.model.script.shade ] -     Cloud: Max(110) aktuell:0

2021-03-06 13:13:29.602 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'SonnenschutzBüro-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_lessThan(int,int) on instance: null in SonnenschutzBüro
Mit auseinander nehmen der if Anweisungen:
Rule:

Code: Alles auswählen

val nElevationMin = 0          //  10
val nElevationMax = 300        //  45
val nAzimutMin = 0             // 130
val nAzimutMax = 210           // 210
val nIntensityMin = 0          //  80
val nCloudynessMax = 110       //  40

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
    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 Number).floatValue

    var nCloud = 0
    if(LokaleWettervorhersage_Bewolkung.state instanceof Number)
        nCloud = (LokaleWettervorhersage_Bewolkung.state as Number).intValue

    logInfo("shade","Elevation: Min({}) Max({}) aktuell:{}",nElevationMin,nElevationMax,nElevation)
    logInfo("shade","   Azimut: Min({}) Max({}) aktuell:{}",nAzimutMin,nAzimutMax,nAzimut)
    logInfo("shade","Intensity: Min({}) aktuell:{}",nIntensityMin,nIntens)
    logInfo("shade","    Cloud: Max({}) aktuell:{}",nCloudynessMax,nCloud)

    var Boolean bSchatten = true
    
    logInfo("shade","Vergleich Minimum Elevation")
    if(nElevation < nElevationMin)
        bSchatten = false
    logInfo("shade","Vergleich Maximum Elevation")
    if(nElevation > nElevationMax)
        bSchatten = false
    logInfo("shade","Vergleich Minimum Azimut")
    if(nAzimut < nAzimutMin)
        bSchatten = false
    logInfo("shade","Vergleich Maximum Azimut")
    if(nAzimut > nAzimutMax)
        bSchatten = false
    logInfo("shade","Vergleich Minimum Intensity")
    if(nIntens < nIntensityMin)
        bSchatten = false
    logInfo("shade","Vergleich Maximum Bewölkung")
    if(nCloud > nCloudynessMax)
        bSchatten = false

    if (!bSchatten)
    {    logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
    } 
    else {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(50)
        DGKind.sendCommand(50)
    }
end
Im Logging dann folgende Meldung:

Code: Alles auswählen

2021-03-06 13:23:29.585 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(0) Max(300) aktuell:34.431168

2021-03-06 13:23:29.591 [INFO ] [org.openhab.core.model.script.shade ] -    Azimut: Min(0) Max(210) aktuell:194.50963

2021-03-06 13:23:29.594 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:318.32755

2021-03-06 13:23:29.598 [INFO ] [org.openhab.core.model.script.shade ] -     Cloud: Max(110) aktuell:0

2021-03-06 13:23:29.602 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Elevation

2021-03-06 13:23:29.607 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Elevation

2021-03-06 13:23:29.612 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Azimut

2021-03-06 13:23:29.617 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Azimut

2021-03-06 13:23:29.622 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Intensity

2021-03-06 13:23:29.626 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'SonnenschutzBüro-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_lessThan(int,int) on instance: null in SonnenschutzBüro

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

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Ich muss noch dazu sagen das eine Klammer und eine geschweifte Klammer gefehlt hatten und ich ergänzt habe.

Code: Alles auswählen

    logInfo("shade","Vergleich Maximum Bewölkung")
    if(nCloud > nCloudynessMax) // Klammer gefehlt
        bSchatten = false

    if(!bSchatten)
    {  logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")
    } else { //Klammer gefehlt
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(50)
        DGKind.sendCommand(50)
Mein nächster Versuch war dann die items auf reine number umzustellen.
Aber ebenso mit dem selben Logging.

Code: Alles auswählen

2021-03-06 13:48:29.561 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(0) Max(300) aktuell:33.157375

2021-03-06 13:48:29.566 [INFO ] [org.openhab.core.model.script.shade ] -    Azimut: Min(0) Max(210) aktuell:201.83891

2021-03-06 13:48:29.570 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:298.73486

2021-03-06 13:48:29.574 [INFO ] [org.openhab.core.model.script.shade ] -     Cloud: Max(110) aktuell:0

2021-03-06 13:48:29.578 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Elevation

2021-03-06 13:48:29.583 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Elevation

2021-03-06 13:48:29.588 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Azimut

2021-03-06 13:48:29.593 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Azimut

2021-03-06 13:48:29.598 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Intensity

2021-03-06 13:48:29.602 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'SonnenschutzBüro-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_lessThan(int,int) on instance: null in SonnenschutzBüro

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

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

udo1toni hat geschrieben: 6. Mär 2021 10:48 Schau Dir die Bedingung genau an. Ist das Minimum Azimut unterschritten -> aus
Ist das Maximum Azimut überschritten -> aus
Nur falls der Azimut innerhalb des Bereichs zwischen Minimum und Maximum liegt, trifft keine der beiden Bedingungen zu.
Selbiges gilt für Elevation.
Die beiden Werte Intensity und Bewölkung haben hingegen nur einen Grenzwert, der eine darf nicht unterschritten werden, der andere darf nicht überschritten werden.
Ahhh, der Teufel liegt im Detail. OK, so wird dann auch für mich ein Schuh daraus.
Das zeigt wieder => viele Wege führen nach Rom :D
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

Markus_JE hat geschrieben: 6. Mär 2021 13:48 Mein nächster Versuch war dann die items auf reine number umzustellen.
Aber ebenso mit dem selben Logging.
Das zusätzliche Logging zeigt ja deutlich, das der Vergleich der Bewölkung fehl schlägt.

Evtl. magst Du mal das Item dazu posten? Oder gerne alle verwendeten Items??

Wie gesagt: Bei mir läuft die Rule mit den von mir angegebenen Items ohne Fehler durch.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Hallo Zuassmmen,

sobald ich dazu komme poste ich meine items sehr gerne!!

Vielen Dank euch für die Unterstützung!!

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

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Nein, es schlägt der Vergleich der Sonnenintensität fehl.

Code: Alles auswählen

2021-03-06 13:48:29.598 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Intensity

2021-03-06 13:48:29.602 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'SonnenschutzBüro-1' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_lessThan(int,int) on instance: null in SonnenschutzBüro
lessThan ist ja das kleiner als, damit fällt der Bewölkungsgrad eh hinten runter.

Warum der Vergleich allerdings fehlschlägt, ist mir erst mal nicht klar. Du kannst versuchen (so komisch das klingt) die beiden Werte zu vertauschen, also statt

Code: Alles auswählen

    if(nIntens < nIntensityMin)
schreibst Du

Code: Alles auswählen

    if(nIntensityMin > nIntens)
Wenn danach der Fehler weg ist, handelt es sich um einen Typumwandlungsfehler. Der erste Parameter gibt den Typ vor.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

udo1toni hat geschrieben: 7. Mär 2021 01:16 Nein, es schlägt der Vergleich der Sonnenintensität fehl.
Da war er wieder der Teufel des Details, das Logging kommt ja VOR dem Vergleich :?
udo1toni hat geschrieben: 7. Mär 2021 01:16 Warum der Vergleich allerdings fehlschlägt, ist mir erst mal nicht klar. Du kannst versuchen (so komisch das klingt) die beiden Werte zu vertauschen, also statt

Code: Alles auswählen

    if(nIntens < nIntensityMin)
schreibst Du

Code: Alles auswählen

    if(nIntensityMin > nIntens)
Wenn danach der Fehler weg ist, handelt es sich um einen Typumwandlungsfehler. Der erste Parameter gibt den Typ vor.
Was über die fehlenden Items ersichtlich hätte werden können :roll: und erklären würde, warum es bei mir mit einfachen Number-Items funktioniert.
Markus ja geschrieben hatte, er hätte es auch schon mit einfachen Number-Items getestet.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten