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;
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.
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
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)