На работу не влияет, конечно, но неаккуратно выглядит.
Где посмотреть как это исправить? Если вообще возможно.
Добрый день.
Это у вас виртуальное устройство?
Если так, то не использовать тип “atmospheric_pressure”, а использовать “value” и задать свою единицу измерения, например, units: "мбар", И тогда оно будет короче.
К сожалению, не подскажу где именно можно единицы измерения подправить для самого типа “atmospheric_pressure”.
Да. Спасибо за подсказку. Ваше решение помогло.
Есть еще вопрос. Сервер погоды отдает часть информации в текстовом, а часть в числовом выражении, которое для удобства преобразуется в текстовое. Каким способом это можно запихать в виджет?
{…“main”:“Clouds”,“description”:“пасмурно”,“icon”:“04d”} … “wind”:{“speed”:1.63,“deg”:146,“gust”:2.83}…
Например первое выделенное уже является текстом, а второе обрабатывается в удобную для восприятия форму, т.к. это числовое представление направления ветра.
var wind_direction = "Измеряется"
var wind_deg = Number(weather_data.wind.deg);
if ((wind_deg >= 350) && (wind_deg <= 10)) {
var wind_direction = "Северный"
}
if ((wind_deg > 10) && (wind_deg < 80)) {
var wind_direction = "Северовосточный"
}
if ((wind_deg >= 80) && (wind_deg <= 100)) {
var wind_direction = "Восточный"
}
if ((wind_deg > 100) && (wind_deg < 170)) {
var wind_direction = "Юговосточный"
}
if ((wind_deg >= 170) && (wind_deg <= 190)) {
var wind_direction = "Южный"
}
if ((wind_deg > 190) && (wind_deg < 260)) {
var wind_direction = "Югозападный"
}
if ((wind_deg >= 260) && (wind_deg <= 280)) {
var wind_direction = "Западный"
}
if ((wind_deg > 280) && (wind_deg < 350)) {
var wind_direction = "Северозападный"
}
//
log("Направление ветра в числовом виде: {}".format(weather_data.wind.deg));
log("Направление ветра в текстовом виде: {}".format(wind_direction));
2023-10-27 16:52:30defineRule: weather_call
2023-10-27 16:52:30defineRule: parse_weather
2023-10-27 16:53:30Request sent
2023-10-27 16:53:35Направление ветра в числовом виде: 104
2023-10-27 16:53:35Направление ветра в текстовом виде: Юговосточный
В отладке вывод верный. А в виджет не впихуется
wind_direction: {
title: "Направление ветра",
type: "text",
value: wind_direction,
order: 5,
},
Есть же общеупотребимые сокращения: СЗ, ЮВ…
Конечно же есть, но к сожалению это не отменяет необходимость преобразовывать числовое представление в текстовую строку и затем пытаться вывести эту строку в виджет.
Немного некорректно реализовано.
Вы создали виртуальное устройство и хотите видеть в нем направление ветра. Тогда вам нужно переменную, в которую кладете текстовое значение ветра, присвоить каналу виртуального устройства.
Например:
dev['my-virtual-device/wind_direction'] = wind_direction
“my-virtual-device” - наименование виртуального устрпойства.
Это я понимаю, что некорректно. Просто приходится черпать знания не из своей головы, а с форума из разрозненных источников ))) Сейчас реализовано так. Пункт в описании виртуального устройства:
defineVirtualDevice('weather', {
title: 'Погода в Москве',
cells: {
...
wind_dir: {
title: "Направление ветра",
type: "text",
value: " ",
order: 5,
},
...
Присвоение переменной wind_deg нужных данных из json-файла, полученного с сервера OpenWeatherMap:
then: function() {
var weather_data = readConfig("/usr/weather/data.json");
var wind_deg = Number(weather_data.wind.deg);
Блок сравнения значения с заданными критериями и присвоение переменной wind_direction строкового значения.
if ((wind_deg >= 350) && (wind_deg <= 10)) {
var wind_direction = "Северный"
...
if ((wind_deg > 280) && (wind_deg < 350)) {
var wind_direction = "Северозападный"
}
И тут уже, как вы посоветовали. Если честно, еще вчера “дотумкал” и так действительно работает.
dev["weather/wind_dir"] = wind_direction;
А не поможете справиться с еще одной проблемкой? Дело в следующем, файл с сайта поступает и сохраняется в таком формате:
{"coord":{"lon":37.6067,"lat":55.7617},"weather":[{"id":111,"main":"Snow","description":"небольшой снег","icon":"13n"}],"base":"stations","main":{"temp":0.11,"feels_like":-4.71,"temp_min":-0.34,"temp_max":0.25,"pressure":993,"humidity":97,"sea_level":993,"grnd_level":973},"visibility":8657,"wind":{"speed":4.88,"deg":21,"gust":10.34},"snow":{"1h":0.49},"clouds":{"all":100},"dt":1698517014,"sys":{"type":2,"id":22222,"country":"RU","sunrise":1698467162,"sunset":1698501632},"timezone":10800,"id":333333,"name":"Москва","cod":200}
затем он парсится, если я правильно понимаю - в объект?
var weather_data = readConfig("/usr/weather/data.json");
Дальше мы сразу присваиваем значения соответствующим пунктам вирт. устройства
var wind_deg = Number(weather_data.wind.deg);
dev["weather/temperature"] = Number(weather_data.main.temp);
dev["weather/temperature_min"] = Number(weather_data.main.temp_min);
dev["weather/temperature_max"] = Number(weather_data.main.temp_max);
dev["weather/humidity"] = Number(weather_data.main.humidity);
dev["weather/wind"] = Number(weather_data.wind.speed);
dev["weather/wind_gust"] = Number(weather_data.wind.gust);
dev["weather/pressure"] = Number(weather_data.main.grnd_level);
А как “выдернуть” значения, которые в дополнительных квадратных скобках?
"weather":[{"id":111,"main":"Snow","description":"небольшой снег","icon":"13n"}],
weather_data.weather.id напрмер
log("weather_data: {}", weather_data.weather.id);
2023-10-30 14:56:17weather_data: undefined
Как грится: “И чо делать?”
В вашем случае id считывается следующим образом:
log("weather_data_id: {}", weather_data.weather[0].id);
Ура, работает ))) Можете пояснить, это как-то связано с тем, что это массив внутри объекта, или неправильно истолковываю?
Да. Скажем так: массив внутри словаря. Как я это вижу.
Большое спасибо.