Ankündigung

Einklappen
Keine Ankündigung bisher.

Variable in Script mit Wert aus Item

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

    Variable in Script mit Wert aus Item

    Hallo,

    ich versuche den Wert eines Items in einem Script in eine Variable zu schreiben.
    Allerdings funktioniert das nicht.

    Hintergrund ist, dass ich den Wert der Variable auf als Temperatur auf ein Item des Thermostats geben will.

    Kann mir jemand helfen?
    Danke

    Das funktioniert leider nicht:
    Code:
    var n_SollTemp = (rwe_SollTempWZSwitch.state as DecimalType).intValue
    
        //Script Wohnzimmer aufrufen
        if (rwe_FensterWZ.state==CLOSED && rwe_TuerWZ.state==CLOSED)
        {
            sendCommand(rwe_SollTempWZ,n_SollTemp)
        }

    #2
    Meinst Du eine rule oder ein Script?
    Wenn der obere Code ein Ausschnitt aus einer Rule ist, sollte das so funktionieren, unter der Voraussetzung, dass der gesamte Code in einer Rule steht, also z.B. so:
    Code:
    rule "Wert zuweisen"
    when
        Item SollTempWZSwitch changed
    then
        var n_SollTemp = (rwe_SollTempWZSwitch.state as DecimalType).intValue
        if (rwe_FensterWZ.state==CLOSED && rwe_TuerWZ.state==CLOSED)
            sendCommand(rwe_SollTempWZ,n_SollTemp)
       // falls nur ein Befehl zum if gehört , können die {} entfallen
    end
    Sollte das nicht wie vorgesehen funktionieren, wäre ein erster Schritt, mal ein
    logInfo("Wert zuweisen","n_SollTemp = {}",n_SollTemp)
    einzufügen, nach der Zuweisung natürlich. Falls die Ausgabe des Logs prinzipiell in Ordnung aussieht, wäre eine Möglichkeit, dass die Action nicht funktioniert, dann könntest Du es alternativ mit der passenden Methode probieren:
    rwe_SollTempWZ.sendCommand(n_SollTemp)

    Kommentar


      #3
      Hi,

      in der Rule funktioniert das ganze wie gewollt.
      Mein Ziel war es, die Zuweisung des Wertes aus dem Item an eine Variable in einem Script zu machen?
      Warum? Ich habe zwei Items, eines was die tatsächliche Verbindung zum Thermostat von RWE hat und eines, welches als Switch agiert. Die Temperatur stelle ich über den Switch ein und biete nur gewisse Temperaturen an. Sobald die Temperatur geändert wurde, soll dieser Wert an das Thermostat Item übergeben werden.
      Damit ich aber nicht alle möglichen Temperaturauswahlmöglichkeiten durchprüfen muss, wollte ich den gewählten Wert in eine Variable schreiben und dann direkt an das Thermostat Item übergeben.

      Und da ich über das Frontend die Tempertur über mehrere Möglichkeiten ändern möchte, wollte ich das ganze in ein Script packen, um den Code nicht zweimal schreiben zu müssen.

      Grüße Martin

      Kommentar


        #4
        Das machst Du mit der Rule, die ich im Vorpost geschrieben habe. Wenn Das Item SollTempWZSwitch geändert wurde (egal ob über die UI, Rest oder ein angedocktes Binding), weist die Rule der Variablen n_SollTemp den nächstgelegenen Integer zu. Wenn die beiden Fenster/Türkontakte zu diesem Zeitpunkt geschlossen sind, wird der Wert in das Item rwe_SollTempWZ geschrieben. Da musst Du nicht jeden möglichen Wert abfragen, das macht der Code so schon für jeden Wert. Die Eingrenzung mit den Kontakten ist ja vermutlich wegen einer automatischen Frostschutzschaltung eingebaut. Dazu müsstest Du natürlich noch eine weitere Rule bauen, die beim Schließen der Kontakte den aktuellen Sollwert schreibt, oder Du ergänzt die vorhandene Rule:
        Code:
        rule "Sollwert setzen"
        when
            Item SollTempWZSwitch changed or
            Item rwe_FensterWZ changed from OPEN to CLOSED or
            Item rwe_TuerWZ changed from OPEN to CLOSED
        then
            var n_SollTemp = (rwe_SollTempWZSwitch.state as DecimalType).intValue
            if (rwe_FensterWZ.state==CLOSED && rwe_TuerWZ.state==CLOSED)
                rwe_SollTempWZ.sendCommand(n_SollTemp)
        end
        Verhalten wie vorher, nur dass der Sollwert auch automatisch gesetzt wird, wenn der letzte der beiden Kontakte geschlossen wurde.
        Auf die Variable könntest Du auch noch verzichten, falls Du nicht noch etwas anderes mit dem Wert anfangen willst. Statt Wertzuweisung und anschließender Bedingung direkt die Bedingung und die Wertzuweisung direkt im sendCommand übergeben.

        Das mit mehreren Möglichkeiten müsstest Du eventuell nochmal erläutern, falls Du einfach nur an verschiedenen Stellen der UI die Temperatur einstellen möchtest, kannst Du immer dasselbe Item verwenden -> eine Rule reicht. Auch wenn Du z.B. an einer Stelle ein Setpoint Widget einsetzt, an einer anderen Stelle aber ein Text Widget mit mapping
        Code:
        Switch Item=n_SollTempWZSwitch mappings=[7="Frost",18="Nacht",22="Komfort"]
        greift dieselbe Rule, da sie ja auf Änderung des Sollwertes reagiert.
        Zuletzt geändert von udo1toni; 22.03.2016, 17:06.

        Kommentar


          #5
          Hi,

          danke für die Erklärung. Es funktioniert auf dem Weg wie du geschrieben hast.
          Ich habe aber auch eine Möglichkeit gefunden, eine Variable im Script zu definieren und zu nutzen:

          Code:
          var Number n_TempKZ = rwe_SollTempKZSwitch.state as org.openhab.core.library.types.DecimalType
          
          if (n_TempKZ==6)
          {
              sendCommand(rwe_SollTempKZ,n_TempKZ)
          }
          //Temperatur auf 16 Grad einstellen
          else
          {
              if (rwe_FensterKZ.state==CLOSED)
              {
                  sendCommand(rwe_SollTempKZ,n_TempKZ)
              }    
          }
          Grüße Martin

          Kommentar

          Lädt...
          X