NEWS
Berechnung der abs. Luftfeuchte - komisches Verhalten
-
Guten Morgen zusammen
Ich benötige eure Hilfe, denn ich komme nicht mehr weiter. Bevor ich zu meinem Problem komme, erst einmal der Ist-Zustand und eine kurze Erläuterung dazu.
Ich habe bis vor zwei Wochen den Accuweather Adapter verwendet, um die Wetterdaten und eine Berechnung der absoluten Luftfeuchte in meiner Lovelace UI anzeigen zu lassen. Da die Anzeige der Accuweather Daten im Lovelace nicht einwandfrei funktionierte, bin ich nun auf den Adapter DasWetter umgestiegen. Mit diesem klappt die Wetteranzeige im Lovelace einwandfrei, aber die Berechnung der absoluten Luftfeuchte klappt aus irgendeinem Grund nicht vernünftig.
Für diese Berechnung habe ich folgenden Code verwendet:
on({id: new RegExp('daswetter.0.NextHours.Location_1.Day_1.current.temp_value' + "|" + 'daswetter.0.NextHours.Location_1.Day_1.current.humidity_value'), change: "ne"}, function (obj) { setStateDelayed("javascript.0.Luftfeuchtigkeit.OutdoorAbsoluteHumidity", Math.round(((6.112 * Math.pow(Math.E, ((17.67 * getState("daswetter.0.NextHours.Location_1.Day_1.current.temp_value").val) / (getState("daswetter.0.NextHours.Location_1.Day_1.current.temp_value").val + 243.5))) * getState("daswetter.0.NextHours.Location_1.Day_1.current.humidity_value").val * 2.1674)) / (273.15 + getState("daswetter.0.NextHours.Location_1.Day_1.current.temp_value").val) * 100) / 100, 5000, false); });
Jedoch wurde dann die Variable "javascript.0.Luftfeuchtigkeit.OutdoorAbsoluteHumidity" mit einem unplausiblen Wert beschrieben. Ich habe dann rum gerätselt, was es sein könnte und am Ende kann es nur sein, dass die an die BErechnung übergebenen Werte nicht richtig sind.
Wie man sehen kann, steht der Wert der Variable auf 3,45g/m³ und die Ausgangswerte von DasWetter auf 70% bzw. 20°C. Wenn ich mit diesem Wert auf jeweils einen der Ausgangswerte zurück rechne, kommt folgendes raus.
Bei dieser Rechnung wurde 3,45g/m³ und 20°C eingegeben und es würde eine rel. Luftfeuchte von 20% raus kommen, was unrealistisch ist.Ich habe dann die Werte von DasWetter mal mit einem 5 Sekunden Delay in eine neue Variable geschrieben (siehe Code unten), aber das Problem bleibt das gleich. Wobei ich nicht weiß, wann das verzögerte schreiben einer Variable den Wert ermittelt... direkt beim ausführen des Befehls oder erst nachdem das Delay abgelaufen ist?!?
Kurios wird es aber, wenn ich die Variable "javascript.0.Luftfeuchtigkeit.OutdoorTemperature" erneut auf die Temperatur schreibe (in diesem Fall steht vorher 20 drin und ich setze noch einmal die 20), wird die Berechnung sauber durchgeführt. Wenn ich das ganze mit der rel. Luftfeuchte mache, bleibt alles beim alten. Also ist irgendetwas mit dem Wert der Temperatur im argen.
Aber hier nun der Code den ich aktuell im ioBroker drin habe. Vielleicht erkennt ja jemand das Problem und kann mir helfen.
createState(`javascript.0.Luftfeuchtigkeit.OutdoorAbsoluteHumidity`, { name: `Absolute Luftfeuchtigkeit`, type: `number`, read: true, write: false, unit: `g/m³` }); createState(`javascript.0.Luftfeuchtigkeit.OutdoorTemperature`, { name: `Temperatur Außen`, type: `number`, read: true, write: true, default: `0`, min: `-30`, max: `40` }); createState(`javascript.0.Luftfeuchtigkeit.OutdoorRelativeHumidity`, { name: `Rel. Luftfeuchte Außen`, type: `number`, read: true, write: true, default: `0`, min: `1`, max: `100` }); on({id: new RegExp('daswetter.0.NextHours.Location_1.Day_1.current.humidity_value' + "|" + 'daswetter.0.NextHours.Location_1.Day_1.current.temp_value'), change: "ne"}, function (obj) { setStateDelayed("javascript.0.Luftfeuchtigkeit.OutdoorTemperature", getState("daswetter.0.NextHours.Location_1.Day_1.current.temp_value").val, 5000, false); setStateDelayed("javascript.0.Luftfeuchtigkeit.OutdoorRelativeHumidity", getState("daswetter.0.NextHours.Location_1.Day_1.current.humidity_value").val, 5000, false); }); on({id: new RegExp('javascript.0.Luftfeuchtigkeit.OutdoorTemperature' + "|" + 'javascript.0.Luftfeuchtigkeit.OutdoorRelativeHumidity'), change: "ne"}, function (obj) { setStateDelayed("javascript.0.Luftfeuchtigkeit.OutdoorAbsoluteHumidity", Math.round(((6.112 * Math.pow(Math.E, ((17.67 * getState("javascript.0.Luftfeuchtigkeit.OutdoorTemperature").val) / (getState("javascript.0.Luftfeuchtigkeit.OutdoorTemperature").val + 243.5))) * getState("javascript.0.Luftfeuchtigkeit.OutdoorRelativeHumidity").val * 2.1674)) / (273.15 + getState("javascript.0.Luftfeuchtigkeit.OutdoorTemperature").val) * 100) / 100, 5000, false); });
Und wie gesagt... mit dem ersten Code (lediglich die Variablen von Accuweather), hat die Berechnung einwandfrei funktioniert.
Gruß aus dem Rheinland.
Tobi -
@dontobi sagte in Berechnung der abs. Luftfeuchte - komisches Verhalten:
Bei dieser Rechnung wurde 3,45g/m³ und 20°C eingegeben und es würde eine rel. Luftfeuchte von 20% raus kommen, was unrealistisch ist.
Ist es nicht.
3,45g sind unrealistisch.Ich kann mich nicht erinnern, das es jemals unter 7g war und höchstens bei 17g.
-
@Homoran Danke für die Antwort. Aber mir ist klar, dass 3,45 unrealistisch ist. Deshalb sind ja auch die 20% unrealistisch. Richtig wäre die Angabe im unteren Bild (nachdem ich die 20 neu eingegeben habe).
-
@dontobi die Lösung ist ganz einfach: Die 20 sind keine Zahl sondern ein String.
Das ist ein Fehler im Adapter.
Du kannst dem entgegen wirken in dem du mit parseInt() den String in eine Zahl umwandelst.Edit: Ich hab dazu ein issue aufgemacht.
-
@Homoran Wie machst du das mit den Pfeilen bezüglich Steigung oder Fallen der Temperaturwertes. Muss man bei dem Pfeil nur den Temperatur Datenpunkt angeben. Oder braucht man für die Auswertung. Ob dieser gestiegen (winkel des Pfeiles) ist ein zweiten Datenpunkt.
-
@Basti97 das sind Widgets mit "indicator"
Die sind aber nur korrekt, wenn der View offen bleibt. -
@Homoran Aso Danke