Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
b3luga
Beiträge: 2
Registriert: 24. Aug 2020 11:48

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von b3luga »

So wie die aktuelle Version verstehe, ist das Ziel die Verschattung im Frühling und Sommer. Im Herbst und Winter greifen die Regeln nicht, korrekt?

Im Herbst/Winter sollte es darum gehen den Wärmeverlust zu minimieren. Daher würde ich meine Dachfensterrolläden nachts runterfahren bzw. wenn niemand zu Hause ist. So der Plan. ;)

Bin leider noch nicht einmal dazu gekommen die aktuelle Verschattungsautomatik auf mein System zu übertragen, aber der Winter ist ja noch etwas hin.

HansDampf
Beiträge: 34
Registriert: 23. Jul 2020 15:01
Answers: 1

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von HansDampf »

hat schon jemand auf OH3 umgestellt und bekommt den selben Fehler?

Code: Alles auswählen

2021-03-29 16:01:34.927 [WARN ] [b.core.model.script.actions.BusEvent] - Cannot convert '2021-03-28T16:01:34.922715+02:00[Europe/Berlin]' to a state type which item 'AutoShading_Start_last' accepts: [DateTimeType, UnDefType].
2021-03-29 16:01:34.938 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Verschattung für Rollläden WEST
2021-03-29 16:01:34.946 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Grenzwert wurden erreicht, Rollladen werden geschlossen
2021-03-29 16:01:34.948 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Fahre Rollladen (EG_Jalousie_Essen_Tuere_West) auf (100) %
2021-03-29 16:01:34.951 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Rollladen ist bereits weiter geschlossen (75%) als er geschlossen werden sollte und wird daher ignoriert
2021-03-29 16:01:34.952 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'shutter-1' failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter
Vermutlich zielt es auf folgenden Code:

Code: Alles auswählen

