Ankündigung

Einklappen
Keine Ankündigung bisher.

RULE gibt keine aktualisierten Werte aus

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    RULE gibt keine aktualisierten Werte aus

    Hallo zusammen,

    ich möchte eine Rule erstellen, welche wenn es anfängt zu regnen über das Alexa Echo TTS Binding eine Meldung über alle ggf. geöffneten Fenster ausgibt.

    Alle Fenster sind in der Group "gWindow".

    Code:
    var sFensterAuf = ""
    
    rule "RULE_WZ_Alexa_Echodot_Commandtest"
    when
    Item WZ_Alexa_Echodot_Commandtest changed to ON
    then
    var sContent = "Folgende Fenster sind geöffnet\n"
    val sMessage = "Regenmeldung:\n" + sContent
    gWindow.members.forEach(contacts|
    if (contacts.state == OPEN) {
    if(contacts.name != "GF_Wohnzimmer_Reed_Fenster_Links_Riegel" && contacts.name != "SF_Studio_Reed_Fenster_Sued_Riegel") {
    if(contacts.label.indexOf("(Rahmen)") == -1) {
    sFensterAuf += contacts.label + "\n"
    }
    else {
    sFensterAuf += contacts.label.substring(0, contacts.label.indexOf("(Rahmen)")) + "\n"
    }
    }
    }
    )
    if (sFensterAuf.length > 0) {
    sContent = "Alle Fenster sind geschlossen\n." + "Es regnet Zuhause, bei einer Außentemperatur von: "
    + String::format("%.1f", (OU_Dachterasse_Wetterstation_Temperatur.state as DecimalType).floatValue()) + " °C"
    }
    logInfo("regen", sMessage + sFensterAuf)
    WZ_Alexa_Echodot_Volume.sendCommand(70)
    WZ_Alexa_Echodot_TTS.sendCommand(sMessage + sFensterAuf)
    end
    Die Ausgabe der offenen Fenster funktioniert auch bereits, nur leider werden auch Fenster aufgeführt, welche schon längst wieder geschlossen sind.

    Wo liegt der Fehler?

    #2
    Irgendwie ist die Reihenfolge Deiner Befehle etwas unlogisch. In der ersten Zeile des Codes definierst Du die Variable sContant mit einem fixen Text, in der zweiten Zeile nutzt Du diese ber der Definition eines fixen Value. Diesen gibst Du am Ende aus. Das heißt, in logInfo und auc hin Alexa heißt es immer zu Beginn:
    Code:
    Regenmeldung:
    Folgende Fenster sind geöffnet
    Egal, ob nun ein Fenster offen ist oder nicht.
    Die Zuweisung an sMessage müsste unmittelbar vor logInfo erfolgen.
    Was die geöffneten Fenster anbelangt, so ist sFensterAuf eine globale Variable. Das heißt, sie behält ihren Wert auch nach Ende der Rule. da Du die Variable niemals leerst (außer bei der Definition, die aber nur beim Neuladen der Datei zum Tragen kommt), wird sie bei jedem Aufruf immer weiter gefüllt.
    Dann prüfst Du auf die Länge von sFensterAuf und änderst sContent, falls sich Text in der Variablen befindet. Das ist unlogisch. Eher sollte es andersrum sien, wenn kein Text (= kein offenes Fenster) in der Variablen ist, sollte die Meldung anders lauten.

    Tipp am Rande: Es gibt für Gruppen eine Filterfunktion. Du möchtest alle Items sehen, welche den Status OPEN haben.
    Code:
    var sFensterAuf = ""
    
    rule "RULE_WZ_Alexa_Echodot_Commandtest"
    when
        Item WZ_Alexa_Echodot_Commandtest changed to ON
    then
        var sContent = "Folgende Fenster sind geöffnet\n"
        sFensterAuf = ""
        gWindow.members.filter[i|i.state == OPEN].forEach[contacts|
            if(contacts.name != "GF_Wohnzimmer_Reed_Fenster_Links_Riegel" && contacts.name != "SF_Studio_Reed_Fenster_Sued_Riegel") {
                if(contacts.label.indexOf("(Rahmen)") == -1) {
                    sFensterAuf += contacts.label + "\n"
                } else {
                    sFensterAuf += contacts.label.substring(0, contacts.label.indexOf("(Rahmen)")) + "\n"
                }
            }
        ]
        if (gWindow.members.filter[i|i.state == OPEN].size == 0) {
            sContent = "Alle Fenster sind geschlossen\n." + "Es regnet Zuhause, bei einer Außentemperatur von: " + String::format("%.1f", (OU_Dachterasse_Wetterstation_Temperatur.state as DecimalType).floatValue()) + " °C"
        } else {
            sContent += sFensterAuf
        }
        val sMessage = "Regenmeldung:\n" + sContent
        logInfo("regen", sMessage)
        WZ_Alexa_Echodot_Volume.sendCommand(70)
        WZ_Alexa_Echodot_TTS.sendCommand(sMessage)
    end
    Ungetestet; Falls Du sFensterAuf nicht außerhalb der Rule verwendest, kannst Du natürlich die Variable auch zu einer lokalen Variablen machen.

    Kommentar


      #3
      Vielen Dank, funktioniert wunderbar auch mit der lokalen Variable.

      Hab wohl den Wald vor lauter Bäumen nicht mehr gesehen...

      Kommentar

      Lädt...
      X