Bug in meinem Notify, aber wo?

Begonnen von Alcamar, 26 Juni 2015, 09:30:50

Vorheriges Thema - Nächstes Thema

Alcamar

In meinem notify ist ein Bug, aber ich finde nicht heraus wo.

Zielsetzung:
Wenn tagsüber Temperatur und Helligkeit einen bestimmten Schwellwert erreichen und der Sonnenschutz noch nicht aktiv ist, wird eine Szene aufgerufen (Rollos fahren teilweise runter - entspricht dem Sonnenschutz), die Dummy-Variable WZ_SonnenschutzStatus wird aktiviert (damit bei der nächsten Prüfung nicht wieder alles durchlaufen wird) und es wird eine Benachrichtigung auf das Handy geschickt.

Was wirklich passiert:
Bei erreichen der Schwellwerte wird if-Verzweigung durchlaufen. Die Befehle werden fast alle ausgeführt. Nur die Dummy-Variable WZ_SonnenschutzStatus wird nicht aktiviert. Damit läuft fhem eine Stunde später wieder in die Verzweigung rein und führt nochmal alles aus. Diesmal dann aber inklusive Dummy-Variable. D.h. mein Sonnenschutz-Check läuft grundsätzlich zweimal, obwohl nur einmal gewollt ist.

Bin aktuell dabei mich in DOIF einzulesen. Vielleicht baue ich meine notifys alle um. Ob es das Problem löst, weiß ich nicht. Das muss trotzdm auch so gehen. Ich denke, dass ich irgendwo einen Syntax-Fehler habe. Nur wo?

+*01:00:00 { if ( ( isday() ) && (ReadingsVal("WZ_SonnenschutzStatus", "state", "off") eq "off" ) ) {
my $helligkeit=ReadingsVal("Garten_Bewegungsmelder_1", "brightness", "0");
my $temperatur=ReadingsVal("Garten_Thermometer", "temperature", "0");
my $tempWohnzimmer=ReadingsVal("EG_Thermometer","temperature", "0");
if ( ( $temperatur >20 ) && ( $helligkeit >100 ) ) {
  fhem("set Lichteinfall_Wohnzimmer scene SZ_Sonnenschutz");
  fhem("set WZ_SonnenschutzStatus on");
  fhem("set CallMe msg 'Steuerung' 'Augrund der Helligkeit von $helligkeit und Temperatur $temperatur wurde der Sonnenschutz im Wohnzimmer aktiviert.' '' 0 'bugle' 30 3600"); }
}
}

rudolfkoenig

Syntax Fehler werden im Log gemeldet.

Wenn man bei notify-Bau unsicher ist, sollte man so vorgehen:
- EventLog beobachten, und die passenden Events notieren (copy/paste)
- Im FHEMWEB ein notify mit richtigen Namen aber dummy regexp/Befehl definieren.
- Im Detailfenster mit dem Regexp Editor und dem vorigen Wissen das Regexp zusammenbauen, und das dummy-Regexp loeschen
- Das auszufuehrende Befehl nach und nach aufbauen, indem man in der Kommandozeile Teile davon eingibt. Fuer solche Aufgaben eignet sich mAn "socat TCP:fhemhost:fhemport readline" besser als FHEMWEB. Werte kann man mit Log 1, "Wert"; im FHEM-Log protokollieren, falls man unsicher ist.
- Groessere Konstrukte (und das hier zaehlt fuer mich als solches) sollten als Funktion nach 99_myUtils.pm ausgelagert werden, diese kann man mit { meineFunktion("$NAME", "$EVENT") } aus dem Notify oder zum testen aus der Kommandozeile aufrufen.
- Das notify testen mit trigger <regexp>

Siehe auch http://fhem.de/commandref.html#perl fuer Beispiele.

Alcamar

Die Hinweise waren wertvoll und ich habe auch meine erste eigene Routine in 99MyUtils untergebracht. Da hat mich auch die ganze Zeit gereitzt.
Das Ergebnis ist aber auch dort das gleiche. :-( Der simple Status einer Dummy-Variable wird einfach nicht gesetzt.
Einzel läuft alles. Jede Zeile per se läuft. Aber im Kontext wird eine Zeile einfach nicht gesetzt.
fhem("set WZ_SonnenschutzStatus on");

marvin78

Du musst nach sehen, ob die Zeile, in der das steht überhaupt aufgerufen wird. Debuggen kannst du am einfachsten, in dem du eigene Log-Zeilen einbaust (an den Stellen, an denen es hakt) und die dann das Log anschaust. So kannst du überprürfen, ob deine Bedingungen wirklich erfüllt sind.

Alcamar

ich habe versucht eigene Log-Zeilen zu schreiben. Im Log steht aber dann nur eine bzw. 3 Leerzeilen. Vermutlich rufe ich die falsch auf. Habe schon ein paar Varianten auf dem Netz ausprobiert. :-(

sub
aktiviereWZ_Sonnenschutz
{
my $helligkeit=ReadingsVal("Garten_Bewegungsmelder_1", "brightness", "0");
my $temperatur=ReadingsVal("Garten_Thermometer", "temperature", "0");
my $tempWohnzimmer=ReadingsVal("EG_Thermometer","temperature", "0");

Log 1, fhem("set Lichteinfall_Wohnzimmer scene SZ_Sonnenschutz");
Log 1, fhem("set WZ_SonnenschutzStatus on");
Log 1, fhem("set CallMe msg 'Steuerung' 'Aufgrund der Helligkeit von $helligkeit und Temperatur $temperatur wurde der Sonnenschutz im Wohnzimmer aktiviert.' '' 0 'bugle' 30 3600");
}


In der Routine passiert genaugenommen nicht besonders viel. Und das wenige passiert ja auch, außer den dummy WZ_SonnenschutzStatus auf on zu setzen.

Der Log zu dem Code oben lautet:
2015.07.03 10:26:00 1:
2015.07.03 10:26:00 1:
2015.07.03 10:26:01 1:

marvin78

Versuche es in der Art:

sub
aktiviereWZ_Sonnenschutz
{
my $helligkeit=ReadingsVal("Garten_Bewegungsmelder_1", "brightness", "0");
my $temperatur=ReadingsVal("Garten_Thermometer", "temperature", "0");
my $tempWohnzimmer=ReadingsVal("EG_Thermometer","temperature", "0");

fhem("set Lichteinfall_Wohnzimmer scene SZ_Sonnenschutz");
fhem("set WZ_SonnenschutzStatus on");
fhem("set CallMe msg 'Steuerung' 'Aufgrund der Helligkeit von $helligkeit und Temperatur $temperatur wurde der Sonnenschutz im Wohnzimmer aktiviert.' '' 0 'bugle' 30 3600");
Log 1, "Das hier wurde getriggert!";
}

Alcamar

dann erscheint auch die "trigger-Zeile" im Log.

Jetzt habe ich allerdings auch {aktiviereWZ_Sonnenschutz} in der web-Befehlszeile eingegeben. Sonst erfolgt der Aufruf der sub neuerdings über ein DOIF. Der Aufruf erfolgt auch tatsächlich, weil ich ja die Auswirkungen von zwei Befehlszeilen aus dem sub {aktiviereWZ_Sonnenschutz} auch sehen kann. Es fehlt eben nur die Status-Umsetzung einer Variablen.

marvin78

Mach mal folgendes:

fhem("sleep 5;set WZ_SonnenschutzStatus on");

Alcamar

Ich habe jetzt nur mit der Triggerzeile (Das hier wurde getriggert!) das DOIF auslösen lassen und es funktioniert alles. Etwas paradox, weil die Triggerzeile wohl "nichts" macht. Trotzdem geht es.

An das sleep habe ich gedacht, weil ich mir vorstellen könnte, dass der Befehl davor zu lange braucht, oder einfach die nächste Zeile nicht zum Zuge kommen läßt. Klingt aber ebenso etwas schräg für mich. Aber mit Deinem Hinweis in die gleiche Richtung probiere ich das mal aus. Ich lasse das nun morgen einfach im standard-Gesamtkontext laufen. Mal sehen was passiert. Meine Erfahrung werde ich melden.

Wenn alles geht, nehme ich die Triggerzeile wieder raus, dann bin ich gespannt was passiert. :-)

Danke Marvin78!!!

Alcamar

Mit dem sleep 5 funktioniert es! Warum die Verzögerung etwas bringt, verstehe ich zwar nicht, aber ich nehme als Erfahrung mit, dass wenn eine Befehlszeile nicht wie alle anderen abgearbeitet wird, obwohl sie syntaktisch ok ist, dann hilft eine künstliche Verzögerung.

Nur der Vollständigkeit wegen, nehme ich nun auch noch die Debug-Zeile mit der Info (Das hier wurde getriggert!) raus. Falls die unerwarteterweise auch einen Einfluß haben sollte  :) melde ich das hier.

marvin78

Ich denke nicht, dass das eine wirkliche Regel sein kann. In dem Fall hier habe ich nur vermutet, dass das Schalten der Scene auf deinen System zu viel Zeit in Anspruch nimmt und der nächste Befelhl deshalb "verschluckt" wird. Das sollte zwar nicht unbedingt die Regel sein, ist auf deinem System aber offenbar der Fall. Eine Regel abzuleiten, halte ich jedoch nicht für korrekt.

Im Übrigen könnte es auch hilfreich sein, die Befehlsreihenfolge zu ändern. Das sleep kannst du dir dann vermutlich sparen.

Alcamar

Danke! nehme ich so mit. Scene könnte ich am Schluß aufrufen. Ich lasse das mal so drin, als reminder. Bin noch relativ am Anfang mit der Automatisierung.

Jedenfalls bin ich auch überrascht mit welcher rasanten Geschwindigkeit man im Forum ein Feedback bekommt. Danke dafür!

ToM_ToM

Ich stehe heute vor dem gleichen Problem. Ein zweiter setreading Befehl funktioniert mit notify leider irgendwie nicht.

Folgendes geht einwandfrei:

HM_GN_Solarstrom_[\w]+[\s:]?2\.EnergyToday:.* {
my $woodshedEnergyToday = ReadingsVal("HM_GN_Solarstrom_Woodshed","EnergyToday",0);;
my $carportEnergyToday = ReadingsVal("HM_GN_Solarstrom_Carport","EnergyToday",0);;
my $energyTodayTotal = ($woodshedEnergyToday + $carportEnergyToday);;
fhem("setreading Solarstrom_Total EnergyToday $energyTodayTotal");;
}



Mit zweitem setreading wird nur der erste von beiden ausgeführt und der Zweite einfach ignoriert. Leerzeilen habe ich auch nicht drin, aber der zweite setreading wird einfach ignoriert.


HM_GN_Solarstrom_[\w]+[\s:]?2\.EnergyToday:.* {
my $woodshedEnergyToday = ReadingsVal("HM_GN_Solarstrom_Woodshed","EnergyToday",0);;
my $carportEnergyToday = ReadingsVal("HM_GN_Solarstrom_Carport","EnergyToday",0);;
my $energyTodayTotal = ($woodshedEnergyToday + $carportEnergyToday);;
fhem("setreading Solarstrom_Total EnergyToday $energyTodayTotal");;
fhem("setreading Solarstrom_Total EnergyTodayFormatted test");;
}

Auch mit dem sleep davor hat es leider nicht geklappt.


Hier der Vollständigkeit halber nochmal mein eig. Zielvorhaben:

HM_GN_Solarstrom_[\w]+[\s:]?2\.EnergyToday:.* {
my $woodshedEnergyToday = ReadingsVal("HM_GN_Solarstrom_Woodshed","EnergyToday",0);;
my $carportEnergyToday = ReadingsVal("HM_GN_Solarstrom_Carport","EnergyToday",0);;
my $energyTodayTotal = ($woodshedEnergyToday + $carportEnergyToday);;
fhem("setreading Solarstrom_Total EnergyToday $energyTodayTotal");;
my $energyTodayTotalFormatted = "0";;
if (round($energyTodayTotal, 0) >= 1000) {
$energyTodayTotalFormatted = round($energyTodayTotal/1000,3) . " kW";;
}
else {
$energyTodayTotalFormatted = "$energyTodayTotal W";;
}
fhem("setreading Solarstrom_Total EnergyTodayFormatted $energyTodayTotalFormatted");;
}


VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

rudolfkoenig

Ich kann das Problem mit folgendem vereinfachten Setup nicht nachvollziehen:

fhem.cfg:attr global modpath .
attr global mseclog 1

define t telnet 7072

define HM_GN_Solarstrom_X dummy
define Solarstrom_Total dummy
define n notify HM_GN_Solarstrom_[\w]+[\s:]?2\.EnergyToday:.* {\
  fhem("setreading Solarstrom_Total EnergyToday 1");;\
  fhem("setreading Solarstrom_Total EnergyTodayFormatted test");;\
}


Test:% telnet localhost 7072
fhem> info timer
fhem> setreading HM_GN_Solarstrom_X 2.EnergyToday 12
2018-07-22 18:55:49.632 dummy Solarstrom_Total EnergyToday: 1
2018-07-22 18:55:49.632 dummy Solarstrom_Total EnergyTodayFormatted: test
2018-07-22 18:55:49.632 dummy HM_GN_Solarstrom_X 2.EnergyToday: 12


Merkwuerding in deiner Version sind die ;; aber kein \.
Entweder in fhem.cfg editiert (dann mit ;; und \) oder in FHEMWEB DEF, dann reicht ; und \ ist nicht notwendig.

ToM_ToM

#14
ZitatIch kann das Problem mit folgendem vereinfachten Setup nicht nachvollziehen:

Hallo Rudolf,

editiert habe ich das in der Weboberfläche über den Link DEF. Die doppelten ;; sind wohl noch Gewohnheit von der früeren Edition in der Datei. Das habe ich mir jedoch seit einem Jahr erfolgreich abgewöhnt.  8)

Ich habe mir auch nochmal andere notify Definitionen angeschaut. Auch dort habe ich logische Operationen und mehrere setreadings drin die wunderbar funktionieren. Daher kann ich es irgendwie nur schwer nachvollziehen warum es mit diesem einen nicht geht.
Das notify an sich wird ja bis zu einem bestimmten Punkt ausgeführt (bis zum ersten setreading) und schmeißt auch keinen Fehler zurück. Es ist fast so als würde die Änderung nicht übernommen.
Kann es sein dass aus irgendeinem Grund das notify nicht geladen wird und ich nach der Änderung erst FHEM neu starten muss? Dies hatte ich noch nicht probiert, da das System bei meinen Eltern steht und ich dazu erst ein paar andere Prozesse anhalten muss. Aber das mit dem Neustart könnte ich tatsächlich nochmal testen.

EDIT: Neustart nach Änderung hat leider auch nicht geholfen.

Kann das vielleicht was mit diesem Fehler zu tun haben?
https://forum.fhem.de/index.php/topic,89546.msg820169.html#msg820169


VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8