Nachdem ich mindesten den halben Sonntag mit Grundlagenrecherchen zu den beiden o.g. Stichworten verbracht habe, gebe ich hierzu mein Selbststudium auf und bitte um Hilfe.
Aufgabenstellung ist die, dass ich den Fehlerstatus meiner Viessmannheizung auslesen möchte und mir (und nicht meinem Heizungsbauer) fehlerabhängig ein Debianmail zusenden möchte.
Ich glaube, dass mein Problem in der Syntax liegt, da ich gundsätzlich ein Mail versenden kann.
Nachdem ich verschiedentlich herumprobiert habe, hänge ich bei folgendem Code (in diesem Besipiel habe ich testweise die WW-Speichertemperaturen ausgewertet):
define Testmail32 at +*00:30:00 {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >>= 50 and <<= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 50 und 58 Grad')}}
Im "Endausbau" werde ich aber sicher notify verwenden.
Die Fehlermeldung im Logfile lautet:
2019.03.18 11:52:41.886 3: eval: {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >>= 50 and <<= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 50 und 58 Grad')}}
2019.03.18 11:52:41.886 1: ERROR evaluating {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >>= 50 and <<= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 50 und 58 Grad')}}: Can't find string terminator "" anywhere before EOF at (eval 75939) line 1.
2019.03.18 11:52:41.887 3: Testmail32: Can't find string terminator "" anywhere before EOF at (eval 75939) line 1.
Ich finde einfach den Syntaxfehler nicht, obwohl ich in einem anderen Beispiel
define Testmail24 at +*00:30:00 { if (ReadingsNum("Gasheizung","WW-Isttemperatur",0) >= 55) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher:','>55')}}
ein Mail erhalte.
Wo ist der Unterschied oder habe ich einen Gedankenfehler?
Wenn ich z.B.
define Testmail33 at +*00:30:00 {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 and <= 58 ) {DebianMail('vormane@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}
schreibe bekomme ich den Fehler
2019.03.18 12:37:34.393 1: ERROR evaluating {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 and <= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}: Unterminated <> operator at (eval 76795) line 1.
2019.03.18 12:37:34.394 3: Testmail33: Unterminated <> operator at (eval 76795) line 1.
Ist es richtig, dass ich für mein Ausgangsziel, den Fehlercode meiner Heizung auszuwerten das Beispiel mit den Temperaturen verwenden kann?
Was mir auf die schnelle auffällt:
Du nutzt für vergleichsoperatoren mal <<= , mal <=. Es sollte letzteres sein.
Eine Verknüpfung im perlteil machst du mit 'and'. In perl lautet die 'und Verknüpfung' '&&'.
Noch einiges mehr aber Kurz da mobil.
Gruss Byte09
Gesendet von meinem SM-G900F mit Tapatalk
Ok, klare Fehler, ich sehe scheinbar den Wald vor lauter Bäümen nicht. Habe es nun mit
define Testmail35 at +*00:05:00 {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && <= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}
probiert.
Irgendetwas stimmt mit der Abfrage, also den >- und <-Zeichen doch noch nicht (Unterminated <> operator)!?
Die komplette Fehlermeldung:
ERROR evaluating {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && <= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}: Unterminated <> operator at (eval 77849) line 1.
Zitat von: uron am 18 März 2019, 13:32:53
Ok, klare Fehler, ich sehe scheinbar den Wald vor lauter Bäümen nicht. Habe es nun mit
define Testmail35 at +*00:05:00 {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && <= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}
probiert.
Irgendetwas stimmt mit der Abfrage, also den >- und <-Zeichen doch noch nicht (Unterminated <> operator)!?
Die komplette Fehlermeldung:
ERROR evaluating {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && <= 58 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 45 und 58 Grad')}}: Unterminated <> operator at (eval 77849) line 1.
ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && <= 58 )
Das ist Unsinn.
ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && ReadingsVal("Gasheizung","WW-Isttemperatur",0) <= 58 )
Bzw.:
my $WWist = ReadingsVal("Gasheizung","WW-Isttemperatur",0);;
[...]
if ($WWist >= 45 && $WWist <= 58 )
Wow CoolTux, das war es!
ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 45 && ReadingsVal("Gasheizung","WW-Isttemperatur",0) <= 58 )
Hätte doch besser gestern schon nachgefragt - mit Lesen kam ich nicht weiter. Danke.
Bin gespannt, ob das grundsätzlich auch mit der Auswertung des Fehlercodes der Heizung geht.
Gut jetzt weißt Du was Du bei Deiner Bedingungsabfrage falsch gemacht hast. Jetzt nimmst Du Dein at und schmeißt es so weit weg wie Du nur kannst.
FHEM arbeitet Event basiert. Es ist in diesem Fall vorsichtig gesagt Unnötig alle 30min eine Abfrage zu machen. Statt dessen reagiert man auf die Events des Devices und wertet diese dann aus.
Lege Dir also ein Notify an welches auf das Reading WW-Isttemperatur vom Device Gasheizung triggert und im Notify machst Du dann die Auswertung, oder besser noch Du startest darin eine sub welche Du in einer 99_myUtils unter bringst.
Danke CoolTux für die Tipps.
Ich hatte ja eingangs bereits erwähnt, dass ich ein notify einbauen will, nur zu Testzwecken erfolgte die Abfrage mit 'at', da ich ja eine Aktion hervorrufen wollte und nicht auf Events warten will.
Wie gesagt, eigentlich will ich Fehlercodes der Heizung auslesen und per Mail melden, ich wollte mich nur an dieser Syntax mit readingsval und Debianmail probieren und verstehen lernen. Beides war mir bisher nicht geläufig. Ich bin wirklich ein bemühter Laie und versuche, spontane Ideen umzusetzen.
Den Hinweis mit der 'sub' in einer 99_myUtils nehme ich gerne in meinen Themenspeicher auf, aber ehrlich, eh ich das auf die Reihe bekomme, brauche ich wahrscheinlich noch ein paar Lehrstunden. Da fehlen mir gänzlich die Zusammenhänge - sicher wirst du lachen, aber nur wenn man weiß wie es geht, ist alles einfach.
Danke trotzdem, ich schaue jetzt mal nach dem notify.
Hat ja keiner was von heute und morgen gesagt. Aber so hast Du schon mal davon gehört.
Im übrigen bist Du herzlich eingeladen wenn Du magst
https://forum.fhem.de/index.php/topic,98701.0.html
Das mit dem Webinar ist ja super. Leider bin ich am 2.4. im Ausland, habe mir den Kalender aber abonniert, sicher gibt es derartige Seminare öfter einmal. Das Video vom letzten Mal werde ich mir ansehen.
Wir haben da auch noch Ende jeden Monats einen Monatsrückblick. Gibt es da auch als Video.
Da kann man dann auch mal bei kleinen Fragen um Hilfe bitten.
So, jetzt muss ich nochmals nachaken, da ich das Ganze nun in einem einfachen Beispiel mit notify zusammengebaut habe:
define notify_WW_Temperatur notify Gasheizung {if (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 57 && ReadingsVal("Gasheizung","WW-Isttemperatur",0) <= 62 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher:','Die WW-Speichertemperatur liegt zwischen 57 und 62 Grad')} elsif (ReadingsVal("Gasheizung","WW-Isttemperatur",0) >= 47 && ReadingsVal("Gasheizung","WW-Isttemperatur",0) <= 52 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher :','Die WW-Speichertemperatur liegt zwischen 47 und 52 Grad')}}
Wenn ich 'notify' richtig verstehe, müsste ich bei jeder Temperaturänderung (auch um jedes Zehntel) ein Mail bekommen, was mich über den aktuelle Temperaturbereich informiert.
Ich weiß, das ist nicht praxisnah, aber bei dieser Konstellation habe ich möglichst viele Änderungen, auf die notify ja reagieren müsste.
Dies kann ich später dann auf die Fehlercodes übertragen.
Im Moment kommt aber noch nichts! >:(
Sollte an sich funktionieren.
Generiert dein Device denn Events?
Beobachte mal im Event monitor ob bei Änderung entsprechend was angezeigt wird.
Zum testen des Notifys ansonsten mal:
trigger Gasheizung
Wenn das funktioniert, musst du für's Device vermutlich ein Event-on-change-reading (https://wiki.fhem.de/wiki/Event-on-change-reading) setzen.
Kann man so machen ist aber Unnötige
define notify_WW_Temperatur notify Gasheizung:WW-Isttemperatur:.* { if ( $EVTPART1 >= 57 && $EVTPART1 <= 62 ) {DebianMail('vorname@name.com','Temperatur Warmwasserspeicher:','Die WW-Speichertemperatur liegt zwischen 57 und 62 Grad')} elsif ( ...
Nochmals mein Dank an CoolTux - soeben sind die ersten Mails eingetrudelt!!
Auf diese Syntax im Device-Namen mit :.*
muss man erst einmal kommen.
Ich habe es im Moment nur im Wiki (notify) gefunden.
Notify arbeitet mit RegEx. Dazu findet man so einiges im Netz.
Du kannst auch den Eventmonitor nehmen, das Event markieren und dann create drücken.
Zitat von: CoolTux am 18 März 2019, 17:18:00
Kann man so machen ist aber Unnötige
Verständnisfrage:
Klar ist "Gasheizung:WW-Isttemperatur:.*" sinnvoller, allerdings hätte das notify doch bereits auf alle Events mit "Gasheizung" reagieren müssen, oder?
Meines Wissens nicht. Müsste ich aber selbst noch mal ganz genau klären wie es ist wenn man nur den DEVICENAME mit an gibt.
Bei DEVICENAME.* hätte es auf jeden Fall getriggert.
Hab's nämlich mal mit dem dummy ausprobiert, mit dem es funktioniert hat. Aber vielleicht verhält der sich ja auch noch mal anders. Naja...
Eigentlich nicht. Wie gesagt durchaus möglich das es auch nur mit DEVICENAME geht. Aber ich würde es als unsauber bezeichnen.
Im Moment laufen ständig Mails ein, so etwa mindestens jede Minute eines.
Anzunehmen ist, dass jeder kleinste WW-Temperatur-Abweichung getriggert wird.
Leider kann ich das im Event Monitor nicht verfolgen, da er (möglicherweise wegen meines NAS von Synology) nichts anzeigt.
Für meine 'Ursprungsaufgabe', den Fehlercode der Heizung zu triggern wäre das aber kein Problem, weil die Werte doch ziemlich statisch sind.
Will man aber wirklich einen Messwert wie in meinem Beispiel klassifizieren, müssten man ggf. runden können.
Nun in der Regel möchtest Du bei einem bestimmten Ereignis informiert werden.
Zum Beispiel Benachrichtigung bei unter/überschreiten von Schwellenwerten.
In diesem Fall generiert man mit dem Attribut userReadings ein neues Reading.
attr Gasheizung userReadings infoIsttemp:WW-Isttemperatur:.* { ReadingsVal($name,'WW-Isttemperatur','hoelle') > 57 ) { 'gemuetlich' } elsif( ReadingsVal($name,'WW-Isttemperatur','hoelle') < 37 ) { 'scheisse kalt' } }
Und dann passt du nur noch dein notify an. Reading infoIsttemp wird überwacht und du reagierst auf scheiße kalt oder gemuetlich.
Interessante Vorgehensweise, Danke für die Erläuterungen ::)
Nun habe ich das Gelernte zu später Stunde doch noch auf mein Ursprungsproblem übertragen: der Überwachung des Fehlercodes meiner Heizung.
Der Standardwert ist "0", d.h. keine Probleme.
Beispielhaft habe ich im elsif den Fehlercode "EF" dargestellt, der das Fehlen der Gasverzufuhr anzeigt - diesen Fehler kann ich problemlos durch Abstellen der Gasleitung simulieren.
Der Code lautet deshalbdefine nf_WW_Fehlercode notify Gasheizung:Brenner_Fehlercode:.* { if ( $EVTPART1 == "0") {DebianMail('vorname@name.com','Status Gasheizung:','Es liegt keine Fehlermeldung vor!')} elsif ( $EVTPART1 == "EF" ) {DebianMail('vorname@name.com','Fehlermeldung Gasheizung:','Brenner auf Störung! Flammenverlust direkt nach Flammenbildung! Gasversorgung prüfen!')}}
Nun hatte gedacht, dass notify nur den Fehlercode triggert und dieser ist ja ohne Auftreten eines Fehlers statisch.
Leider erreichen mich erneut minütlich Mails mit dem Hinweis auf den Fehlercode "0".
Erst nach Modifizierung des notify wie folgt (Löschen von :.*)
define nf_WW_Fehlercode notify Gasheizung:Brenner_Fehlercode { if ( $EVTPART1 == "0") {DebianMail('vorname@name.com','Status Gasheizung:','Es liegt keine Fehlermeldung vor!')} elsif ( $EVTPART1 == "EF" ) {DebianMail('vorname@name.com','Fehlermeldung Gasheizung:','Brenner auf Störung! Flammenverlust direkt nach Flammenbildung! Gasversorgung prüfen!')}}
lässt die Mailflut verstummen.
Ich hebe es mir für morgen auf, den Fehlerfall zu testen, und werde hier berichten, ob diese Veränderung Erfolg hatte und überhaupt noch ein Mail versandt wird - Methode: Trial and Error.
Zitat von: uron am 19 März 2019, 00:08:13
Ich hebe es mir für morgen auf, den Fehlerfall zu testen, und werde hier berichten, ob diese Veränderung Erfolg hatte und überhaupt noch ein Mail versandt wird - Methode: Trial and Error.
Oder Dich ein wenig mehr mit dem Thema durch lesen beschäftigen.
Ein einfaches event-on-change-reading hätte hier geholfen.
@CoolTux,
natürlich hätte ein einfaches Lesen des Themas 'event-on-change-reading' geholfen.
Nachdem du aber diesen Hinweis von pataya
Zitat von: pataya am 18 März 2019, 17:00:36
Zum testen des Notifys ansonsten mal:
trigger Gasheizung
Wenn das funktioniert, musst du für's Device vermutlich ein Event-on-change-reading (https://wiki.fhem.de/wiki/Event-on-change-reading) setzen.
verworfen hattest:
Zitat von: CoolTux am 18 März 2019, 17:18:00
Kann man so machen ist aber Unnötige
war das Thema nicht meine erste Wahl.
Zitat von: CoolTux am 19 März 2019, 06:08:50
Oder Dich ein wenig mehr mit dem Thema durch lesen beschäftigen.
Ein einfaches event-on-change-reading hätte hier geholfen.
Am Ende hilft event-on-change-reading und es gehen nur noch eventbasierte Mails bei mir ein.
Danke an beide Helfer.