Frage zu Random Timer

Begonnen von Michi240281, 04 Januar 2014, 20:37:41

Vorheriges Thema - Nächstes Thema

Michi240281

Hallo,

habe mir mit folgendem Code einen Random Timer generiert:

#Wohnzimmerbeleuchtung zufällig ein/aus bei Abwesenheit (aktivieren über dummy Schalter "Verreist")
define Verreist dummy
attr Verreist webCmd ja:nein
define ZufallsTimerWohnzimmer RandomTimer *18:00:00 Alle 20:30:00 180
attr ZufallsTimerWohnzimmer disableCond (!isVerreist())


2 Sachen sind dabei auffällig:

1. Erst hat der RT garnicht reagiert und plötzlich ging er dann (Verreist=ja). Jetzt habe ich den Dummy-Schalter auf "nein" gesetzt aber der RT macht munter weiter! Hat jmd ne Idee wieso das so ist?

2. Ich wollte die Einstellung für die "Wahrscheinlichkeiten" von 800/200 auf 500/500 umstellen und habe das einfach in die define-Zeile hinten drangehängt, jedoch macht der RT weiterhin 800/200! Warum ist das so?

Danke und viele Grüße
Michi240281
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

Zitat1. Erst hat der RT garnicht reagiert und plötzlich ging er dann (Verreist=ja). Jetzt habe ich den Dummy-Schalter auf "nein" gesetzt aber der RT macht munter weiter! Hat jmd ne Idee wieso das so ist?

wie sieht isVerreist() aus ?

Zitat2. Ich wollte die Einstellung für die "Wahrscheinlichkeiten" von 800/200 auf 500/500 umstellen und habe das einfach in die define-Zeile hinten drangehängt, jedoch macht der RT weiterhin 800/200! Warum ist das so?

500/500 muss als attribut definiert werden. Siehe FHEM Reference. Vielleicht mal verbose 5 einschalten - dann kommen debug Informationen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

#2
"Verreist" zeigt den Wert "nein", oder meinst du was anderes?

Wie müsste der Code dann dafür aussehen? Ich habe in anderen Beiträgen gelesen, dass man einfach das 800/200 in der Define Zeile hinten dranhängt. Ist das nicht mehr so?

Das hier hast du sogar geschrieben:

define ZufallsTimerTisch      RandomTimer  *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

nur so:
define ZufallsTimerTisch      RandomTimer  *{sunset_abs())} StehlampeTisch +03:30:00 480

Die musst doch irgendwie/-wo die Funktion isVerreist() hinterlegt haben.
so vielleicht:

sub isVerreist       () { return(YesNo("Verreist"));}
#
#
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "nein");
  return (   ($state eq "nein") ? 0:1    );
}


ZitatWie müsste der Code dann dafür aussehen? Ich habe in anderen Beiträgen gelesen, dass man einfach das 800/200 in der Define Zeile hinten dranhängt. Ist das nicht mehr so?

Das hier hast du sogar geschrieben:

define ZufallsTimerTisch      RandomTimer  *{sunset_abs("REAL")} LampeTisch Verreist 22:00 480 800/100
das ist alt - sieh dir die reference an. Dort gibt s die Variante nicht mehr.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

Zitat von: Dietmar63 am 05 Januar 2014, 01:37:29
nur so:
define ZufallsTimerTisch      RandomTimer  *{sunset_abs())} StehlampeTisch +03:30:00 480

Die musst doch irgendwie/-wo die Funktion isVerreist() hinterlegt haben.
so vielleicht:

sub isVerreist       () { return(YesNo("Verreist"));}
#
#
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "nein");
  return (   ($state eq "nein") ? 0:1    );
}

das ist alt - sieh dir die reference an. Dort gibt s die Variante nicht mehr.

Ach das meinst du!

Ich habe garnichts gemacht. Sind diese Sachen nicht in den Modulen hinterlegt? Ich habe die aktuellste Version von FHEM drauf. Steht das nicht in dem 99_Utils.pm? Oder im 98_Random Timer?
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

Kann es ja nicht weil es deine eigene Erweiterung / Anpassung ist.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

Also ich habe jetzt folgendes getan:

Folgenden Code habe ich in die fhem.cfg geschrieben:


#Wohnzimmerbeleuchtung zufällig ein/aus bei Abwesenheit (aktivieren über dummy Schalter "Verreist")
define Verreist dummy
attr Verreist webCmd ja:nein
define ZufallsTimerWohnzimmer RandomTimer *11:00:00 Alle 20:30:00 180
attr ZufallsTimerWohnzimmer disableCond (!isVerreist())


In die 99_Utils-pm Datei habe ich dann folgendes eingefügt:

sub isVerreist       () { return(YesNo("Verreist"));}
#
#
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "nein");
  return (   ($state eq "nein") ? 0:1    );
}


Soweit funktioniert das ganze auch, allerdings gibt es folgendes Problem:

Die Änderung der Schalterstellung "Verreist" (ja oder nein) bekommt FHEM nur mit, wenn ich die fhem.cfg speichere. Kann mir bitte jmd sagen, wo das Problem liegen könnte?

Zur Verdeutlichung: ZufallsTimerWohnzimmer zeigt im FHEMWEB "11:00", also die nächste Startzeit an. Schalte ich nun über den Dummyschalter "Verreist" auf "ja", steht der ZufallstimerWohnzimmer weiterhin auf "11:00". Erst wenn ich nun auf Edit files gehe und die fhem.cfg (ohne sie zu ändern) abspeicher, geht der ZufallsTimerWohnzimmer auf die leuchtende Lampe und die entsprechenden Geräte gehen an. Genauso beim Schalten auf "nein", dann bleibt der Timer weiterhin aktiv, erst wenn ich die fhem.cfg speicher (wie gesagt, ich ändere in dem Moment nix), geht der Timer wieder zurück auf "11:00" und die Geräte schalten sich ab.

Jmd ne Idee und wäre so freundlich mir zu helfen?

Vielen Dank!!
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

ZitatDie Änderung der Schalterstellung "Verreist" (ja oder nein) bekommt FHEM nur mit, wenn ich die fhem.cfg speichere. Kann mir bitte jmd sagen, wo das Problem liegen könnte?

Das ist im Moment so beabsichtigt, bzw. ich habe mir bisher darüber noch keine genauen Gedanken gemacht. Ein RT startet nicht automatisch wenn man das dummy ändert. Es gibt keine Verbindung zwischen dummy und RT - müßte man durch ein notify nachrüsten, man kann im Moment aber noch keinen RT explizit wecken, wäre aber machbar. Wenn du die fhem.cfg  speichst, werden die RT gelöscht und neu angelegt, dann merken sie, dass sie laufen müßten und beginnen zu arbeiten.

ZitatZur Verdeutlichung: ZufallsTimerWohnzimmer zeigt im FHEMWEB "11:00", also die nächste Startzeit an. Schalte ich nun über den Dummyschalter "Verreist" auf "ja", steht der ZufallstimerWohnzimmer weiterhin auf "11:00". Erst wenn ich nun auf Edit files gehe und die fhem.cfg (ohne sie zu ändern) abspeicher, geht der ZufallsTimerWohnzimmer auf die leuchtende Lampe und die entsprechenden Geräte gehen an.

wie oben

ZitatGenauso beim Schalten auf "nein", dann bleibt der Timer weiterhin aktiv, erst wenn ich die fhem.cfg speicher (wie gesagt, ich ändere in dem Moment nix), geht der Timer wieder zurück auf "11:00" und die Geräte schalten sich ab.

Er bleibt aktiv, das ist richtig. Wenn du lange genug wartest, erkennt der RT beim nächsten Schaltvorgang, dass das dummy auf nein steht und der RT wird geschlossen.

Ich empfehle dir verbose 5 für deine RT! Hast du verbose schon einmal eingeschaltet und dir die debuging Informationen angesehen?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

Zitat von: Dietmar63 am 05 Januar 2014, 19:28:41
Das ist im Moment so beabsichtigt, bzw. ich habe mir bisher darüber noch keine genauen Gedanken gemacht. Ein RT startet nicht automatisch wenn man das dummy ändert. Es gibt keine Verbindung zwischen dummy und RT - müßte man durch ein notify nachrüsten, man kann im Moment aber noch keinen RT explizit wecken, wäre aber machbar. Wenn du die fhem.cfg  speichst, werden die RT gelöscht und neu angelegt, dann merken sie, dass sie laufen müßten und beginnen zu arbeiten.

wie oben

Er bleibt aktiv, das ist richtig. Wenn du lange genug wartest, erkennt der RT beim nächsten Schaltvorgang, dass das dummy auf nein steht und der RT wird geschlossen.

Ich empfehle dir verbose 5 für deine RT! Hast du verbose schon einmal eingeschaltet und dir die debuging Informationen angesehen?

ACHSOOOOOO! Dann habe ich das wohl falsch verstanden! Ich dachte der Dummy-Schalter und der RT sind miteinander verknüpft! Ich hätte nämlich das "Verreist" in "Abwesend" umbenannt und dann könnte ich jederzeit, auch von unterwegs per App den Schalter auf ja setzen und der RT würde dann beginnen eine Anwesenheit zu simulieren!