AutoShading_Start_last.postUpdate(now.toString()
oder 
AutoShading_Start_last.postUpdate(now.minusDays(1).toString()

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von int5749 »

HansDampf hat geschrieben: 30. Mär 2021 15:48
Vermutlich zielt es auf folgenden Code:

Code: Alles auswählen

AutoShading_Start_last.postUpdate(now.toString()
oder 
AutoShading_Start_last.postUpdate(now.minusDays(1).toString()
Bei den Zeilen ist eine ( zu viel am Ende?
Ist dies ein Copy/Paste Fehler??

Code: Alles auswählen

AutoShading_Start_last.postUpdate(now.toString)
oder 
AutoShading_Start_last.postUpdate(now.minusDays(1).toString)

Ansonsten behandelt OH3 die Zeit anders (dazu gibt es hier einige threats), da müssten ggfs einige Rules umgestellt werden.

Viele Grüße
Zuletzt geändert von int5749 am 30. Mär 2021 16:06, insgesamt 1-mal geändert.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

HansDampf
Beiträge: 34
Registriert: 23. Jul 2020 15:01
Answers: 1

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von HansDampf »

int5749 hat geschrieben: 30. Mär 2021 16:03
HansDampf hat geschrieben: 30. Mär 2021 15:48
Vermutlich zielt es auf folgenden Code:

Code: Alles auswählen

AutoShading_Start_last.postUpdate(now.toString()
oder 
AutoShading_Start_last.postUpdate(now.minusDays(1).toString()
Bei den Zeilen fehlt ein ) am Ende?
Ist dies ein Copy/Paste Fehler??

Ansonsten behandelt OH3 die Zeit anders (dazu gibt es hier einige threats), da müssten ggfs einige Rules umgestellt werden.

Viele Grüße
Ja, ist ein c&p Fehler. Ok, dann werde ich da mal schauen. Es wäre dann sinnvoll ein Update der Rule einzustellen.

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von int5749 »

HansDampf hat geschrieben: 30. Mär 2021 16:05 Es wäre dann sinnvoll ein Update der Rule einzustellen.
Klingt gut. Evtl. postest Du dann Dein Ergebnis? ;)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

HansDampf
Beiträge: 34
Registriert: 23. Jul 2020 15:01
Answers: 1

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von HansDampf »

int5749 hat geschrieben: 30. Mär 2021 16:19
HansDampf hat geschrieben: 30. Mär 2021 16:05 Es wäre dann sinnvoll ein Update der Rule einzustellen.
Klingt gut. Evtl. postest Du dann Dein Ergebnis? ;)
Wenn ich es gebacken bekomme ;)

eagledata
Beiträge: 2
Registriert: 20. Feb 2021 14:00

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von eagledata »

HansDampf hat geschrieben: 30. Mär 2021 15:48 hat schon jemand auf OH3 umgestellt und bekommt den selben Fehler?

Vermutlich zielt es auf folgenden Code:

Code: Alles auswählen

AutoShading_Start_last.postUpdate(now.toString()
oder 
AutoShading_Start_last.postUpdate(now.minusDays(1).toString()
Ich hab auch schon geupdated und hatte das selbe Problem.
Ich hab es auf folgende Variante umgestellt und es funktioniert:

Code: Alles auswählen

AutoShading_End_last.postUpdate(new DateTimeType())
bzw. wenn es mit dem minusDay ist:

Code: Alles auswählen

AutoShading_Start_last.postUpdate(new DateTimeType(now.minusDays(1)))

winni
Beiträge: 62
Registriert: 30. Mär 2019 00:24

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von winni »

Kannst DU evtl. mal deine ganze Rule zur Verfügung stellen?
Trotz der Änderungen habe ich das Problem, dass die Rule nach 5 min wieder startet, ich eine Pushnachricht bekomme und wieder ein Kommand an meine Rolladen geschickt wird obwohl die Rule schon einmal gelaufen ist. Ich vermute, dass es immer noch an meinem Datetime item liegt. In OH 2 hat lief die Rule ohne Probleme.
Hier mal meine Komplette Rule:

Code: Alles auswählen

var boolean log = true
rule "Rollos Süd abfahren"
when Item LokaleSonnendaten_Azimut changed
then
    val String logPrefix = 'Rolloautomatik (Rollo Süd ab) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')
    
    var String timeLast = 'xxxx-xx-xx'
    if (RolloAutomatikSuedStartLast.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLast = RolloAutomatikSuedStartLast.state.toString().substring(0,10)
    }
	var String timeNow = now.toString().substring(0,10)

    if (RolloautomatikSued.state == ON) {
        if (timeNow != timeLast) {
            //if (LokaleSonnendaten_Azimut.state > Integer::parseInt(RolloAutomatikSuedAzimuthStart.state.toString())) 
            if ((LokaleSonnendaten_Azimut.state as Number).floatValue > (RolloAutomatikSuedAzimuthStart.state as Number))
{
                //if (XiaomiHumidityPressureGarten_Temperature.state > Integer::parseInt(RolloAutomatikSuedTempMin.state.toString())) 
                  if ((XiaomiHumidityPressureGarten_Temperature.state as Number).floatValue > (RolloAutomatikSuedTempMin.state as Number)) 
{
                    //if (Localweatherandforecast_Bewolkung.state  <= Integer::parseInt(RolloAutomatikSuedWolkenMax.state.toString())) 
                      if ((Localweatherandforecast_Bewolkung.state as Number).floatValue  <= (RolloAutomatikSuedWolkenMax.state as Number))
                  { 
                    //if (LokaleSonnendaten_Position_Elevation.state > Integer::parseInt(RolloAutomatikSuedElevationEnde.state.toString())) 
                      if ((LokaleSonnendaten_Position_Elevation.state as Number).floatValue > (RolloAutomatikSuedElevationEnde.state as Number))
{
                            // Rollos runterfahren
                            if (log) logInfo('rules', logPrefix + 'Rollos werden abgefahren')
                            RollosSued.members.forEach[i|
                                if (i.state <= Integer::parseInt(RolloAutomatikZielwert.state.toString())) {
                                    if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + RolloAutomatikZielwert.state.toString() + '%: ' + i.name)
                                    i.sendCommand(Integer::parseInt(RolloAutomatikZielwert.state.toString()))
                                } else {
                                    if (log) logInfo('rules', logPrefix + 'Rolladen ist bereits weiter geschlossen (' + i.state.toString() + '%) als er geschlossen werden sollte und wird daher ignoriert')
                                }
                            ]
                            // Letzte Ausführung mit entsprechendem Zeitstempel belegen
                            sendBroadcastNotification("Verschattung Südseite aktiv") //Pushnachricht
                            RolloAutomatikSuedStartLast.postUpdate(new DateTimeType(now.minusDays(1)))
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Elevation für wieder abfahren (' + RolloAutomatikSuedElevationEnde.state.toString() + ') ist groesser als aktuelle (' + LokaleSonnendaten_Position_Elevation.state.toString() + ')')
                        }
                    } else {
                        if (log) logInfo('rules', logPrefix + 'Mindestbewoelkung (' + RolloAutomatikSuedWolkenMax.state.toString() + ') wurde unterschritten (' + Localweatherandforecast_Bewolkung.state.toString() + ')')
                    }
                } else {
                    if (log) logInfo('rules', logPrefix + 'Mindest-Temperatur (' + RolloAutomatikSuedTempMin.state.toString() + ') wurde nicht erreicht durch aktuelle Temperatur (' + XiaomiHumidityPressureGarten_Temperature.state.toString() + ')')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Azimuth (' + LokaleSonnendaten_Azimut.state.toString() + ') hat noch nicht Schwellwert (rolloautomatik_azimuth_start.state.toString()) erreicht')
            }
        } else {
            if (log) logInfo('rules', logPrefix + 'Automatik heute bereits einmal gelaufen, wird daher ignoriert')
        }
    } else {
         if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end

rule "Rollo Süd wieder öffnen"
when Item LokaleSonnendaten_Position_Elevation changed
then
    val String logPrefix = 'Rolloautomatik (Rollo Süd hoch) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')

    var String timeLastEnde = 'xxxx-xx-xx'
    if (RolloAutomatikSuedEndeLast.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLastEnde = RolloAutomatikSuedEndeLast.state.toString().substring(0,10)
    }

    var String timeLastStart = 'yyyy-yy-yy'
    if (RolloAutomatikSuedStartLast.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLastStart = RolloAutomatikSuedStartLast.state.toString().substring(0,10)
    }

	var String timeNow = now.toString().substring(0,10)


    if (RolloAutomatikSuedOeffnen.state == ON) {
        //if (LokaleSonnendaten_Position_Elevation.state <= Integer::parseInt(RolloAutomatikSuedElevationEnde.state.toString())) 
        if ((LokaleSonnendaten_Position_Elevation.state as Number).floatValue <= (RolloAutomatikSuedElevationEnde.state as Number))
{
            if (timeLastStart == timeNow) {
                if (timeLastEnde != timeNow) {
                    // Rollos wieder hoch
                    if (log) logInfo('rules', logPrefix + 'Rollos werden hinaufgefahren')
                    RollosSued.members.forEach[i|
                        if((RolloAutomatikZielwert.state as Number).intValue <= (i.state as Number).intValue +5 && (RolloAutomatikZielwert.state as Number).intValue >= (i.state as Number).intValue -5) {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf 0%: ' + i.name)
                            i.sendCommand(0)
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde: ' + i.name)
                        }
                    ]
                    // Letzte Ausführung mit entsprechendem Zeitstempel belegen
                    sendBroadcastNotification("Verschattung Südseite beendet") //Pushnachricht
                    RolloAutomatikSuedEndeLast.postUpdate(new DateTimeType())
                } else {
                    if (log) logInfo('rules', logPrefix + 'Beende, da heute bereits ein automatisches Wiederhochfahren stattfand')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Beende, da heute noch keine Ausführung stattfand. Demzufolge kann auch kein automatisches Öffnen gewollt sein')
            }
        } else {
            if (log) logInfo('rules', logPrefix + 'Beende, da Elevation (' + LokaleSonnendaten_Position_Elevation.state.toString() + ') nicht  kleiner der eingestellten Elevation (' + RolloAutomatikSuedElevationEnde.state.toString()+ ') war')
        }
    } else {
        if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von udo1toni »

winni hat geschrieben: 10. Apr 2021 23:14 Kannst DU evtl. mal deine ganze Rule zur Verfügung stellen?
Trotz der Änderungen habe ich das Problem, dass die Rule nach 5 min wieder startet, ich eine Pushnachricht bekomme und wieder ein Kommand an meine Rolladen geschickt wird obwohl die Rule schon einmal gelaufen ist. Ich vermute, dass es immer noch an meinem Datetime item liegt. In OH 2 hat lief die Rule ohne Probleme.
Den letzten Satz kann ich so nicht glauben.
Dein Problem ist, dass Du in der letzten Zeile den Datumsstempel auf den Vortag setzt (minusDays(1)) womit dann die Abbruchbedingung nicht mehr wirken kann.

Insgesamt schreit diese Rule nach Codeumstellungen. Statt

Code: Alles auswählen

if(bla) {
// do something
} else {
// do nothing but a log
}
kannst Du schreiben

Code: Alles auswählen

if(!bla) {
// do nothing but a log
return;
}
// do something
also mit konkretem Code, statt:

Code: Alles auswählen

    if (RolloautomatikSued.state == ON) {
    [...]
    } else {
         if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
schreibst Du

Code: Alles auswählen

    if (RolloautomatikSued.state != ON) {
        if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
        return;
    }
    [...]
Damit werden die Indentations Deiner Rule extrem verringert. return; bricht die laufende Rule unmittelbar ab. Das ; am Ende ist in diesem Fall wichtig, da return gewöhnlich einen Rückgabewert liefert, der aber von der DSL nicht ausgegeben werden kann.

Weiterhin weise ich immer wieder gerne darauf hin, dass das Konstrukt if(log) logInfo() kompletter Bullshit ist.
Der in openHAB integrierte Logger ist extrem mächtig. Man kann mit Leichtigkeit die Ausgabe der Logmeldungen im laufenden Betrieb(!) ein- und ausschalten - im Gegensatz zum Konstrukt mit der globalen boolean Variable, die nur mit Umwegen im laufenden Betrieb verändert werden kann
(indem man sie per Rule umschaltet)
Im Gegensatz zur globalen Variable ist es auch kein Problem, gezielt nur bestimmte Logmeldungen zu (de-)aktivieren.
Es gibt zum einen verschiedene Log Level (Debug, Info, Warn, Error, gelistet in ansteigender Reihenfolge der Wichtigkeit), zum anderen gibt es beliebig viele Logger. Dabei hat jeder Logger einen Namen, der in den Logbefehlen (z.B. logInfo()) als erster String angegeben werden muss. Statt dort also ein nichtssagendes rules hin zu schreiben, wäre es sinnvoller, einen kurzen Namen zu setzen und diesen innerhalb der Rule (oder der Gruppe von Rules) beizubehalten, im vorliegenden Fall z.B. autoShutter. Alle Logbefehle in der Rules DSL sind hierarchisch unterhalb des Loggers org.openhab.core.automation.module.script. angesiedelt, der vollständige Loggername wäre in diesem Fall also org.openhab.core.automation.module.script.autoShutter. Mit diesem Namen lässt sich das Logging dann gezielt ein- und ausschalten.

Die Logbefehle beherrschen Substitution, das heißt, sie können einen entsprechend vorbereiteten String mit Variablen ergänzen. Statt

Code: Alles auswählen

logInfo('rules', logPrefix + 'Azimuth (' + LokaleSonnendaten_Azimut.state.toString() + ') hat noch nicht Schwellwert (' + rolloautomatik_azimuth_start.state.toString() + ') erreicht')
kann man einfach

Code: Alles auswählen

logInfo('rules', logPrefix + 'Azimuth ({}) hat noch nicht Schwellwert ({}) erreicht', LokaleSonnendaten_Azimut.state,rolloautomatik_azimuth_start.state)
schreiben. Um die Typwandlung kümmert sich die Substitution automatisch (bei Float Werten könnte es allerdings sein, dass man die Anzahl der Kommastellen begrenzen möchte).

Du hast an verschiedenen Stellen absurde Konstrukte in Deiner Rule, Integer::parseInt(RolloAutomatikZielwert.state.toString()) Ernsthaft? Du wandelst einen Status eines Number Items in einen String, um ihn anschließend nach Integer parsen zu lassen?

Weiterhin werden immer beide Rules zeitgleich ausgeführt, obwohl sie unterschiedliche Trigger verwenden. Da gäbe es sicher noch Verbesserungspotential. Die Idee, einen Datumsstempel zu verwenden, um zu entscheiden, ob die Rule bereits gelaufen ist, ist ok, ich vermute mal, Du stellst diese Information in der UI dar? Ansonsten wäre ein einfacherer Ansatz, eine globale Boolean Variable dafür zu nutzen. Diese wird dann um Mitternacht auf false gesetzt und bei Verschattung bzw. bei Aufhebung der Verschattung auf true . Damit sparst Du Dir eine Menge Codebalast. Einen Datumsstempel kannst Du dennoch verwenden, dann halt nur für die Anzeige.

Hier mal Deine Rules mit eingearbeiteten Änderungen (nicht getestet)

Code: Alles auswählen

var Boolean bShadeStart = false
var Boolean bShadeEnd = false

rule "reset some vars"
when
    Time is midnight
then
    bShadeStart = false
    bShadeEnd = false
end

rule "Rollos Süd abfahren"
when 
    Item LokaleSonnendaten_Azimut changed
then
    logDebug('autoShutter', 'Regel (Rollo Süd runter) wurde gestartet')

    if(RolloautomatikSued.state != ON) {
        logDebug('autoShutter', 'Beende, da Automatik generell nicht aktiv')
        return;
    }
    if(bShadeStart) {
        logDebug('autoShutter', 'Automatik heute bereits einmal gelaufen, wird daher ignoriert')
        return;
    }
    if((LokaleSonnendaten_Azimut.state as Number).floatValue < (RolloAutomatikSuedAzimuthStart.state as Number)) {
        logDebug('autoShutter', 'Azimuth ({}) hat noch nicht Schwellwert ({}) erreicht',LokaleSonnendaten_Azimut.state,RolloAutomatikSuedAzimuthStart.state)
        return;
    }
    if((XiaomiHumidityPressureGarten_Temperature.state as Number).floatValue < (RolloAutomatikSuedTempMin.state as Number)) {
        logDebug('autoShutter', 'Mindest-Temperatur ({}) wurde nicht erreicht durch aktuelle Temperatur ({})',RolloAutomatikSuedTempMin.state,XiaomiHumidityPressureGarten_Temperature.state)
        return;
    }
    if((Localweatherandforecast_Bewolkung.state as Number).floatValue  > (RolloAutomatikSuedWolkenMax.state as Number)) {
        logDebug('autoShutter', 'Maximalbewölkung ({}) wurde überschritten ({})',RolloAutomatikSuedWolkenMax.state,Localweatherandforecast_Bewolkung.state)
        return;
    }
    if((LokaleSonnendaten_Position_Elevation.state as Number).floatValue < (RolloAutomatikSuedElevationEnde.state as Number)) {
        logDebug('autoShutter', 'Elevation für wieder abfahren ({}) ist groesser als aktuelle ({})',RolloAutomatikSuedElevationEnde.state,LokaleSonnendaten_Position_Elevation.state)
        return;
    }
    // Rollos runterfahren
    logDebug('autoShutter', 'Rollos werden abgefahren')
    val nZiel = RolloAutomatikZielwert.state as Number
    RollosSued.members.forEach[i|
        if(i.state <= nZiel) {
            logDebug('autoShutter', 'Fahre Rolladen {} auf {}%'i.name,nZiel)
            i.sendCommand(nZiel)
        } else {
            logDebug('autoShutter', 'Rolladen ist bereits weiter geschlossen ({}%) als er geschlossen werden sollte und wird daher ignoriert',i.state)
        }
    ]
    // Letzte Ausführung mit entsprechendem Zeitstempel belegen
    sendBroadcastNotification("Verschattung Südseite aktiv") //Pushnachricht
    bShadeStart = true
    RolloAutomatikSuedStartLast.postUpdate(new DateTimeType(now))
end

rule "Rollo Süd wieder öffnen"
when 
    Item LokaleSonnendaten_Position_Elevation changed
then
    val String logPrefix = 'Rolloautomatik  - '
    logDebug('autoShutter', 'Regel (Rollo Süd hoch) wurde gestartet')

    if(RolloAutomatikSuedOeffnen.state != ON) {
        logDebug('autoShutter', 'Beende, da Automatik generell nicht aktiv')
        return;
    }
    if((LokaleSonnendaten_Position_Elevation.state as Number).floatValue > (RolloAutomatikSuedElevationEnde.state as Number)) {
        logDebug('autoShutter', 'Beende, da Elevation ({}) nicht kleiner der eingestellten Elevation ({}) war',LokaleSonnendaten_Position_Elevation.state,RolloAutomatikSuedElevationEnde.state)
        return;
    }
    if(!bShadeStart) {
        logDebug('autoShutter', 'Beende, da heute noch keine Ausführung stattfand. Demzufolge kann auch kein automatisches Öffnen gewollt sein')
        return;
    }
    if(bShadeEnd) {
        logDebug('autoShutter', 'Beende, da heute bereits ein automatisches Wiederhochfahren stattfand')
        return;
    }
    // Rollos wieder hoch
    logDebug('autoShutter', 'Rollos werden hinaufgefahren')
    val nZiel = RolloAutomatikZielwert.state as Number
    RollosSued.members.forEach[i|
        if(nZiel <= (i.state as Number) +5 && nZiel >= (i.state as Number) -5) {
            logDebug('autoShutter', 'Fahre Rolladen {} auf 0%',i.name)
            i.sendCommand(0)
        } else {
            logDebug('autoShutter', 'Fahre Rolladen {} nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde.',i.name)
        }
    ]
    // Letzte Ausführung mit entsprechendem Zeitstempel belegen
    sendBroadcastNotification("Verschattung Südseite beendet") //Pushnachricht
    RolloAutomatikSuedEndeLast.postUpdate(new DateTimeType())
    bShadeEnd = true
end
Das Logging ist per default abgeschaltet, Einschalten geht über die Karaf Konsole, welche Du mit

Code: Alles auswählen

openhab-cli console
aufrufen kannst.
Anschließend kannst Du mit

Code: Alles auswählen

log:set DEBUG org.openhab.core.automation.mudule.script.autoShutter
die Ausgabe des Logs aktivieren und mit

Code: Alles auswählen

log:set INFO org.openhab.core.automation.mudule.script.autoShutter
wieder deaktivieren.

EDIT: Fehlende Klammern im Code ergänzt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

winni
Beiträge: 62
Registriert: 30. Mär 2019 00:24

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von winni »

Hallo Udo,

vielen Dank für Deine umfangreiche Antwort. Mit dem (minusDays(1)) war natürlich völliger Blödsinn. :? Ich habe Deine Rule ausprobiert und vlc gibt mir die folgenden Fehler:

Code: Alles auswählen

"mismatched input '}' expecting 'end'",[29,5] 
"mismatched input '}' expecting 'end'",[73,5]  
The value of the local variable logPrefix is not used",[63,16]
Leider bekomme ich diese Fehler nicht selber korrigiert.
"IsMidnight" konnte ich selber korrigieren in "Time is midnight".

Es wäre super, wenn Du mir hierbei nochmal helfen kannst.

Antworten