Die vermutlich 1000. Fenstersensoren - Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
edgartob
Beiträge: 4
Registriert: 18. Aug 2021 20:48
Answers: 0

Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von edgartob »

Ich habe vor längerer Zeit im Netz (Blog von Florian S. => https://www.forwardme.de/2019/10/03/off ... k-openhab/) eine für mich recht nette Fenstersensoren - Rule gefunden.

Leider war die dann nicht mehr mit Openhab 3.X kompatibel. Nach etwas Gebastel funktioniert sie bei mir einigermaßen. Ich bekomme nach erstmaliger Ausführung jetzt immer folgende Fehlermeldung minütlich ins log:

"[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fenstersensoren-1' failed: An error occurred during the script execution: index=1, size=1 in fenstersensoren"


Meine Rule sieht aktuell so aus:

Code: Alles auswählen

var String logPrefix = 'Fensterüberwachung: '
//var boolean log = true
var String meldeText = '' 


var telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")




rule "Fenster geöffnet"

when    Time cron "0 0/1 * * * ?" // Alle 1 Minute
then
    // Check ob Variablen passen, ansonsten defaultwert setzen
    if ((fensterOffenWarnungAnAus.state != OFF) && (fensterOffenWarnungAnAus.state != ON)) {
        fensterOffenWarnungAnAus.sendCommand(OFF)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungAnAus=Aus')
    }
    if (fensterOffenWarnungTemperatur.state == NULL) {
        fensterOffenWarnungTemperatur.postUpdate(15)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungTemperatur=15')
    }
    if (fensterOffenWarnungMinuten.state == NULL) {
        fensterOffenWarnungMinuten.postUpdate(15)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungMinuten=15')
    }
    
    // botmeldung nur ab zweiter Meldung
    var boolean useBot = false
    // Ist Automatik an?
    if (fensterOffenWarnungAnAus.state == ON) {
        // Ist es kalt genug?
        if ((Owm_Home_Current_Temperature_Rule.state as DecimalType).intValue <= (fensterOffenWarnungTemperatur.state as DecimalType)) {
            
          
           // var String meldeText = '' 
            // zuerst schauen wir, ob Fenster noch in die Liste rein müssen, wenn noch nicht enthalten

            gFenstS.members.filter[ i | i.state.toString() == "OPEN"].forEach[i|
            val lastUpdate = (i.lastUpdate("mapdb").toEpochSecond);

                
                
                // Ermitteln, wie lange in Sekunden das Fenster nun offen ist
                var long offenInMinuten = (ZonedDateTime.now().toEpochSecond - lastUpdate) /60;
               
                if (log) logInfo('rules', 'letztes Update von ' + i.name + ' (Status: ' + i.state.toString() + '): ' + lastUpdate + ' - offen in Minuten: ' + offenInMinuten.toString())
                if ((offenInMinuten) >= (fensterOffenWarnungMinuten.state as DecimalType)) {
                    
                    meldeText +=i.name.toString() + ' seit ' + offenInMinuten + ' Minuten, '
                }
                if ((offenInMinuten) > (fensterOffenWarnungMinuten.state as DecimalType)) {
                    // Nun auch per Telegram warnen - TTS ist in dem Fall bereits erfolgt
                    useBot = true
                   // Signalschalter_FarbeButton1 = YELLOW 
                }
            ]
            if (meldeText != '') {
                // Besser les- und hörbar machen
                meldeText = 'Achtung - es sind Fenster seit einiger Zeit komplett offen: ' + meldeText.replaceAll('_Tuer_Status','').replaceAll('_Fenster_Status','').replaceAll('_Status','').replaceAll('KG_','Kellergeschoß_').replaceAll('EG_','Erdgeschoß ').replaceAll('OG_','Obergeschoß ').replaceAll('DG_','Dachgeschoß ').replaceAll('_',' ') + ' bitte schließen!'

                if (log) logInfo('rules', logPrefix + 'Meldung über offene Fenster wird erfolgen...')
                // Text per Telegram und Alexa rausschicken...
                
                if (useBot) {
                    telegramAction.sendTelegram(meldeText)
                    
                }
            }

        } else {
            if (log) logInfo('rules', logPrefix + 'Es ist nicht kalt genug. Temperatur ist ' + Owm_Home_Current_Temperature.state.toString() + ' Schwellwert: ' + fensterOffenWarnungTemperatur.state.toString())
        }
    }


    if (gFenstS.members.forall == CLOSED ) {

      useBot = false
      offenInMinuten = 0

    }

end
Ich verstehe aktuell nicht so recht was da schief läuft.
Nach etwas Gebastel funktioniert sie bei mir einigermaßen.
Habe ich oben geschrieben. Die Rule ist aktuell bestenfalls als Beta anzusehen. Störend ist aktuell auch noch, dass die Warnung (aktuell via Telegram) sich pro Durchlauf immer verlängert. Das ist im Moment nicht so wichtig, weswegen ich das noch nicht angegangen bin. Das sieht dann so in der Form aus:
Achtung - es sind Fenster seit einiger Zeit komplett offen: Achtung - es sind Fenster seit einiger Zeit komplett offen: Achtung - es sind Fenster seit einiger Zeit komplett offen: Achtung - es sind Fenster seit einiger Zeit komplett offen: Achtung - es sind Fenster seit einiger Zeit komplett offen: GaesteWC seit 15 Minuten, bitte schließen!GaesteWC seit 16 Minuten, bitte schließen!GaesteWC seit 17 Minuten, bitte schließen!GaesteWC seit 18 Minuten, bitte schließen!GaesteWC seit 19 Minuten, bitte schließen!

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

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von udo1toni »

Also, der Ausdruck gFenstS.members.forall == CLOSED am Ende kann schon mal nicht stimmen. .forall verlangt ein Lambda (eckige Klammern) und ist vom Typ Boolean. Ich vermute, Du möchtest eher sowas:

Code: Alles auswählen

if(gFenstS.members.filter[i|i.state != CLOSED].size == 0)
Das prüft, wieviele Items in der Gruppe einen Status ungleich CLOSED haben. Ist die Anzahl 0 (alle haben den Status 0) wird der Code ausgeführt.

Dein Problem mit der sich verlängernden Nachricht rührt daher, dass Du eine globale Variable verwendest und diese nicht zu Beginn der Rule initialisierst. Weiterhin verwendest Du eine Variable offenInMinuten außerhalb des Kontext, in dem Du sie definierst. Du definierst diese Variable als Primitive (long), versuchst aber, sie als Objekt anzusprechen (.toString), das kann ebenfalls nicht funktionieren.

Und dann ist da noch die Konstante lastUpdate. lastUpdate ist ein Schlüsselwort. Es ist ungünstig, Variablen oder Konstanten gleichlautend zu einem Schlüsselwort zu benennen, es führt nur zu Chaos.

Du verwendest die gleiche Zählervariable für den Filter und die forEach-Schleife, was zumindest gefährlich ist. Strenggenommen sollte die filter-Variable auch in forEach zur Verfügung stehen (evtl. mit dem gleichen Wert, aber das ist nicht sicher)

Du setzt zu Beginn bestimmte Items auf Default Werte, falls diese noch keinen gültigen Wert haben. Allerdings arbeitet openHAB asynchron, es kann also sein, dass es zu lange dauert, bis die Status gesetzt sind. Besser ist es, stattdessen gleich mit lokalen Variablen zu arbeiten.

Der ganze Code ist also etwas krude. Mein Vorschlag (Kommentare sind rechts außerhalb des Sichtbereichs):

Code: Alles auswählen

val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot") // eigentlich besser lokal zu definieren, aber ok.

rule "Fenster geöffnet"
when
    Time cron "0 * * * * ?"                                                                                                       // minütlich
then
    val Long lTimeInSec = ZonedDateTime.now().toEpochSecond                                                                       // Sekunden seit 1.1.1970
    var Boolean bWarnen = false                                                                                                   // Default aus
    var Number nTemp = 15                                                                                                         // Default Grenzwert Temperatur
    var Number nMinutes = 15                                                                                                      // Default Grenzwert Zeit
    if(fensterOffenWarnungAnAus.state != OFF && fensterOffenWarnungAnAus.state != ON) {                                           // Falls kein gültiger Status
        fensterOffenWarnungAnAus.sendCommand(OFF)                                                                                 // nimm OFF an
        logInfo("window_alarm", "Fensterüberwachung: Setze Default-Wert für fensterOffenWarnungAnAus=Aus")
    } else
        bWarnen = if(fensterOffenWarnungAnAus.state != ON) false else true                                                        // Ansonsten setze bWarnen passend
    if(!bWarnen) {                                                                                                                // Falls Warungen deaktiviert sind
        logDebug("window_alarm","Fensterüberwachung: getriggert, aber deaktiviert. Abbruch.")                                     // ist hier Schluss
        return;                                                                                                                   // Rule abbrechen
    }

    if(!(fensterOffenWarnungMinuten.state instanceof Number)) {                                                                   // Falls keine gültige Zahl
        fensterOffenWarnungMinuten.postUpdate(nMinutes)                                                                           // Default Wert setzen
        logInfo("window_alarm", "Fensterüberwachung: Setze fensterOffenWarnungMinuten auf {}",nMinutes)
    } else {
        nMinutes = (fensterOffenWarnungMinuten.state as Number).intValue                                                           // Ansonsten Wert aus Item übernehmen
        logDebug("window_alarm","Fensterüberwachung: Grenzwert Zeit ist {} Minuten.",nMinutes)
    }
    if(!(fensterOffenWarnungTemperatur.state instanceof Number)) {                                                                 // Falls keine gültige Zahl
        fensterOffenWarnungTemperatur.postUpdate(nTemp)                                                                            // Default Wert setzen
        logInfo("window_alarm", "Fensterüberwachung: Setze fensterOffenWarnungTemperatur auf {}",nTemp)
    } else {
        nTemp = (fensterOffenWarnungTemperatur.state as Number).floatValue                                                         // Ansonsten Wert aus Item übernehmen
        logDebug("window_alarm","Fensterüberwachung: Grenzwert Temperatur ist {} °C.",nTemp)
    }
    val nTempIst = if(Owm_Home_Current_Temperature_Rule.state instanceof Number)                                                   // Falls Temperatur gültige Zahl
                       (Owm_Home_Current_Temperature_Rule.state as Number).floatValue                                              // Wert übernehmen
                   else
                       nTemp                                                                                                       // Ansonten auf Grenzwert setzen
    logDebug("window_alarm","Fensterüberwachung: Gemessene Temperatur ist {} °C.",nTempIst)

    if((nTempIst > nTemp) {                                                                                                        // Falls wärmer als Grenzwert
        logInfo("window_alarm", "Fensterüberwachung: Es ist nicht kalt genug. Temperatur ist {} Grenzwert: {}",nTempIst,nTemp)
        return;                                                                                                                    // Abbruch
    }

    if(gFenstS.members.filter[i|i.state != CLOSED].size == 0) {                                                                    // Falls kein Fenster offen
        logDebug("window_alarm","Fensterüberwachung: Kein Fenster offen, Abbruch.")
        return;                                                                                                                    // Abbruch
    }

    val StringBuilder strMessage = new StringBuilder                                                                               // Konstruktor anlegen
    var Boolean useBot = false                                                                                                     // Startwert wegen Telegram setzen

    gFenstS.members.filter[ i | i.state == OPEN ].forEach[ j |                                                                     // Konstruktor füllen
        val Long lLastUpdate = (j.lastUpdate("mapdb").toEpochSecond)                                                               // Zeitstempel holen
        val Integer iMinutes = ((lTimeInSec - lLastUpdate) / 60).intValue                                                          // Differenz im Minuten
        logInfo("window_alarm", "letztes Update von {} (Status: {}): {} - seit {} Minuten offen", j.name, j.state, lLastUpdate, iMinutes)
        // nicht schön... aber zumindest gleich beim Erzeugen bereinigen
        if(iMinutes >= nMinutes) {
            val String strName = j.name.replaceAll("_"," ").replaceAll("Tuer ","").replaceAll("Fenster ","").replaceAll(" Status","").replaceAll("KG","Kellergeschoß").replaceAll("EG","Erdgeschoß").replaceAll("OG","Obergeschoß").replaceAll("DG","Dachgeschoß")
            strMessage.append(strName + " seit " + iMinutes.toString + " Minuten, ")
        }
        if(iMinutes > nMinutes) {                                                                                                  // Falls Zeit überschritten Telegram aktivieren
            useBot = true
            // Signalschalter_FarbeButton1 = YELLOW 
        }
    ]
    if(strMessage.toString == "") {                                                                                                // Falls noch nix zu melden
        logDebug("window_alarm","Fensterüberwachung: Fenster offen, aber zu kurz. Abbruch.")
        return;                                                                                                                    // Abbruch
    }
    meldeText = "Achtung - es sind Fenster seit einiger Zeit komplett offen: " + strMessage.toString + " bitte schließen!"
    // Hier fehlt noch Alexa!
    logInfo("window_alarm", "Fensterüberwachung: Meldung über offene Fenster wird erfolgen...")
    if(useBot) {
        telegramAction.sendTelegram(meldeText)
    }
end
Was die Itemnamen betrifft, so ist die Frage, ob es evtl. eine bessere Möglichkeit der Bereinigung gäbe. Dazu müsste man aber genaue Kenntnis über die Namen und am besten auch Label haben.
Tipp hier: myString.split("_").get(1) liefert für myString = "Dies_ist_ein_Test" als Ergebnis "ist" zurück.
Falls Deine Itemnamen also z.B. alle so aufgebaut sind, dass der erste Teil Geschoss und Raum beschreibt (und alle anderen Bestandteile weg sollen), könntest Du auch so etwas machen:

Code: Alles auswählen

val Map<String, String> strFloor = newHashMap( "KG" -> "Kellergeschoß",  // weiter oben definieren... evtl. auch global für andere Rules
                                               "EG" -> "Erdgeschoß",
                                               "OG" -> "Obergeschoß",
                                               "DG"-> "Dachgeschoß" )

val String strName = strFloor.get(i.name.split("_").get(0)) + " " + i.name.split("_").get(1)
Das ist wesentlich eleganter als

Code: Alles auswählen

val String strName = j.name.replaceAll("_"," ").replaceAll("Tuer ","").replaceAll("Fenster ","").replaceAll(" Status","").replaceAll("KG","Kellergeschoß").replaceAll("EG","Erdgeschoß").replaceAll("OG","Obergeschoß").replaceAll("DG","Dachgeschoß")
Evtl. ist es Dir nicht aufgefallen, aber einige Log-Meldungen werden mit logDebug() erzeugt. Diese bekommst Du erst zu sehen, wenn Du den log-Level des Loggers org.openhab.core.module.script.window_alarm auf DEBUG setzt. Das Konstrukt, eine Variable auf einen Wert zu setzen und dann die log-Befehle mit if(Variable) ein- und auszuschalten, ist nicht notwendig. Ebenso könnte man auch mit logWarn() und logError() weitere Ebenen verwenden, falls (schwerwiegende) Fehler auftreten.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

edgartob
Beiträge: 4
Registriert: 18. Aug 2021 20:48
Answers: 0

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von edgartob »

@udo1toni: Erstmal tausend Dank für deine ausführliche Analyse und Berichtigung meines Falls.

Ich habe jetzt deinen umgeschriebene Rule ausprobiert. Allerdings wirft sie einen Fehler bei der Number Variable "nMinutes". Da verstehe ich nicht so recht warum? Da habe ich auf die Schnelle noch nichts passendes im Netz zu gefunden. Oben ist die Variable doch als Number deklariert.

Die Fehlermeldung lautet beim initialisieren der Rule:
2022-02-17 11:36:56.789 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'fenstersensoren.rules', using it anyway:
Cannot cast from NumberItem to Number
Und dann später als Fehlermeldung bei der Zeile:

Code: Alles auswählen

nMinutes = (fensterOffenWarnungMinuten as Number).intValue 
2022-02-17 11:45:00.920 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fenstersensoren-1' failed: Could not cast fensterOffenWarnungMinuten (Type=NumberItem, State=5, Label=Warnung wenn länger offen als x Minuten, Category=window) to java.lang.Number; line 154, column 21, length 36 in fenstersensoren

Code: Alles auswählen

val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot") // eigentlich besser lokal zu definieren, aber ok.

rule "Fenster geöffnet"
when
    Time cron "0 * * * * ?"                                                                                                       // minütlich
then
    val Long lTimeInSec = ZonedDateTime.now().toEpochSecond                                                                       // Sekunden seit 1.1.1970
    var Boolean bWarnen = false                                                                                                   // Default aus
    var Number nTemp = 15                                                                                                         // Default Grenzwert Temperatur
    var Number nMinutes = 15   
                                                                                                                                  // Default Grenzwert Zeit
    if(fensterOffenWarnungAnAus.state != OFF && fensterOffenWarnungAnAus.state != ON) {                                           // Falls kein gültiger Status
        fensterOffenWarnungAnAus.sendCommand(OFF)                                                                                 // nimm OFF an
        logInfo("window_alarm", "Fensterüberwachung: Setze Default-Wert für fensterOffenWarnungAnAus=Aus")
    } else
        bWarnen = if(fensterOffenWarnungAnAus.state != ON) false else true                                                        // Ansonsten setze bWarnen passend
    if(!bWarnen) {                                                                                                                // Falls Warungen deaktiviert sind
        logDebug("window_alarm","Fensterüberwachung: getriggert, aber deaktiviert. Abbruch.")                                     // ist hier Schluss
        return;                                                                                                                   // Rule abbrechen
    }

    if(!(fensterOffenWarnungMinuten.state instanceof Number)) {                                                                   // Falls keine gültige Zahl
        fensterOffenWarnungMinuten.postUpdate(nMinutes)                                                                           // Default Wert setzen
        logInfo("window_alarm", "Fensterüberwachung: Setze fensterOffenWarnungMinuten auf {}",nMinutes)
    } else {
        nMinutes = (fensterOffenWarnungMinuten as Number).intValue                                                                 // Ansonsten Wert aus Item übernehmen
        logDebug("window_alarm","Fensterüberwachung: Grenzwert Zeit ist {} Minuten.",nMinutes)
    }
    if(!(fensterOffenWarnungTemperatur.state instanceof Number)) {                                                                 // Falls keine gültige Zahl
        fensterOffenWarnungTemperatur.postUpdate(nTemp)                                                                            // Default Wert setzen
        logInfo("window_alarm", "Fensterüberwachung: Setze fensterOffenWarnungTemperatur auf {}",nTemp)
    } else {
        nTemp = (fensterOffenWarnungTemperatur.state as Number).floatValue                                                         // Ansonsten Wert aus Item übernehmen
        logDebug("window_alarm","Fensterüberwachung: Grenzwert Temperatur ist {} °C.",nTemp)
    }
    val nTempIst = if(Owm_Home_Current_Temperature_Rule.state instanceof Number)                                                   // Falls Temperatur gültige Zahl
                       (Owm_Home_Current_Temperature_Rule.state as Number).floatValue                                              // Wert übernehmen
                   else
                       nTemp                                                                                                       // Ansonten auf Grenzwert setzen
    logDebug("window_alarm","Fensterüberwachung: Gemessene Temperatur ist {} °C.",nTempIst)

    if((nTempIst > nTemp)) {                                                                                                        // Falls wärmer als Grenzwert
        logInfo("window_alarm", "Fensterüberwachung: Es ist nicht kalt genug. Temperatur ist {} Grenzwert: {}",nTempIst,nTemp)
        return;                                                                                                                    // Abbruch
    }

    if(gFenstS.members.filter[i|i.state != CLOSED].size == 0) {                                                                    // Falls kein Fenster offen
        logDebug("window_alarm","Fensterüberwachung: Kein Fenster offen, Abbruch.")
        return;                                                                                                                    // Abbruch
    }

    val StringBuilder strMessage = new StringBuilder                                                                               // Konstruktor anlegen
    var Boolean useBot = false                                                                                                     // Startwert wegen Telegram setzen

    gFenstS.members.filter[ i | i.state == OPEN ].forEach[ j |                                                                     // Konstruktor füllen
        val Long lLastUpdate = (j.lastUpdate("mapdb").toEpochSecond)                                                               // Zeitstempel holen
        val Integer iMinutes = ((lTimeInSec - lLastUpdate) / 60).intValue                                                          // Differenz im Minuten
        logInfo("window_alarm", "letztes Update von {} (Status: {}): {} - seit {} Minuten offen", j.name, j.state, lLastUpdate, iMinutes)
        // nicht schön... aber zumindest gleich beim Erzeugen bereinigen
        if(iMinutes >= nMinutes) {
            val String strName = j.name.replaceAll("_"," ").replaceAll("Tuer ","").replaceAll("Fenster ","").replaceAll(" Status","").replaceAll("KG","Kellergeschoß").replaceAll("EG","Erdgeschoß").replaceAll("OG","Obergeschoß").replaceAll("DG","Dachgeschoß")
            strMessage.append(strName + " seit " + iMinutes.toString + " Minuten, ")
        }
        if(iMinutes > nMinutes) {                                                                                                  // Falls Zeit überschritten Telegram aktivieren
            useBot = true
            // Signalschalter_FarbeButton1 = YELLOW 
        }
    ]
    if(strMessage.toString == "") {                                                                                                // Falls noch nix zu melden
        logDebug("window_alarm","Fensterüberwachung: Fenster offen, aber zu kurz. Abbruch.")
        return;                                                                                                                    // Abbruch
    }
    meldeText = "Achtung - es sind Fenster seit einiger Zeit komplett offen: " + strMessage.toString + " bitte schließen!"
    // Hier fehlt noch Alexa (Habe ich nich)!
    logInfo("window_alarm", "Fensterüberwachung: Meldung über offene Fenster wird erfolgen...")
    if(useBot) {
        telegramAction.sendTelegram(meldeText)
    }

    end


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

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von udo1toni »

Stange... ändere bitte mal die Definition

Code: Alles auswählen

var Number nMinutes = 15 
in

Code: Alles auswählen

var Integer nMinutes = 15 
ab. Sollte eigentlich keine Rolle spielen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

edgartob
Beiträge: 4
Registriert: 18. Aug 2021 20:48
Answers: 0

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von edgartob »

Das brachte leider keinen Effekt. Die Fehlermeldungen bleiben komischerweise exakt gleich.

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

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von int5749 »

edgartob hat geschrieben: 18. Feb 2022 09:16 Das brachte leider keinen Effekt. Die Fehlermeldungen bleiben komischerweise exakt gleich.
Ich habe den Schnipps mal bei mir in eine Testrule gepackt

Code: Alles auswählen

rule "Fenster geöffnet"
when
    Time cron "0 * * * * ?" or
    Item Testschalter changed to OFF
then
    var Number nMinutes = 15   

    if(!(fensterOffenWarnungMinuten.state instanceof Number)) {                                                                   // Falls keine gültige Zahl
        fensterOffenWarnungMinuten.postUpdate(nMinutes)                                                                           // Default Wert setzen
        logInfo("window_alarm", "Fensterüberwachung: Setze fensterOffenWarnungMinuten auf {}",nMinutes)
    } else {
        nMinutes = (fensterOffenWarnungMinuten.state as Number).intValue                                                                 // Ansonsten Wert aus Item übernehmen
        logDebug("window_alarm","Fensterüberwachung: Grenzwert Zeit ist {} Minuten.",nMinutes)
    }
end
und VSC hat einen Fehler bei der Zeile

Code: Alles auswählen

nMinutes = (fensterOffenWarnungMinuten as Number).intValue
angezeigt. Nach Änderung auf

Code: Alles auswählen

nMinutes = (fensterOffenWarnungMinuten.state as Number).intValue
War der Fehler weg und das Item hat den Wert 15 von var Number nMinutes = 15 erhalten.

Kann es sein, dass der Fehler nur 1x auftritt?? Zumindest ist dies bei mir so gewesen. Und zwar, wenn nach einer Änderung gespeichert wird und der Wert des Item NULL ist. Sobald das Item mit einem Zahlenwert gefüllt war ist, ist der Fehler bei mir nicht mehr aufgetreten.
Oder tritt er bei Dir jede Min auf?
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

edgartob
Beiträge: 4
Registriert: 18. Aug 2021 20:48
Answers: 0

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von edgartob »

@int5749: Danke für deine Hilfestellung.

Jetzt ist der Fehler bei mir auch nicht mehr da.

Der Fehler kam bei mir jede Minute.
2022-02-17 11:20:00.110 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fenstersensoren-1' failed: Could not cast fensterOffenWarnungMinuten (Type=NumberItem, State=15, Label=Warnung wenn länger offen als x Minuten, Category=window) to java.lang.Number; line 141, column 21, length 36 in fenstersensoren
Aktuell funktioniert aber die Ausgabe noch nicht, dass ein Fenster auf ist. Da muß ich nachher mal schauen.

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

Re: Die vermutlich 1000. Fenstersensoren - Rule

Beitrag von udo1toni »

Ups. Natürlich muss .state hinten dran stehen... Man sieht den Wald vor lauter Bäumen nicht...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten