Hauptmenü

Wake up Dimmer

Begonnen von mister, 19 April 2020, 22:32:22

Vorheriges Thema - Nächstes Thema

mister

Hallo ich habe einen IT Dimmer den ich gerne morgens langsam hoch dimmen würde, nach erfüllung einer Bedinung.

Ich habe das hier gefunden:
define wakeup at *07:00:00 {\
if (!$we) {\
  fhem "set Lamp1 dim100% 1280";;\
  fhem "define wakeupOff at +00:40:00 set Lamp1 off";;\
}\
}


dieser gilt jedoch nur für FS20 scheint mit IT nicht zu gehen. Hat jemand einen Vorschlag wie ich das umsetze?

rabehd

Zitatich habe einen IT Dimmer
Mit welchem Befehl dimmst Du denn?
Auch funktionierende Lösungen kann man hinterfragen.

mister

z.b. mit set Deckenlicht dim100%

rabehd

Heißt das Ding jetzt Lamp1 oder Deckenlicht?
Da ich IT Dimmer nicht kenne, kann ich auch nichts zum Befehl sagen. "dim100%" empfinge ich als komisch, aber möglich. DerWert dahinter ist wohl die Ramp-Zeit. Ist schon komisch, wenn Deine Befehle nicht gleich sind.
"set Lamp1 dim100% 1280"
"set Deckenlicht dim100%"

fhem "set Lamp1 dim100% 1280"; steht zwar in der commadref, ich habe es bisher so nicht gesehen oder verwendet. Mein Vorschlag wäre fhem("set Lamp1 dim100% 1280");.

Was möchtest Du eigentlich?
Was hast Du bisher ausprobiert?
Hast Du Dein gefundenes Beispiel ausprobiert? Wenn nicht, warum?

Zitatich habe einen IT Dimmer den ich gerne morgens langsam hoch dimmen würde, nach erfüllung einer Bedinung.
Das wie hochdimmen hast Du selbst beantwortet. Welche Bedingung soll erfüllt sein? Die aus dem Beispiel (morgens um 7 an Wochentagen)?
Was funktioniert nicht?

Auch funktionierende Lösungen kann man hinterfragen.

mister

#4
Das ist aus dem Wiki und bei mir im FHEM heisst das Deckenlicht anstatt Lamp1. Es scheint ein Problem der Rampe zu sein. Warum auch immer geht das Licht sofort an anstatt eine Rampe bis 100% zu fahren. Das ist was ich erreichen möchte.Ich möchte nachher ein Befehl über notify oder sowas setzen und die Lampe dimmt auf Zeit, ich sag jetzt einfach mal 30min langsam hoch und dann wieder ausgeschaltet werden

rabehd

ZitatWarum auch immer geht das Licht sofort an anstatt eine Rampe bis 100% zu fahren.
Dann löse erstmal das Problem über die möglichen Befehle des Device. Da kann Dir nur jemand helfen der "IT Dimmer" kennt.
Der Rest sollte dann kein Problem sein.

Deine Antwort
Zitatz.b. mit set Deckenlicht dim100%
war dann wohl nicht richtig.
Auch funktionierende Lösungen kann man hinterfragen.

mister

#6
Hä set Deckenlicht dim100% setzt die Deckenbeleuchtung auf 100% das funktioniert. Die IT können mit genauen Werten angefahren werden. Nur das hier set Lamp1 dim100% 1280 geht mit den IT nicht, dafür suche ich eine Alternativew vllt mit einer Schleife.

MadMax-FHEM

#7
In wievielen Schritten soll das denn geschehen!?

Ein einfacher Ansatz (aber ich schreib's gleich: NICHT "elegant"!!) wäre:

EDIT es wurde dann doch nicht der ganz einfache Ansatz ;) Ganz einfach wäre gewesen, wenn du fix weisst wie gedimmt werden soll und die Schritte nicht zu viele sind und sie sich nicht mal ändern sollen oder gar automatisch bestimmt werden sollen bzw. von bestimmten Dingen abhängen sollen ;)  Einfachster Ansatz: set Lampe dim 10%; sleep 2; set Lampe dim 20%; sleep 2; set Lampe dim 30%  / Wichtig: am Ende MUSS ein fhem Befehl also set o.ä. stehen, sonst blockiert der sleep! Und je nachdem wo/wie du das "lange Kommando" eintippst bzw. nutzt musst du die ; auch evtl. doppeln, also ;;

Hier nun eine anpassbare (durch Aufruf) Variante mit "quasi Schleife" die aber halt nicht blockiert...
...aber auch nicht elegant ;)

EDIT: geht auch kürzer, ich habe bewusst etwas "ausführlich" geschrieben, damit du es nachvollziehen und anpassen kannst (weil das musst du, siehe Kommentare). Die Logeinträge kannst/solltest du nach dem Anpassen (also wenn es läuft) besser rausnehmen ;)


sub my_DimmUp($$$$)
{
  my ($Device, $DimStep, $DimEnd, $WaitTime) = @_;
  # steht bei dir vermutlich in state!? ReadingsNum "extrahiert" nur die Zahl ein etwaiges % bleibt weg...
  #my $ActDimValue = ReadingsNum($Device, "state", 0);
  my $ActDimValue = ReadingsNum($Device, "dim", 0);
  my $AtName = "atDimTimerFor" . $Device;
  my $AtTime = "+00:00:" . $WaitTime;

  Log3(undef, 3, "my_DimmUp    Device: $Device     DimStep: $DimStep     DimEnd: $DimEnd     WaitTime: $WaitTime");

  if($ActDimValue > $DimEnd)
  {
 
Log3(undef, 3, "my_DimmUp reached the end.");
    return;
  }

  $ActDimValue += $DimStep; 
  # evtl. muss noch % o.ä. dran
  # $ActDimValue += . "%";

# set Befehl halt anpassen wie er wirklich lauten muss...
#  fhem("set $Device dim $ActDimValue");
# das hier war für meinen Dummy
  fhem("setreading $Device dim $ActDimValue");
  # sollte nicht nötig sein da defmod und nur "temporärer timer" aber ohne ging es bei mir nicht
  fhem("delete $AtName");
  fhem("defmod $AtName at $AtTime {my_DimmUp(\"$Device\", $DimStep, $DimEnd, $WaitTime)}");
  Log3(undef, 3, "my_DimmUp timer $AtName with $AtTime started.");
}


Aufruf dann:

my_DimUp("Lampenname", Dimstufen, Endhelligkeit, PauseZwischenDimmstufenInSekunden)

PauseZwischenDimmstufenInSekunden < 60!
Wenn du längere Pausen brauchst, dann entsprechend ändern...

Wo/wie einfügen:

https://wiki.fhem.de/wiki/99_myUtils_anlegen

Getestet mit einem Dummy, der nat. bzgl. Dimwert etc. anders funktioniert, siehe Kommentare im Code...

Dann diesen my_DimUp Aufruf entsprechend in den Schnipsel integrieren den du schon hast oder dir überlegen "welcher Umstand" dazu führen soll, dass eben Hochgedimmt wird...
...runter ginge genauso halt dann mit Minus und die Prüfung auf Ende anders ;)

Gruß, Joachim

Achja: ohne Gewähr!! ;)
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)

mister

Danke für deine Mühe  :) Ich bin nur irgendwie zu blöd durchzusteigen wie das funktioniert.
Ich habe eine Datei unter Edit files names my_DimUpUtils.pm angelegt.

heißt der Aufruf my_DimUp passt dann so?

Wie habe ich das zu verstehen?
# steht bei dir vermutlich in state!? ReadingsNum "extrahiert" nur die Zahl ein etwaiges % bleibt weg...

Mein list sieht so aus:

Internals:
   DEF        1010010101000101110101010 0 0000
   FUUID      5e3734fb-f22e-7866-2743-2e49350f8efbr67ab
   IODev      nanoCUL
   NAME       Deckenlicht
   NR         59
   STATE      dim100% set Deckenlicht off
   TYPE       IT
   XMIT       1010010101000101110101010100000
   XMITdimdown 00
   XMITdimup  00
   XMIToff    0
   XMITon     1
   CODE:
     1          1010010101000101110101010100000
   READINGS:
     2020-04-26 02:05:22   dim             100
     2020-02-03 22:36:55   group           0
     2020-04-26 02:05:22   lastDimValue    dim100% set Deckenlicht off
     2020-02-03 22:36:55   protocol        V3
     2020-04-26 02:05:22   state           dim100% set Deckenlicht off
     2020-02-03 22:36:55   unit            0000
Attributes:
   IODev      nanoCUL
   alexaName  Schlaf;Schlaflicht
   model      itdimmer
   room       Alexa_Geräte,Schlafzimmer


# set Befehl halt anpassen wie er wirklich lauten muss...
#  fhem("set $Device dim $ActDimValue");

heißt der "normale" set befehl also set Deckenlicht dim%?


MadMax-FHEM

Nicht einfach nur eine Datei anlegen, das muss schon passen UND eine myUtils sein!

Bitte machen wie im Link!!

Poste doch mal was in der Datei steht...

Ansonsten ist eigentlich alles kommentiert...

Du musst schon wissen/anpassen wie bei DIR der set-Befehl für dimmen auf einen bestimmten Wert lautet...

Du kannst mir das auch hier schreiben...
...dann passe ich das an...

Und etwas (mehr) fhem Grundlagen lesen tut bestimmt auch gut... ;)

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)

MadMax-FHEM

#10
Steht zwar alles in dem Link aber dann (weil ich grad Zeit habe) halt doch (noch) etwas ausführlicher...

TROTZDEM: Einlesen schadet nicht! ;)

Wie die Datei heißt ist (fast) egal.
Wichtig: sie muss mit 99 beginnen!

Und die "Initialize-Funktion" muss dazu passen!

Bleiben wir in etwa bei dem von dir gewählten Namen.

D.h. du legst eine Datei "99_my_DimUpUtils.pm" an.

Dort dann folgendes rein:


package main;
use strict;
use warnings;

sub my_DimUpUtils_Initialize($$)
{
   my ($hash) = @_;
}

sub my_DimmUp($$$$)
{
  my ($Device, $DimStep, $DimEnd, $WaitTime) = @_;
  my $ActDimValue = ReadingsNum($Device, "dim", 0);
  my $AtName = "atDimTimerFor" . $Device;
  my $AtTime = "+00:00:0" . $WaitTime;

  Log3(undef, 3, "my_DimmUp    Device: $Device     DimStep: $DimStep     DimEnd: $DimEnd     WaitTime: $WaitTime");

  $ActDimValue += $DimStep;

  if($DimEnd >= $ActDimValue)
  {
    # evtl. muss noch % o.ä. dran
    # $ActDimValue .= "%";

# set Befehl halt anpassen wie er wirklich lauten muss...
#  fhem("set $Device dim $ActDimValue");
# das hier war für meinen Dummy
    fhem("setreading $Device dim $ActDimValue");
    # sollte nicht nötig sein da defmod und nur "temporärer timer" aber ohne ging es bei mir nicht
    fhem("delete $AtName");
    fhem("defmod $AtName at $AtTime {my_DimmUp(\"$Device\", $DimStep, $DimEnd, $WaitTime)}");
    Log3(undef, 3, "my_DimmUp timer $AtName with $AtTime started.");
  }

}

1;


EDIT: ich hab auch noch ein wenig "umgebaut" (und einen Fehler rausgemacht / heißt nicht, dass keiner mehr drin sein könnte ;)  )...

Dann legst du folgenden Dummy an (NUR ZUR DEMONSTRATION!! Ist NICHT notwendig für die sub!):


define dmTestLicht dummy


eventuell noch ein Attribut room vergeben, damit du ihn leichter "wiederfindest" ;)


attr dmTestLicht room Test


danach dann (nicht zwingend nötig aber zeigt gleich wie es geht ;) ):


setreading dmTest dim 10


Diesen dann beobachten, also in einem anderen Tab oder so eine weitere "Verbindung" zu fhem...

Dort dann folgendes in das FHEMWeb:


{my_DimmUp("dmTestLicht",5,100,5)}


Nun sollte der dim-Wert des Dummy eben in 5er Schritten hochzählen bis 100 und zwischen den Schritten 5s warten...

Was du für dich anpassen musst ist eben das "Auslesen" des aktuellen dim-Wertes also des "Startwertes"...
...wenn ich das list richtig interpretiere steht das ebenfalls im Reading "dim".
Somit kann das hier bleiben (und den Kommentar dazu in meinem "ersten Post" kannst du ignorieren):


  my $ActDimValue = ReadingsNum($Device, "dim", 0);



Dein "set-Befehl" dürfte aber nicht


setreading Deckenlicht dim X


sein, sondern vermutlich:


set Deckenlicht dim X


Daher musst du diesen Teil für den Dummy:

  fhem("setreading $Device dim $ActDimValue");


ersetzen durch:


fhem("set $Device dim $ActDimValue");


und wenn du mit % angeben musst, dann hier den Kommentar (also das # ) entfernen


  # $ActDimValue += . "%";


Wenn das set für dimmen auf einen bestimmten Wert (ganz) anders ist, dann halt anpassen...
...wichtig ist, dass der dann eingestellte Dimmwert auch im Reading "dim" steht, sonst musst du die "ReadingsNum-Abfrage" doch "umbauen"...


Und ein wenig Anpassungsarbeit musst du schon selbst leisten...


Aufrufen dann eben so:


{my_DimmUp("Deckenlicht",5,100,5)}


Oder wie du halt gedimmt haben willst... ;)



EDIT: es ist (an vielen Stellen) noch sehr einfach!!! Z.B. die Wartezeit kann nur ganze Sekunden! UND muss kleiner 10 sein!!



Hier kurz warum das nicht in einer einfachen Schleife geht:

wenn du einfach eine Schleife abarbeitest, dann wird fhem (für alles andere) solange blockiert, bis deine Dim-Schleife fertig ist.
Wenn du ganz schnell dimmst ist es evtl. nicht tragisch (für dich)...


Daher diese sub mit Timer/at:

zu Beginn wird der aktuelle Dim-Wert abgefragt, erhöht und geprüft, ob schon der Maximalwert erreicht ist.

Wenn nicht, wird gedimmt.
Ansonsten: fertig :)

Dann wird ein Timer (at) gesetzt auf die gewünschte "Wartezeit" und die Sub erneut aufgerufen mit den selben Parametern wie beim Start...
...ABER: eben NACH dem Ablauf des Timers, also beim dann nächsten Mal und bei Abfrage des aktuellen Dim-Wertes mit einem neuen "Input" (nämlich höher als zuletzt)...

usw.

Viel Spaß, 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)

mister

Wahnsinn! Was du hier für einen Support bietest also alla bonheur :) :)

Es funktioniert und ist soweit auch nachvollziehbar. Mir ist nur aufgefallen das die Schritte meines Aktor nicht immer gleich sind.

Ich habe folgende Dim Werte:

06,12,18,25,31,37,43,50,56,62,68,75,81,87,93

Jetzt macht deine Schleife ja genau das was sie soll nämlich und 5er oder 6er Schritten gleichmäßig hochzudimmen, da du diese Info natürlich von mir Torfnase nicht hattest nur bis 18.

Wie kann ich da Umstricken mit den genannten Werten?

MadMax-FHEM

Tja, wenn ich das vorher gewusst hätte...
...aber die Infos von deiner Seite waren schon sehr minimalistisch...
(freundlich ausgedrückt ;)  )

Vielleicht bringst du zukünftig gleich mehr...

Tja:

da wirst du dir wohl ein Array anlegen müssen (kannst du ja in der Sub tun) und dann eben beim Timer-Aufruf z.B. statt dem Endwert (den kennst du ja ;)  ) eben den aktuellen Index im Array übergeben.

Beim Erstaufruf dann nat. halt null...

Wenn du Glück hast, habe ich Lust und passe das noch mal an...
...an die genannten Infos.

Wenn du dann mit noch was um die Ecke kommst, könnte sich meine Lust wieder reduzieren...
...bzw. dann musst du (komplett) selber dran... ;)

Wie sieht denn der set-Befehl für Dimmen bei deinem Aktor aus!?

Ansonsten ist alles geschrieben...
...dann hilft nur noch: Perl lernen...

Tut nicht weh ;)

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)

MadMax-FHEM

#13
Du hattest Glück... ;)

Aber wenn jetzt noch irgendeine "Spezialität" um die Ecke kommt, die du "vergessen" hast zu erwähnen, dann würde ich vorschlagen: fhem lernen! Perl lernen!


Neue Sub (einfach nach der bestehenden sub aber VOR der 1 am Ende einfügen):


sub my_DimmUp2($$$)
{
  my ($Device, $DimIndex, $WaitTime) = @_;
  my $ActDimValue = 0;
  my $AtName = "atDimTimerFor" . $Device;
  my $AtTime = "+00:00:0" . $WaitTime;
  my @DimValues = ("06","12","18","25","31","37","43","50","56","62","68","75","81","87","93");

  Log3(undef, 3, "my_DimmUp    Device: $Device     DimIndex: $DimIndex     WaitTime: $WaitTime");

  if($DimIndex < 15)
  {
    $ActDimValue = @DimValues[$DimIndex++];

    # evtl. muss noch % o.ä. dran
    # $ActDimValue .= "%";

# set Befehl halt anpassen wie er wirklich lauten muss...
#  fhem("set $Device dim $ActDimValue");
# das hier war für meinen Dummy
    fhem("setreading $Device dim $ActDimValue");
    # sollte nicht nötig sein da defmod und nur "temporärer timer" aber ohne ging es bei mir nicht
    fhem("delete $AtName");
    fhem("defmod $AtName at $AtTime {my_DimmUp2(\"$Device\", $DimIndex, $WaitTime)}");
    Log3(undef, 3, "my_DimmUp timer $AtName with $AtTime started.");
  }
}


Erster Aufruf (also für den Dummy):


{my_DimmUp2("dmTestLicht",0,5)}


Du kannst auch mit einer anderen Stufe anfangen, dann halt einfach statt der 0 einen anderen Startwert... ;)

EDIT: dimmt halt in der aktuellen Form alle Werte bzw. von Start-Index bis Ende durch... Anpassungen kannst du ja dann vornehmen... Die Anpassungen an DEINE Geräte bzgl. set-Befehl musst du eh tun... Wenn du es nur für ein und immer dasselbe Gerät haben willst, dann geht die Sub auch einfacher, einfach den Parameter "Device" rausnehmen und in der Sub immer fix den Namen hinschreiben. Dann ist auch das mit dem "dynamischen at-Namen" nicht mehr nötig... In der Form mit dem Device-Namen geht es halt für alle Geräte, die denselben set-Befehl und dieselben Dim-Stufen haben...

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)

mister

#14
Vielen Vielen lieben Dank. Ja das hast du recht da muss ichmich aber grundsätzlich mal reindenken so langsam. Ich gelobe besserung.

Habe das versucht verzweifel aber daran das er mir einen syntax error nennt für diese Zeile:

$ActDimValue += . "%";

Wo kann ich mich denn am besten mal einlesen dazu um da sbesser zu verstehen? Ich würde z.b. gerne noch ein Variable einfügen die mirdie Wartezeit überträgt sodass ich ein set off nach x sekunden ausführen kann. Sprich alle wert inder Schleife hoch dimmen und nach x sekunden wieder ausschalten. Diese Zeit möchte ich aber mit in den Aufruf schreiben