Hallo zusammen,
ich möchte gerne verschiedene Warnungen über Telegram versenden. Ich habe schon versucht es mit DOIF oder ein Notify zu realisieren aber es will nicht so recht funktionieren.
Was habe ich vor:
Zum Bsp die Kesseltemperatur und Vorlauftemperatur der Heizung überwachen
Kesseltemperatur < 60°C ==> Telegram Message
Vorlauftemperatur > 70°C ==> Telegram Message
So klappt es jedenfalls nur bedingt:
Ist eine Bedingung erfüllt, kommen alle drei Nachrichten.
Kann mit jemand weiter helfen mit einer sauberen Lösung?
Viele Grüße
Kannst du mal ein List vom Device schicken?
Kleinigkeit vergessen...
so habe ich es versucht zu übersetzten...
([Brauchwasser:temperature] < [P_Warning_Brauchwasser])
(set teleBot message @R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature] )
([Hzg_Vorlauf:temperature] < [P_Warning_VorlaufTemp])
(set teleBot message @R_H Hzg_Vorlauf zu niedrig: [Hzg_Vorlauf:temperature] )
([Hzg_Vorlauf:temperature] > [P_Warning_VorlaufTemp])
(set teleBot message @R_H **Warnung**Hzg_Vorlauf zu hoch: [Hzg_Vorlauf:temperature] )
Woher kommt [P_Warning_Brauchwasser] und [P_Warning_VorlaufTemp]?
Das sind Variabeln, also Dummys
Also steht im state vom [P_Warning_Brauchwasser] die Variable?
Nen List von den Geräten wäre bei so einer Fragestellung immer sehr hilfreich.
Sorry... Ja im state steht die Variable.
Was meinst Du mit List vom Device? Guck mal das Bild im Anhang... ist es das?
Ein List vom jeweiligen Device bekommst du, wenn du in die FHEM Kommandozeile
list DEVICENAME
eingibst.
Also mach mal bitte
list P_Warning_Brauchwasser
und poste das Ergebnis mal hier in einem Code-Tag
Internals:
CFGFN
NAME P_Warning_Brauchwasser
NR 33023
STATE 60
TYPE dummy
READINGS:
2018-10-13 00:05:23 state 60
Attributes:
DbLogExclude .*
room Parameter
Hier mal ein Notify
Brauchwasser:temperature:.*|Hzg_Vorlauf:temperature:.* {
if (ReadingsNum("Brauchwasser", "temperature", 45) < ReadingsNum("P_Warning_Brauchwasser","state",60)) {
fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]");
}
if (ReadingsNum("Hzg_Vorlauf", "temperature", 45) < ReadingsNum("P_Warning_VorlaufTemp","state",60)) {
fhem("set teleBot message \@R_H Hzg_Vorlauf zu niedrig: [Hzg_Vorlauf:temperature]");
}
if (ReadingsNum("Hzg_Vorlauf", "temperature", 45) > ReadingsNum("P_Warning_VorlaufTemp","state",60)) {
fhem("set teleBot message \@R_H **Warnung**Hzg_Vorlauf zu hoch: [Hzg_Vorlauf:temperature]");
}
}
Der sendet jetzt allerdings jedes mal, sobald sich das temperature reading aktualisiert.
Dies kann man umgehen, indem man z.B. eine Hilfsvariable nimmt.
Alternativ könnte man auch mit einem Notify ein AT aktivieren, welches dir alle 30 Minuten eine
Meldung schickt, solange die Bedingungen erfüllt sind.
EDIT:
War nen Fehler drin!
Habe ich verstanden. Die Temperaturen ändern sich leider ständig wenn die Bedingung
(ReadingsNum("Brauchwasser", "temperature", 45) < ReadingsNum("P_Warning_Brauchwasser","state",60)
erfüllt ist.
Somit erhalte ich sehr viele Nachrichten. Ich möchte die Nachricht nur einmal senden. Die nächste Nachricht möchte ich erst wider senden wenn der Schwellwert unterschritten wird.
An ein at hatte ich auch schon gedacht. Nur bekomme ich die Warnung dann nicht Zeitnah sonder erst wenn das at auslöst...
Ist also noch nicht das was ich suche...
Eine Sache müsste ich noch wissen.
([Hzg_Vorlauf:temperature] < [P_Warning_VorlaufTemp])
(set teleBot message @R_H Hzg_Vorlauf zu niedrig: [Hzg_Vorlauf:temperature] )
([Hzg_Vorlauf:temperature] > [P_Warning_VorlaufTemp])
(set teleBot message @R_H **Warnung**Hzg_Vorlauf zu hoch: [Hzg_Vorlauf:temperature] )
Dieser Fall tritt ja immer auf, es sei denn, die Temperaturen sind exakt gleich.
Wie wird das gelöst? Sonst bekommst du ja für diese Nachrichten auch dauerhaft.
Ah, sorry, hab deinen editierten Text nicht gelesen.
Damit sollte es funktionieren.
Das message Reading ist eine Hilfsvariable.
Somit bekommst du die Nachricht nur ein mal, wenn die Temperatur überschritten wurde.
Sobald die Temperatur unterschritten wurde, wird das message reading zurückgesetzt und bei erneuter
Überschreitung bekommst du wieder eine Nachricht.
Brauchwasser:temperature:.*|Hzg_Vorlauf:temperature:.* {
if (ReadingsNum("Brauchwasser", "temperature", 45) < ReadingsNum("P_Warning_Brauchwasser","state",60) && ReadingsNum("P_Warning_Brauchwasser","message",0) == 0) {
fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]");
fhem("setreading P_Warning_Brauchwasser message 1");
}
if (ReadingsNum("Brauchwasser", "temperature", 45) > ReadingsNum("P_Warning_Brauchwasser","state",60) && ReadingsNum("P_Warning_Brauchwasser","message",0) == 1) {
fhem("setreading P_Warning_Brauchwasser message 0");
}
if (ReadingsNum("Hzg_Vorlauf", "temperature", 45) < ReadingsNum("P_Warning_VorlaufTemp","state",60) && ReadingsNum("P_Warning_VorlaufTemp","message",0) == 0 ) {
fhem("set teleBot message \@R_H Hzg_Vorlauf zu niedrig: [Hzg_Vorlauf:temperature]");
fhem("setreading P_Warning_VorlaufTemp message 1");
}
if (ReadingsNum("Hzg_Vorlauf", "temperature", 45) > ReadingsNum("P_Warning_VorlaufTemp","state",60) && ReadingsNum("P_Warning_VorlaufTemp","message",0) == 1 ) {
fhem("set teleBot message \@R_H **Warnung**Hzg_Vorlauf zu hoch: [Hzg_Vorlauf:temperature]");
fhem("setreading P_Warning_VorlaufTemp message 0");
}
}
Brauchwasser
Hzg_Vorlauf
Hzg_Vorlauf
Alle drei bekommen ein userattr warnLevel. Dieses zusätzliche Attribut wird dann in allen drei Devices gesetzt.
Danach wird in allen drei Devices ein userReading angelegt. Z.b. vorlaufTemp wo du dann high oder low rein schreiben lässt je nach deine Schwelle.
Und DAS triggerst Du dann mit einem Notify.
So geht es natürlich auch und da merke ich wieder, dass ich zu kompliziert gedacht habe und noch viel lernen muss, was fhem angeht ;)
Eine Frage habe ich da noch. Wofür das userattr warnLevel? Reicht da nicht das userReading?
Guten Morgen,
Das userattr ersetzt die Dummys, es sollte ja anscheinend flexibel Grenzwerte angegeben werden dürfen. Ist dem nicht so kann man das weg lassen und den Grenzwert direkt in der userReadings Bedingung mit einbauen.
Grüße
Manche Sensortypen (z.B. DS18B20) erlauben auch einen alarm auf hw-Ebene.
Oder du machst die ganze Auswertung z.b. im notify mit Perl. Dazu könntest du mal nach Bennis globalem Tür- und Fenster-offen code suchen.
Ob aber diese [size=78%]Art der Alarmierung.Sinn macht, ist.eine andere Frage. So was sieht man auch gut in Diagrammen.[/size]
ZitatBrauchwasser
Hzg_Vorlauf
Hzg_Vorlauf
Alle drei bekommen ein userattr warnLevel. Dieses zusätzliche Attribut wird dann in allen drei Devices gesetzt.
Danach wird in allen drei Devices ein userReading angelegt. Z.b. vorlaufTemp wo du dann high oder low rein schreiben lässt je nach deine Schwelle.
Und DAS triggerst Du dann mit einem Notify.
Guten Morgen. Ich versuche gerade die Lösung von CoolTux umzusetzen...
userattr warnLevel habe ich verstanden und wurde auf 52 gesetzt:
Internals:
DEF 28-0516707019ff
NAME Brauchwasser
NR 103
NTFY_ORDER 50-Brauchwasser
STATE T: 53.937
TYPE GPIO4
READINGS:
2017-03-29 19:16:05 H 0
2018-10-10 15:17:13 failures 0
2017-03-29 19:16:05 humidity 0
2018-10-13 10:11:44 state T: 53.937
2018-10-13 10:11:44 temperature 53.937
2018-10-13 10:08:26 temperatureMA 53.447
fhem:
interfaces temperature
helper:
history:
ARRAY(0x42ae128)
ARRAY(0x423fbe0)
ARRAY(0x444bf78)
ARRAY(0x423eb20)
ARRAY(0x42f3068)
ARRAY(0x41eacb0)
ARRAY(0x42f2f00)
ARRAY(0x43aa280)
ARRAY(0x41132f0)
ARRAY(0x44c8500)
ARRAY(0x43433c8)
ARRAY(0x466e2d8)
ARRAY(0x42e6510)
ARRAY(0x3f3af48)
ARRAY(0x424ece8)
ARRAY(0x464ef30)
ARRAY(0x44c6520)
ARRAY(0x45da740)
ARRAY(0x42c3450)
ARRAY(0x42c43e8)
ARRAY(0x423f150)
ARRAY(0x4450b88)
ARRAY(0x44d9d30)
ARRAY(0x4505f38)
ARRAY(0x44c5f50)
Attributes:
DbLogInclude temperatur,temperatureMA
event-min-interval 120
group 1-wire
model DS18B20
room Central Heating,GPIO-Devices
userReadings Brauchwasser
userattr warnLevel
warnLevel 52
Jetzt stehe ich bei dem userReading aber auf dem Schlauch.
ZitatZ.b. vorlaufTemp wo du dann high oder low rein schreiben lässt je nach deine Schwelle.
Und DAS triggerst Du dann mit einem Notify.
Sorry, ich habe mich mit userReadings noch nicht beschäftigt... wie gehts weiter?
Zitat von: rhoffm34 am 13 Oktober 2018, 10:14:59
Guten Morgen. Ich versuche gerade die Lösung von CoolTux umzusetzen...
Jetzt stehe ich bei dem userReading aber auf dem Schlauch.
Sorry, ich habe mich mit userReadings noch nicht beschäftigt... wie gehts weiter?
Dann wäre jetzt doch ein guter Zeitpunkt ;D
attr Brauchwasser userReadings brauchwasserTemp:temperature:.* { if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) ) { 'low' } elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0)) { 'high'} }
Das ist nur ein Beispiel. Wie Du siehst hast Du nur eine Schwelle und wenn die Temp gerne mal schwankt um die Schwelle hast Du ständig low und high. Hier musst Du nun schauen. Überlege was man machen kann. Kleiner Tip, zwei Schwellen wären gut ;)
Grüße
Oder je einen THRESHOLD einrichten; da ist gleich eine Hysterese vorgesehen.
Über threshold habe ich auch schon nachgedacht.
CoolTux, wenn ich Deine Lösung per Copy Paste kopiere kommt folgende Fehlermeldung:
Error evaluating Brauchwasser userReading WarningLowTemp: syntax error at (eval 616098) line 1, near ") <" syntax error at (eval 616098) line 1, near "}}"
gib mir bitte ein list vom device
Internals:
DEF 28-0516707019ff
NAME Brauchwasser
NR 103
NTFY_ORDER 50-Brauchwasser
STATE T: 51.375
TYPE GPIO4
READINGS:
2017-03-29 19:16:05 H 0
2018-10-13 11:03:20 WarningLowTemp Error evaluating Brauchwasser userReading WarningLowTemp: syntax error at (eval 616098) line 1, near ") <"
syntax error at (eval 616098) line 1, near "}}"
2018-10-10 15:17:13 failures 0
2017-03-29 19:16:05 humidity 0
2018-10-13 12:24:41 state T: 51.375
2018-10-13 12:24:41 temperature 51.375
2018-10-13 10:08:26 temperatureMA 53.447
fhem:
interfaces temperature
helper:
history:
ARRAY(0x42ae128)
ARRAY(0x423fbe0)
ARRAY(0x444bf78)
ARRAY(0x423eb20)
ARRAY(0x42f3068)
ARRAY(0x41eacb0)
ARRAY(0x42f2f00)
ARRAY(0x43aa280)
ARRAY(0x41132f0)
ARRAY(0x44c8500)
ARRAY(0x43433c8)
ARRAY(0x466e2d8)
ARRAY(0x42e6510)
ARRAY(0x3f3af48)
ARRAY(0x424ece8)
ARRAY(0x464ef30)
ARRAY(0x44c6520)
ARRAY(0x45da740)
ARRAY(0x42c3450)
ARRAY(0x42c43e8)
ARRAY(0x423f150)
ARRAY(0x4450b88)
ARRAY(0x44d9d30)
ARRAY(0x4505f38)
ARRAY(0x44c5f50)
Attributes:
DbLogInclude temperatur,temperatureMA
event-min-interval 120
group 1-wire
model DS18B20
room Central Heating,GPIO-Devices
userReadings attr Brauchwasser userReadings brauchwasserTemp:temperature:.*
{ if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) )
{ 'low' }
elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0))
{ 'high'} }
userattr warnLevel
warnLevel 52
userReadings attr Brauchwasser userReadings brauchwasserTemp:temperature:.*
{ if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) )
{ 'low' }
elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0))
{ 'high'} }
Bitte lese wenigstens kurz über userReadings
So kann das nichts werden. Gehe über FHEMWEB in die Detailansicht des Devices und drücke auf das Attribut userReadings, sollte ja schon da stehen. Etwas weiter oben unter attr steht nun der Text den Du editieren kannst. Dort schreibst Du nur rein
brauchwasserTemp:temperature:.* { if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) ) { 'low' } elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0)) { 'high'} }
im list des Devices muss es dann so aussehen
userReadings brauchwasserTemp:temperature:.* { if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) ) { 'low' } elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0)) { 'high'} }
Internals:
DEF 28-0516707019ff
NAME Brauchwasser
NR 103
NTFY_ORDER 50-Brauchwasser
STATE T: 51.062
TYPE GPIO4
READINGS:
2017-03-29 19:16:05 H 0
2018-10-13 11:03:20 WarningLowTemp Error evaluating Brauchwasser userReading WarningLowTemp: syntax error at (eval 616098) line 1, near ") <"
syntax error at (eval 616098) line 1, near "}}"
2018-10-13 12:41:25 brauchwasserTemp low
2018-10-10 15:17:13 failures 0
2017-03-29 19:16:05 humidity 0
2018-10-13 12:41:25 state T: 51.062
2018-10-13 12:41:25 temperature 51.062
2018-10-13 10:08:26 temperatureMA 53.447
fhem:
interfaces temperature
helper:
history:
ARRAY(0x42ae128)
ARRAY(0x423fbe0)
ARRAY(0x444bf78)
ARRAY(0x423eb20)
ARRAY(0x42f3068)
ARRAY(0x41eacb0)
ARRAY(0x42f2f00)
ARRAY(0x43aa280)
ARRAY(0x41132f0)
ARRAY(0x44c8500)
ARRAY(0x43433c8)
ARRAY(0x466e2d8)
ARRAY(0x42e6510)
ARRAY(0x3f3af48)
ARRAY(0x424ece8)
ARRAY(0x464ef30)
ARRAY(0x44c6520)
ARRAY(0x45da740)
ARRAY(0x42c3450)
ARRAY(0x42c43e8)
ARRAY(0x423f150)
ARRAY(0x4450b88)
ARRAY(0x44d9d30)
ARRAY(0x4505f38)
ARRAY(0x44c5f50)
Attributes:
DbLogInclude temperatur,temperatureMA
event-min-interval 120
group 1-wire
model DS18B20
room Central Heating,GPIO-Devices
userReadings brauchwasserTemp:temperature:.* { if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) ) { 'low' } elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0)) { 'high'} }
userattr warnLevel
warnLevel 52
Das hatte ich vorher auch so gemacht. Ich habe mir das im Editor nur anders zurecht gelegt... dann habe ich eine bessere Übersicht. Jetzt ist es so wie Du geschrieben hast, aber der Fehler ist immer noch da.
Was für ein Editor? Schreib bitte alles eins zu eins von Hand in das Attribut Fenster. Ich habe es bei mir im Testsystem eingefügt und mein Reading wird ohne Fehler geschrieben.
Internals:
CFGFN
NAME Brauchwasser
NR 202
STATE ???
TYPE dummy
READINGS:
2018-10-13 12:55:50 brauchwasserTemp low
2018-10-13 12:55:50 temperature 50
Attributes:
readingList temperature
room Test
setList temperature
userReadings brauchwasserTemp:temperature:.* { if( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0) ) { 'low' } elsif( ReadingsVal($name,'temperature',0) < AttrVal($name,'warnLevel',0)) { 'high'} }
userattr warnLevel
warnLevel 65
Ich glaube ich bin heute ein bisschen langsam...
Du meinst doch hier "A" (im Screenshot)
Und "B" ist der Editor den ich meine...
ja, ist doch super. geht doch. weiß gar nicht was du hast.
Schau mal gaaaanz genau hin wie dein userReading heist und was hinter diesem Reading in der Readingliste also da wo alle Readings und ihre Werte stehen drin steht als Wert. Dann erkennst Du Dein "Problem"
Das Reading heißt brauchwasserTemp und der Wert ist: Low ...
aber auch wenn ich gaaaaanz genau hinschaue, sehe ich nix
Genau da steht ein korrekter Wert drin. Aber wo hast Du Deinen Fehler gesehen. Also den den Du gemeldet hast?
Ich glaube ich habs...
Der Fehler den ich gesehen habe bezog sich auf ein anderes Reading.... ==> Richtig?
Richtig. Das war ein altes Reading.
Das kannst Du löschen
deletereading DEVICENAME READINGNAME
Und schon ne Idee wegen min und max Deiner Schwelle?
ja sicher .... jetzt läuft´s.
Hab jetzt warningHi und warningLow und die entsprechend in das userReading eingesetzt. Fluppt
Wie geht´s weiter? Kann ich im userReading direkt mit telegram eine Nachricht senden?
Nein das machen wir so nicht.
Jetzt passt Du Dein notify an.
Brauchwasser:warnLevel:.(high|low) { fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]") if( $EVTPART1 eq 'low' );
}
Erstmal zum spielen und vestehen. Muss kurz weg. Melde mich später noch mal.
Alles klar....
Ich hab mal rumprobiert und es klappt.
Brauchwasser:brauchwasserTemp:.(high|low) { fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]") if( $EVTPART1 eq 'low' );}
Allerdings wenn ich unter oder über dem Grenzwert liege, bekomme ich bei jeder Temp änderung eine Nachricht...
Schau Dir die Attribute event-on* an.
Probiere ich gerade aus... event-on-change-reading im device Brauchwasser.
Kann ich weitere Abfragen im notify starten? etwa so...:
Brauchwasser:TempWarning:.(high|low) { fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]") if( $EVTPART1 eq 'low' );}
VorlaufTemp:TempWarning:.(high|low) { fhem("set teleBot message \@R_H BrauchwasserTemp zu niedrig: [Brauchwasser:temperature]") if( $EVTPART1 eq 'low' );}
Jein. Du kannst mehr regex verwenden aber nicht so. Und du musst das dann das Device also Variable NAME bei der Bedingung mit einbauen.
Ich schreibe dir das gerne nachher kurz.
(Brauchwasser|VorlaufTemp):TempWarning:.(high|low) { fhem("set teleBot message \@R_H $NAME zu niedrig: [$NAME:temperature]") if( $EVTPART1 eq 'low' );}
Versuch mal so. Habe mich da an Dein letztes Beispiel gehalten. Schau bitte ob es so in Deine Umgebung passt und wenn nicht pass es an.
Als Alternative, läuft bei mir seit mehreren Jahren völlig problemlos per notify aus dem Wiki:NewMailtime nach Zeitablauf erneut senden (https://wiki.fhem.de/wiki/E-Mail_per_notify_nach_Zeitablauf_erneut_senden). Dies nutze ich für Meldungen per PushNachricht, die ich nicht permanent habe möchte, also
- Überschreitung der Kühlschranktemperatur benöitige ich nur alle 8 Stunden
- Überschreitung der Gefrierschranktemperatur nur alle 3 Stunden
- Temperatur größer 32 Grad C auf dem Balkon nur alle 12 Stunden
- ob etwas im Briefkasten eingeworfen wurden nur stündlich
- etc
Dazu die notifys gem. der Beschreibung aus dem Wiki erstellen mit $main::NewMailtime<_Referenz> = time + <gewünschte Wiederholung>
Beispiel:
Temp_Gefrierschrank:temperature:.* {
if ((ReadingsVal("Temp_Gefrierschrank","temperature",0) >= -13.0) && (time > $main::NewMailtime_Gefrierschrank))
{
fhem ("set PushNachricht_iPhone message 'Temperatur-Alarm Gefrierschrank' 'ACHTUNG - die Gefrierschranktemperatur ist auf $EVTPART1 Grad gestiegen!");
fhem ("set PushBullet_Honor message 'Temperatur-Alarm Gefrierschrank' 'ACHTUNG - die Gefrierschranktemperatur ist auf $EVTPART1 Grad gestiegen!");
$main::NewMailtime_Gefrierschrank = time + 10800;
}
}
und mehrere subs in der 99_myUtils.pm, etwa
sub
myUtils_Initialize_Kuehlschrank($$)
{
my ($hash) = @_;
my $NewMailtime_Kuehlschrank = time;
}
sub
myUtils_Initialize_Gefrierschrank($$)
{
my ($hash) = @_;
my $NewMailtime_Gefrierschrank = time;
}sub
myUtils_Initialize_TempAussen($$)
{
my ($hash) = @_;
my $NewMailtime_TempAussen = time;
}
Ist zwar oldschool, aber vielleicht hilft es dir.
edit: Link korrigiert :)