[gelöst] Nachtschalter - alles ausschalten und Schalterstatus auf OFF

Begonnen von Soc, 29 August 2015, 17:49:20

Vorheriges Thema - Nächstes Thema

Soc

Hallo Zusammen,

ich habe einen HomeMatic Schalter (HM-PB-6-WM55) mit 6 Schalter und eine LED-Anzeige (HM-OU-LED16).
Um den aktuelle Status am Schalter sehen zu können (grüne LED leuchtet beim betätigen auf), habe ich eine virtuelle Device (wie im Forum beschrieben) definiert und die einzelnen Taste darauf gepeert.
Die Schalter sind wie folgt belegt:

Schalter 01 (Schalter_01_Btn_01 - virtuell: Vact_dev_Btn1)    1 Lampe-Dimmer (HM-LC-Dim1L-Pl-3)
notify
define Schalter_01_Btn_01_notify notify Schalter_01_Btn_01 set Licht_Flur_Dimmer_CH1 toggle
define Status_LED16_01_led_09.n1 notify Vact_dev_Btn1:OFF set Status_LED16_01_Led_09 led green
define Status_LED16_01_led_09.n2 notify Vact_dev_Btn1:ON set Status_LED16_01_Led_09 led red


Schalter 02 (Schalter_01_Btn_02 - virtuell: Vact_dev_Btn2)    1 TV (HM-ES-PMSw1-Pl)
notify entspricht Schalter 01...

Schalter 03 (Schalter_01_Btn_03 - virtuell: Vact_dev_Btn3)    3 Lampen (HM-ES-PMSw1-Pl)
notify entspricht Schalter 01 (mit jeweils 3 set)

Schalter 04 (Schalter_01_Btn_04 - virtuell: Vact_dev_Btn4)    1 Lampe (HM-ES-PMSw1-Pl)
notify entspricht Schalter 01...

Schalter 05 soll Nachtschalter werden
Dieser Schalter soll alle Geräte ausschalten und die dazugehörigen LEDs auf grün setzen.

Dazu habe ich folgende Definitionen vorgenommen:
notify:
define Schalter_01_Btn_05_notify notify Schalter_01_Btn_05.Long.* set LichtWohnzimmer,LichtFlur,TV off; set LichtWohnzimmerLed,LichtFlurLed,TVLed led green

Grundsätzlich funktioniert es zwar, aber der virtuelle Actor behält den Status den er vorher gehabt hat (z.B. ON).

Probleme

  • Betätige ich den Nachtschalter 2 mal, bekomme ich beim 2. Mal einen Fehler (rote LED am Schalter) angezeigt, obwohl die Schaltvorgänge gemacht werden.
  • Was dann beim nächsten schalten des z.B. Schalter 01 das Device zwar einschaltet, aber die LED auf grün (aus) bleibt, da diese LED den Status des virtuellen Actor annimmt (welcher dann OFF ist) - siehe notify.

Log mit Fehler beim 2. schalten

2015.08.29 17:45:12 3: CUL_HM set Licht_Wohnzimmer_Links_Sw off
2015.08.29 17:45:12 3: CUL_HM set Licht_Wohnzimmer_Mitte_Sw off
2015.08.29 17:45:12 3: CUL_HM set Licht_Wohnzimmer_Rechts_Sw off
2015.08.29 17:45:12 3: CUL_HM set Licht_Wohnzimmer_Stehlampe_Sw off
2015.08.29 17:45:12 3: CUL_HM set Licht_Flur_Dimmer_CH1 off
2015.08.29 17:45:12 3: CUL_HM set Licht_Galerie_Empore_Sw off
2015.08.29 17:45:12 3: CUL_HM set TV_Fernsehzimmer_Sw off
2015.08.29 17:45:12 3: CUL_HM set TV_Wohnzimmer_Sw off
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_11 led green
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_12 led green
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_09 led green
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_10 led green
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_13 led green
2015.08.29 17:45:12 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:12 2: CUL_HM protstate undeviced hash to set CMDs_done
2015.08.29 17:45:12 1: CUL_HM error removing pending commands
2015.08.29 17:45:43 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:43 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:44 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:44 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:45 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:45 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:46 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:46 3: CUL_HM set Status_LED16_01_Led_14 led green
2015.08.29 17:45:47 3: CUL_HM set Status_LED16_01_Led_14 led green


