NEWS
Wunderground Wetter Abfrage über script
-
Hi,
da ich ja gerade dabei sind meine Programme nach und nach von der CCU zu migrieren kam jetzt Wunderground dran.
Ich habe mir eine Station in der Nähe gesucht und diese Station liefert die Ergebnisse.
Das script muss entsprechend angepasst werden mit:
persönlicher Key ( muss bei Wunderground bezogen werden)
und station ID - der Station die die Ergebnisse liefern soll
Folgende Wetterbedingungen werden geliefert:
Aktualisierung = datum der Wunderground Aktualisierung
Bedingungen = Beschreibung des aktuellen Wetters
Temperatur in celsius
Wetter_Wind_kmh' - Wind Geschwindigkeit
Windboeen - Geschwindigkeit in Boeen
Windrichtung
Windbedingungen - Beschreibungen der Windbedingungen
Luftdruck'
Luftdrucktrend + 0 -
Luftfeuchte
spezielle Widgets habe ich dazu nicht.
Ich hoffe, dass es der eine oder andere brauchen kann.
vG Looxer
// Abfrage Wunderground // Key und station id müssen über Wunderground bezogen werden // # Update der Daten auf wunderground erfolgt immer zur vollen Stunde - abhängig von der Station // bitte eintragen var key = "xxxxxxxxxxxxxxx"; var station = "yyyyyyyyyyyy"; createState('Wunderground.Wetter_Aktualisierung'," "); createState('Wunderground.Wetter_Bedingungen', " "); createState('Wunderground.Wetter_Temperatur_C'," "); createState('Wunderground.Wetter_Wind_kmh'," "); createState('Wunderground.Wetter_Windboeen'," "); createState('Wunderground.Wetter_Windrichtung'," "); createState('Wunderground.Wetter_Windbedingungen'," "); createState('Wunderground.Wetter_Luftdruck'," "); createState('Wunderground.Wetter_Luftdrucktrend'," "); createState('Wunderground.Wetter_Luftfeuchte'," "); var request = require('request'); var startAktualisierung = "<observation_time>Last Updated on "; // letzter update start var endAktualisierung = "</observation_time>"; // letzter update end var startBedingungen = "<weather>"; // start wetterbedingungen var endBedingungen = "</weather>"; // ende wetterbedingungen var startTemperatur_C = "<temp_c>"; // start temperatur # ZAHL var endTemperatur_C = "</temp_c>"; //ende temperatur # ZAHL var startWind_kmh = "<wind_kph>"; // ende Windgeschwindigkeit # ZAHL var endWind_kmh = "</wind_kph>"; // ende Windgeschwindigkeit # ZAHL var startWindboeen = "<wind_gust_kph>"; // Windboeengeschwindigkeit # ZAHL var endWindboeen = "</wind_gust_kph>"; // Windboeengeschwindigkeit # ZAHL var startWindrichtung = "<wind_dir>"; // windrichtung var endWindrichtung = "</wind_dir>"; // windrichtung var startWindbedingungen = "<wind_string>"; // windbedingungen var endWindbedingungen = "</wind_string>"; // windbedingungen var startLuftdruck = "<pressure_mb>"; // Luftdruck #ZAHL var endLuftdruck = "</pressure_mb>"; // Luftdruck #ZAHL var startLuftdrucktrend = "<pressure_trend>"; //Luftdrucktrend var endLuftdrucktrend = "/pressure_trend>"; //Luftdrucktrend var startLuftfeuchte = "<relative_humidity>"; //Luftfeuchte var endLuftfeuchte = "</relative_humidity>"; //Luftfeuchte var url = "http://api.wunderground.com/api/" + key + "/conditions/lang:DL/q/pws:" + station + ".xml"; var position = 0; var start_position = 0; var end_position = 0; var data_length = 0; schedule("*/30 * * * *", function () { // alle 30 Minuten request(url, function (error, response, body) { if (!error && response.statusCode == 200) { start_position = body.indexOf(startAktualisierung) + startAktualisierung.length; // Anfangsposition end_position = body.indexOf(endAktualisierung); // Endeposition data_length = end_position - start_position; var dataAktualisierung = body.substring(start_position, start_position + data_length) ; start_position = body.indexOf(startBedingungen) + startBedingungen.length; // Anfangsposition end_position = body.indexOf(endBedingungen); // Endeposition data_length = end_position - start_position; var dataBedingungen = body.substring(start_position, start_position + data_length) ; log('Bedingungen ' + dataBedingungen , "info"); start_position = body.indexOf(startTemperatur_C) + startTemperatur_C.length; // Anfangsposition end_position = body.indexOf(endTemperatur_C); // Endeposition data_length = end_position - start_position; var dataTemperatur_C = body.substring(start_position, start_position + data_length) ; log('Temperatur_C ' + dataTemperatur_C , "info"); start_position = body.indexOf(startWind_kmh) + startWind_kmh.length; // Anfangsposition end_position = body.indexOf(endWind_kmh); // Endeposition data_length = end_position - start_position; var dataWind_kmh = body.substring(start_position, start_position + data_length) ; log('Wind_kmh ' + dataWind_kmh , "info"); start_position = body.indexOf(startWindboeen) + startWindboeen.length; // Anfangsposition end_position = body.indexOf(endWindboeen); // Endeposition data_length = end_position - start_position; var dataAWindboeen = body.substring(start_position, start_position + data_length) ; log('Windboeen ' + dataAWindboeen , "info"); start_position = body.indexOf(startWindrichtung) + startWindrichtung.length; // Anfangsposition end_position = body.indexOf(endWindrichtung); // Endeposition data_length = end_position - start_position; var dataWindrichtung = body.substring(start_position, start_position + data_length) ; log('Windrichtung ' + dataWindrichtung , "info"); start_position = body.indexOf(startWindbedingungen) + startWindbedingungen.length; // Anfangsposition end_position = body.indexOf(endWindbedingungen); // Endeposition data_length = end_position - start_position; var dataWindbedingungen = body.substring(start_position, start_position + data_length) ; log('Windbedingungen ' + dataWindbedingungen , "info"); start_position = body.indexOf(startLuftdruck) + startLuftdruck.length; // Anfangsposition end_position = body.indexOf(endLuftdruck); // Endeposition data_length = end_position - start_position; var dataLuftdruck = body.substring(start_position, start_position + data_length) ; log('Luftdruck ' + dataLuftdruck , "info"); start_position = body.indexOf(startLuftdrucktrend) + startLuftdrucktrend.length; // Anfangsposition end_position = body.indexOf(endLuftdrucktrend); // Endeposition data_length = end_position - start_position - 1; var dataLuftdrucktrend = body.substring(start_position, start_position + data_length) ; log('Luftdrucktrend ' + dataLuftdrucktrend , "info"); start_position = body.indexOf(startLuftfeuchte) + startLuftfeuchte.length; // Anfangsposition end_position = body.indexOf(endLuftfeuchte); // Endeposition data_length = end_position - start_position; var dataLuftfeuchte = body.substring(start_position, start_position + data_length) ; log('Luftfeuchte ' + dataLuftfeuchte , "info"); setState('javascript.0.Wunderground.Wetter_Aktualisierung', dataAktualisierung); setState('javascript.0.Wunderground.Wetter_Bedingungen', dataBedingungen); setState('javascript.0.Wunderground.Wetter_Temperatur_C', dataTemperatur_C); setState('javascript.0.Wunderground.Wetter_Wind_kmh', dataWind_kmh); setState('javascript.0.Wunderground.Wetter_Windboeen', dataAWindboeen); setState('javascript.0.Wunderground.Wetter_Windrichtung', dataWindrichtung); setState('javascript.0.Wunderground.Wetter_Windbedingungen', dataWindbedingungen); setState('javascript.0.Wunderground.Wetter_Luftdruck', dataLuftdruck); setState('javascript.0.Wunderground.Wetter_Luftdrucktrend', dataLuftdrucktrend); setState('javascript.0.Wunderground.Wetter_Luftfeuchte', dataLuftfeuchte); } else { // if (!error && response.statusCode == 200) { log(error); log('Wunderground nicht erreichbar'); } }); // end of request }); // end of schedule</pressure_trend>
-
irgendwo haperts noch:
log: error script.js.wunderground compile failed: SyntaxError: Unexpected identifier
unmatched '{' in Zeile 52
missing ";" before statement in Zeile 132
expected an identifier and instead saw ")" in Zeile 138
gruss - starfish
-
ups, danke.
Ich hatte manuell ein paar Änderungen gemacht im post wegen persönlicher Daten bei mir im Script.
Sollte jetzt funktionieren.
vG Looxer
-
Danke looxer, jetzt läufts. Ein kleiner Hinweis für Einsteiger, die Objekte müssen vorab erstellt werden, entweder manuell oder durch Einfügen folgender Zeilen am Anfang des scripts:
createState('Wunderground.Wetter_Aktualisierung', ''); createState('Wunderground.Wetter_Aktualisierung', ''); createState('Wunderground.Wetter_Bedingungen', ''); createState('Wunderground.Wetter_Temperatur_C', ''); createState('Wunderground.Wetter_Wind_kmh', ''); createState('Wunderground.Wetter_Windboeen', ''); createState('Wunderground.Wetter_Windrichtung', ''); createState('Wunderground.Wetter_Luftdruck', ''); createState('Wunderground.Wetter_Luftfeuchte', ''); createState('Wunderground.Wetter_Luftdrucktrend', '');
nach dem erstmaligen Aufruf des scripts sind die benötigten Objekte erstellt, dann können die Zeilen wieder entfernt werden (?)
-
danke Starfish,
jap, wieder ein Fehler von mir - die create states sind in meiner Version vorhanden.
ich hatte wohl zu viele Änderungen zu meiner Version versucht einzubauen - wieder was gelernt :oops:
ich habe das Script nochmal angefasst. - oh mann
die create zeilen würde ich allerdings einfach belassen. Sie stören ja nicht, machen es aber im Notfall einfacher.
vG Looxer
-
Morgähn, hab grad dein Script aktiviert.
Bekommst ein "LikeIt", echt super.
Muss mal schauen, inwiefern ich da etwas in meine Umgebung (vis) einbauen kann.
LG Christian
-
Hab es auch schon genutzt. Etwas abgewandelt für mehr als eine Station.
Daumen hoch!
Gruß,
Pix
Gesendet von meinem iPhone mit Tapatalk
-
Danke Euch - das freut mich
@versteckt:Muss mal schauen, inwiefern ich da etwas in meine Umgebung (vis) einbauen kann. `
das wäre klasse, besonders, wenn du es hier posten könntest. Visuell sehen die Dinge ja immer noch anders ausübrigens habe ich gleich in der Nachbarschaft eine Wetterstation, die ich über Wunderground abfrage.
Das erspart die eigene Station und gibt die Möglichkeit auf Wettersituationen (Regen, Wind,Sonne) zu reagieren.
Lohnt sich mal zu schauen was so in der Nähe ist.
vG Looxer
-
Ja genau, bei mir ist eben auch eine ein paar hundert Meter entfernt.
Gesendet von meinem iPhone mit Tapatalk
-
Hallo,
es gibt auch ein hübsches NPM Paket:
schedule("*/10 * * * *", function() { var Wunderground = require('wunderground-api'); var client = new Wunderground('KEY', 'STATIONSNAME'); client.conditions('', function(err, data) { if (err) throw err; //normale Parameter setzen setState("wunderground.aktuelleTemperatur", data.temp_c); setState("wunderground.aktuelleLuftfeuchtigkeit", data.relative_humidity); setState("wunderground.aktuelleWindrichtung", data.wind_dir); setState("wunderground.aktuelleWindgeschwindigkeit", data.wind_gust_kph); setState("wunderground.aktuelleSolarradiation", data.solarradiation); //Zusammenfassen von Bewölkungsabstufungen var condition = data.weather; setState("wunderground.aktuelleWettersituation", condition); if (condition === "Mostly Cloudy" || condition === "Cloudy" || condition === "Partly Cloudy" || condition === "Overcast" || condition === "Scattered Clouds" || condition === "Patches of Fog" || condition === "Fog") { setState("wunderground.aktuelleWettersituation", "Wolken"); } if (condition === "Rain" || condition ==="Chance of Rain" || condition ==="Light Rain" || condition ==="Light Rain Showers") { setState("wunderground.aktuelleWettersituation", "Regen"); } if (condition === "Clear" || condition === "Mostly Sunny" || condition === "Partly Sunny" || condition === "Shallow Fog") { setState("wunderground.aktuelleWettersituation", "Heiter"); } if (condition === "Chance of Snow" || condition === "Snow" || condition === "Light Snow") { setState("wunderground.aktuelleWettersituation", "Schnee"); } }); });
-
Hallo,
eine sehr schöne Lösung. Danke für den Hinweis auf das npm Paket.
Allerdings kann ich die Daten nicht mit einem Stationscode abrufen, sondern nur (wie in der Doku gezeigt) mit einem Städtenamen.
Und warum sind in dieser Zeile die beiden Anführungszeichen?
client.conditions('', function(err, data) {
Ind er Doku stehen da die Optionen drin.
var opts = { key:'your api key here', city:'Washington', state: 'DC' }
Gruß
Pix
EDIT: Die Abfrage über eine Station ist mit diesem Pakt wohl nicht vorgesehen: https://github.com/jaxgeller/node-weath … r/index.js
-
So, jetzt habe ich es anders gemacht:
Das npm-Paket Wunderbar liefert auch Daten von Stationen.
In den Javascript-Einstellungen das Paket eintragen "wunderbar".
Beiliegendes Skript ist für derzeit zwei Stationen.
! ````
/* Wunderground
! liest Weather Underground Wetterdaten per Javascript ein (aber via npm)
http://forum.iobroker.de/viewtopic.php?f=21&t=1936&sid=ed4f119f1b4aeed8d878838bc99be8c6#p20733
Instanz 1
! Mögliche conditions: https://www.wunderground.com/weather/api/d/docs?d=data/conditions
! erstellt: 23.12.2015 von looxer01 http://forum.iobroker.net/viewtopic.php?f=21&t=1936#p16590
26.12.2015 angepasst von pix
07.01.2016 Optin Generalschalter
29.02.2016 auf npm wunderbar umgestellt
*/
! var instanz = 'javascript.1' + '.';
var pfad = 'Wunderground' + '.';
! // Abfrage Wunderground
// Key und station id müssen über Wunderground bezogen werden
// # Update der Daten auf wunderground erfolgt immer zur vollen Stunde - abhängig von der Station
! // bitte eintragen
var apikey = "APIKEYEINTRAGEN";
! var wundergroundstation = [];
wundergroundstation[0] = "XXXXXXXXX"; //Station 1 eintragen
wundergroundstation[1] = "XXXXXXXXX"; //Station 2 eintragen ....
! var logging = false;// Ab hier mal nix ändern.....
! createState(pfad + 'Optin', true, {
name: 'Optin Wunderground Daten abrufen',
desc: 'Sollen Weather Underground Daten aus dem Internet geladen werden?',
type: 'boolean',
read: true,
write: true
});
var idOptin = instanz + pfad + 'Optin';
! function vereinfacheBedingungen (condition) {
var kurz = '',
de = '';
switch (condition) {
case "Mostly Cloudy":
de = 'überwiegend wolkig';
kurz = 'Wolken';
break;
case "Cloudy":
de = 'wolkig';
kurz = 'Wolken';
break;
case "Partly Cloudy":
de = 'teils wolkig';
kurz = 'Wolken';
break;
case "Scattered Clouds":
de = 'vereinzelte Wolken';
kurz = 'Wolken';
break;
case "Patches of Fog":
de = 'Nebelfelder';
kurz = 'Wolken';
break;
case "Fog":
de = 'Nebel';
kurz = 'Wolken';
break;
default:
kurz = 'Wolken';
break;
case "Rain":
de = 'Regen';
kurz = 'Regen';
break;
case "Chance of Rain":
de = 'Regen-Wahrscheinlichkeit';
kurz = 'Regen';
break;
case "Light Rain":
de = 'leichter Regen';
kurz = 'Regen';
break;
case "Light Rain Showers":
de = 'leichte Regenschauer';
kurz = 'Regen';
break;
case "Clear":
de = 'klar';
kurz = 'heiter';
break;
case "Mostly Sunny":
de = 'meist sonnig';
kurz = 'heiter';
break;
case "Partly Sunny":
de = 'teils sonnig';
kurz = 'heiter';
break;
case "Shallow Fog":
de = 'Bodennebel';
kurz = 'heiter';
break;
case "Chance of Snow":
de = 'Schneefall-Wahrscheinlichkeit';
kurz = 'Schnee';
break;
case "Snow":
de = 'Schneefall';
kurz = 'Schnee';
break;
case "Light Snow":
de = 'leichter Schneefall';
kurz = 'Schnee';
break;
}
return {
'vereinfacht' : kurz,
'deutsch' : de
};
}
! function abfrageDaten(station) {
! createState(pfad + station + '.Aktualisierung', " ", {
name: 'Wunderground - letzte Aktualisierung',
read: true,
write: true,
type: 'string'
});
createState(pfad + station + '.Bedingungen', " ", {
name: 'Wunderground - Bedingungen',
read: true,
write: true,
type: 'string'
});
createState(pfad + station + '.Temperatur_C', 0, {
name: 'Wunderground - Temperatur',
read: true,
write: true,
type: 'number',
unit: '°C'
});
createState(pfad + station + '.Temperatur_C_gefuehlt', 0, {
name: 'Wunderground - gefühlte Temperatur',
read: true,
write: true,
type: 'number',
unit: '°C'
});
createState(pfad + station + '.Wind_kmh', 0, {
name: 'Wunderground - Windgeschwindigkeit',
read: true,
write: true,
type: 'number',
unit: 'km/h'
});
createState(pfad + station + '.Windboeen', 0, {
name: 'Wunderground - Windboengeschwindigkeit',
read: true,
write: true,
type: 'number',
unit: 'km/h'
});
createState(pfad + station + '.Windrichtung'," ", {
name: 'Wunderground - Windrichtung',
read: true,
write: true,
type: 'string'
});
createState(pfad + station + '.Windbedingungen'," ", {
name: 'Wunderground - Windbedingungen',
read: true,
write: true,
type: 'string'
});
createState(pfad + station + '.Luftdruck', 0, {
name: 'Wunderground - Luftdruck',
read: true,
write: true,
type: 'number',
unit: 'mb'
});
createState(pfad + station + '.Luftdrucktrend'," ", {
name: 'Wunderground - Luftdrucktrend',
read: true,
write: true,
type: 'string'
});
createState(pfad + station + '.Luftfeuchte', 0, {
name: 'Wunderground - Luftfeuchte (relativ)',
read: true,
write: true,
type: 'number',
unit: '%'
});
createState(pfad + station + '.Sichtweite', 0, {
name: 'Wunderground - Sichtweite',
read: true,
write: true,
type: 'number',
unit: 'km'
});
! try {
var Wunderground = require('wunderbar');
var client = new Wunderground(apikey);
client.conditions(station, function(err, data) {
if (err) throw err;
else {
setState(instanz + pfad + station + '.Aktualisierung', data.observation_time);
setState(instanz + pfad + station + '.Bedingungen', vereinfacheBedingungen(data.weather).deutsch);
setState(instanz + pfad + station + '.Temperatur_C', data.temp_c);
setState(instanz + pfad + station + '.Temperatur_C_gefuehlt', data.feelslike_c);
setState(instanz + pfad + station + '.Wind_kmh', data.wind_gust_kph);
setState(instanz + pfad + station + '.Windboeen', data.degrees);
setState(instanz + pfad + station + '.Windrichtung', data.wind_dir);
setState(instanz + pfad + station + '.Windbedingungen', data.wind_string);
setState(instanz + pfad + station + '.Luftdruck', data.pressure_mb);
setState(instanz + pfad + station + '.Luftdrucktrend', data.pressure_trend);
setState(instanz + pfad + station + '.Luftfeuchte', data.relative_humidity);
setState(instanz + pfad + station + '.Sichtweite', data.visibility_km);
}
});
! } catch(fehler_try) {
log(fehler_try);
}
! }
! schedule("1,16,31,46 * * * *", function () { // alle 15 Minuten
abfrageDaten(wundergroundstation[0]);
}); // end of schedule
! schedule("2,17,32,47 * * * *", function () { // alle 15 Minuten
abfrageDaten(wundergroundstation[1]);
}); // end of schedule
! // bei Skriptstart
abfrageDaten(wundergroundstation[0]);
! ````Ich habe die Vereinfachung der Wetterbedingungen gleich noch in eine Übersetzung gepackt. Man kann mit
<size size="85">setState(instanz + pfad + station + '.Bedingungen', vereinfacheBedingungen(data.weather).deutsch);</size>
die deutsche Übersetzung oder mit
<size size="85">setState(instanz + pfad + station + '.Bedingungen', vereinfacheBedingungen(data.weather).kurz);</size>
die Kurzform (auch auf deutsch) abfragen
Gruß
Pix
-
Hallo Pix,
habe nun folgendes gemacht:
1. $ npm install wunderbar
2. Unter Instanzen > javascript.0 > Konfiguration > Zusätzliche NPM-Module wunderbar eingetragen
3. Unter Skripte das von dir beiligende Skript eingefügt
Das Log bringt folgendes:
! javascript.0 2017-02-18 14:31:00.616 warn State "javascript.1.Wunderground.IHHENKIR12.Sichtweite" not found
! javascript.0 2017-02-18 14:31:00.616 warn State "javascript.1.Wunderground.IHHENKIR12.Luftfeuchte" not found
! javascript.0 2017-02-18 14:31:00.615 warn State "javascript.1.Wunderground.IHHENKIR12.Luftdrucktrend" not found
! javascript.0 2017-02-18 14:31:00.615 warn State "javascript.1.Wunderground.IHHENKIR12.Luftdruck" not found
! javascript.0 2017-02-18 14:31:00.615 warn State "javascript.1.Wunderground.IHHENKIR12.Windbedingungen" not found
! javascript.0 2017-02-18 14:31:00.614 warn State "javascript.1.Wunderground.IHHENKIR12.Windrichtung" not found
! javascript.0 2017-02-18 14:31:00.614 warn State "javascript.1.Wunderground.IHHENKIR12.Windboeen" not found
! javascript.0 2017-02-18 14:31:00.614 warn State "javascript.1.Wunderground.IHHENKIR12.Wind_kmh" not found
! javascript.0 2017-02-18 14:31:00.613 warn State "javascript.1.Wunderground.IHHENKIR12.Temperatur_C_gefuehlt" not found
! javascript.0 2017-02-18 14:31:00.613 warn State "javascript.1.Wunderground.IHHENKIR12.Temperatur_C" not found
! javascript.0 2017-02-18 14:31:00.613 warn State "javascript.1.Wunderground.IHHENKIR12.Bedingungen" not found
! javascript.0 2017-02-18 14:31:00.612 warn State "javascript.1.Wunderground.IHHENKIR12.Aktualisierung" not foundHabe ich etwas falsch gemacht oder hat hier Wunderground etwas geändert?
-
Hi Bob
Da Du auf einen einjährigen Post reagierst, wollte ich es mir nicht nehmen lassen, Dich darüber zu informieren, dass mittlerweile ein Weatherunderground Adapter geführt wird. Denn kann man benutzen, muss man aber nicht
-
Das Script ist für javascript.1 eingestellt. Bei dir läuft es unter der Instanz 0.
Du musst ganz oben im Script die Instanz anpassen.
-
Hi Bob
Da Du auf einen einjährigen Post reagierst, wollte ich es mir nicht nehmen lassen, Dich darüber zu informieren, dass mittlerweile ein Weatherunderground Adapter geführt wird. Denn kann man benutzen, muss man aber nicht `
Oh man, den Adapter hab ich echt übersehen :roll: Aber danke für den Tip!
` > Das Script ist für javascript.1 eingestellt. Bei dir läuft es unter der Instanz 0.
Du musst ganz oben im Script die Instanz anpassen. `
Auch danke dafür. Damit läuft das Skript. Und ich hab wieder was dazugerlernt