Jalousien nach Sonnenstand

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
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 wie Udo beschrieben hat geändert.


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(nIntensityMin > nIntens)              //(nIntens < nIntensityMin) Vergleich Falsch -> Typenumwandlung?
        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
Meine items aaus der jsondb da ich keine Textfiles habe.
Direkte Sonneneinstrahlung:

Code: Alles auswählen

  "LokaleSonnendaten_DirekteStrahlung": {
    "class": "org.openhab.core.items.ManagedItemProvider$PersistedItem",
    "value": {
      "groupNames": [
        "LokaleSonnendaten"
      ],
      "itemType": "Number",
      "tags": [
        "Point"
      ],
      "label": "Direkte Strahlung",
      "category": ""
Azimut:

Code: Alles auswählen

  "LokaleSonnendaten_Azimut": {
    "class": "org.openhab.core.items.ManagedItemProvider$PersistedItem",
    "value": {
      "groupNames": [
        "LokaleSonnendaten"
      ],
      "itemType": "Number",
      "tags": [
        "Point"
      ],
      "label": "Azimut",
      "category": ""
Elevation:

Code: Alles auswählen

  "LokaleSonnendaten_Position_Elevation": {
    "class": "org.openhab.core.items.ManagedItemProvider$PersistedItem",
    "value": {
      "groupNames": [
        "LokaleSonnendaten"
      ],
      "itemType": "Number",
      "tags": [
        "Point"
      ],
      "label": "Elevationswinkel",
      "category": ""
Bewölkung:

Code: Alles auswählen

  "LokaleWettervorhersage_Bewolkung": {
    "class": "org.openhab.core.items.ManagedItemProvider$PersistedItem",
    "value": {
      "groupNames": [
        "Internet_Wetter"
      ],
      "itemType": "Number",
      "tags": [
        "Measurement"
      ],
      "label": "Bewölkung",
      "category": "sun_clouds"
Logging:

Code: Alles auswählen

  
2021-03-07 11:42:11.634 [INFO ] [org.openhab.core.model.script.shade ] - Elevation: Min(0) Max(300) aktuell:34.56112

2021-03-07 11:42:11.658 [INFO ] [org.openhab.core.model.script.shade ] -    Azimut: Min(0) Max(210) aktuell:163.86551

2021-03-07 11:42:11.666 [INFO ] [org.openhab.core.model.script.shade ] - Intensity: Min(0) aktuell:320.15662

2021-03-07 11:42:11.671 [INFO ] [org.openhab.core.model.script.shade ] -     Cloud: Max(110) aktuell:0

2021-03-07 11:42:11.674 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Elevation

2021-03-07 11:42:11.679 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Elevation

2021-03-07 11:42:11.683 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Azimut

2021-03-07 11:42:11.688 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Maximum Azimut

2021-03-07 11:42:11.693 [INFO ] [org.openhab.core.model.script.shade ] - Vergleich Minimum Intensity

2021-03-07 11:42:11.697 [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_greaterThan(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 »

Markus_JE hat geschrieben: 6. Mär 2021 13:48

Code: Alles auswählen

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
Jetzt habe ich heute Morgen auch diese Meldung auf meinem Test-System
udo1toni hat geschrieben: 7. Mär 2021 01:16 Warum der Vergleich allerdings fehlschlägt, ist mir erst mal nicht klar. ...
VSC hat mir folgenden Fehler ausgegeben
Type mismatch: cannot convert from float to int(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
Nach ein wenig Google habe ich dies wie folgt geändert

Zeile

Code: Alles auswählen

nIntens = (LokaleSonnendaten_DirekteStrahlung.state as Number).floatValue
wurde zu

Code: Alles auswählen

nIntens = (LokaleSonnendaten_DirekteStrahlung.state as DecimalType).intValue
Damit war der Fehler bei meinem Test-System wieder beseitigt
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 »

Hi zusammen,

Habe das mal so abgeändert
und bums fahren die Rollläden herunter.
Muss ich das verstehen? Mein item ist vom Typ number aber es wird DecimalType benötigt?

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

Re: Jalousien nach Sonnenstand

Beitrag von Markus_JE »

Wenn ich jetzt vor das Ganze einen Hauptschalter einbauen möchte wo sollte dieser denn dann hin?
Der Hauptschalter ist als item angelegt und heisst Sonnenschutz_Aktiv.

Aktuelle Regel:

Code: Alles auswählen

val nElevationMin = 10          //  10
val nElevationMax = 45        //  45
val nAzimutMin = 130             // 130
val nAzimutMax = 210           // 210
val nIntensityMin = 80          //  80
val nCloudynessMax = 40       //  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 DecimalType).intValue //Änderung nach Int5749
		//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

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

Re: Jalousien nach Sonnenstand

Beitrag von int5749 »

Markus_JE hat geschrieben: 7. Mär 2021 12:33 Wenn ich jetzt vor das Ganze einen Hauptschalter einbauen möchte wo sollte dieser denn dann hin?
Der Hauptschalter ist als item angelegt und heisst Sonnenschutz_Aktiv.
Ich würde dies analog wie in meinem Post zur Sonnenautomatik über mehrere Seiten, wie von Udo empfohlen lösen, damit die Rule nicht unnötigt komplett abgearbeitet wird

Code: Alles auswählen

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

    if(!(LokaleSonnendaten_Position_Elevation.state instanceof Number)) {

und ab hier der ganze Rest!
Sprich: Wenn der Schalter nicht ON ist, wird die Rule beendet
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 zusammen,

viele herzlichen Dank erst mal.
Der vollständigkeitshalber die Rule wie sie bei mir läuft.

Code: Alles auswählen

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

rule "Beschattung"
when
    Item LokaleSonnendaten_Position_Elevation changed
then
	if(Sonnenschutz_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 //Änderung nach Int5749
		//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) //false bSchatten negiert
    {  logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung aus!")

    } else {
        logInfo("shade","Rolladen Büro und Kinderzimmer Beschattung an!")
        DGBuero.sendCommand(32)
        DGKind.sendCommand(32)
    }
end

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

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

ok, nachdem nun klar ist, dass openHAB den Vergleich an dieser Stelle nicht zwischen int und float wandeln will (was ja nun vollkommen unlogisch ist, denn bei Elevation und Azimut zickt es ja auch nicht rum) kannst Du den Vergleich auch wieder zurück bauen in die ursprüngliche Form ohne die ganzen log Befehle. Zum finden des Fehlers war das ok, im laufenden Betrieb ist das komplett unsinnig :)
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 Udo,

habe ich abgeändert. Vielen Dank für eure Hilfe!! Das Forum ist wirklich super als Support.
Jetzt würde ich aber gerne das Ganze wie ursprünglich mit meinen Jalousien machen. Nur nicht über die Szene sondern die Jalousien auf eine Soll Position fahren und danach die Lamellen verstellen. Ich denke das wird etwas Tricky werden.
Könntet ihr mir dabei nochmals helfen?
Richtig cool wäre natürlich wenn der Sonnenschutz nicht mehr greifen würde wenn eine der Jalousien manuell verstellt wurde.

Die Rule nun wie sie Stand heute für die Jalousien umgeschrieben habe:

Code: Alles auswählen

val nElevationMin = 15         
val nElevationMax = 65      
val nAzimutMin = 150            
val nAzimutMax = 260         
val nIntensityMin = 150
val nCloudynessMax = 40      

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 //Änderung nach Int5749
		//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","Jalousien Wohn/Esszimmer Beschattung aus!")
    } else {
        logInfo("shade","Jalousien Wohn/Esszimmer Beschattung an!")
        EGBlumenfenster.sendCommand(69)
        EGBalkontuere.sendCommand(47)
		EGTerassentuere.sendCommand(47)
		EGWohnzimmer.sendCommand(84)
    }
	
end
Meine items für die Lamellen lauten:

Code: Alles auswählen

KNXDeviceJalousieaktor1126_BalkontureLamellen vom Typ Dimmer
KNXDeviceJalousieaktor1126_BlumenfensterLamellen vom Typ Dimmer
KNXDeviceJalousieaktor1126_TerassentureLamellen vom Typ Dimmer
KNXDeviceJalousieaktor1126_WohnzimmerLamellen vom Typ Dimmer

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

Re: Jalousien nach Sonnenstand

Beitrag von udo1toni »

Was die Fahrt "nur wenn nicht manuell verfahren" betrifft, so wäre eine einfache Möglichkeit, alles über einer bestimmten Höhe als "unbewegt" anzusehen. z.B. so:

Code: Alles auswählen

val nElevationMin = 15         
val nElevationMax = 65      
val nAzimutMin = 150            
val nAzimutMax = 260         
val nIntensityMin = 150
val nCloudynessMax = 40      

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)
    }
end
Für die Lamellenfahrt gibt es verschiedene Optionen. Man könnte einfach eine gewisse Zeit warten, nach der sicher alle Jalousien die korrekt Höhe erreicht haben (also die Zeit, die gebraucht wird, dass die Jalousie mit der längsten Fahrzeit von 0 bis Sollposition fährt) und anschließend die Jalousien kippen, die in der Sollposition sthen.
Man könnte auch schauen, ob der Aktor die Position beim stoppen rückmeldet. Ist das der Fall, so kann man per Metadaten (OH3) bzw. als Zusatzparameter bei der Itemdefinition dafür sorgen, dass der Status nur vom Channel übernommen wird, aber nicht aktiv von openHAB gesetzt wird, wenn ein Fahrbefehl gesendet wird (das wäre das normale Verhalten...) Dann könnte man bei Erreichen der Sollposition direkt die Lamellen kippen lassen.

Im Übrigen bietet es sich an, die Itemnamen ein wenig aufeinander abzustimmen. Dann könnte man mit einer Hashmap und zwei Gruppen sämtliche Jalousien steuern.
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 »

Hi Udo,

wäre das dann so machbar?
Wenn die Voraussetzungen erfüllt dann warte 150 sek. und verstelle dann die Lamellen.
Rule:

Code: Alles auswählen

val nElevationMin = 15         
val nElevationMax = 65      
val nAzimutMin = 150            
val nAzimutMax = 260         
val nIntensityMin = 150
val nCloudynessMax = 40      

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)
		
		Thread::sleep(150) 
		
		KNXDeviceJalousieaktor1126_BalkontureLamellen.sendCommand(50)
		KNXDeviceJalousieaktor1126_BlumenfensterLamellen.sendCommand(50)
		KNXDeviceJalousieaktor1126_TerassentureLamellen.sendCommand(50)
		KNXDeviceJalousieaktor1126_WohnzimmerLamellen.sendCommand(50)
			
    }
	
end


Antworten