RandomTimer - neues Modul

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

Vorheriges Thema - Nächstes Thema

Dietmar63

Ich saß vorhin im Zug.
Dein Test besagt, dass ein notify nicht disabled werden kann.

Mit DEF ist gemeint, dass du in der Raumübersicht auf den Namen eines Gerätes clicken kannst. Dann kommt eine Detailinformationen zum Gerät. Dort gibt es dann ein def.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

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

stromer-12

Zitat von: Dietmar63 am 11 Juni 2014, 12:22:01
kann man eine notify disablen?
set Lampe_TV_An enable

Ja, per Attribut.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Bracew

Hallo stromer-12

gibst Du mir ein Beispiel?

Ich möchte sinngemäß, die Lampe einschalten, wenn TV ein ist, ich nicht verreist bin und twilight_weather unter 65% rutscht. Dies hatte ich im Ansatz versucht mit:

define Lampe_TV_An notify SamsungTV7090        \
  IF    (([SamsungTV7090] eq "connected"       \
      or  [SamsungTV7090] eq "opened"))        \
     (set Lampe_TV on)                         \
   ELSE                                        \
     (set Lampe_TV off)

IF   ([isVerreist()] eq "ja")   \
     (set Lampe_TV_An disable)  \
ELSE                           \
     (set Lampe_TV_An enable)


Wie würde das mit dem Attribut im IF funktionieren?

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

stromer-12

Zitat von: Bracew am 12 Juni 2014, 06:45:57
Hallo Bracew,


IF   ([isVerreist()] eq "ja")   \
     (set Lampe_TV_An disable)  \
ELSE                           \
     (set Lampe_TV_An enable)


Wie würde das mit dem Attribut im IF funktionieren?

Sollte so gehen:


IF   ([isVerreist()] eq "ja")   \
     (attr Lampe_TV_An disable 1)  \
ELSE                           \
     (attr Lampe_TV_An disable 0)


FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Dietmar63

#125
so

define Lampe_TV_An notify SamsungTV7090        \
  IF    (([SamsungTV7090] eq "connected"       \
      or  [SamsungTV7090] eq "opened"))        \
     (set Lampe_TV on)                         \
   ELSE                                        \
     (set Lampe_TV off)

IF   ([isVerreist()] eq "ja")   \
     (set Lampe_TV_An disable)  \
ELSE                           \
     (set Lampe_TV_An enable)

wird das nicht funktionieren.

Du benötigst die Überwachung zweier Ereignisse. Die Ereignisse überwachst du mit notify.
Ich liefere jetzt nur Beipspielcode. Er ist nicht vollständig, aber du kannst ihn hoffentlich auf deine Verhältnisse anpassen.

Ich bin kein Freund von IF, deshalb liefere ich nur Perlcode. Wenn du IF verwenden willst, musst du Damian ansprechen. Er hat das IF-Gerät gebaut.

zwei notify:

define Lampe_TV_An1 notify SamsungTV7090 {lampeAnFunktion()}
define Lampe_TV_An2 notify AnwesenheitsStauts {lampeAnFunktion()}


99_myUtils.pm

sub lampeAnFunktion() {

  my $TVstatus = Value("SamsungTV7090"); # ReadingsVal(...) ist auch nutzbar.
  my $anwesenHeit = Value("ichselbst");

  if ( ($TVstatus eq  "connected" || $TVstatus eq  "opened") ) && anwesenheit eq "ja" && !isVerreist() ) {
    fhem("set LampeTV on")
  }
}


Der Code ist nur ein Beispiel, enthält möglicherweise noch Fehler, aber sollte gut darstellen wie du es machen kannst.
Wichtig ist, dass alle Ereignisse, die du berücksichtigen willst, die gleiche Perlfunktion rufen. Dann kannst du dort alles nocheinmal komplett abfragen, und schalten.

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

Dietmar63

Zitat
Ich wollte gerne am Abend die Lampe bei Unterschreitung von 65% twilight_weather einschalten und um 22:00 Uhr wieder ausschalten lassen, alles aber nur wenn ich Zuhause bin.

auch hier musst du mit einem notify arbeiten:

define TwilightMessage1       notify myTwilight.*:twilight_weather:.*      {lampeAnFunktion2()}

sub lampeAnFunktion2() {
  my $tww = ReadingsVal("myTwilight", "twilight_weather", "none");
  my $anwesenHeit = Value("ichselbst");

  if ($tww < 65 && $anwesenHeit = "ja" ) {
     fhem("set LampeTV on");
  }
}


Wenn du testest, dann bitte immer gleich die wichtigen Variablen loggen. Dann findet man die Fehler besonders schnell.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Bracew

Hallo stromer-12

auch Dir danke , hat aber leider nicht funktioniert.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Bracew

Hallo Dittmar63,

ich habe Deinen Vorschlag und die "Funktionsbeschreibung zu notify" aus FHEM Wiki als Grundlage für folgendes genommen:

define irgendwas notify (myTwilight.*:twilight_weather:.*|SamsungTV7090|Verreist) { \
my $r1 == $value{"ReadingsVal("myTwilight", "twilight_weather", "none")"};;         \
my $r2 == $value{"SamsungTV7090"};;                                                 \
my $r3 == $value{"Verreist"};;                                                      \
if ($r1 lt 80 && $r2 eq "opened" && $r3 eq "nein") {                               \
   fhem "set Lampe_TV on"                                                           \
} else {                                                                           \
   fhem "set Lampe_TV off"                                                          \
}                                                                                  \
}


funktioniert aber auch nicht. Und ich war schon so hoffnungsvoll.

Wie kann ich den kleinen Codeschnippsel debugen?
Oder hast Du mir eine weitere Hilfe zur Lösung?

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Dietmar63

#129
lies dir bitte folgenden Beitrag durch:
http://forum.fhem.de/index.php/topic,24361.msg174783.html#msg174783

wichtiger Satz:
ZitatAm Besten über einen externen Editor (aus Windows oder Linux) direkt bearbeiten und per reload in fhem nachladen

In einem exteren Editor wie notepad, pspad, padre oder ... bekommst Syntaxhighlighting. Dann sieht dein Code so aus wie im Anhang. Man sieht an den Farben schon wo etwas falsch sein könnte.

fhem.cfg

define irgendwas notify (myTwilight.*:twilight_weather:.*|SamsungTV7090|Verreist) {lampeAn()}


99_myUtils.pm
sub lampeAn() {

my $r1 = ReadingsVal("myTwilight", "twilight_weather", "none");         
my $r2 = Value("SamsungTV7090");                                                 
my $r3 = Value("Verreist");         

Log 3, "r1------------>$r1";
Log 3, "r2------------>$r2";
Log 3, "r3------------>$r3";

if ($r1 <= 80 && $r2 eq "opened" && $r3 eq "nein") {                               
   fhem ("set Lampe_TV on")                                                           
} else {                                                                           
   fhem ("set Lampe_TV off")                                                         
}                                                                                 
}


debuggen leider nur so:
Log 3, "r3------------>$r3";

nun noch etwas zu den von dir gemachten Fehlern:

$value ist eine Variable. Du musst aber die Funktion Value() aufrufen. Die Parameter einer Funktion werden in () angegeben. {} greifen in Perl auf hash zu. So etwas wie assoziative Arrays(falls dir das etwas sagt).

wenn du direkt in der 99_myUtils arbeitest, dann benötigst du am Ende keine ;;/ Man erstellt direkt Perlcode und kann direkt auf Dokumentation im Web zurückgreifen. Wenn ud in der fhem.cfg nach einem notify Code in geschweiften {} eingibst ist das nur syntaktisch ungeprüfter Text, der viele Fehler enthalten kann.

$r1 <= 80
Perl unterscheidet zwischen numerischem Vergleich: == <= >= und Stringvergleich: eq lt gt

Wenn man in fhem weit kommen will, muss man in Perl programmieren lernen. Das dauert ein wenig - lohnt aber sehr!!!
   
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

damit der Erfolg sich schnell einstellt kannst du den Code
sub lampeAn {...}
so wie er ist über die fhem-Oberfläche in die existierende 99_Utils vor ein sub kopieren und speichern.
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

Ich habe gerade FHEM aktualisiert. Jetzt ist mir aufgefallen, dass die Anzeige der RandomTimer geändert ist?! Vor dem Update wurde immer die Uhrzeit des nächsten Starts und nach Aktivierung der Zustand des Aktors angezeigt. Jetzt gibt es nur noch die Info, ob der RandomTimer aktiv ist oder nicht ...

Gibt es eine einfache Möglichkeit, auf die alte Anzeige des RandomTimer zu switchen - war in meinen Augen ganz praktisch?

Danke und Grüße.
FritzBox 7390 mit FHEM-Community Image, HMLan-Adapter
AVM: Dect200, 546E
HM: Funk-Zwischenstecker, Funk-Bewegungsmelder, Funk-Tür-/Fensterkontakte

Dietmar63

kennst du

attr   device               stateFormat {InternalVal("device","STARTTIME","notFound")}


eventuell noch mit substr nachbearbeiten, wenn du das Datum nicht haben möchtest.
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

#133
Danke für die schnelle Antwort!   :)

Mit stateFormat habe ich bislang noch nicht gearbeitet, aber gleich mal getestet. Eingesetzt beim RandomTimer (siehe unten) ändert sich nichts, in abgewandelter Form bei einer Lampe angetestet, funktioniert eine solche Lösung dagegen?!


define ZufallsTimer_SZ RandomTimer *22:45 sz_Tischleuchte 23:43 550
attr ZufallsTimer_SZ disableCond (!AnwSim())
attr ZufallsTimer_SZ stateFormat {InternalVal("ZufallsTimer_SZ","STARTTIME","notFound")}
attr ZufallsTimer_SZ switchmode 800/200


Trotz des stateFormat-Eintrags wird immer noch der Status angezeigt.   :(

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

Dietmar63

das muss ich mir etwas genauer ansehn
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm