Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

CallScript mit dynamischem ScriptNamen

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

    CallScript mit dynamischem ScriptNamen

    Hallo,

    ich will basierend auf einem Wert ein Script aufrufen - mit folgendem Regelauszug:

    if(receivedCommand==ON) {
    if(Nachlauf==null) {
    // first ON command, so create a timer to turn the heating off again after 3 hrs
    var Number FanPrev = FanStatus.state as DecimalType
    //FanStatus.state gibt eine ganze Zahl zw. 1 und 8 zurück
    var ScriptName = ("Fan" + FanStatus.state)
    //GenratedScriptName soll dann so aussehen: Fan1 ... Fan8
    callScript("Fan8")
    Nachlauf = createTimer(now.plusSeconds(120)) [|
    callScript(ScriptName)
    ]
    }

    Fehlermeldung im Designer:
    Multiple markers at this line
    - Cannot refer to a non-final variable ScriptName from
    within a closure
    - Unhandled exception type org.openhab.core.scriptengine.ScriptExecutionExcep tion

    Irgendeine Idee/ Weg da durch?

    Danke
    Karsten

    #2
    Ungetestet:

    if (FanPrev == 1) {
    callScript("Fan1")
    } else if (FanPrev == 2) {
    callScript("Fan2")
    } else if ....

    oder die switch-Anweisung verwenden

    Kommentar


      #3
      ok, aber automatisch generiert geht nicht? das wäre eigentlich nicht dumm

      ich wollte die vielen "ifs" vermeiden - da wird die Regeldatei so gross.

      cheers
      Karsten

      Kommentar


        #4
        hi,

        was du meinst ist so etwas wie ein "eval". Keine Ahnung, ob es so einen Mechanismus in Xtend gibt....

        Gruß

        Kommentar


          #5
          ok, hab mal deinen "unreinen" code eingefügt:

          rule "timertest"
          when
          Item Light_DG_Studio_Wall_left received command ON
          then
          // if(receivedCommand==ON) {
          if(Nachlauf==null) {
          // first ON command, so create a timer to turn the heating off again after 3 hrs
          if(kwlOnOff==ON){
          FanPrev = FanStatus.state as DecimalType
          //var ScriptName = ("Fan" + FanStatus.state)
          callScript("Fan8")
          Nachlauf = createTimer(now.plusSeconds(120)) [|
          if (FanPrev == 1) { callScript("Fan1") }
          else if (FanPrev == 2) { callScript("Fan2") }
          else if (FanPrev == 3) { callScript("Fan3") }
          else if (FanPrev == 4) { callScript("Fan4") }
          else if (FanPrev == 5) { callScript("Fan5") }
          else if (FanPrev == 6) { callScript("Fan6") }
          else if (FanPrev == 7) { callScript("Fan7") }
          else if (FanPrev == 8) { callScript("Fan8") }
          ]
          }
          if(kwlOnOff==OFF){
          sendCommand(Light_DG_Studio_Gright, ON)
          //sendCommand(kwlFan, 100)
          Nachlauf = createTimer(now.plusSeconds(120)) [|
          sendCommand(Light_DG_Studio_Gright, OFF)
          ]
          }
          } else {
          // subsequent ON command, so reschedule the existing timer
          Nachlauf.reschedule(now.plusSeconds(120))
          }
          // }
          end


          Folgende Fehlrmeldung bekomme ich dann im designer:
          Unhandled exception type org.openhab.core.scriptengine.ScriptExecutionExcep tion

          Kommentar


            #6
            Hi

            fast selber gelöst - aber es scheint das in einer Timer Section kein Scripts aufgerufen werden können - auch nicht in einer if/ else if section. Habe mir mit einem Umweg über "hilfs-switche" geholfen und die triggern dann den script aufruf über eine weitere regel. ist zwar nicht elegant - aber scheint zu funktionieren.

            Grüsse
            Karsten

            Kommentar

            Lädt...
            X