Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

  • Onkelandy
    antwortet
    wie sieht dein parse_item aus?

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Onkelandy

    Meine schaltzeiten.uzsu enthält das dict und bei Änderungen in der visu mit dem widget ändert sich dieses auch. Sollte also passen.
    Meine 2 Attribute sind auch im im Admin Interface zu sehen.
    Anmerkung 2020-05-18 203548.png

    Allerdings fehlt bei den Verbundenen Triggern die meines viessmann.plugins.
    Anmerkung 2020-05-18 203548_1.png

    Bei anderen Items steht dort "bound method Viessmann.update_item of plugins.viessmann.Viess" mit dabei.

    Ich habe das struct nun mal rausgenommen und das UZSU-Item händisch angelegt. Macht aber keinen Unterschied. Der verbundene Trigger fehlt im Admin Interface und das update_item im viessmann Plugin wird nicht getriggert.

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Im Prinzip müsste dein Ansatz passen. Du erweiterst ja quasi das uzsu Item mit deinen 2 Angaben. Somit müsste es auch triggern. Check mal im Admin Tool, wie dein schaltzeiten.uzsu aussieht. Ist da wirklich das dict drin und wird es auch geschaltet? Eventuell musst du struct: uzsu.child NACH deinem manuellen uzsu Item positionieren. Da gabs aktuell ein Problem mit dem Mergen der Itemstruktur.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Im uzsu-Struct gibt es schon ein Item, das 'uzsu' heißt.

    Benenn' das doch mal um, z.B. in 'timer'write' oder so...

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Onkelandy

    Ich habe bzgl. des "Missbrauchs" der UZSU noch eine Frage.
    Aber erstmal zur Anwendung.

    Wie bereits hier beschrieben, möchte ich die Timer IN der Viessmann-Heizung über die UZSU setzen. Ich habe dazu für jede Timer-Anwendung ein entsprechenes UZSU-Item angelegt. Im Plugin lese ich die Timer der Heizung aus und bringe sie in das Format der UZSU. Dann lese ich das bestehende UZSU dict ein und modifiziere die "list" im dict entsprechend der ausgelesenen Timer.
    Das klappt auch.

    Nun möchte ich auch das Setzen der Timer in der Heizung genau so machen. Wenn die UZSU sich ändert, soll mein Plugin die UZSU auslesen und die Schaltzeiten in das Viessmann Format bringen und schreiben.

    Für beide Funktionen habe ich ein Attribut eingeführt, dass "viess_timer" heißt. Der Wert des Atrributes ist die Anwendung. Hier ein Beispiel:
    Code:
            schaltzeiten:
                type: bool
                struct:
                  - uzsu.child
    
                uzsu:
                    name: Schaltzeiten im UZSU dict Format
                    viess_timer: Timer_Warmwasser
    Im Plugin in der Funktion update_item habe ich das so gelöst:
    Code:
        def update_item(self, item, caller=None, source=None, dest=None):
            if self.alive and caller != self.get_shortname():
                self.log_info("Update item: {}, item has been changed outside this plugin".format(item.id()))
                self.log_debug("update_item was called with item '{}' from caller '{}', source '{}' and dest '{}'".format(item, caller, source, dest))
    
                if self.has_iattr(item.conf, 'viess_send'):
                  ........
                
                elif self.has_iattr(item.conf, 'viess_timer'):
                    timer_app = self.get_iattr_value(item.conf, 'viess_timer')
                    uzsu_dict = item()
                    self.log_debug('Got changed UZSU timer: {} on timer application {}.'.format(uzsu_dict, timer_app))
                    self._uzsu_dict_to_viess_timer(timer_app, uzsu_dict)
                
                elif self.has_iattr(item.conf, 'viess_update'):
                    if item():
                        self.log_debug('Reading of all values/items has been requested')
                        self.update_all_read_items()
    Allerdings wird die Funktion bei Änderung des UZSU-Items nicht getriggert. Wird das vom UZSU Plugin irgendwie abgefangen?
    Hast Du vielleicht eine Idee?

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Wieder eine aus mehreren Möglichkeiten wählen -

    entweder ein neues Item-Attribut "viess_timer", wie du geschrieben hast. Dann muss in update_item ein neuer Zweig rein, damit er überhaupt prüft, ob das gesetzt ist. Wenn gesetzt, dann einfach mit self._create_write_command(commandname, value) die Timeritems alle der Reihe nach abfragen. Dann sind die Daten aktuell

    Alternativ ein neues command einrichten, zB "viess_read: timer" und dem Item den Wert "warmwasser" zuweisen. In update_item muss das auch separat abgefragt werden, weil es nicht "ein Kommando" ist, was er senden soll, sondern mehrere. Der weitere Weg ist wie oben. Für eine durchgängig konsistente Befehlsbehandlung würde ich den ersten Weg wählen, das macht die Logik des Plugins nicht kaputt.

    Ich kann da gerne was zusammen schreiben, aber heute habe ich keine Zeit. Ggf. heute (spät) abends, kann ich aber nicht versprechen.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo Morg ,
    danke für Deine Hinweise.

    Ich möchte zuerst aber das UZSU dict durch auslesen der Timer aus der Heizung erstellen. Du hast da den Weg vorgeschlagen.

    Zitat von Morg Beitrag anzeigen
    Die Funktion im Plugin sucht auf der Basis "warmwasser" nach den Einzelitems in der command.py, fragt die der Reihe nach ab und baut das UZSU-Item zusammen.
    Wie könnte so eine Funktion aussehen?

    Ich lege Item mit bspw. mit dem Attribut: "viess_timer: warmwasser" an. Beim parsen des Items wird dann eine Funktion getriggert, die aus der command.py die entsprechenden Datenpunkte ausliest. Soweit klar.
    Aber wie passt das dann zu den bestehenden Attributen viess_read und viess_write???
    Steig das noch nicht ganz durch. Ist ja auch schon spät.


    Einen Kommentar schreiben:


  • Morg
    antwortet
    Du brauchst im Plugin eine neue Funktion, die das UZSU-Item nimmt und in das Viessmann-Format umschreibt, das gibt es ja noch nicht (oder?). Ob du dann die Konvertierung wie gezeigt in einer Logik machst, oder ob die Funktion den Namen ("warmwasser") bekommt und sich die einzelnen Items selbst sucht (ggf. abfragt), kann man sich ja überlegen.

    Dann legst du ein Item an, das z.B. über eval die Plugin-Funktion aufruft. Dann sollte das hinkommen.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Acjsp, was mir noch einfällt: da es das Plugin bisher ja noch nicht gab, sollte es vor dem PR in develop die Versionsnummer 1.0.0 bekommen

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Ad repo würde ich empfehlen, einen Fork vom offiziellen plugins Repo zu machen, develop branch zu aktualisieren und auszuchecken und dann lokal sowie im eigenen remote Repo einen Branch mit dem Namen des Plugins zu erstellen. Dort dann alle Updates machen. Sobald ein anderes Plugin aktualisiert werden soll, zurück zum develop, aktualisieren, neuen Branch, usw.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Zum Repo: das ist deins, mach, was du magst Ich habe das bei mir mittlerweile alles mit Symlinks verknüpft. Und da ich rausgefunden habe, wie Branches mit git funktionieren, muss ich nur noch die Repos abgleichen

    Für den Rest schaue ich morgen früh mal, bin gerade nicht mehr fit genug im Kopf

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Klar. Du brauchst jeweils ein "Trigger"-Item. Dieses ruft dann eine (neue) Pluginfunktion auf und übergibt den Bezeichner der "Funktionseinheit" (zB warmwasser).

    Die Funktion im Plugin sucht auf der Basis "warmwasser" nach den Einzelitems in der command.py, fragt die der Reihe nach ab und baut das UZSU-Item zusammen.
    Wo und wie würdest Du das einbauen. Steh grad auf'm Schlauch..

    Die Logik zum Wandeln der aktuellen Timer in ein UZSU dict sieht so aus:
    Code:
    #!/usr/bin/env python3
    # viessmann_timer2uzsu.py
    
    # Daten einlesen
    viessmann_timer_mo = sh.heizung.warmwasser.schaltzeiten.montag()
    viessmann_timer_di = sh.heizung.warmwasser.schaltzeiten.dienstag()
    viessmann_timer_mi = sh.heizung.warmwasser.schaltzeiten.mittwoch()
    viessmann_timer_do = sh.heizung.warmwasser.schaltzeiten.donnerstag()
    viessmann_timer_fr = sh.heizung.warmwasser.schaltzeiten.freitag()
    viessmann_timer_sa = sh.heizung.warmwasser.schaltzeiten.samstag()
    viessmann_timer_so = sh.heizung.warmwasser.schaltzeiten.sonntag()
    uzsu_dict = sh.heizung.warmwasser.schaltzeiten.uzsu()
    
    # Variablen festlegen
    viessmann_timer = {'MO':viessmann_timer_mo, 'TU':viessmann_timer_di,'WE':viessmann_timer_mi, 'TH':viessmann_timer_mi,'FR':viessmann_timer_fr, 'SA':viessmann_timer_sa, 'SU':viessmann_timer_so}
    dict_timer = {}
    nicht_belegt = '00:00'
    
    #Ermitteln aller Schaltzeiten mit Wochentagen
    for weekday in viessmann_timer:
        timer = viessmann_timer[weekday]
        for schaltzeitpaar in timer:
            for schaltzeit in schaltzeitpaar:
                time = schaltzeitpaar[schaltzeit]
                if schaltzeit == 'An':
                    value = 1
                elif schaltzeit == 'Aus':
                    value = 0
                if time != nicht_belegt:
                    if time not in dict_timer:
                        dict_timer[time] = {}
                    if value not in dict_timer[time]:
                        dict_timer[time][value] = []
                    dict_timer[time][value].append(weekday)
    
    logger.info(dict_timer)
    #dict_timer: {'14:40': {1: ['MO']}, '15:00': {0: ['MO'], 1: ['TU']}, '06:00': {1: ['MO']}, '07:00': {0: ['MO']}, '06:40': {1: ['TU', 'FR']}, '10:00': {0: ['TU']}, '22:00': {0: ['TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '04:40': {1: ['WE', 'TH', 'SA', 'SU']}}
    
    #löschen der Einträge in 'list'
    uzsu_dict['list'].clear()
    
    #Erstellen des uzsu_dict
    for time in sorted(dict_timer.keys()):
        for key in dict_timer[time]:
            rrule = 'FREQ=WEEKLY;BYDAY=' + ",".join(dict_timer[time][key])
            uzsu_dict['list'].append({'time':time, 'rrule':rrule, 'value':str(key),'active':True})
    
    #uzsu_dict: {'sunset': '20:36', 'active': False, 'interpolation': {'interval': '', 'initage': '', 'itemtype': 'bool', 'initialized': False, 'type': 'none'}, 'sunrise': '05:32', 'list': [{'time': '04:40', 'rrule': 'FREQ=WEEKLY;BYDAY=WE,TH,SA,SU', 'value': 1, 'active': True}, {'time': '06:00', 'rrule': 'FREQ=WEEKLY;BYDAY=MO', 'value': 1, 'active': True}, {'time': '06:40', 'rrule': 'FREQ=WEEKLY;BYDAY=TU,FR', 'value': 1, 'active': True}, {'time': '07:00', 'rrule': 'FREQ=WEEKLY;BYDAY=MO', 'value': 0, 'active': True}, {'time': '10:00', 'rrule': 'FREQ=WEEKLY;BYDAY=TU', 'value': 0, 'active': True}, {'time': '14:40', 'rrule': 'FREQ=WEEKLY;BYDAY=MO', 'value': 1, 'active': True}, {'time': '15:00', 'rrule': 'FREQ=WEEKLY;BYDAY=MO', 'value': 0, 'active': True}, {'time': '15:00', 'rrule': 'FREQ=WEEKLY;BYDAY=TU', 'value': 1, 'active': True}, {'time': '22:00', 'rrule': 'FREQ=WEEKLY;BYDAY=TU,WE,TH,FR,SA,SU', 'value': 0, 'active': True}], 'lastvalue': 'None'}
    
    logger.info(uzsu_dict)
    sh.heizung.warmwasser.schaltzeiten.uzsu(uzsu_dict)
    Danke Dir.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Morg Beitrag anzeigen
    Zeile 813, muss "byte", nicht "bytes" heißen. Habe ich bei mir im Repo gefixed
    Danke, ich auch.

    Zur einfachen Pflege würde ich gern mein Repo umziehen, so direkt nach "viessmann".
    Wir hatten hier schon mal darüber gesprochen.
    Zitat von Morg Beitrag anzeigen
    Zum Repo: klar, das kannst du (erstmal) so lassen, wobei es günstiger wäre, das Repo z.B. viessmann zu nennen und das Plugin direkt in den Stammordner zu werfen. Dann kann man das Repo direkt in den Pluginordner legen. Aber das ist derzeit nichts wirklich relevantes. Und wenn das Plugin in develop geht, dann brauchst du das "kleine" Repo sowieso nicht mehr. Ich habe mein Repo vom yamahayxc-Plugin archiviert und mache mir für aktuelle Arbeiten am Plugin immer einen fork vom sh.py-plugins-Repo, da die Änderungen dann ja sowieso dorthin sollen.
    Wäre das für Dich in Ordnung?

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Zeile 813, muss "byte", nicht "bytes" heißen. Habe ich bei mir im Repo gefixed

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Ein item hat das dict und ein item wird geschalten. Die Hierarchie ist egal

    Einen Kommentar schreiben:

Lädt...
X