Einzelnen Beitrag anzeigen
  #12  
Alt 13.01.2013, 00:21
Alex Alex ist offline
Benutzer
 
Registriert seit: 19.11.2008
Ort: Gaggenau
Beiträge: 22
Alex ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo David
Zitat von DK178 Beitrag anzeigen
Hallo Niko,
Ich bin zwar nicht Niko, da ich mich aber derzeit auch mit dem RIO-Plugin beschäftige, versuche ich mich mal mit einem Kommentar: So, wie ich das Typ-Handling in Python/SmartHome.py bisher verstanden habe, würde bei den numerischen Attributen vermutlich jeweils ein DPT passen, der den entsprechenden Wertebereich abdecken kann. Sollte ein DPT mit einem größeren Wertebereich verwendet werden, als die Definition des Attributs vorsieht, musst Du halt darauf achten, nur gültige Werte über die GA zu schicken.

Wie wird folgendes übersetzt?
...
  • volume = num [0..255] -> DPT = ???
  • turnonvolume = num [0..255] -> DPT = ???
Der Wertebereich legt ein DPT-5 (8-Bit vorzeichenlos) nahe.
  • bass = num [-128..127] -> DPT = ???
  • treble = num [-128..127] -> DPT = ???
  • balance = num [-128..127] -> DPT = ???
Hier suggeriert der Wertebereich IMHO einen DPT-6 (8-Bit vorzeichenbehaftet).

Niko, ich bin an dieser Stelle jedoch etwas unsicher, ob die Abbildung des Wertebereichs [-128..127] auf den Wertebereich [-10..10], den der C5 per RIO erwartet/liefert, korrekt ist.

Aus dem Plugin: RIO-Wert [-10..10] -> Wert laut Plugin-Doku [-128..127]:
Code:
    def _decode(self, cmd, value):
        cmd = cmd.lower()

        if cmd == 'bass' or cmd == 'treble' or cmd == 'balance':
            return int(round(float(value) * (128.0 / 10.0)))
Würde der C5 per RIO einen Wert von 10 an das Plugin liefern, so ergäbe sich für das Item m.E. ein Wert von 10 * 128 / 10 = 128 -> Ausserhalb des Wertebereichs.

Das Gegenstück sieht so aus:
Code:
    def update_item(self, item, caller=None, source=None):
    ...
            if cmd == 'bass':
                self.send_set(c, z, cmd, int(round(float(item()) / (128.0 / 10.0))))
            elif cmd == 'treble':
                self.send_set(c, z, cmd, int(round(float(item()) / (128.0 / 10.0))))
            elif cmd == 'balance':
                self.send_set(c, z, cmd, int(round(float(item()) / (128.0 / 10.0))))
Wäre es nicht besser, die 128 jeweils durch 127 zu ersetzen und als Wertebereich Item: [-127..127] für RIO: [-10..10] zu definieren?

(Tatsächlich hielte ich einen Attribut-Wertebereich -10..10 oder -100..100 sogar für 'schöner'.)

<Einschub> Ich vermute ausserdem ein Problem in der Kodierung/Dekodierung von DPT-6/DPT-8-Werten / KNX-Telegrammen, weswegen ich bereits eine E-Mail an Marcus geschrieben habe.</Einschub>

  • source = num -> DPT = ???
Hier verwende ich ebenfalls ein DPT 5.
  • partymode = string [ON/OFF/MASTER] -> DPT = ???
  • donotdisturb = type must be string -> DPT = ??? und was für nen String wird erwartet
Verwende ich beides nicht.

HTH, Alex

Geändert von Alex (13.01.2013 um 00:31 Uhr)
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten