Ankündigung

Einklappen
Keine Ankündigung bisher.

Betriebsstundenzähler auf Basis eines Bool-Items

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

    Betriebsstundenzähler auf Basis eines Bool-Items

    Hallo,
    ich möchte einen Betriebsstundenzähler auf Basis eines Bool-Items erstellen.
    Meine Idee ist es, das mit eval zu realisieren und zwar nach dem Wechsel von 1 auf 0 (Ausschalten) die "prev_age" zu addieren.
    Code:
       
    [[brenner1]]
            type = bool
            visu = yes
            visu_acl = ro
            [[[betriebsstunden]]]
                type = num
                visu = yes
                visu_acl = ro
                eval = value if sh.heizung.brenner1() == 0 else (value + sh.heizung.brenner1.prev_age())
                eval_trigger = heizung.brenner1
    Leider klappt das nicht, müsste aber.
    Wo habe ich den Fehler?

    DANKE

    #2
    Was genau meinst Du mit "klappt nicht"?

    Ist der Brenner aus, dann wird nix addiert. Wenn der Brenner einschaltet, dann wird der eval oben getriggert und es wird die Zeit dazu addiert, seit dem das letzte mal getriggert wurde (als er ausging). Nun wird wieder erst dann getriggert, wenn der Brenner ausgeht.
    Da dann der Trigger aber aus ist, wird auch nix mehr addiert...

    Ich könnte mir vorstellen, das sowas klappt:
    eval = value + int(sh.heizung.brenner1.prev_value()) * sh.heizung.brenner1.prev_age()

    durch den int() wird aus True eine 1 und aus False eine 0. War der Brenner also bis jetzt an (alter Wert = 1) dann wird der Multiplikator 1 und die Zeit wird damit multipliziert und geht in die Summe ein.

    Kommentar


      #3
      bmx

      Hallo,
      danke für den Hinweis. Mit int(..) geht es nun. Zum einen kannte ich int(..) noch nicht und zum anderen dachte ich, dass ein bool immer 0 oder 1 hat.
      Wieder was dazu gelernt.
      DANKE

      Kommentar


        #4
        Eine Frage: funktionieren "prev_value" und "prev_age" auch in der älteren Version von Smarthome.pi?
        Hab nämlich mit oben angegebenem Beispiel Probleme (Betriebsstundenzähler zählt nicht - keine Fehlermeldungen im log).
        Gruß Hans

        Kommentar


          #5
          Was heißt denn "ältere Version"? In der 1.0 sollte es lt. Doku auf jeden Fall funktionieren...

          Also hast Du dieses Beispiel hier probiert?
          Code:
          [heizung]
              [[brenner1]]
                  type = bool
                  visu = yes
                  visu_acl = ro
                  [[[betriebszeit]]]
                      # in Sekunden angegeben
                      type = num
                      visu = yes
                      visu_acl = ro
                      # eval = value + int(sh.heizung.brenner1.prev_value()) * sh.heizung.brenner1.prev_age()
                      # value wird evtl. nicht wie erwartet als sh.heizung.brenner1.betriebszeit() evaluiert sondern als True oder False!
                      # daher folgendes:
                      eval = sh.heizung.brenner1.betriebszeit() + int(sh.heizung.brenner1.prev_value()) * sh.heizung.brenner1.prev_age()
                      eval_trigger = heizung.brenner1
          Aber: Bei mir hat value nicht den Wert von ... betriebszeit sondern bekommt anscheinend True oder False vom Trigger mitgeschickt. Daher habe ich es jetzt explizit geschrieben. Das sollte gehen denke ich. Bitte um Feedback!
          Zuletzt geändert von bmx; 26.03.2017, 16:31.

          Kommentar


            #6
            bmx

            Ja, value enthält nicht den alten Wert an sich, sondern true und false. Ich meine, dass value den Wert des eval_triggers hat. Kann das sein?
            So wie, du es jetzt geschrieben hast, funktioniert es bei mir auch.

            Noch einen Frage: diese Formel funktioniert gut für Items, die nicht lange auf 1 (also an) sind, wie bspw. der Ölbrenner. Für Pumpen, die relativ lange am Stück an sind, passt die Betriebsstundenermittlung nicht ganz, da die Aufsummierung je nur bei Statuswechsel erfolgt. Fällt Dir dazu eine bessere Variante ein?

            Kommentar


              #7
              Könnt ihr mir bitte helfen?
              Wie binde ich die auslösende Adresse z.B. 8/0/0 in die Itemdefinition ein?
              So wie es hier steht funktioniert es nicht.

              Code:
              [Heizung]
                 [[Brenner1]]
                      type = bool
                      visu = yes
                      visu_acl = ro
                      knx_reply = 8/0/0
                      [[[Betriebsstunden]]]
                          type = num
                          visu = yes
                          visu_acl = ro
                          eval = sh.Heizung.Brenner1.Betriebsstunden() + int(sh.Heizung.Brenner1.prev_value()) * sh.Heizung.Brenner1.prev_age()
                          eval_trigger = Heizung.Brenner1
              Welchen Fehler mache ich da?
              Gruß Hans

              Kommentar


                #8
                Tontechniker
                Bei mir funktioniert es so:

                Code:
                [heizung]
                    [[brenner]]
                        name = Brennerstatus Heizung
                        type = bool
                        visu = yes
                        visu_acl = ro
                        sqlite = yes
                        knx_dpt = 1
                        knx_cache = 0/3/91
                        knx_reply = 0/3/91
                        [[[betriebsstunden]]]
                            name = Betriebsstundenzähler Brenner Heizung in Sekunden
                            type = num
                            visu = yes
                            visu_acl = ro
                            sqlite = yes
                            eval = sh.heizung.brenner.betriebsstunden() + int(sh.heizung.brenner.prev_value()) * sh.heizung.brenner.prev_age()
                            eval_trigger = heizung.brenner
                            [[[[gesamt]]]]
                                name = Betriebsstundenzähler Brenner Heizung in Stunden
                                type = num
                                visu = yes
                                visu_acl = ro
                                sqlite = yes
                                eval = round(sh.heizung.brenner.betriebsstunden() / 60 / 60, 2)
                                eval_trigger = heizung.brenner.betriebsstunden
                            [[[[heute]]]]
                                type = num
                                visu = yes
                                visu_acl = ro
                                sqlite = yes
                                cache = yes
                                crontab = init | * * * * = 1
                                eval = round((sh.heizung.brenner.betriebsstunden() - sh.heizung.brenner.betriebsstunden.db('max', sh.time.minute.since.midnight.dbstr(), sh.time.minute.since.midnight.dbstr())) / 60 /60, 2)
                Ich habe den Betriebsstundenausgang (B4) am Stecker 41 des Ölbrenners der Heizung auf einen 230V Binäraktor gelegt. Dieser senden bei 230V (Brenner ist an) eine 1 und bei Brenner aus eine 0.

                Probier es mal aus.

                Kommentar


                  #9
                  @Tontechniker
                  knx_listen = 8/0/0

                  @Sisamiwe
                  Nicht per eval sondern als Logik und dann zusätzlich zum Statuswechsel noch einen cron spendieren. In der Logik muß dann natürlich unterschieden werden, woher der Trigger kommt, ob cron oder ob trigger vom Statuswechsel.
                  Zuletzt geändert von bmx; 26.03.2017, 19:32.

                  Kommentar


                    #10
                    Es funktioniert schon die Gesamtsumme.
                    Für die Summe "heute" kommt noch folgenden Fehlermeldung im log:
                    Code:
                    2017-03-26 20:52:00 WARNING  heizung.brenner.betriebsstunden.heute-eval Item heizung.brenner.betriebsstunden.heute: problem evaluating round((sh.heizung.brenner.betriebsstunden() - sh.heizung.brenner.betriebsstunden.db('max', sh.time.minute.since.midnight.dbstr(), sh.time.minute.since.midnight.dbstr())) / 60 /60, 2): 'SmartHome' object has no attribute 'time'
                    Muß ich "time" noch irgendwo definieren?
                    Gruß Hans

                    Kommentar


                      #11
                      Tontechniker

                      Ja, es müssen Zeit-Hilfsitems definiert werden.
                      siehe dazu den Beitrag: https://knx-user-forum.de/forum/supp...%C3%BCr-sqlite

                      Also eine Logik, die diese Zeit-Hilfsitems errechnet.
                      Gruß Michael

                      Kommentar


                        #12
                        Vielen Dank!
                        Werde ich morgen testen und dann berichten.
                        Gruß und einen schönen Abend
                        Hans

                        Kommentar


                          #13
                          Tontechniker
                          Mach mal.
                          Es wird aber wahrscheinlich bei einer Fehlermeldung oder beim Wert 0 der Items bleiben, da die DB erst gefüllt sein muss, damit die Abfrage funktioniert.

                          Kommentar


                            #14
                            Hallo Sisamiwe
                            ich bekomme immer noch jede Minute folgende Warnung im log:
                            Code:
                            2017-03-27 11:10:00 WARNING  heizung.brenner.betriebsstunden.heute-eval Item heizung.brenner.betriebsstunden.heute: problem evaluating round((sh.heizung.brenner.betriebsstunden() - sh.heizung.brenner.betriebsstunden.db('max', sh.time.minute.since.midnight.dbstr(), sh.time.minute.since.midnight.dbstr())) / 60 /60, 2): 'SmartHome' object has no attribute 'time'
                            Was bedeutet " 'SmartHome' object has no attribute 'time' "??
                            Gruß
                            Hans
                            Zuletzt geändert von Tontechniker; 27.03.2017, 10:44.

                            Kommentar


                              #15
                              Zitat von Tontechniker Beitrag anzeigen
                              Was bedeutet " 'SmartHome' object has no attribute 'time' "??
                              Dir fehlen die Items dafür. Siehe Beitrag #11.


                              Kommentar

                              Lädt...
                              X