Текст вылезает за границы виджета

На работу не влияет, конечно, но неаккуратно выглядит.

Где посмотреть как это исправить? Если вообще возможно.

Добрый день.
Это у вас виртуальное устройство?
Если так, то не использовать тип “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);
1 лайк

Ура, работает ))) Можете пояснить, это как-то связано с тем, что это массив внутри объекта, или неправильно истолковываю?

Да. Скажем так: массив внутри словаря. Как я это вижу.

1 лайк

Большое спасибо.

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