Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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
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.
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.
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.
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)
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.
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:
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
... 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.
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:
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
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
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: