Перейти к содержимому

SmartHome - изменение данных GPS

Время чтения 2 минут

Во время путешествий данные GPS постоянно меняются. Цель состоит в том, чтобы использовать SmartHome на HomeMatic или RaspberryMatic для записи этих данных и, при необходимости, обновления других параметров, которые от них зависят.

Конечно, можно было бы постоянно определять местоположение и, таким образом, всегда получать данные о погоде в зависимости от местоположения, но это создало бы ненужный сетевой трафик и нагрузку на процессор. Поэтому система проверяет изменение местоположения и определяет данные о погоде относительно текущего местоположения только при распознавании изменения местоположения и соответствующим образом обновляет данные.

Корректировка данных GPS для сравнения

Поскольку из-за преднамеренной неточности поставщиков услуг GPS координаты всегда колеблются до последних двух цифр значений долготы и широты, даже если вы остаетесь в одном и том же месте без изменений, для сравнения учитываются только четыре знака после запятой. Поэтому изменение местоположения распознается только при изменении хотя бы четвертого знака после запятой.

Дополнение к сценарию (GPS_Data)

Следующие строки сценария добавляются в здесь обсуждаемый сценарий GPS_Data добавлено. Строки, начинающиеся с восклицательного знака, представляют собой комментарии. Операторы WriteLine используются только для управления выводом и могут быть удалены.

Необходимо создать новые переменные типа DRAWING CHAIN:

  • W_Lat_short_act (Чтобы сохранить текущую широту, усеченную до четырех десятичных знаков)
  • W_Lon_short_act (Чтобы сохранить текущую географическую долготу, усеченную до четырех десятичных знаков)
  • W_Lat_short_old (Для хранения старой географической широты, усеченной до четырех знаков после запятой)
  • W_Lon_short_old (Для хранения старой географической долготы, усеченной до четырех знаков после запятой)

Скрипт

! Сохраните геоданные, усеченные до 4 знаков после запятой (ToString(4))

var lat_short_akt = lat.ToString(4);
WriteLine("lat_short_akt");WriteLine(lat_short_akt);
dom.GetObject('W_Lat_short_akt').State(lat_short_akt);

var lon_short_akt = lon.ToString(4);
WriteLine("lon_short");WriteLine(lon_short_akt);
dom.GetObject('W_Lon_short_akt').State(lon_short_akt);

! Сравнение текущего и старого местоположения

var W_lat_short_alt = dom.GetObject("W_Lat_short_alt").Value();WriteLine(W_lat_short_alt);
var W_lon_short_alt = dom.GetObject("W_Lon_short_alt").Value();WriteLine(W_lon_short_alt);

if ((lat_short_akt W_lat_short_alt) && (lon_short_akt W_lon_short_alt))
{
dom.GetObject("W_Lat_short_alt").State(lat_short_akt);
dom.GetObject("W_Lon_short_alt").State(lon_short_akt);

! Соберите URL с текущими данными GPS - AppID "... xxx ..." должен быть заполнен вашим собственным ID

var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("новый URL для новых геоданных");WriteLine(url);

! Отправка запроса URL

var posValueStart;
var posValueEnd;
var pos;
var data;
var posStart;
var posEnd; string stderr; string stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);

! Извлечение данных

! Название города

pos = 0;
posStart = 'name':';
posEnd = '", "local_names";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("название_города");WriteLine(название_города);
dom.GetObject("W_city_name").State(city_name);

! Код страны

pos = 0;
posStart = 'страна':';
posEnd = '", "state";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);
WriteLine("код_страны");WriteLine(код_страны);
dom.GetObject("W_country_code").State(country_code);

! Регион

pos = 0;
posStart = 'state':';
posEnd = '''}]''';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string W_region = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_region");WriteLine(W_region);
dom.GetObject("W_region").State(W_region);

}

! Ветвь ELSE может быть опущена и используется только для проверки того, что сценарий был запущен до конца, если местоположение не изменилось

else
{
WriteLine("Данные равны");
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

ru_RURussian
We've detected you might be speaking a different language. Do you want to change to:
en_US English
de_DE German
en_US English
fr_FR French
sv_SE Swedish
es_ES Spanish
pt_PT Portuguese
it_IT Italian
nl_NL Dutch
nb_NO Norwegian
fi Finnish
da_DK Danish
cs_CZ Czech
hu_HU Hungarian
el Greek
ru_RU Russian
tr_TR Turkish
ja Japanese
lt_LT Lithuanian
lv Latvian
sl_SI Slovenian
sk_SK Slovak
Close and do not switch language