Seite 1 von 1

rule mit schleife

Verfasst: 15. Dez 2020 18:44
von steinadler
hi
sorry, dass ich schonwieder stoere
ich versuche in einer regel eine zeitverzögerung einzubauen, die regel soll zb 10 mal wiederholt werden und dann enden
hintergrund
openhab soll wenn die waschmaschine fertig ist, einmal einen zwischenstecker anschalten und dann über den raspberry, wo auch openhab läuft, eine
mp3 abspielen
mit der haustür hab ich das so gemacht(ohne der wiederholung in der schleife)
--eigentlich sollte das alexa machen, aber da muss ich ja die hose runterlassen und meine daten von Amazon eingeben, deswegen dieser weg---
also wama ist fertig
--open schaltet wlan-zwischenstecker ein (in den intervall, 1h lang, jede minute 15 sec-so lang ist ca die mp3)
--raspy spielt mp3 über open

mit der haustür geht das schon, hier versuche ich die regel mit 1h lang, jede min ca 15 sec
hängen bleibe ich immer bei createTimer, mit Thread::sleep läuft die regel
könnte es sein, das der befehl creatTimer in einer schleife so nicht funktioniert ?
bastel nun schon den ganzen tag(mit lesen aus dem internet)
hab mal meine versuchsrule hier reingeschmiedet(hab allen müll drin gelassen, um meinen weg nachzuvollziehen)
so wie die rule steht, geht sie, möchte aber mit creatTimer arbeiten(da eine stunde zu schaltenist)
danke schonmal im vorraus...

Code: Alles auswählen


var Timer tZeit = null
rule "WaMaMeldung"
when Item Washingmachine_OpState changed 

 then
    var i = 0
    if (Washingmachine_OpState.state==3)
     (1..5).forEach
  [
     //for (i : 0 .. 10)
     //var i = 0 
    //{
     // while((i=i+1) < 5)
       {      
                     // WaMaStatusSchalter.sendCommand(ON)   
       StehlampeLicht.sendCommand(ON)
     Thread::sleep(10000) sendCommand(StehlampeLicht, OFF)
                     // createTimer(now.plusSeconds(5)) [| sendCommand(StehlampeLicht, OFF) (WaMaStatusSchalter.sendCommand(OFF))]  
     Thread::sleep(10000)
      
                     //createTimer(now.plusSeconds(15))  [| sendCommand(StehlampeLicht, OFF) (WaMaStatusSchalter.sendCommand(OFF))]
            //tZeit?.cancel                                          
           // tZeit = createTimer(now.plusSeconds(10)) [ | StehlampeLicht.sendCommand(OFF)]    
    //timer = createTimer(now.plusSeconds(10)) [|
           //StehlampeLicht.sendCommand(OFF)         //     sendCommand(StehlampeLicht, OFF)
          // ]
     }  
    
  ]
  end 
wiegesagt, habe mal alles drin gelassen, was ich schon probiert habe
die stehlampa usw. sind nur Bsp. um zu testen
--hoffentlich blickt da einer noch durch--

Re: rule mit schleife

Verfasst: 15. Dez 2020 22:00
von udo1toni
Das mit dem Durchblick ist eher... na ja, egal...
Ich zeig Dir mal eine mögliche Lösung:

Code: Alles auswählen

var Timer tWasch = null
var Integer iWasch = 0

rule "WaMaMeldung"
when
    Item Washingmachine_OpState changed                // Rule triggert
 then
    if(Washingmachine_OpState.state == 3) {            // Falls Status auf 3 geändert
        iWasch = 0                                     // Zähler zurücksetzen
        tWasch?.cancel                                 // Timer löschen, falls vorhanden
        tWasch = createTimer(now, [|                   // Timer anlegen und sofort ausführen
            iWasch = iWasch + 1                        // Zähler hochzählen
            if(iWasch > 10)                            // Falls Zähler über 10 (das sind 5 Zyklen)
                return;                                // Timer abbrechen
            if((iWasch/2).intValue != iWasch/2) {      // Falls Zähler ungerade
                StehlampeLicht.sendCommand(ON)         // Licht an
                tWasch.reschedule(now.plusSeconds(5))  // Und Timer in 5 Sekunden erneut ausführen
            } else {                                   // Falls Zähler gerade
                StehlampeLicht.sendCommand(OFF)        // Licht aus
                tWasch.reschedule(now.plusSeconds(10)) // und Timer in 10 Sekunden erneut ausführen
            }
        ])
    }
end
Die Rule legt (falls der Status auf 3 gewechselt hat) einen Timer an, nachdem ein eventuell laufender Timer gelöscht wurde (das sollte man immer berücksichtigen, nur für den Fall...) Vorher wird noch der Zähler initialisiert.
Die Rule ist an dieser Stelle auch schon wieder zuende(!).

Der Timer wird unmittelbar ausgeführt und zählt als erstes um 1 hoch und prüft anschließend, ob die Obergrenze bereits erreicht wurde. Ist das Der Fall, wird der Timer abgebrochen.
Ist die Obergrenze noch nicht erreicht, prüft die Rule, ob es sich um einen geraden oder ungeraden Zählerstand handelt.
Abhängig davon wird das Licht ein bzw. ausgeschaltet und anschließend der Timer erneut geplant (mit unterschiedlicher Laufzeit).
Man könnte den Timer auch so ausbauen, dass bei 1. Durchlauf ein Gerät eingeschaltet wird, beim 2. Durchlauf ein Playbefehl gesendet und beim 3. Durchlauf das Gerät wieder ausgeschaltet wird. Das wären dann in einer Stunde 30 Durchläufe, der jeweils 1. Durchlauf verzögert z.B um 5 Sekunden (damit der Verstärker Zeit hat...), der 2. Durchlauf verzögert um 15 Sekunden (Laufzeit des Audios) und der 3. Durchlauf verzögert um 5 Minuten 40 Sekunden, womit dann alle 6 Minuten für 15 Sekunden der Alarm gespielt wird. Die Berechnung, welcher Teil gerade ausgeführt werden muss, wäre dann mit % zu erledigen. Es kann sein, dass iWasch dann als Primitive (int) definiert werden muss :) die Formel wäre dann in der Art:

Code: Alles auswählen

switch(iWasch % 3) {
    case 1:  { ... } // 1. Durchlauf
    case 2: { ... } // 2. Durchlauf
    default: { ... } // 3. Durchlauf
}
Es kommt bei der Iteration also nur auf die möglichst geschickte Formulierung an :)

Re: rule mit schleife

Verfasst: 16. Dez 2020 06:59
von steinadler
danke ersteinmal
das muss ich esteinmal verarbeiten
demnach war mein ansatz total falsch
falls man sich nicht mehr liesst, Frohes Fest und guten Rutsch Dir und all den Lesern hier...

Re: rule mit schleife

Verfasst: 16. Dez 2020 10:46
von steinadler
sorry, das ich mich nochmal melde, aber die regel wird immer nur vom gerad wert durchlaufen, der ungerade wird nicht als true betrachtet
also, die stehlampe wird in der zählschleife immer ausgeschalten, aber nie ein

Code: Alles auswählen

2020-12-16 10:33:35.230 [ome.event.ItemCommandEvent] - Item 'WaMa' received command ON

2020-12-16 10:33:35.249 [nt.ItemStatePredictedEvent] - WaMa predicted to become ON

2020-12-16 10:33:35.276 [vent.ItemStateChangedEvent] - WaMa changed from OFF to ON

2020-12-16 10:33:42.047 [vent.ItemStateChangedEvent] - Signal changed from -20 to -19

2020-12-16 10:33:42.050 [vent.ItemStateChangedEvent] - RfTime changed from 2020-12-16T10:33:12 to 2020-12-16T10:33:42

2020-12-16 10:33:44.073 [vent.ItemStateChangedEvent] - Temp_KUE changed from 15.3 to 15.7

2020-12-16 10:33:44.078 [vent.ItemStateChangedEvent] - Hyd_KUE changed from 53.4 to 52.6

2020-12-16 10:33:47.999 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 154.1 W to 161.0 W

2020-12-16 10:33:49.799 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 161.0 W to 154.1 W

2020-12-16 10:33:49.807 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 161.0 W to 160.8 W

2020-12-16 10:33:54.549 [vent.ItemStateChangedEvent] - SL_WaMa changed from 0 to 40

2020-12-16 10:33:54.560 [vent.ItemStateChangedEvent] - Po_WaMa changed from 0 to 39

2020-12-16 10:33:54.570 [vent.ItemStateChangedEvent] - Washingmachine_OpState changed from 0 to 2

2020-12-16 10:33:55.848 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:33:55.850 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:03.015 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 154.1 W to 161.2 W

2020-12-16 10:34:03.042 [vent.ItemStateChangedEvent] - watt_2 changed from 154 to 155

2020-12-16 10:34:03.055 [vent.ItemStateChangedEvent] - ampere_2 changed from 0.676 to 0.678

2020-12-16 10:34:03.060 [vent.ItemStateChangedEvent] - heute_2 changed from 0.107 to 0.108