Nun die Fragen

  • Warum kommt der Fehler beim 2. schalten?
  • Wie kann ich den Status den virtuellen Actor auf OFF bekommen?

Danke für die Hilfe.

Soc

rapster

Schau dir mal structure an.

Der Schalter kriegt wohl einfach kein Ack, weil i.M. soviel andere Geräte befeuert werden.

Gruß
  Claudiu

Soc


rapster

Wie gesagt: http://fhem.de/commandref.html#structure

Damit kannst du dann z.B. auch nur ein Befehl an die Aktoren sende lassen, die nicht bereits in dem Ziel-Zustand sind.

Soc

structure habe ich für Licht etc. bereits angegeben.
Heisst dass, wenn ich eine neue structure (inhalt die angegebenen structure) verwende kommt das Problem nivht mehr und es gibt kein timing Problem mehr?

rapster

 LichtWohnzimmer,LichtFlur,TV  sind 3 structuren?

Mach doch einfach eien structure 'Wohnung' in der alle Geräte drin sind, die du dann einfach mit "set Wohnung off" ansprichst.

rapster

Was ich gerade erst sehe, was denke ich auch noch ein großes Problem ist,

dein notify trigger bei "Long.*", dass heisst bei Long 1_, 2_,3_ usw..., das heisst bis du mitbekommst dass das erste Licht ausgeschalten ist, wurde dein notify schon mehrmals ausgelöst, was die ganze Sache natürlich ziemlich durcheinander wirst.

Änder mal dei notify auf
define Schalter_01_Btn_05_notify notify Schalter_01_Btn_05.Long\s1.* set
und probier es nochmal.

rapster

P.S. schau dir mal die 2. Möglichkeit an die ich hier erwähnt habe: http://forum.fhem.de/index.php/topic,39119.msg312487.html#msg312487

Das macht die Verwaltung vieler Wandtaster deutlich einfacher, und es ist nurnoch ein notify für alle notwendig.

Soc


rapster


Soc

Zitat von: rapster am 29 August 2015, 19:43:10
P.S. schau dir mal die 2. Möglichkeit an die ich hier erwähnt habe: http://forum.fhem.de/index.php/topic,39119.msg312487.html#msg312487

Das macht die Verwaltung vieler Wandtaster deutlich einfacher, und es ist nurnoch ein notify für alle notwendig.

Habe ich gerade versucht in meine 99_myUtils.pm einzutragen, da scheint aber noch was zu fehlen.

ERROR:
syntax error at ./FHEM/99_myUtils.pm line 46, near ") {" syntax error at ./FHEM/99_myUtils.pm line 50, near "case qr/01.*short.*/i" Global symbol "$button" requires explicit package name at ./FHEM/99_myUtils.pm line 56. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_myUtils.pm line 56.


Hollo

Zitat von: Soc am 29 August 2015, 17:49:20
...ich habe einen HomeMatic Schalter (HM-PB-6-WM55) mit 6 Schalter und eine LED-Anzeige (HM-OU-LED16).
Um den aktuelle Status am Schalter sehen zu können (grüne LED leuchtet beim betätigen auf), habe ich eine virtuelle Device (wie im Forum beschrieben) definiert und die einzelnen Taste darauf gepeert...

Das ist ein 6-fach-TASTER, d.h. Du setzt beim Betätigen einen Impuls ab.
Der virtuelle Aktor ist nur für die Bestätigung (grünes Licht), wenn Du kein direktes Peering mit einem realen Aktor hast.
Du benötigst daher eigentlich nur 1 virtuellen Button für alle 6 Tasten.

Schau Dir mal im Eventmonitor an, was bei verschiedenen Tastendrücken so kommt.
Für langen Tastdruck benutze ich nicht Long, weil das mehrfach kommt; da funktioniert aber LongRelease gut.

Dein notify reagiert auf die virtuellen Devices, warum nicht direkt auf den Tastendruck ???
Und dann die Aktionen dahinter oder halt eine eigene Funktion aufrufen, die verschiedene Sachen ausführt.

Als Beispiel mal die verschiedenen Varianten, die ich für einen meiner Taster hinterlegt habe.

