Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler KNX-plugin

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

    Fehler KNX-plugin

    Ich habe seit heute plötzlich einen Fehler im Login von dem KNX-plugin und kann damit nichts anfangen:

    Code:
    021-02-11 21:54:15 ERROR lib.item.item Item EG.Buero.DALI.Decke.WW.dimmen: problem running <bound method KNX.update_item of <plugins.knx.KNX object at 0x70df9eb0>>: list index out of range
    > Traceback (most recent call last):
    > File "/usr/local/smarthome/lib/item/item.py", line 1352, in __update
    > method(self, caller, source, dest)
    > File "/usr/local/smarthome/plugins/knx/__init__.py", line 682, in update_item
    > self.groupwrite(ga, item(), self.get_iattr_value(item.conf, KNX_DPT))
    > File "/usr/local/smarthome/plugins/knx/__init__.py", line 208, in groupwrite
    > pkt.extend(self.encode(payload, dpt))
    > File "/usr/local/smarthome/plugins/knx/__init__.py", line 337, in encode
    > return dpts.encode[str(dpt)](data)
    > File "/usr/local/smarthome/plugins/knx/dpts.py", line 65, in en3
    > return [(int(vlist[0]) << 3) & 0x08 | int(vlist[1]) & 0x07]
    > IndexError: list index out of range
    Ich poste mal mein struct und mein Item dazu. Allerdings selbst wenn ich da was falsch machen sollte, sollte das plugin ja nicht einen Fehler auslösen. Das der Fehler bei den anderen Items (nicht nur Büro) auf auftritt, gehe ich mal davon aus, dass das nicht das Grundproblem ist. Bis gestern lief das auch noch ohne Fehler. Kann es sein das SmartHomeNG da selbst was falsch nachinstalliert hat?

    Hier mein struct:

    Code:
    # Tunable White für DualWhite LED-Stripes, mit eldoLED
    TunableWhite_eldoLED:
        schalten:
            type: bool
            knx_dpt: 1
            enforce_updates: yes
            cache: yes
            on_change: ..sperren = False if value else None
            on_update: ..Dimmwert = min(sh...Dimmwert() + 64, 255) if value and sh...Dimmwert() > 0 else None
            Status:
                type: bool
                knx_dpt: 1
                eval: or
                eval_trigger:
                    - ...WW.schalten
                    - ...CW.schalten
            Alexa:
                alexa_actions: TurnOn TurnOff
                alexa_icon: LIGHT
                on_update:
                    - ...sperren = not value if sh....Alexa_sperrt() else None
                    - ...schalten = value
        Farbtemperatur:
            type: num
            knx_dpt: 5
            cache: yes
            alexa_actions: SetColorTemperature IncreaseColorTemperature DecreaseColorTemperature
            alexa_color_temp_delta: 1000
            Nachtmodus:
                # Tag = 0; Nacht = 1
                type: bool
                cache: yes
                eval: value
                eval_trigger: .....Nachtmodus.Lichtfarbe
                on_change: ..self = sh...self.fade(sh..Nacht(), 1, 10) if value else sh...self.fade(sh..Tag(), 1, 10)
                #on_change: ..self = sh..Nacht() if value else sh..Tag()
                Tag:
                    type: num
                    initial_value: 0
                    cache: yes
                Nacht:
                    type: num
                    initial_value: 255
                    cache: yes
        Dimmwert:
            type: num
            knx_dpt: 5
            cache: yes
            alexa_actions: AdjustBrightness SetBrightness
            alexa_item_range: 0-255
        # value[0]: 0 = ab, 1 = auf
        # value[1]: 0 = Stopp, 1 = bewegen
        dimmen:
            type: list
            knx_dpt: 3
            on_change: ..sperren = True if sh...Sperre_erlauben() and not value[0] and value[1] and not sh...schalten.Status() else None
        Sperre_erlauben:
            type: bool
            initial_value: True
            cache: yes
        Alexa_sperrt:
            type: bool
            initial_value: False
            visu_acl: rw
            cache: yes
        automatisch_entsperren:
            type: bool
            initial_value: True
            cache: yes
        sperren:
            type: bool
            knx_dpt: 1
            cache: yes
            on_update: .quittieren = True if value else None
            entsperren:
                type: bool
                eval: value if sh....automatisch_entsperren() else None
                eval_trigger: .....Nachtmodus
                on_change: ..self = False
            quittieren:
                type: bool
                enforce_updates: yes
                blinken_anzahl: 7
                blinken_puls: 3
                blinken_pause: 3
        WW:
            schalten:
                type: bool
                knx_dpt: 1
            Dimmwert:
                type: num
                knx_dpt: 5
                eval: round(sh....Farbtemperatur() / 255 * sh....Dimmwert())
                eval_trigger:
                    - ...Farbtemperatur
                    - ...Dimmwert
            dimmen:
                type: list
                knx_dpt: 3
                enforce_updates: yes
                eval: value if sh......Nachtmodus.Lichtfarbe() else None
                eval_trigger: ...dimmen
        CW:
            schalten:
                type: bool
                knx_dpt: 1
            Dimmwert:
                type: num
                knx_dpt: 5
                eval: round(abs(sh....Farbtemperatur() - 255) / 255 * sh....Dimmwert())
                eval_trigger:
                    - ...Farbtemperatur
                    - ...Dimmwert
            dimmen:
                type: list
                knx_dpt: 3
                enforce_updates: yes
                eval: value if not sh......Nachtmodus.Lichtfarbe() else None
                eval_trigger: ...dimmen
    Und das Item:

    Code:
    EG:
        Buero:
            DALI:
                Decke:
                    struct: TunableWhite_eldoLED
                    schalten:
                        knx_send: 5/5/2
                        knx_listen: 5/5/2
                        Status:
                            knx_send: 5/2/8
                            knx_reply: 5/2/8
                        Alexa:
                            alexa_name: DALI Büro
                            alexa_alias: Licht Büro, LED Büro
                            alexa_device: DALI_Buero
                            alexa_description: DALI Büro
                    Farbtemperatur:
                        alexa_device: DALI_Buero
                        alexa_item_range: 3000-6500
                        alexa_color_temp_delta: 1000
                    Dimmwert:
                        knx_send: 5/3/8
                        knx_cache: 5/3/8
                        alexa_device: DALI_Buero
                    dimmen:
                        knx_cache: 5/1/8
                    sperren:
                        knx_send: 5/4/2
                        knx_listen: 5/4/2
                        quittieren:
                            blinken_ga: 5/2/8
                    WW:
                        schalten:
                            knx_send: 5/0/9
                            knx_cache: 5/2/9
                        Dimmwert:
                            knx_send: 5/3/9
                            knx_cache: 5/2/44
                        dimmen:
                            knx_send: 5/1/9
                    CW:
                        schalten:
                            knx_send: 5/0/10
                            knx_cache: 5/2/10
                        Dimmwert:
                            knx_send: 5/3/10
                            knx_cache: 5/2/45
                        dimmen:
                            knx_send: 5/1/10

    #2
    Also durch den ganzen Wust arbeite ich mich jetzt nicht durch.

    Aber Du kannst mal die Funktion groupwrite im knx Plugin tauschen durch:
    Code:
        def groupwrite(self, ga, payload, dpt, flag='write'):
            pkt = bytearray([0, KNXD_GROUP_PACKET])
            try:
                pkt.extend(self.encode(ga, 'ga'))
            except:
                self.logger.warning(self.translate('problem encoding ga: {}').format(ga))
                return
            pkt.extend([0])
            try:
                pkt.extend(self.encode(payload, dpt))
            except:
                self.logger.warning(self.translate('problem encoding payload {} for dpt {}').format(payload,dpt))
                return
            if flag == 'write':
                flag = KNXWRITE
            elif flag == 'response':
                flag = KNXRESP
            else:
                self.logger.warning(self.translate(
                    "groupwrite telegram for {} with unknown flag: {}. Please choose beetween write and response.").format(
                        ga, flag))
                return
            pkt[5] = flag | pkt[5]
            if self.readonly:
                self.logger.info(self.translate("groupwrite telegram for: {} - Value: {} not send. Plugin in READONLY mode.").format(ga,payload))
            else:
                if self.logger.isEnabledFor(logging.DEBUG):
                    self.logger.debug(self.translate("groupwrite telegram for: {} - Value: {} sent.").format(ga,payload))
                self._send(pkt)
    Dann sollte es Dir eine Warnung ausgeben und keine Exception mehr in der Art wie geschrieben.

    Grund des Problems ist, das Du ein Item wohl mit DPT 3 definiert hast aber das vermutlich an anderer Stelle überschrieben wird durch einen normalen Wert so das es keine Liste mehr ist. Die kann dann auch nicht encoded werden und verursacht einen Fehler

    Kommentar


      #3
      Zitat von bmx Beitrag anzeigen
      Also durch den ganzen Wust arbeite ich mich jetzt nicht durch.
      Das war ja nur der Vollständigkeit halber.

      Zitat von bmx Beitrag anzeigen
      Aber Du kannst mal die Funktion groupwrite im knx Plugin tauschen durch:
      Das werde ich im nächstes Schritt mal probieren. Danke für den Code.

      Zitat von bmx Beitrag anzeigen
      Grund des Problems ist, das Du ein Item wohl mit DPT 3 definiert hast aber das vermutlich an anderer Stelle überschrieben wird durch einen normalen Wert so das es keine Liste mehr ist. Die kann dann auch nicht encoded werden und verursacht einen Fehler
      Verstehe. Das kann man ja grundsätzlich einschränken. Denn es bezieht sich ja nur auf das Item dimmen. Ich hab das jetzt mal aus dem Item + struct zusammengefügt.

      Code:
              dimmen:
                  type: list
                  knx_dpt: 3
                  knx_send: 5/1/9
                  enforce_updates: yes
                  eval: value if sh......Nachtmodus.Lichtfarbe() else None
                  eval_trigger: ...dimmen
      ... und jetzt auch das Problem gefunden. Beim Start von SmartHomeNG wird der Standardwert, also 0 (durch enforce_updates) auf den Bus geschrieben. Und damit ist der Datentyp natürlich falsch. Ich habs jetzt gelöst mit:

      Code:
      initial_value: "[0, 0]"

      Kommentar


        #4
        Wenn der Code Dir zumindest den Fehler abfängt, dann pushe ich den in develop rein....

        Kommentar


          #5
          Zitat von Cannon Beitrag anzeigen

          ... und jetzt auch das Problem gefunden. Beim Start von SmartHomeNG wird der Standardwert, also 0 (durch enforce_updates) auf den Bus geschrieben. Und damit ist der Datentyp natürlich falsch. Ich habs jetzt gelöst mit:

          Code:
          initial_value: "[0, 0]"
          Hm, also dem Sourcecode zufolge müsste der Standardwert bei einem List Item "[]" sein und nicht 0.

          Kommentar


            #6
            Wenn der Code eine Liste mit zwei Elementen erwartet (und der Fehler ja auch ein Indexfehler war), wäre eine leere Liste als Standardwert wohl keine Hilfe

            Besser wäre, das im Code abzufangen.

            Kommentar


              #7
              Zitat von bmx Beitrag anzeigen
              Aber Du kannst mal die Funktion groupwrite im knx Plugin tauschen durch:
              Ich habe das getauscht, das initial_value wieder raus genommen. Nun erhalte ich Warnungen im Log:

              2021-02-17 19:02:35 WARNING plugins.knx problem encoding payload [] for dpt 3
              Das Problem mit dem "Absturz" ist damit behoben. Allerdings frage ich mich, ob das der richtige Weg so ist. Denn die Warnungen bleiben ja dennoch und verursachen im Hinterkopf immer den Gedanken, dass hier was korrigiert werden muss. Außerdem lässt sich nicht erfahren von welchem Item der Fehler her rührt.

              Mein Vorschlag:
              Wenn der Datentyp knx_dpt: 3 ist, dann sollte, wenn der Wert nicht als Liste vorliegt der dennoch als Listenwert an den Bus gesendet werden, sprich:

              0 -> 0, 0
              1 -> 1, 1
              2 -> 2, 2
              ... usw.

              Warnung sollten in so einem Fall nicht auftreten.

              Kommentar


                #8
                Ich habe jetzt die Definition von DPT 3 nicht im Kopf, aber war da nicht was mit "auf/ab" und "Prozent" für relatives Dimmen? Also ein bool-Wert und eine Stellgröße?

                Ich glaube, der Ansatz, aus "x" ein [x, x] zu machen, ist hier nicht hilfreich. Schon gar nicht, wenn aus Versehen die falsche Richtung gedimmt wird.

                Dann sollte mMn das Plugin tatsächlich einen Fehler werfen (loggen!) und mitteilen, dass der Wert, den es erhalten hat, für den ausgewiesenen Datentyp ungültig ist.

                Kommentar


                  #9
                  Also einen Fehler wirft das Plugin ja nun mit Angabe des Problem. Daher würde ich das nicht wie von Dir vorgeschlagen ändern wollen. initial_value ist ja dafür da einen Eingangswert festzulegen. Wenn es ein Dauerhafter Wert sein soll, könnte man den auch im Cache sichern cache: yes oder in der Datenbank mit database: init (hm. geht das eigentlich? Habe ich noch nie ausprobiert)
                  Zuletzt geändert von bmx; 17.02.2021, 22:04.

                  Kommentar


                    #10
                    Zitat von Morg Beitrag anzeigen
                    Ich habe jetzt die Definition von DPT 3 nicht im Kopf, aber war da nicht was mit "auf/ab" und "Prozent" für relatives Dimmen? Also ein bool-Wert und eine Stellgröße?
                    DPT3 hat zumindest bei dimmen und auf/ab nur die Funktion Start/Stopp und auf/ab zu senden. Also mehr als 0 und 1 steht da nicht drin. Ob es noch andere Funktionen für diesen Datentyp gibt, weiß ich nicht.

                    Zitat von Morg Beitrag anzeigen
                    Dann sollte mMn das Plugin tatsächlich einen Fehler werfen (loggen!) und mitteilen, dass der Wert, den es erhalten hat, für den ausgewiesenen Datentyp ungültig ist.
                    Verstehe. Dazu sollte dann aber noch der Name des fehlerhaften Items mit ausgegeben werden.

                    Zitat von bmx Beitrag anzeigen
                    Wenn es ein Dauerhafter Wert sein soll, könnte man den auch im Cache sichern cache: yes oder in der Datenbank mit database: init (hm. geht das eigentlich? Habe ich noch nie ausprobiert)
                    cache sollte gehen, database: init sollte es auch, habe ich auch nicht probiert, aber in einem plugin gesehen.

                    Kommentar


                      #11
                      Zitat von Cannon Beitrag anzeigen
                      DPT3 hat zumindest bei dimmen und auf/ab nur die Funktion Start/Stopp und auf/ab zu senden. Also mehr als 0 und 1 steht da nicht drin. Ob es noch andere Funktionen für diesen Datentyp gibt, weiß ich nicht
                      Das ist falsch. Schau mal in die KNX Dokumentation DPT3 ist definiert als ein vorzeichenloser 3 Bit Wert (relative Änderung) und ein 1 Bit Wert (Richtung).
                      Da steht nichts von Start/Stop und ein 3 Bit Wert kann sicherlich andere Werte als 0 und 1 annehmen
                      Viele Grüße
                      Martin

                      There is no cloud. It's only someone else's computer.

                      Kommentar

                      Lädt...
                      X