Hallo,
ich habe seit einigen Tagen das merkwürdige Problem dass mein CO20 Sensor notify nicht mehr funktioniert. Bis vor Kurzem tat es das aber noch und sämtliche Versuche es wieder ans Laufen zu bekommen sind kläglich gescheitert.
Ein notify auf voc erzeugt ein neues Reading airquality, das funktioniert auch weiterhin.
notify:
wz_CO20:voc.* {
my $voc = int(ReadingsVal($NAME,"voc",200));
if ($voc >= 1500 && $voc < 1750)
{
fhem("setreading wz_CO20 airquality mittel");
}
elsif ($voc >= 1750)
{
fhem("setreading wz_CO20 airquality schlecht");
}
else
{
fhem("setreading wz_CO20 airquality gut");
}
}
event-on-change-reading beim CO20 steht auf "airquality,voc"
Ein weiteres notify auf airquality (wz_CO20:airquality.*) hat dann bisher immer eine Sprachansage erzeugt und meinen Deckenventilator ein-/ausgeschaltet (eigene Sub).
Und eben dieses notify tut es nicht mehr. Das notify wird einfach nicht mehr ausgelöst. Erzeugt setreading kein Event mehr? Selbst ein "trigger wz_CO20 airquality" im notify bringt nicht den gewünschten Erfolg.
Gebe ich aber "trigger wz_CO20 airquality" in die FHEM Eingabezeile ein, so wird das notify auch wirklich sofort getriggert.
Ich weiß echt langsam keinen Rat mehr. Hatte event-on-change-reading auch mal ganz rausgenommen und mal auf .* gesetzt, alles ohne Erfolg. Das automatische triggern des notify klappt einfach nicht mehr.
Hat sich irgendwas FHEM-mäßig verändert? Ich weiß leider nicht mehr wie lange es schon nicht mehr funktioniert da jetzt wochenlang die Balkontür aufstand und des Sensor nur geringe voc Werte lieferte und somit auch nichts geschaltet werden kann. Nachdem es nun aber doch zu kühl für die dauerhaft offene Balkontür ist, ist mir aufgefallen dass es nicht mehr funktioniert.
Bin über jeden Rat dankbar.
Gruß
Dan
Schade, das du das notify, um das es geht nicht gepostet hast.
Was sagt denn der Eventmonitor?
Das notify für airquality ruft nur besagte Sub auf.
Die Sub wird aber nicht aufgerufen da airquality nicht getriggert wird.
define wz_Luftguete_ntfy notify wz_CO20:airquality.* { AirQuality($NAME) }
Und dazu die AirQuality Sub:
sub AirQuality($)
{
my ($name) = @_;
my $val = ReadingsVal($name,"airquality","gut");
my $voc = ReadingsVal($name,"voc",0);
my $bt = Value("bk_Tuer");
my $kf = Value("ku_Fenster");
my $text = undef;
my $speed = 0;
if (Value("rgr_Residents") eq "home")
{
if ($val eq "schlecht")
{
$text = "Im Wohnzimmer sollte ganz dringend gelüftet werden. Es sind zur Zeit $voc ppm in der Luft." if ($bt eq "closed");
$text = "Die Luft im Wohnzimmer ist immer noch schlecht. Vielleicht sollte zusätzlich das Fenster in der Küche geöffnet werden um schneller zu lüften." if ($bt eq "open" && $kf eq "closed");
$speed = 2;
}
elsif ($val eq "mittel")
{
$text = "Im Wohnzimmer sollte bei Gelegenheit gelüftet werden. Es sind zur Zeit $voc ppm in der Luft." if ($bt eq "closed");
$speed = 1;
}
else
{
$text = "Die Balkontür kann jetzt geschlossen werden. Die Luft im Wohnzimmer ist wieder frisch genug." if ($bt eq "open");
}
fhem("set wz_Ventilator:FILTER=speed!=$speed speed $speed");
fhem("set w_Alarm_Lichter alert select") if (($speed == 1 && $bt ne "open") || ($speed == 2 && $bt ne "open" && $kf ne "open"));
speak("|airplane| $text") if (defined($text));
}
}
Sobald der Sensor Daten liefert kommt im Eventlog:
2016-08-17 09:01:20 CO20 wz_CO20 voc: 1407
2016-08-17 09:01:20 CO20 wz_CO20 debug: 759
2016-08-17 09:01:20 CO20 wz_CO20 pwm: 370
2016-08-17 09:01:20 CO20 wz_CO20 r_h: 168.65
2016-08-17 09:01:20 CO20 wz_CO20 r_s: 345757
2016-08-17 09:01:20 CO20 wz_CO20 airquality
Also wird ja offensichtlich ein Event getriggert. Nur warum reagiert das notify nicht (mehr)? Wie gesagt, genau so wie es ist hat es bereits wochenlang funktioniert.
Gruß
Dan
Was mich am Event wundert, ist dass es keinen Wert hat. Man sieht nur das Reading, nicht aber den Wert.
Genau das wundert mich auch.
Allerdings "trigger wz_CO20 airquality" hat ja auch keinen Wert und das notify greift.
Gruß
Dan
Ich frage mich gerade, warum du airquality nicht über ein userReading erzeugst!?
Das sollte aber natürlich nicht das Problem sein. Ich nehme an, dass du mal etwas mit dem Regex spielen musst. Sowas zum Beispiel:
define wz_Luftguete_ntfy notify wz_CO20:.airquality.* { AirQuality($NAME) }
Zitat von: marvin78 am 17 August 2016, 09:17:40
Ich frage mich gerade, warum du airquality nicht über ein userReading erzeugst!?
Das sollte aber natürlich nicht das Problem sein. Ich nehme an, dass du mal etwas mit dem Regex spielen musst. Sowas zum Beispiel:
define wz_Luftguete_ntfy notify wz_CO20:.airquality.* { AirQuality($NAME) }
Das ergibt für mich nur bedingt Sinn denn, wie gesagt, es hat bereits genau so funktioniert. Und der Regex ist über den Wizard auch genau so auswählbar.
Dennoch habe ich Deinen Rat befolgt, leider keine Besserung.
Probiere nun nochmal:
define wz_Luftguete_ntfy notify wz_CO20:.*airquality.* { AirQuality($NAME) }
Gruß
Dan
EDIT: ich arbeite gern mit Dingen die ich schon gut kenne, userReadings habe ich bisher nicht im Einsatz.
Nun. Wenn kein Fehler zu entdecken ist und man den Eindruck hat, dass etwas nicht mehr funktioniert, probiert man in der Regeln gewisse Dinge, ob es auf den ersten Blick Sinn macht oder nicht.
Mir stellt sich die Frage, ob das EVENT wirklich nicht triggert oder ob deine sub unter gewissen Umständen nicht greift. Ggf. gibt es in deinem System aber auch Timingprobleme, sodass nicht beide notifys getriggert werden können.
Hast du mal sowas probiert und geschaut, was nach einer Werteänderung im Sensor im Log steht!?
define wz_Luftguete_ntfy notify wz_CO20:airquality.* {
Log 1, $NAME."-".$EVENT;
AirQuality($NAME);
}
Zitat von: marvin78 am 17 August 2016, 09:31:33
Nun. Wenn kein Fehler zu entdecken ist und man den Eindruck hat, dass etwas nicht mehr funktioniert, probiert man in der Regeln gewisse Dinge, ob es auf den ersten Blick Sinn macht oder nicht.
Ja klar, danke... ;)
Meine Sub funktioniert genau so wie sie soll! Mit "trigger wz_CO20 airquality" in der FHEM Eingabezeile reagiert eben genau das notify und die Sub läuft einwandfrei durch. Auch ändert sich der Zeitstempel des notify, welcher eben nicht geändert wird wenn das voc notify das setreading ausführt, weil eben airquality nicht getriggert wird.
Dein Code Vorschlag wird auch nicht funktionieren, da ja genau dieses notify nie getriggert wird.
Gruß
Dan
EDIT: Anbei mal ein Screenshot der beiden notify(s). Wie man sieht wird voc getriggert, airquality nicht.
EDIT2: Dateianhang entfernt.
Damit der Helfer das alles auch genau nachvollziehen kann, postet man normalerweise lists von allen beteiligten Devices. Andernfalls darf man sich nicht wundern, wenn einfach Vermutungen geäußert werden.
Ich würde an deiner Stelle mit ein paar sleeps experimentieren um Timingprobleme auszuschließen (im ersten notify). Und trotz allem: Log einbauen. Ggf. auch in das das erste notify.
Ich will aber insgesamt nicht ausschließen, dass sich am Triggerverhalten von setreading etwas geändert hat bzw. es mit gewissen Versionen Probleme gab/gibt. Ich kann mich dunkel an entsprechende Themen hier im Forum erinnern, finde sie aber auf die Schnelle nicht.
Sorry, hier das list:
Internals:
INTERVAL 300
LAST_POLL 2016-08-17 10:46:51
NAME wz_CO20
NOTIFYDEV global
NR 223
NTFY_ORDER 50-wz_CO20
STATE gut: 1021 ppm
TYPE CO20
fail 0
manufacturer AppliedSensor
product iAQ Stick
retries 3
seq2 235
seq4 1
tag
timeout 1000
Readings:
2016-08-17 10:46:51 airquality gut
2016-08-17 10:46:51 debug 758
2016-08-17 10:46:51 pwm 373
2016-08-17 10:46:51 r_h 163.47
2016-08-17 10:46:51 r_s 397800
2016-08-17 10:46:51 voc 1021
Attributes:
advanced 1
alias Luftgütesensor
devStateIcon gut.*:control_centr_arrow_up@green
mittel.*:control_centr_arrow_left@yellow
schlecht.*:control_centr_arrow_down@red
event-on-change-reading .*
group Sensoren
icon cul_usb
interval 300
room Anwesenheit,HomeKit,Wohnzimmer
stateFormat airquality: voc ppm
Mit sleep 1 hatte ich auch schon im ersten notify gespielt. Ohne Besserung.
Gruß
Dan
Dieser Versuch funktioniert auch nicht, das notify für airquality wird nicht getriggert.
wz_CO20:voc.* {
my $voc = int(ReadingsVal($NAME,"voc",200));
if ($voc >= 1500 && $voc < 1750)
{
fhem("sleep 1; setreading wz_CO20 airquality mittel");
}
elsif ($voc >= 1750)
{
fhem("sleep 1; setreading wz_CO20 airquality schlecht");
}
else
{
fhem("sleep 1; setreading wz_CO20 airquality gut");
}
fhem("sleep 2; trigger wz_CO20 airquality");
}
Gruß
Dan
Wie aktuell ist denn dein FHEM?
Ich habe mal versucht das ganze mit dummys nachzustellen (ich habe kein CO20 Device) und konnte das Verhalten nicht nachvollziehen. Die sub lasse ich einfach etwas loggen. Ist die Ursache ggf. im CO20 Device zu suchen?
Sag mal, ist es ggf. so, dass sich airquality gar nicht ändert? Wenn event-on-change... gesetzt ist, triggert nichts, falls die Werte von voc nicht die Schwellwerte überschreiten.
Hab die Funktion im ersten notify nun mal verändert, aber eigentlich passiert das selbe wie vorher. Nun wird aber scheinbar das zweite notify getriggert, zumindest wird 1 Sekunden nach dem voc notify nun auch das airquality notify getriggert:
wz_CO20:voc.* {
my $voc = int(ReadingsVal($NAME,"voc",200));
my $val;
$val = "gut" if ($voc < 1500);
$val = "mittel" if ($voc >= 1500 && $voc < 1750);
$val = "schlecht" if ($voc >= 1750);
fhem("sleep 1; setreading wz_CO20 airquality $val");
}
Da ich gerade nicht zu Hause bin kann nicht richtig testen ob auch geschaltet wird. Aber da das notify nun getriggert wird gehe ich davon aus dass die Sub auch läuft.
Ich lasse es nun erst einmal so und teste heute Abend ausführlicher.
Verstehen tue ich es trotzdem nicht, da zwar die Funktion ein Wenig anders aufgebaut ist, aber am Ende genau das selbe macht.
Ohne das sleep scheint es aber nicht zu funktionieren.
@marvin78: FHEM ist tagesaktuell und event-on-change-reading habe ich zum Testen entfernt. event-on-change-reading muss aber später wieder rein, da ja nur die Sub aufgerufen werden soll wenn sich der Wert wirklich ändert. Sonst hätte ich mir das extra Reading sparen können und gleich auf voc prüfen können (was sich alle 5 min ändert).
Gruß
Dan
kommt mir irgendwie bekannt vor. :)
versuch mal userreading statt notify/setreading für airquality.
https://forum.fhem.de/index.php/topic,26826.msg198009.html#msg198009 (https://forum.fhem.de/index.php/topic,26826.msg198009.html#msg198009)
Zitat von: frank am 17 August 2016, 12:06:37
kommt mir irgendwie bekannt vor. :)
versuch mal userreading statt notify/setreading für airquality.
https://forum.fhem.de/index.php/topic,26826.msg198009.html#msg198009 (https://forum.fhem.de/index.php/topic,26826.msg198009.html#msg198009)
Danke für den Tipp! Werde ich probieren...
Nur wie gesagt, es funktionierte bereits wochenlang mit meiner alten Funktion und setreading.
Gruß
Dan
Deswegen hatte ich das sleep vorgeschlagen, weil mir sowas auch bekannt vorkam. Damit verlässt man das notify sozusagen. Meine Vermutung waren zwar Timingprobleme aber im Grunde ist das Vorgehen das gleiche.
userReadings ist hier aber ohnehin eigentlich das Mittel der Wahl. setreading wäre nur nötig, wenn es sich um unterschiedliche Devices handelt. Siehe meinen Hinweis oben.
BTW: Interessant ist auch, dass meine dummy Nachstellung funktioniert....
ZitatBTW: Interessant ist auch, dass meine dummy Nachstellung funktioniert....
ich nutze das vorgehen teilweise trotzdem noch, da es seltsamer weise meistens/häufig doch funktioniert.
aber vielleicht sollte ich diese notify nun mal intensiver kontrollieren.
Kann mir mal eben bitte einer helfen das vorherige notify in ein userreading zu verwandeln? Ich stelle mich irgendwie an...
attr wz_CO20 userReadings
airquality:voc {
my $voc = int(ReadingsVal("wz_CO20","voc",200));
my $val;
$val = "gut" if ($voc < 1500);
$val = "mittel" if ($voc >= 1500 && $voc < 1750);
$val = "schlecht" if ($voc >= 1750);
return $val;
}
So klappt es nicht!
Wie gebe ich denn den Wert von $val zurück?
Gruß
Dan
Packe es einfach in eine sub der myUtils. Trigger funktionieren wie im NOTIFY. Achte also auf korrektes Regex.
userReadings kennt übrigens $name und für numerische Werte gibt es ReadingsNum.
Danke für die Tipps.
Habe es nun mit einem userreading und eigener Sub hinbekommen.
Fertig kann es dann so aussehen:
list CO20:
Internals:
INTERVAL 300
LAST_POLL 2016-08-19 07:48:34
NAME wz_CO20
NOTIFYDEV global
NR 223
NTFY_ORDER 50-wz_CO20
STATE gut: 941 ppm
TYPE CO20
fail 0
manufacturer AppliedSensor
product iAQ Stick
retries 3
seq2 213
seq4 1
tag
timeout 1000
Readings:
2016-08-19 07:48:34 airquality gut
2016-08-19 07:48:34 debug 758
2016-08-19 07:48:34 pwm 369
2016-08-19 07:48:34 r_h 163.47
2016-08-19 07:48:34 r_s 408222
2016-08-19 07:48:34 voc 941
Attributes:
advanced 1
alias Luftgütesensor
devStateIcon gut.*:control_centr_arrow_up@green mittel.*:control_centr_arrow_left@yellow schlecht.*:control_centr_arrow_down@red
event-on-change-reading airquality,voc
group Sensoren
icon cul_usb
interval 300
room Anwesenheit,HomeKit,Wohnzimmer
stateFormat airquality: voc ppm
userReadings airquality:voc.* {CO20voc()}
Und die Sub in 99_myUtils.pm:
sub CO20voc(;$)
{
my ($name) = @_;
$name = "wz_CO20" if (!defined($name));
my $voc = int(ReadingsVal($name,"voc",200));
my $val;
$val = "gut" if ($voc < 1500);
$val = "mittel" if ($voc >= 1500 && $voc < 2000);
$val = "schlecht" if ($voc >= 2000);
return $val;
}
Danke für Eure Hilfe!
Dann muss ich wohl meine Glatteiswarnung vom Außensensor auch auf userreading statt notify umstellen...
Gruß
Dan