NEWS
Wo ist der Fehler?
-
@paul53 Du bist der Wahnsinn! Danke schön
-
@paul53
Hat es einen Grund warum du nichtif (wetterdaten <= 1) ausgabe = 1; else if (wetterdaten <= 5) ausgabe = 2; else if (wetterdaten <= 11) ausgabe = 3; else if (wetterdaten <= 19) ausgabe = 4; ...
genommen hast?
-
@ticaki sagte: Hat es einen Grund
Nein, man kann es so oder so machen. Du bist mit der
ausgabe
um 1 zu hoch.let ausgabe = 12; if (wetterdaten <= 1) ausgabe = 0; else if (wetterdaten <= 5) ausgabe = 1; else if (wetterdaten <= 11) ausgabe = 2; else if (wetterdaten <= 19) ausgabe = 3; ...
-
@paul53
hast recht, Danke -
-
wie versprochen hier nun das gesamte angepasste Script:
// ######################################################################### // Wetterdaten aus openweathermap holen und in homematic Variable setzen // ######################################################################### // Aktualisierung der homematic Variable bei Aktualisierung openweathermap on ({id:'weatherunderground.0.forecast.current.observationTimeRFC822'/*Observation time (rfc822)*/, change: 'any'}, function(data) { var wetterdaten; //Werte holen und setzen //Wetter Bedingung als String var idOpenWeater = 'yr.0.forecastHourly.6h.6h_summary_text'/*6h summary text*/; var idVariable = 'hm-rega.0.11465'/*Wetter Bedingungen*/; wetterdaten = getState(idOpenWeater).val if (wetterdaten) setState(idVariable, wetterdaten); //Wetter Richtung als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.windDegrees'/*Wind direction Degrees*/; // log(JSON.stringify(getState(idOpenWeater).val)); var idVariable = 'hm-rega.0.11466'/*Wetter Windrichtg*/; Wetterdatenholenundsetzen(); // wenn keine Daten if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; //Wind Richtung als Angabe var idOpenWeater = 'weatherunderground.0.forecast.current.windDegrees'/*Wind direction Degrees*/; var idVariable = 'hm-rega.0.11467'/*Wetter Windrichtung*/; //******************* Windrichtung bestimmen*************** //*******************Nord 339-23, Nordost 24-68, Ost 69-113, SüdOst 114-158, Süd 159-203, SüdWest 204-248, West 249-293, NordWest 394-338*************** wetterdaten = getState(idOpenWeater).val if (wetterdaten > 23 && wetterdaten <= 68){ wetterdaten = "NordOst"; }; if (wetterdaten > 68 && wetterdaten <= 113){ wetterdaten = "Ost"; }; if (wetterdaten > 113 && wetterdaten <= 158){ wetterdaten = "SüdOst"; }; if (wetterdaten > 158 && wetterdaten <= 203){ wetterdaten = "Süd"; }; if (wetterdaten > 203 && wetterdaten <= 248){ wetterdaten = "SüdWest"; }; if (wetterdaten > 248 && wetterdaten <= 293){ wetterdaten = "West"; }; if (wetterdaten > 293 && wetterdaten <= 338){ wetterdaten = "NordWest"; }; if (wetterdaten > 338 && wetterdaten <= 360){ wetterdaten = "Nord"; }; if (wetterdaten > 0 && wetterdaten <= 23){ wetterdaten = "Nord"; }; if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; if (wetterdaten) setState(idVariable, wetterdaten); //Temperatur als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.temp'/*Temperature*/; var idVariable = 'hm-rega.0.11468'/*Wetter Temperatur*/; Wetterdatenholenundsetzen(); //Luftfeuchtigkeit als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.relativeHumidity'/*Relative humidity*/; var idVariable = 'hm-rega.0.11469'/*Wetter Luftfeuchte*/; Wetterdatenholenundsetzen(); //Windgeschwindigkeit als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.wind'/*Wind speed*/; var idVariable = 'hm-rega.0.11474'/*Wetter Windgeschw*/; Wetterdatenholenundsetzen(); // wenn keine Daten if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; //Wind Geschwindigkeit als Angabe (Beaufort); var idOpenWeater = 'weatherunderground.0.forecast.current.wind'/*Wind speed*/; var idVariable = 'hm-rega.0.11470'/*Wetter Windgeschwindigkeit*/; //******************* Windgeschwindigkeit in Beaufort bestimmen*************** wetterdaten = getState(idOpenWeater).val; if(wetterdaten != null) { let ausgabe = 0; if (wetterdaten > 1) ausgabe = 1; if (wetterdaten > 5) ausgabe = 2; if (wetterdaten > 11) ausgabe = 3; if (wetterdaten > 19) ausgabe = 4; if (wetterdaten > 28) ausgabe = 5; if (wetterdaten > 38) ausgabe = 6; if (wetterdaten > 49) ausgabe = 7; if (wetterdaten > 61) ausgabe = 8; if (wetterdaten > 74) ausgabe = 9; if (wetterdaten > 88) ausgabe = 10; if (wetterdaten > 102) ausgabe = 11; if (wetterdaten > 117) ausgabe = 12; setState(idVariable, ausgabe); } //Luftdruck als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.pressure'/*Air pressure (mbar)*/; var idVariable = 'hm-rega.0.11471'/*Wetter Luftdruck*/; Wetterdatenholenundsetzen(); //Aktualisierung (Zeit) var idOpenWeater = 'weatherunderground.0.forecast.current.observationTimeRFC822'/*Observation time (rfc822)*/; var idVariable = 'hm-rega.0.11472'/*Wetter Aktualisierung*/; wetterdaten = getState(idOpenWeater).val; let ausgabe = formatDate(wetterdaten, 'DD.MM.YYYY hh:mm:ss'); setState(idVariable, ausgabe); // ################################################################## // FUNKTION Holen und setzen // ################################################################## function Wetterdatenholenundsetzen() { wetterdaten = getState(idOpenWeater).val; //if (wetterdaten) setState(idVariable, wetterdaten); if (wetterdaten != null) setState(idVariable, wetterdaten); }; });
Zeilen 179 bis 221 kann man durch eine Zeile ersetzen: ein bisschen traurig bin ich schon, woich mir doch soooviel Mühe gegeben hatte...;-) aber das ist natürlich viel besser.
Durch Prüfung auf != null. Das habe ich so jetzt auch berücksichtigt.
Wo ich noch auf dem Schlauch stehe ist:
Du solltest außerdem die gesamten Abfragen mit etwas Verzögerung (100 ms) starten, da der Trigger "Observation time (rfc822)" nicht als letzter Datenpunkt vom Adapter geschrieben wird. Sonst passen einige Werte nicht zum Zeitpunkt der letzten Abfrage.
a) wie würde die Verzögerung programmiert?
b) der Adapter weatherunderground liefert zwei potentielle trigger, Observation time (rfc822) und Observation time. Mir kommt es hier nicht auf die letzte Akkuratesse an, sondern einfach um die Zeit der Beobachtung und ebe den trigger zur Auslösung des Scripts Welchen sollte ich nehmen? -
@skorpil sagte: wie würde die Verzögerung programmiert?
Alle Daten - außer der Triggerwert selbst - sollten verzögert per getState(id).val geholt werden. Außerdem sollte die Variablendeklaration der 3 immer wieder verwendeten Variablen global ganz zu Anfang erfolgen. Auch die Funktion Wetterdatenholenundsetzen() sollte vor dem Trigger deklariert werden.
// ######################################################################### // Wetterdaten aus openweathermap holen und in homematic Variable setzen // ######################################################################### var idOpenWeater, idVariable, wetterdaten; // ################################################################## // FUNKTION Holen und setzen // ################################################################## function Wetterdatenholenundsetzen() { let wetterwert = getState(idOpenWeater).val; if (wetterwert != null) setState(idVariable, wetterwert); } // Aktualisierung der homematic Variable bei Aktualisierung openweathermap on ('weatherunderground.0.forecast.current.observationTimeRFC822'/*Observation time (rfc822)*/, function(dp) { let ausgabe = formatDate(dp.state.val, 'DD.MM.YYYY hh:mm:ss'); setState('hm-rega.0.11472'/*Wetter Aktualisierung*/, ausgabe); setTimeout(function() { // Hier alle anderen Daten für SV verarbeiten }, 100); // 100 ms Verzögerung });
-
@paul53 dankeschön.
-
@paul53 so?
// ######################################################################### // Wetterdaten aus openweathermap holen und in homematic Variable setzen // ######################################################################### var idOpenWeater, idVariable, wetterdaten; // ################################################################## // FUNKTION Holen und setzen // ################################################################## function Wetterdatenholenundsetzen() { let wetterwert = getState(idOpenWeater).val; if (wetterwert != null) setState(idVariable, wetterwert); } // Aktualisierung der homematic Variable bei Aktualisierung openweathermap on ('weatherunderground.0.forecast.current.observationTimeRFC822'/*Observation time (rfc822)*/, function(dp) { //Aktualisierung (Zeit) let ausgabe = formatDate(dp.state.val, 'DD.MM.YYYY hh:mm:ss'); setState('hm-rega.0.11472'/*Wetter Aktualisierung*/, ausgabe); setTimeout(function() { //Werte holen und setzen //Wetter Bedingung als String var idOpenWeater = 'yr.0.forecastHourly.6h.6h_summary_text'/*6h summary text*/; var idVariable = 'hm-rega.0.11465'/*Wetter Bedingungen*/; wetterdaten = getState(idOpenWeater).val if (wetterdaten) setState(idVariable, wetterdaten); //Wetter Richtung als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.windDegrees'/*Wind direction Degrees*/; // log(JSON.stringify(getState(idOpenWeater).val)); var idVariable = 'hm-rega.0.11466'/*Wetter Windrichtg*/; Wetterdatenholenundsetzen(); // wenn keine Daten if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; //Wind Richtung als Angabe var idOpenWeater = 'weatherunderground.0.forecast.current.windDegrees'/*Wind direction Degrees*/; var idVariable = 'hm-rega.0.11467'/*Wetter Windrichtung*/; //******************* Windrichtung bestimmen*************** //*******************Nord 339-23, Nordost 24-68, Ost 69-113, SüdOst 114-158, Süd 159-203, SüdWest 204-248, West 249-293, NordWest 394-338*************** wetterdaten = getState(idOpenWeater).val if (wetterdaten > 23 && wetterdaten <= 68){ wetterdaten = "NordOst"; }; if (wetterdaten > 68 && wetterdaten <= 113){ wetterdaten = "Ost"; }; if (wetterdaten > 113 && wetterdaten <= 158){ wetterdaten = "SüdOst"; }; if (wetterdaten > 158 && wetterdaten <= 203){ wetterdaten = "Süd"; }; if (wetterdaten > 203 && wetterdaten <= 248){ wetterdaten = "SüdWest"; }; if (wetterdaten > 248 && wetterdaten <= 293){ wetterdaten = "West"; }; if (wetterdaten > 293 && wetterdaten <= 338){ wetterdaten = "NordWest"; }; if (wetterdaten > 338 && wetterdaten <= 360){ wetterdaten = "Nord"; }; if (wetterdaten > 0 && wetterdaten <= 23){ wetterdaten = "Nord"; }; if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; if (wetterdaten) setState(idVariable, wetterdaten); //Temperatur als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.temp'/*Temperature*/; var idVariable = 'hm-rega.0.11468'/*Wetter Temperatur*/; Wetterdatenholenundsetzen(); //Luftfeuchtigkeit als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.relativeHumidity'/*Relative humidity*/; var idVariable = 'hm-rega.0.11469'/*Wetter Luftfeuchte*/; Wetterdatenholenundsetzen(); //Windgeschwindigkeit als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.wind'/*Wind speed*/; var idVariable = 'hm-rega.0.11474'/*Wetter Windgeschw*/; Wetterdatenholenundsetzen(); // wenn keine Daten if (!wetterdaten) { wetterdaten = 0; setState(idVariable, wetterdaten); }; //Wind Geschwindigkeit als Angabe (Beaufort); var idOpenWeater = 'weatherunderground.0.forecast.current.wind'/*Wind speed*/; var idVariable = 'hm-rega.0.11470'/*Wetter Windgeschwindigkeit*/; //******************* Windgeschwindigkeit in Beaufort bestimmen*************** wetterdaten = getState(idOpenWeater).val; if(wetterdaten != null) { let ausgabe = 0; if (wetterdaten > 1) ausgabe = 1; if (wetterdaten > 5) ausgabe = 2; if (wetterdaten > 11) ausgabe = 3; if (wetterdaten > 19) ausgabe = 4; if (wetterdaten > 28) ausgabe = 5; if (wetterdaten > 38) ausgabe = 6; if (wetterdaten > 49) ausgabe = 7; if (wetterdaten > 61) ausgabe = 8; if (wetterdaten > 74) ausgabe = 9; if (wetterdaten > 88) ausgabe = 10; if (wetterdaten > 102) ausgabe = 11; if (wetterdaten > 117) ausgabe = 12; setState(idVariable, ausgabe); } //Luftdruck als Zahl var idOpenWeater = 'weatherunderground.0.forecast.current.pressure'/*Air pressure (mbar)*/; var idVariable = 'hm-rega.0.11471'/*Wetter Luftdruck*/; Wetterdatenholenundsetzen(); }, 100); // 100 ms Verzögerung });
-
@skorpil sagte: so?
Nein, ohne
var
innerhalb der Funktion:// ######################################################################### // Wetterdaten aus openweathermap holen und in homematic Variable setzen // ######################################################################### var idOpenWeater, idVariable, wetterdaten; // ################################################################## // FUNKTION Holen und setzen // ################################################################## function Wetterdatenholenundsetzen() { let wetterwert = getState(idOpenWeater).val; if (wetterwert != null) setState(idVariable, wetterwert); } // Aktualisierung der homematic Variable bei Aktualisierung openweathermap on ('weatherunderground.0.forecast.current.observationTimeRFC822'/*Observation time (rfc822)*/, function(dp) { //Aktualisierung (Zeit) let ausgabe = formatDate(dp.state.val, 'DD.MM.YYYY hh:mm:ss'); setState('hm-rega.0.11472'/*Wetter Aktualisierung*/, ausgabe); setTimeout(function() { //Werte holen und setzen //Wetter Bedingung als String idOpenWeater = 'yr.0.forecastHourly.6h.6h_summary_text'/*6h summary text*/; idVariable = 'hm-rega.0.11465'/*Wetter Bedingungen*/; Wetterdatenholenundsetzen(); //Wetter Richtung als Zahl idOpenWeater = 'weatherunderground.0.forecast.current.windDegrees'/*Wind direction Degrees*/; idVariable = 'hm-rega.0.11466'/*Wetter Windrichtg*/; Wetterdatenholenundsetzen(); //Wind Richtung als Angabe idVariable = 'hm-rega.0.11467'/*Wetter Windrichtung*/; //******************* Windrichtung bestimmen*************** //*******************Nord 339-23, Nordost 24-68, Ost 69-113, SüdOst 114-158, Süd 159-203, SüdWest 204-248, West 249-293, NordWest 394-338*************** wetterdaten = getState(idOpenWeater).val if(wetterdaten != null) { let ausgabe = "Nord"; if (wetterdaten > 23) ausgabe = "NordOst"; if (wetterdaten > 68) ausgabe = "Ost"; if (wetterdaten > 113) ausgabe = "SüdOst"; if (wetterdaten > 158) ausgabe = "Süd"; if (wetterdaten > 203) ausgabe = "SüdWest"; if (wetterdaten > 248) ausgabe = "West"; if (wetterdaten > 293) ausgabe = "NordWest"; if (wetterdaten > 338) ausgabe = "Nord"; setState(idVariable, ausgabe); } //Temperatur als Zahl idOpenWeater = 'weatherunderground.0.forecast.current.temp'/*Temperature*/; idVariable = 'hm-rega.0.11468'/*Wetter Temperatur*/; Wetterdatenholenundsetzen(); //Luftfeuchtigkeit als Zahl idOpenWeater = 'weatherunderground.0.forecast.current.relativeHumidity'/*Relative humidity*/; idVariable = 'hm-rega.0.11469'/*Wetter Luftfeuchte*/; Wetterdatenholenundsetzen(); //Windgeschwindigkeit als Zahl idOpenWeater = 'weatherunderground.0.forecast.current.wind'/*Wind speed*/; idVariable = 'hm-rega.0.11474'/*Wetter Windgeschw*/; Wetterdatenholenundsetzen(); //Wind Geschwindigkeit als Angabe (Beaufort); idVariable = 'hm-rega.0.11470'/*Wetter Windgeschwindigkeit*/; //******************* Windgeschwindigkeit in Beaufort bestimmen*************** wetterdaten = getState(idOpenWeater).val; if(wetterdaten != null) { let ausgabe = 0; if (wetterdaten > 1) ausgabe = 1; if (wetterdaten > 5) ausgabe = 2; if (wetterdaten > 11) ausgabe = 3; if (wetterdaten > 19) ausgabe = 4; if (wetterdaten > 28) ausgabe = 5; if (wetterdaten > 38) ausgabe = 6; if (wetterdaten > 49) ausgabe = 7; if (wetterdaten > 61) ausgabe = 8; if (wetterdaten > 74) ausgabe = 9; if (wetterdaten > 88) ausgabe = 10; if (wetterdaten > 102) ausgabe = 11; if (wetterdaten > 117) ausgabe = 12; setState(idVariable, ausgabe); } //Luftdruck als Zahl idOpenWeater = 'weatherunderground.0.forecast.current.pressure'/*Air pressure (mbar)*/; idVariable = 'hm-rega.0.11471'/*Wetter Luftdruck*/; Wetterdatenholenundsetzen(); }, 100); // 100 ms Verzögerung });
-
@paul53 sagte in Wo ist der Fehler?:
Nein, ohne var innerhalb der Funktion:
Damit ich es verstehe: WARUM?
-
@skorpil sagte: Damit ich es verstehe: WARUM?
Damit die Werte in die globalen Variablen (Zeile 5) für die Übergabe an die Funktion Wetterdatenholenundsetzen() geschrieben werden. Wenn eine Variable mit dem gleichen Bezeichner innerhalb der Trigger-Callback-Funktion neu deklariert wird (var), ist sie nur innerhalb der Callback-Funktion gültig.
-
@paul53 ich verstehe