Fehlermeldung bei Kalender Notify

Begonnen von juelich, 01 November 2014, 12:57:43

Vorheriges Thema - Nächstes Thema

juelich

Ich bin vor kurzem mit meiner Installation auf einen Raspberry umgezogen und habe jetzt wiedeer mit einem alten Fehler zu kämpfen:

Ich habe zur Heizungssteuerung einen Google-Kalender angelegt, für jeden Heizkörper einen eigenen. Der Betreff eines Termins enthält die gewünschten Temperaturen zu Beginn und Ende des Termins.
Beispiel:

Termin von 4 bis 6 Uhr, Betreff  "22 17" im Badkalender bedeutet, dass die Badheizung um 4 Uhr auf 22 Grad gestellt wird und um 6 Uhr wieder auf 17 Grad runterregelt.

Zur Lösung habe ich folgende Notifys erstellt:

define HZ.Wohnzimmer_an notify Kalender_Wohnzimmer:modeStarted.* { my $reading="%EVTPART0"; my $uid= "%EVTPART1"; my ($dtemp,undef)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } } sowie

define HZ.Wohnzimmer_aus notify Kalender_Wohnzimmer:modeEnded.* { my $reading="%EVTPART0"; my $uid= "%EVTPART1"; my (undef,$dtemp)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } }

Das Ganze funktioniert wunderbar, allerdings ist das ganze Log voller Fehlermeldungen:

2014.11.01 12:36:01 4: Calendar Kalender_Wohnzimmer: Wakeup
2014.11.01 12:36:01 4: Calendar Kalender_Wohnzimmer: Updating...
2014.11.01 12:36:03 4: Calendar Kalender_Wohnzimmer: Checking times...
2014.11.01 12:36:03 1: PERL WARNING: Use of uninitialized value in split at (eval 1176) line 1.
2014.11.01 12:36:03 3: eval: { my $reading="modeStarted:"; my $uid= "%EVTPART1"; my ($dtemp,undef)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } }
2014.11.01 12:36:03 1: PERL WARNING: Use of uninitialized value $dtemp in concatenation (.) or string at (eval 1176) line 1.
2014.11.01 12:36:03 3: eval: { my $reading="modeStarted:"; my $uid= "%EVTPART1"; my ($dtemp,undef)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } }
2014.11.01 12:36:03 1: PERL WARNING: Use of uninitialized value in split at (eval 1177) line 1.
2014.11.01 12:36:03 3: eval: { my $reading="modeEnded:"; my $uid= "%EVTPART1"; my (undef,$dtemp)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } }
2014.11.01 12:36:03 1: PERL WARNING: Use of uninitialized value $dtemp in concatenation (.) or string at (eval 1177) line 1.
2014.11.01 12:36:03 3: eval: { my $reading="modeEnded:"; my $uid= "%EVTPART1"; my (undef,$dtemp)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid")); { fhem("set hz.wohnzimmer desired-temp $dtemp"); } }

Kann mir jemand helfen, den Fehler zu finden?

Vielen Dank

Markus

Dr. Boris Neubert

Hallo,

$dtemp ist nicht gesetzt. Also liefert der split auf fhem("get ...") nichts als ersten Teil. Am besten schaust Du Dir zunächst auf der Konsole nach händischer Eingabe des Kommandos an, was da zurückkommt und warum der split nichts verwertbares liefert. Alternativ mehr Logging in Deinen Ausruck einbauen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

juelich

#2
Hallo Boris, vielen Dank,

ich habe über verbose 5 das Logging eigentlich schon hochgesetzt - was könnte ich noch tun?
Das Merkwürdige ist ja, das der Ausdruck funktioniert - wie gewollt wird die Heizung zum Startzeitpunkt hochgeregelt und zum Terminende wieder heruntergeregelt. Wären nicht die ganzen Fehlermeldungen im Log, wäre mir ja gar nicht aufgefallen, dass etwas nicht stimmen könnte.
Viele Grüße

Markus

Dr. Boris Neubert

Hallo,

was zeigt er Dir an, wenn Du das get-Kommando auf der Konsole ausführst?

Logging baust Du direkt in Deinen Per-Ausdruck ein mit dem Befehl Log - siehe Beispiel in der Commandref zum Calendar-Modul.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

juelich

Gebe ich get Kalender_Bad summary $uid in der Konsole ein wird gar nichts angezeigt, auch nicht im Log.

Viele Grüße

Markus

Dr. Boris Neubert

Du gibst doch nicht wirklich "$uid" ein? Falls doch: Du musst die UID des Events dort hinschreiben. und arbeitest am besten erst nochmal die Commandref zum Modul durch.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

juelich

#6
OK, hatte es versucht, die UID herauszubekommen, bin aber daran gescheitert, dass der Termin nicht aktiv war. Mit full all hat´s geklappt:

Die Antwort lautet wie erwartet "24 17".

Mit dem Split-Kommando wird $dtemp entweder die erste Zahl oder die letzte Zahl zugewiesen. Das funktioniert in der Praxis ja auch Bestens. Trotzdem kommt die Fehlermeldung.

Liebe Grüße

Markus

juelich

Ich komme irgendwie nicht mehr weiter - ich habe mal versucht nichts weiter zu machen, als die Kalenderabfrage zu loggen, aber selbst da hagelt es Fehler;

Mein Notify:

define HZ_Bad.an notify Kalender_Bad:modeStarted.* {my $reading="%EVTPART0";; my $uid="%EVTPART1"; Log3 undef, 3, fhem("get Kalender_Bad summary $uid"); {my $dtemp= fhem("get Kalender_Bad summary $uid"); Log3 undef, 3, "Temperatur $dtemp"}}

Im Log findet sich dann:

2014.11.02 18:09:38 4: Calendar Kalender_Bad: Wakeup
2014.11.02 18:09:38 4: Calendar Kalender_Bad: Checking times...
2014.11.02 18:09:38 3: Terminbeginn
2014.11.02 18:09:38 5: Triggering HZ.Bad_an
2014.11.02 18:09:38 4: HZ.Bad_an exec {my $reading="modeStarted:";;;; my $uid="%EVTPART1";; Log3 undef, 3, fhem("get Kalender_Bad summary $uid");; {my $dtemp= fhem("get Kalender_Bad summary $uid");; Log3 undef, 3, "Temperatur $dtemp"}}
2014.11.02 18:09:38 1: PERL WARNING: Use of uninitialized value $text in concatenation (.) or string at fhem.pl line 755.
2014.11.02 18:09:38 3:
2014.11.02 18:09:38 1: PERL WARNING: Use of uninitialized value $dtemp in concatenation (.) or string at (eval 1264) line 1.
2014.11.02 18:09:38 3: eval: {my $reading="modeStarted:";; my $uid="%EVTPART1"; Log3 undef, 3, fhem("get Kalender_Bad summary $uid"); {my $dtemp= fhem("get Kalender_Bad summary $uid"); Log3 undef, 3, "Temperatur $dtemp"}}
2014.11.02 18:09:38 3: Temperatur

Eines wird jetzt schon klar: Bei jedem Kalenderupdate wird ein leerer Terminbetreff mitgeliefert (meines Erachtens ein Fehlfunktion). Damit geht dann der Split-Befehl fehl. Ich habe dann versucht, über eine if-Abfrage ein $dtemp nur ermitteln zu lassen, wenn der Kalenderbetreff nicht leer ist, bin aber über Syntaxfehler nie hinausgekommen. Warum ist PERL nur so eine schwere Sprache?

Liebe Grüße

Markus

brede

Ist das Problem gelöst?
Ich habe die gleichen Log-Einträge, obwohl die Temperaturen richtig gesetzt werden
2014.11.09 17:02:49 1: PERL WARNING: Use of uninitialized value in split at (eval 1389) line 1.
2014.11.09 17:02:49 3: eval: { my $reading="modeEnded:"; my $uid= "%EVTPART1"; my ($actor,undef,$dtemp) = split(/ /,fhem("get KalenderHeizung summary $uid")); if(defined $actor) { fhem("set $actor desired-temp $dtemp"); } }
2014.11.09 17:02:49 1: PERL WARNING: Use of uninitialized value in split at (eval 1390) line 1.
2014.11.09 17:02:49 3: eval: { my $reading="modeStarted:"; my $uid= "%EVTPART1"; my ($actor,$dtemp,undef)= split(/ /,fhem("get KalenderHeizung summary $uid")); if(defined $actor) { fhem("set $actor desired-temp $dtemp"); } }
2014.11.09 17:04:49 1: PERL WARNING: Use of uninitialized value in split at (eval 1417) line 1.


meine DEF:
KalenderHeizung:modeStarted.* { my $reading="%EVTPART0"; my $uid= "%EVTPART1"; my ($actor,$dtemp,undef)= split(/ /,fhem("get KalenderHeizung summary $uid")); if(defined $actor) { fhem("set $actor desired-temp $dtemp"); } }

und die Kalendereinträge sind auch OK
get KalenderHeizung full all

juelich

Ja, ich habe das Problem inzwischen gelöst:

Offensichtlich habe ich recht mit meiner Vermutung, dass bei jeder Kalenderaktualisierung das Notify aktiviert wird und dabei ein leerer Termin übergeben wird - ein Fehler im Calendar-Modul also.
Deshalb muss vor dem Split-Befehl abgefagt werden, ob dieser Betreff überhaupt existiert. Bei mir sieht das so aus:

Kalender_Kinder:modeStarted.* {
my $reading="%EVTPART0";
my $uid= "%EVTPART1";
my $dtemp;
my $termin= fhem("get Kalender_Kinder summary $uid");
if (defined($termin)) {
my ($dtemp,undef)= split(/ /,fhem("get Kalender_Kinder summary $uid"));
fhem("set hz.kinder desired-temp $dtemp");
log 1, "Temperatur Kinderzimmer $dtemp";}
;;}


Damit sind die Fehlermeldungen vom Tisch. Ich habe allerdings in der fhem.cfg das generelle Loglevel auf 2 zurückgenommen. Sonst wird jedes Auslösen des Notifys ausgiebig mitprotokolliert. Die Notifys haben dann über Verbose dann wieder Loglevel 3 bekommen, sonst sind die Logeinträge (Temperatur Kinderzimmer" auch nicht zu sehen.

Viele Grüße

Markus

PS: Ich bin schon ein wenig enttäuscht vom Forum, denn es gibt hier sicherlich einige, die sich wesentlich besser mit FHEM auskennen als ich. Ich hätte mir von dieser Seite durchaus ein paar Tips bei den doch recht einfachen Fragen gewünscht - aber leider Fehlanzeige, auch im Anfängerteil des Forums.

Dr. Boris Neubert

Zitat von: juelich am 09 November 2014, 21:11:06
Offensichtlich habe ich recht mit meiner Vermutung, dass bei jeder Kalenderaktualisierung das Notify aktiviert wird und dabei ein leerer Termin übergeben wird - ein Fehler im Calendar-Modul also.

Kannst Du bitte in für mich nachvollziehbarer Form beschreiben, was konkret falsch läuft bei der Aktualisierung des Kalenders? Dann habe ich ggf. eine Chance, das für Dich und andere Anwender abzustellen.

Zitat
PS: Ich bin schon ein wenig enttäuscht vom Forum, denn es gibt hier sicherlich einige, die sich wesentlich besser mit FHEM auskennen als ich. Ich hätte mir von dieser Seite durchaus ein paar Tips bei den doch recht einfachen Fragen gewünscht - aber leider Fehlanzeige, auch im Anfängerteil des Forums.

Du hast doch nachweislich Hilfestellung erhalten. Und schließlich hast Du Dein Problem auch gelöst. Was soll das?

Grüße
Boris

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

juelich

Hallo Boris,

der Fehler liegt darin, daß das Notify laut Commandref erst dann triggern dürfte, wenn der Termin begonnen hat (modeStarted: events that have just transitioned to start mode). In diesem Fall würde über "%EVTPART1" der Betreff des Termins übergeben und vom Notify ausgewertet werden. Aus einem mir nicht nachvollziehbarem Grund wird das Notify aber bei jeder (in der Regel stündlichen) Kalenderaktualisierung aktiviert. Da ja gar kein Termin aktiv ist bleibt in diesem Fall "%EVTPART1" leer bzw. nicht definiert und das Splitkommando läuft ins Leere. Das führte zu den stündlichen Fehlermeldungen im Log und wurde von mir durch eine vorgeschaltete Abfrage ob der Termin überhaupt existiert abgefangen.

Zu meiner dezenten Kritik: Ja, ich habe das Problem lösen können, aber nicht mit Hilfe des Forums, sondern indem ich mich nächtelang in die PERL-Syntax eingelesen habe. Ich habe einige Fragen dazu (die zwar auch das Notify, aber eher die PERL-Problematik betreffen) auch im Anfängerteil gestellt. Dort gab es überhaupt keine Antwort. Es sind ja manchmal nur Kleinigkeiten, woran es hängt. Gerade die fallen einem Profi natürlich sofort auf - ein Anfänger sucht sich daran tot. ALs Beispiel seien nur die undefined-Errors bezüglich $dtemp in meinem Notify erwähnt. Durch eine simple Definition als leerer Wert zu Beginn des Notifys sind die verschwunden. Von Sachen wie "use strict" etc. hatte ich vorher noch nie etwas gehört. Mann kann doch auch nicht von jedem User, der bloß eine kleine Steuerung zu Hause aufbauen will, erwarten, sich genauso tief in die Materie einzuarbeiten, wie die, die mit viel Fleiß hier für die Allgemeinheit Module entwerfen und sich deshalb bestens damit auskennen. Aber ich freue mich, das jetzt alles bestens funktioniert und freue mich, das es FHEM und dieses schöne Forum gibt!

Viele Grüße

Markus

Dr. Boris Neubert

Hallo,

es gibt eine neue Version im alpha-Test. Lies bitte hier:

http://forum.fhem.de/index.php/topic,46609.0.html

wenn Du testen möchtest, ob das Problem bei der neuen Version noch besteht.

Viele Grüße
Boris

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!