Wie müsste man das denn mit notify erweitern? Bin wie gesagt noch ganz am Anfang.  :'(

Hatte ich zwischendurch mal auf 5 stehen, ja, aber zum einen hat der mir in kurzer Zeit das logfile zugemüllt und zum anderen versteh ich da ja eh nur Bahnhof!

Da fällt mir noch was anderes ein: muss/sollte bzw. wie kann man denn das logfile "leeren", FHEM läuft bei mir jetzt knapp 2 Wochen und ich muss jetzt schon ewig runterscrollen, um die aktuellsten logfile Einträge anzuschauen!
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

ZitatACHSOOOOOO! Dann habe ich das wohl falsch verstanden! Ich dachte der Dummy-Schalter und der RT sind miteinander verknüpft! Ich hätte nämlich das "Verreist" in "Abwesend" umbenannt und dann könnte ich jederzeit, auch von unterwegs per App den Schalter auf ja setzen und der RT würde dann beginnen eine Anwesenheit zu simulieren!
Das funktioniert schon. Du mußt nur vor dem Einschaltzeitpunkt des RT das dummy eingestellt haben.

ZitatWie müsste man das denn mit notify erweitern? Bin wie gesagt noch ganz am Anfang. 
Ich müßte zunächst etwas am Modul RT ändern.

ZitatHatte ich zwischendurch mal auf 5 stehen, ja, aber zum einen hat der mir in kurzer Zeit das logfile zugemüllt und zum anderen versteh ich da ja eh nur Bahnhof!
Das log läuft nur dann voll wenn du timeToSwitch kurz wählst. Ein guter Wert ist 500. Zum Test ist natürlich ein kleinerer Wert besser.

ZitatDa fällt mir noch was anderes ein: muss/sollte bzw. wie kann man denn das logfile "leeren", FHEM läuft bei mir jetzt knapp 2 Wochen und ich muss jetzt schon ewig runterscrollen, um die aktuellsten logfile Einträge anzuschauen!
Würde ich machen - bei mir passiert das jeden Abend automatisch.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

Zitat von: Dietmar63 am 05 Januar 2014, 20:54:51
Das funktioniert schon. Du mußt nur vor dem Einschaltzeitpunkt des RT das dummy eingestellt haben.
Ich müßte zunächst etwas am Modul RT ändern.
Das log läuft nur dann voll wenn du timeToSwitch kurz wählst. Ein guter Wert ist 500. Zum Test ist natürlich ein kleinerer Wert besser.
Würde ich machen - bei mir passiert das jeden Abend automatisch.

Ahso, alles klar, hab's jetzt gecheckt! ;)

Zum Startzeitpunkt des RT wird auf die Schalterstellung geguckt und entsprechend wird der RT dann aktiviert oder eben nicht! Korrekt?

Würdest du mir verraten, wie man

a.) das logfile manuell leert und
b.) das von dir erwähnte automatische Leeren 1x tägl. programmiert?

Besten Dank!
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

ZitatZum Startzeitpunkt des RT wird auf die Schalterstellung geguckt und entsprechend wird der RT dann aktiviert oder eben nicht! Korrekt?
ja

Würdest du mir verraten, wie man

Zitata.) das logfile manuell leert und
ich habe einen Zugang per laptop und kann die Datei fhem**********.log, wie auch immer sie bei dir heißt, einlesen, Zeilen löschen und wieder speichern. Viele hier im Forum haben die Definition so eingerichtet, dass jeden Monat ein neues Logfile angelegt wird. Ich mache das nicht so. Ich habe das file einfach fhem.log genannt. Alles was älter als zwei Wochen ist, ist nicht mehr interessant. Wenn du einen Zugang einrichten willst, kommt es ganz darauf an, ob die mit linux oder window darauf zugreifen willst - google hilft dir je nach Vorliebe weiter. Die fhem.cfg editiere ich auf dem gleichen Wege. Das hat für mich den Vorteil, dass die Definitionen nicht zufällig im fhem.cfg file gespeichert werden.

fhem.cfg:
attr   global logfile         ./log/fhem.log

b.) das von dir erwähnte automatische Leeren 1x tägl. programmiert?
in 99_Utils:

#
sub stripLogs() {

    opendir (DIR, "./log") or die "Can't open dir: './log'.\nReason: $!";
    my @ls = readdir(DIR);
    closedir (DIR);

    my $files = "strip";

    FILE: foreach my $File (@ls) {
#      Abbruch wenn Pseudodirectorys enthalten sind
       next FILE if $File eq '.' || $File eq '..';

       if ($File =~ /.log/) {
          $files = $files . " " . $File;
          stripFile( "./log/" . $File);
       }
    }
    Log 2, "$files";
}
#
#
#
sub stripFile($)
{
    my ($datei) = @_;

    my $res = `tail -n1000 $datei >/tmp/tmp.log`;
    $res = `cat /tmp/tmp.log >$datei`;

}


in fhem.cfg:

define StripLogs               at  *03:15:00 { stripLogs();;        "" }

Achtung, es werden alle Log-Files im log-Verzeichnis auf 1000 Zeilen eingekürzt. Wenn du in Perl fit bist, kannst du die obigen Funktionen deinen Bedürfnissen anpassen. Perl solltest du dir allerdings aneignen - dann mach fhem bald sehr viel Spass.

Ach übrigens, es ist besser ein weiteres 99_myUtils anzulegen, und die eigenen Funktionen dort abzulegen. 99_Utils geht zwar auch, hat aber den Nachteil, dass das file bei einem update ggf. überschrieben wird.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Michi240281

@ Dietmar: Vielen Dank für deine Hilfe! Ich werd mir mal überlegen, wie ich das mit den logs machen soll! Scheinbar ist das bei mir so voreingestellt, dass die logs monatlich angelegt werden! Werd mal schauen, ob mir das so gefällt oder ob ich eher deine Lösung verwende!

Habe noch eine andere Frage:

Habe jetzt die "isVereist" Funktion (Modul?) (umbenannt in "Abwesend") in eine 99_myUtils.pm Datei gepackt und diese gespeichert. Bei "Edit files" taucht diese nun auf. Heute hat der RT dann aber garnicht funktioniert. Muss ich noch an irgendeiner Stelle auf die 99_myUtils.pm verweisen oder macht FHEM das automatisch? Kann mir nicht erklären, warum der RT heute nicht geschaltet hat. Mein Code für den RT sieht jetzt so aus:

fhem.cfg:

#Wohnzimmerbeleuchtung zufällig ein/aus bei Abwesenheit (aktivieren über dummy Schalter "Abwesend")
define Abwesend dummy
attr Abwesend webCmd ja:nein
define ZufallsTimerWohnzimmer RandomTimer *{sunset("REAL",0,"15:00","18:10")}  Vase 18:30:00 500
attr ZufallsTimerWohnzimmer disableCond (!isAbwesend())
#attr ZufallsTimerWohnzimmer switchmode 500/500


Und in der 99_myUtils.pm:

#####Abwesenheit#####

sub isAbwesend       () { return(YesNo("Abwesend"));}
#
#
#
sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "nein");
  return (   ($state eq "nein") ? 0:1    );
}

=end html
=cut


Ist da irgendwo was falsch?
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905

Dietmar63

das kann man dem Code oft nicht ansehen.
versuch es mal mit logging:


sub YesNo ($) {

  my ($dummy) = @_;
  my $state = ReadingsVal($dummy, "state", "nein");
  Log 3, "dummy------------>$dummy";
  Log 3, "state------------>$state";
  return (   ($state eq "nein") ? 0:1    );
}


Zu Testzwecken pflege ich dann immer in der Oberfläche Test-RT ein, die sofort starten und kurze Schaltzyklen haben:
define timer      RandomTimer  +00:00:03 Zirkulation 23:00:00  30

Anstelle von 23:00:00 kann man sogar definieren, dass der RT sofort startet und 15 Minuten laufen soll:
define timer      RandomTimer  +00:00:03 Zirkulation {strftime("%H:%M:%S",localtime(time()+15*60))}  30
mit delete timer wirst du ihn schnell wieder los.

Ich habe den Code von fhem.pl so geändert, dass ich zu jedem Gerät eine Delete-button habe:

Aenderungen an FHEM
----------;
--------------;del-Icon basteln
sub
FW_showRoom()
...
...
...
#      FW_pO "</td>";
       $icon = FW_makeImage('del') . "&nbsp;";
       FW_pO "<td><a href='/fhem?cmd=delete%20$devName'><div class='Del'>$icon</div></a></td>";
    }
    FW_pO "</table>";
    FW_pO "</td></tr>";
  }
  FW_pO "</table><br>";



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

Michi240281

Vielen Dank!

Ok, werde ich mal probieren!

Kannst du noch was zu meiner Frage sagen?:

Muss die 99_myUtils.pm noch irgendwie eingebunden werden oder sucht sich FHEM das entsprechend alles zusammen? Also der findet die Module, die in der 99_myUtils.pm stehen, auch, ohne dass man darauf irgendwie/-wo verweisen muss?

Danke!!!
FHEM 5.6 auf RPi2 / HM LAN Adapter / diverse HM-Devices
FHEM-Remote-App
QNAP 419P / Onkyo TX-SR 608
DM500HD / GM Spark One
Sony 52HX905