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
Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

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

Beitrag von PeterA »

steinigel hat geschrieben: 21. Apr 2020 19:26 Hallo,

ich habe den Code aus dem Beispiel verwendet, leider löst die Regel nicht aus.
Alle Jalousien sind der Gruppe gBlind zugeordnet.
Weiss jemand Rat?

Danke für Eure Hilfe.
Carsten

Code: Alles auswählen

rule "Jalousienautomatik"

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

    if (Rolloautomatik.state == ON) {
        if (timeNow != timeLast) {
            if (Azimuth.state > Integer::parseInt(Rolloautomatik_azimuth_start.state.toString())) {
                if ((Temperature.state as number).floatValue > (Rolloautomatik_temp_min.state as number)) {
                    if (Clouds.state  <= Integer::parseInt(Rolloautomatik_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_elevation_ende.state.toString())) {
                            // Rollos runterfahren
                            if (log) logInfo('rules', logPrefix + 'Rollos werden abgefahren')
                            gBlind.members.forEach[i|
                                if (i.state <= Integer::parseInt(Rolloautomatik_zielwert.state.toString())) {
                                    if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + Rolloautomatik_zielwert.state.toString() + '%: ' + i.name)
                                    i.sendCommand(Integer::parseInt(Rolloautomatik_zielwert.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 aktiv") //Pushnachricht
                            Rolloautomatik_start_last.postUpdate(now.toString())
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Elevation für wieder abfahren (' + Rolloautomatik_elevation_ende.state.toString() + ') ist groesser als aktuelle (' + Elevation.state.toString() + ')')
                        }
                    } else {
                        if (log) logInfo('rules', logPrefix + 'Mindestbewoelkung (' + Rolloautomatik_wolken_max.state.toString() + ') wurde unterschritten (' + Clouds.state.toString() + ')')
                    }
                } else {
                    if (log) logInfo('rules', logPrefix + 'Mindest-Temperatur (' + Rolloautomatik_temp_min.state.toString() + ') wurde nicht erreicht durch aktuelle Temperatur (' + Temperature.state.toString() + ')')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Azimuth (' + Azimuth.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  wieder öffnen"
when Item Elevation changed
then
    val String logPrefix = 'Rolloautomatik (Rollo  hoch) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')

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

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

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


    if (Rolloautomatik_oeffnen.state == ON) {
        if (Elevation.state <= Integer::parseInt(Rolloautomatik_elevation_ende.state.toString())) {
            if (timeLastStart == timeNow) {
                if (timeLastEnde != timeNow) {
                    // Rollos wieder hoch
                    if (log) logInfo('rules', logPrefix + 'Rollos werden hinaufgefahren')
                    gBlind.members.forEach[i|
                        if((Rolloautomatik_zielwert.state as Number).intValue <= (i.state as Number).intValue +5 && (Rolloautomatik_zielwert.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 beendet") //Pushnachricht
                    Rolloautomatik_ende_last.postUpdate(now.toString())
                } 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 (' + Elevation.state.toString() + ') nicht  kleiner der eingestellten Elevation (' + Rolloautomatik_elevation_ende.state.toString()+ ') war')
        }
    } else {
        if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end
Hi Carsten,

in der Tat fehlt der Triggerteil gleich zu Anfang....

hier mal meine aktuelle Rule die letzten Sommer schon einwandfrei funktioniert hat und jetzt wieder aktiv ist.
(Ja das logging ist etwas viel, aber ich setze im Normalbetrieb das Logging sowie so immer auf "WARN")

Code: Alles auswählen

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

    if (Rolloautomatik_Sued.state == ON) {
        if (timeNow != timeLast) {
            if (Azimuth.state > Integer::parseInt(Rolloautomatik_Sued_azimuth_start.state.toString())) {
                if (AussenTemp.state > Integer::parseInt(Rolloautomatik_Sued_temp_min.state.toString())) {
                    //if ((LocalWeatherAndForecast_Current_Cloudiness.averageSince(now.minusMinutes(60)).intValue <= (Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())))) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) { //Bewerte Durchschnitt der aktuellen Bewölkung der letzten 60min
                    //if  (LocalWeatherAndForecast_Current_Cloudiness.state  <= Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {                                       //Bewerte nur Aktuelle Bewölkung
                    if  (Cloudiness_current_forecast3h_avg.state  <= Integer::parseInt(Rolloautomatik_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_elevation_ende.state.toString())) {                                                          //Bewerte Durchschnitt der Bewölkung Aktuell und Vorhersage 3h
                            // Rollos runterfahren
                            if (log) logInfo('rules', logPrefix + 'Rollos werden abgefahren')
                            gruppeRolladen_Sued.members.forEach[i|
                                if (i.state <= Integer::parseInt(Rolloautomatik_Sued_zielwert.state.toString())) {
                                    if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + Rolloautomatik_Sued_zielwert.state.toString() + '%: ' + i.name)
                                    i.sendCommand(Integer::parseInt(Rolloautomatik_Sued_zielwert.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 um " + now.toString("HH:mm") + " Uhr") //Pushnachricht
                            Rolloautomatik_Sued_start_last.postUpdate(now.toString())
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Elevation für wieder abfahren (' + Rolloautomatik_Sued_elevation_ende.state.toString() + ') ist groesser als aktuelle (' + Elevation.state.toString() + ')')
                        }
                    } else {
                        if (log) logInfo('rules', logPrefix + 'Mindestbewoelkung (' + Rolloautomatik_Sued_wolken_max.state.toString() + ') wurde unterschritten (' + LocalWeatherAndForecast_Current_Cloudiness.state.toString() + ')')
                    }
                } else {
                    if (log) logInfo('rules', logPrefix + 'Mindest-Temperatur (' + Rolloautomatik_Sued_temp_min.state.toString() + ') wurde nicht erreicht durch aktuelle Temperatur (' + AussenTemp.state.toString() + ')')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Azimuth (' + Azimuth.state.toString() + ') hat noch nicht Schwellwert (Rolloautomatik_Sued_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 Sued wieder öffnen"
when Item Elevation changed
then
    val String logPrefix = 'Rolloautomatik (Rollo Sued hoch) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')

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

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

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


    if (Rolloautomatik_Sued_oeffnen.state == ON) {
        if (Elevation.state <= Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {
            if (timeLastStart == timeNow) {
                if (timeLastEnde != timeNow) {
                    // Rollos wieder hoch
                    if (log) logInfo('rules', logPrefix + 'Rollos werden hinaufgefahren')
                    gruppeRolladen_Sued.members.forEach[i|
                        if((Rolloautomatik_Sued_zielwert.state as Number).intValue <= (i.state as Number).intValue +5 && (Rolloautomatik_Sued_zielwert.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üd beendet um " + now.toString("HH:mm") + " Uhr") //Pushnachricht
                    Rolloautomatik_Sued_ende_last.postUpdate(now.toString())
                } 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 (' + Elevation.state.toString() + ') nicht  kleiner der eingestellten Elevation (' + Rolloautomatik_Sued_elevation_ende.state.toString()+ ') war')
        }
    } else {
        if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end
Gruß Peter
- OpenHab 2.4
#PWRUP

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

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

Beitrag von Cyrelian »

PeterA hat geschrieben: 18. Apr 2020 11:45 Hi Cyrelian,

danke für die Infos. Meteoblue scheint mir für meine Region ganz gut zu passen.
Meteoblue kostet aber ? Und in der Bindingdoku habe ich keine Wolkenmenge gefunden ?

Gruß Peter
Hi Peter,

ja, das ist richtig. Das Cloud Packet kostetet auch extra. Für die Wolken nehme ich es auch nicht mehr. Hierfür nutze ich nur noch Dark Sky, Weather binding und OpenWeatherMap.

CU
Cyrelian

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

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

Beitrag von PeterA »

Cyrelian hat geschrieben: 22. Apr 2020 09:55
PeterA hat geschrieben: 18. Apr 2020 11:45 Hi Cyrelian,

danke für die Infos. Meteoblue scheint mir für meine Region ganz gut zu passen.
Meteoblue kostet aber ? Und in der Bindingdoku habe ich keine Wolkenmenge gefunden ?

Gruß Peter
Hi Peter,

ja, das ist richtig. Das Cloud Packet kostetet auch extra. Für die Wolken nehme ich es auch nicht mehr. Hierfür nutze ich nur noch Dark Sky, Weather binding und OpenWeatherMap.

CU
Cyrelian
Und DarkSky ging an Apple und akzeptiert erst ab Juli wieder neue User.
Ich versuche es erst mal mit dem Mittelwert aus Aktuell und 3h Vorhersage...
Im "Weather Binding" kann man ja wenn ich das richtig verstehe Wetterdatenanbieter zusammenfassen.
Welche nutzt Du hier noch ?

Gruß Peter
- OpenHab 2.4
#PWRUP

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

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

Beitrag von Cyrelian »

ah stimmt ja mit Dark Sky...hatte ich nicht mehr auf dem Radar. Meinen User hab ich Gott sei Dank schon ewig da.
Also ich nehme die Werte von Dark Sky, Weather binding und OpenWeatherMap, schreibe die in eine influxDB und hole mir dann den AVG der letzten Stunde raus. Diesen Vergleiche ich dann mit einem festen Wert. Wird dieser überschritten, fahren die Rollläden rauf. Bin Forecast hab ich hat schon beobachtet, dass dieser Wert manchmal von einem auf das andere Abfrageinterval von 0 auf >50 steigt und im nächsten wieder bei 0 ist. Das habe ich bei dem AVG glaube ich so noch nicht gehabt. Deswegen finde ich das genauer...ist aber meine Subjektive Ansicht ;) .

CU
Cyrelian

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

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

Beitrag von PeterA »

Cyrelian hat geschrieben: 22. Apr 2020 13:36 ah stimmt ja mit Dark Sky...hatte ich nicht mehr auf dem Radar. Meinen User hab ich Gott sei Dank schon ewig da.
Also ich nehme die Werte von Dark Sky, Weather binding und OpenWeatherMap, schreibe die in eine influxDB und hole mir dann den AVG der letzten Stunde raus. Diesen Vergleiche ich dann mit einem festen Wert. Wird dieser überschritten, fahren die Rollläden rauf. Bin Forecast hab ich hat schon beobachtet, dass dieser Wert manchmal von einem auf das andere Abfrageinterval von 0 auf >50 steigt und im nächsten wieder bei 0 ist. Das habe ich bei dem AVG glaube ich so noch nicht gehabt. Deswegen finde ich das genauer...ist aber meine Subjektive Ansicht ;) .

CU
Cyrelian
Wenn ab Juli DarkSky wieder neue User zulässt werde ich die Wolkenmenge von dort noch mit einfließen lassen.

Gruß Peter
- OpenHab 2.4
#PWRUP

pweissen
Beiträge: 4
Registriert: 24. Apr 2020 07:39

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

Beitrag von pweissen »

Hallo zusammen und vielen Dank an alle die hier dran gearbeitet haben!
Ich habe die Codesnippets von @Cyrelian genommen: viewtopic.php?p=13133#p13133
und das auf meine Items angepasst. Leider läuft das Ganze bei mir noch nicht daher hätte ich ein paar Fragen:
1.
Sobald ich mit

Code: Alles auswählen

var boolean log = true
und

Code: Alles auswählen

if (log) logInfo(filename, ...
arbeiten möchte erhalte ich nachfolgenden Fehler:

Code: Alles auswählen

2020-04-23 20:43:55.153 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': The name 'log' cannot be resolved to an item or type; line 178, column 17, length 3
Sobald ich

Code: Alles auswählen

 (log) 
entfernen kommt der nächste Fehler

Code: Alles auswählen

2020-04-23 21:10:55.156 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': The name 'filename' cannot be resolved to an item or type; line 178, column 21, length 8
Entferne ich beides kommt es zu keinem Fehler mehr.

2.
Nach allen Anpassungen erhalten ich folgende Fehlermeldung:

Code: Alles auswählen

2020-04-24 07:48:01.003 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': An error occurred during the script execution: index=1, size=1
Nach etwas Debugging kann ich zumindest Eingrenzen wo der Fehler ungefähr auftritt

Code: Alles auswählen

rule "Verschattung starten"
when
    Item astro_azimuth changed
then
    val String logPrefix = "Verschattung aktivieren - "
    logInfo("DEBUG", "Verschattung1")
    //Prüfung auf: Verschattungsautomatik an / ob es Tag ist / Präsenz / Jahreszeit
    if ((AutoShading.state == ON && Daylight.state == ON) && (Jahreszeit.state== "SPRING" || Jahreszeit.state== "SUMMER")) {
         logInfo("DEBUG", "Verschattung2")      
            if (AutoShading_Start_last.state === NULL) {
                logInfo(logPrefix, 'Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)')
                    AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
                }
Openhab scheitert direkt nach meiner loginfo

Code: Alles auswählen

logInfo("DEBUG", "Verschattung1")
Leider finde ich nicht das Problem :( Könnt Ihr helfen?

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

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

Beitrag von udo1toni »

Ich möchte ganz dringend empfehlen, dieses Konstrukt

Code: Alles auswählen

var boolean log = true

if(log) logInfo(...)
zu ersetzen durch

Code: Alles auswählen

logInfo(...)
Die ursprüngliche Idee hinter diesem Codeschnipsel ist, dass man das Logging durch Setzen der Variable log auf false abschalten kann.

Das ist aber komplett unnötig, da logInfo() bereits einen eingebauten Schalter dafür hat (man muss ihn nur kennen...)

Das Konstrukt mit der Variablen hat einen grundsätzlichen Nachteil, nämlich, dass die Rules dafür neu eingelesen werden müssen. Man könnte natürlich auch ein Switch Item dafür verwenden, es bleibt dann aber immer noch der zusätzliche Aufwand. Verwendet man die eingebauten Steuerfunktionen, kann man das Logging im laufenden Betrieb steuern und muss dafür keine Rules neu einlesen. Wenn man es richtig macht, kann man sogar wesentlich genauer steuern, wie und was geloggt wird. Ich habe dazu auch hier im Forum schon ein paar längere Artikel geschrieben. ;)

Alle log-Befehle (es gibt logDebug(), logInfo(), logWarn() und logError() ) verlangen exakt zwei Strings. Der erste String gibt den Loggernamen an. der zweite String die eigentliche Meldung.
DEBUG ist kein guter Loggername! Für die Verschattungsrule böte sich beispielsweise "verschattung", "schatten" oder "shadow" an. Wenn alle log-Befehle, die sich auf die Verschattung beziehen (eventuell auch verteilt auf mehrere Rules) den gleichen Loggernamen verwenden, kann man über die Karaf Konsole bequem das Logging in Stufen ein- und ausschalten, mittels

Code: Alles auswählen

log:set DEBUG org.openhab.model.script.shadow
würde man beispielsweise den LogLevel auf DEBUG ändern, womit alle Logmeldungen von logDebug() bis logError() in openhab.log landen. setzt man hingegen den LogLevel auf ERROR, so werden nur noch die logError() Befehle ausgeführt. Wohlgemerkt passiert dies nur für den angegebenen Logger.
Man kann sogar dafür sorgen, dass die Meldungen bestimmter Logger in einer eigenen Datei landen und vielleicht mit einer anderen Formatierung oder Aufbewahrungszeit dort notiert werden. log4j2 (das ist die verwendete Logger Engine) ist ein extrem mächtiges Werkzeug.

Was Dein Problem betrifft, so hast Du vermutlich irgendwo einen gravierenden Fehler in Deiner Rule, eventuell auch vor der angemeckerten Rule, das ist so erst mal schwer einzugrenzen.

Nutzt Du VSCode mit openHAB-Plugin? Falls nein, wäre das eine Aufgabe an Dich :) denn mit VSCode bekommmt man (korrekte Konfiguration und ein laufendes openHAB vorausgesetzt) schon beim Schreiben des Codes Hinweise auf Fehler im Code.

Zu den Fehlern:
  • The name 'log' cannot be resolved... die Variable ist zum Zeitpunkt des Zugriffs nicht als Variable bekannt.
  • The name 'filename' cannot be resolved... die Variable ist zum Zeitpunkt des Zugriffs nicht als Variable bekannt.
  • An error occurred during the script execution: index=1, size=1 tritt häufig im Zusammenhang mit einem fehlerhaften log-Befehl auf. Der Fehler ist aber nicht zwingend zu Beginn der Rule, auch wenn index=1 das vermuten lässt. Vielmehr bezieht sich das vermutlich auf das resultierende Kompilat. Man müsste also die komplette Rule sehen, um den Fehler zu finden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

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

Beitrag von Cyrelian »

pweissen hat geschrieben: 24. Apr 2020 07:55 Hallo zusammen und vielen Dank an alle die hier dran gearbeitet haben!
Ich habe die Codesnippets von @Cyrelian genommen: viewtopic.php?p=13133#p13133
und das auf meine Items angepasst. Leider läuft das Ganze bei mir noch nicht daher hätte ich ein paar Fragen:
1.
Sobald ich mit

Code: Alles auswählen

var boolean log = true
und

Code: Alles auswählen

if (log) logInfo(filename, ...
arbeiten möchte erhalte ich nachfolgenden Fehler:

Code: Alles auswählen

2020-04-23 20:43:55.153 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': The name 'log' cannot be resolved to an item or type; line 178, column 17, length 3
Sobald ich

Code: Alles auswählen

 (log) 
entfernen kommt der nächste Fehler

Code: Alles auswählen

2020-04-23 21:10:55.156 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': The name 'filename' cannot be resolved to an item or type; line 178, column 21, length 8
Entferne ich beides kommt es zu keinem Fehler mehr.

2.
Nach allen Anpassungen erhalten ich folgende Fehlermeldung:

Code: Alles auswählen

2020-04-24 07:48:01.003 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung starten': An error occurred during the script execution: index=1, size=1
Nach etwas Debugging kann ich zumindest Eingrenzen wo der Fehler ungefähr auftritt

Code: Alles auswählen

rule "Verschattung starten"
when
    Item astro_azimuth changed
then
    val String logPrefix = "Verschattung aktivieren - "
    logInfo("DEBUG", "Verschattung1")
    //Prüfung auf: Verschattungsautomatik an / ob es Tag ist / Präsenz / Jahreszeit
    if ((AutoShading.state == ON && Daylight.state == ON) && (Jahreszeit.state== "SPRING" || Jahreszeit.state== "SUMMER")) {
         logInfo("DEBUG", "Verschattung2")      
            if (AutoShading_Start_last.state === NULL) {
                logInfo(logPrefix, 'Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)')
                    AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
                }
Openhab scheitert direkt nach meiner loginfo

Code: Alles auswählen

logInfo("DEBUG", "Verschattung1")
Leider finde ich nicht das Problem :( Könnt Ihr helfen?
Hi,

Udo hat recht, mein Code in der Rule ist was das logging angeht suboptimal. Deshalb hab ich hier mal ein kleines HowTo zu dem Thema logging geschrieben.
viewtopic.php?f=8&t=3019
Am besten das alles raus:

Code: Alles auswählen

var boolean log = true
if (log)
und dann nach dem HowTo anpassen ;)

CU
Cyrelian

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

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

Beitrag von PeterA »

Oder das Logging über die UI Komplett AUS und EIN Schalten, bzw den Loglevel auf WARN setzen.

viewtopic.php?f=15&t=3073&p=15626#p15626
- OpenHab 2.4
#PWRUP

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

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

Beitrag von Cyrelian »

PeterA hat geschrieben: 24. Apr 2020 20:29 Oder das Logging über die UI Komplett AUS und EIN Schalten, bzw den Loglevel auf WARN setzen.

viewtopic.php?f=15&t=3073&p=15626#p15626
auch cool ;)

Antworten