DPT5 - set-Befehl 1..8 statt 1..255

Begonnen von Bronze, 13 September 2020, 13:51:13

Vorheriges Thema - Nächstes Thema

Bronze

Hallo,
vielleicht ist das eher eine Anfängerfrage, ich versuche es einmal hier.

Eine über KNX angeschlossene Vallox-Lüftung lässt sich von Stufe 1 bis 8 manuell über ein Bedienungspanel steuern.
Das geht auch über die KNX-Anbindung nach FHEM.
Dort wählte ich den Datentyp DPT5, also einen Zahlenbereich von 1 bis 255.
Nun kann man über das Reading die Umsetzung von der Analogen Stufe 1..8 und der FHEM-Stufe 1..255 ablesen, so entspricht Stufe 3 etwa 95 und Stufe 8 255.

Wie kann man diese Umsetzungstabelle (1-31, 2-63, 3-95, 4-127, 5-159, 6-191, 7-223, 8-255) in FHEM einstellen? Ich möchte nur die Werte 1..8 angezeigt haben und zum Einstellen (Slider) per set verwenden?

erwin

Hi,

wenn das wirklich ein dpt5 ist (? doku vom Vallox-KNX Interface) und die Werte im getG1-reading stehen, dann würde ich folgendes ausprobieren:
im KNX Device ein attr statecmd definieren:
attr <device> stateCmd {$state = ((ReadingsNum("$name","getG1",0) +1) / 32)}
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

EIB-Fan

Hallo Bronze,

das sollte mit widgetOverride funktionieren.

Beispiel
attr Device widgetOverride status-get:slider,0,1,8

Den Code musst du auf dein Device anpassen.

Viel Erfolg.

Gruß Jens

Bronze

@Erwin:
Das stateCmd hat funktioniert, der state zeigt nun die umgerechnete Lüfterstufe an. Prima!

@EIB-Fan:
Das set über den Slider klappt noch nicht.
Was im Weg steht ist wohl ein Eintrag in den Internals:

SETSTRING
g4:off,on g2:slider,0,2,255

Der wurde wohl wegen der Definition mit 0/4/7:dpt5:set so gesetzt, und ich weiß jetzt nicht, wie ich das wieder korrigiert bekomme?

erwin

Hi Bronze,

ich würde es mit:
widgetoverride setG2:slider,0,1,8
bzw.
widgetoverride setG2:slider,0,31,255
versuchen.
Damit stimmt zwar die "Umrechnung (noch) nicht, aber prinzipiell sollte das schon funktionieren.
Poste bitte ein 'list <device>' sonst wird das zum Ratespiel.

l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Bronze

Hier erstmal die Liste mit Dank fürs Anschauen vorab:
Internals:
   CFGFN     
   DEF        0/4/2:dpt5:StufeIst:get 0/4/7:dpt5:StufeSoll:set 0/4/8:dpt1.001:GeraetStatus:get 0/4/0:dpt1.001:GeraetSchalten:set 0/4/4:dpt9.001:Aussenluft:get 0/4/5:dpt9.001:Fortluft:get 0/4/3:dpt9.001:Abluft:get 0/4/6:dpt9.001:Zuluft:get 0/4/10:dpt1.001:BypassStatus:get 0/4/11:dpt9.001:BypassSoll:set 0/4/12:dpt9.001:BypassIst:get
   DEVNAME    Lueftung_OG
   FIRSTGADNAME StufeIst
   FUUID      5f5bb0d2-f33f-1985-9700-b61da9e5d1e5276d
   GETSTRING  Abluft:noArg BypassSoll:noArg StufeIst:noArg StufeSoll:noArg BypassStatus:noArg GeraetStatus:noArg GeraetSchalten:noArg Fortluft:noArg Aussenluft:noArg BypassIst:noArg Zuluft:noArg
   IODev      KNX
   KNX_MSGCNT 1417
   KNX_RAWMSG C01123w0040607d0
   KNX_TIME   2020-09-19 10:57:02
   LASTInputDev KNX
   MSGCNT     1417
   NAME       Lueftung_OG
   NR         1118
   NTFY_ORDER 50-Lueftung_OG
   SETSTRING  BypassSoll:slider,-670760,13415,670760 StufeSoll:slider,0,2,255 GeraetSchalten:off,on
   STATE      2
   TYPE       KNX
   GADDETAILS:
     Abluft:
       CODE       00403
       GROUP      0/4/3
       MODEL      dpt9.001
       NO         7
       OPTION     get
       RDNAMEGET  Abluft-get
       RDNAMEPUT  Abluft-put
       RDNAMESET 
       SETLIST    :slider,-670760,13415,670760
     Aussenluft:
       CODE       00404
       GROUP      0/4/4
       MODEL      dpt9.001
       NO         5
       OPTION     get
       RDNAMEGET  Aussenluft-get
       RDNAMEPUT  Aussenluft-put
       RDNAMESET 
       SETLIST    :slider,-670760,13415,670760
     BypassIst:
       CODE       0040c
       GROUP      0/4/12
       MODEL      dpt9.001
       NO         11
       OPTION     get
       RDNAMEGET  BypassIst-get
       RDNAMEPUT  BypassIst-put
       RDNAMESET 
       SETLIST    :slider,-670760,13415,670760
     BypassSoll:
       CODE       0040b
       GROUP      0/4/11
       MODEL      dpt9.001
       NO         10
       OPTION     set
       RDNAMEGET 
       RDNAMEPUT 
       RDNAMESET  BypassSoll-set
       SETLIST    :slider,-670760,13415,670760
     BypassStatus:
       CODE       0040a
       GROUP      0/4/10
       MODEL      dpt1.001
       NO         9
       OPTION     get
       RDNAMEGET  BypassStatus-get
       RDNAMEPUT  BypassStatus-put
       RDNAMESET 
       SETLIST    :off,on
     Fortluft:
       CODE       00405
       GROUP      0/4/5
       MODEL      dpt9.001
       NO         6
       OPTION     get
       RDNAMEGET  Fortluft-get
       RDNAMEPUT  Fortluft-put
       RDNAMESET 
       SETLIST    :slider,-670760,13415,670760
     GeraetSchalten:
       CODE       00400
       GROUP      0/4/0
       MODEL      dpt1.001
       NO         4
       OPTION     set
       RDNAMEGET 
       RDNAMEPUT 
       RDNAMESET  GeraetSchalten-set
       SETLIST    :off,on
     GeraetStatus:
       CODE       00408
       GROUP      0/4/8
       MODEL      dpt1.001
       NO         3
       OPTION     get
       RDNAMEGET  GeraetStatus-get
       RDNAMEPUT  GeraetStatus-put
       RDNAMESET 
       SETLIST    :off,on
     StufeIst:
       CODE       00402
       GROUP      0/4/2
       MODEL      dpt5
       NO         1
       OPTION     get
       RDNAMEGET  StufeIst-get
       RDNAMEPUT  StufeIst-put
       RDNAMESET 
       SETLIST    :slider,0,2,255
     StufeSoll:
       CODE       00407
       GROUP      0/4/7
       MODEL      dpt5
       NO         2
       OPTION     set
       RDNAMEGET 
       RDNAMEPUT 
       RDNAMESET  StufeSoll-set
       SETLIST    :slider,0,2,255
     Zuluft:
       CODE       00406
       GROUP      0/4/6
       MODEL      dpt9.001
       NO         8
       OPTION     get
       RDNAMEGET  Zuluft-get
       RDNAMEPUT  Zuluft-put
       RDNAMESET 
       SETLIST    :slider,-670760,13415,670760
   GADTABLE:
     00400      GeraetSchalten
     00402      StufeIst
     00403      Abluft
     00404      Aussenluft
     00405      Fortluft
     00406      Zuluft
     00407      StufeSoll
     00408      GeraetStatus
     0040a      BypassStatus
     0040b      BypassSoll
     0040c      BypassIst
   Helper:
     DBLOG:
       :
         LOG_Db:
           TIME       1599976800.12952
           VALUE      off
       Abluft-get:
         LOG_Db:
           TIME       1600504600.62289
           VALUE      24.00
       Aussenluft-get:
         LOG_Db:
           TIME       1600505761.97301
           VALUE      19.00
       BypassStatus-get:
         LOG_Db:
           TIME       1600497216.23247
           VALUE      on
       Fortluft-get:
         LOG_Db:
           TIME       1600502880.51963
           VALUE      23.00
       GeraetSchalten-set:
         LOG_Db:
           TIME       1600474486.80309
           VALUE      on
       GeraetStatus-get:
         LOG_Db:
           TIME       1600474492.31049
           VALUE      on
       StufeIst-get:
         LOG_Db:
           TIME       1600459376.10139
           VALUE      63
       StufeSoll-set:
         LOG_Db:
           TIME       1600459376.0008
           VALUE      76
       Zuluft-get:
         LOG_Db:
           TIME       1600505822.11076
           VALUE      20.00
       getG1:
         LOG_Db:
           TIME       1600452483.16571
           VALUE      63
       getG3:
         LOG_Db:
           TIME       1600449235.81438
           VALUE      on
       getG5:
         LOG_Db:
           TIME       1600458736.41833
           VALUE      17.00
       getG6:
         LOG_Db:
           TIME       1600452445.07079
           VALUE      24.00
       getG7:
         LOG_Db:
           TIME       1600453546.23394
           VALUE      24.00
       getG8:
         LOG_Db:
           TIME       1600456759.75933
           VALUE      18.00
       last-sender:
         LOG_Db:
           TIME       1600474487.63866
           VALUE      1/1/35
       setG2:
         LOG_Db:
           TIME       1600449433.58906
           VALUE      74
       setG4:
         LOG_Db:
           TIME       1600449234.47652
           VALUE      on
       state:
         LOG_Db:
           TIME       1600452483.16571
           VALUE      2
   READINGS:
     2020-09-13 08:00:00                   off
     2020-09-19 10:36:40   Abluft-get      24.00 &deg;C
     2020-09-19 10:56:01   Aussenluft-get  19.00 &deg;C
     2020-09-19 08:33:36   BypassStatus-get on
     2020-09-19 10:08:00   Fortluft-get    23.00 &deg;C
     2020-09-19 02:14:46   GeraetSchalten-set on
     2020-09-19 02:14:52   GeraetStatus-get on
     2020-09-18 22:02:56   StufeIst-get    63
     2020-09-18 22:02:55   StufeSoll-set   76
     2020-09-19 10:57:02   Zuluft-get      20.00 &deg;C
     2020-09-18 20:08:03   getG1           63
     2020-09-18 19:13:55   getG3           on
     2020-09-18 21:52:16   getG5           17.00 &deg;C
     2020-09-18 20:07:25   getG6           24.00 &deg;C
     2020-09-18 20:25:46   getG7           24.00 &deg;C
     2020-09-18 21:19:19   getG8           18.00 &deg;C
     2020-09-19 10:57:02   last-sender     1/1/35
     2020-09-18 20:08:03   setG2           74
     2020-09-18 19:13:54   setG4           on
     2020-09-19 10:57:02   state           2
