wie sieht dein parse_item aus?
Ankündigung
Einklappen
Keine Ankündigung bisher.
Viessmann Plugin Neuentwicklung Python Hilfe
Einklappen
X
-
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:
-
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:
-
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:
-
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:
Im Plugin in der Funktion update_item habe ich das so gelöst:Code:schaltzeiten: type: bool struct: - uzsu.child uzsu: name: Schaltzeiten im UZSU dict Format viess_timer: Timer_Warmwasser
Allerdings wird die Funktion bei Änderung des UZSU-Items nicht getriggert. Wird das vom UZSU Plugin irgendwie abgefangen?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()
Hast Du vielleicht eine Idee?
Einen Kommentar schreiben:
-
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:
-
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.
Wie könnte so eine Funktion aussehen?Zitat von Morg Beitrag anzeigenDie 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.
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:
-
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:
-
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:
-
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:
-
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:
-
Wo und wie würdest Du das einbauen. Steh grad auf'm Schlauch..Zitat von Morg Beitrag anzeigenKlar. 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.
Die Logik zum Wandeln der aktuellen Timer in ein UZSU dict sieht so aus:
Danke Dir.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)
Einen Kommentar schreiben:
-
Danke, ich auch.Zitat von Morg Beitrag anzeigenZeile 813, muss "byte", nicht "bytes" heißen. Habe ich bei mir im Repo gefixed
Zur einfachen Pflege würde ich gern mein Repo umziehen, so direkt nach "viessmann".
Wir hatten hier schon mal darüber gesprochen.
Wäre das für Dich in Ordnung?Zitat von Morg Beitrag anzeigenZum 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.
Einen Kommentar schreiben:
-
Zeile 813, muss "byte", nicht "bytes" heißen. Habe ich bei mir im Repo gefixed
Einen Kommentar schreiben:
-
Ein item hat das dict und ein item wird geschalten. Die Hierarchie ist egal
Einen Kommentar schreiben:


Einen Kommentar schreiben: