Gelöst: IKEA On/Off Switch E1743 als Dimmer in 99_myUitls.pm nutzen

Begonnen von romakrau, 23 März 2021, 20:19:16

Vorheriges Thema - Nächstes Thema

romakrau

Hallo zusammen,
ich versuche mich an einem IKEA Switch und möchte ihn mit folgender Routine als Dimmer nutzen. Die "Dim-Werte" gebe ich in einem Array vor.


sub dimmer() {
  my @dimcolors = ("FEFAAF" ,"FF00FF" ,"00FF00" ,"0FF0F0" ,"FF0F0F");
  my $i = ReadingsVal("SZ_Switch", "Color", 0);
  while ( ReadingsVal("SZ_Switch", "state", 0) == 2001 ) {
    fhem("setreading SZ_LED RGB $dimcolors[$i]");
    fhem("setreading SZ_Switch Color $i");
    $i++;
    if ( $i > 5) {
      $i = 0;
    }
    sleep(1);
  }
   return 0;
}



Ich weiss nicht warum es nicht funktioniert. Kann mir bitte jemand helfen.
Gruß Roman

betateilchen

mit setreading löst man keine Aktionen am Aktor aus, sondern man beschreibt einfach ein reading mit einem bestimmten Wert. Quasi "zwangsweise".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

romakrau

Danke, wie wäre dann die richtige Vorgehensweise "set SZ_LED RGB $dimcolors[$i]"
und warum lande ich in einer endlos Schleife die ich immer mit einem reboot beenden muss?

betateilchen

Zitat von: romakrau am 23 März 2021, 20:25:29
warum lande ich in einer endlos Schleife die ich immer mit einem reboot beenden muss?

weil sich hier

while ( ReadingsVal("SZ_Switch", "state", 0) == 2001 ) {

vermutlich der Wert solange nicht ändert, solange der Aktor keine Aktion ausführt.

Zitat von: romakrau am 23 März 2021, 20:25:29
wie wäre dann die richtige Vorgehensweise

Keine Ahnung. Ich kenne Deinen Aktor nicht. Und um Dir effektiv helfen zu können, lieferst Du hier einfach zu wenig Informationen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

romakrau

Der Aktor wechselt zwischen 2001 für langes halten und 2003 Taste losgelassen. In der Zeit zwischen den Zuständen sollen die Werte umgeschaltet werden.

MadMax-FHEM

Sieht für mich nach blockierender Programmierung aus.

Entweder steckts du in der while-Schleife oder im Perl-sleep was ja fhem auch blockiert...

Siehst du, dass sich Readings ändern (würde mich wundern / oder ich liege doch falsch), kommen die erwarteten/benötigten Events, also wenn du parallel den Event Monitor offen hast?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

romakrau

Hallo Joachim,

du hast recht, sobald ich in der while Schleife bin ändert sich ja das reading nicht und fhem hängt.
Ich kann dann nur mit einem langem Tastendruck auf die nächste Farbe umschalten oder vielleicht mit einem do always arbeiten.

Danke für den Denkanstoss, iss halt nix mit Multitasking.

Gruß
Roman


MadMax-FHEM

Hallo Roman,

wenn du die sub startest und vorher den Event Monitor öffnest: kommen überhaupt noch Events?

Du kannst ja statt der While-Schleife einfach die Sub per at ("generiert" in der Sub) erneut aufrufen.
Den aktuellen Zählerstand etc. kannst du ja als Parameter mit geben...
D.h. statt sleep ein 1s ein at was dann einfach "sich selbst" noch mal aufruft...

fhem("defmod atAgain at +00:00:01 {dimmer($aktZaehler)}")

Beim ersten Aufruf halt dann 0 oder 1 übergeben, je nachdem...

Viel Erfolg, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

romakrau

Hallo zusammen,
ich habe es wie folgt gelöst (zugegebenermaßen etwas Hemdsärmelig) :

DOIF mit repeatcmd 1 wiederholt den Aufruf von dimmer() Funktion.

Funktion Dimmer ist folgende:


sub dimmer() {
  my @dimcolors = ("FEFAAF" ,"FF00FF" ,"00FF00" ,"0FF0F0" ,"FF0F0F");
  my $i = ReadingsVal("SZ_Switch", "Color", 0);
  ++$i;
  if ( $i > 4) {
    $i = 0;
    }
  fhem("set SZ_LED RGB $dimcolors[$i]");
  fhem("setreading SZ_Switch Color $i");
  return 0;
}


Es gibt noch andere Wege mit set_Exec und blocking.... ,aber das reicht mir als Anfänger.
Gruß
Roman

romakrau

Hallo zusammen,

ich habe ein LED-Band mit dem Modul WifiLight im Schlafzimmer und möchte dies mit einem IKEA-On/Off-Switch schalten inklusiv einer begrenzten Farbauswahl. Hier nun meine vollständige überarbeitete Lösung:

LED-Band : Zusätzlich userReadings "ColorRGB" und "Colornumber" anlegen und mit "setreading <Reading> Wert" vorbelegen.

Ein Switch anlegen mit folgendem DOIF:


defmod DF_SZLEDSwitch DOIF ([SZLEDSwitch:state] == 1002) (set SZLED RGB [SZLED:ColorRGB]) DOELSEIF ([SZLEDSwitch:state] == 2001) ({setColor("SZLED")}) DOELSEIF ([SZLEDSwitch:state] == 2002) (set SZLED off) DOELSEIF ([SZLEDSwitch:state] == 2003) ( )
attr DF_SZLEDSwitch repeatcmd 0:1:0:0


Die leere Klammer am Ende ist wichtig da DOIF sonst leider nicht auf die Änderung des Status reagiert. Das Einschalten geschieht mit dem letztgewählten Farbwert.

In 99_myUtils.pm folgenden Code einfügen:


sub setColor($) {
  my ($device) = @_;
  my @dimcolors = ("FEFAAF" ,"FF00FF" ,"00FF00" ,"0FF0F0" ,"FF0F0F");
  my $i = ReadingsVal($device, "Colornumber", 0);
  ++$i;
  if ( $i > 4) {
    $i = 0;
    }
  fhem("set $device RGB $dimcolors[$i]");
  fhem("setreading $device Colornumber $i");
  fhem("setreading $device ColorRGB $dimcolors[$i]");
  return 0;
}


Mit Aufruf von setColor(<Device>) kann beliebiges LED-Band aufgerufen werden.  Die Farben sind vorgewählt und können beliebig ergänzt werden. Auf eine automatische Auswahl per Tastendruck habe ich verzichtet da hier selbst bei größtmöglichem Teiler 5*5*5 Schritte notwendig wären.

Die Beschreibung soll nur als Beispiel für Anfänger dienen. Verbesserungen willkommen.

Gruß
Roman