In MyUtils mit Sekunden arbeiten

Begonnen von tfriedrich85, 09 November 2020, 22:21:26

Vorheriges Thema - Nächstes Thema

tfriedrich85

Hallo zusammen,

ich steuere mit der Funktion "sendeAnAnalog1" meine Dimmer an über I2C an. Jetzt möchte ich ein langsames hochdimmer erreichen und will deshalb den gewünschten Dimmwert erst nach einigen Sekunden erreicht wird. Gibt es die Möglichkeit eine time.h einzubinden um die Dimmwertberechnung nach ablauf von x sekunden zu verändern? delay?



sub sendeAnAnalog1($)
{
my $rcpt = shift;
my $prozent = $rcpt*10;
my $hhhex = sprintf("0x%X", $prozent);
{system("i2cset -y 1 0x5b 0x00 $hhhex w");"ok"};

}


Hat damit jemand Erfahrungen?

Beta-User

Keine direkte Erfahrung iVm. der Dimmerei, und meistens arbeite ich auch direkt mit InternalTimer...

Kurz: Perl-sleep oä. sollte man tunlichst vermeiden, du brauchst das, was man unter Arduino eine "non-blocking loop" nennen würde.

Geht mit einem FHEM-sleep (oder eben einem InternalTimer-Aufruf, was aber komplizierter ist) und einem rekursiven Aufruf derselben Funktion.

Hier hatte ich mal was aufgeschnappt:#https://forum.fhem.de/index.php/topic,115067.msg1093484.html#msg1093484
sub incrementHerdLicht() {
  my $pct = ReadingsNum("KuecheHerdLichtLinks", "pct", "");
  my $schalter = ReadingsVal("SchalterHerdLicht", "state", "");
  #Log 1,"incrementHerdLicht : pct ".$pct." schalter ".$schalter;
  if ($pct < 100 && $schalter ne "1003") {
    fhem("set KuecheHerdLichtLinks dimUp;sleep 0.2;set KuecheHerdLichtRechts dimUp");
    fhem("sleep 0.5;{incrementHerdLicht()}");
  }
}

Das ist aber unter mehrerlei Gesichtspunkten nicht gut:
- Prototype
- die Devices sind "hart-vercoded".

Sowas sollte man generisch gestalten (und die Abbruchbedingung ggf. nach außen legen):
sub myDimUp_PctToMax {  my $name   = shift // return;  my $maxval = shift // 100;
  my $remote = shift;  my $remotestop = shift // '1003'; 
  my $pct = ReadingsNum($name, 'pct', 0) +3;  my $schalter = ReadingsVal($remote, "state", "");
  if ($pct < 103 && $schalter ne $remotestop) {
    fhem("set $name pct $pct");
    fhem("sleep 0.5;{myDimUp_PctToMax($name, 100, $remote, $remotestop)}");
  }
}

(Wobei man die sleep-Zeit noch verändern könnte und einen nicht-Linearen pct-Verlauf).

Grundsätzlich ist es aber besser, sowas läßt man die Hardware machen, bei FHEM ruckelt das gerne, v.a., wenn man sehr gleichtende Übergänge haben will...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors