lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
База данных

Хранилище — SQLite. По умолчанию файл БД находится в каталоге /rood/lacte.bd (рекомендуемый постоянный путь).

Общие правила записи

  • Опрос выполняется каждые 100 мс (INFO + VERSION + RFID data). Если обнаружено изменение — дозапрашиваются остальные пакеты.
  • Если статус платы - CALIBRATION , или есть rfid не определен, rfid data не запрашивается.
  • Если rfid.magicWord != 0xCCAA , то данные rfid data не записываются в БД.
  • В остальном, при любом изменении любого поля из кортежа board_data данные записываются в базу
  • Кортеж наблюдаемых данных:
    using board_data = std::tuple<
    std::optional<BoardOnlineStatus>,
    std::optional<proto::lacte::InfoPacketType>,
    std::optional<proto::lacte::BoardErrorDiff>,
    std::optional<proto::lacte::VersionPacketType>,
    std::optional<proto::lacte::UIDPacketType>,
    std::optional<proto::lacte::RFIDNumberType>,
    std::optional<proto::lacte::MagicWord>,
    std::optional<proto::lacte::LacteId>, std::optional<proto::lacte::LacteSn>,
    std::optional<proto::lacte::ProductVolume>,
    std::optional<proto::lacte::ProdDate>,
    std::optional<proto::lacte::ProductShelfLife>,
    std::optional<proto::lacte::UsageTime>, std::optional<proto::lacte::McuUid>,
    std::optional<proto::lacte::MachineSn>,
    std::optional<proto::lacte::ActivationTime>,
    std::optional<proto::lacte::MilkCounter>,
    std::optional<proto::lacte::TimeCounter>, std::optional<SoftVersion>,
    std::optional<proto::lacte::AerationParam>>;
    >;
  • Плата не инициирует обмен — все записи в БД появляются только как реакция на изменения, замеченные приложением.

Структура таблиц

1) service_info

Хранит основные элементы (board_data) и служебные события.

  • id INTEGER PRIMARY KEY
  • date TIMESTAMP — время записи
  • field TEXT — имя поля (например: version, uid, lacte_sn, update_path)
  • value TEXT — значение поля
  • mqtt_status BOOL — статус отправки записи в MQTT (True/False)

возможные данные

  • BoardOnlineStatus - статус платы. Offline если более 3х секунд нет данных
  • VersionPacketType - Версия софта платы
  • SoftVersion - версия сервиса
  • AerationParam - значение параметра аэрации
  • McuUid - uid номер контроллера
  • MachineSn - назначенный производителем Sn
  • rfid данные (записанные на метке)
    • UIDPacketType
    • RFIDNumberType
    • MagicWord
    • LacteId
    • LacteSn
    • ProductVolume
    • ProdDate
    • ProductShelfLife
    • UsageTime
    • ActivationTime
    • MilkCounter
    • TimeCounter

2) stat

Хранит информацию из пакета InfoPacketType.

  • id INTEGER PRIMARY KEY
  • date TIMESTAMP — время записи
  • status INTEGER — состояние платы (0=IDLE, 1=CALIBRATION, 2=ERROR, 3=READY, 4=WORK)
  • n_RFID INTEGER — идентификатор RFID
  • mqtt_status BOOL — отправлено/не отправлено в MQTT

3) errors

История срабатываний флагов ошибок.

  • id INTEGER PRIMARY KEY
  • date TIMESTAMP
  • error INTEGER — код ошибки:
    • 0 = Calibration
    • 1 = Motor
    • 2 = RFID
    • 3 = RFID_NoCard
    • 4 = RFID_BadCard
    • 5 = InvalidTime
    • 6 = ShelfLifeExceeded
    • 7 = UsageTimeExceeded
  • value INTEGER — состояние флага (0 = Cleared, 1 = Set)
  • mqtt_status BOOL

4) dictionary

Справочник с описаниями и версиями кодов.

  • area TEXT — область (status, error, update_path)
  • code INTEGER — код
  • description TEXT — описание
  • version INTEGER — версия справочника
    (PK: area+code)

Пример наполнения:

  • status: 0=IDLE, 1=CALIBRATION, 2=ERROR, 3=READY, 4=WORK
  • error: 0=Calibration, 1=Motor, 2=RFID, 3=RFID_NoCard, 4=RFID_BadCard
  • update_path: 0=/mnt/nand_disk_ext/lacte

Сводная таблица ключевых полей

table_name field_name type allowed_values description
stat status INTEGER 0=IDLE; 1=CALIBRATION; 2=ERROR; 3=READY; 4=WORK Текущее состояние платы
stat n_RFID INTEGER любое число Номер RFID метки
stat mqtt_status BOOL True; False Отправка записи в MQTT
errors error INTEGER 0=Calibration; 1=Motor; 2=RFID; 3=RFID_NoCard; 4=RFID_BadCard;5=InvalidTime;6=ShelfLifeExceeded;7=UsageTimeExceeded Код ошибки
errors value INTEGER 0=Cleared; 1=Set Состояние ошибки
errors mqtt_status BOOL True; False Отправка записи в MQTT
service_info field TEXT version, uid, lacte_sn, update_complete, update_path, … Имя поля из board_data/события
service_info value TEXT строка или число Значение поля
service_info mqtt_status BOOL True; False Отправка записи в MQTT
dictionary area TEXT status; error; update_path Категория справочника
dictionary code INTEGER зависит от area Код
dictionary description TEXT человекочитаемое имя Текстовое описание
dictionary version INTEGER kDictVersion Версия записи

Справочник позволяет однозначно интерпретировать значения всех полей, включая статусные, ошибочные и служебные ( status, errors, update_complete и т.д.).

Принцип записи: если значение не изменилось, новая запись в соответствующую таблицу не создаётся ( идемпотентность по изменению).