Ankündigung

Einklappen
Keine Ankündigung bisher.

Verbrauch Gas etc. -> ungewolltes item trigger bei Neustart?

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

    Verbrauch Gas etc. -> ungewolltes item trigger bei Neustart?

    Hallo

    ich habe eine recht einfache Berechnung vom Gasverbrauch:

    Code:
    [[GasVerbrauch]]
        [[[ImpulsCounter]]]
            type = num
            cache = on
            knx_dpt = 13
            knx_listen = 5/7/0
        [[[kwhGesamt]]]
            type = num
            visu_acl = ro
            eval_trigger = Heizung.GasVerbrauch.ImpulsCounter
            eval = (sh.Heizung.GasVerbrauch.kwhGesamt()+11.22)
            database@mysqldb = init
        [[[EuroGesamt]]]
            type = num
            visu_acl = ro
            eval_trigger = Heizung.GasVerbrauch.ImpulsCounter
            eval = (sh.Heizung.GasVerbrauch.EuroGesamt()+7.82)
            database@mysqldb = init
        [[[kwhGestern]]]
    u.s.w.
    pro Impuls erhöhe ich die Werte um kwh und Kosten in Euro. Funktioniert auch soweit. Problem: bei jedem Neustart von shNG triggert er kwhGesamt und EuroGesamt ebenfalls, was dann die Werte erhöht. Habe schon mit cache = on probiert..hat aber nicht geklappt Jemand eine Idee?

    Gruss, Micha
    Zuletzt geändert von bmx; 11.10.2018, 06:59. Grund: Statt QUOTE CODE genutzt

    #2
    Ich habe eine Vermutung. Was sagt nach einem Neustart das Backend, wenn Du Dir das Item Heizung.GasVerbrauch.ImpulsCounter anzeigen lässt? Interessant ist besonders "Update durch" / Geändert durch, etc.

    Da Du den Wert cachen lässt, wird er verändert (da steht nicht "Update durch: init"). Außerdem empfängst Du den Wert vom KNX Bus. Wenn beide Werte nicht übereinstimmen, hast Du auf jeden Fall eine Veränderung, die dann das triggern der anderen Items bewirkt.

    Wozu lässt Du SmartHomeNG den Wert cachen? Kannst Du ihn nicht direkt vom KNX Bus lesen?

    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Hallo

      Danke für Deine Antwort! Also..da steht: "Geändert durch KNX:1.0.45"

      Das mit dem cache hatte ich ja nur probiert. Ohne cache steht "Geändert durch init" und am Verhalten ändert sich nix. Bei jedem Neustart triggert er..

      Gruss, Micha

      Kommentar


        #4
        Der value ist 1 und bei jedem Neustart sagt er im backend "vorheriger Wert 0" und daher das triggern vermutlich oder? Nur warum ist der vorheriger Wert 0 ?

        knx_init hilft auch nicht

        Kommentar


          #5
          Der Wert ist 0, weil standardmäßig alle num Werte beim Start von SmartHomeNG mit 0 initialisiert werden (so wie str Werte mit einem leeren String und bool Werte mit False initialisiert werden).
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Aber dann hätte doch das cache helfen müssen oder nicht?

            Kommentar


              #7
              Hi,

              versuch es doch mal abzugrenzen:
              Nimm mal den knx_dpt und knx_listen raus. Wird jetzt beim Startup noch immer einer drauf gezählt?
              - Wenn ja, dann musst Du im shNG-Log (debug) mal schauen, ob beim Startup das Item ImpulsCounter von irgendwo anders gesetzt wird. Wenn Du das ausschließen kannst, dann könnte es ein Problem von shNG sein.
              - Wenn nein, liegt es am Bus, schau mal im Gruppenmonitor, ob während des Startup ein Write oder Response auf die GA 5/7/0 kommt. Alternativ kannst Du das auch im shNG-Log sehen. Ein denkbarer Fall wäre z.B. dass irgendein anderes Item ein knx_init auf diese GA macht, dies dann zu einem Response führt und so das knx_listen von Deinem Item darauf reagiert. Da würde dann ein eigenes knx_init natürlich nicht helfen.

              Mit den Findings kannst Du Dich ja dann nochmal melden, dann sehen wir weiter.

              Gruß, Waldemar
              OpenKNX www.openknx.de

              Kommentar


                #8
                ja = sprich auch ohne knx_dpt und knx_listen im logging finde bzw. gibt keine Einträge
                Zuletzt geändert von lexxmm; 04.10.2018, 13:00.

                Kommentar


                  #9
                  Hi,

                  stell doch hier mal den Logausschnitt rein, bei dem der kwhGesamt getriggert wird (im Startup-Falle) und 2-3 Seiten davor, dann schau ich mal rein, ob ich was sehe.

                  Gruß, Waldemar
                  OpenKNX www.openknx.de

                  Kommentar


                    #10
                    cat /usr/local/smarthomeNG/bla.txt | grep GasVerbrauch

                    Code:
                    2018-10-04 14:27:35 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.kwhGesamt;: (141, 'Heizung.GasVerbrauch.kwhGesamt', 1538656032462, None, 201.96, 1, 1538656032462) -- __init__.py:_query:536
                    2018-10-04 14:27:35 DEBUG item Main Item Heizung.GasVerbrauch.kwhGesamt = 201.96 via Database None None -- item.py:set:844
                    2018-10-04 14:27:35 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGesamt;: (138, 'Heizung.GasVerbrauch.EuroGesamt', 1538656031921, None, 171.02, 1, 1538656031921) -- __init__.py:_query:536
                    2018-10-04 14:27:35 DEBUG item Main Item Heizung.GasVerbrauch.EuroGesamt = 171.02 via Database None None -- item.py:set:844
                    2018-10-04 14:27:35 DEBUG scheduler Main Heizung.GasVerbrauch.EuroGestern next time: 2018-10-05 00:00:00+02:00 -- scheduler.py:_next_time:343
                    2018-10-04 14:27:35 DEBUG __init__ Main KNX[default]: Item Heizung.GasVerbrauch.EuroGestern is mapped to KNX Instance default -- __init__.py:parse_item:419
                    2018-10-04 14:27:35 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGestern;: (140, 'Heizung.GasVerbrauch.EuroGestern', 1538656036586, None, 0.0, 0, 1538656036586) -- __init__.py:_query:536
                    2018-10-04 14:27:35 DEBUG item Main Item Heizung.GasVerbrauch.EuroGestern = 0.0 via Database None None -- item.py:set:844
                    2018-10-04 14:27:35 DEBUG scheduler Main Heizung.GasVerbrauch.VerbrauchGasMonat next time: 2018-11-01 00:00:00+01:00 -- scheduler.py:_next_time:343
                    2018-10-04 14:27:35 DEBUG __init__ Main KNX[default]: Item Heizung.GasVerbrauch.VerbrauchGasMonat is mapped to KNX Instance default -- __init__.py:parse_item:419
                    2018-10-04 14:27:35 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.VerbrauchGasMonat;: (142, 'Heizung.GasVerbrauch.VerbrauchGasMonat', 1538656036526, None, 0.0, 0, 1538656036526) -- __init__.py:_query:536
                    2018-10-04 14:27:35 DEBUG item Main Item Heizung.GasVerbrauch.VerbrauchGasMonat = 0.0 via Database None None -- item.py:set:844
                    2018-10-04 14:27:37 DEBUG scheduler Main Triggering Heizung.GasVerbrauch.kwhGesamt - by: Init source: None dest: None value: {'value': 201.96, 'caller': 'Init'} -- scheduler.py:trigger:168
                    2018-10-04 14:27:37 DEBUG item Heizung.GasVerbrauch.kwhGesamt Item Heizung.GasVerbrauch.kwhGesamt = 213.18 via Init None None -- item.py:__update:707
                    2018-10-04 14:27:37 DEBUG scheduler Main Triggering Heizung.GasVerbrauch.EuroGesamt - by: Init source: None dest: None value: {'value': 171.02, 'caller': 'Init'} -- scheduler.py:trigger:168
                    2018-10-04 14:27:37 DEBUG item Heizung.GasVerbrauch.EuroGesamt Item Heizung.GasVerbrauch.EuroGesamt = 178.84 via Init None None -- item.py:__update:707
                    
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.VerbrauchGasMonat;: (142, 'Heizung.GasVerbrauch.VerbrauchGasMonat', 1538656036526, None, 0.0, 0, 1538656036526) -- __init__.py:_query:536
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Dumping Heizung.GasVerbrauch.VerbrauchGasMonat/142 with 1 values -- __init__.py:_dump:360
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.kwhGesamt;: (141, 'Heizung.GasVerbrauch.kwhGesamt', 1538656032462, None, 201.96, 1, 1538656032462) -- __init__.py:_query:536
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Dumping Heizung.GasVerbrauch.kwhGesamt/141 with 2 values -- __init__.py:_dump:360
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGesamt;: (138, 'Heizung.GasVerbrauch.EuroGesamt', 1538656031921, None, 171.02, 1, 1538656031921) -- __init__.py:_query:536
                    2018-10-04 14:27:45 DEBUG __init__ Database dump mysqldb_mysqldb Dumping Heizung.GasVerbrauch.EuroGesamt/138 with 2 values -- __init__.py:_dump:360
                    2018-10-04 14:27:48 DEBUG __init__ Database dump mysqldb_mysqldb Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGestern;: (140, 'Heizung.GasVerbrauch.EuroGestern', 1538656036586, None, 0.0, 0, 1538656036586) -- __init__.py:_query:536
                    2018-10-04 14:27:48 DEBUG __init__ Database dump mysqldb_mysqldb Dumping Heizung.GasVerbrauch.EuroGestern/140 with 1 values -- __init__.py:_dump:360
                    2018-10-04 14:28:31 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.VerbrauchGasMonat;: (142, 'Heizung.GasVerbrauch.VerbrauchGasMonat', 1538656036526, None, 0.0, 0, 1538656065577) -- __init__.py:_query:536
                    2018-10-04 14:28:31 DEBUG __init__ Main Dumping Heizung.GasVerbrauch.VerbrauchGasMonat/142 with 1 values -- __init__.py:_dump:360
                    2018-10-04 14:28:31 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.kwhGesamt;: (141, 'Heizung.GasVerbrauch.kwhGesamt', 1538656057147, None, 213.18, 1, 1538656065720) -- __init__.py:_query:536
                    2018-10-04 14:28:31 DEBUG __init__ Main Dumping Heizung.GasVerbrauch.kwhGesamt/141 with 1 values -- __init__.py:_dump:360
                    2018-10-04 14:28:31 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGesamt;: (138, 'Heizung.GasVerbrauch.EuroGesamt', 1538656057158, None, 178.84, 1, 1538656065906) -- __init__.py:_query:536
                    2018-10-04 14:28:31 DEBUG __init__ Main Dumping Heizung.GasVerbrauch.EuroGesamt/138 with 1 values -- __init__.py:_dump:360
                    2018-10-04 14:28:34 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.EuroGestern;: (140, 'Heizung.GasVerbrauch.EuroGestern', 1538656036585, None, 0.0, 0, 1538656068199) -- __init__.py:_query:536
                    2018-10-04 14:28:34 DEBUG __init__ Main Dumping Heizung.GasVerbrauch.EuroGestern/140 with 1 values -- __init__.py:_dump:360
                    Zuletzt geändert von bmx; 11.10.2018, 06:57. Grund: geändert von QUOTE auf CODE

                    Kommentar


                      #11
                      Hi,

                      das nächste mal bitte im Code-Block, damit man es besser lesen kann... Und noch was: Hättest Du das Log gleich mit geschickt, hätten wir nicht über den ImpulsCounter philosophiert, der kommt hier nämlich gar nicht vor...

                      Ich denke, das ist doch was für Martin Msinn bzw. für den Verantwortlichen vom DB-Plugin:

                      Zitat von lexxmm Beitrag anzeigen
                      Code:
                      2018-10-04 14:27:35 DEBUG __init__ Main Fetch SELECT id, name, time, val_str, val_num, val_bool, changed from item WHERE name = Heizung.GasVerbrauch.kwhGesamt;: (141, 'Heizung.GasVerbrauch.kwhGesamt', 1538656032462, None, 201.96, 1, 1538656032462) -- __init__.py:_query:536
                      2018-10-04 14:27:35 DEBUG item Main Item Heizung.GasVerbrauch.kwhGesamt = 201.96 via Database None None -- item.py:set:844
                      Wenn man sich diese Zeilen anschaut, wird das Item kwhGesamt durch die Datenbank initialisiert und bekommt seinen Wert.

                      Zitat von lexxmm Beitrag anzeigen
                      Code:
                      2018-10-04 14:27:37 DEBUG scheduler Main Triggering Heizung.GasVerbrauch.kwhGesamt - by: Init source: None dest: None value: {'value': 201.96, 'caller': 'Init'} -- scheduler.py:trigger:168
                      2018-10-04 14:27:37 DEBUG item Heizung.GasVerbrauch.kwhGesamt Item Heizung.GasVerbrauch.kwhGesamt = 213.18 via Init None None -- item.py:__update:707
                      Das hier ist nicht zu verstehen. Sollte meiner Meinung nach nicht passieren. Hat auch nichts mit ImpulsCounter zu tun, das wird vom Init ausgelöst, nach der Wertzuweisung?

                      Als Workaround könntest Du das, was im eval steht in eine Logik packen und mit if trigger['by'] = "Item" abfangen.

                      Ansonsten noch eine Frage an Martin Msinn: Ist es angedacht, dass im eval zukünftig auch das trigger-Objekt zur Verfügung steht? Ich habe mir da schon häufig trigger['by'] bzw. trigger['source'] gewünscht.

                      Gruß, Waldemar
                      Zuletzt geändert von bmx; 11.10.2018, 07:00. Grund: Statt QUOTE nun CODE genutzt
                      OpenKNX www.openknx.de

                      Kommentar


                        #12
                        Im eval wäre ein changed_by() möglich, müsste das doch gleiche Ergebnis bringen wie trigger by in der Logik?
                        Code:
                        eval: bla if not sh.item.changed_by() == "database:none" else bla

                        Kommentar


                          #13
                          Hab es mit changed_by() hinbekommen Vielen Dank!!!

                          Kommentar


                            #14
                            Hmm..leider hab ich das gleich Problem noch in einem anderen Fall. Da hilft mir nur kein changend_by().

                            Code:
                                    [[[VerbrauchGesamt]]]
                                        type = num
                                        knx_dpt = 13
                                        knx_listen = 6/7/13
                                        knx_init = 6/7/13
                                        database@mysqldb = init
                                        eval = round(value,2)
                                    [[[VerbrauchGestern]]]
                                        type = num
                                        knx_dpt = 13
                                        database@mysqldb = init
                                        crontab = 0 0 * * = 1
                                        eval = sh.Wirkleistung.KlimaDaikin.VerbrauchGesamt() - sh.Wirkleistung.KlimaDaikin.VerbrauchGesamt.db('max', '1d', '1d')
                            bei jedem Neustart triggert es VerbrauchGestern und schreibt mir den entsprechenden Wert in die Datenbank. Ich erhalte dann:

                            Code:
                             [TABLE="class: table table-striped table-hover"]
                             	 		[TR]
                             			[TD="class: py-1"]Update durch[/TD]
                             			[TD="class: py-1"]Database[/TD]
                             		[/TR]
                             		[TR]
                             			[TD="class: py-1"]Geändert durch[/TD]
                             			[TD="class: py-1"]Database[/TD]
                             		[/TR]
                             		[TR]
                             			[TD="class: py-1"]vorheriger Wert[/TD]
                             			[TD="class: py-1"]0[/TD]
                             		[/TR]
                             	 [/TABLE]
                            Mit changed_by() kommt ich zwar dazu, dass die Berechnung nur durchgeführt wird, im Fall das update nicht durch die Database erfolgt, aber was passiert sonst? else einfach weglassen geht ja nicht.

                            Gruss, Micha

                            Kommentar


                              #15
                              Hi Micha,

                              einfach
                              Code:
                              if ... else None
                              Gruß, Waldemar
                              OpenKNX www.openknx.de

                              Kommentar

                              Lädt...
                              X