Attributes:
   IODev      KNX
   event-on-change-reading .*
   icon       vent_ventilation_control
   room       KNX->Lueftung
   stateCmd   {$state = ((ReadingsNum("$name","getG1",0) +1) / 32)}
   widgetOverride setG2:slider,0,1,8

Bronze

Auch mit

widgetoverride setG2:slider,0,31,255

geht die vorhandene Einstellung in den Internals

SETSTRING
StufeSoll:slider,0,2,255

vor, d.h. 2er-Schritte von Null bis 255.

erwin

Hallo Bronze,

die schlechte Nachricht vorweg: Es gibt keine saubere Lösung, weil alles was man mit Attributen beeinflusssen kann, passiert nachdem der Wert (beim senden) bereits auf dem Bus gesendet ist.
ich habe deine def nachgebaut, folgende Lösung ist möglich, das Problem ist, dass StufeSoll 1-8 auf dem Bus gesendet wird und sofort nachher der "richtige" Wert (31,63,....). Wenn das kein Problem für deine Lüftung ist....
attr <device> stateCmd {if ($gadName eq 'StufeIst') {
    $state = int((ReadingsNum("$name",'StufeIst-get',0) +1) / 32);
  }
  if ($gadName eq 'StufeSoll') {
    if (ReadingsNum("$name",'StufeSoll-set',0) <= 8 && ReadingsNum("$name",'StufeSoll-set',0) > 0) {
      fhem "sleep 0.1;set $name StufeSoll " . (ReadingsNum("$name",'StufeSoll-set',0) * 32 -1);
      $state = int(ReadingsNum("$name",'StufeSoll-set',0));
    } else {
      $state = int((ReadingsNum("$name",'StufeSoll-set',0) +1) / 32);
    }
  } else {$state;}
}

