Hallo zusammen,
ich habe in einem Device eine Pumpe und eine Steuerung der Pumpe, über die in 4 Stufen die Drehzahl eingestellt werden kann. Geschaltet wird alles über KNX. Die Definition sieht folgendermaßen aus:
0/0/1:dpt1 0/0/2:dpt1 #Pumpe Ein/Aus
0/0/3:dpt1 0/0/4:dpt1 #Stufe 80%
0/0/5:dpt1 0/0/6:dpt1 #Stufe 65%
Sind beide Stufen deaktiviert läuft die Pumpe auf 100%, sind beide aktiviert läuft sie auf 50%.
Nun suche ich eine Möglichkeit neben dem Ein- und Ausschalten der Pumpe die Wahl einer Stufe. Ich hatte es mit eventmap versucht, aber leider fehlen mir da die Erfahrungen. Wer kann helfen?
Schöne Grüße
Arek
Vermutlich wäre die Frage besser im KNX-Bereich aufgehoben, denn die Frage, wie man welche Readings/Schaltbefehle generiert, ist da afaik doch ziemlich speziell. (Verschieben könntest du selbst).
Falls hier jemand mit "allgemeinen" Kenntnissen helfen soll, wäre es hilfreich, wenn du dein(e) list(s) zeigen könntest.
(ich würde mich dazu vermutlich mal mit "combine" von justme1968 versuchen (https://forum.fhem.de/index.php/topic,110165.0.html)).
Hallo,
etwas lang ist es her, ich habe mir Combine angesehen und dann erstmal aufgrund von Zeitmangel nicht weiter verfolgt. Nun möchte ich gerne weitermachen. Ich denke im allgemeinen Bereich ist das Thema besser aufgehoben, da es ebenfalls mit einem Dummy genauso funktionieren sollte, ist also nicht KNX spezifisch. Mit combine könnte es vielleicht funktionieren, aber dafür müsste ich laut meinem Verständnis für jede Kombination ein Device anlegen. Ich denke das müsste auch innerhalb des Device realisierbar sein. Mit Hilfe von UserReadings lässt sich die aktuelle Stufe anzeigen, ich weiß aber nicht wie man die Stufen verstellen kann.
Hier ein List:
Internals:
DEF 0/0/3:dpt1:Stufe2:set:nosuffix 0/0/4:dpt1:Stufe2_status:get:nosuffix
0/0/5:dpt1:Stufe3:set:nosuffix 0/0/6:dpt1:Stufe3_status:get:nosuffix
DEVNAME pool.pump.throttle
FIRSTGADNAME Stufe2
FUUID 627f9439-f33f-e57f-059a-e2d3fe886dadd4e3
GETSTRING Stufe3_status:noArg Stufe2_status:noArg
IODev KNX
KNX_MSGCNT 130
KNX_RAWMSG C01196w0000601
KNX_TIME 2022-08-08 18:35:05
LASTInputDev KNX
MSGCNT 130
NAME pool.pump.throttle
NR 310
SETSTRING Stufe3:on,off,toggle on:noArg off:noArg Stufe2:on,off,toggle
STATE Stufe: 1
TYPE KNX
eventCount 260
model dpt1
GADDETAILS:
Stufe2:
CODE 00003
GROUP 0/0/3
MODEL dpt1
NO 1
OPTION set
RDNAMEGET Stufe2
RDNAMEPUT Stufe2
RDNAMESET Stufe2
SETLIST :on,off,toggle
Stufe2_status:
CODE 00004
GROUP 0/0/4
MODEL dpt1
NO 2
OPTION get
RDNAMEGET Stufe2_status
RDNAMEPUT Stufe2_status
RDNAMESET Stufe2_status
SETLIST :on,off,toggle
Stufe3:
CODE 00005
GROUP 0/0/5
MODEL dpt1
NO 3
OPTION set
RDNAMEGET Stufe3
RDNAMEPUT Stufe3
RDNAMESET Stufe3
SETLIST :on,off,toggle
Stufe3_status:
CODE 00006
GROUP 0/0/6
MODEL dpt1
NO 4
OPTION get
RDNAMEGET Stufe3_status
RDNAMEPUT Stufe3_status
RDNAMESET Stufe3_status
SETLIST :on,off,toggle
GADTABLE:
00003 Stufe2
00004 Stufe2_status
00005 Stufe3
00006 Stufe3_status
OLDREADINGS:
READINGS:
2022-08-08 18:35:03 Stufe2 off
2022-08-08 18:35:03 Stufe2_status off
2022-08-08 18:35:05 Stufe3 on
2022-08-08 18:35:05 Stufe3_status on
2022-08-08 18:35:05 Stufe_Status 1
2022-08-08 18:35:05 last-sender 1.1.150
2022-08-08 18:35:05 state on
Attributes:
alias pool.pump.throttle
room KNX,Garten,Pool
stateFormat Stufe: Stufe_Status
userReadings Stufe_Status:.* { if((ReadingsVal("$name","Stufe2_status",0) eq "off") and (ReadingsVal("$name","Stufe3_status",0) eq "on")) {return "1";} elsif((ReadingsVal("$name","Stufe2_status",0) eq "on") and (ReadingsVal("$name","Stufe3_status",0) eq "on")) {return "2";} elsif((ReadingsVal("$name","Stufe2_status",0) eq "on") and (ReadingsVal("$name","Stufe3_status",0) eq "off")) {return "3";} elsif((ReadingsVal("$name","Stufe2_status",0) eq "off") and (ReadingsVal("$name","Stufe3_status",0) eq "off")) {return "4";}},Stufe_select:.*
webCmd Stufe2:Stufe3:Stufe_Status
widgetOverride Stufe2:uzsuToggle,on,off Stufe3:uzsuToggle,on,off Stufe_Status:uzsuSelectRadio,1,2,3,4
Schöne Grüße
Arek
Da du ja hier - je nach Ausgangslage - (mehrere) unterschiedliche Befehle absetzten musst, könnte das auch via "cmdalias" klappen. Kann aber nicht sagen, ob das auch innerhalb des eigenen Devices klappt...
Hier ein (raw-) Beispiel, mit dem - je nach Rahmenbedingung - neben dem eigentlichen Einschaltbefehl an das "Zieldevice" auch (bei Bedarf) weitere Voraussetzungen geschaffen werden. Vielleicht hilft das weiter...
define al_hues cmdalias set (Wandleuchten|Licht_Spuele) (on|toggle) AS { if (!ReadingsVal('HUEDevice31','onoff',1)) { \ my $other = $EVENT =~ m{Licht_Spuele} ? 'Wandleuchten' : 'Licht_Spuele';; return fhem("set HUEDevice31 on;; sleep 0.2;; set $other off") } \ if ( $EVENT =~ m{Licht_Spuele} && !ReadingsVal('Licht_Spuele','onoff',1) || $EVENT =~ m{Wandleuchten} && !ReadingsVal('Wandleuchten','onoff',1) ) {\ $EVENT =~ s{toggle}{on} } else { $EVENT =~ s{toggle}{off} };;\
CommandSet(undef,$EVENT) }
Zitatdie Frage, wie man welche Readings/Schaltbefehle generiert, ist da afaik doch ziemlich speziell.
Nö, das ist ziemlich universell.
Ganz einfach: Ein Dummy, das per setList die Schaltstufen kennt. Und ein DOIF, das bei Aufrufen einer Schaltstufe die passenden Kommandos absetzt
LG
pah
Zitat von: Prof. Dr. Peter Henning am 09 August 2022, 14:21:20
Nö, das ist ziemlich universell.
Jein. Bei KNX kann man afaik zwar sowohl die setter wie die "Namen", unter denen die Rückgabe-Werte dann gemappt werden praktisch beliebig festlegen, aber das Zusammenwirken ist relativ offen, und eben in diesem Sinne "speziell".
Zitat
Ganz einfach: Ein Dummy, das per setList die Schaltstufen kennt. Und ein DOIF, das bei Aufrufen einer Schaltstufe die passenden Kommandos absetzt
Für was den dummy? Kann DOIF keine setList ::) ... (und dann auch gleich den "konsolidierten Zustand" abbilden?)
OK, muss zugeben, das ist mir auch zu "speziell", so dass ich sowas lieber anders löse.
Aber jeder wie er mag 8) .
Wobei ... muß es DOIF, ist da nicht ein NOTIFY ausreichend?
Würde es aber auch mit einem Dummy, wie von pah vorgeschlagen, lösen. Giebt bestimmt noch mehr Lösungsmöglichkeiten OHNE Dummy
Zitat von: Wernieman am 09 August 2022, 15:53:58
Würde es aber auch mit einem Dummy, wie von pah vorgeschlagen, lösen. Giebt bestimmt noch mehr Lösungsmöglichkeiten OHNE Dummy
Eine: readingsProxy - auf den "konsolidierten Stand" (userReading aus dem Ausgangs-KNX-Device). Der sollte dann auch "Querschießen" können - sowas hatten wir neulich mit dem "Garagentor-Thema" (1-2 Kontakt-Sensoren + ein kurzer Impuls zum Öffnen/Schließen/Anhalten an ein ganz anderes Device).
ich hab grade die Sofakissen aufgeschüttelt und die Popcornmaschine angestellt... ich glaube, das wird noch ganz unterhaltsam hier 8)
Hi Arek!
...sorrry diesen Thread hab ich wohl übersehen, aber jetzt ist das Popcorn aufgegessen....
Folgender Vorschlag (RAW definition):
defmod pool.pump.throttle KNX 0/0/1:dpt1:Pumpe:set:nosuffix\
0/0/2:dpt1:Pumpe_status:nosuffix\
0/0/3:dpt1:Stufe2:set:nosuffix\
0/0/4:dpt1:Stufe2_status:get:nosuffix\
0/0/5:dpt1:Stufe3:set:nosuffix\
0/0/6:dpt1:Stufe3_status:get:nosuffix\
1/1/1:dpt5:Steps:set:nosuffix
attr pool.pump.throttle eventMap { usr => {'^Aus' => 'Steps 0', '^Ein' => 'Steps 4', '^on' => 'Steps 4', '^Steps (\d)' => '" . sprintf("Steps %d",$1) . "' }, fw => {'^Aus' => 'Aus', '^on' => 'on', '^Ein' => 'Ein', '^Steps (\d)' => 'Steps'},\
}
attr pool.pump.throttle stateCmd {\
Log3 undef, 1,"stateX= $state gad=$gadName";;\
if ($gadName eq 'Steps') {\
if ($state == 0) {\
fhem("sleep 0.1 $gadName quiet;;set $name Pumpe off");;\
return $state;;\
} \
if ($state == 1) {\
fhem("sleep 0.1 $gadName quiet;;set $name Stufe2 on;;set $name Stufe3 on;;");; # 50% \
$state = 50;; \
} elsif ($state == 2) {\
fhem("sleep 0.1 $gadName quiet;;set $name Stufe2 off;;set $name Stufe3 on;;");; # 65% \
$state = 65;;\
} elsif ($state == 3) {\
fhem("sleep 0.1 $gadName quiet;;set $name Stufe2 on;;set $name Stufe3 off;;");; # 80% \
$state = 80;;\
} elsif ($state == 4) {\
fhem("sleep 0.1 $gadName quiet;;set $name Stufe2 off;;set $name Stufe3 off;;");; # 100%\
$state = 100;; \
}\
fhem("sleep 1.0 Pon quiet;;set $name Pumpe on") if (ReadingsVal($name,'Pumpe','on') ne 'on');;\
return $state;;\
}\
return $state;;\
}
attr pool.pump.throttle stateRegex /Pumpe// /Stufe2// /Stufe3// /Pumpe_status// /Stufe2_status// /Stufe3_status//
attr pool.pump.throttle webCmd Ein:Aus:Steps
attr pool.pump.throttle widgetOverride Aus:noArg Ein:noArg Steps:slider,0,1,4
setstate pool.pump.throttle 100
setstate pool.pump.throttle 2022-08-12 09:04:20 Pumpe on
setstate pool.pump.throttle 2022-08-12 08:59:49 Pumpe_status on
setstate pool.pump.throttle 2022-08-12 09:12:13 Steps 4
setstate pool.pump.throttle 2022-08-12 08:41:42 Stufe 4
setstate pool.pump.throttle 2022-08-12 09:12:13 Stufe2 off
setstate pool.pump.throttle 2022-08-12 06:22:30 Stufe2_status on
setstate pool.pump.throttle 2022-08-12 09:12:13 Stufe3 off
setstate pool.pump.throttle 2022-08-12 08:57:45 Stufe3_status on
setstate pool.pump.throttle 2022-08-12 09:12:13 last-sender 5.1.251
setstate pool.pump.throttle 2022-08-12 09:12:13 state 100
Und ein paar Erklärungen dazu:
1) ich hab einen zusätzliche GA 1/1/1:dpt5:Steps eingefügt - nimm eine GA-adresse, die in deinem KNX-system nicht vorkommt.
Die ist notwendig, weil ein dpt1 nur werte 0/1 bzw. on/off erlaubt.
2) Eventmap: macht z.b.: aus "set pool.pump.throttle Ein" -> set pool.pump.throttle Steps 4 (entspricht 100%),
oder aus "set pool.pump.throttle Aus" -> set pool.pump.throttle Steps 4 (entspricht aus / 0%)
3) statecmd: macht aus "Steps x" die nötigen einzelnen Kommandos an den KNX-Bus. die Zeile Log3... kannst du löschen, falls es funktionert- ist debug!
4) webcmd: Ein/aus/steps anklickbar/slider
5) widgetoverride: ob man für steps einen slider nimmt oder pull-down ist Geschmackssache...
Falls das bei dir funktioniert, wüder ich das als Beispiel auch ins wiki (https://wiki.fhem.de/wiki/KNX_Device_Definition_-_Beispiele (https://wiki.fhem.de/wiki/KNX_Device_Definition_-_Beispiele) aufnehmen. Man könnte das ganze noch etwas eleganter schreiben, aber zum Verständnis sollte es so auch reichen.
Falls es Probleme gibt, bitte um Geduld, ich bin ab sofort eine Woche Skippern in der Adria.
l.g. erwin
ZitatFür was den dummy?
1. Wartbarkeit des Codes.
2. Trennung des Zustands (im dummy) von den Übergängen (im DOIF) des Zustandsautomaten.
LG
pah