FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: waldo am 03 April 2025, 13:17:47

Titel: Perl time loop mit while
Beitrag von: waldo am 03 April 2025, 13:17:47
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;
Titel: Aw: Perl time loop mit while
Beitrag von: betateilchen am 03 April 2025, 13:44:32
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.

Titel: Aw: Perl time loop mit while
Beitrag von: waldo am 04 April 2025, 09:16:59
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
Titel: Aw: Perl time loop mit while
Beitrag von: frober am 07 April 2025, 18:43:17
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 (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Timer)