...wobei das sleep 0.1 sehr wichtig ist, sonst kommen die internen Logiken völlig durcheinander !!!
und:
attr <device> StufeSoll:slider,0,1,8
...mit Vorsicht zu genießen!
l.g. erwin

PS: Ich bastle noch an einer Variante mit eventmap, aber das wird dauern....
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Bronze

Hallo Erwin,
vielen Dank für Deinen Einsatz.

Ich habe das Problem vermutlich verstanden.

Könnte eine andere Lösung sein, dass man einen Dummy definiert und dann über die Oberfläche abfragt und den erhaltenen Wert 1..8 dann über eine Logik zum Setzen von StufeSoll-set umsetzt? Dann könnte man schließlich auch über Stufe=0 das Gerät ausschalten und umgekehrt.

Vielen Dank.


erwin

#9
Hi Bronze,
ZitatKönnte eine andere Lösung sein, dass man einen Dummy definiert und dann über die Oberfläche abfragt
...im Prinzip ja, allerdings sind es dann 2 Devices, ich denke mit readingsProxy könnte es gehen.

ich hab aber jetzt mal folgendes versucht:
attr <device> eventMap { usr => {'^Stufe.?(\d)$' => '".sprintf("StufeSoll %d",$1*32 -1)."'}, fw => {'^Stufe.?(\d)$' => 'Stufe $1'}}
attr <device> widgetOverride Stufe:slider,0,1,8
attr <device> stateCmd {if ($gadName eq 'StufeIst') {
    fhem "sleep 0.1;setreading $name Stufe " . int((ReadingsNum("$name",'StufeIst-get',0) +1) / 32);
    return int((ReadingsNum("$name",'StufeIst-get',0) +1) / 32);
  } if ($gadName eq 'StufeSoll') {
    fhem "sleep 0.1;setreading $name Stufe " . int((ReadingsNum("$name",'StufeSoll-set',0) +1) / 32);
    return int((ReadingsNum("$name",'StufeSoll-set',0) +1) / 32);
  }
  return $state;
}

Erklärung: ein Reading "Stufe" gibts nicht, die eventmap ändert 'Stufe 4' auf 'StufeSoll 127', und das geht auf den KNX-Bus.
funktioniert bestens, Nachteil: die aktuelle Stufe wird im slider nicht angezeigt... aber im state, könnte man mit devStateIcon noch verbessern.
Mit dieser Lösung geht auch Stufe 0, wenn dein Gerät sich mit 0 ausschalten lässt..
l.g. erwin

Update: Nachteil jetzt auch weg!
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Bronze

@Erwin,
funktioniert wunderbar! Vielen Dank!

Jetzt muss ich erst nochmal nachschlagen - v.a. eventmap - um zu verstehen, was Du da gezaubert hast.