Интернет вещей

Драйверы IoT позволяют любому модулю Odoo взаимодействовать в режиме реального времени с любым устройством, подключенным к IoT Box. Связь с IoT Box происходит в обоих направлениях, поэтому клиент Odoo может отправлять команды и получать информацию с любого из поддерживаемых устройств. Чтобы добавить поддержку устройства, все, что нам нужно, это Driver.

При каждой загрузке IoT Box будет загружать все Driver, которые могут быть расположены на подключенном экземпляре Odoo. Каждый модуль может содержать каталог drivers, содержимое которого будет скопировано в IoT Box.

Определение устройств

Файл addons/hw_drivers/controllers/driver.py содержит менеджер, отвечающий за устройства. Менеджер ведет список подключенных устройств и связывает их с нужным Driver.

Поддерживаемые устройства появятся как на домашней странице IoT Box, к которой вы можете получить доступ через ее IP-адрес, так и в модуле IoT подключенного экземпляра Odoo.

Driver

Как только Диспетчер извлечет список обнаруженных устройств, он будет обходить все Driver с одинаковым типом подключения и проверять их соответствующий supported метод на всех обнаруженных устройствах. Если supported метод Driver возвращает True, экземпляр этого Driver будет создан для соответствующего устройства.

Создание нового Driver требует:

  • Расширить Driver
  • Настроить атрибут connection_type.
  • Настроить атрибуты device_type, device_connection и device_name.
  • Определить метод supported
from odoo.addons.hw_drivers.controllers.driver import Driver

class DriverName(Driver):
    connection_type = 'ConnectionType'

    def __init__(self, device):
        super(NewDriver, self).__init__(device)
        self._device_type = 'DeviceType'
        self._device_connection = 'DeviceConnection'
        self._device_name = 'DeviceName'

    @classmethod
    def supported(cls, device):
        ...

Коммуникация с Driver

Как только ваше новое устройство будет обнаружено и появится в модуле IoT, следующим шагом будет установление связи с ним. Так как IoT box имеет только локальный IP-адрес, доступ к нему возможен только из той же локальной сети. Поэтому общение должно происходить на стороне браузера, в JavaScript.

Процесс зависит от направления связи: - от браузера до IoT Box, через Actions - от IoT Box до браузера, через Longpolling

Оба канала доступны из одного и того же объекта JS, DeviceProxy, который создается с использованием IP-адреса IoT Box и идентификатора устройства.

var DeviceProxy = require('iot.widgets').DeviceProxy;

var iot_device = new DeviceProxy({
    iot_ip: iot_ip,
    identifier: device_identifier
});

Действия

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

Действие может быть выполнено над объектом DeviceProxy.

iot_device.action(data);

В вашем драйвере определите метод action, который будет выполняться при вызове из модуля Odoo. Он принимает данные, во время вызова, в качестве аргумента.

def action(self, data):
    ...

Longpolling

огда какой-либо модуль в Odoo хочет прочитать данные с определенного устройства, он создает listener, с идентификатром IP/доменного имени IoT Box и идентификатором устройства, и передает ему функцию обратного вызова, которая вызывается каждый раз, когда изменяется состояние устройства. Обратный вызов вызывается с новыми данными в качестве аргумента.

iot_device.add_listener(this._onValueChange.bind(this));

_onValueChange: function (result) {
    ...
}

В Driver событие освобождается путем вызова функции device_changed из event_manager. Все обратные вызовы, установленные на listener, будут затем вызываться с self.data в качестве аргумента.

from odoo.addons.hw_drivers.controllers.driver import event_manager

class DriverName(Driver):
    connection_type = 'ConnectionType'

    def methodName(self):
        self.data = {
            'value': 0.5,
            ...
        }
        event_manager.device_changed(self)