NEWS
[gelöst] gefühlte Temperatur
-
@paul53
Sieht aber äußerst strange aus.
Aber Du bist der Fachmann - ich gebe zu: Ich lerne noch.Ich finde das hier durchaus besser lesbar:
13.12 + (0.6215 * temp) - Math.pow((11.37 * wind), 0.16) + Math.pow((0.3965 * temp * wind), 0.16)
-
Was ist noch falsch?
function Start() { Berechne(); }function gefühlteTemperatur(temp, wind){ var t =temp var v = wind var w = 13.12+(0.6215*t)-11.37*v**0.16+0.3965*t*v**0.16; return w; } function Berechne(){ var t = parseFloat( getState("netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.02-00-00-90-bd-80.Temperature.Temperature").val); var v =parseFloat( getState("netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.06-00-00-06-b3-3a.Wind.WindStrength").val); var w = gefühlteTemperatur(t,v); setState("0_userdata.0.Hausdaten.gefühlte_Temperatur",Math.round(w * 10) / 10); } schedule("*/5 * * * *",function(){ Start(); });
-
@peter666666
Vorschlag:function windchill(temp, wind) { return 13.12 + 0.6215 * temp + (0.3965 * temp - 11.37) * Math.pow(wind, 0.16); } on({id: [].concat(['netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.02-00-00-90-bd-80.Temperature.Temperature']) .concat(['netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.06-00-00-06-b3-3a.Wind.WindStrength']), change: "ne"}, async function (obj) { var temp = parseFloat(getState("netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.02-00-00-90-bd-80.Temperature.Temperature").val); var wind = parseFloat(getState("netatmo.0.631f3d2edc4bfdce530a3d09.70-ee-50-90-bd-7e.06-00-00-06-b3-3a.Wind.WindStrength").val); setState("0_userdata.0.Hausdaten.gefühlte_Temperatur", Math.round(windchill(temp, wind) * 10) / 10, true); });
Vielleicht hat @paul53 ja einen besseren
P.S.: Ich würde grundsätzlich auf Umlaute verzichten. Sowohl in JS als auch bei den ID's der Datenpunkte.
Edit: Formel korrigiert (Quelle: https://de.wikipedia.org/wiki/Windchill)
-
@codierknecht sagte: Ich würde grundsätzlich auf Umlaute verzichten. Sowohl in JS als aich bei den ID's der Datenpunkte.
Ich auch.
In der Berechnung würde ich den Exponenten nur einmal verwenden:
return 13.12 + 0.6215 * t + (0.3965 * t - 11.37) * Math.pow(v, 0.16);
oder
return 13.12 + 0.6215 * t + (0.3965 * t - 11.37) * v ** 0.16;
@Codierknecht Du wirst feststellen, dass Deine Formel anders aussieht.
-
@codierknecht danke. Habe die Umlaute entfernt und habe das Skript kopiert & mal gestartet - Keine Fehlermeldung aber "0_userdata.0.Hausdaten.gefühlte_Temperatur" noch leer. Mal schauen ob in ein paar Minuten ein Wert unter "0_userdata.0.Hausdaten.gefuehlte_Temperatur" steht.
-
@peter666666 sagte in gefühlte Temperatur:
@codierknecht danke. Habe die Umlaute entfernt und habe das Skript mal gestartet - Keine Fehlermeldung aber "0_userdata.0.Hausdaten.gefühlte_Temperatur" noch leer. Mal schauen ob in ein paar Minuten ein Wert unter "0_userdata.0.Hausdaten.gefuehlte_Temperatur" steht.
Da sollte etwas stehen, sobald sich einer der beiden Eingangswerte ändert.
-
@codierknecht danke, werde berichten. Leider schmiert der Fernzugriff über die Cloud immer ab wegen zu vieler Anfragen oder so. Jetzt muss ich immer 5 Minuten warten bevor ich mich wieder verbinden kann. Den Fehler muss ich erst Googlen.
-
@paul53 sagte in gefühlte Temperatur:
Du wirst feststellen, dass Deine Formel anders aussieht.
Solange das Ergebnis stimmt, soll's mir persönlich Wurscht sein.
Ich bin noch dabei herauszufinden, wie und wo Du da gekürzt hast. Mathematik dieser Kategorie hatte ich zuletzt vor vielleicht 30 Jahren - das fluppt nicht mehr so gut -
@peter666666 Hi bei mir funktioniert deine Methode. Der einzige Unterschied den ich zwischen mir und dir entdecken kann sind die doppelten Hochkommas bei der Stateauswahl. Probier's mal mit einfachen Singleticks.
function Start() { Berechne(); } function GefuehlteTemperatur(temp, wind){ var t =temp var v = wind var w = 13.12+(0.6215*t)-11.37*v**0.16+0.3965*t*v**0.16; return w; } function Berechne(){ var t = parseFloat( getState('netatmo.0.xxx.70-ee-50-03-da-44.02-00-00-03-d7-bc.Temperature.Temperature'/*Temperature*/).val); var v =parseFloat( getState('netatmo.0.xxxc.70-ee-50-03-da-44.06-00-00-00-1e-82.Wind.WindStrength'/*Wind strength*/).val); var w = GefuehlteTemperatur(t,v); log('Gefühlte Temperatur: ' + Math.round(w * 10) / 10 + ' °C'); } Start();
-
@peter666666 Versteh ich nicht, der Adapter kriegt doch die Daten geliefert, ich glaub so alle 10 Minuten. Das sollte dann so funktionieren wie @Codierknecht es vorgeschlagen hat.
-
Deine Formel ist richtig. Sie wird in verschiedenen Beiträgen im www falsch dargestellt.EDIT: Formel ist falsch.
-
-
@codierknecht Dein Skript habe ich auch versucht. userData bleibt aber leer. Irgendwas mach ich falsch
-
@peter666666 sagte in gefühlte Temperatur:
@johgre Wenn ich es so mache kommen einige Warnungen:
Dein Script heist noch Gef
ü
hlte_Außentemperatur. Ändere das mal -
@peter666666
Heissen Deine DP tatsächlichnetatmo.0.xxx...
? -
@paul53
Die Formel hatte ich hier gefunden:
https://homematic-forum.de/forum/viewtopic.php?t=50821#p509661 -
@codierknecht sagte in gefühlte Temperatur:
@peter666666
Heissen Deine DP tatsächlichnetatmo.0.xxx...
?nein, die schauen schon so aus wie deine. In den Objekt.States stehen aber schon Werte drinnen?
-
@codierknecht sagte: Die Formel hatte ich hier gefunden:
Das entspricht nicht dieser Formel, die man meistens findet. Der Exponent von 0,16 wirkt nur auf die Windgeschwindigkeit.
-
@johgre ja da stehen die gemessenen Werte drinnen.
-
@peter666666 sagte in gefühlte Temperatur:
@johgre ja da stehen die gemessenen Werte drinnen.
Probier das mal und benenne das Script mal um.
function Start() { Berechne(); } function GefuehlteTemperatur(temp, wind){ log('temp: ' + temp + ' wind: ' + wind); var t =temp var v = wind var w = 13.12+(0.6215*t)-11.37*v**0.16+0.3965*t*v**0.16; return w; } function Berechne(){ var t = parseFloat( getState('netatmo.0.5ea0208a5f0d9668fe02b62c.70-ee-50-03-da-44.02-00-00-03-d7-bc.Temperature.Temperature'/*Temperature*/).val); log('Temperatur: ' + t); var v =parseFloat( getState('netatmo.0.5ea0208a5f0d9668fe02b62c.70-ee-50-03-da-44.06-00-00-00-1e-82.Wind.WindStrength'/*Wind strength*/).val); log('WindStrength: ' + v); var w = GefuehlteTemperatur(t,v); log('Gefühlte Temperatur: ' + Math.round(w * 10) / 10 + ' °C'); } Start();
da müssen die Log-Statements was ausgeben.