Ankündigung

Einklappen
Keine Ankündigung bisher.

Logging der Temperatur nur bei bestimmter Bedingung

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

    Logging der Temperatur nur bei bestimmter Bedingung

    Hallo,
    ich lese derzeit mit openhab die Werte meiner Wärmepumpe aus und schreibe sie (noch) in eine rrd4j-Datenbank.

    Dass rrd4j nicht so das richtige dafür ist, hab ich mittlerweile rausgefunden. Wenn ich nämlich die vergangenen Perioden auswerten möchte, verfälscht mir rrd4j die Werte zu viel, ich kann z.b. nach einiger Zeit keine Tiefst-Temperaturen mehr herausfinden, weil alles gemittelt wird. Das wird demnächst auf SQL umgestellt.

    Aber ich habe noch ein kleines Problem, welches ich lösen möchte:

    Ich logge die Sole-Temperatur meiner Wärmepumpe mit. Wenn nun die Wärmepumpe steht, wird die Sole-Temp langsam wärmer bis sie Raumtemperatur erreicht hat. Wie kann ich es erreichen, dass mir nur die Sole-Temps in die Datenbank geschrieben werden, wenn auch der Verdichter läuft?

    Vor Verdichterstart läuft die Solepumpe einige Minuten alleine und somit habe ich bei Verdichtertstart immer aussagekräftige Temperaturen.


    Die Sole-Temps bekomme ich in einem Number-Feld. Ob der Verdichter läuft oder nicht, erhalte ich über einen Switch, welcher nur gelesen werden kann.



    Oder ist das mit Openhab nicht möglich und ich müsste die Sache von der anderen Seite her angehen - also die komplette Datenbank mittels einer Auswertung abfragen und nur die Werte anzeigen, bei denen gleichzeitig auch der Verdichter läuft? Was mich dann zu meiner nächsten Frage bringen würde... Wie geht das??? Ich hab von Datenbanken keine Ahnung. Und wenn es nur so geht, dann kann ich das ja auch nicht in Openhab anziegen lassen, weil ich die Datenbank erst manuell nachbearbeiten müsste.
    Zuletzt geändert von halloween; 01.09.2015, 08:49.

    #2
    Ich empfehle Dir einen Umweg: Du persistierst einfach ein extra Number-Item ohne Binding, dessen Inhalt Du nur dann mittels Rule mit der Sole-Temperatur updatest, wenn die Pumpe läuft, also etwa:
    Code:
    Number temp_Mess {...}
    Number temp_Persist // in mysql.persist everyChange,everyMinute
    Switch Pumpe {...}
    
    rule temp_updater
    when
       Item temp_Mess changed
    then
        if (Pumpe.state==ON)
            temp_Persist.postUpdate(temp_Mess)
    end
    Roher Code, ungetestet...

    Mit dem Auswerten vergangener Perioden wirst Du Dich wahrscheinlich so oder so mit ein bisschen SQL beschäftigen müssen, weil openHAB bisher nur Zeiträume von x bis Jetzt unterstützt, aber nicht von x bis y. Also z.B. Zeige die Temperatur vom 1. bis 31. März ist nicht möglich (es sei denn, heute wäre der 31. März)

    Grafana mit Influxdb ist da auch nur begrenzt hilfreich, wäre aber eine Alternative zu SQL, mit der Einschränkung, dass immer nur ein bestimmter Zeitraum betrachtet werden kann, z.B. kannst Du nicht die Temperaturen von März 2013 und März 2014 miteinander vergleichen - oder Du müsstest die Grafen ausdrucken oder abspeichern, das ist ja nicht Sinn der Übung...

    Kommentar


      #3
      Hallo, hab jetzt mal versucht, das in eine Rule zu schreiben:

      Code:
      rule "nur wenn Heizung aktiv Soletemp speichern"
      when
         Item HeatPump_Temperature_6 or Item HeatPump_Temperature_7 changed
      then
          if (HeatPump_state_sourcepump.state==ON)
              HeatPump_aktiv_Sole_ein.postUpdate(HeatPump_Temperature_6)
              HeatPump_aktiv_Sole_aus.postUpdate(HeatPump_Temperature_7)
      end

      Folgender Fehler erscheint im openhab.log:

      Code:
      2015-10-01 13:29:16.349 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'nur wenn Heizung aktiv Soletemp speichern': Could not invoke method: org.openhab.model.script.actions.BusEvent.postUpdate(org.openhab.core.items.Item,java.lang.Number) on instance: null
      2015-10-01 13:31:18.519 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'nur wenn Heizung aktiv Soletemp speichern': Could not invoke method: org.openhab.model.script.actions.BusEvent.postUpdate(org.openhab.core.items.Item,java.lang.Number) on instance: null

      Woran kann das liegen? Muss ich irgendwas dazu importieren am Anfang der Rule?


      EDIT:
      Hab jetzt folgendes importiert:
      Code:
      //
      import org.openhab.core.library.types.*   
      import org.openhab.core.types.Command
      import org.joda.time.*
      //
      Jetzt kommt ein anderer Fehler:
      Code:
      2015-10-01 13:39:27.077 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'nur wenn Heizung aktiv Soletemp speichern': Could not invoke method: org.openhab.model.script.actions.BusEvent.postUpdate(org.openhab.core.items.Item,java.lang.Number) on instance: null
      Zuletzt geändert von halloween; 01.10.2015, 12:41.

      Kommentar


        #4
        Zitat von halloween Beitrag anzeigen
        Hallo, hab jetzt mal versucht, das in eine Rule zu schreiben:

        Code:
        rule "nur wenn Heizung aktiv Soletemp speichern"
        when
        Item HeatPump_Temperature_6 or Item HeatPump_Temperature_7 changed
        then
        ...
        Da fehlt ein "changed" ;-)
        Kind regards,
        Yves

        Kommentar


          #5
          Ich habs jetzt in zwei Zeilen geschrieben und unten beim if auch noch geschweifte Klammern hinzu gefügt, aber weiterhin kommt der Fehler, in der rrd4j-Datei werden keine Daten geschrieben.

          Da das mit Heatpump.state==on irgendwie einen Fehler gebracht hat, hab ich mal auf Pumpendrehzahl > 0 umgestellt, aber auch da funktioniert es nicht.


          Code:
          //
          import org.openhab.core.library.types.*  
          import org.openhab.core.types.Command
          import org.openhab.core.persistence.*
          import org.openhab.model.script.actions.*
          //
          
          
          rule "nur wenn Heizung aktiv Soletemp speichern"
          when
              Item HeatPump_Temperature_6 changed or
              Item HeatPump_Temperature_7 changed
          then
              if (HeatPump_percent_source_pump.state > 0) {
                  HeatPump_aktiv_Sole_ein.postUpdate(HeatPump_Temperature_6)
                  HeatPump_aktiv_Sole_aus.postUpdate(HeatPump_Temperature_7)
              }
          end

          Kommentar


            #6
            vermutlich musst Du
            Code:
            HeatPump_aktiv_Sole_ein.postUpdate(HeatPump_Temperature_6.state)
            oder
            Code:
            HeatPump_aktiv_Sole_ein.postUpdate(HeatPump_Temperature_6.state as DecimalType)
            schreiben

            Kommentar


              #7
              Super! Mit dem .state sehe ich jetzt im log, dass aktualisiert wurde, auch die rrdj-Datei wurde jetzt endlich mit neuem Zeitstempel aktualisiert. Nur in Habmin wird noch nichts angezeigt, wird wohl noch zu wenig gespeichert sein.

              Was komisches fällt mir noch auf:

              Die Werte werden im log je 2 mal zur selben Zeit aktualisert, wenn sich beide Sole-Temps ändern. Nur ein Schönheitsfehler, aber kann man das noch irgendwie einstellen, dass die or Abfrage nur einmal ausgeführt wird? Oder muss ich dann 2 getrennte Rules machen, einmal mit Sole-Vorlauf und einmal mit Sole-Rücklauf?

              Kommentar


                #8
                So ist es (2 Rules), denn die Rule triggert ja auf 2 Ereignisse und loggt dann auch 2 Werte, in diesem Fall soll aber jeweils ein Wert geloggt werden, also auch nur ein Trigger, dafür aber zwei Rules.

                Wichtig ist auch, dass für Grafen als persistence-Strategie unbedingt everyMinute gewählt wird, sonst klappt das Erzeugen der Grafen nicht. Ob das in Habmin anders ist, entzieht sich meiner Kenntnis, da ich ohnehin mit everyMinute persistiere...
                Zuletzt geändert von udo1toni; 04.10.2015, 10:56.

                Kommentar


                  #9
                  Hallo, die Regel arbeitet soweit zufriedenstellend. Nur ein kleiner Schönheitsfehler:

                  Das Waterkotte-Binding sendet anscheinend als erstes die Sole-Temp-Werte und erst danach den Kompressor-Status.

                  Wenn nun der Kompressor abschaltet, werden zu diesem Zeitpunkt (wird minütlich ausgelesen) zuerst die Sole-Temp geloggt, welche dann dank des inaktiven Kompressors wieder stark angestiegen ist. Zu diesem Zeitpunkt ist der Wert des Kompressors noch 1, weil noch kein neuer Wert vorliegt. Also wird die Rule ausgeführt. Dann kommt die Meldung, Kompressor aus und es wird nicht weiter geloggt.

                  Aber diese letzte Sole-Temp zerstört meine schöne Habmin-Kurve, weil die Sole-Temp dann wieder um einige Grad angestiegen ist, fälschlicherweise geloggt wird, weil das Binding "Kompressor aus" erst kurz darauf meldet.

                  Wie kann ich das umgehen, dass wirklich nur Werte mit aktivem Kompressor geloggt werden?

                  Kommentar


                    #10
                    ich berechne einfach den Minimumwert über 3 tage und schreibe diesen in ein rrd das hat mir zur auswertung immer gereicht. Da ich die info WP an nicht habe.

                    Kommentar


                      #11
                      Kannst du mir deine Regel dafür mal zeigen?

                      Kommentar


                        #12
                        Hab das nun einige Zeit erfolgreich am laufen.

                        Nur eines stört mich noch:

                        Wenn die Wärmepumpe abschaltet wird die niedrige Sole-Temp weiterhin gespeichert, bis der Verdichter da nächste mal startet.

                        Wie kann ich das unterbinden? Am liebsten wäre mir, wenn dann überhaupt kein Wert gespeichert werden würde. Dann hätte ich bei der Grafikausgabe nach Verdichter-Stopp einen steigende Temp bis zum nächsten Verdichter-Start mit der dann wieder höheren Temp. So bleibt die Temp jetzt nach dem heizen auf der niedigen Temp stehen und steigt dann beim nächsten Heizen schlagartig wieder auf den höheren Wert.

                        Kommentar

                        Lädt...
                        X