FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: freetz am 25 März 2018, 10:48:27

Titel: Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 25 März 2018, 10:48:27
Hallo zusammen,

ich habe ein UserReading, das ich wie folgt befülle:
{ if (ReadingsNum("Kueche_oben_Thermostat","temperature",0) >= ReadingsNum("Kueche_oben_Thermostat","desiredTemperature",0)) { return "#FF5050" } else { return "#6699FF" } }

Wenn desiredTemperature ein numerischer Wert ist, ist auch alles klar. Kommt dort aber (wie von dem MAX!-Thermostaten übermittelt" bei zugedrehtem Thermostat ein "off" ist die Rückgabe von ReadingsNum entsprechend leer und FHEM/Perl meckert berechtigterweise, dass ich dann einen leeren String mit dem numerischen >= evaluieren möchte. I
ch hatte gehofft, dass auch bei einem leeren Rückgabewert der Defaultwert von ReadingsNum (hier: "0") greifen würde, aber das tut es dann nicht. Bei ReadingsVal hätte ich das auch noch verstanden, aber bei ReadingsNum (bei dem es ja explizit um einen Rückgabewert als Zahl geht, wäre das vielleicht eine sinnvolle Ergänzung, denn die Berechnung, die mit dem leeren String durchgeführt wird, nimmt ja letztlich Null an (zumindest wenn ich oben zu ReadingsNum noch 0 hinzuaddiere, ist das Ergebnis Null).

Wenn das nicht geht bzw. sinnvoll ist, welche "saubere" Lösung gäbe es dann, die Warnungen im Log zu vermeiden?

Vielen Dank schon mal!

F.
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: betateilchen am 25 März 2018, 10:55:14
Also wenn "off" kommt, willst Du eine 0 zurückhaben? Ist doch ganz einfach.



{ if (ReadingsNum("Kueche_oben_Thermostat","temperature",0) >= (ReadingsNum("Kueche_oben_Thermostat","desiredTemperature",0)?ReadingsNum("Kueche_oben_Thermostat","desiredTemperature",0):0)) { return "#FF5050" } else { return "#6699FF" } }



ungetestet, aber ich denke, der Lösungsansatz wird klar: "Wenn es einen Wert aus ReadingsNum() gibt, nimm diesen, ansonsten nimm 0"
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 25 März 2018, 11:02:03
Vielen Dank für die schnelle Hilfe :)!
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 03:04:12
Nun habe habe ich doch noch ein Problem, und zwar mecker das SVG Modul bei den Plots weiterhin über das "öff". Im Plot selber kann ich das zwar über die entsprechende Konfiguration auf "0" matchen, aber vorher wird der Wert schon für die min/max Berechnung herangezogen. Das einfachste wäre, wenn ich schon auf Reading-Ebene die Werte umformen könnte, wie das bei HTTPMOD ja auch geht, nur weiß ich nicht, ob es da bei anderen Devices (hier: MAX) auch die Möglichkeit gibt?
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 03:15:39
P.S.: Ich weiß, dass ich ein neues UserReading anlegen könnte und dann wie von Betateilchen beschrieben den gleichen Code dafür einsetzen könnte, aber dann hätte ich ein weiteres Reading, was bis auf den "off"-Fall den gleichen Wert hat, das wäre zwar möglich aber auch nicht besonders "elegant" ;). Oder kann man mit UserReadings ein "originales" Reading auch überschreiben?
Weitere Idee: Kann man Werte, bevor sie (in dem Fall über DbLog) geloggt werden, noch modifizieren? Dann wäre das (in meinem Fall) auch eine Lösung...
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: CoolTux am 26 März 2018, 08:07:21

hermostatBadezimmer_Clima:desired-temp:::$val=($val=~'on'?10.5:$val)


Beim Ploteditor setzen. Statt 10.5 kannst auch 0 oder so nehmen. Bleibt Dir überlassen.
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 08:22:00
Ja, das habe ich schon und hatte es weiter oben vielleicht ungeschickt ausgedrückt:
#logdb Kueche_oben_Thermostat:desiredTemperature:::$val=($val=~'off'?0:$val)
Damit wird der Plot wie gesagt korrekt gezeichnet, aber die Warnmeldungen kommen trotzdem jedes Mal, wenn es auf "off" springt, weil vor dieser Umrechnung der min/max-Wert berechnet wird und da dann noch "off" als Grundlage genommen wird:
2018.03.25 11:12:48 1: PERL WARNING: Argument "off" isn't numeric in numeric gt (>) at ./FHEM/98_SVG.pm line 1567.
2018.03.25 11:12:48 1: PERL WARNING: Argument "off" isn't numeric in subtraction (-) at ./FHEM/98_SVG.pm line 1938.
2018.03.25 11:12:48 1: PERL WARNING: Argument "off" isn't numeric in subtraction (-) at ./FHEM/98_SVG.pm line 1939.
2018.03.25 11:12:48 1: PERL WARNING: Argument "off" isn't numeric in sprintf at ./FHEM/98_SVG.pm line 2169.


Aber ich habe jetzt mal ausprobiert, ob man mit UserReadings ein bereits existierendes Reading überschreiben kann, und das scheint zu gehen. Basierend auf Betateilchens Lösungsvorschlag sieht das jetzt so aus:
desiredTemperature { (ReadingsNum("Kueche_oben_Thermostat","desiredTemperature",0)?ReadingsNum("Kueche_oben_Thermostat","desiredTemperature",0):5) }
Wenn desiredTemperature leer ist, wird 5.0 Grad in das Reading desiredTemperature geschrieben (5 Grad, weil "off" bei MAX eigentlich 4.5 Grad sind und das bei MAX die tiefste Temperatur ist).

Jetzt muss ich nur noch schauen, ob zwischen dem Eintreffen des Wertes und der UserReading Umwandlung der "off"-Wert nicht doch noch in die Datenbank geschrieben wird. Dann wäre das natürlich für die Katz...
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: CoolTux am 26 März 2018, 08:45:34
Ich würde sagen das er das wird. Denn es wird auf das Event reagiert und nicht auf das was da ins Reading geschrieben wird. Auch wenn es das selbe ist in den meisten Fällen.
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 08:48:30
Ja, das befürchte ich auch... Naja, ist ja letztlich alles kein Beinbruch, müllt mir halt nur das Log etwas zu (habe oben noch die Fehlermeldung ergänzt, Zeilennummern könnten inzwischen nicht mehr aktuell sein, weil mein letztes Update ein paar Wochen her ist), aber ist letztlich alles noch im Rahmen. Wenn's sich nicht "sauber" lösen lässt, dann ist's halt so...
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 09:15:09
Nachtrag: "Zumüllen" ist wohl übertrieben, in den letzten knapp drei Wochen kam die Fehlermeldung sechs Mal, vermutlich dann, wenn ich mir die Diagramme angeschaut habe, auch gestern noch zwei Mal nach dem Änderungsvorschlag von Betateilchen. Ärgerlicherweise lässt es sich jetzt nicht reproduzieren, obwohl die betroffene Funktion SVG_render ja eigentlich regelmäßig aufgerufen wird. Aber wie gesagt, der Schaden hält sich in Grenzen...
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: frank am 26 März 2018, 09:30:05
schau mal hier:

Zitat
Zitat von: sfancy am 26 Oktober 2017, 13:24:53
DbLog kann auch Werte vor dem speichern filtern und umschreiben.
Schau dir dazu die Commandref von DbLog an. Insbesondere das Attribut valueFn.

Bestehende Werte in der Datenbank löschen oder umschreiben geht leider nur mit SQL-Befehlen.

Bei mir sieht das Attribut valueFn z.B. so aus:


attr LogDB valueFn
{
  if ($DEVICETYPE eq 'GPIO4')
  {
    if ($EVENT eq 'temperature: 85')
    {
      $IGNORE = 1;
    }
  }
  elsif ($DEVICETYPE eq 'CUL_HM')
  {
    if ($READING eq 'desired-temp' && $VALUE eq 'off')
    {
      $VALUE = 4.5;
    }
    elsif ($READING eq 'desired-temp' && $VALUE eq 'on')
    {
      $VALUE = 30.5;
    }
    elsif ($READING eq 'desired-temp' && $VALUE !~ m/^[-+]?[\.\d]/)
    {
      $IGNORE = 1;
    }
  }
}

Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: betateilchen am 26 März 2018, 10:16:05
Zitat von: freetz am 26 März 2018, 08:22:00
Jetzt muss ich nur noch schauen, ob zwischen dem Eintreffen des Wertes und der UserReading Umwandlung der "off"-Wert nicht doch noch in die Datenbank geschrieben wird. Dann wäre das natürlich für die Katz...

Das Reihenfolgeproblem der notify-Loop könnte man aber beeinflussen.
Irgendeinen Sinn muss das Internal NTFY_ORDER ja auch haben ;)

*duck-und-weg*
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 10:57:19
@frank: Danke, an sowas hatte ich auch gedacht, aber nicht gefunden (bzw. in der commandref nicht verstanden ;) ), das werde ich mal ausprobieren.
@betateilchen: NTFY_ORDER habe ich nicht bei den MAX-Devices (kenne das bisher nur von DOIF). Muss ich dafür dann ReadingsChange verwenden?

Danke Euch auf jeden Fall für's Mit-/Nachdenken!
Titel: Antw:Wie Warnung bei leerem ReadingsNum verhindern?
Beitrag von: freetz am 26 März 2018, 18:51:47
Ich habe es jetzt mit ReadingsChange gelöst, weil ich es da nur an einer Stelle ändern kann und es scheint zu funktionieren:
defmod MAX_off_conversion readingsChange _.*hermostat desiredTemperature off 5.0

Danke noch mal an alle!