Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit Plugin's

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

    Probleme mit Plugin's

    Hallo,

    evtl kann mir hier Jemand weiterhelfen, wie die Plugingeschichte genau funktioniert.

    Ich habe ein Plugin geschrieben, welches die Daten vom Tado Heizungssteuerungssystem ausliest. Mir ist aber total unverständlich wie ich jetzt zb. den Temperaturwert an das Item bringe. Ich schlage mich jetzt seit 2 Wochen damit rum und bekomme immer wieder andere Fehlermeldungen.

    Unten stehendes ist jetzt sicherlich nicht schön ( bin halt kein Programmierer) aber wenn ich den Code so ausführe, bekomme ich einen Jsonstring zurueck und mit:

    tt = jsonData['insideTemp'] steht auch der Temperaturwert in tt

    Beim Start von smarthome.py -d gibt es beim einlesen des Plugins keinerlei Fehlermeldungen. Es wird auch alle 30 Sekunden ausgeführt.

    Nun zu meiner Verständnisfrage:

    Wie komme ich an den Wert oder anders , wie kommt das Item an den Wert? Ich hab das auch schon ueber eine logik probiert aber dort kommen dann untenstehende Fehlermeldungen. Die Fehlermeldung ist nur ein Beispiel. Ändere ich etwas kommte wieder eine andere Fehlermeldung.

    Es wäre gut wenn ich verstehen könnte wie die Kommunikation dort abläuft
    Ich sage schonmal viele herzlichen dank und evtl kann mir Jemand den fehlenden Schubser geben. Und ja , da stehen an manchen Stellen bestimmt noch Einträge, die letztendlich nicht gebraucht werden

    Plugincode:
    Code:
    #!/usr/bin/env python3
    import logging
    import time
    import urllib.request
    import urllib.parse
    import json
    
    logger = logging.getLogger('tado')
    
    class tado():
    
        def __init__(self, smarthome):
            self._sh = smarthome
            
        def parse_item(self, item):
            return None
    
        def parse_logic(self, logic):
            return None
                    
                    
        def read_data(self):
            params = urllib.parse.urlencode({'username': 'user', 'password': 'passwort'})        
            f = urllib.request.urlopen("https://my.tado.com/mobile/1.5/getCurrentState?%s" % params)
            data = (f.read().decode('utf-8'))
            jsonData = json.loads(data)
            tt = jsonData['insideTemp']
    
        def temperatur(self, temperatur):
            temperatur = self.tt
            return ()
    
        def parse_logic(self, logic):
            pass
    
        def run(self):
            self.alive = True
    
        def stop(self):
            self.alive = False
    Plugin.conf:
    Code:
    [tado]
        class_name = tado
        class_path = plugins.tado
    Item.conf
    Code:
    [Tado]
                name = Tado
                
            [[Temperatur]]
                name = Temperatur
                type = num
                visu_acl = r
                sqlite = yes
                enforce_updates = true
                eval = sh.Tado.Temperatur()
                cycle = 30
    Code:
    #!/usr/bin/env python
    # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
    #########################################################################
    #
    # logics/tado.py
    #
    temperatur = sh.tado.temperatur('tt')
    
    #if "insideTemp" in temperatur:
    sh.tado.temperatur('tt')
    Code:
    2015-01-05 14:16:00,079 ERROR    Tado         Logic: Tado, File: /usr/smarthome/plugins/tado/__init__.py, Line: 53, Method: temperatur, Exception: 'tado' object has no attribute 'tt' -- scheduler.py:_task:334
    Traceback (most recent call last):
      File "/usr/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/smarthome/logics/tado.py", line 7, in <module>
        temperatur = sh.tado.temperatur('tt')
      File "/usr/smarthome/plugins/tado/__init__.py", line 53, in temperatur
        temperatur = self.tt
    AttributeError: 'tado' object has no attribute 'tt'

    #2
    Hallo vossy74,

    am besten ist, schaue Dir mal anders Plugins an. Es gibt dort zwar unterschiedlichen Lösungen, aber das Grundprinzip ist immer gleich.

    Wichtig sind 3 Bereiche, bitte Vergleich in anderen Plugins

    parse_item:
    hier wird beim Start die Verbindung zwischen den items in sh und deinem plugin gelegt. Hier sollten die von Dir vergebenen Attribute ausgewertete werden usw.

    update_item:
    das ist die Methode, die aufgerufen wird, wenn von sh ein Itemwert verändert wird. damit bekommst du die Info und kannst über Dein plugin die Daten herausschreiben.

    Deine Routine, die Daten erfasst: Hier muss auch die Übergabe an die items rein. Die Verbindung ist in parse_item ja angelegt worden.

    BTW: nach Auskunft von Marcus hat die URLLIB ein memory leak, hier bitte andere Alternativen nutzen !

    Viel Erfolg

    Orion

    Kommentar


      #3
      Beispiel:

      Hallo,

      möglicherweise ist das ecmd Plugin überschaulich und anlalog zu deiner Aufgabenstellung.
      Es gibt ein Dict für alle Items, die über ein Attribut in items.conf (z.B. mit einer Adresse / Wert / Zustand in deiner Anlage) verknüpft sind.
      Dieses Dict wird wird beim Start initialisiert, indem sh die items durchgeht und deine parse_item Methode ausführt.
      Die items werden zyklisch durch die _refresh Methode mit den aktuellen Werten aktualisiert. Diese Methode wird dem Scheduler am Anfang in der Methode run(self) bekannt gemacht.
      Mehr braucht es im Prinzip nicht. Das drumherum habe damals auch 1:1 von woanders kopiert.
      (update_item benötigst du nur, wenn du Werte in deiner Anlage setzen willst, sobald ein item in sh geändert wird.)

      DW

      Kommentar


        #4
        Hallo,

        danke für eure Antworten. Das hilft mir auf jeden fall schonmal etwas weiter.

        Kommentar

        Lädt...
        X