### Aktionen mit 6fach-Taster Schlafzimmer ###
define n_sz_6fach_Taster_Btn_01 notify sz_6fach_Taster_Btn_01:trigger:.* set Wecker Auto
define n_sz_6fach_Taster_Btn_02 notify sz_6fach_Taster_Btn_02:trigger:.* set Wecker Skip
define n_sz_6fach_Taster_Btn_03 notify sz_6fach_Taster_Btn_03:trigger:.* {lauter}
define n_sz_6fach_Taster_Btn_04 notify sz_6fach_Taster_Btn_04:trigger:.* {leiser}
define n_sz_6fach_Taster_Btn_05_short notify sz_6fach_Taster_Btn_05:Short.* {Schlummermusik(30)}
define n_sz_6fach_Taster_Btn_05_long notify sz_6fach_Taster_Btn_05:LongRelease.* {Schlummermusik(60)}
define n_sz_6fach_Taster_Btn_06 notify sz_6fach_Taster_Btn_06:trigger:.* set HomeStatus sleep

FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

rapster

Zitat von: Hollo am 30 August 2015, 11:44:30
Für langen Tastdruck benutze ich nicht Long, weil das mehrfach kommt; da funktioniert aber LongRelease gut.

LongRelease ist allerdings nicht sehr vorteilhaft,

da muss du selber darauf achten, dass du lang genug draufdrückst, und es wird frühstens erst ausgeführt wenn du wieder loslässt.

Bei "Long.1" oder "Long\s1" wird sobald der erste Long Trigger empfangen worden ist ausgeführt, und anschließend bei keinem weiteren.
Das ist deutlich vorteilhafter.

Zitat von: Soc am 30 August 2015, 11:32:13
Habe ich gerade versucht in meine 99_myUtils.pm einzutragen, da scheint aber noch was zu fehlen.

ERROR:
syntax error at ./FHEM/99_myUtils.pm line 46, near ") {" syntax error at ./FHEM/99_myUtils.pm line 50, near "case qr/01.*short.*/i" Global symbol "$button" requires explicit package name at ./FHEM/99_myUtils.pm line 56. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_myUtils.pm line 56.


Du hast anscheinen nicht alles kopiert, bitte komplett angefangen bei "sub wandtaster ($$........." Anfangen mit dem kopieren ;-)
Zwei Zeilen weiter unten werden nämlich deine fehlenden Variablen deklariert.

Gruß
  Claudiu

Soc

Das wäre ja einfach... hab selber schon danach geschaut, aber alles ist so übernommen worden wie beschrieben.
Es sind auch keine Klammern vergessen worden etc.
Ich kenne zwar Perl, aber stehe momentan selber auf den Schlauch.

sub wandtaster($$) {
my ($NAME,$EVENT) = @_;
    my $button = $NAME =~ s/.+_(.*)/$1/r;
    switch ($NAME) {
      case qr/eg_buero_wandtaster_.*/i {
          switch ($button.$EVENT) {
            case qr/01.*long.*/i { fhem("set CUL_HM_HM_LC_SW1_FM_3313CF on-for-timer 300"); }
            case qr/01.*short.*/i { fhem("set CUL_HM_HM_LC_SW1_FM_3313CF on"); }
            case qr/02.*/i { fhem("set CUL_HM_HM_LC_SW1_FM_3313CF off"); }
            else { Log 1, "WARNING - wandtaster() does not know event '$EVENT' on device '$NAME'"; }
          }
      }
      case qr/eg_zimmer2_wandtaster02_.*/i {
          switch ($button.$EVENT) {
            case qr/01.*/i {  }
            case qr/02.*/i {  }
            case qr/03.*/i {  }
            case qr/04.*/i {  }
            else { Log 1, "WARNING - wandtaster() does not know event '$EVENT' on device '$NAME'"; }
          }
      }
      else { Log 1, "WARNING - wandtaster() does not know device '$NAME'"; }
     
    }
}


Der erste angezeigte Fehler syntax error at ./FHEM/99_myUtils.pm line 46, near ") {" bezieht sich auf switch ($NAME) {
Der 2. Fehler syntax error at ./FHEM/99_myUtils.pm line 50, near "case qr/01.*short.*/i" ist die Zeile case qr/01.*short.*/i { fhem("set CUL_HM_HM_LC_SW1_FM_3313CF on"); }...

Die restlichen Fehlermeldungen sind wahrscheinlich Folgefehler.

rapster

Ich hänge dir später sobald ich zuhause bin meine Datei mal hier an.