Драйверы 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)