Mal wieder eine "rule" Frage

Alle Infos und Tipps speziell zu openHAB 2

Moderatoren: seppy, udo1toni

atk69
Beiträge: 33
Registriert: 15. Jan 2019 19:07

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 » 13. Aug 2019 08:29

Ja, mich macht das auch langsam nervös.
Selbst für meine Verhältnisse ist die rule nicht wirklich kompliziert oder komplex.
Habe auch an eventuelle Abhängigkeiten gedacht. Aber alle rules , die z.B. den Lichtsensor verwenden, sind ok.
Habe auch mal testweise diverse andere items und things abgeschaltet.
Desweiteren einen / mehrere "saubere" reboots von OH und NAS remacht (cache, tmp und log gelöscht)

Ich werde heute Abend die rule nochmal ersetzten, testen und berichten.

Im schlimmsten Fall ist der Umzug auf das Qnap ja ein Vorteil. Ich mache dort eine saubere Neuinstallation und vielleicht läuft es dann. Kann ja durchaus sein, das in der momentanen Installation eine "Macke" ist.

Dennoch einen herzlichen Dank für euren Einsatz.

Gruss
atk69
and IT works ;)

atk69
Beiträge: 33
Registriert: 15. Jan 2019 19:07

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 » 13. Aug 2019 17:23

So, habe es jetzt getestet. geändert habe ich nur:

Code: Alles auswählen

if ((dataLum.state as Number) < 7600 && now.getHourOfDay > 12 && now.getHourOfDay < 23 && tLum === null) {
im log:

Code: Alles auswählen

2019-08-13 17:17:47.530 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'WZ_WI_ROLL_LUM.rules'
2019-08-13 17:18:44.415 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-13 17:18:44.420 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 6938; tLum: null
2019-08-13 17:18:44.936 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird angelegt!
2019-08-13 17:18:45.299 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-13 17:18:45.969 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird ausgeführt! nLum: 0
2019-08-13 17:20:43.116 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-13 17:20:43.122 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 9237; tLum: null
2019-08-13 17:20:43.128 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
d.h. der Lumwert wurde unterschritten und der timer läuft los.
hat wohl keinen Einfluss, dass der Lumwert nach 2 min wieder drüber liegt.

Ergebnis: Rollos bleiben oben :oops:
and IT works ;)

Benutzeravatar
udo1toni
Beiträge: 1565
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Mal wieder eine "rule" Frage

Beitrag von udo1toni » 13. Aug 2019 19:22

Blöd, ich komme momentan nicht zum Testen...

Verschiebe bitte mal eine Logzeile:

Code: Alles auswählen

        tLum = createTimer(now.plusSeconds(1), [|
            logInfo("luminanz","Timer wird ausgeführt! nLum: {}",nLum)  // <--- hier weg
            var Number nTime = 1
            nLum += 1
            logInfo("luminanz","Timer wird ausgeführt! nLum: {}",nLum)  // <--- hier hin
            switch nLum {
und setze bitte mal beim switch Klammern um den Wert:

Code: Alles auswählen

            switch (nLum) {
Eigentlich sollte es auch ohne funktionieren, aber der Teufel ist ein Eichhörnchen...

Benutzeravatar
peter-pan
Beiträge: 309
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan » 13. Aug 2019 19:32

Also, jetzt weisst du, dass die Rule funktioniert. Sie beginnt und endet auch korrekt. Im ersten Fall wird der Timer angelegt und auch ausgeführt.
Nach 2 Minuten wird die Rule wieder angestossen, aber da die Bedingungen nicht erfüllt sind, wird auch kein Timer mehr angelegt und ausgeführt.
D.h. das Problem sind die Befehle in der Schleife. Eigentlich müsstest du hier auch Infos im Logger sehen. z.B.

Code: Alles auswählen

2019-03-21 14:40:08.619 [vent.ItemStateChangedEvent] - Sonoff_socket_08_RSSI changed from 94 to 98
2019-03-21 14:40:09.848 [vent.ItemStateChangedEvent] - Sonoff_socket_03_RSSI changed from 98 to 96
2019-03-21 14:40:12.091 [vent.ItemStateChangedEvent] - TVUE48H6890_Channel changed from 8 to 2
Schau dir auch mal den Log an, wenn du den Rollo per Schalter schaltest. Das müsste eigentlich auch einen event im Logger auslösen.

atk69
Beiträge: 33
Registriert: 15. Jan 2019 19:07

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 » 13. Aug 2019 19:51

hab es wie angegeben gemacht.
LumWert ist auf 940 eingestellt:

Code: Alles auswählen

2019-08-13 19:42:05.582 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'WZ_WI_ROLL_LUM.rules'
2019-08-13 19:42:44.727 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-13 19:42:44.732 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 875; tLum: null
2019-08-13 19:42:44.743 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird angelegt!
2019-08-13 19:42:44.750 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-13 19:42:45.748 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird ausgeführt! nLum: 1
2019-08-13 19:44:43.469 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-13 19:44:43.474 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 805; tLum: null
2019-08-13 19:44:43.484 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird angelegt!
2019-08-13 19:44:43.492 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
das wars, rollos bleiben oben .
and IT works ;)

Benutzeravatar
peter-pan
Beiträge: 309
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan » 14. Aug 2019 00:17

Das gibt's doch gar nicht.

Also hier noch einmal deine Regel ergänzt um die Loginfos für jeden Schritt.

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tLum = null 
var Number nLum = 0


rule "Luminanz"
when
    Item dataLum changed
then
    logInfo("luminanz_test","Rule getriggert!")
    if(!(dataLum.state instanceof Number)) {
        logWarn("luminanz_test","dataLum enthält keinen gültigen Wert!")
        return;
    }
    logInfo("luminanz_test","dataLum: {}; tLum: {}",dataLum.state,tLum)

    if ((dataLum.state as Number) < 4 && now.getHourOfDay > 17 && now.getHourOfDay < 23 && tLum === null) {
        logInfo("luminanz_test","Timer wird angelegt!")
        nLum = 0
        tLum = createTimer(now.plusSeconds(1), [|
            var Number nTime = 1
            nLum += 1
            logInfo("luminanz_test","Timer wird ausgeführt! nLum: {}",nLum)
            switch nLum {
                case 1: {
                    logInfo("luminanz_test","1 Status Markise: {}",Markise.state)             // test 
                    Markise.sendCommand(DOWN)
                    nTime = 60
                }
                case 2: {
                    logInfo("luminanz_test","2 Status Roll_WZ_W_li: {}",Roll_WZ_W_li.state)   // test 
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 3: {
                    logInfo("luminanz_test","3 Status Roll_WZ_W_re: {}",Roll_WZ_W_re.state)   // test 
                    Roll_WZ_W_re.sendCommand(DOWN)
                }
                case 4: {
                    logInfo("luminanz_test","4 Status Markise: {}",Markise.state)             // test 
                    Markise.sendCommand(DOWN)
                }
                case 5: {
                    logInfo("luminanz_test","5 Status Roll_WZ_W_li: {}",Roll_WZ_W_li.state)   // test 
                    Roll_WZ_W_li.sendCommand(DOWN)
                }
                case 6: {
                    logInfo("luminanz_test","6 Status Roll_WZ_W_re: {}",Roll_WZ_W_re.state)   // test 
                    Roll_WZ_W_re.sendCommand(DOWN)
                    nTime = 600
                }
                default: {
                    logInfo("luminanz_test","7 Status nTime: {}",nTime)   // test 
                    nTime = 0
                }
            }
            if(nTime > 0) {
                logInfo("luminanz_test","8 Status nTime Reschedule: {}",nTime)   // test 
                tLum.reschedule(now.plusSeconds(nTime))
             }
            else {
                tLum = null
            }
        ])
    }
 logInfo("luminanz_test"," Ende der Rule")
end
Probier das jetzt nochmal mit der Ausgabe der einzelnen Schritte. Das wäre doch gelacht, wenn wir das nicht hinkriegen. Und dann sollte es eigentlich genauso ablaufen, wie Udo dir das beschrieben hat. Die Regel wird ab dem zweiten mal triggern abgewiesen (nach ca. 2 Minuten), da die 10 Minuten noch nicht vorbei sind.

atk69
Beiträge: 33
Registriert: 15. Jan 2019 19:07

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 » 14. Aug 2019 07:24

habs mal schnell heute morgen umgesetzt peter-pan:

Code: Alles auswählen

2019-08-14 07:11:54.774 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'WZ_WI_ROLL_LUM.rules'
2019-08-14 07:12:45.830 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-14 07:12:45.835 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 261; tLum: null
2019-08-14 07:12:45.840 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-14 07:14:44.048 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-14 07:14:44.054 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 270; tLum: null
2019-08-14 07:14:44.059 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-14 07:16:44.048 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-14 07:16:44.053 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 279; tLum: null
2019-08-14 07:16:44.058 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-14 07:18:44.060 [INFO ] [smarthome.model.script.luminanz_test] - Rule getriggert!
2019-08-14 07:18:44.070 [INFO ] [smarthome.model.script.luminanz_test] - dataLum: 7; tLum: null
2019-08-14 07:18:44.082 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird angelegt!
2019-08-14 07:18:44.105 [INFO ] [smarthome.model.script.luminanz_test] -  Ende der Rule
2019-08-14 07:18:45.093 [INFO ] [smarthome.model.script.luminanz_test] - Timer wird ausgeführt! nLum: 1
2019-08-14 07:18:45.096 [INFO ] [smarthome.model.script.luminanz_test] - 7 Status nTime: 1
wobei ich die werte natürlich dem Morgen anpassen musste:

Code: Alles auswählen

if ((dataLum.state as Number) < 250 && now.getHourOfDay > 01 && now.getHourOfDay < 23 && tLum === null) {
zeit und lum. Nach dem abspeichern habe ich nach 2+min den Sensor abgedunkelt.

Edit:
habe das Thema QNAp jetzt mal vorgezogen. T-453 mit Quadcore celeron 1,6GHz. 8GB RAM und 4x 3 TB
Zuerst OH via Docker probiert. Gefällt mir gar nicht. Pfade sind schlecht zu finden und diverse Dienste gehen wohl nicht (z.B. ping)
Jetzt ganz normal als Paket installiert und es werkelt. Ordner conf, userdata und addons kopiert.
Muss nur noch dem Mosqitto konfigurieren und alles "startklar" machen. Dann kann ich vom Synology auf QNAP wechseln.
P.S. meine Frau dreht auch schon langsam am Rad, weil ich ständig am schrauben bin ;)
and IT works ;)

Benutzeravatar
peter-pan
Beiträge: 309
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Mal wieder eine "rule" Frage

Beitrag von peter-pan » 14. Aug 2019 13:15

Da haben wir's doch. Irgend etwas mit den Bedingungen ist nicht in Ordnung.
1. Die Regel triggert immer (alle 2 Minuten durch dataLum).
2a. Die Regel wird sofort wieder beendet, da die erste If-Klausel nicht zutrifft. - Durchgang 1 - 3
2b. Die Regel triggert, der Timer wird angelegt, der Timer wird ausgeführt (nLum: 1) .
Aber es wird nur dieser Teil der Switch/Case-Bedingung ausgeführt

Code: Alles auswählen

                default: {
                    logInfo("luminanz_test","7 Status nTime: {}",nTime)   // test 
                    nTime = 0
                }
D.h. Switch/Case erkennt den Wert (nLum) nicht und führt deshalb nur den default-Teil aus. vielleicht müsste man die Variable als "Number" deklarieren oder vielleicht auch z.B. diese Schreibweise case "1" anwenden. Aber dazu hab ich zuwenig Erfahrung damit und leider auch nicht die passende Testumgebung zum Herumspielen.

Vielleicht kann @Udo1toni sich das nochmal genauer anschauen, der findet das sofort heraus. Aber ich bin mir sicher, dass da der Hund begraben liegt.

Gruss,
Peter

Edit: Vergiss das mit der "Number" ( das wurde ja so gleich am Anfang deklariert :oops: :idea:).

eiGelbGeek
Beiträge: 48
Registriert: 11. Aug 2019 06:39

Re: Mal wieder eine "rule" Frage

Beitrag von eiGelbGeek » 14. Aug 2019 15:30

peter-pan hat geschrieben:
14. Aug 2019 13:15
Da haben wir's doch. Irgend etwas mit den Bedingungen ist nicht in Ordnung.
1. Die Regel triggert immer (alle 2 Minuten durch dataLum).
2a. Die Regel wird sofort wieder beendet, da die erste If-Klausel nicht zutrifft. - Durchgang 1 - 3
2b. Die Regel triggert, der Timer wird angelegt, der Timer wird ausgeführt (nLum: 1) .
Aber es wird nur dieser Teil der Switch/Case-Bedingung ausgeführt

Code: Alles auswählen

                default: {
                    logInfo("luminanz_test","7 Status nTime: {}",nTime)   // test 
                    nTime = 0
                }
D.h. Switch/Case erkennt den Wert (nLum) nicht und führt deshalb nur den default-Teil aus. vielleicht müsste man die Variable als "Number" deklarieren oder vielleicht auch z.B. diese Schreibweise case "1" anwenden. Aber dazu hab ich zuwenig Erfahrung damit und leider auch nicht die passende Testumgebung zum Herumspielen.

Vielleicht kann @Udo1toni sich das nochmal genauer anschauen, der findet das sofort heraus. Aber ich bin mir sicher, dass da der Hund begraben liegt.

Gruss,
Peter

Edit: Vergiss das mit der "Number" ( das wurde ja so gleich am Anfang deklariert :oops: :idea:).
Stehe vor genau den selben Problem.... er springt immer sofort in den default :o

Code: Alles auswählen

var Timer tLum = null 
var Number nLum = 0


rule "Luminanz"
when
    Item Alle_Rolladen_Auf changed from OFF to ON
then
    logInfo("luminanz","Rule getriggert!")
    if (tLum === null) {
        logInfo("luminanz","Timer wird angelegt!")
        nLum = 0
        tLum = createTimer(now.plusSeconds(1), [|
            logInfo("luminanz","Timer wird ausgeführt! nLum: {}",nLum)
            var Number nTime = 1
            nLum += 1
            logInfo("luminanz","nLUM Zähler! nLum: {}",nLum)
            switch nLum {
                case 1: {
                    logInfo("luminanz","case 1!")
                }
                case 2: {
                    logInfo("luminanz","case 2!")
                }
                case 3: {
                    logInfo("luminanz","case 3!")
                }
                default: {
                    nTime = 0
                    logInfo("luminanz","case default!")
                }
            }
            if(nTime > 0)
                tLum.reschedule(now.plusSeconds(nTime))
            else {
                tLum = null
                logInfo("luminanz","Rule ist beendet!")
            }
        ])
    }
end

Code: Alles auswählen

15:38:40.408 [INFO ] [smarthome.event.ItemStateChangedEvent] - Alle_Rolladen_Auf changed from OFF to ON
15:38:41.108 [INFO ] [lipse.smarthome.model.script.luminanz] - Rule getriggert!
15:38:41.138 [INFO ] [lipse.smarthome.model.script.luminanz] - Timer wird angelegt!
15:38:42.173 [INFO ] [lipse.smarthome.model.script.luminanz] - Timer wird ausgeführt! nLum: 0
15:38:42.233 [INFO ] [lipse.smarthome.model.script.luminanz] - nLUM Zähler! nLum: 1
15:38:42.279 [INFO ] [lipse.smarthome.model.script.luminanz] - case default!
15:38:42.307 [INFO ] [lipse.smarthome.model.script.luminanz] - Rule ist beendet!

eiGelbGeek
Beiträge: 48
Registriert: 11. Aug 2019 06:39

Re: Mal wieder eine "rule" Frage

Beitrag von eiGelbGeek » 14. Aug 2019 16:03

peter-pan hat geschrieben:
14. Aug 2019 13:15
Aber ich bin mir sicher, dass da der Hund begraben liegt.
Ich auch und ich verstehe nicht warum.... habe die Rule mal zum Test auf das einfachste runter gebrochen.
Ergebnis: immer case default

Code: Alles auswählen

var Number nLum = 0

rule "Test"
when
    Item Licht_Buero changed from OFF to ON
then
  nLum = 0
  nLum += 1
  logInfo("luminanz","nLUM Zähler! nLum: {}",nLum)
    switch nLum {
      case 1: {
        logInfo("luminanz","case 1!")
      }
      default: {
        logInfo("luminanz","case default!")
      }
    }
    logInfo("luminanz","Rule ist beendet!")
end

Code: Alles auswählen

16:01:18.016 [INFO ] [smarthome.event.ItemStateChangedEvent] - Licht_Buero changed from OFF to ON
16:01:18.341 [INFO ] [lipse.smarthome.model.script.luminanz] - nLUM Zähler! nLum: 1
16:01:18.369 [INFO ] [lipse.smarthome.model.script.luminanz] - case default!
16:01:18.403 [INFO ] [lipse.smarthome.model.script.luminanz] - Rule ist beendet!

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste