Как разобраться с некорректными показаниями топлива и не сойти с ума

    Как разобраться с некорректными показаниями топлива и не сойти с ума

    Топливный отчёт — вещь привычная. Он показывает, сколько топлива израсходовал автомобиль и происходило ли что-то необычное по ходу поездки. Обычно всё так и работает. А теперь представьте, что вы открываете отчёт, в котором автобус заправился 12 раз, пережил 5 сливов топлива и израсходовал всего 0,35 литра на 85 км. С чего бы вы начали?

    Мы внимательно разобрали сырые данные трекеров за три дня, а затем использовали Navixy IoT Logic, чтобы некорректные показания больше не искажали отчёт. Тот же подход может помочь и с другими данными датчиков, из-за которых отчёты и уведомления иногда превращаются в бессмыслицу. Но давайте разберём этот случай по порядку.

    Топливный отчёт, в котором ничего не сходится

    Автопарк из 26 автобусов получил топливный отчёт, который вызвал больше вопросов, чем дал ответов. Один из автобусов якобы проехал 85 км на 0,35 литра топлива, при этом за день было зарегистрировано 12 заправок и 5 сливов. Для одного дня это довольно бурная деятельность (и ничего из этого на самом деле не происходило).

    fuel-report-excerpt.webp

    График уровня топлива показал, откуда взялись эти события. Несколько раз в день линия падала почти до нуля, некоторое время оставалась внизу, а затем резко поднималась. Платформа делала то, для чего была предназначена. Каждое падение она воспринимала как уход топлива из бака, а каждый скачок вверх — как поступление топлива. Следом приходили уведомления.

    Как ни странно, арифметика сходилась. Топливо в начале дня, плюс заправки, минус сливы, минус остаток в конце давали 62,2 + 95,13 − 106,98 − 50 = 0,35 литра. С формулой всё было в порядке. Значит, проблема явно была в показаниях.

    Простого решения оказалось недостаточно, чтобы привести показания топлива в норму

    Клиент предложил простое решение. Провалы вроде бы начинались при запуске двигателя, поэтому он попросил нас игнорировать показания топлива в течение 20 секунд после включения зажигания. Мы это реализовали, но провалы никуда не делись. Некоторые длились гораздо дольше 20 секунд. Другие растягивались на всю стоянку, хотя двигатель уже давно был выключен. На предположениях дальше уехать не получалось, поэтому мы обратились к сырым данным.

    
    15:44:31  зажигание выключено   топливо 24,9 л
    15:44:34  зажигание включено    топливо  0,0 л   двигатель 740 об/мин
    15:45:16  зажигание включено    топливо  5,4 л   двигатель 744 об/мин
    15:45:17  зажигание выключено   топливо  5,4 л
              ещё 276 сообщений за 47 минут, и в каждом — 5,4 л
    16:32:33  зажигание выключено   топливо  5,4 л
    16:32:34  зажигание включено    топливо 21,6 л
    16:35:56  зажигание включено    топливо 25,3 л   движение со скоростью 45 км/ч
    

    Один автобус, 43 секунды работы двигателя, а затем 47 минут, в течение которых бак выглядел почти пустым. Это сырые сообщения трекера, именно в том виде, в котором он их передавал.

    В отчёте эта единственная остановка выглядит так, будто из бака забрали около 20 литров, а через 47 минут залили примерно столько же обратно.

    Настоящие заправки тоже отображались некорректно. На одном из автобусов заправка произошла между несколькими короткими запусками двигателя. В результате одна заправка примерно на 30 литров выглядела на графике как падение почти до нуля с последующим подъёмом до 62 литров.

    Так почему простое решение не сработало?

    Большинство настроек обработки топлива учитывает только числовые значения. С этими данными каждый подход даёт сбой по-своему.

    Подход Что происходит с этими данными
    Сглаживать или усреднять показания Шум смешивается с реальными значениями. Показания 5,4 л на протяжении 47 минут тянут среднее вниз. Ложный провал становится менее резким, но остаётся.
    Игнорировать показания ниже порога По-настоящему почти пустой бак тоже оказывается скрыт. При этом шум выше порога, например найденные нами показания от 15 до 18 литров, всё равно проходит.
    Повысить порог уведомления Уведомлений становится меньше, но график уровня топлива и отчёт о расходе остаются неверными.
    Правила, учитывающие контекст IoT Logic проверяет то, что проверил бы человек. Работает ли двигатель? Как давно он запустился? Держится ли новое значение? Шум отбрасывается, а реальные заправки и сливы сохраняются.

    43 секунды работы двигателя — ключевая подсказка. Чтобы отклонить показание 5,4 л, потоку нужно знать, что делал автобус в момент, когда трекер получил это значение. Правило, которое смотрит только на количество топлива, не может отличить ошибочное показание от почти пустого бака.

    Четыре вопроса к каждому показанию

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

    Наш поток задаёт каждому показанию топлива до четырёх вопросов, по порядку.

    fuel-reading-decision-16x9.webp

    Поток сохраняет последний достоверный уровень, пока новое показание не пройдёт проверки.

    В записанных данных самый долгий период стабилизации показаний после запуска двигателя составил чуть больше 7 минут, поэтому мы установили период ожидания в 7,5 минуты. При обычном движении уровень никогда не менялся больше чем на 3,5 литра между двумя сообщениями. Это также совпадало с порогом, который попросил клиент. Мы выбрали 5 минут, потому что ни одно шумовое показание в записанных данных не держалось так долго при работающем двигателе, а уровни после настоящих заправок и сливов держались.

    Из-за этих проверок заправка или слив могут появиться в отчёте с задержкой до примерно 12 минут работы двигателя. Поток ждёт окончания периода стабилизации и проверяет, держится ли новый уровень, прежде чем пропустить показание.

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

    Один день после обеда, до и после

    fuel-before-after-16x9.webp

    Данные трекера за один послеобеденный период, повторно обработанные потоком. Серая линия видна только там, где значения расходятся.

    Время Трекер передал Платформа показывает Что произошло
    15:44:31 24,9 л 24,9 л Автобус на стоянке
    15:44:34 0,0 л 24,9 л Двигатель запускается, первое показание — шум
    15:45:17 5,4 л 24,9 л Двигатель выключен после 43 секунд работы. Трекер сохраняет последнее показание
    16:32:34 21,6 л 24,9 л Следующий запуск через 47 минут. Начинается период стабилизации
    16:40:44 26,2 л 26,2 л Период стабилизации завершён, показания снова достоверны
    16:47:23 62,5 л 26,3 л Заправка сразу после нового запуска, поэтому показание пока не принимается
    17:00:10 62,3 л 62,3 л Новый уровень держался 5 минут работы двигателя, поэтому он принят

    Как мы убедились, что всё работает

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

    Мы также повторно обработали по тем же правилам все записанные данные — около 34 000 сообщений от трёх автобусов за три дня в августе 2026 года — и посчитали скачки больше 3,5 литра от одного сообщения к следующему. Для двух автобусов поток определял, работает ли двигатель, по его оборотам.

    fuel-jumps-before-after.webp

    Для запуска нужен один файл. Загрузите поток, выберите автомобили и включите его. Не нужно выезжать к автомобилям или менять трекеры, датчики и правила уведомлений. Отключение потока позволяет платформе снова использовать сырые показания.

    Тот же подход работает не только с топливом

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

    • Уведомления о превышении скорости из-за скачков GPS-позиции. Считать, что автомобиль превышает скорость, только когда видно достаточно спутников и высокая скорость держится 10 секунд.
    • Датчики, которым нужен период стабилизации. Игнорировать показания температуры или давления в первые минуты после включения устройства.
    • Одиночные скачки. Принимать новое значение только после того, как оно повторится или продержится заданное время.

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

    Чтобы создавать потоки в IoT Logic, начните с документации IoT Logic. Если хотите понять, как этот подход можно применить к вашему автопарку или датчикам, свяжитесь с нашей командой.

    Поделиться