Perl time loop mit while

Begonnen von waldo, 03 April 2025, 13:17:47

Vorheriges Thema - Nächstes Thema

waldo

Guten Tag

Mit dem "sub" sollen vor und nach der "while"-Zeitschlaufe Geräte geschaltet werden.
Weder das Ein noch das Andere erfolgt, nur die Schaltung in der Zeitschlaufe erfolgt.
Respektive, die Schaltungen vor/nach der Zeitschlaufe erfolgen erst nach Ablauf dieser.

Wo liegt hier denn der Fehler?
Hoffe jemand kann mir weiter helfen.

Dazu event. von Interesse, FHEM läuft bei mir im Test mit
define KNX dummy
Hier wie ich das sub aufrufe wenn der Testschalter betätigt wird:
define TestRun notify Testschalter:on {TestSubProg("Testschalter", "LichtK", "LichtHoD")}
Hier das sub im 99_myUtils.pm:
#!/usr/bin/perl
package main;
use strict;
use warnings;
use POSIX;
use File::Copy;
use bignum ( p => -1 ); # set float to percision 1

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

sub TestSubProg($$$){
  my ($meinschalter, $licht, $dose) = @_;
 
  fhem("setstate $meinschalter on");
  fhem("set $licht on");
 
  my $run_limit_sek = 5; # run for 5 sec
  my $start_time = time;
  my $end_time = $start_time + $run_limit_sek;

  while (1)
  {
    my $current_time = time;
    if ($current_time > $end_time)
    {
      fhem("set $dose on");
      last;
    }
    # fhem(Log3("", 3, "do my thing...")); # nur für test
  }
 
  fhem("set $meinschalter off");

  return;
}
1;

betateilchen

Beschreibe bitte zuerst die genaue Aufgabe, die Du lösen möchtest.

Wenn ich es richtig verstehe, möchtest Du $dose nach 5 Sekunden anschalten. Dann nimm doch einfach ein at dafür, das ist exakt dafür gedacht.

Dein Codeschnipsel ist dermaßen schräg, dass ich gar nicht erst anfangen möchte, daran rumzudoktern.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

waldo

Fhem sollte ohne Beeinträchtigung laufen.

Bei Betätigung des Tasters wird das sub gestartet in welchem
1. eine Lampe (licht) eingeschaltet werden soll
2. in der Zeitschlaufe (Linie #log...) soll dann eine Wechselfunktion (toggle)
   ein/aus von 2 Lampen folgen
3. nach Ablauf der Zeit (unten 5 Sek, im Betrieb dann 2 Std) soll die
   Wechselfunktion enden und die Geräte entsprechend schalten

Oder so:
- Diverse Geräte für eine bestimmte Laufzeit einschalten (wie mit "on-for-timer")
- Währen der selben Laufzeit schalten einer Wechselfunktion zwischen 2 Geräten,
  "Gerät-1 ein = Gerät-2 aus" / "Gerät-1 aus = Gerät-2 ein"
- Nach Ablauf Geräte entsprechend schalten

Gruss

frober

Mit deiner Sub wirst du FHEM solange blockieren, bis diese abgearbeitet ist.

Aber du könntest InternalTimer() verwenden.
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Timer
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...