Ankündigung

Einklappen
Keine Ankündigung bisher.

Item Logging Erweiterung

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

    Item Logging Erweiterung

    Hallo zusammen,

    ich nutze hin und wieder das sehr nützliche Item log_change Feature, um Änderungen an einem Item Wert zurückzuverfolgen. Das Feature wird als Item Attribut

    Code:
    log_change: q_hkr_items
    und entsprechender Konfiguration der logging.yml aktiviert.

    Für Änderungen durch Logiken sieht der Logeintrag dann folgerndermaßen aus:

    Code:
    2022-01-23 09:02:56 INFO     item         Item Change: avm.dect.hkr_esszimmer.set_temperature = 8  -  caller: Logic
    Meine Frage: Können wir zusätzlich noch den Namen der Logik (entweder als erweiterung des Attributs "caller" oder auch im Attribute "source") noch hinzufügen? Gerade bei vielen möglichen Logiken ist es hilfreich zu wissen, welche Logik den Item Wert verändert hat.

    #2
    Das geht bereits. Du musst bei der Wertzuweisung in der Logik nur den Namen der Logik mit angeben.

    also statt:
    Code:
        sh.meinitem(False)
    folgendes angeben:
    Code:
        sh.meinitem(False, logic.name)
    Falls Du in einer Logik an mehreren Stellen den Wert änderst, kannst DU natürlich statt logic.name auch einen anderen String angeben (z.B. logic.name+'#1')
    Zuletzt geändert von Msinn; 24.01.2022, 21:35.
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Astrein. Danke für die Info!

      Kommentar


        #4
        wenn ich mit log_change die Änderungen von einem Item logge, kann ich den Log irgendwie beim init (cache:true) deaktivieren?

        Code:
        M1:
                name: M1
                type: bool
                cache: True
                log_change: LogItem
                #log_rules: exclude: 'init'​ ???

        Kommentar


          #5
          Wie sieht denn die Logmessage aus... steht da nicht was von caller: Cache:Init oder so..? Dann könntest du nämlich in der logging.yaml einfach einen Filter erstellen, siehe Doku für Details.

          Kommentar


            #6
            ich weiss jetzt nicht weshalb der Fehler kommt? Funktionieren tut eval und Filter jedoch so wie ich möchte,..

            es sollte nur bei Windwarnung = True geloggt werden, bei Windalarm jedoch bei True und False

            Code:
            2024-07-18  09:23:12 ERROR    lib.item.item       Wetterstation.WindWarnung: Invalid log_text template ' {eval(""" "WindWarnung" if sh.Wetterstation.WindWarnung() else "Init" """)}' - (Exception: 'SmartHome' object has no attribute 'Wetterstation')
            2024-07-18  09:23:12 ERROR    lib.item.item       Wetterstation.WindAlarm: Invalid log_text template ' {eval(""" "Init" if sh.Wetterstation.WindAlarm.changed_by() == "Init:Cache" else "WindAlarm" if sh.Wetterstation.WindAlarm() else "WindAlarm-Ende" """)}' - (Exception: 'SmartHome' object has no attribute 'Wetterstation')
            Code:
            Wetterstation:
                WindWarnung:
                    type: bool
                    cache: True
                    database: yes
                    database_maxage: 30
                    visu_acl: ro
                    knx_dpt: 1
                    knx_listen: 0/0/41
                    log_change: Operationlog
                    log_text: '{eval(""" "WindWarnung" if sh.Wetterstation.WindWarnung() else "Init" """)}'   # nur True wird geloggt da "Init" in logging.yaml gefiltert
                    log_level: WARNING​
                WindAlarm:
                    type: bool
                    cache: True
                    database: yes
                    database_maxage: 30
                    visu_acl: ro
                    knx_dpt: 1
                    knx_listen: 0/0/42
                    log_change: Operationlog
                    log_level: ERROR
                    log_text: '{eval(""" "Init" if sh.Wetterstation.WindAlarm.changed_by() == "Init:Cache" else "WindAlarm" if sh.Wetterstation.WindAlarm() else "WindAlarm-Ende" """)}'   # Init wird in logging.yaml gefiltert
            Code:
               filter_init:
                    (): lib.logutils.Filter
                    msg: "(.*)Init(.*)"​
            
               MemLogStatus:
                   # This handler is an example for logging item-value changes to a seperate log file
                   (): lib.log.ShngMemLogHandler
                   logname: mystatuslog
                   maxlen: 60
                   level: INFO
                   cache: True
                   filters: [filter_init]​
            
               items.Operationlog:
                    # Logging items with configuration: log_change: Operationlog
                    handlers: [MemLogStatus]
                    level: DEBUG​

            Kommentar


              #7
              Was hat es mit den """ auf sich? Ist das ein YAML-Format, das ich nicht kenne? Python beschwert sich jedenfalls darüber... (in Python ist """ ein Kommentar...)

              Kommentar


                #8
                da der eval Ausdruck in Anführungszeichen sein sollte, hatte ich das Problem mit Anführungszeichen im Anführungszeichen, da im eval ja auch string enthalten.

                Python erlaubt es Strings mit Triple Quotes (''' oder """) zu definieren, die es ermöglichen, sowohl einfache als auch doppelte Anführungszeichen im String zu verwenden.


                Wenn ich diesen eval Ausdruck im eval-Syntax-Prüfer ausführe gibt es auch kein Problem damit.
                Code:
                eval(""" "Init" if sh.Wetterstation.WindAlarm.changed_by() == "Init:Cache" else "WindAlarm" if sh.Wetterstation.WindAlarm() else "WindAlarm-Ende" """)



                hierfür benötige ich 3 Anführungszeichen inneinander ' + """ + "
                Code:
                log_text: '{eval(""" "WindWarnung" if sh.Wetterstation.WindWarnung() else "Init" """)}'
                komisch aber der Fehler: Exception: 'SmartHome' object has no attribute 'Wetterstation')
                Zuletzt geändert von ivande; 18.07.2024, 13:26.

                Kommentar


                  #9
                  Hm.. gibt es ggf. eine Kollision mit einem Plugin "Wetterstation"? Und dein Item "Wetterstation" ist auf der obersten Ebene?

                  Kommentar


                    #10
                    "Wetterstation" ist auf oberster Ebene, Plugin mit Wetterstation oder ähnliches gibt es keines. Wenn ich die Items ändere (toggle im Admin-Interface) dann werden die Log's auch richtig geschrieben. Beim Start von SH kommen die Fehler im smarthome-warnings oder -details log, jedoch nicht in der log-Datei (Operationlog) in welche das Item loggt.

                    Code:
                    ### beim Starten von SH (während Laden der Item's)  - smarthome-details###
                    2024-07-18 20:22:54 CEST ERROR    item              Main         Wetterstation.WindAlarm: Invalid log_text template ' {eval(""" "Init" if sh.Wetterstation.WindAlarm.changed_by() == "Init: Cache" else "WindAlarm" if sh.Wetterstation.WindAlarm() else "WindAlarm-Ende" """)}' - (Exception: 'SmartHome' object has no attribute 'Wetterstation')  --  (item.py:_log_build_text:2065)
                    
                    2024-07-18  20:22:54 ERROR    items.Operationlog  {eval(""" "Init" if sh.Wetterstation.WindAlarm.changed_by() == "Init: Cache" else "WindAlarm" if sh.Wetterstation.WindAlarm() else "WindAlarm-Ende" """)}​
                    
                    ### beim Toggeln:  Operationlog ###
                    2024-07-18 20:25:32 ERROR    item         WindAlarm
                    2024-07-18 20:25:32 ERROR    item         WindAlarm-Ende​
                    Zuletzt geändert von ivande; 18.07.2024, 19:39.

                    Kommentar

                    Lädt...
                    X