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?
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
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
@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?
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
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 °C
2020-09-19 10:56:01 Aussenluft-get 19.00 °C
2020-09-19 08:33:36 BypassStatus-get on
2020-09-19 10:08:00 Fortluft-get 23.00 °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 °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 °C
2020-09-18 20:07:25 getG6 24.00 °C
2020-09-18 20:25:46 getG7 24.00 °C
2020-09-18 21:19:19 getG8 18.00 °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
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.
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....
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.
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!
@Erwin,
funktioniert wunderbar! Vielen Dank!
Jetzt muss ich erst nochmal nachschlagen - v.a. eventmap - um zu verstehen, was Du da gezaubert hast.