RandomTimer - neues Modul

Begonnen von Dietmar63, 28 Juli 2013, 15:52:40

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Noch einmal ne Frage in die Runde:

Wenn ich mehrere Lampen einzeln zufallsgesteuert ein- und ausschalten möchte, muss man für jede Lampe einen eigenen RandomTimer anlegen? Oder gibt es da einen Trick, den ich übersehen habe?

Per DOIF habe ich das versucht, folgendermaßen zu lösen:
set stru_lampe_{(int(rand(3))+1)}:FILTER=state!=on on-for-timer {(int(rand(59))+1)*60}

Hinweis: Ich habe vier Structures (stru_lampe_1, stru_lampe_2, etc.) mit den dahinterliegenden Lampen angelegt.

Dietmar63

Wenn du es über structure löst, sollten alle Lampen gleichzeitig geschaltet werden, das ist nicht der Sinn von RandomTimer.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

FunkOdyssey

Ich habe vier durchnummerierte Structures mit jeweils nur einer Lampe. Und diese werden per DOIF zufällig ausgewählt und ein- oder ausgeschaltet. Jedoch würde ich das lieber per RT lösen.

Ich hab jetzt einfach vier RT ausgewählt. Mit Perl-Code im DEF klappte es nicht.

Dietmar63

Habe heute keine Zeit - versuche morgen mich damit zu beschäftigen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

FunkOdyssey

Kein Problem. Ich habe ja ne Lösung und versuche nur, es eleganter zu lösen. Also keinen Streß.

Dietmar63

#290
ZitatIch hab jetzt einfach vier RT ausgewählt. Mit Perl-Code im DEF klappte es nicht.
wie hast du es versucht?

RT ist so gebaut, dass er genau ein Gerät über einen gewissen Zeitraum hinweg ein- bzw. auschaltet.
Er immitiert die ZeitschaltFunkuhr FS20ZSU, die man für ca 60€ kaufen kann.

Du musst also 4 RT anlegen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

FunkOdyssey


ErdBaer

Hallo zusammen.

Bis gestern hat mein eingesetzter RandomTimer perfekt funktioniert. Nachdem ich heute ein paar Anpassungen (zusätzliche RT) vorgenommen habe, funktioniert das Ein-/Ausschalten des RT bei mir nicht mehr ... und ich bin gerade am verzweifeln. Selbst nach einem Rückbau funktioniert es nicht  :-(.

Vielleicht sieht einer von euch auf Anhieb, wo das Problem liegt. Hier meine Config:

99_myUtils.pm:

sub AnwSim () { return(YesNo("AnwSimulation")); }
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "off");
  if ($state eq "off") {
    return 0;
         fhem{"set wz_Leuchte off"};
  }
  return 1;
  fhem{"set wz_Leuchte on"};
}


Verwendung:

define AnwSimulation dummy
attr AnwSimulation fm_type offbutton,onbutton
attr AnwSimulation group AlarmStatus
attr AnwSimulation room 00_AlarmStatus
attr AnwSimulation setList on off
attr AnwSimulation webCmd on:off

define ZufallsTimer_On notify AnwSimulation:.* {RandomTimer_Wakeup()}

define ZufallsTimer_BZ1 RandomTimer *{TimeRnd("06:30","07:30")} bz_Tischleuchte *{sunrise_abs("REAL",900+rand(800)-400)} 440
attr ZufallsTimer_BZ1 disableCond (!AnwSim())
attr ZufallsTimer_BZ1 room 99_RandomTimer
attr ZufallsTimer_BZ1 switchmode 500/700


Beim Ein-/Ausschalten über den Dummy "AnwSimulation" kommt die Meldung "RandomTimer_Wakeup() done!", der STATE der RT ändert sich aber nicht.

Komischerweise wird der STATE der RT aber korrekt gesetzt, wenn ich in die fhem.cfg reingehe und diese (auch ohne Änderung) speichere und FHEM neu startet.

Übersehe ich etwas?
FritzBox 7390 mit FHEM-Community Image, HMLan-Adapter
AVM: Dect200, 546E
HM: Funk-Zwischenstecker, Funk-Bewegungsmelder, Funk-Tür-/Fensterkontakte

Dietmar63

Ist das Absicht mit der Reihenfolge?

 
return 0;
fhem{"set wz_Leuchte off"};


Nach einem Return wird der Rest nicht ausgeführt.
Setze mal verbose 5 auf dem RT[/code]
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

ErdBaer

Danke für die schnelle Antwort!   :-)

Der FHEM-Befehl im 99_myUtils.pm war mein verzweifelter Versuch, zu "debuggen", steht aber natürlich an der falschen Stelle (war schon spät ;-) ...).

Hier das Log mit verbose 5 auf dem RT (Ausgangssituation: AnwSimulation ausgeschlatet, RT disabled):

shutdown restart

2015.10.17 09:24:04 4: [ZufallsTimer_BZ1] timings  RandomTimer on bz_Tischleuchte: 07:02:00(17) - 08:06:54(17)
2015.10.17 09:24:04 5: [ZufallsTimer_BZ1] setting  Timer: ZufallsTimer_BZ1_Exec 2015-10-17 09:24:04
2015.10.17 09:24:04 5: [ZufallsTimer_BZ1] removing Timer: ZufallsTimer_BZ1_SetTimer
2015.10.17 09:24:04 5: [ZufallsTimer_BZ1] setting  Timer: ZufallsTimer_BZ1_SetTimer 2015-10-18 00:07:35
2015.10.17 09:24:04 4: [ZufallsTimer_BZ1] RandomTimer on bz_Tischleuchte timer disabled - no switch
2015.10.17 09:24:04 4: [ZufallsTimer_BZ1] defintion RandomTimer on bz_Tischleuchte: 07:02:00(17) - 08:06:54(17)


AnwSimulation eingeschaltet

2015.10.17 09:26:10 3: RandomTimer_Wakeup() done!


Nach dem Einschalten gibt's nur diesen einen Eintrag im Log?!

Zur sicherheit hier noch mal meine komplette 99_myUtils.pm

package main;
use strict;
use warnings;
use POSIX;

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

#################################################
# start with your own functions below this line #
#################################################
#
#
sub AnwSim () { return(YesNo("AnwSimulation")); }
#
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "off");
  if ($state eq "off") {
  return 0;
  }
  return 1;
}
#
#
sub randtime24plus($$) {
  use Time::Local 'timelocal';
  my ($ts,$offset) = @_;
  my ($h,$m,$s)    = split(/:/,$ts);
  my @now          = localtime(time);
  my $ts_fix       = timelocal($s,$m,$h,$now[3],$now[4],$now[5]);
  my $offset_rand  = int(rand($offset * 60));
  my $delta;

  if (time < $ts_fix)  { # nächster Zeitpunkt ist heute
           $delta = $ts_fix - time + $offset_rand;
  } else {               # nächster Zeitpunkt ist morgen
           $delta = $ts_fix - time + $offset_rand + 86400;
  }

  return sprintf("%02d:%02d:%02d", $delta/3600, ($delta/60)%60, $delta%60);
}
#
#
######## DebianMail  Mail auf dem BBB versenden ############
#
sub DebianMail {
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "xxx\@xxx.com";
my $konto = "xxx\@xxx.com";
my $passwrd = "xxx";
my $provider = "smtp.xxx.com:587";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";

$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=yes -o message-charset=utf-8);
$ret =~ s,[\r\n]*,,g;    # remove CR from return-string
Log 1, "sendEmail returned: $ret";
}
#
#
######## TimeRnd Zeit Zufall von bis #############################
# Aufrufbeschreibung: TimeRnd("vzeit","bzeit") 
# vzeit = Startzeitpunkt zB. "07:00:00" oder "07:00"
# bzeit = Endzeitpunkt zB. "07:10:00" oder "07:10"
# TimeRnd = keine 24 Stunden aufaddiert
#
sub TimeRnd($$) {
  my ($h1,$m1,$s1) = split(":", shift);
  my ($h2,$m2,$s2) = split(":", shift);
  $s1 = 0 if(!$s1);
  $s2 = 0 if(!$s2);
  my $t1 = 3600*$h1+60*$m1+$s1;
  my $t2 = 3600*$h2+60*$m2+$s2;
  my $er = int(rand($t2-$t1)+$t1);
 
  return sprintf("%02d:%02d:%02d", $er/3600, ($er/60)%60, $er%60) if($s1);
  return sprintf("%02d:%02d", $er/3600, ($er/60)%60);
}
#
####################################################
# behind your last function, we need the following #
####################################################
1;


Die Sub TimeRnd ist gestern neu dazu gekommen, aber selbst ohne läuft's nicht mehr.
FritzBox 7390 mit FHEM-Community Image, HMLan-Adapter
AVM: Dect200, 546E
HM: Funk-Zwischenstecker, Funk-Bewegungsmelder, Funk-Tür-/Fensterkontakte

Dietmar63

Vermulich passiert nichts, weil die aktive Zeit des RT um 9:24 für den Tag schon abgelaufen ist:
Zitattimings  RandomTimer on bz_Tischleuchte: 07:02:00(17) - 08:06:54(17)
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

ErdBaer

Eine etwas verspätete Rückmeldung (war länger unterwegs) - es funktionieren tatsächlich alle RandomTimer zuverlässig. Sobald ein Timer an der Reihe ist, schaltet der STATE von "disabled" auf "on" und läuft.

Ich hätte schwören können, dass (früher) nach Aktivierung der Timer der STATE sofort auf "off" und - wenn aktiv - auf "on" gewechselt ist.

Danke für die Hilfe!
FritzBox 7390 mit FHEM-Community Image, HMLan-Adapter
AVM: Dect200, 546E
HM: Funk-Zwischenstecker, Funk-Bewegungsmelder, Funk-Tür-/Fensterkontakte

FunkOdyssey

Ich habe (mal wieder) eine Frage zu nem Problem.

Ich schalte meine RandomTimer-Defitinionen über die Anwesenheit und schalte die unterschiedlichen RT-Defs per "attribut xyz disable 1" aus.

Nun hatte ich das schon einmal, dass aus irgendeinem Grund (egal woher) der Zufallsmodus im Hintergrund noch an war oder die RT rund um den STOPTIME-Zeitpunkt die Lampen ausschalten.

Also habe ich mir gedacht, dass ich prophylaktisch alle RT-Geräte (immer) deaktiviere, sobald am Wandtaster eine Taste für die manuelle Ein- und Ausschaltung gedrückt wird.

([taster_btn_01] =~ "Short")
(
attr rand_lampe1 disable 1,
attr rand_lampe2 disable 1,
attr rand_lampe3 disable 1,
attr rand_lampe4 disable 1,
attr di_tischlampen disable 0,
set leuchte on
)


Ich wollte also die Sache benutzerfreundlicher machen und sämtliche Zufallsgeneratoren deaktivieren sobald man manuelle Aktionen auslöst.

Nun aber zum Problem:

Wenige Minuten nach dem "attribut xyz disable 1" gehen die Lampen wieder an. Und das wird wohl vom RandomTimer ausgelöst, der eigentlich aus ist.

Hier mal ein RT-Def:
Internals:
   COMMAND    on
   DEF        *08:00 leuchte 23:59 3500
   DEVICE     leuchte
   NAME       rand_lampe1
   NR         772
   REL
   REP        *
   SIGMAOFF   500
   SIGMAON    500
   STARTTIME  10.11.2015  08:00:00
   STATE      disabled
   STOPTIME   10.11.2015  23:59:00
   SWITCHMODE 500/500
   S_REL
   S_REP
   TIMESPEC_START *08:00
   TIMESPEC_STOP 23:59
   TIMETOSWITCH 3500
   TYPE       RandomTimer
   active     0
   startTime  1447138800
   stopTime   1447196340
   Timer:
     Rand_lampe1_exec:
       HASH       rand_lampe1
       MODIFIER   Exec
       NAME       rand_lampe1_Exec
     Rand_lampe1_settimer:
       HASH       rand_lampe1
       MODIFIER   SetTimer
       NAME       rand_lampe1_SetTimer
Attributes:
   disable    1
   switchmode 500/500


Frage also: Warum gehen die Leuchten wieder an, obwohl RZ disabled ist?

Hat jemand eine Idee? Danke.

Dietmar63

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

FunkOdyssey

#299
Ich habe gestern mal verbose auf 4 gesetzt. In der Hoffnung, etwas mehr zu sehen. Leider ohne Erfolg. Im fhem.log stand nichts von Interesse. (RandomTimer loggt übrigens nicht in Geräte-individuellen Logs.)

2015-11-10_17:53:57 leuchte on
2015-11-10_23:11:46 leuchte off # manuelle Ausschaltung über Wandtaster
2015-11-10_23:17:14 leuchte on # ging wieder an
2015-11-10_23:19:19 leuchte off # erneut manuelle Ausschaltung
2015-11-10_23:24:24 leuchte on # und wieder angegangen
2015-11-10_23:39:57 leuchte off # über WebGUI ausgeschaltet


Merkwürdig finde ich auch, dass von meinen vier RT-Geräten (mit jeweils eigenen Leuchten) immer nur zwei wieder eingeschaltet werden. Die anderen beiden bleiben aus. Und das obwohl der RT-Code und der disable-Code identisch ist.

NACHTRAG:
Stopp. Warte mal. Direkt nach dem Absenden ist mir eine Idee gekommen. Manchmal muss man es einfach mal runtertippen, um auf einen Lösungsansatz zu kommen. Ich prüfe noch einmal etwas nach. Ich glaube, dass es doch nicht am RandomTimer liegt, sondern an meinen DOIF "di_tischlampen", der exakt die zwei (von vier) Leuchten steuert.

Nachtrag 2:
Ich bin mir sicher, dass es nun nicht am RandomTimer liegt. Ich de-aktiviere ein DOIF, welches die zwei Leuchte über Helligkeitswerte triggert. Und alle x Minuten wird dieser Wert übertragen und dadurch die Lampen eingeschalten.

Es tut mir leid, dass ich den Thread hier zweckentfremdet habe. Meine Schuld. Sorry.