[gelöst] CO20 notify tut es nicht mehr

Begonnen von DeeSPe, 17 August 2016, 07:59:28

Vorheriges Thema - Nächstes Thema

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

Schade, das du das notify, um das es geht nicht gepostet hast.

Was sagt denn der Eventmonitor?

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

Was mich am Event wundert, ist dass es keinen Wert hat. Man sieht nur das Reading, nicht aber den Wert.

DeeSPe

Genau das wundert mich auch.
Allerdings "trigger wz_CO20 airquality" hat ja auch keinen Wert und das notify greift.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

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) }

DeeSPe

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.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

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);
}

DeeSPe

#8
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.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

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.

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

marvin78

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.

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

frank

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
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html