Hauptmenü

Schaltstufen realisieren

Begonnen von Arek, 14 Mai 2022, 11:29:55

Vorheriges Thema - Nächstes Thema

Arek

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

Beta-User

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)).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Arek

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

Beta-User

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) }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Prof. Dr. Peter Henning

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

Beta-User

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) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Wernieman

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
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Beta-User

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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

ich hab grade die Sofakissen aufgeschüttelt und die Popcornmaschine angestellt... ich glaube, das wird noch ganz unterhaltsam hier  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

erwin

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 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
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,...

Prof. Dr. Peter Henning

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