Ankündigung

Einklappen
Keine Ankündigung bisher.

Timer und For Schleife laufen nicht richtig

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

    [Codebeispiel] Timer und For Schleife laufen nicht richtig

    Hallo,

    ich habe eine Klingel Rule geschrieben. Bei drücken des Tasters sollen bestimmte Leuchten blinken. Dazu habe ich eine Switch-Gruppe von Lampen erzeugt.

    Folgende rule habe ich geschrieben.

    Code:
    rule "Klingeln"
        when        
            Item Klingel received command
        then
            logInfo("Klingeln","Klingel gedrueckt")
            lStatus?.members.forEach(licht|
                if(licht.state == ON) {
                    for(i : 0..5){
                        sendCommand(licht,OFF)                    
                        createTimer(now.plusSeconds(1)) [|
                            sendCommand(licht,ON)
                        ]
                    }
                }
            )
    end
    Folgende Event Meldungen kommen dann.
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Buero_Zentral received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Wohnbereich_Fenster received command OFF
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Buero_Zentral received command ON
    Licht_EG_Wohnbereich_Fenster received command ON
    Licht_EG_Wohnbereich_Fenster received command ON
    Licht_EG_Wohnbereich_Fenster received command ON
    Licht_EG_Wohnbereich_Fenster received command ON
    Licht_EG_Wohnbereich_Fenster received command ON
    Licht_EG_Wohnbereich_Fenster received command ON

    Es wird für jedes Element 5x ausgeschalten, dann wieder 5x eingeschalten.
    Es soll aber 5x blinken mit Verzögerung.

    Bitte um Hilfe.

    mfg
    Wallner

    #2
    for(i : 0..5){
    sendCommand(licht,OFF)
    Thread::sleep(1000)
    sendCommand(licht,ON)
    Thread::sleep(1000)
    }


    Vielleicht geht das.
    Gruß Martin

    Kommentar


      #3
      Das Problem dürfte sein, dass die Schleife nicht anhält, es werden einfach mehrere Timer angelegt. das geht so schnell, dass der erste Timer noch nicht fertig ist, da hat der sechste Timer schon mit Zählen angefangen. Besser wäre vermutlich, im Timer den Schleifenwert zu erhöhen und außen zu prüfen, ob der Timer noch läuft. vermutlich willst Du auch nicht nur einen Milli-Lichtblitz, Du solltest also auf jeden Fall zwei Timer haben, einen für dunkel und einen für hell.
      Die Variante mit Thread::sleep legt eine Pause in der Abarbeitung ein, keine Ahnung, ob das unangenehme Nebenwirkungen hat (wie sieht es bei Mehrfachtrigger der rule aus? Was passiert mit anderen Ereignissen währen die Rule läuft, immerhin 10 Sekunden?)

      Kommentar


        #4
        Du willst das Licht JETZT ausmachen, nach 1sec AN, nach 2sec AUS, etc.

        Dann mach das doch einfach, statt um drei Ecken zu denken. :-P

        Code:
        rule "Klingeln"
             when
                         Item Klingel received command
             then
                 logInfo("Klingeln","Klingel gedrueckt")
                 lStatus?.members.forEach(licht|
                     if(licht.state == ON) {
                         for(i : 0..5){
                             createTimer(now.plusSeconds(2*i)) [|
                                 sendCommand(licht,OFF)
                             ]
                             createTimer(now.plusSeconds(2*i+1)) [|
                                 sendCommand(licht,ON)
                             ]
                         }
                     }
                 )
         end
        DistKV, Home Assistant, 1wire, KNX, Python, Asterisk, SMD-Lötkolben

        Kommentar

        Lädt...
        X