Оглавление
Во время путешествий данные 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("Данные равны");
}