2020-12-16 10:34:03.064 [vent.ItemStateChangedEvent] - Leistung_2 changed from 154 to 155

2020-12-16 10:34:03.075 [vent.ItemStateChangedEvent] - summe changed from 487 to 488

2020-12-16 10:34:03.078 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.298 to 0.299

2020-12-16 10:34:03.776 [vent.ItemStateChangedEvent] - wifi_1 changed from 36 to 34

2020-12-16 10:34:03.794 [vent.ItemStateChangedEvent] - watt_1 changed from 161 to 162

2020-12-16 10:34:03.802 [vent.ItemStateChangedEvent] - ampere_1 changed from 0.732 to 0.736

2020-12-16 10:34:03.810 [vent.ItemStateChangedEvent] - heute_1 changed from 0.092 to 0.093

2020-12-16 10:34:03.815 [vent.ItemStateChangedEvent] - Leistung_1 changed from 161 to 162

2020-12-16 10:34:03.819 [vent.ItemStateChangedEvent] - summe changed from 488 to 489

2020-12-16 10:34:03.821 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.299 to 0.300

2020-12-16 10:34:05.097 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 161.2 W to 154.0 W

2020-12-16 10:34:05.109 [vent.ItemStateChangedEvent] - watt_3 changed from 172 to 171

2020-12-16 10:34:05.113 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 160.8 W to 161.4 W

2020-12-16 10:34:05.116 [vent.ItemStateChangedEvent] - ampere_3 changed from 0.752 to 0.745

2020-12-16 10:34:05.123 [vent.ItemStateChangedEvent] - heute_3 changed from 0.099 to 0.101

2020-12-16 10:34:05.126 [vent.ItemStateChangedEvent] - Leistung_3 changed from 172 to 171

2020-12-16 10:34:05.132 [vent.ItemStateChangedEvent] - summe changed from 489 to 488

2020-12-16 10:34:05.136 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.300 to 0.302

2020-12-16 10:34:05.860 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:05.864 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:12.029 [vent.ItemStateChangedEvent] - Signal changed from -19 to -21

2020-12-16 10:34:12.031 [vent.ItemStateChangedEvent] - RfTime changed from 2020-12-16T10:33:42 to 2020-12-16T10:34:12

2020-12-16 10:34:15.879 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:15.881 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:18.027 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 154.0 W to 161.3 W

2020-12-16 10:34:20.338 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 161.3 W to 154.1 W

2020-12-16 10:34:20.341 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 161.4 W to 160.5 W

2020-12-16 10:34:24.607 [vent.ItemStateChangedEvent] - Po_WaMa changed from 39 to 38

2020-12-16 10:34:25.899 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:25.902 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:27.060 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 154.1 W to 152.5 W

2020-12-16 10:34:27.068 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 160.5 W to 159.3 W

2020-12-16 10:34:33.015 [vent.ItemStateChangedEvent] - wifi_2 changed from 38 to 36

2020-12-16 10:34:33.023 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 152.5 W to 158.7 W

2020-12-16 10:34:33.076 [vent.ItemStateChangedEvent] - volt_2 changed from 228 to 229

2020-12-16 10:34:33.082 [vent.ItemStateChangedEvent] - watt_2 changed from 155 to 152

2020-12-16 10:34:33.096 [vent.ItemStateChangedEvent] - ampere_2 changed from 0.678 to 0.663

2020-12-16 10:34:33.103 [vent.ItemStateChangedEvent] - heute_2 changed from 0.108 to 0.11

2020-12-16 10:34:33.109 [vent.ItemStateChangedEvent] - Leistung_2 changed from 155 to 152

2020-12-16 10:34:33.114 [vent.ItemStateChangedEvent] - summe changed from 488 to 485

2020-12-16 10:34:33.118 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.302 to 0.304

2020-12-16 10:34:33.319 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 158.7 W to 152.2 W

2020-12-16 10:34:33.327 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 159.3 W to 158.7 W

2020-12-16 10:34:33.808 [vent.ItemStateChangedEvent] - wifi_1 changed from 34 to 36

2020-12-16 10:34:33.874 [vent.ItemStateChangedEvent] - watt_1 changed from 162 to 160

2020-12-16 10:34:33.875 [vent.ItemStateChangedEvent] - ampere_1 changed from 0.736 to 0.717

2020-12-16 10:34:33.878 [vent.ItemStateChangedEvent] - heute_1 changed from 0.093 to 0.095

2020-12-16 10:34:33.880 [vent.ItemStateChangedEvent] - Leistung_1 changed from 162 to 160

2020-12-16 10:34:33.883 [vent.ItemStateChangedEvent] - summe changed from 485 to 483

2020-12-16 10:34:33.887 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.304 to 0.306

2020-12-16 10:34:35.044 [vent.ItemStateChangedEvent] - volt_3 changed from 229 to 230

2020-12-16 10:34:35.056 [vent.ItemStateChangedEvent] - heute_3 changed from 0.101 to 0.102

2020-12-16 10:34:35.069 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.306 to 0.307

2020-12-16 10:34:35.904 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:35.907 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:42.029 [vent.ItemStateChangedEvent] - Signal changed from -21 to -20

2020-12-16 10:34:42.032 [vent.ItemStateChangedEvent] - RfTime changed from 2020-12-16T10:34:12 to 2020-12-16T10:34:42

2020-12-16 10:34:45.918 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:45.921 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:34:48.082 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 152.2 W to 160.7 W

2020-12-16 10:34:48.573 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 160.7 W to 154.1 W

2020-12-16 10:34:48.584 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter2_Watt changed from 158.7 W to 160.7 W

2020-12-16 10:34:55.935 [ome.event.ItemCommandEvent] - Item 'StehlampeLicht' received command OFF

2020-12-16 10:34:55.939 [nt.ItemStatePredictedEvent] - StehlampeLicht predicted to become OFF

2020-12-16 10:35:03.089 [vent.ItemStateChangedEvent] - ShellyemB9e890192168241_Meter1_Watt changed from 154.1 W to 161.9 W

2020-12-16 10:35:03.116 [vent.ItemStateChangedEvent] - watt_2 changed from 152 to 153

2020-12-16 10:35:03.129 [vent.ItemStateChangedEvent] - ampere_2 changed from 0.663 to 0.67

2020-12-16 10:35:03.134 [vent.ItemStateChangedEvent] - heute_2 changed from 0.11 to 0.112

2020-12-16 10:35:03.137 [vent.ItemStateChangedEvent] - Leistung_2 changed from 152 to 153

2020-12-16 10:35:03.143 [vent.ItemStateChangedEvent] - summe changed from 483 to 484

2020-12-16 10:35:03.151 [vent.ItemStateChangedEvent] - tagesleistung changed from 0.307 to 0.309
sorry für die fülle, aber wollte nichts rausnehmen, um zu verfälschen
also, wama geht an, leistung ändert sich auf 2 ( if(Washingmachine_OpState.state == 2) )
bis hierher alles richtig
dann kommt aber immer nur stehlampe Off, und nie ON
also wird immer nur der gerade wert als WAR betrachtet
oder sehe ich das falsch?
könntest du da nochmal helfen ??

Re: rule mit schleife

Verfasst: 16. Dez 2020 18:57
von udo1toni
Ja, ich hab daneben gelangt... iWasch muss tatsächlich als Number definiert sein, damit iWasch/2 einen floatValue liefert.

Die Alternative ist die Variable als Primitive zu verwenden, das wäre dann die gleiche Variante wie mit dem "Drei Optionen Timer", wenn ich das mal so nennen darf:

Code: Alles auswählen

var Timer tWasch = null
var int iWasch = 0                                     // Primitive

rule "WaMaMeldung"
when
    Item Washingmachine_OpState changed                // Rule triggert
 then
    if(Washingmachine_OpState.state == 3) {            // Falls Status auf 3 geändert
        iWasch = 0                                     // Zähler zurücksetzen
        tWasch?.cancel                                 // Timer löschen, falls vorhanden
        tWasch = createTimer(now, [|                   // Timer anlegen und sofort ausführen
            iWasch = iWasch + 1                        // Zähler hochzählen
            if(iWasch > 10)                            // Falls Zähler über 10 (das sind 5 Zyklen)
                return;                                // Timer abbrechen
            if((iWasch % 2 != 0) {                     // Falls Zähler ungerade
                StehlampeLicht.sendCommand(ON)         // Licht an
                tWasch.reschedule(now.plusSeconds(5))  // Und Timer in 5 Sekunden erneut ausführen
            } else {                                   // Falls Zähler gerade
                StehlampeLicht.sendCommand(OFF)        // Licht aus
                tWasch.reschedule(now.plusSeconds(10)) // und Timer in 10 Sekunden erneut ausführen
            }
        ])
    }
end

Re: rule mit schleife

Verfasst: 16. Dez 2020 19:05
von steinadler
umgeschrieben, getestet, und gefreut...
werde deine regel jetzt einbauen
danke deiner hilfe