Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

    #31
    Morg

    Ich möchte mich mit Onkelandy noch abstimmen, welche Items für das UZSU-dict mindestens benötigt werden und ob es möglich ist, das UZSU-dict auch in das Top-Level-Item für die Timer-Anwendung schreiben kann.

    Frage an Dich: Siehst Du eine Möglichkeit, das man mit nur einem Item pro Timer-Anwendung (bspw. warmwasser.timer) und einem viessmann-command alle 7 Datenpunkte "auf einmal" ausliest und gleich in das USZU-dict-Item schreibt. Moment haben wir ja immer die Zuordnung 1Item - 1Datenpunkt.

    Kommentar


      #32
      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.

      Rückwärts muss das UZSU-Item über update_item() eine Funktion aufrufen, die die Daten splittet und in die Einzelitems schreibt oder direkt die Daten in die Heizung schiebt.

      Kommentar


        #33
        Die uzsu braucht zumindest diese Elemente im dict:
        Code:
        {'active':True, 'list':[
        {'value':100, 'active':True, 'rrule':'FREQ=DAILY;INTERVAL=2', 'time': '16:30'},
        {'value':0, 'active':True, 'rrule':'FREQ=DAILY;INTERVAL=2', 'time': '17:30'}],
        'interpolation': {'interval': 5, 'type': 'cubic', 'initialized': False, 'itemtype': 'num', 'initage': 0}
        }

        Kommentar


          #34
          Morg

          Ich habe es heute endlich mal geschafft, die von Dir überarbeitete Version des Viessmann Plugins in meinen Master einzuspielen.
          Dabei gibt es eine Fehlermeldung:
          Code:
          2020-05-10 15:03:10 ERROR plugins.viessmann viessmann: send_command failed with error: error receiving response: unsupported operand type(s) for ** or pow(): 'int' and 'type'.
          2020-05-10 15:07:35 ERROR plugins.viessmann viessmann: send_command failed with error: error receiving response: unsupported operand type(s) for ** or pow(): 'int' and 'type'.
          Wo muss ich anfangen zu suchen?

          Kommentar


            #35
            Zitat von Onkelandy Beitrag anzeigen
            Die uzsu braucht zumindest diese Elemente im dict:
            Danke.

            Muss man immer ein Sub-Item mit "uzsu" anlegen, oder kann man das uzsu-dict auch direkt in das Item schreiben?

            Kommentar


              #36
              Ein item hat das dict und ein item wird geschalten. Die Hierarchie ist egal

              Kommentar


                #37
                Zeile 813, muss "byte", nicht "bytes" heißen. Habe ich bei mir im Repo gefixed

                Kommentar


                  #38
                  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?

                  Kommentar


                    #39
                    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.

                    Kommentar


                      #40
                      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

                      Kommentar


                        #41
                        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.

                        Kommentar


                          #42
                          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

                          Kommentar


                            #43
                            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.

                            Kommentar


                              #44
                              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.


                              Kommentar


                                #45
                                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.

                                Kommentar

                                Lädt...
                                X