Hallo Forum,
ich möchte die KS300 Tempraturen und Windstärken bei bestimmten Werte als Warnung per HM-OU-CFM-PL ansagen lassen, also z. B.:
"Achtung Frostgefahr" oder "Auchtung Windgweschwindigkeit über 50km/h"
Dazu habe ich folgendes notify erstellt:
define Frost notify KS300 {if ( ReadingsVal("KS300","temperature","keinWert") lt 0 ) { fhem("set mp3_play playTone 019,045")} }
Ich bekomme als angesagt, dass die Temperatur unter 0 ist. Aber leider alle 10 Minuten, nämlich immer dann wenn die KS300-Meldung eintrifft.
Wir kann ich es ereeichen, dass ich nur 1x diese Meldung bekomme oder nur 1x alle 2 Stunden und zwischen 23:00Uhr und 6:00Uhr gar nicht.
Gruß
Markus
Am einfachsten notify in at umwandeln, das in bestimmten Zeitspannen abfragt.
define Frost at +*00:02:00 {if ( ReadingsVal("KS300","temperature","keinWert") lt 0 ) { fhem("set mp3_play playTone 019,045")} }
und vielleicht noch isday() einfügen, sonst plappert das ganze auch nachts ;o):
define Frost at +*00:02:00 {\
if ((ReadingsVal("KS300","temperature","keinWert") lt 0) && (isday())) {\
fhem("set mp3_play playTone 019,045")}}
das ist nicht unbedingt optimal weil dann die warnung nicht sofort kommt wenn der wert unter- oder überschritten wird sondern unter umständen erst zwei stunden später.
dir saubere lösung ist dir zu merken wann du die letzte warnung erzeugt hast und die neue nur dann zu erzeugen wenn der zeitraum verstrichen ist. das merken kannst du z.b. in einem dummy machen oder in einem reading deines devices. das hier ist ein beispiel das mir eine warnung versendet wenn die luftfeuchtigkeit um keller unter- oder überschritten wird.
define WarnHumidUSZ dummy
attr WarnHumidUSZ room Keller
define WarnHumidOSZ dummy
attr WarnHumidOSZ room Keller
define LastHumidWarnSZ dummy
attr LastHumidWarnSZ room Keller
define n_humi_akcp_init notify global:INITIALIZED { \
use DateTime;; \
our $LastHumidWarnSZ = DateTime->new( year => 2013, month => 1, day => 1 );; \
fhem("set LastHumidWarnSZ $LastHumidWarnSZ");; \
fhem("set WarnHumidUSZ 31");; \
fhem("set WarnHumidOSZ 64");; \
}
define n_humi_akcp notify akcp:.*humidity.* { \
use DateTime;; \
use DateTime::Duration;; \
my $currTime = DateTime->now();; \
my $interval = DateTime::Duration->new( days => 1, hours => 2, minutes => 0 );; \
if( outof_interval($main::LastHumidWarnSZ,$currTime,$interval) ){\
if( ReadingsVal("akcp","humidity",99) < Value("WarnHumidUSZ") || ReadingsVal("akcp","humidity",99) > Value("WarnHumidOSZ") ){ \
prowl_andre("Keller", ReadingsVal("akcp","humidity",99)."%%", 0);; \
fhem("set LastHumidWarnSZ $currTime");; \
$main::LastHumidWarnSZ = $currTime;; \
} \
} \
}
dazu gehört noch das hier in 99_myUtils.pmsub outof_interval {
my ( $dt1, $dt2, $interval ) = @_;
# Make sure $dt1 is less than $dt2
( $dt1, $dt2 ) = ( $dt2, $dt1 ) if $dt1 > $dt2;
# If the older date is more recent than the newer date once we
# subtract the interval then the dates are closer than the
# interval
if ( $dt2 - $interval < $dt1 ) {
return 0;
}
else {
return 1;
}
}
das war meine erste zusammengeklaute benachrichtigung. inzwischen würde ich das alles ein wenig anders machen.
gruss
andre
Finde ich für diesen Zweck sind das allerdings ein wenig viel Codezeilen....
MfG, MisterEltako.
Vielleicht geht das auch so:
define Frost notify KS300:temperature.* {if ( ReadingsVal("KS300","temperature","keinWert") lt 0 ) { fhem("set mp3_play playTone 019,045")} }
und beim KS300:
attr KS300 event-on-update-reading temperature
zwei stunden spaeter zu erfahren das es gestürmt hat geht natürlich viel kürzer :). ist aber nicht das was gewünscht war und auch dafür war der vorschlag nicht zuverlässig geeignet.
ansonsten ist ein drittel für den zweiten grenzwert. kann also ersatzlos gestrichen werden.
gruss
andre
Erst einmal vielen Dank für die Vorschläge.
Natürlich möchte ich eine kurzen übersichtlichen Code und es soll auch sofort eine Meldung geben, denn ich will ja auf eine Gefahr auch sofort gewarnt werden.
Ich werde mir mal den Code von justme1968 genauer anschauen und mal sehen in wie weit ich den kürzen kann.
Es sollen ja noch weitere Werte wie "israining" und "wind" abgefragt werden.
@MisterEltako:
Deinen letzten Vorschlag mit event-on-update teste ich gerade.
Gruß
Markus
dann vielleicht so? ;o)
attr KS300 event-on-update-reading temperature,israining,wind
MfG, MisterEltako
Schade, aber KS300 kennt kein "event-on-update-reading".
Gruß
Markus
event-on-update-reading geht nicht weil es sozusagen das gegenteil macht. es unterdrückt events für alle readings die nicht in der liste sind.
event-on-change-reading geht nicht weil es trozdem events erzeug wenn wenn der wert schwankt
event-min-interval geht nicht weil es events unterdrückt egal ob grenzwerte über- oder unterschritten werden.
wenn du sofort eine nachricht haben willst wenn das event eintritt ist notify auf jeden fall richtig. und du musst dir auf irgend eine art merken wann die letzte nachricht raus ist. entweder direkt wie in meinem beispiel oben oder indirekt z.b. in dem du deinem device ein user reading alarm verpasst und dafür das event-on-change-reading setzt:
attr <device> userReadings alarm {ReadingsVal($name,"temperature",1) <0 ? "ja", "nein"}
attr <device> event-on-change-reading alarm
jetzt kannst du an alarm ein notify hängen das nur aufgerufen wird wenn sich der wert ändert:define alarmieren notify alarm:ja {...}
hier kannst du dann auch dein isDay() einbauen.
das geht natürlich nur wenn das device die event-* attribute kennt.
gruss
andre
Wenn das funktioniert, motze ich auch nicht mehr über die Länge der Codezeilen ;o)
MfG, MisterEltako.
klar funktioniert das. bis auf den tipfehler im letzten notify :). da muss natürlich <device>:alarm stehen.
gruss
andre
Tja, wie schon erwähnt, event-on* wird bei der KS300 nicht unterstützt, userReadings jedoch schon.
Ist eine Implementierung der attribute event-on* geplant bzw. möglich, Frage an die Cracks?
Gruß
Markus
define Frost notify KS300 {\
my $alarm;;
if ( ReadingsVal("KS300","temperature","keinWert") lt 0 ) {\
$alarm=on;;\
} else {\
$alarm=off;;
}
if ($alarm eq "on") {\
fhem("set mp3_play playTone 019,045");;
}\
}
alternativ noch mit Uhrzeiten:
define Frost notify KS300 {\
my $alarm;;
my $now=sprintf("%%02d:%%02d",$hour,$min);;\
if ( ReadingsVal("KS300","temperature","keinWert") lt 0 ) {\
$alarm=on;;\
} else {\
$alarm=off;;
}
if (($alarm eq "on") && (($now gt 19:00) || ($now lt 06:00))) {\
fhem("set mp3_play playTone 019,045");;
}\
}
zusammengeklaut aus anderen threads, sieht aber sinnvoll aus ...
lg
stephan
Hallo Stephan,
ich erhalte diese Fehlermeldung:
2013.05.22 22:34:59.070 3: Frost return value: syntax error at (eval 45838) line 1, near "23:"
syntax error at (eval 45838) line 1, near "}}"
Bareword "on" not allowed while "strict subs" in use at (eval 45838) line 1.
Bareword "off" not allowed while "strict subs" in use at (eval 45838) line 1.
Was klemmt da?
Gruß
Markus
Habe es selbst rausgefunden:
Bei $alarm=on muss das on in Hochkomma stehen, richtig ist also $alarm="on", also muss es auch bei $alarm="off" heißen.
Aber letztendlich wird der MP3 File bei jeder KS300 Meldung, bei der die Temeratur < 0 ist, abgespielt.
Ich habe zum Test geprüft ob die Temperatur > 8 ist, also:
if ( ReadingsVal("KS300","temperature","keinWert") gt 8 )
Mit Stephans Lösung erhalte ich auch alle 3 Minuten eine Meldung:
Log der KS300:
2013-05-23_08:09:26 KS300 T: 8.0 H: 79 W: 1.1 R: 114.0 IR: no
2013-05-23_08:11:58 KS300 T: 8.0 H: 78 W: 2.2 R: 114.0 IR: no
2013-05-23_08:14:31 KS300 T: 8.3 H: 77 W: 1.3 R: 114.0 IR: no
2013-05-23_08:17:03 KS300 T: 8.3 H: 75 W: 2.7 R: 114.0 IR: no
2013-05-23_08:19:36 KS300 T: 8.4 H: 76 W: 2.2 R: 114.0 IR: no
2013-05-23_08:24:41 KS300 T: 8.5 H: 75 W: 3.6 R: 114.0 IR: no
2013-05-23_08:27:13 KS300 T: 8.4 H: 75 W: 5.0 R: 114.0 IR: no
2013-05-23_08:39:56 KS300 T: 8.9 H: 74 W: 0.8 R: 114.0 IR: no
2013-05-23_08:45:01 KS300 T: 8.8 H: 74 W: 2.5 R: 114.0 IR: no
Zitat von: Markus Hermann schrieb am Mi, 22 Mai 2013 10:22... diese Meldung bekomme ... nur 1x alle 2 Stunden ...
Du könntest ja mal diese Routinen anschauen, da steckt der von Dir gewünschte Zeitvergleich größer als mit drin:
http://forum.fhem.de/index.php?t=msg&goto=76947&rid=0&srch=dev2chk#msg_76947
Hier noch ein Vorschlag von mir, der m.E. genau das machen müsste, was du ursprünglich wolltest:
define Frost notify KS300:temperature {
my $KS300Temp = ReadingsVal("KS300","temperature","keinWert");;\
my $Emailnötig = (ReadingsVal("KS300", "Tempalarm", 0);;\
if (($KS300Temp < 0) && ($Emailnötig = 0)) {\
fhem ("attr KS300 userReadings Tempalarm 1");;\
fhem("set mp3_play playTone 019,045");;\
Log 3, "Temperaturalarm gemailt!!!! ($KS300Temp, "
}elsif (($KS300Temp > 0) && ($Emailnötig = 1)){
fhem ("attr KS300 userReadings Tempalarm 0");;\
Log 3, ,,kein Tempalarm ausgelöst: Temp: $KS300Temp, $Emailnötig";;\
}
}
MfG, MisterEltako
Ich habe gerade nochmal drüber nachgedacht:
eigentlich ist das ja DIE Situation für einen Watchdog:
WENN die Temperatur ansteigt( oder abfällt) und länger so bleibt, löse einmal! alarm aus:
define tempalarm watchdog {ReadingsVal("KS300","temperature","keinWert") gt 8 } 00:10 { ReadingsVal("KS300","temperature","keinWert") lt 8 } { fhem("set mp3_play playTone 019,045");;fhem("trigger tempalarm .")}
und wenn du auch eine Mail auf der anderen Flanke haben willst, das ganze andersherum:
define tempalarm_hoch watchdog {ReadingsVal("KS300","temperature","keinWert") gt 8 } 00:10 { ReadingsVal("KS300","temperature","keinWert") lt 8 } { fhem("set mp3_play playTone 019,045");;fhem("trigger tempalarm_runter.")}
define tempalarm_runter watchdog {ReadingsVal("KS300","temperature","keinWert") lt 8 } 00:10 { ReadingsVal("KS300","temperature","keinWert") gt 8 } { fhem("set mp3_play playTone 019,045");;fhem("trigger tempalarm_hoch .")}
habe natürlich jetzt nicht getestet, ob das mit dem ReadingsVal so vernünftige Werte liefert...
Aber die Konstellation läuft so für meine Anwesenheitserkennung, und die Befehle werden immer nur beim Statuswechsel gesendet ( FHT, FS20, Mail brauch ich nicht ;)
Der Nachteil daran ist, dass du nur einmal ( extrem: am Winteranfang) eine Mail erhältst, wenn es kalt wird, und erst wieder 4 Monate später eine, dass es warm wird...
Ausser, du setzt mit
define scharfmachen at 19:00 set tempalarm_hoch,tempalarm_runter defined
define unscharfmachen at 06:00 set tempalarm_hoch,tempalarm_runter triggered<- ist das korrekt??
Damit solltest du jeden Tag um 19:10 eine Mail bekommen, wenn es zu kalt/zu warm ist ...
lg
stephan
Nachtrag: ACHTUNG! habe gerade festgestellt, dass der Watchdog sich nicht mit Perl auslösen lässt! Alleine der von ihm ausgeführte Befehl kann in Perl sein > soweit zumindest meine aktuelle Erkenntnis!!!
Hallo Ralph,
Deine Routine kann ich eher für meine ganzen HM-SEC-SC gebrauchen um zu prüfen ob diese "closed" sind bevor die Alarmanlage scharf geschaltet wird.
@MisterEltako:
Deinen letzte Vorschlag habe ich versucht. Ich musste erstmal den Syntax anpassen und habe jetzt folgenden Code:
define Frost notify KS300 {my $KS300Temp = ReadingsVal("KS300","temperature","keinWert");;my $Emailnoetig = ReadingsVal("KS300","Tempalarm", 0);;\
if (($KS300Temp < 12) && ($Emailnoetig = 0)) {\
fhem("attr KS300 userReadings Tempalarm 1");;\
fhem("set mp3_play playTone 019,045");;\
Log 3, "Temperaturalarm gemailt!!!! $KS300Temp, "\
}\
elsif (($KS300Temp > 12) && ($Emailnoetig = 1)){\
fhem("attr KS300 userReadings Tempalarm 0");;\
Log 3,"kein Tempalarm ausgelöst: Temp: $KS300Temp, $Emailnoetig";;\
}\
}
Wenn die Temeratur > 12 ist (Zur Zeit haben wir hier 11 Grad) dann bekomme ich im Log "kein Tempalarm ausgelöst Temp: 11.1" angezeigt
Wenn die Temperaur aber < 12 ist, passiert gar nichts.
Gruß
Markus
Hi!
Hatte dir eigentlich heute Mittag eine funktionierende Lösung gepostet. Da hat wohl etwas nicht funktioniert, wenn du noch Interesse daran hast poste ich sie in ca 1h nochmals.
Sorry! Das o.g. hat bei mir auch nicht den Test bestanden, aber die überarbeitete Version schon. So ein Mist.
MfG, MisterEltako.
Klar habe ich Interesse.
Immer her damit :-)
Lass Dir aber Zeit.
Hi!
Ich hatte tatsächlich den Code in einen anderen Thread gepostet. Wie peinlich! ;o)Lag also an mir.
So nun also mein Vorschlag:
define Frost notify KS300 {\
my $KS300Temp = ReadingsVal("KS300","temperature","keinWert");;\
my $MP3noetig = ReadingsVal("KS300", "Tempalarm", 0);;\
if (($KS300Temp < 0) && ($MP3noetig == 0)) {\
fhem("set mp3_play playTone 019,045");;\
Log 3, "Temperaturalarm wurde gemailt....Temp: $KS300Temp, $MP3noetig";;\
readingsBeginUpdate($main::defs{KS300});;\
readingsBulkUpdate($main::defs{KS300}, 'Tempalarm', 1);;\
readingsEndUpdate($main::defs{KS300}, 1);;\
}elsif (($KS300Temp > 0) && ($MP3noetig == 1)){\
Log 3, "kein Tempalarm aufgehoben, da Temperatur: $KS300Temp, $MP3noetig";;\
readingsBeginUpdate($main::defs{KS300});;\
readingsBulkUpdate($main::defs{KS300}, 'Tempalarm', 0);;\
readingsEndUpdate($main::defs{KS300}, 1);;\
} \
}
Sinnvoll ist eine Abwandlung, um ihn bei entsprechender Funktionalität zum universellen Einsatz in die 99_Utils.pm auszulagern und per Funktion aus FHEM.cfg aufzurufen mit verschiedenen Parametern.
MfG, MisterEltako
Hallo MisterEltako,
das scheint die Lösung zu sein.
Bisher habe ich erst 1x ein Abspielen des MP3-Files gehört. (Zum Test habe ich $KS300Temp < 12 eingestellt)
Mal sehen was passiert wenn die Temperatur > 12 wird und heute abend wieder abfällt.
Der Code sieht aber sehr gut danach aus, dass es klappen sollte.
Viele Dank dafür.
Auch an alle Anderen für ihre Tipps.
Gruß
Markus
und so richtig viel kuerzer als meine version :) die sogar noch zwei grenzen, konfigurierbare schwellwerte und intervalle hat.
gruss
andre
Zitat von: justme1968 schrieb am Sa, 25 Mai 2013 09:58und so richtig viel kuerzer als meine version :) die sogar noch zwei grenzen, konfigurierbare schwellwerte und intervalle hat.
gruss
andre
Wenn es um die Kürze geht:
hier noch mal ein Vorschlag:
define TH_Frost THRESHOLD KS300:temperature:0:0 mp3_play||set @ playTone 019,045
Spielt Ansage jedesmal einmalig ab, wenn die Temperatur vom KS300 unter Null fällt.
Gruß
Damian
@justme1968
Beleidigt? Ich sehe ja ein, dass es keinen Zweizeiler für das Problem gibt.
Ich habe versucht hier nicht noch einen zusätzlichen Dummy reinzubringen, sondern der Alarmstatus bleibt bei den Gerätereadings, wo er hingehört. Bei vielen Devices weis man ja sonst gar nicht wohin mit den Dummys. Deswegen ist dieser Code etwas aufgeblähter. Zudem komt er ohne zusätzlichen 99_Utils-Teil aus bzw. wenn man ihn auslagert, lässt er sich über einen kurzen Funktionsaufruf mit 2-3 Parametern realisieren.
MfG,MisterEltako
PS: Hast du schon die Zeilenanzahl verglichen...??? *zwinker*
@Damian:
Bei
define TH_Frost THRESHOLD KS300:temperature:0:0 mp3_play||set @ playTone 019,045
erhalte ich nach dem Speichern der fhem.cfg die Fehlermeldung:
TH_Frost: Unknown actor device mp3_play specified
Gruß
Markus
beleidigt? nö. warum denn? ihr habt ja beim selber machrn was gelernt und du hast es doch eingesehen :)
nicht verglichen. aber wenn ich meine aufgeräumte version vergleiche ist sie nicht länger. sogar wenn dich die ganze diskussion und die unterschiedlichen versionen nicht mit zaehle *zwinker*. und das mit attributen statt dummys hatte ich glaube ich auch erwähnt.
gruss
andre
Zitat von: Markus Hermann schrieb am Sa, 25 Mai 2013 14:19@Damian:
Bei
define TH_Frost THRESHOLD KS300:temperature:0:0 mp3_play||set @ playTone 019,045
erhalte ich nach dem Speichern der fhem.cfg die Fehlermeldung:
TH_Frost: Unknown actor device mp3_play specified
Gruß
Markus
Das bedeutet, dass zum Zeitpunkt der Definition der Aktor
mp3_play nicht existiert.
Wie heißt denn dein mp3-player in FHEM?
Man kann es auch ohne Prüfung definieren:
define TH_Frost THRESHOLD KS300:temperature:0:0 ||set mp3_play playTone 019,045
Gruß
Damian
THRESHOLD ist gut. das kannte ich jetzt noch nicht :).
der einzige nachteil ist das die nachricht wirklich und in jedem fall nur ein mal verschickt wird. d.h wenn die frost warnung z.b. nachts unterdrückt wird kommt unter umständen erst nächsten herbst wieder eine. threshold mit intervall wäre schön
gruss
andre
Zitat von: justme1968 schrieb am Sa, 25 Mai 2013 17:10THRESHOLD ist gut. das kannte ich jetzt noch nicht :).
der einzige nachteil ist das die nachricht wirklich und in jedem fall nur ein mal verschickt wird. d.h wenn die frost warnung z.b. nachts unterdrückt wird kommt unter umständen erst nächsten herbst wieder eine. threshold mit intervall wäre schön
gruss
andre
Das lässt sich elegant in Kombination mit Heating_Control realisieren:
define HC_Frost Heating_Control TH_Frost 06:00|active 23:00|deactivated set @ %
ab 23:00 Uhr ist Ruhe im Karton und eine mögliche nächtliche Warnung kommt sofort um 6:00 Uhr und nicht erst nächsten Winter;)
Gruß
Damian
und hier noch ein Beispiel für eine Wiederholung
define HC_Frost Heating_Control TH_Frost 06:00|active 10:00|active 14:00|active 20:00|active 23:00|deactivated set @ %
damit wird der Alarm auch dann wiederholt, falls der Frost anhält (Temperatur bleibt unter Null).
Gruß
Damian
Da wäre aber wieder das Problem aus einem der ersten Beiträge zu diesem Thread, dass man erst viel später erfährt, das es kalt war, oder nicht?
MfG, MistetEltako
Zitat von: MisterEltako schrieb am Sa, 25 Mai 2013 18:01Da wäre aber wieder das Problem aus einem der ersten Beiträge zu diesem Thread, dass man erst viel später erfährt, das es kalt war, oder nicht?
MfG, MistetEltako
Noch mal zum Verständins:
die letzte Definition bedeutet:
in der Zeit zwischen 6:00 - 23 Uhr erfährt man
sofort ein Unterschreiten der vorgegebenen Temperatur,
zusätzlich wird ein Alarm ausgelöst an den definierten Zeiten, falls die vorgegebene Temperatur
immer noch unterschritten ist.
Gruß
Damian
auch das ist klasse. funktioniert aber nur mit temperaturen oder? regenmenge oder windgeschwindigkeit geht dann leider nicht.
gruss
andre
Zitat von: justme1968 schrieb am Sa, 25 Mai 2013 18:14auch das ist klasse. funktioniert aber nur mit temperaturen oder? regenmenge oder windgeschwindigkeit geht dann leider nicht.
gruss
andre
geht alles, was nach einer Zahl aussieht;)
Gruß
Damian
hallo damian,
ich versuche gerade ein threshold device zu verwenden um mir eine warnung zu senden wenn der brenner im heizkessel mal wieder einen aussetzer hat und die temperatur unter 29 grad fällt.define watchBrenner THRESHOLD t2:temperature:0:29 ||{prowl_andre("Heizung", "Fehler", 0)}||OK:Fehler
t2 ist einer der 1-wire temperaturfühler am kessel.
im prinzip funktioniert das und ich bekomme zuverlässig eine warnung sobald es passiert. leider bekomme ich die warnung dann aber alle 90 sekunden. das ist das intervall mit dem der 1-wire sensor abgefragt wird. auch wechselt der STATE nie zu Fehler sonder ist auch wenn die warnnugen versendet werden immer OK.
was mache ih falsch ?
gruss
andre
Hallo Andre,
wahrscheinlich hat deine Routine keinen Returncode = 0.
Das hatten wir schon mal hier:
Link (http://forum.fhem.de/index.php?topic=10580.msg82456#msg82456)
Das Problem wird beim nächsten Release behoben.
Bau einfach am Ende deiner Routine:
return "";
ein.
Gruß
Damian
arg... genau sowas hatte ich mir schon gedacht aber nur mit undef probiert...
danke
andre