Ankündigung

Einklappen
Keine Ankündigung bisher.

Item gesucht zur Heizungs/Temperatur-Eingabe

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

    Item gesucht zur Heizungs/Temperatur-Eingabe

    Hallo Zusammen,

    ich möchte über die OpenHab Seite Temperaturwerte eingeben um den Soll-Wert der Heizung vorzugeben. (MAX!Cube mit Thermostaten und Fensterkontakten)

    Bisherige "Lösung": Setpoint item=Wassertemperatur_Soll_Setpoint label="Wassertemperatur Soll [%.1f °C]" step=0.5 minValue=1 maxValue=30

    Problem: Will ich zb um 5 Grad erhöhen, muss man 5x Klicken, das wiederum erzeugt 5 Befehle zum Cube und damit zum Thermostat.
    Dies funktioniert aber nicht (Refresh der Website / zu viele Einzelbefehle etc...).

    Ansatz: Ich suche ein Item, in dem ich quasi die Temperatur als Zahl direkt eingeben und per "Senden-Button" abschicken kann.
    Somit ein sauberer, einzelner Befehl generiert wird.

    Nur wie setzt man so etwas um?

    Vielen Dank,
    Kharim

    #2
    Eine Möglichkeit wäre, das Setpoint Item nicht direkt auf den Thermostaten wirken zu lassen. Dann kannst Du einen "Setzen"-Knopf bauen, mit dem dann mittels Rule der Temperaturwert geschrieben wird. Das bedingt dann natürlich 3 Items pro Thermostat, eines zur Sollwertanzeige (ist), eines zur Sollwertauswahl (neu) und ein drittes zum Übernehmen des eingestellten Sollwertes.
    Eine Alternative könnte auch sein, bestimmte Temperaturwerte über ein Select-Item auszuwählen - schließlich wählt man meist eh nur aus zwei oder drei Wunsch-Temperaturen aus.

    Kommentar


      #3
      Dazu hatte ich vor einiger Zeit mal was in den Issue Tracker bei Github geschrieben. Dürfte auf deinen Anwendungsfall passen: Klick.

      Kommentar


        #4
        Ja darüber bin ich auch schon gestolpert, nur noch nicht so richtig schlau daraus geworden....geht ja aber beides so in die Richtung....

        Kommentar


          #5
          Stimmt, das ist quasi so wie bei mir, nur dass Du Dir das dritte Item sparst. Der Setpoint wirkt auf ein Item, was ungebunden ist. Wenn die letzte Änderung des Items genau 10 Sekunden her ist, wird das Temperatur-Item mit dem aktuellen Wert des ungebundenen Items beschrieben.

          Jetzt müsste sich jemand finden, der (wie beim homematic-Binding) ein solches Delay konfigurierbar für das MAX!Cube-binding einbaut, dann ist so ein Umweg komplett unnötig.
          Zuletzt geändert von udo1toni; 01.06.2015, 15:47.

          Kommentar


            #6
            Hm....nur irgendwo habe ich einen Fehler. Nach folgendem zusätzlichem Einbau empfange ich komplett keine Werte mehr vom Cube

            Rule:

            rule "set Temp" when Item px_wohnzimmer_soll changed or Item px_bad_soll changed then if (timer != null) timer.cancel() timer = createTimer(now.plusSeconds(10)) [| { sendCommand(Heating_Wohnzimmer_Soll, px_wohnzimmer_soll.state.toString) sendCommand(Heating_Bad_Soll, px_bad_soll.state.toString) } ] end Sitemap:

            Setpoint item=px_bad_soll label="Bad Temperatur Soll [%.0f °C]" icon=heating" step=1
            Setpoint item=px_wohnzimmer_soll label="Wohnzimmer Temperatur Soll [%.0f °C]" icon=heating" step=1

            Item:

            Number Heating_Wohnzimmer_Soll "Soll Wohnzimmer Temperatur [%.1f °C]" <"heating-0"> (gWH) {maxcube="LEQ0094960"} Number Heating_Bad_Soll "Soll Bad Thermostat [%.1f °C]" <"heating-0"> (gWH) {maxcube="LEQ0094917"}

            Number px_wohnzimmer_soll "Proxy Wohnzimmer"
            Number px_bad_soll "Proxy Bad"


            Hab ich was übersehen??

            Kommentar


              #7
              Also das erste, was mir auffällt, ist, dass Du die Variable timer oberhalb Deiner Rule nicht definiert hast (evtl. hast Du den Teil nur nicht mit kopiert).
              Das zweite ist Deine Herangehensweise, was die zwei Setpoints in einer Rule betrifft. Natürlich kannst Du das so machen, aber Du schreibst ja jedesmal, wenn Du ein Setpoint Item änderst zwei Werte. Abgesehen davon, dass das ineffizient ist, ist es auch potentiell gefährlich, z.B. wenn beim Start des Systems das Setpoint Item noch nicht initialisiert ist. Was passiert, wenn ein Wert "uninitiallized" zum maxcube-Thermostaten geschickt wird? Im besten Fall gibt's einfach eine Fehlermeldung im Protokoll, doch das ist hässlich
              Bis auf irgendwelche Befindlichkeiten, dass unbedingt mehrere Sachen in einer Rule abgearbeitet werden müssen, gibt es meines Wissens keinen Grund, unsauber nur eine Rule zu schreiben, wenn man sauber auch zwei Rules verwenden kann. Also lieber so:
              Code:
              import org.joda.time.DateTime
              
              var Timer t_wohn = null
              var Timer t_bad = null
              
              rule "set Temp Wohnzimmer"
              when
                  Item px_wohnzimmer_soll changed
              then
                  if (t_wohn != null) {
                      t_wohn.cancel
                      t_wohn = null
                      }
                  t_wohn = createTimer(now.plusSeconds(10)) [|
                      sendCommand(Heating_Wohnzimmer_Soll, px_wohnzimmer_soll.state.toString)
                  ]
              end
              
              rule "set Temp Bad" 
              when 
                  Item px_bad_soll changed
              then
                  if (t_bad != null) {
                      t_bad.cancel 
                      t_bad = null 
                      }
                  t_bad = createTimer(now.plusSeconds(10)) [|
                      sendCommand(Heating_Bad_Soll, px_bad_soll.state.toString)
                  ]
              end
              Klar muss auch sein, dass das Setpoint Item keine Bindung an das "echte" Item hat. Selbst wenn maxcube also den aktuellen Sollwert an openHAB schickt, wird das Setpoint Item nicht aktualisiert. Das könnte man mit zwei weiteren Rules korrigieren, in denen bei einem Update des Sollwertes das Setpoint Item entsprechend neu gesetzt wird. Da sich die Rules dann evtl. gegenseitig triggern, müsste man noch eine zusätzliche Bedingung einführen, die aber ohnehin sinnvoll wäre, nämlich die Prüfung, ob sich der zu schreibende Wert vom aktuellen Wert unterscheidet, also ungefähr
              Code:
              if (px_wohnzimmer_soll.state.toString != Heating_Wohnzimmer_Soll) {...}
              unmittelbar um das sendCommand herum. Diese Bedingung sollte dann natürlich auch in den Rules zum updaten des Setpoint Items stehen.

              Kommentar


                #8
                Ok, das mit dem Timer und der Rule hab ich angepasst....aber.....du kannst mich gerne einen "dummen Hund" nennen.....aber das px item ist doch gar nicht gesetzt??!! Wie soll man da einen Wert eingeben ohne einen default-Wert?? sprich px_wohnzimmer_soll brauch einen Startwert von zb 20??

                Update:
                Problem: Rule oder Sendcommand wird nicht ausgeführt, obwohl in der Console steht das px_bad_soll command received

                Rule:

                rule "Updater" when
                Time cron "0 0/5 * * * ?"
                then
                px_bad_soll.state = Heating_Bad_Soll.state
                px_wohnzimmer_soll.state = Heating_Wohnzimmer_Soll.state
                end

                var Timer t_wohn = null
                rule "set Temp Wohnzimmer"
                when
                Item px_wohnzimmer_soll received command
                then
                if (t_wohn != null) {
                t_wohn.cancel
                t_wohn = null
                }
                t_wohn = createTimer(now.plusSeconds(10)) [|
                sendCommand(Heating_Wohnzimmer_Soll, px_wohnzimmer_soll.state)
                ]
                end

                var Timer t_bad = null
                rule "set Temp Bad"
                when
                Item px_bad_soll received command
                then
                if (t_bad != null) {
                t_bad.cancel
                t_bad = null
                }
                t_bad = createTimer(now.plusSeconds(10)) [|
                sendCommand(Heating_Bad_Soll, px_bad_soll.state)
                ]
                end

                Item:

                Number Heating_Wohnzimmer_Ist "Ist Temperatur Wohnzimmer [%.1f °C]" <heating>(gWH) {maxcube="LEQ0094960:type=actual"}
                Number Heating_Bad_Ist "Ist Temperatur Bad [%.1f °C]" <heating> (gWH) {maxcube="LEQ0094917:type=actual"}

                Number Heating_Wohnzimmer_Soll "Soll Wohnzimmer Temperatur [%.1f °C]" <"heating-0"> (gWH) {maxcube="LEQ0094960"}
                Number Heating_Bad_Soll "Soll Bad Thermostat [%.1f °C]" <"heating-0"> (gWH) {maxcube="LEQ0094917"}

                Number px_wohnzimmer_soll "Proxy Wohnzimmer"
                Number px_bad_soll "Proxy Bad"

                Sitemap:

                Setpoint item=Heating_Wohnzimmer_Soll step=1 minValue=5 maxValue=30
                Setpoint item=Heating_Bad_Soll step=1 minValue=5 maxValue=30

                Setpoint item=px_bad_soll label="Bad Temperatur Soll [%.0f C]" step=1 minValue=5 maxValue=30
                Setpoint item=px_wohnzimmer_soll label="Wohnzimmer Temperatur Soll [%.0f C]" step=1 minValue=5 maxValue=30

                Wie gesagt in der Konsole kommt die Meldung am px item das ein Befehl empfangen wird, aber es erfolgt keine Reaktion.
                Sprich die Rules, oder die SendCommand greifen nicht.....

                Sieht jemand den Fehler?

                Grüße,
                Kharim
                Zuletzt geändert von Kharim; 02.06.2015, 13:00.

                Kommentar


                  #9
                  Aaaalso...
                  Code:
                  px_bad_soll.state = Heating_Bad_Soll.state
                  px_wohnzimmer_soll.state = Heating_Wohnzimmer_Soll.state
                  So geht das nicht. Du kannst entweder mit
                  Code:
                  px_bad_soll.postUpdate(Heating_Bad_Soll.state)
                  oder mit
                  Code:
                  px_wohnzimmer_soll.sendCommand(Heating_Wohnzimmer_Soll.state)
                  einen Wert zuweisen.
                  Bei postUpdate wird eine Rule, die auf received command triggert nicht ausgelöst, bei sendCommand wird die Rule ausgelöst.
                  Ob Du die Schreibweise bla(Item,Wert) oder Item.bla(Wert) wählst, ist egal. Mir persönlich gefällt die zweite Variante besser, weil mein Gehirn dann liest "Nimm das Item und mache damit bla mit dem Parameter Wert", statt "mache bla mit den Parametern Item und Wert"

                  Die beiden Definitionen var Timer... müssen beide vor der ersten Rule im Rulefile stehen. Mag sein, dass der Designer nicht meckert, aber Rules, die die Variablen benutzen werden nicht funktionieren, wenn die Definition einfach irgendwo außerhalb der Rules steht. Genauso gilt das natürlich für die Imports, alles außerhalb der eigentlichen Rules gehört an den Anfang vor die erste Rule. Vermutlich können die Timer deshalb nicht richtig initialisiert werden, weshalb auch sendCommand nie ausgeführt wird.

                  Das mit dem Startwert für px_* hast Du richtig erkannt, das Update alle 5 Minuten geht natürlich, aber schön ist anders. Besser wäre also
                  Code:
                  rule "Update px_bad_soll"
                  when
                      Item Heating_Bad_Soll received update
                  then
                      px_bad_soll.postUpdate(Heating_Bad_Soll.state)
                      logInfo("Rules","px_bad_soll wird auf " + Item.state.toString+" gesetzt.")
                  end
                  
                  rule "Update px_wohnzimmer_soll"
                  when
                      Item Heating_Bad_Soll received update
                  then
                      px_wohnzimmer_soll.postUpdate(Heating_Wohnzimmer_Soll.state)
                  end
                  Wenn Du weiterhin Probleme hast, kannst Du mit der Zeile logInfo("Meine Rules","Rule macht gerade das hier: " + Item.state.toString) eine Logausgabe erzeugen, die Du dann in der Datei ./logs/openhab.log lesen kannst. Das habe ich beispielhaft oben eingebaut. Jedesmal, wenn maxcube die Badezimmer-Solltemperatur an openHAB schickt, wird die Rule ausgeführt und die Logzeile taucht im openhab.log auf.

                  Kommentar


                    #10
                    Ich danke dir vielmals...ich glaub so passt das jetzt :-)

                    Kommentar


                      #11
                      Freut mich, wenn ich helfen konnte

                      Kommentar

                      Lädt...
                      X