Время пути до работы

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Время пути до работы

Сообщение slgeo » Пн фев 05, 2018 10:08 am

EvgenyG писал(а):хотел что-то подобное
причём в виде графика
Например, если выехать в 6-30, то время до работы будет составлять столько-то
потом в 6-35 и так далее
Есть один нюанс - вряд ли возможно спрогнозировать пробки через 5-10 и более минут.
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
EvgenyG
Сообщения: 217
Зарегистрирован: Вт июл 21, 2015 4:59 pm
Откуда: Москва
Благодарил (а): 56 раз
Поблагодарили: 1 раз

Re: Время пути до работы

Сообщение EvgenyG » Пн фев 05, 2018 10:34 am

slgeo писал(а):
EvgenyG писал(а):хотел что-то подобное
причём в виде графика
Например, если выехать в 6-30, то время до работы будет составлять столько-то
потом в 6-35 и так далее
Есть один нюанс - вряд ли возможно спрогнозировать пробки через 5-10 и более минут.
Это не для прогноза
Для выбора оптимального времени выхода из дома
За пару недель или месяцев понимание будет
MDM Raspberry Pi 3b, esp32, ModBUS, esp8266, NooLite(MTRF-64-USB, SU-1-***, SLF-1-300, PM112, радиопульты PU)
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Время пути до работы

Сообщение slgeo » Пн фев 05, 2018 11:53 am

Так дорожная обстановка постоянно меняется, смысл в этих графиках? Сегодня вышел в 6-30 - опоздал, завтра вышел в 6-30
- успел. Сегодня завалило снегом и заторов больше, завтра - ясная погода, лето и многие уехали в отпуск.
Оптимальное время вырабатывается всё равно самостоятельно и достаточно быстро.
Можно сохранять свойство со значением времени в историю и подбивать среднее за какой либо промежуток, сообщая при следующей возможности.
Например, "Маршрут с учетом пробок до работы займет 25 мин. Среднее время за последнюю неделю 20 мин"
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
EvgenyG
Сообщения: 217
Зарегистрирован: Вт июл 21, 2015 4:59 pm
Откуда: Москва
Благодарил (а): 56 раз
Поблагодарили: 1 раз

Re: Время пути до работы

Сообщение EvgenyG » Пн фев 05, 2018 1:31 pm

slgeo писал(а):Так дорожная обстановка постоянно меняется, смысл в этих графиках? Сегодня вышел в 6-30 - опоздал, завтра вышел в 6-30
- успел. Сегодня завалило снегом и заторов больше, завтра - ясная погода, лето и многие уехали в отпуск.
Оптимальное время вырабатывается всё равно самостоятельно и достаточно быстро.
Можно сохранять свойство со значением времени в историю и подбивать среднее за какой либо промежуток, сообщая при следующей возможности.
Например, "Маршрут с учетом пробок до работы займет 25 мин. Среднее время за последнюю неделю 20 мин"

Всё субъективно. У меня стаж почти 20 лет, в месяц проезжаю по 3000 с лишним километров.
Для меня было бы полезно иметь под рукой такие данные.
Переехал из Москвы в Подмосковье уже почти как 3 года каждый день как лотерея. +-15 минут могут стоить минут 30 в пробке.
А иногда за 30 минут до начал рабочего дня приезжаю.
Иногда яндекс предлагает по платной объезжать, а это +50км, но экономия по времени минут 40.
В таком случае проще на электричке поехать. Или вообще спать лечь))
MDM Raspberry Pi 3b, esp32, ModBUS, esp8266, NooLite(MTRF-64-USB, SU-1-***, SLF-1-300, PM112, радиопульты PU)
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Время пути до работы

Сообщение webms » Чт фев 08, 2018 10:56 am

Мой готовый код. Всем спасибо за помощь.

Код: Выделить всё

function chti($n, $form1, $form2, $form5)
{
        $n = abs($n) % 100;
        $n1 = $n % 10;
        if ($n > 10 && $n < 20) return $form5;
        if ($n1 > 1 && $n1 < 5) return $form2;
        if ($n1 == 1) return $form1;
        return $form5;
}

$from = "55.706152,37.123456"; //Откуда, можно координаты или название улицы 
$to = "55.750591,37.123456"; //Куда, можно координаты или название улицы
$start_time="now";// Время отправления
//$start_time = time() + (5 * 60); // 10 минут; 60 секунд

$api_key = "############################"; //апи ключ гугл
$URL = "https://maps.googleapis.com/maps/api/directions/json?origin=".$from."&destination=".$to."&departure_time=".$start_time."&trafficmodel=bestguess&mode=driving&language=ru&key=".$api_key;
$data = getUrl($URL);
$json = json_decode($data);
$duration = $json -> routes[0] -> legs[0] -> duration -> text; // Продолжительность маршрута
$duration_in_traffic = $json -> routes[0] -> legs[0] -> duration_in_traffic -> text; //Продолжительность маршрута с учетом дорожной обстановки
//$summary = $json -> routes[0] -> summary[0] -> text; // Ключевая точка маршрута
//$distance = $json -> routes[0] -> legs[0] -> distance->text; // Расстояние

$duration_in_traffic_value = round($json -> routes[0] -> legs[0] -> duration_in_traffic -> value / 60); //Продолжительность маршрута с учетом дорожной обстановки в мин.
$duration_value = round($json -> routes[0] -> legs[0] -> duration -> value / 60); // Продолжительность маршрута в мин.

sg('DrivingToCar.TimeToWork', $duration_in_traffic_value); //сохраняем время пути
$avgtime = getHistoryAvg("DrivingToCar.TimeToWork", strtotime("-7 day"));
$sum = $duration_in_traffic_value - $duration_value; // Считаем время: время с пробками - время без пробок
$sum_avg = $duration_in_traffic_value - $avgtime;

$sum_avg_end = preg_replace('/[^-]/', '', $sum_avg);
if ($sum_avg_end == '-') { $plusminus = ' быстрее'; } else { $plusminus = ' дольше'; }

$res = '';
if ($sum > 0)
{ //проверяем есть ли пробки
        $res .= 'Время пути, от дома до работы, c учетом пробок, займет примерно '.$duration_in_traffic.'. ';
         if (round($sum_avg) != 0) {
        $res .= 'Что на '.abs(round($sum_avg)).' '.chti(round($sum_avg), 'минуту', 'минуты', 'минут').$plusminus.' обычного.';
        } else { $res .= 'Это среднее время на этой недели'; }
} else {
        $res .= 'Пробок нет. Время пути, от дома до работы, займет примерно '.$duration;
}

say($res, 3);
//echo $res;

Путь от дома до работы c учетом пробок займет примерно 47 мин. Что на 1 минуту дольше обычного.
Последний раз редактировалось webms Ср фев 21, 2018 8:55 am, всего редактировалось 8 раз.
За это сообщение автора webms поблагодарили (всего 5):
directman66 (Чт фев 08, 2018 11:39 am) • slgeo (Чт фев 08, 2018 12:25 pm) • igoryan (Чт фев 08, 2018 5:39 pm) • olegvolk75 (Чт мар 22, 2018 12:30 pm) • savenko_egor (Чт мар 22, 2018 12:32 pm)
Рейтинг: 5.81%
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Время пути до работы

Сообщение slgeo » Чт фев 08, 2018 12:28 pm

В идеале в качестве "обычного", конечно, лучше было бы среднее время с учетом пробок за последнюю неделю ))
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Время пути до работы

Сообщение webms » Чт фев 08, 2018 1:59 pm

slgeo писал(а):В идеале в качестве "обычного", конечно, лучше было бы среднее время с учетом пробок за последнюю неделю ))
да, это было бы лучше)
чуть позже выложу решение.

Спасибо за идею
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Время пути до работы

Сообщение slgeo » Чт фев 08, 2018 2:23 pm

Ну, тогда давай думать дальше...
Итак, нам нужна история только для работы, поэтому создаем свойство work_duration_value и будем в него записывать по условию, что координаты соответствуют рабочим. Потом нам надо выдернуть из базы 7 последних значений и взять по ним среднее.

Код: Выделить всё

// Получить объект по имени
 $obj=getObject(<имя объекта>); 
 // Получить id свойства
 $prop_id=$obj->getPropertyByName('work_duration_value', $obj->class_id, $obj->id);
 // Получаем среднее значение из таблицы истории
 $pvalue=SQLSelectOne("SELECT AVG(VALUE) FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."' LIMIT 7 DESC");
К сожалению, сейчас не могу проверить, писал с чистого листа и с божьей помощью форумцев
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: Время пути до работы

Сообщение webms » Чт фев 08, 2018 2:36 pm

обновил код выше https://majordomo.smartliving.ru/forum/ ... 161#p71161
проверил, все работает

Код: Выделить всё

Путь от дома до работы c учетом пробок займет примерно 47 мин. Что на 2 минуты быстрее обычного. 
За это сообщение автора webms поблагодарил:
slgeo (Чт фев 08, 2018 2:37 pm)
Рейтинг: 1.16%
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: Время пути до работы

Сообщение slgeo » Чт фев 08, 2018 2:37 pm

Отлично!
Я вот не знал про функцию getHistoryAvg
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Ответить