Ankündigung

Einklappen
Keine Ankündigung bisher.

In Rule Werte zwischenspeichern

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

    In Rule Werte zwischenspeichern

    Hallo Openhabler,

    ich hab da mal eine Frage.
    Ist es möglich, einen Wert in einer Rule zwischenzuspeichern, z.b. über ein weiteres Item?

    Ich habe folgendes vor:
    Ich möchte die Temperatur in einem Raum regeln.

    Als Wert habe ich über Setpoint-Item 19°C vorgegeben.
    Wenn jetzt das Fenster geöffnet wird, soll die Temperatur auf 2°C runtergeregelt werden.
    Wenn das Fenster jetzt wieder geschlossen wird, fährt die Temperatur auch wieder hoch, allerdings auf einen festen Wert, den ich vorgegeben habe.

    Funktioniert im Moment ungefähr so:
    1. Fenster geschlossen: Raumtemperatur auf 19° eingestellt
    2. Fenster geöffnet: Temperatur auf 2° geregelt.
    3 Fenster wieder geschlossen: Temperatur wieder auf 18° (fest vorgegeben).



    Nun soll das aber so funktionieren:
    1. Fenster geschlossen: 19° vorgegeben
    2. Fenster geöffnet: Temperatur ändert auf 2°
    3. Fenster wird wieder geschlossen: Temperatur wieder auf vorher eingestellte temperatur (19°)


    Bei einer Siemens S7 würde ich das über Merkerwort o. ä. realisieren.
    Gibts sowas auch bei openhab? Irgendwie über ein Item oder so?


    Meine Rule sieht im Moment so aus:

    Code:
    rule "Runterregeln bei geöffnetem Fenster Buero"
    
    when
        Item Fensterkontakt_Gaestezimmer received update OPEN
    
    then
    
            sendCommand(Temp_Buero_set, 6)
    
    end
    
    
    rule "Anheizen bei geschlossenem Fenster Buero"
    
    when
        Item Fensterkontakt_Gaestezimmer received update CLOSED
    
    then
        sendCommand(Temp_Buero_set, 16)
    
    end


    Brauche da mal einen Tip

    Danke schonmal im voraus


    The Yankee


    #2
    Du hast verschiedene Möglichkeiten. Zum einen kannst Du eine Variable definieren:
    Code:
    var Number tBueroSet
    rule "Heizung runter"
    when
        Item Fensterkontakt_Gaestezimmer changed
    then
        if (Fensterkontakt_Gaestezimmer == OPEN) {
            if(Temp_Buero_set.state instanceof DecimalType)
                tBueroSset =Temp_Buero_set.state as DecimalType
                Temp_Buero_set.sendCommand(6)
            else
                logInfo("Heizung","Temp_Buero_set nicht initialisiert!")
            }
        else
            if(tBueroSet instanceof DecimalType)
                Temp_Buero_set.sendCommand(tBueroSet)
            else
                logInfo("Heizung","tBueroSet nicht initialisiert!")
    end
    Du kannst statt einer Variablen auch ein Item verwenden, welches Du ohne Binding anlegst. Hat den Vorteil, dass Du den Wert z.B. in der UI anzeigen kannst, und anders als die Variable steht das Item uneingeschränkt zur Verfügung (die Variable steht nur in dem .rule-File zur Verfügung, in dem sie definiert wurde), aber einen openHAB-Neustart übersteht der Wert so nicht.
    Alternativ kannst Du das Item persistieren, aber wenn Du schon persistierst, brauchst Du auch keine Variable mehr, denn Du kannst einfach den letzen Wert abfragen.

    Kommentar


      #3
      Vielen Dank für die Antwort.

      Habe den Code mal 1:1 in eine rule gepackt und getestet.
      Funktioniert irgendwie nicht.
      Habe ich da noch was vergessen?

      Wie sieht denn eigentlich die Variante mit dem zusätzlichem Item (hier Number Temp_Buero_set_TEMP) aus?

      irgendwie so?

      Code:
       rule "Runterregeln bei geöffnetem Fenster Buero"
      
      when     Item Fensterkontakt_Gaestezimmer received update OPEN
      
      then          
      
               Number Temp_Buero_set_TEMP == Temp_Buero_set.state   //Wert von "Temp_Buero_set" wird in "Temp_Buero_set_TEMP" geparkt
               sendCommand(Temp_Buero_set, 6)
       end  
      
      
      rule "Anheizen bei geschlossenem Fenster Buero"  
      
      when    
                Item Fensterkontakt_Gaestezimmer received update CLOSED  
      
      then      
      
                sendCommand(Temp_Buero_set, (Temp_Buero_set_TEMP))     //Wert von "Temp_Buero_set_TEMP" wird in "Temp_Buero_set" zurückgeschrieben
      
      end
      Ist das so überhaupt möglich oder ist da noch die Syntax falsch?
      Muss ich am Anfang der Rule noch irgendwas importieren?
      Zuletzt geändert von Yankee0815; 27.11.2016, 01:27.

      Kommentar


        #4
        Was funktioniert denn genau nicht? gibt es log-Meldungen in ./logs/openhab.log? Wie sieht es mit Meldungen in ./logs/events.log aus?

        Items kannst Du ausschließlich über postUpdate() oder sendCommand() mit einem Wert füllen. Der Unterschied zwischen den beiden ist, dass postUpdate() ausschließlich den Wert innerhalb openHAB ändert, sendCommand() schickt den Wert auch an Bindings, die an das Item gebunden sind.

        Zusatzinfo: Wenn Du zusätzlich noch autoupdate="false" an das Item bindest (quasi als zusätzliches Binding), wirkt sendCommand() ausschließlich auf die Bindungs, und nicht auf den openHAB Bus.

        Aber vielleicht gehe ich von falschen Voraussetzungen aus... Also erstmal als Info für mich Welches Betriebssystem und welche openHAB-Version verwendest Du?

        Kommentar


          #5
          Hallo udo,

          war wohl ein Fehler im Openhab (läuft übrigens auf einem Raspi in der Version 1.8.3)
          Habe die Rule getestet.
          Bekomme aber jetzt die Meldung

          Temp_Buero_set nicht initialisiert!


          Das Item Temp_Buero_set besitzt aber ja einen Wert von z. B. 10 als Number, also nicht undefiniert.

          Wie kann ich den Wert initialisieren?

          Muss ich das Item als instanceof Decimaltype festlegen?
          Zuletzt geändert von Yankee0815; 28.11.2016, 23:36.

          Kommentar


            #6
            Items sind in den .items-Dateien definiert, ich gehe mal davon aus, dass Du es als Number Item definiert hast:
            Code:
            Number Temp_Buero_set "Solltemperatur [%.1f °C]" {...}
            Solange dieses Item aber noch keine gültige Temperatur hat, ist es auch noch nicht initialisiert. Wenn Das Item doch initialisiert ist, hast Du vermutlich einen Tippfehler in der Rule (es heißt z.B. DecimalType, nicht Decimaltype)

            Kommentar


              #7
              Kann es sein, dass es an dieser Stelle nicht passt:
              Code:
              sendCommand(Temp_Buero_set, (Temp_Buero_set_TEMP))
              Probiere es doch mal mit:
              Code:
              sendCommand(Temp_Buero_set, (Temp_Buero_set_TEMP.state as DecimalType))

              Kommentar


                #8
                Ich empfehle auch immer wieder aus gutem Grund, der Methode den Vorzug zu geben, also nicht sendCommand(item,value), sondern item.sendCommand(value) zu schreiben. Diese beiden Schreibweisen sollten zwar grundsätzlich das gleiche bewirken, es handelt sich aber um unterschiedliche Funktionen, wo die Methode dank der Zugehörigkeit zum Item genau weiß, welcher Wert Typ erwartet wird, und dementsprechend auch weitreichende Typkonvertierungen durchführen kann, ist dies der Action verwehrt, sie kann also nur raten, was am besten geschickt wird, und oft geht das schief.

                Kommentar


                  #9
                  Hallo allerseits

                  Mein Thema ist ein wenig OT aber ich wollte dafür keinen neuen Thread anfangen.
                  Ich habe an meiner Wärmepumpe einen Zähler mit S0 Ausgang. Die Impulse zähle ich über ein MDT Tasterinterface. Das klappt soweit ganz gut. Nur manchmal startet das Interface wieder bei 0. MDThat mir gesagt, dass das an Ausfällen der Busspannung liegt. Kann mir das zwar nicht erklären aber nehmen wir mal an es liegt daran.
                  Gibt es eine Möglichkeit, immer nur den Tagesverbrauch zu speichern bzw diese werte dann zu summieren.
                  Zählerstand 24.12 00:00 107kWh
                  Zählerstand 25.12. 00:00 109kWh
                  Zählerstand 26.12. 00:00 120kWh
                  Gespeichert werden dann 2kWh für den 24.12; 11kWh für den 25 etc.

                  Mir fällt aber während ich das schreibe auf, dass ich, bei einem Rückfall das selbe Problem habe - 0-120 wären dann -120kWh.
                  Vielleicht habt ihr dazu eine Idee, oder eine bessere Möglichkeit den S0 Ausgang zu Zählen.
                  Aktor mit Strommessung ist vorhanden, aber die Messergebnisse sind nicht gerade berauschend.

                  LG
                  Danke
                  Daniel

                  Kommentar


                    #10
                    Eigentlich sollte die Busspannung ja nicht ausfallen...

                    Wenn Du die Zählerstände regelmäßig abfragst, könntest Du versuchen, zu kleine Zahlen zu erkennen und dann entsprechend die korrekten Werte auszurechnen. Also ungefähr so: Alter Zählerstand 120kWh, neuer Zählerstand 1kWh -> korrigierter Zählerstand 121kWh. Nächster neuer Zählerstand 5kWh. Da der größer ist als der letzte Zählerstand, wird nur die Differenz zum letzten Zählerstand genommen, also 4kWh -> korrigierter Zählerstand 225kWh.

                    Ist halt die Frage, wie oft so ein unerwünschter Reset passiert, ob das ein gangbarer Weg ist.

                    Eine andere Möglichkeit wäre, ein Zählermodul zu suchen, welches nicht selbsttätig einen Zählerreset vornimmt...

                    Kommentar


                      #11
                      Hallo UdoToni

                      genau so habe ich mir das vorgestellt, nur habe ich keine Idee wie ich das schreiben müsste.
                      Vielleicht wäre eine anderer Variante den Zählwert täglich 00:00 auf 0 zu stellen.
                      Diese Tagesverbräuche dann summieren und dann im Diagramm darstellen bzw eine Absoolutwert anzeigen.
                      Schön wäre wenn man den Bereich Wählen könnte.
                      Energieverbrauch 2016, oder nur das Monat.
                      Keine Ahnung wie so etwas geht. :-/


                      Ja mir wäre auch lieber ein Zählmodul das seine Zählerstände behält. Bei MDT ist da mal nichts dabei.

                      Warum die Busspannung ausfällt bzw ausfallen soll ist mir auch nicht klar, aber das war das Argument von MDT.

                      Muss ich mal einen Logger dranhängen oder so um das zu verifizieren.

                      Danke
                      Daniel
                      Zuletzt geändert von danielm83; 28.12.2016, 13:55.

                      Kommentar


                        #12
                        Naja, das Modul könnte ja auch einen Fehler haben (soll ja schon mal vorgekommen sein...). Für einen Workaround müsstest Du ja nur ein weiteres Item anlegen, welches Du dann regelmäßig aufsummierst, je nach gewünschter Auflösung halt in entsprechenden Zeitabständen, also etwa so:
                        Code:
                        Switch ResetCounter {knx="..."}
                        Number MyCounter "5-Minuten-Summe [%1.1f Wh]" {knx="..."}
                        Number MySum "Zählersumme [%1.1f Wh]"
                        Code:
                        rule "build sum"
                        when
                            Time cron "0 0/5 * * * ?"
                        then
                            MySum.postUpdate((MySum.state as DecimalType) + (MyCounter.state as DecimalType))
                            ResetCounter.sendCommand(ON)
                        end
                        MySum muss natürlich persistiert werden, z.B. mit RRD4J

                        Ob das jetzt genau so funktioniert, kann ich aber nicht mit Sicherheit sagen.

                        Kommentar


                          #13
                          Danke udoToni

                          es funktioniert sicher besser, als alles was ich zusammen bringen würde. Habe ich wenigstens zu Silvester eine Beschäftigung :-)

                          Danke und guten Rutsch

                          Ich gebe Bescheid obs geklappt hat

                          Kommentar

                          Lädt...
                          X