Hallo,
wie könnte ich denn Steckdosen zufällig schalten? Super wäre, wenn man bspw. über eine Funktion ein Einschaltfenster und ein Einschaltdauerfenster definieren könnte, diese Fenster aber jeden Tag neu berechnet werden.
Ist das möglich? Wie nur?
Danke für eure Hilfe.
Ich habe mir einen RandomTimer gebaut, der täglich bei Dämmerung mit einer Anwesenheitssimulation beginnt, alle n Sekunden an/aus schaltet, und nach hh:mm Stunden ausschaltet.
Werde ich nachher hier veröffentlichten.
wie angekündigt der RandomTimer:
define <name> RandomTimer <timespec> <device> <verreist> <stopTime> <timeToSwitch> [<switchmode>]
<timespec> Startzeit wie im at-Kommando ab der der RandomTimer startet - kann von einer Perlfunktion
geliefert werden
<device> device, das geschaltet werden soll
<verreist> Dummydevice, das den Wert ja/nein enthält: RT schaltet nur, wenn <verreist> eq "ja" oder
<verreist> nicht definiert ist.
<stopTime> Endezeit: RT schaltet aus.
<timeToSwitch> Zeit in Sekunden nach der jeweils an/aus geschaltet wird. Die Zeit wird mit einer zufälligen
Abweichung von 10% eingehalten.
[<switchmode>] optional - gibt an mit welcher Wahrscheinlichkeit an/aus geschaltet wird - Standard 800/100
es wird mit 80% Wahrscheinlichkeit an und mit 10% Wahrscheinlichkeit ausgeschaltet.
Wenn der Timer während der Laufzeit definiert wird, startet er sofort. Der Timer übersteht einen restart von fhem.
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
So definiert wird LampeTisch jeden Tag ab Sonnenuntergang bis 22:00 Uhr zufällig alle 480 Sekunden an/aus geschaltet. Die 480 Sekunden varieren mit ca. 10% Abweichung. Das Verhalten enspricht etwa der FS20-Zeitschaltuhr(alter Bauart).
Hi,
überraschenderweise hat dieses Forum auch eine Suchfunktion:
http://forum.fhem.de/index.php?SQ=317ad8cd9d9ee7b2aa3aa3ef87bf08da&srch=anwesenheitssimulation&t=search&btn_submit.x=0&btn_submit.y=0 (//forum.fhem.de/index.php?SQ=317ad8cd9d9ee7b2aa3aa3ef87bf08da&srch=anwesenheitssimulation&t=search&btn_submit.x=0&btn_submit.y=0)
Da finden sich gleich mehrere Ansätze.
Gruß, Uli
Die existierenden Lösungen sind viel zu kompliziert und unflexibel.
Meine Variante schaltet in einem Bereich von-bis unregelmäßig an/aus und benötigt nur die eine Zeile in der cfg
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
ich schalte den Timer einfach durch das setzen des dummys Verreist bei Abwesenheit an/aus.
Die Startzeit kann über eine Perlfunktion ermittelt werden, so dass auch sunrise_abs möglich ist.
Seitdem ich diese Funktion nutze hat bei mir noch niemand etwas mitgehen lassen.
Hallo Dietmar
Zitatschalte den Timer einfach durch das setzen des dummys Verreist bei Abwesenheit an/aus.
Bitte poste noch deinen Dummy-Eintrag. Habe bisher noch nicht damit gearbeitet
Gruß und Danke ingo
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
define Verreist dummy
attr Verreist room Wohnzimmer
attr Verreist group Commands
attr Verreist webCmd ja:nein
Super, werde ich mal ausprobieren.
Muss die 98_RandomTimer.pm noch irgendwie besonders in die fhem.cfg eingebunden werden, oder kann aich alles direkt verwenden?
Du musst die 98_RandomTimer.pm ins fhem Verzeichnis kopieren(dort wo alle Module liegen) und reload 98_RandomTimer in der fhem Oberfläche ausführen.
Nur noch den Eintrag in die cfg und los geht's
In die fhem.cfg kommt doch nur so etwas wie
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
Oder noch mehr?
Die 98_RandomTimer.pm wird dann bspw. bei einem fhem Neusrart gleich mitgeladen?
Ja das ist alles richtig.
Die 98_RandomTimer.pm muss nur erst in das fhem/fhem Verzeichnis kopiert werden
Hallo,
kann ich für den "Verreist"-Schalter auch einen FS20 Schalter wie bspw.:
define Urlaub FS20 23232323 1122
attr Urlaub dummy 1
attr Urlaub fm_name Urlaub
attr Urlaub fm_order 2
attr Urlaub model fs20st
attr Urlaub room Zentraleverwenden?
Zitat von: Dietmar63 schrieb am Do, 21 März 2013 20:42
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
define Verreist dummy
attr Verreist room Wohnzimmer
attr Verreist group Commands
attr Verreist webCmd ja:nein
Nein - das geht nicht direkt.
Aber du kannst mit einem fs20 Schalter über den Umweg eines notify die Dummy Variable verändern.
Ich melde mich immer in der WEB Oberfläche an, und Verändere von dort die Dummy Variable.
Sollte mal ein Precence-Modul "psim" werden, die Zeit bis zum Urlaub wurde aber knapp, deswegen als Standalone Perl Program das defines für fhem erzeugt. Kann man dann mit netcat reinreichen:
presence.pl |netcat localhost 7072
Das ganze schalte ich dann mit cron einmal am Tag ein - wenn ich nicht anwesend bin.
Beispiel für die Definition:
WHZ_TV 1-5 20:30-22:00 1 1 01:00 03:00
device WHZ_TV an den Tagen 1-5 in der Zeit 20:30 - 22:00 Uhr mindestens 1-mal und maximal 1-mal für mindestens 01 Stunden aber maximal 3 Stunden einschalten.
Optional kann man auch ein "On"-Kommando als letzten Parameter definieren.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw{ min max};
use POSIX;
use Data::Dumper;
my $presence_simulation_debug = 0;
my $presence_simulation_timeplan = {};
my $rval;
my $cdev='';
sub Log{
my ($l,$m)=@_;
#warn $cdev.$m;
warn $m;
}
sub _def{
my ($devs,$d)=@_;
my $hd={};
(undef, $hd->{name}) = split("[ \t]+", $d);
push @$devs,$hd;
presence_Define( $hd, substr($d, 7));
}
sub
time_sec2str($)
{
my $v=shift;
my $h=int($v/3600);
$v=$v%3600;
my $m=int($v/60);
$v=$v%60;
my $s=$v;
return sprintf('%02d:%02d:%02d',$h,$m,$s);
}
my $devs=[];
# define your presence devices
_def($devs, 'define FL_LIGHT_SWITCH_SIM psim FL_LIGHT_SWITCH 1-5 20:45-01:00 2 7 00:05 00:10 { fhem("set FL_LIGHT_SWITCH on") if (ReadingsVal("FL_MOTIONDETECTOR","brightness", 100) <= 34) } ');
_def($devs, 'define WHZ_TV_SIM psim WHZ_TV 1-5 20:30-22:00 1 1 01:00 03:00');
foreach my $dev( @$devs) {
$cdev=$dev->{name}.':';
presence_timeplan( $dev);
}
foreach my $sdevice( keys %$presence_simulation_timeplan) {
my $tp=$presence_simulation_timeplan->{$sdevice};
my $i=0;
foreach my $t( @{$tp->{times}}) {
$i++;
my $bname=$sdevice.'_PSIM'.$i.'_';
my $cmdOn='define '.$bname.'on at '.time_sec2str($t->[0]%(24*60*60)).' '.$tp->{cmdOn};#.' set '.$sdevice.' on';
my $cmdOff='define '.$bname.'off at '.time_sec2str($t->[1]%(24*60*60)).' set '.$sdevice.' off';
print $cmdOn."\n";
print "attr ${bname}on room psimulation\n";
print $cmdOff."\n";
print "attr ${bname}off room psimulation\n";
}
}
sub randDigit{
my ($number, $offset, $count) = @_;
my $oldoffset=$$offset;
$count = 1 unless $count;
$$offset+=$count;
my $r=substr( $number, 2+$oldoffset, $count)/(10**$count);
#warn sprintf("%0.50f", $number);
Log 1, "presence_rand: number=$number, offset=$oldoffset, count=$count, result=$r" if ($presence_simulation_debug >=5);
return $r;
}
sub presence_Define {
my ($hash, $def) = @_;
my ($name, $type, $sdevice, $dayspec, $timespec, $minSwitchesPerDay, $maxSwitchesPerDay, $minOnTime, $maxOnTime, $cmdOn) = split("[ \t]+", $def, 10);
$cmdOn = "set $sdevice on" unless $cmdOn;
$hash->{SDEVICE}=$sdevice;
$hash->{DAYSPEC}=$dayspec;
$hash->{TIMESPEC}=$timespec;
$hash->{MINSWITCHESPERDAY}=$minSwitchesPerDay;
$hash->{MAXSWITCHESPERDAY}=$maxSwitchesPerDay;
$hash->{MINONTIME}=time_str2sec($minOnTime);
$hash->{MAXONTIME}=time_str2sec($maxOnTime);#+int(rand()*60);
$hash->{CMDON}=$cmdOn;
$hash->{RVAL}=$rval;
$hash->{RVAL} = '0.'.substr(sprintf('%0.16f',rand()),2).substr(sprintf('%0.16f',rand()),2).substr(sprintf('%0.16f',rand()),2) unless defined($rval);
#$hash->{RVAL}=substr(sprintf('0%f',rand()),2);
#warn Dumper( $hash);
#$hash->{}=$;
return undef;
}
sub presence_timeplan {
my ($hash)=@_;
my $sdevice = $hash->{SDEVICE};
my $dayspec = $hash->{DAYSPEC};
my $timespec = $hash->{TIMESPEC};
my $minSwitchesPerDay = $hash->{MINSWITCHESPERDAY};
my $maxSwitchesPerDay = $hash->{MAXSWITCHESPERDAY};
my $minOnTime = $hash->{MINONTIME};
my $maxOnTime = $hash->{MAXONTIME};
my $rval=$hash->{RVAL};
my $ofs=0;
my $doSwitch=0;
if ($minSwitchesPerDay < 1) {
#doSwitch = (int(rand * 100) % 10) / 10 >= min-switches-per-day
$doSwitch = randDigit( $rval, \$ofs, 1) >= $minSwitchesPerDay;
} else {
$doSwitch = 1;
}
Log 1, "presence_timeplan: doSwitch is $doSwitch (rand=$rval)" if ($presence_simulation_debug>=2);
if (!$doSwitch) {
Log 1, "presence_timeplan: do not switch today (rand=$rval)" if ($presence_simulation_debug);
return undef;
}
my $sval=randDigit( $rval, \$ofs, 2);
#warn "i: $sval*".($maxSwitchesPerDay-max(1,$minSwitchesPerDay))."=".$sval*($maxSwitchesPerDay-max(1,$minSwitchesPerDay));
#warn "i2:".int(max(1,$minSwitchesPerDay));
my $switchCount = int(max(1,$minSwitchesPerDay)) + int( $sval * ($maxSwitchesPerDay-max(1,$minSwitchesPerDay)));
Log 1, "presence_timeplan: switching $switchCount times (rand=$rval)" if ($presence_simulation_debug >= 2);
my ($stime,$etime)=split('-',$timespec);
#warn "timespec=$timespec, stime=$stime, etime=$etime";
$stime=time_str2sec($stime);
$etime=time_str2sec($etime);
#warn "stime=$stime, etime=$etime";
my $endtime=$etime;
$etime+=(24*60*60) if $etime < $stime;
#warn "stime=$stime, etime=$etime";
#warn "stime=".time_sec2str($stime).", etime=".time_sec2str($etime);
my @t;
my $tp=$presence_simulation_timeplan->{$sdevice};
unless ($tp) {
$tp={
times=>[],
cmdOn=>$hash->{CMDON},
};
$presence_simulation_timeplan->{$sdevice} = $tp;
}
# distribute start times over the full time range
my $trange=($etime-$stime)/$switchCount;
for(my $i=0;$i<$switchCount;$i++) {
my $cstime=$stime+($i*$trange)+randDigit( $rval, \$ofs, 2) * $trange;
my $ontime=$minOnTime+randDigit( $rval, \$ofs, 2) * ($maxOnTime-$minOnTime);
my $cetime=$cstime+$ontime;
if (grep{ ($cetime >= $_->[0] and $cetime <= $_->[1]) or ( $_->[1] >= $cstime and $_->[1] <= $cetime )} @{$tp->{times}}) {
Log 1, "$sdevice: skipping start time:".time_sec2str($cstime).", duration=".time_sec2str($ontime) if ($presence_simulation_debug >= 3);
next;
}
Log 1, "$sdevice: start time:".time_sec2str($cstime).", duration=".time_sec2str($ontime) if ($presence_simulation_debug >= 3);
push @{$tp->{times}}, [$cstime,$cetime,$ontime];
}
}
sub
time_str2sec($)
{
my ($h,$m,$s) = split(":", shift);
$m = 0 if(!$m);
$s = 0 if(!$s);
my $t1 = 3600*$h+60*$m+$s;
return $t1;
}
sub
time_str2num($)
{
my ($str) = @_;
my @a = split("[- :]", $str);
return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1);
}
Ich habe das jetz einmal alles eingebaut und die FritzBox neu gestartet. Dann sollte die Zufallsfunktion ja aktiv sein.
Sehe ich irgendwo in der WebOberfläche, wann geschaltet wird?
Zitat von: Dietmar63 schrieb am So, 24 März 2013 00:17Nein - das geht nicht direkt.
Aber du kannst mit einem fs20 Schalter über den Umweg eines notify die Dummy Variable verändern.
Ich melde mich immer in der WEB Oberfläche an, und Verändere von dort die Dummy Variable.
Du müsstest an/aus Schaltungen des Gerätes finden:
2013.03.24 18:12:36 2: FS20 set StehlampeTV on
2013.03.24 18:12:36 2: FS20 set StehlampeTisch on
Du kannst den loglevel des Gerätes auf 3 setzen, dann wird einiges mehr geloggt
bzw. so:
2013.03.23 22:07:22 2: FS20 set StehlampeTV off
2013.03.23 22:07:22 3: ZufallsTimerTv/StehlampeTV going down ...
2013.03.23 22:02:41 2: FS20 set StehlampeTisch off
2013.03.23 22:02:41 3: ZufallsTimerTisch/StehlampeTisch going down ...
2013.03.23 21:59:35 2: FS20 set StehlampeTV off
2013.03.23 21:46:37 2: FS20 set StehlampeTisch on
2013.03.23 21:38:52 2: FS20 set StehlampeTisch off
2013.03.23 21:06:34 2: FS20 set StehlampeTisch on
2013.03.23 20:58:11 2: FS20 set StehlampeTisch off
2013.03.23 20:31:43 2: FS20 set StehlampeTV on
2013.03.23 20:23:21 2: FS20 set StehlampeTV off
2013.03.23 19:35:37 2: FS20 set StehlampeTV on
Scheint alles zu funktionieren.
Ist das auch mit den Dimmern möglich (FS20 DI-5)? Sendet der ein on an den Dimmer oder können auch Dimmerwerte gesendet werden?
es wird nur on/off gesendet.
Hierzu wäre eine Erweiterung nötig, die den "on" "off" Befehl als Parameter übergibt.
Es gibt aber im Moment aber nur zwei Zustände.
ok, danke. Aber on an einen Dimmer zu senden schaltet bestimmt auf 100%.
Trotzdem hätte ich noch Fragen:
1. Im Beispiel startet der Timer ja ab Sonnenuntergang:
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
Kann man auch einen Timer ab einer festen Uhrzeit starten lassen (bspw. täglich ab 20:20) und die anderen definierten Timer wie im Beispiel ab Sonnenunterang?
Wie würde das aussehen?
2. Und schaltet die Zufallsfunktion eigentlich am Ende immer aus?
3. Kan man auch längere Schaltzeiten als 999sec erlauben?
Danke für Deine Hilfe.
Zitat1. Im Beispiel startet der Timer ja ab Sonnenuntergang:
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
Kann man auch einen Timer ab einer festen Uhrzeit starten lassen (bspw. täglich ab 20:20) und die anderen definierten Timer wie im Beispiel ab Sonnenunterang?
Wie würde das aussehen?
define <name> RandomTimer <timespec> <device> <verreist> <stopTime> <timeToSwitch> [<switchmode>]
<timespec> format: [+][*]<timedet>
The optional + indicates that the specification is relative(i.e. it will be added to the current time).
The optional * indicates that the command should be executed repeatedly.
<timedet> is either HH:MM, HH:MM:SS or {perlfunc()}, where perlfunc must return a HH:MM or HH:MM:SS date.
ja - <timespec> von RandomTimer funktioniert fast wie <timespec> von at: http://fhem.de/commandref.html#at (//fhem.de/commandref.html#at). {N} habe ich nicht realisiert, weil ich es nicht für sinnvoll gehalten habe.
define ZufallsTimerTisch RandomTimer 20:20 LampeTisch Verreist 22:10 780 800/100
Zitat2. Und schaltet die Zufallsfunktion eigentlich am Ende immer aus?
ja - aber mit einer Zeitverzögerung von bis zu <timeToSwitch> Sekunden - das ist Absicht, damit niemand ein Muster erkennen kann.
2013.03.23 22:07:22 2: FS20 set StehlampeTV off
2013.03.23 22:07:22 3: ZufallsTimerTv/StehlampeTV going down ...
Zitat3. Kan man auch längere Schaltzeiten als 999sec erlauben?
Im Moment nicht - läßt sich bei Bedarf aber ändern. Es ist die Zeit, nach der RT zufällig(<switchmode>) an/ausschaltet. Die Zeit von <timeToSwitch> Sekunden wird nicht genau eingehalten. Es ist eine Abweichung von ca. 10% fest eigebaut, damit auch hier niemand erkennen kann, dass eine Zeitschaltuhr am Werke ist. Ich hatte ursprünglich einen "FS20 ZE Funk-Timer". Dieser schaltete immer genau nach 8 Minuten - :(.
hallo ditmar,
wäre es für dich eine option in deinem modul das kommando zum aus und ein schalten jeweils konfigurierbar zu machen? dann könnte man zum einen einen dimmer direkt mit einem level ( z.b.: on:50 off:off )ansteuern und zum anderen mit dem LightScene modul eine ganze gruppe von lampen auf einmal schalten (z.b. /on:scene on/off:scene off/ oder /on:scene alles/off:scene aus/).
gruss
andre
Wie müßte deiner Meinung nach die Definition erweitert werden bzw. wuerdest du es über ein attr lösen?
Ich habe bisher nicht den Bedarf gehabt etwas anderes als eine fs20st zu schalten.
Am Bestem wäre gleich die "grosse Lösung":
eine Perlfunc, die das on-Kommando ersetzt und eine Perlfunk, die das off-Kommando ersetzt?
ich denke ich würde zwei attribute werwenden. dann wird die definition nicht noch länger und schwieriger zu parsen.
z.b.:
attr zufall1 onCmd 50
attr zufall1 offCmd off
attr zufallWohnzimmer onCmd scene alles
attr zufallWohnzimmer offCmd scene aus
attr zufallPerl onCmd {...}
attr zufallPerl offCmd {...}
wenn es ein {..} ausdruck ist als perl ausführen sonst mit set ...
gruss
andre
scheint mir spannend und nicht schwer umsetzbar zu sein.
attr zufall1 onCmd set @ dim06%
attr zufall1 offCmd set @ off
attr zufallWohnzimmer onCmd set scene alles
attr zufallWohnzimmer offCmd set scene aus
attr zufallPerl onCmd {...}
attr zufallPerl offCmd {...}
@ würde durch das <device> ersetzt.
Dann sollte alles Mögliche machbar sein!
@ Andre:
habe es eben eingebaut und mit folgenden attr getestet - scheint zu laufen. Als onCmd/offCmd sind ganze Befehlsketten möglich!
attr Timer onCmd {fhem("set @ on-for-timer 14")}
attr Timer offCmd {fhem("set @ off 16")}
attr Timer onCmd set @ on-for-timer 12
attr Timer offCmd set @ off 12
attr Timer onCmd set @ on
attr Timer offCmd set @ off
Anbei das Modul - kannst Du es mal testen - Wenn du es für ok befindest kann ich es einchecken, dann hat kann die ganze fhem-Gemeide davon profitieren. Es ist zwar eine weitere Lösung der Anwesenheissimulation, aber viel flexibler - hoffentlich.
Gib mir bitte in Info, ob es deinen Vorstellungen nahe kommt bzw. ob du noch weitere Wünche/Anregungen hast.
das klingt klasse. ich probiere es nachher gleich aus.
eine kurze anmerkung vorweg: wäre es nicht besser im perl code statt dem @ besser $name zu verwenden und zu setzen? dann muss nichts maskiert werden wenn doch mal ein @ gebraucht wird und das risiko aus versehen etwas zu ersetzten ist geringer. rudolf stellt das an anderer stelle auch gerade um: Link (http://forum.fhem.de/index.php?topic=11886.0)
gruss
andre
edit: ich habe grad ein paar Kombinationen durch gespielt und von meiner seite aus funktioniert es. ich kann alles damit tun was ich mir vorgestellt habe.
zwei erweiterungen die vielleicht etwas für eine spätere version sind:
- eine art täglichen single shot mechanismus um z.b. einen rolladen irgendwann zwischen 9 und 10 hochzufahren. wenn man z.b. das onCmd auf {} konfiguriert und das offCmd auf 'set rolladen hoch' und der timer nach dem ersten off abschaltet sollte es gehen.
- statt dem urlaubs dummy vielleicht optional auch holliday unterstützen. damit hab ich mir zur zeit meine rollladen eingerichtet.
@ deshalb weil es bei vielen Funktionen schon weit verbreitet ist.
Irgendwie hänge ich an dem dummy.
Es ist so einfach möglich es von unterwegs zu schalten. Ich könnte holiday zusätzlich unterstützen, bin aber der Meinung, dass man dann nur Satzart 4 verwenden sollte.
Hast du ein Beispiel wie man es machen könnte?
Wäre dieses Modul es Wert es ins fhem Verzeichnis einzustecken?
Ich bin der Meinung, dass alle anderen Möglichkeiten die Abwesenheit zu simulieren viel komplizierter handzuhaben sind. Von HOL findet sich kein Eintrag in der Statistik. Und die Lösung mit dem Script... ist meiner Meinung nach nichts für Anfänger.
Hallo Dietmar,
Die neue Variante des 99_RandomTimer.pm klingt spannend. Aber wie kann ich die neuen Features nutzen?
Gerade nutze ich die Konfiguration so:
define ZufallsTimerFlurlicht2 RandomTimer *05:30 Flurlicht Verreist 07:45 999 800/100
Wie könnte ich das mit der neuen Version nutzen und dabei die neuen Features einsetzen? Mir fehlt die Vorstellung, um
attr Timer onCmd {fhem("set @ on-for-timer 14")}
attr Timer offCmd {fhem("set @ off 16")}
attr Timer onCmd set @ on-for-timer 12
attr Timer offCmd set @ off 12
attr Timer onCmd set @ on
attr Timer offCmd set @ off
zu adaptieren.
Wenn das Modul jetzt gerade von Dir bearbeitet wird, könnte man dann auch die maximal mögliche Einschaltzeit verlängern (von derzeit 999sec.)?
Danke für Hilfe.
hallo ditmar,
mir gefällt das modul sehr gut. besser als die anderen die ich bis jetzt überflogen habe. ich finde es einfacher und mit den neuen änderungen so flexibel das doch viel mehr damit tun kann.
wegen holliday: ja. es ging mir um satzart 4. ich verwende es zur zeit so:define RolladenSchlafzimmerHoch at *{sunrise("REAL",0,"08:00","10:00")} {fhem("set Rolladen up") if( Value("bw") =~ /Urlaub/)}
bw ist mein holliday device.
eine möglichkeit wäre natürlich an der stelle wo du das dummy device angibst auch einen perl ausdruck zu erlauben und nur zu starten wenn ein true zurück kommt.
gruss
andre
@stobor
define ZufallsTimerFlurlicht2 RandomTimer *05:30 Flurlicht Verreist 07:45 999 800/100
Ist das wirklich deine Absicht, dass das Flurlicht morgens ab 5:30 zufällig an/ausschaltet?
Wären in diesem Fall nicht 2 at besser?
ZitatWenn das Modul jetzt gerade von Dir bearbeitet wird, könnte man dann auch die maximal mögliche Einschaltzeit verlängern (von derzeit 999sec.)?
In der neuen Version geändert auf 9999.
Die neuen Möglichkeiten kannst Du dann sinnvoll nutzen, wenn du eines der neu hinzugefügten Attribute onCmd, offCmd setzt. Bisher ließen sich Geräte nur an/abschalten - war fest verdrahtet.
Sinnvoll könnte folgendes sein, um einen Dimmer zu schalten:
attr ZufallsTimerFlurlicht2 onCmd set @ dim50%
attr ZufallsTimerFlurlicht2 offCmd set @ off
Andre wollte ganze Gerätegruppen (scenes) schalten. Die benötigen ein anderes Komando als on/off. Möglich sind so auch structures - beliebige Geräte halt.
Gebaut habe ich das Gerät RandomTimer als Ersatz eines FS20ZE Funktimers, der Anwesenheit simuliert, indem er im Abstand von n sekunden an/aus etwas schaltet. Natürlich kann man auch Zeitschlaltuhren verwenden. Leider habe ich am Anfang es Urlaubs immer das Problem sie zu finden und die Bedienungsanleitungen!! zu suchen. Nie kann ich mich dann darauf verlassen, dass sie schalten. Mit dieser Lösung kann ich sie aus der Ferne steuern.
Ich habe viele FS20st, die jetzt alle gleichzeitig Anwesenheit simulieren können - und ich muss sie nicht neu programmieren.
@Andre:
Zitateine möglichkeit wäre natürlich an der stelle wo du das dummy device angibst auch einen perl ausdruck zu erlauben und nur zu starten wenn ein true zurück kommt.
Ein Perl Ausdruck wäre mir die sympatischte Lösung:
Wenn dummy dann dummy-ja/nein Logik
Wenn Perl Ausdruck, dann true/false Logik des Perl-Ausdrucks.
Dann könntest Du darin dann Logiken auf Basis von holiday verwenden.
klingt für mich gut.
Hallo Dietmar,
meine Installation funktioniert nicht mit dem Zufallstimer.
Meine RandomTimer Konfiguration:
define Verreist dummy
attr Verreist group Commands
attr Verreist room 99_System
attr Verreist webCmd ja:nein
define ZufallsTimerOG_WZ RandomTimer *{sunset_abs("HORIZON=3")} HM_Switch_1 Verreist 21:00 600 800/100
attr ZufallsTimerOG_WZ loglevel 3
attr ZufallsTimerOG_WZ room OG_WZ
define ZufallsTimerEG_WZ RandomTimer *{sunset_abs("HORIZON=3")} HM_Switch_2 Verreist 22:00 600 800/100
attr ZufallsTimerEG_WZ loglevel 3
attr ZufallsTimerEG_WZ room EG_WZ
Problem:
fhem stürzt nachvollziehbar ab und zwar beim Ausschalten des ersten Schalters gegen 21:00, Hier die betreffenden Logeintrage:
beim ersten Einschalt-Kommando wird folgendes geloggt:
2013.04.20 19:32:07 3: nextTimer 19:32:07 now: 19.32.07
2013.04.20 19:32:07 3: ZufallsTimerEG_WZtimeToExec------------>1366479132
2013.04.20 19:32:07 3: nextTimer 19:32:07 now: 19.32.07
2013.04.20 19:32:07 3: ZufallsTimerOG_WZtimeToExec------------>1366479132
2013.04.20 19:32:12 3: state--Verreist----------->ja
2013.04.20 19:32:12 3: off 800 446
2013.04.20 19:32:12 2: CUL_HM set HM_Switch_1 on rxt:1
2013.04.20 19:32:12 3: state--Verreist----------->ja
2013.04.20 19:32:12 3: off 800 341
2013.04.20 19:32:12 2: CUL_HM set HM_Switch_2 on rxt:1
Ein CUL-HM Kommando wird verwendet um einen Homematic Switch einzuschalten.
Die nächsten Logzeilen sehen aber dann so aus:
2013.04.20 19:42:08 3: state--Verreist----------->ja
2013.04.20 19:42:08 3: on 100 450
2013.04.20 19:42:08 3: FS20 set HM_Switch_1 on
2013.04.20 19:42:29 3: state--Verreist----------->ja
2013.04.20 19:42:29 3: on 100 675
2013.04.20 19:42:29 3: FS20 set HM_Switch_2 on
Hier wird auf einmal ein FS20 Kommando ausgeführt?
(ich habe aber keine FS20 Komponenten)
Letzter Logeintrag vor fhem-Absturz zeigt dann aber wieder ein CUL-HM Kommando:
2013.04.20 21:01:31 3: state--Verreist----------->ja
2013.04.20 21:01:31 3: ZufallsTimerOG_WZ/HM_Switch_1 going down ...
2013.04.20 21:01:31 2: CUL_HM set HM_Switch_1 off rxt:1
2013.04.20 21:01:31 3: nextTimer 19:32:07 now: 21.01.31
Danach ist fhem weg.
Irgendeine Idee, was hier falsch läuft?
Danke
Ulrich
Das dürfte daran liegen, dass ich nur fs20 habe und den Unterschied zu Hm nicht im Detail kenne.
Eigentlich wird dem Device immer nur ein
Set blablabla on/off gesendet.
Warum das bei Hm diese Problem verursacht, sehe ich mir morgen an.
kleine zusätzliche Anmerkung:
es sieht für mich so aus als wenn FHEM irgendwie bei dir "vergißt", dass die Geräte HM_Switch_1 bzw. HM_Switch_2 vom typ HM sind und fhem zwischendurch den "Handler" für fs20 das Kommando schicken läßt. Wenn dem so ist, müßtest du auch durch normales an- ausschalten irgendwie Probleme haben.
RT sendet immer nur Kommandos der Art
set HM_Switch_1 on
set HM_Switch_1 on
Der Typ des Geräts wird in RT nicht berücksichtigt.
Fhem selbst "weiß" (in Tabellen), von welchem Typ ein Gerät ist und dispached das Kommando an den richtigen Handler.
Bei mit ist es immer FS20. Bei dir sollte es immer HM sein.
vielleicht ist deine Gesamtinstallation irgendwie durcheinandergeraten.
Hast du das System neu aufgesetzt?
Hast du ein update durchgeführt und es ist irgendwie nicht korrekt durchgelaufen?
Hast du Fehlermeldungen, die dir sonst noch aufgefallen sind?
Starte fhem mal in einer telnet-Sitzung!
Lass dann einen RT mal unter "Beobachtung" von Anfang bis Ende laufen.
In der telnet-Sitzung bekommst du vielleicht eine Fehlermeldung, die auf die Ursache schliessen läßt: Laufzeitfehler aus perl landen nur in der Ausgabe der telnetsitzung.
hast du die Schalter so definiert?:
http://www.fhemwiki.de/wiki/HM-LC-SW1-FM_Schaltaktor_1-fach_UP (//www.fhemwiki.de/wiki/HM-LC-SW1-FM_Schaltaktor_1-fach_UP)
noch ein Nachtrag:
die Meldung:
2013.04.20 19:42:08 3: FS20 set HM_Switch_1 on
kannst du ignorieren. Bei "FS20 ..." handelt es sich um eine Textkonstante. Der Befehl wird nicht ausgeführt, nur der Text wird ins log geschrieben. Wenn du das log genau untersucht, erkennst du dass das Gerät schon on war - deshalb wurde nicht wirklich ein Schaltbefehl ausgeführt.
Ich glaube du hast eine ältere Version im Einsatz:
hast du diese geladen?
2013.04.2019:42:083:FS20setHM_Switch_1onvielleicht klappt es damit ja schon.
Das Protokoll müßte so aussehen. FS20 ... müßte in deinem Fall durch CUL_HM ... ersetzt sein:
2013.04.21 18:49:04 3: state--Vereist----------->ja
2013.04.21 18:48:33 3: on 100 143
2013.04.21 18:48:33 3: state--Vereist----------->ja
2013.04.21 18:48:04 3: on 100 656
2013.04.21 18:48:04 3: state--Vereist----------->ja
2013.04.21 18:47:35 3: FS20 set Zirkulation on
2013.04.21 18:47:35 3: command------------>set Zirkulation on
2013.04.21 18:47:35 3: off 800 35
2013.04.21 18:47:35 3: state--Vereist----------->ja
2013.04.21 18:47:06 3: off 800 836
2013.04.21 18:47:06 3: state--Vereist----------->ja
2013.04.21 18:46:36 3: off 800 864
2013.04.21 18:46:36 3: state--Vereist----------->ja
2013.04.21 18:46:06 3: FS20 set Zirkulation off
2013.04.21 18:46:06 3: command------------>set Zirkulation off
2013.04.21 18:46:06 3: on 100 100
2013.04.21 18:46:06 3: state--Vereist----------->ja
2013.04.21 18:45:37 3: on 100 890
2013.04.21 18:45:37 3: state--Vereist----------->ja
Hallo Dietmar,
danke erstmal für deinen Check.
hier meine Antworten:
1.) Konfiguration meiner Switches:
define HM_Switch_1 CUL_HM xxxxxx
attr HM_Switch_1 .devInfo 010100
attr HM_Switch_1 expert 2_full
attr HM_Switch_1 firmware 1.9
attr HM_Switch_1 model unknown
attr HM_Switch_1 peerIDs
attr HM_Switch_1 room Schalter
attr HM_Switch_1 serialNr xxxxxxxxxx
attr HM_Switch_1 subType switch
attr HM_Switch_1 webCmd toggle:on:off:statusRequest
define FileLog_HM_Switch_1 FileLog /var/fhem/log/Switch-%Y.log HM_Switch_1
attr FileLog_HM_Switch_1 logtype text
attr FileLog_HM_Switch_1 room Schalter
Switch_2 gleichlautend
FS20 kommt in meiner Konfiguration nicht vor! Ich verwende ausschliesslich HM Komponenten
2.) mit meinen beiden Switches habe ich sonst keine Probleme.
Togglen, Ein- und Ausschalten geht beliebig oft ohne irgendwelche Probleme oder fhem-Crash
3.) ältere Version
ich hab folgende Version:
$Id: 98_RandomTimer.pm 1116 2013-01-21 15:01:34Z Dietmar Ortmann $
Beim Versuch, deinen Link
http://forum.fhem.de/2013.04.2019:42:083:FS20setHM_Switch_1on (//forum.fhem.de/2013.04.2019:42:083:FS20setHM_Switch_1on)
zu benutzen, kommt ein 403-Forbidden
4.) Telnet Session
muss ich erst mal laufen lassen, melde mich wenns durch ist
Ulrich
@ Ulrich,
ist durch ein Versehen der falsche Link hineingeraten:
Link (http://forum.fhem.de/index.php?topic=11768.msg71364#msg71364)
wie gesagt "f20 ..." war in der alten Version des RT nur Text, den ich ausgegeben habe. Hat nichts mit dem zu tun was wirklich geschieht.
wo hast du den Text her:
$Id: 98_RandomTimer.pm 1116 2013-01-21 15:01:34Z Dietmar Ortmann $
die Letze Änderung stammt von Anfang April.
Probier mal die neue Version.
Lies mal die Beiträge nach dem Link - dann wirst du Neues entdecken.
Hallo Dietmar,
die Zeile
$Id: 98_RandomTimer.pm 1116 2013-01-21 15:01:34Z Dietmar Ortmann $
ist aus deiner 98_RandomTimer.pm....
Ich lad mir mal die letzte Version aus dem Link
Ulrich
Nachtrag:auch die Version aus dem Link hat den selben Eintrag wie oben....
Wie erkenn ich jetzt alte und neue Version??
Ich habe verglichen - du hast recht. Die Version aus dem Link hat diesen Eintrag und unterscheidet sich praktisch nicht von meiner.
Bei den Details des RT kann man Attribute setzen.
Gibt es bei Dir das Attribut onCmd?
(siehe Anhang / see attachement)
wenn ja - hast du wirklich eine sehr neue Version.
Du hast vermutlich diese Version:
Link (http://forum.fhem.de/index.php?topic=11768.msg69403#msg69403)
Das Protokoll passt dazu.
Die Änderungen sind allerdings nicht so gewaltig, dass ich glaube, dass der Fehler dadurch behoben werden könnte.
Meine Hoffnung ist der output der telnet-Sitzung.
Hallo Dietmar,
kurzes Feedback:
es läuft jetzt, allerdings für mich nicht ganz erklärbar:
die Version habe ich nicht getauscht, allerdings hast du anscheinend eine neuere, das Attribut "onCmd" gibt es bei meiner nicht.
Was habe ich sonst noch getan:
ich hab das "fhem.save"-File gelöscht
die Einrichtung des Zufallstimers geändert:
*{sunset_abs("HORIZON=3")} HM_Switch_2 Verreist 22:00 480
also die Default Setting für den Switchmode hab ich entfernt
und beobachte jetzt seit 3 Tagen - alles ok
servus
Ulrich
Hallo,
ich habe den RandomTimer mit verschiedenen Parametern getestet. Alles läuft gut.
Leider kommen bei uns die Einbrecher auch in den frühen Morgenstunden, so dass ich gerne einiges auch morgens um 5 Uhr bis 1 Stunde nach Sonnenaufgang damit schalten möchte.
Leider nimmt das Modul als Stopzeit nur absolute Zeiten. Wäre es nicht möglich, als Stopzeit auch eine Perlfunktion wie {sunrise()...} zu implementieren wie bei der Startzeit? Das wäre super!
Vielen Dank übrigens für die Entwicklung des Moduls. Das hat mir jetzt eine große Sorge beim Umstieg von FHZ-Studio auf fhem abgenommen.
Reimer
Ja, werde ich nach meinem Urlaub in Angriff nehmen.
Dann werde ich es einchecken, so dass es für alle im nächsten Release allgemein zur Verfügung steht.
Hallo zusammen.
Nach erfolgreicher Verwendung der Zufallsschaltung habe ich aktuell ein Problemchen mit FHEMobile und dem STATE-Parameter. "RandomTimer" erwartet im STATE-Parameter ("Verreist") ein "ja" oder "nein", über "attr Verreist fm_type offbutton,onbutton" wird der STATE-Parameter aber auf "on"/"off" gesetzt?!
define Verreist dummy
attr Verreist fm_type offbutton,onbutton
attr Verreist group AlarmStatus
attr Verreist room AlarmStatus
attr Verreist webCmd ja:nein
define ZufallsTimer_BZ RandomTimer *{sunset_abs("REAL")} bz_Licht Verreist 23:30 260 500/800
attr ZufallsTimer_BZ loglevel 3
attr ZufallsTimer_BZ room AlarmStatus
Gibt es eine einfache Möglichkeit, "on"/"off" in "ja"/"nein" zu "übersetzen" oder ist die Anpassung im Perl-Code von RandomTimer die einzige Möglichkeit?
Danke und Grüße.
schau mal hier: http://forum.fhem.de/index.php?t=msg&goto=87704&rid=430&srch=98_RandomTimer#msg_87704 (//forum.fhem.de/index.php?t=msg&goto=87704&rid=430&srch=98_RandomTimer#msg_87704)
in der neuesten version ist kannst du eine beliebige perl funktion zum disable verwenden.
gruss
andre
Na das passt ja ... druckfrisch ... hatte ich noch nicht gesehen.
Danke für den Hinweis!
Hallo,
ich hole diesen alten Thread mal wieder hoch, weil ich dachte, dass meine Frage dazu passen könnte und ich dafür nichts neues aufmachen wollte.
Ich verwende den Random Timer aktuell für zweierlei. Einmal für eine Anwesenheitssimulation wenn ich verreist bin und einmal für eine Anwesenheitssimulation wenn ich einfach nur nicht zu Hause bin. Der RandomTimer soll im "Verreist"-Fall abends bei Sonnenuntergang mit der Simulation beginnen. Hierfür verwende ich den Aufruf:
*{sunset_abs("REAL")} Flur_Decke 23:55:00 300
Das funktioniert soweit auch ganz gut.
Mein Problem ist beim zweiten Anwendungsfall.
Wenn ich abends noch mal weggehe, soll die Anwesenheitssimulation auch starten. Wenn ich als Startzeit allerdings auch hier den Sonnenuntergang wähle, dann startet die Simulation nicht, wenn ich erst weggehe, wenn die Sonne bereits untergegangen ist. Ich müsste hier also eine dynamische Startzeit einstellen, die anhand meiner Anwesenheitserkennung definiert wird.
Ich bin nun leider völlig überfragt, wie ich im RandomTimer eine Startzeit angeben kann, die ich aus dem State Reading nehmen könnte, wenn ein Dummy von "Anwesend" zu "Abwesend" springt.
Kann mir hier eventuell jemand einen Tip geben? Falls ich mich unklar ausgedrückt habe oder bestimmte Angaben vergessen habe, so bitte ich um Nachsicht und werde es so gut ich kann nachreichen.
Gruß
Wolle
Ich denke schon darüber nach, wie man diesen Fall auch abdecken kann. Melde mich wenn ich etwas habe
Ui, toll. Da bin ich sehr gespannt. Vielen Dank schon mal.
Hallo,
ich denke ich habe ein ähnliches Problem mit meiner Anwesenheitssimulation.
Wenn ich innerhalb er Aktivierungszeit (nach Sonnenuntergang und vor 23:30) den dummy "Verreis" von ja auf nein und wieder auf ja selle, wird der Alarm erst wieder am nächsten Tag aktiv. Mein Wunsch wäre aber, dass der Alarm noch am gleichen Tag aktiv wird.
Jetzt die Frage, habe ich irgendeinen Bug in meinem Code oder ist das Vehalten von RandomTimer so?
Für mich ist nicht klar wie RandomTimer wieder aktiv wird wenn er zuvor mit disableCond deaktiviert wurde. Könnt ihr mich darüber aufschlauen.
Hier mein Code dazu:
define Verreist dummy
attr Verreist devStateIcon nein:Wecker.Wochentags:ja ja:Wecker.Immer:nein
attr Verreist group Alarm
attr Verreist room Alarm,Gesamtansicht
attr Verreist setList State:nein,ja
attr Verreist webCmd :
define ZufallsTimerVerreist RandomTimer *{sunset("HORIZON=-3",0,"16:30","21:00")} Wohnzimmer_Vitrinen 23:30:00 180
attr ZufallsTimerVerreist verbose 5
attr ZufallsTimerVerreist room Alarm
attr ZufallsTimerVerreist disableCond (Value("Verreist") eq "nein")
attr ZufallsTimerVerreist switchmode 800/200
define act_Verreist_Aus notify Verreist:nein set Wohnzimmer_Vitrinen off
attr act_Verreist_Aus room Alarm
Vielen Dank für eure Unterstützung.
Mario
siehe:
http://forum.fhem.de/index.php/topic,14010.msg226371.html#msg226371 (http://forum.fhem.de/index.php/topic,14010.msg226371.html#msg226371)
Ich werden das Modul umschreiben, so dass es während der Laufzeit wieder aktiv wird, wenn die Bedingung darfür wieder eintreten.
Das wird allerdings ein wenig dauern. Ein erster Versuch war noch nicht erfolgreich.
Super, vielen Dank.
Wenn ich dir beim Testen unterstützen kann, dann bitte einfach melden
Gruß Mario
Könnte man dieses Modul auch dazu nutzen, um nur einen Schaltbefehl innerhalb eine begrenzten Zeit zu schalten?
Also zum Steuern der Rolläden?
Da brauch ich ja nur zwischen Sunrise und +30 Minuten den Befehl zum herunterfahren.
Hallo!
Ich habe (allerdings ohne das RandomTimer Modul) eine zufällige Start-Sequenz gebaut, die abhängig von sunset mit einem kleinen Zeitfenster Lampen - oder auch Rollläden schalten kann. Für den Rollladen müsstest du dann statt "on-for-timer" einfach "off" setzen, damit er zu der gewünschten Zeit heruntergefahren wird. Das Skript wählt zufällig einen offset (per "HORIZON") für den sunset Befehl und auch eine zufällige Start-und-Ziel-Zeit, damit man trotzdem ein bestimmtes Zeitfenster vorgeben kann, während dessen Lampe/Rollladen auf jeden Fall geschaltet werden sollen - hoffe das hilft dir?
http://www.computerhilfen.de/info/smart-home-programmieren-zufallszahlen-fhem.html#sunset
Zitat von: Toto1973 am 13 Februar 2015, 12:28:15
Könnte man dieses Modul auch dazu nutzen, um nur einen Schaltbefehl innerhalb eine begrenzten Zeit zu schalten?
Also zum Steuern der Rolläden?
Da brauch ich ja nur zwischen Sunrise und +30 Minuten den Befehl zum herunterfahren.
eher nicht dafür geeignet.
Zitat von: nicor2k am 24 April 2015, 12:38:50
Hallo!
Ich habe (allerdings ohne das RandomTimer Modul) eine zufällige Start-Sequenz gebaut, die abhängig von sunset mit einem kleinen Zeitfenster Lampen - oder auch Rollläden schalten kann. Für den Rollladen müsstest du dann statt "on-for-timer" einfach "off" setzen, damit er zu der gewünschten Zeit heruntergefahren wird. Das Skript wählt zufällig einen offset (per "HORIZON") für den sunset Befehl und auch eine zufällige Start-und-Ziel-Zeit, damit man trotzdem ein bestimmtes Zeitfenster vorgeben kann, während dessen Lampe/Rollladen auf jeden Fall geschaltet werden sollen - hoffe das hilft dir?
http://www.computerhilfen.de/info/smart-home-programmieren-zufallszahlen-fhem.html#sunset
Oder inzwischen ganz einfach ohne Scripte, Auszug aus der Commandref zu DOIF:
ZitatAnwendungsbeispiele:
Lampe wird nach Sonnenuntergang zwischen 900 und 1500 (900+600) Sekunden zufällig zeitverzögert eingeschaltet. Ausgeschaltet wird die Lampe nach 23:00 Uhr um bis zu 600 Sekunden zufällig verzögert:
define di_light DOIF ([({sunset()}+900+int(rand(600)))])
(set lamp on)
DOELSEIF ([([23:00]+int(rand(600)))])
(set lamp off)
Gruß
Damian
Hallo @ Dietmar63,
ich beschäftige mich seit kurzer Zeit mit Fhem. Hab im Forum nach einem "Zufallsgenerator" gesucht und bin über deinen RandomTimer "gestolpert".
Vielen Dank für dieses tolle Modul.
Mein Erstes, welches ich einbinde.
Gruß vom Niederrhein
Borderwalk
Hallo,
ich habe die Befehlszeile kopiert und angepasst und den Dummy erstellt, bekomme aber immer eine Fehlermeldung.
Kopierte Zeile:
define ZufallsTimerTisch RandomTimer *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
angepasst:
define ZufallsTimerDach RandomTimer *{sunset_abs("REAL")} SD_1 Verreist 23:00 800 800/100
Bekomme immer diese Fehlemeldung:
Wrong timespec Verreist: either HH:MM:SS or {perlcode}
Habe dann probiert:
define ZufallsTimerDach RandomTimer *20:00 SD_1 Verreist 23:00 800 800/100
gleicher Fehler...
Wäre super wenn jemand einen Tipp hätte (BTW das Modul habe ich schon reloaded) . Danke!!
Die Fehlermeldung besagt, dass du die Zeit im Format HH:MM:SS angeben sollst. Du hast die Zeit aber im Format HH:MM angegeben. Wenn du hinter deine 23:00 noch die Sekunden schreibst sollte es funktionieren.