Seite 1 von 3

Was sagt mir dieser Error?

Verfasst: 3. Apr 2020 23:13
von OliverCJ
Guten Abend zusammen,

kann mir jemand sagen, was dieser Logeintrag genau bedeutet?

Code: Alles auswählen

2020-04-03 23:01:16.742 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Überschriften Lampen setzen': null
Die Rule dazu:

Code: Alles auswählen

rule "Überschriften Lampen setzen"
when
    Member of gLichtCounterSwitch changed //or 
    //Member of gLichtCounterDimmer changed
then
    val Number nAnzahlSwitch = gLichtCounterSwitch.members.filter[m|m.state == ON].size
    //val Number nAnzahlDimmer = gLichtCounterDimmer.members.filter[g|g.state instanceof Number].filter[m|(m.state as Number) != 0].size
    var String sLabelLicht
    //if(nAnzahlSwitch + nAnzahlDimmer == 1)
    if(nAnzahlSwitch  == 1) 
        sLabelLicht = "(es ist eine Lampe an)"
    else 
        //if(nAnzahlSwitch + nAnzahlDimmer == 0)
        if(nAnzahlSwitch  == 0)
            sLabelLicht = "(keine Lampe an)"
        else
            //sLabelLicht = "(es sind "+(nAnzahlSwitch + nAnzahlDimmer).toString+" Lampen an)"
            sLabelLicht = "(es sind "+(nAnzahlSwitch).toString+" Lampen an)"
    sLichter.postUpdate(sLabelLicht)
end
a) der Fehler kam auch schon, bevor ich die Zeilen mit "gLichtCounterDimmer" auskommentiert habe
b) ich habe sie auskommentiert, da ich derzeit keinen Dimmer in Benutzung habe
c) Die Rule funktioniert trotzdem, ich bekomme auf der Oberfläche angezeigt,was ich sehen möchte und der Wert stimmt auch:
Ausschnitt.PNG
d) quasi die "gleiche" Rule nutze ich noch mal für die Fenster, da bekomme ich diese Error-Logs nicht...

Danke!
Oliver

Re: Was sagt mir dieser Error?

Verfasst: 3. Apr 2020 23:17
von peter-pan
Heist deine andere Regel vielleicht auch rule "Überschriften Lampen setzen" (nur um sicher zu gehen)

Re: Was sagt mir dieser Error?

Verfasst: 3. Apr 2020 23:40
von OliverCJ
Nein, nein, die heißt dann schon “Überschriften Fenster setzen“ und ist natürlich auf die entsprechende Gruppe angepasst.
Aber die eigentliche Regel ist gleich...

Gesendet von meinem SM-N975F mit Tapatalk


Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 00:53
von udo1toni
Der Fehler ist etwas unspezifisch. :) Zur Eingrenzung könntest Du in der Rule selbst mit logInfo() Meldungen im Log erzeugen, um dann einzugrenzen, welche Zeile konkret die Fehlermeldung erzeugt.

Weil es so viel Spaß macht, Strings zusammenzusetzen, hier eine andere Form der Rule:

Code: Alles auswählen

rule "Überschriften Lampen setzen"
when
    Member of gLichtCounterSwitch changed or 
    Member of gLichtCounterDimmer changed
then
    val Number nAnzahlSwitch = gLichtCounterSwitch.members.filter[m|m.state == ON].size
    val Number nAnzahlDimmer = gLichtCounterDimmer.members.filter[g|g.state instanceof Number].filter[m|(m.state as Number) != 0].size
    val Number nSum = nAnzahlSwitch + nAnzahlDimmer
    var String sLabelLicht = "(Es "
    sLabelLicht = sLabelLicht + if(nSum < 2) "ist " else "sind "
    sLabelLicht = sLabelLicht + if(nSum == 0) "k" else ""
    sLabelLicht = sLabelLicht + if(nSum < 2) "eine " else sNum.toString + " "
    sLabelLicht = sLabelLicht + "Lampe"
    sLabelLicht = sLabelLicht + if(nSum < 2) " " else "n "
    sLabelLicht = sLabelLicht + "an.)"
    sLichter.postUpdate(sLabelLicht)
end
Das Ergebnis sollte das Gleiche sein.
Es sollte auch möglich sein, alle Items in eine Gruppe zu packen (Switch und Dimmer) und dann mit

Code: Alles auswählen

val Number nSum = gLichtCounter.members.filter[m|m.getStateAs(OnOffType) == ON].size
zu arbeiten. Ich gehe jedenfalls davon aus, dass getStateAs() auch für Switch Items zur Verfügung steht.

Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 07:18
von Tokamak
OliverCJ hat geschrieben: 3. Apr 2020 23:13 a) der Fehler kam auch schon, bevor ich die Zeilen mit "gLichtCounterDimmer" auskommentiert habe
Der Code sollte mit der Auskommentierung so nicht funktionieren, da nAnzahlDimmer nicht definiert ist.
c) Die Rule funktioniert trotzdem,
Das ist überraschend. In ein paar meiner sehr komplexen Rules passiert das sporadisch. Dort musste ich sogar um eine ConcurrentLinkedQueue eine ReentrantLock bauen.
Tritt bei mir das Problem auf, wird die Rule-Ausführung abgebrochen, was leider inkonsistente Zustände hinterlässt.
Die Unterschiede zeigen, dass irgendwas in den Tiefen der DSL morsch ist, auf das wir keinen Einfluss haben.

Meine Vermutung geht Richtung der Lambdas, bei dir also die filter[].

Kann es sein, dass auf die gleichen Gruppen parallel in anderen Rules mit Lambdas zugegriffen wird?

Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 13:05
von OliverCJ
Hallo, Danke schon mal für eure Antworten!

Gerade weil die Rule an den entscheidenden Stellen auskommentiert ist, sollte sie funktionieren. Ich hatte vorher Dimmer-Steckdosen im Einsatz, die keinen expliziten ON/OFF-Switch kannten. Die waren alle in der Gruppe gLichtCounterDimmer drin. Seit ich die nicht mehr habe, sind eben alle Zeilen, wo was mit Dimmer drin steht auskommentiert (vorher gedoppelt und aus dem Doppel den Dimmer rausgenommen. So kann ich - sollte doch noch mal ein solcher Zwischenstecker zum Einsatz kommen - ganz einfach zurück).

Ich kann es der besseren Übersicht ja noch mal ohne die auskommentierten Zeilen reinsetzen:

Code: Alles auswählen

rule "Überschriften Lampen setzen"

when
    Member of gLichtCounterSwitch changed
    
then
    val Number nAnzahlSwitch = gLichtCounterSwitch.members.filter[m|m.state == ON].size
    var String sLabelLicht
    if(nAnzahlSwitch  == 1) 
        sLabelLicht = "(es ist eine Lampe an)"
    else 
        if(nAnzahlSwitch  == 0)
            sLabelLicht = "(keine Lampe an)"
        else
            sLabelLicht = "(es sind "+(nAnzahlSwitch).toString+" Lampen an)"
    sLichter.postUpdate(sLabelLicht)
end
Und auch nochmal "Nein", die Gruppe "gLichtCounterSwitch" gibt es wirklich nur dafür, die "Überschrift" auf der Sitemap zu setzen und wird nur in dieser einen Rule verwendet.

Wie gesagt, sie zeigt auch immer richtig den Wert an, der den angeschalteten Leuchten/Lampen entspricht

Ich werde mal den Tipp von Toni beherzigen und ein paar eigene Logs einbauen...

Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 16:33
von udo1toni
Ah, warte mal...

Zwei Sachen:
  1. : benutze hinter dem ersten else lieber ein {} Klammernpaar. Zwar gehört das zweite else noch zum zweiten if, an dieser Stelle ist es trotzdem sicherer, die Zuordnung auch explizit vorzugeben, nicht dass der Parser sich da verschluckt.
  2. : könntest Du damit leben, die Variable sLabelLicht auch zu initialisieren, wenn Du sie anlegst? also statt

    Code: Alles auswählen

    var String sLabelLicht
    lieber

    Code: Alles auswählen

    var String sLabelLicht = ""

Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 22:12
von OliverCJ
Hallo Toni,

ich kann da fast mit allem leben. Grundsätzlich sogar mit dieser Error-Meldung :-). Wie gesagt, funktioniert die Rule ja einwandfrei. Sie ist übrigens von Dir... Du hattest mir damals dabei geholfen und mir gezeigt, wie ich die gewünschte Anzeige auf der Sitemap hinbekomme...

Mir ging es ja eigentlich nur darum, mal zu erfahren, was die Meldung genau bedeutet.
Aber ich werde Deine Tipps mal beherzigen und schauen, ob sich was ändert.

Ach, noch was: Die Meldung tritt nicht immer auf, wenn sich an der Gruppe GLichtCounterSwitch etwas ändert. Meines Erachtens - ohne das bis jetzt genau getestet zu haben - tritt sie sogar eher auf, wenn sich da gerade gar nichts tut...

Re: Was sagt mir dieser Error?

Verfasst: 4. Apr 2020 23:10
von udo1toni
Na ja, dann kann der Fehler aber nicht auftreten, denn die Rule triggert nur bei Änderungen.

Re: Was sagt mir dieser Error?

Verfasst: 5. Apr 2020 21:57
von OliverCJ
Okay, gerade rausgefunden, dass der Fehler immer dann auftritt, wenn eine Lampe, in der sechs Leuchtmittel drin sind, ausgeschaltet wird. Da es sich eben um einen Lampe handelt, habe ich dafür eine Gruppe angelegt bzw vier Gruppen:

Code: Alles auswählen

Group:Switch:OR(ON, OFF) grosseLampe "große Lampe [%d]" (gHueWZgrosseLampe)
Group:Dimmer grosseLampeDimmer "große Lampe Helligkeit [%s]" (gHueWZgrosseLampe)
Group:Color grosseLampeFarbe "große Lampe Farbwahl" (gHueWZgrosseLampe)
Group:Dimmer grosseLampeFarbtemp "große Lampe Farbtemperatur" (gHueWZgrosseLampe)
und je Leuchtmittel:

Code: Alles auswählen

Switch Hue_EG_WZ_grosseLampe1_Toggle
    "Hue große Lampe 1"
    (gLicht, gLichtCounterSwitch, grosseLampe)
    {channel="hue:0210:1:HueWzGL1:color"}
Dimmer Hue_EG_WZ_grosseLampe1_Dimmer
    "Hue große Lampe 1 Dimmer[%s]"
    (gLicht, grosseLampeDimmer)
    {channel="hue:0210:1:HueWzGL1:color"}
Color Hue_EG_WZ_grosseLampe1_Color
    "Hue große Lampe 1 Farbe"
    (gLicht, grosseLampeFarbe)
    {channel="hue:0210:1:HueWzGL1:color"}
Dimmer Hue_EG_WZ_grosseLampe1_ColorTemp
    "Hue große Lampe 1 Farbtemperatur"
    (gLicht, grosseLampeFarbtemp)
    {channel="hue:0210:1:HueWzGL1:color_temperature"}
Ich habe hier nur einen Block aufgeführt, aber das gibt es eben 6x.

Wenn ich diese Gruppe ausschalte, tritt der Fehler auf...