Ankündigung

Einklappen
Keine Ankündigung bisher.

Klingel-Logger plugin

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

    Klingel-Logger plugin

    Hallo ich versuche gerade ein Plugin zu schreiben, bei dem ich aus einer Logik die Methode klingeln() aufrufe. Diese sollte mir einen neuen Eintrag im klingelloggerhaustuer hinzufügen, welchen ich in meiner Smartvisu mit dem status.log widget anzeigen möchte.
    Bis jetzt funktioniert der Methodenaufruf aus der logik, jedoch wird in meinem Logger in der Smartvisu nichts angezeigt.
    Könnte mir jemand dabei bitte helfen?

    mfg Thomas


    Code:
    #!/usr/bin/env python3
    
    import lib.log
    import logging
    
    logger = logging.getLogger('')
    
    class klingellogger():
    
        def __init__(self, smarthome):
            self._sh = smarthome
            self._klingellog = lib.log.Log(smarthome, 'klingellogerhaustuer', ['Datum'])
    
        def run(self):
            self.alive = True
          
        def stop(self):
            self.alive = False
        
        def klingeln(self):
            self._klingellog.add(['test'])
            logger.info("klingel")
    
    if __name__ == '__main__':
        logging.basicConfig(level=logging.DEBUG)
        klingellog = Plugin('klingellogger')
        klingellog.run()

    #2
    Hallo,

    das Plugin sieht soweit in Ordnung aus. Ich vermute ein Problem mit dem Widget/Kommunikation.
    Du solltest Dir mal den smartVISU Debug-Output ansehen.

    Bis bald

    Marcus

    Kommentar


      #3
      Danke für deine Antwort. Kann ich jedoch nicht einfach das widget wie folgt verwenden damit es funktioniert? Oder muss ich dem system den "klingelloggerhaustür" noch irgendwie bekannt machen?

      Code:
      {{ status.log('klingellog', 'klingelloggerhaustuer', 10) }}

      Kommentar


        #4
        Hallo,

        anscheinend kannst Du es nicht einfach so verwenden. Deswegen sollst Du Dir die Kommunikation mit der smartVisu ansehen. Mit der kenne ich mich nicht aus.

        Bis bald

        Marcus

        Kommentar


          #5
          Hallo
          vielen Dank für den Tipp, werde ich mir ansehen und versuchen eine Lösung zu finden.

          Kommentar


            #6
            Hallo
            ich habe nun die Lösung gefunden und mir gleich ein universelles logger-plugin geschrieben, mit dem ich logs für das status.log widget erstellen kann.
            Da ich denke dies könnte mehreren eine Hilfe sein, stelle ich hier mein plugin kurz vor.

            1. Der angehängte Ordner muss (entpackter) in das plugins Verzeichniss kopiert werden.
            2. In der etc/plugin.conf Datei muss der oder auch die logger, wie unten beispielsweise gezeigt, eingebunden werden. Dabei ist es wichtig, dass der Pluginnamen dem logname entspricht. Mit count kann eine maximale Anzahl an gespeicherten Logs eingestellt werden, default ist dabei 50. Falls mehrere verschiedene Logs gewünscht sind, einfach den folgenden Block erneut einfügen und den Pluginnamen, logname und count entsprechend ändern. Der class_name und class_path müssen dabei so belassen werden.
            Code:
            [klingellogger]
                    class_name = logger
                    class_path = plugins.logger
                    logname = klingellogger
                    count = 15
            3. In einer logik kann nun wie unten gezeigt die log Methode über den Pluginnamen aufgerufen werden, mit der ein neuer log erstellt wird. Dabei ist der erste Parameter ein gewünschter Text, der angezeigt werden soll und der zweite Parameter das level des Logs, dies kann info,warning oder error sein, default ist info.
            Code:
            sh.klingellogger.log('Die Klingel wurde betaetigt!', 'info')
            4. Angezeigt wird der erstellte Log in der SmartVisu mit dem status.log Widget wie unten gezeigt.
            Code:
            {% import "status.html" as status %}{{status.log('klingellogger', 'klingellogger', 15) }}
            Edit: Da der Anhang nicht wirklich tut was er soll, muss dieser code manuell in einer datei namens __init__.py in einem Verzeichniss namens logger im plugin Verzeichniss eingefügt werden.
            Code:
            #!/usr/bin/env python3
            
            import lib.log
            import datetime
            
            class logger():
            
                def __init__(self, smarthome, logname, count=50):
                    self._sh = smarthome
                    self._logname = logname
                    self._count = int(count)
                    self._log = lib.log.Log(smarthome, self._logname, ['time', 'thread', 'level', 'message'], self._count)
            
                def run(self):
                    self.alive = True
                  
                def stop(self):
                    self.alive = False
                
                def log(self, msg, loglevel='info'):
                    timestamp = datetime.datetime.now()
                    self._log.add([timestamp, self._logname, loglevel, msg])
            
            if __name__ == '__main__':
                Plugin(self._logname).run()
            Ich hoffe, dass dieser logger für einige von euch nützlich ist.
            MfG Thomas
            Angehängte Dateien
            Zuletzt geändert von hijacker7; 27.05.2015, 20:41.

            Kommentar


              #7
              Hallo Thomas,
              sehr interessant - ich komm nur noch nicht mit Punkt 3 klar. Wie müßte beispielsweise die entsprechende Logik aussehen, wenn das Klingelsignal 100/1/1 wäre?
              Gruß
              Hans

              Kommentar


                #8
                Hallo Hans,
                du müsstest ein Item mit der Gruppenadresse anlegen, welches dann bei Veränderung eine Logik triggert. In dieser Logikdatei könntest du dann wie in Punkt 3 die Methode aufrufen.

                Jedoch musste ich gerade feststellen, dass es schon einen solchen Logger im develop gibt...
                Da dieser "memlog" weit umfangreicher und auch umgänglicher ist als meiner , würde ich dir diesen empfehlen. Schau hier: https://github.com/mknx/smarthome/tr...plugins/memlog

                Gruß Thomas

                Kommentar


                  #9
                  Hallo Thomas,

                  Vielen Dank! Das Feature habe ich vermisst und memlog auch nicht gesehen. Ich habe Beides erfolgreich ausprobiert wobei ich mit Deine Dokumentation erheblich besser klargekommen bin.

                  Viele Grüße,

                  Jan

                  Kommentar


                    #10
                    Hi zusammen!
                    Danke für die gute Idee.. hab es jetzt mal mit memlog versucht, im Großen und Ganzen klappt es, Änderungen eines Items ins Log zu schreiben.. wobei es mit dem Ansatz hier sicher simpler wäre
                    Was ich allerdings noch nicht kapiere.. wie kann ich über eine Logik ins Log schreiben? Über sh.memlog((sh.now(), 'INFO', 'Text')) passiert irgendwie nix. In der Plugin-Config steht das:
                    Code:
                    [memlog]
                       class_name = MemLog
                       class_path = plugins.memlog
                       name = Anwesenheit
                       mapping = time | level | message
                    Wäre über nen Hinweis froh.. Danke!

                    Kommentar


                      #11
                      Hallo Andy,

                      anbei meine funktionierende Konfiguration:

                      Code:
                      [klingellogger]
                         class_name = MemLog
                         class_path = plugins.memlog
                         name = klingellogger
                      Code:
                      sh.klingellogger('INFO', 'Haupteingangstuer: es klingelt!')
                      Code:
                      <h3>Türklingel</h3>
                      {% import "status.html" as status %}
                      {{status.log('klingellogger_index', 'klingellogger', 5) }}
                      Viel erfolg und viele Grüße,

                      Jan

                      Kommentar


                        #12
                        Perfetto, vielen Dank. Klappt jetzt auch bei mir Am besten keine zusätzlichen Parameter im plugin.conf angeben, dann scheint es zu passen. Dass "mappings" eigtl. mapping heißen sollte ist vermutl. das kleinste Problem, hehe..

                        Kommentar


                          #13
                          Hi,

                          wie sieht es dann in euer Visu aus?

                          Gruß Manuel

                          Kommentar


                            #14
                            Hi Manuel!

                            das hängt ein bisschen von deinem Design und CSS ab.. und wie du es einbindest..
                            Ich hab das als Block gemacht:
                            Code:
                            {% import "status.html" as status %}
                            <div class="block">    Anwesenheit:<br>
                            {{status.log('ekeylogger', 'Anwesenheitslogger', 10) }}
                            </div>
                            Ich habe dann 2 Blöcke für Memlog nebeneinander und darunter das normale Systemlog. Da ich's grad neu gestartet hab, ist nur ein Eintrag im linken Log und noch keiner im rechten. Die Liste füllt sich dann einfach nach und nach so lange bis die Maximalzahl (bei mir 10, siehe oben) erreicht ist.

                            memlog.JPG

                            Kommentar


                              #15
                              Verstehe ich das richtig, der Log wird nicht als log-Datei abgespeichert sondern bleibt im Speicher und steht somit bei einem Neustart nicht zur Verfügung?

                              Kommentar

                              Lädt...
                              X