Ankündigung

Einklappen
Keine Ankündigung bisher.

Ansatz für Berechnung der WP Taktzeit?

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

    Ansatz für Berechnung der WP Taktzeit?

    Hallo zusammen,

    ich stehe momentan auf dem Schlauch.
    Ich habe ein Item, welches je nach Kompressorstatus meiner Wärmepume True oder False ist.
    Daraus möchte ich jetzt die Takt- bzw. Pausenzeiten berechnen. Soweit so einfach. Aber mir fehlt aktuell der Ansatz...

    Ich habe es mal mit einer Logik probiert. Nur habe ich hier leider keine Ahnung, wie ich die Zeitstempel (datetime) zwischenspeichern kann?
    Dachte an string und dann strptime bzw. strftime aber die Methoden frisst er nicht. (NameError: name 'strptime' is not defined)

    Kann mir mal einer einen Schubser in die richtige Richtung geben?
    Kann ich aus der db den Zeitstempel des letzten Wertes holen?
    Geht das "nativ" über eval/eval_trigger?



    #2
    Was willst Du denn genau wissen, wie oft die Pumpe in den letzten 24 Stunden angesprungen ist? Wie lange sie in den letzten 24 Stunden gelaufen ist? Letzteres kannst Du über
    PHP-Code:
    sh.DEINITEM.db(on24h
    abfragen (wenn Du auf Develop bist). Ersteres würde ich dann über ein extra item machen mit
    PHP-Code:
    eval = sh.ZAEHLER(sh.ZAEHLER() + 1) if sh.DEINITEM() else None
    eval_trigger 
    DEINITEM 
    Daraus kannst Du dann ausrechnen, wie lange die Pumpe durchschnittlich gelaufen ist.
    Die Zeit wie lange es gelaufen ist würde ich so berechnen:
    PHP-Code:
    eval = sh.now() - sh.DEINITEM.last_change() if sh.DEINITEM() == false else None
    eval_trigger 
    DEINITEM 
    die Pause dann:
    PHP-Code:
    eval = sh.now() - sh.DEINITEM.last_change() if sh.DEINITEM() else None
    eval_trigger 
    DEINITEM 
    Wobei ich nicht sicher bin, ob man mit Datetimeobjekten so rechnen kann. Deine Pumpe darf natürlich nicht zyklisch senden, dann stimmen die Abfragen nicht.

    Kommentar


      #3
      Hallo Marco,

      vielen Dank für den Tip! *.last_change war mir nicht bekannt und genau das was ich gesucht habe.
      Ich lasse das jetzt mal mitlaufen, aber auf den ersten Blick scheint es so zu gehen:

      Code:
      [[['taktzeit']]]
            type = num
            eval = ((sh.now() - sh.wp.verdichter.status_wt_pumpe.last_change()).seconds/60) if sh.wp.verdichter.status_wt_pumpe() == False else 0
            eval_trigger = wp.verdichter.status_wt_pumpe
            sqlite = true
      [[['standzeit']]]
            type = num
            eval = ((sh.now() - sh.wp.verdichter.status_wt_pumpe.last_change()).seconds/60) if sh.wp.verdichter.status_wt_pumpe() else 0
            eval_trigger = wp.verdichter.status_wt_pumpe
            sqlite = true

      Kommentar


        #4
        Schön, dass es klappt!

        Kommentar


          #5
          Grade nochmal geschaut. Prinzipiell geht es. Wenn ich in der sh console die Ausdrücke eingebe dann bekomme ich während die WP läuft bei

          Code:
          (sh.now() - sh.wp.verdichter.status_wt_pumpe.last_change()).seconds/60 if sh.wp.verdichter.status_wt_pumpe() else 0
          Eine Zeit angezeigt. Ist ja klar. Zu dem Zeitpunkt ist der status 1.

          Dummerweise steht in der DB immer 0. Nur am Anfang hat es einmal geklappt, dass der Wert auch geschrieben wurde...?

          Kann es sein, dass es am handling von bool/int/float liegt und sowas hier besser wäre:

          [[['status_wt_pumpe']]]
          type = num
          eval_trigger = wp.verdichter.drehzahl_wt_pumpe
          eval = 1 if sh.wp.verdichter.drehzahl_wt_pumpe() > 0 else 0
          sqlite = true
          cache = true
          [[['taktzeit']]]
          type = num
          eval = (sh.now() - sh.wp.verdichter.status_wt_pumpe.last_change()).se conds/60 if sh.wp.verdichter.status_wt_pumpe() == 0.0 else 0.0
          eval_trigger = wp.verdichter.status_wt_pumpe
          sqlite = true
          [[['standzeit']]]
          type = num
          eval = (sh.now() - sh.wp.verdichter.status_wt_pumpe.last_change()).se conds/60 if sh.wp.verdichter.status_wt_pumpe() == 1.0 else 0.0
          eval_trigger = wp.verdichter.status_wt_pumpe
          sqlite = true

          Zuletzt geändert von DerSeppel; 11.11.2015, 07:55.

          Kommentar


            #6
            Ich habe nochmal ein bisschen experiementiert.
            Wenn ich ein Item vom typ "num" anlege und nicht "anfasse", dann steht es intial auf 0 (int).
            Sobald meine Logik einmal 0 geschrieben hat, steht sie auf 0.0 (float).

            Kann es sein, dass da dann was bei der Evaluierung schief geht? Ich habe das Gefühl, dass außer beim ersten Start IMMER der else-Zweig zum Tragen kommt.

            Kommentar


              #7
              Hallo Seppl,

              das mit 0 und 0.0 ist an egal. Beim allerersten Start ist now-last_change sehr klein << 1. Daher wird das .seconds wahrscheinlich eine 0 ergeben. Und 0/60 ist 0.

              Bis bald

              Marcus

              Kommentar


                #8
                Habe das ganze mal eingegrenzt. Es liegt wohl wirklich an *.last_change.
                Der Ablauf ist ja so:

                - Die Pumpendrehzahl geht auf 0 => Update des Items
                - Der Pumpenstatus wird evaluiert => Update des Items
                - Die Taktzeit wird berechnet mit Pumpenstatus.last_change.

                Da scheint "last_change" schon dem gerade aktuell geschriebenen Wert entsprechen. Daher Jetzt - Jetzt = 0. Das erklärt auch, warum es beim ersten mal geht.

                Kann man das irgendwie umgehen?

                Kommentar


                  #9
                  Schon mal die Doku angesehen, was es für Funktionen neben last_change gibt?

                  Kommentar


                    #10
                    Hmja ... doch, aber irgendwie hatte bisher keines zur Lösung geführt.
                    Habe jetzt einfach last_change des taktzeit items verwendet. So geht es, auch wenn es gefühlsmäßig nicht ganz optimal ist.

                    Kannst du bei der Gelegenheit den Unterschied zwischen last_change und prev_change erklären? Wird mir aus der Beschreibung nicht klar.

                    Kommentar


                      #11
                      Hallo,

                      prev_change ist der Zeitpunkt der vorletzten Änderung. last_change der Zeitpunkt der letzten Änderung.
                      Verwende doch einfach prev_age()

                      Das ist (last_change - prev_change).seconds

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Du hast auch echt an alles gedacht ...

                        Kommentar

                        Lädt...
                        X