Погода

Товарищи здравствуйте! Подскажите пожалуйста, взял код на отображение погоды с сервака с вики, но выдает ошибки, подскажете что не так? Брал отсюда Погода с OpenWeatherMap

defineVirtualDevice("weather", { //Виртуальное устройство для записи данных и отправки их в  MQTT
  title: "weather",
  cells: {
    temperature: {
      type: "temperature",
      value: -12.0,
    },
    humidity: {
      type: "temperature",
      value: 75,
    },
    wind: {
      type: "temperature",
      value: 3,
    }
  }
}); 

defineRule("weather_call", {	// регулярный запрос к серверу погоды
  when: cron("@every 1m"),
  then: function() {
    runShellCommand("wget -qO /usr/weather/data.json https://api.openweathermap.org/data/2.5/weather?lat=59.7937&lon=30.1534&appid=802a2************b0de491ae57b64");
    startTimer("wait_weather", 5 * 1000);  		// запустили таймер на задержку для получения данных погоды	
    log("Request sent");
  }
}); 

defineRule("parse_weather", {	// чтение полученных от сервера данных погоды
  when: function() { 
    return timers.wait_weather.firing;
  },
  then: function() {
  	var weather_data = readConfig("/usr/weather/data.json");
    dev["weather"]["temperature"] = format(weather_data.main.temp);
    dev["weather"]["humidity"] = format(weather_data.main.humidity);
    dev["weather"]["wind"] = format(weather_data.wind.speed);
    log("Time: {}".format(weather_data.dt));
    log("Temperature is: {}".format(weather_data.main.temp));
    log("Humidity is: {}".format(weather_data.main.humidity));
    log("Wind speed is: {}".format(weather_data.wind.speed));
  }
});
    log("Weather script updated!");

сервер на запрос отвечает

{“coord”:{“lon”:30.1534,“lat”:59.7937},“weather”:[{“id”:800,“main”:“Clear”,“description”:“clear sky”,“icon”:“01d”}],“base”:“stations”,“main”:{“temp”:291.02,“feels_like”:290.64,“temp_min”:290.91,“temp_max”:291.4,“pressure”:1011,“humidity”:68},“visibility”:10000,“wind”:{“speed”:4.02,“deg”:100,“gust”:0},“clouds”:{“all”:0},“dt”:1693208659,“sys”:{“type”:1,“id”:8926,“country”:“RU”,“sunrise”:1693190672,“sunset”:1693243048},“timezone”:10800,“id”:517512,“name”:“Novoye Koyrovo”,“cod”:200}

wb-rules_20230828T104318.log (4,9 КБ)

Добрый день. А что содержится в файле куда сохраняет wget?

Именно что там пусто…
Файл я не создавал, он сам создался, т.е. путь до файла точный, символы не напутал, но туда ничего не записывается

Ну, собственно это и причина. Так выведите в лог stdout и stderr от runShellCommand - посмотрите что аписано. Предполагаю что wget надо вызывать полным путем.

Попробовал wget с параметром -o, в итоге в файл данные прилетают…

–2023-08-28 20:09:42-- https://api.openweathermap.org/data/2.5/weather?lat=59.7937
Resolving api.openweathermap.org (api.openweathermap.org)… 188.166.16.132, 37.139.20.5, 37.139.1.159, …
Connecting to api.openweathermap.org (api.openweathermap.org)|188.166.16.132|:443… connectGnuTLS: Error in the pull function.
Unable to establish SSL connection.
assword Authentication Failed.

Вроде так не должно быть, ибо в браузере выдает норм данные

{“coord”:{“lon”:30.1534,“lat”:59.7937},“weather”:[{“id”:804,“main”:“Clouds”,“description”:“overcast clouds”,“icon”:“04n”}],“base”:“stations”,“main”:{“temp”:288.91,“feels_like”:289,“temp_min”:288.69,“temp_max”:289.18,“pressure”:1005,“humidity”:94},“visibility”:10000,“wind”:{“speed”:1.79,“deg”:170,“gust”:0},“clouds”:{“all”:100},“dt”:1693253407,“sys”:{“type”:1,“id”:8926,“country”:“RU”,“sunrise”:1693190672,“sunset”:1693243048},“timezone”:10800,“id”:517512,“name”:“Novoye Koyrovo”,“cod”:200}

В файле совершенно тот же json?

wget -qO /tmp/data.json 'https://api.openweathermap.org/data/2.5/weather?lat=59.7937&lon=30.1534&appid=802a29554c4b23fb12b0de491ae57b64'
root@wirenboard-AGH767IU:~# cat /tmp/data.json 
{"coord":{"lon":30.1534,"lat":59.7937},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":291.02,"feels_like":290.74,"temp_min":290.91,"temp_max":291.4,"pressure":1010,"humidity":72},"visibility":10000,"wind":{"speed":3.13,"deg":260,"gust":0},"clouds":{"all":20},"dt":1693295534,"sys":{"type":1,"id":8926,"country":"RU","sunrise":1693277213,"sunset":1693329272},"timezone":10800,"id":517512,"name":"Novoye Koyrovo","cod":200}root@wirenboard-AGH767IU:~# 

У вас, очевидно, кавычек в запросе не достаточно.

Все ок, стал с кавычками записывать в файл) но…

29-08-2023 13:11:20.012 INFO: [rule info] Wind speed is: 6
29-08-2023 13:11:20.010 INFO: [rule info] Humidity is: 56
29-08-2023 13:11:20.009 INFO: [rule info] Temperature is: 293.91
29-08-2023 13:11:20.009 INFO: [rule info] Time: 1693303875
29-08-2023 13:11:20.008 ERROR: control weather/wind SetValue() error: can’t convert control value ‘6’ (type string) to datatype ‘2’
29-08-2023 13:11:20.007 ERROR: control weather/humidity SetValue() error: can’t convert control value ‘56’ (type string) to datatype '2’
29-08-2023 13:11:20.004 ERROR: control weather/temperature SetValue() error: can’t convert control value ‘293.91’ (type string) to datatype ‘2’
29-08-2023 13:11:15.005 INFO: [rule info] Request sent

Посмотрите ожидаемый в топике тип и явно приведите к нему. Вообще - units нужно использовать.

В общем все заработало, вывод такой, как надо, показывает достаточно точно)

defineVirtualDevice("weather", { //Виртуальное устройство для записи данных и отправки их в  MQTT
  title: "weather",
  cells: {
    temperature: {
      type: "temperature",
      value: -12.0,
    },
    humidity: {
      type: "rel_humidity",
      value: 75,
    },
    wind: {
      type: "wind_speed",
      value: 3,
    }
  }
}); 



defineRule("weather_call", {	// регулярный запрос к серверу погоды
  when: cron("@every 5m"),
  then: function() {
   runShellCommand("wget -qO /usr/weather/data.json 'https://api.openweathermap.org/data/2.5/weather?lat=59.7937&lon=30.1534&appid=b1ff*******************a45fe794a&units=metric'");
    startTimer("wait_weather", 5 * 1000);  		// запустили таймер на задержку для получения данных погоды	
    log("Request sent");
  }
}); 

defineRule("parse_weather", {	// чтение полученных от сервера данных погоды
  when: function() { 
    return timers.wait_weather.firing;
  },
  then: function() {  
  	var weather_data = readConfig("/usr/weather/data.json");
    dev["weather"]["temperature"] = Number(weather_data.main.temp);
    dev["weather"]["humidity"] = Number(weather_data.main.humidity);
    dev["weather"]["wind"] = Number(weather_data.wind.speed);
    log("Time: {}".format(weather_data.dt));
    log("Temperature is: {}".format(weather_data.main.temp));
    log("Humidity is: {}".format(weather_data.main.humidity));
    log("Wind speed is: {}".format(weather_data.wind.speed));
  }
});
    log("Weather script updated!");

@brainroot UPD: appid удалил.

2 Likes

Отлично! Как приятно что всякие интеграции работают.

1 Like

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.