1

Получение топлива за интервал

(21/05/2014 09:28:23 отредактировано BelC)

Тема: Получение топлива за интервал

Продукт: Wialon Hosting  (собственно работаем только с Remote API)



Здравствуйте!
Нужно получить топливо через Remote API для расчета его расхода, а так же заправок и сливов.

Данные мониторинга получаю messages/load_interval (svc=messages/load_interval и с этим проблем нет), но информации по топливу там нет...
Вроде бы в SDK написано, что данные датчиков нужно получать unit/calc_sensors, но как это делать (и тем более, как получить данные по топливу) там не написано...

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

Прошу пример получения данных по топливу через unit/calc_sensors, ну или ссылку на него.



PS
Пробовал выполнить запрос (как советовалось в одной теме)

sid=11111&svc=messages/load_interval&params={"itemId":"11703789","timeFrom":1400464800,"timeTo":1400511600,"flags":0,"flagsMask":65280,"loadCount":50000}

а затем выполнить

sid=11111&svc=unit/calc_sensors&params={"source":"","indexFrom":0,"indexTo":1000,"unitId":{0},"sensorId":0}}

Причем второй запрос выполняю сразу после первого.
Если на первый запрос я таки получаю ответ с точками за интервал, то второй отвечает мне ошибкой {"error":4}

Что я делаю не так ?

2

Получение топлива за интервал

(22/05/2014 08:52:27 отредактировано mast)

Re: Получение топлива за интервал

BelC пишет:

sid=11111&svc=unit/calc_sensors&params={"source":"","indexFrom":0,"indexTo":1000,"unitId":{0},"sensorId":0}}

Параметр "unitId", значение <long>, но не в объекте, т.е. не {0}, а просто 0 (unit/calc-sensors).

Если выставлять 0 в значении "unitId", то вы получите все значения датчиков в указанных сообщениях.
Там же можете увидеть и конкретные id датчиков.

Maksim
Wialon Platform QA
Gurtam
3

Получение топлива за интервал

(22/05/2014 07:17:49 отредактировано BelC)

Re: Получение топлива за интервал

Спасибо.
Осталось получить описание датчиков, но я нашел только unit/update_sensor.
Возможно я плохо искал, но все же - как получить список датчиков (хотя бы тех, что установлены на определенной единице техники).


Так же хотелось бы иметь (для сравнения) данные по топливу с сервера - расход и заправки/сливы.
Согласно документации эти данные можно получить из отчета - report/exec_report.
Но опять же есть проблема с параметрами.
Какие данные нужны для параметров reportResourceId (из ответа авторизации), reportObjectId (ид техники), reportObjectSecId (пишу 0), interval (пишу {"flags":16777216,"from":1399946400,"to":1399993200} - то есть время от и до и флаг, но на счет него я сомневаюсь), reportTemplate (пишу NULL).
Откуда брать данные для reportTemplateId не понятно. Хотя и написано в документации, что там должен быть идентификатор отчета, но где его взять?

4

Получение топлива за интервал

(22/05/2014 08:51:45 отредактировано mast)

Re: Получение топлива за интервал

BelC,
В системе Wialon любой элемент, имеющий уникальный id (учетные записи, пользователей, объекты и тд.), можно найти командой core/search_item и получить подробную информацию о нем.
Флаги для объекта здесь: флаги для объектов.

P.S. Спасибо за красивые ссылки. Я поработал над своими smile.

Maksim
Wialon Platform QA
Gurtam
5

Получение топлива за интервал

(26/05/2014 13:30:48 отредактировано BelC)

Re: Получение топлива за интервал

Это Вам, mast, спасибо - похоже то что нужно.
Остался ещё один нюанс...

Я правильно понимаю, что описание датчиков нужно интерпретировать согласно unit/update_sensor ?
Значит значение возвращаемое unit/calc-sensors должно представлять количество литров топлива в баке согласно датчика уровня, верно ?


В начале я получаю описание датчиков запросом core/search_item с параметрами (согласно флагов объектов):

    {"id":"<ID техники>","flags":"4096"}

Получаю ответ:

       {
        "item" : {
            "sens" : {
                "1" : {
                    "id" : 1,
                    "n" : "Датчик зажигания",
                    "t" : "engine operation",
                    "d" : "",
                    "m" : "On\/Off",
                    "p" : "adc1",
                    "f" : 0,
                    "c" : "{\"appear_in_popup\":true,\"show_time\":false,\"pos\":1,\"ci\":{},\"validate_driver_unbound\":0,\"unbound_code\":\"\"}",
                    "vt" : 0,
                    "vs" : 0,
                    "tbl" : []
                },
                "2" : {
                    "id" : 2,
                    "n" : "Датчик уровня топлива",
                    "t" : "fuel level",
                    "d" : "",
                    "m" : "liters",
                    "p" : "adc9",
                    "f" : 0,
                    "c" : "{\"appear_in_popup\":true,\"show_time\":false,\"pos\":2,\"ci\":{},\"validate_driver_unbound\":0,\"unbound_code\":\"\"}",
                    "vt" : 1,
                    "vs" : 0,
                    "tbl" : []
                },
                "3" : {
                    "id" : 3,
                    "n" : "Прицеп",
                    "t" : "trailer",
                    "d" : "",
                    "m" : "",
                    "p" : "rs485_fls22",
                    "f" : 0,
                    "c" : "{\"appear_in_popup\":true,\"show_time\":false,\"pos\":3,\"ci\":{},\"validate_driver_unbound\":0,\"unbound_code\":\"\"}",
                    "vt" : 1,
                    "vs" : 0,
                    "tbl" : []
                },
                "4" : {
                    "id" : 4,
                    "n" : "Датчик уровня топлива",
                    "t" : "fuel level",
                    "d" : "Epsilon правый|0.631:0:0.64:25:0.666:....",       // тут длинный код
                    "m" : "liters",
                    "p" : "adc2",
                    "f" : 0,
                    "c" : "{\"appear_in_popup\":true,\"show_time\":false,\"pos\":5,\"ci\":{},\"validate_driver_unbound\":0,\"unbound_code\":\"\"}",
                    "vt" : 1,
                    "vs" : 0,
                    "tbl" : [{
                            "x" : -0.369,
                            "a" : 0,
                            "b" : -348201.3876
                        }, {
                            "x" : 0.631,
                            "a" : 2777.77777778,
                            "b" : -1752.77777778
                        }, {
                            "x" : 0.64,
                            "a" : 961.538461538,
                            "b" : -590.384615385
                        }, {
                            "x" : 0.666,
                            "a" : 1000,
                            "b" : -616
                        }, {
                            "x" : 0.691,
                            "a" : 1000,
                            "b" : -616
                        }, {
                            "x" : 0.716,
                            "a" : 862.068965517,
                            "b" : -517.24137931
                        }, {
                            "x" : 0.745,
                            "a" : 892.857142857,
                            "b" : -540.178571429
                        }, {
                            "x" : 0.773,
                            "a" : 833.333333333,
                            "b" : -494.166666667
                        }, {
                            "x" : 0.803,
                            "a" : 862.068965517,
                            "b" : -517.24137931
                        }, {
                            "x" : 0.832,
                            "a" : 833.333333333,
                            "b" : -493.333333333
                        }, {
                            "x" : 0.862,
                            "a" : 806.451612903,
                            "b" : -470.161290323
                        }, {
                            "x" : 0.893,
                            "a" : 833.333333333,
                            "b" : -494.166666667
                        }, {
                            "x" : 0.923,
                            "a" : 862.068965517,
                            "b" : -520.689655172
                        }, {
                            "x" : 0.952,
                            "a" : 892.857142857,
                            "b" : -550
                        }, {
                            "x" : 0.98,
                            "a" : 925.925925926,
                            "b" : -582.407407407
                        }, {
                            "x" : 1.007,
                            "a" : 925.925925926,
                            "b" : -582.407407407
                        }, {
                            "x" : 1.034,
                            "a" : 925.925925926,
                            "b" : -582.407407407
                        }, {
                            "x" : 1.061,
                            "a" : 961.538461538,
                            "b" : -620.192307692
                        }, {
                            "x" : 1.087,
                            "a" : 1063.82978723,
                            "b" : -731.382978723
                        }, {
                            "x" : 1.134,
                            "a" : 892.857142857,
                            "b" : -537.5
                        }, {
                            "x" : 1.162,
                            "a" : 666.666666667,
                            "b" : -274.666666667
                        }
                    ]
                },
                "5" : {
                    "id" : 5,
                    "n" : "Водитель",
                    "t" : "driver",
                    "d" : "",
                    "m" : "",
                    "p" : "rs485_fls12",
                    "f" : 0,
                    "c" : "{\"appear_in_popup\":true,\"show_time\":false,\"pos\":4,\"ci\":{},\"validate_driver_unbound\":0,\"unbound_code\":\"\"}",
                    "vt" : 1,
                    "vs" : 0,
                    "tbl" : []
                }
            }
        },
        "flags" : 4096
    }

Я выполняю запрос messages/load_interval с параметрами:

    {"itemId":"<ID техники>","timeFrom":1399946400,"timeTo":1399993200,"flags":0,"flagsMask":65280,"loadCount":50000}

Соответственно получаю "трек" за интервал.
Сразу же за этим пробую получить уровень топлива (как я понимаю, это либо датчик 2, либо 4 - не понял почему их два...) запросом unit/calc_sensors:

    {"source":"","indexFrom":0,"indexTo":1000,"unitId":"11715932","sensorId":2}}
    {"source":"","indexFrom":0,"indexTo":1000,"unitId":"11715932","sensorId":4}}

Данные этих запросов различаются. А если выполнять их независимо от получения трека то совпадают и на всем интервале равны "-348201.3876".


Так вот, нюанс который мне не понятен - какой из датчиков (2 или 4) следует брать в качестве источника данных  о уровне топлива в точках интервала?
Верно ли что датчик 2 - это вычисленный в литрах уровень топлива, а датчик 4 - это тот же датчик, но с сырыми данными и таблицей пересчета ?


И параметры indexFrom / indexTo - индексы для них откуда берутся ?
Индекса сообщения в ответе messages/load_interval я не увидел...

6

Получение топлива за интервал

(27/05/2014 15:32:47 отредактировано BelC)

Re: Получение топлива за интервал

Неужто этот зверь (датчик топлива) настолько страшен, что ни кто его ещё не заламывал ?


PS
Почему не работает запрос вида ?

   ?sid=SESION&svc=core/batch&params=[{svc:"messages/load_interval",params:{"itemId":"VID","timeFrom":1401048000,"timeTo":1401220740,"flags":0,"flagsMask":65280,"loadCount":50000}},{svc:"unit/calc_sensors",params:{"source":"","indexFrom":0,"indexTo":50000,"unitId":"VID","sensorId":0}}]


PS2
Победил наконец датчик уровня топлива, все таки его значение приходит в литрах, если задана таблица расчета, если я правильно понял.
А если таблица расчета не задана, то в исходном виде (в вольтах, если не ошибаюсь).
Жаль конечно что messages/load_interval и unit/calc_sensors не могут выполняться одним запросом...

7

Получение топлива за интервал

Re: Получение топлива за интервал

Для вашей задачи в messages/load_interval разумнее указать "loadCount":0. Этот параметр отвечает за количество возвращаемых сообщений, а они дальше нигде не используются. Меньше лишних данных - быстрее обработка.

В то же время указывать "indexFrom":0,"indexTo":50000 в unit/calc_sensors может быть не совсем правильно, логичнее проанализировать количество сообщений, загруженных в messages/load_interval и запрашивать только их. Или и вовсе запрашивать по частям, например, по 10000.

P.S. Если не секрет, на чём пишете свои программы и что используете для работы с RemoteApi (собственную обёртку, или отправляете запросы вручную, или ,возможно,  один из наших вариантов https://github.com/wialon/python-wialon, https://github.com/wialon/php-wialon)

8

Получение топлива за интервал

Re: Получение топлива за интервал

shmi пишет:

Для вашей задачи в messages/load_interval разумнее указать "loadCount":0. Этот параметр отвечает за количество возвращаемых сообщений, а они дальше нигде не используются. Меньше лишних данных - быстрее обработка.

В то же время указывать "indexFrom":0,"indexTo":50000 в unit/calc_sensors может быть не совсем правильно, логичнее проанализировать количество сообщений, загруженных в messages/load_interval и запрашивать только их. Или и вовсе запрашивать по частям, например, по 10000.

Ок, спасибо за подсказку с "loadCount":0 в messages/load_interval - попробую.
А с indexFrom":0,"indexTo":50000 в unit/calc_sensors я так и делаю, так как одним запросом (через core/batch) не получилось.


shmi пишет:

P.S. Если не секрет, на чём пишете свои программы и что используете для работы с RemoteApi (собственную обёртку, или отправляете запросы вручную, или ,возможно,  один из наших вариантов https://github.com/wialon/python-wialon, https://github.com/wialon/php-wialon)

Не программы, скорее скрипты (JavaScript). Разработка под web.




Вопрос по показаниям датчика уровня топлива (который fuel level)... А то непонятки какие-то.
Есть на нескольких машинах такой вот зверь, который с выключенным зажиганием выдает уровень -348201.3876 (описание датчиков см. в моих постах выше).

Это что за уровень такой и как с ним бороться ?
И вообще зачем нужна "таблица расчета" (tbl в описании датчика уровня топлива) - как её вообще пользоваться (в документации про неё ни слова, кроме её названия).

9

Получение топлива за интервал

Re: Получение топлива за интервал

Про датчики и таблицу расчёта можно почитать на http://docs.gurtam.com/.

Пример расчёта значения датчика есть на http://sdk.wialon.com/playground, с той разницей, что в примере используется последнее сообщение. Нажав сверху справа "Get code" можно получить исходник страницы. Кусочек кода оттуда:

if(result == -348201.3876) result = "N/A"; // compare result with invalid sensor value constant

-348201.3876 - это константа, означающая, что рассчитать значение датчика не представляется возможным.

10

Получение топлива за интервал

Re: Получение топлива за интервал

Быстро привыкаешь что на связанные статьи есть ссылки в тексте... Надо отвыкать...

Всем спасибо,
   надеюсь с датчиками на этом всё...