Підключення до пристрою¶
Драйвери IoT дозволяють будь-якому модулю Odoo спілкуватися в режимі реального часу з будь-яким пристроєм, підключеним до IoT-коробки. Зв’язок з IoT-коробкою відбувається в обох напрямках, тому клієнт Odoo може надсилати команди та отримувати інформацію з будь-якого з підтримуваних пристроїв.
Щоб додати підтримку для пристрою, нам потрібно лише:
Інтерфейс
для виявлення підключених пристроїв певного типуДрайвер
для зв’язку з окремим пристроєм
Під час кожного завантаження IoT-коробкизавантажуватиме всі інтерфейси та драйвери, які можна знайти на підключеному екземплярі Odoo. Кожен модуль може містити каталог iot_handlers
, який буде скопійовано в IoT Box. Структура цього каталогу така
your_module
├── ...
└── iot_handlers
├── drivers
│ ├── DriverName.py
│ └── ...
│
└── interfaces
├── InterfaceName.py
└── ...
Виявлення пристроїв¶
Пристрої, підключені до IoT-коробки, виявляються через Інтерфейси
. Існує інтерфейс для кожного підтримуваного типу підключення (USB, Bluetooth, відео, принтери, послідовний порт тощо). Інтерфейс підтримує список виявлених пристроїв і пов’язує їх із потрібним драйвером.
Підтримувані пристрої відображатимуться як на домашній сторінці IoT-коробки, до якої ви можете отримати доступ через їх IP-адресу, так і в модулі IoT підключеного екземпляра Odoo.
Інтерфейс¶
Роль інтерфейсу полягає в тому, щоб підтримувати список пристроїв, підключених через певний тип підключення. Створення нового інтерфейсу вимагає
Розширення класу
Інтерфейс
Встановлення атрибута класу
connection_type
Реалізація методу get_devices, який має повертати словник, що містить дані про кожен виявлений пристрій. Ці дані будуть надані як аргумент для конструкторів і
підтримуваного
методу драйверів.
Примітка
Налаштування атрибута _loop_delay
змінить інтервал між викликами get_devices
. За замовчуванням цей інтервал встановлено на 3 секунди.
from odoo.addons.hw_drivers.interface import Interface
class InterfaceName(Interface):
connection_type = 'ConnectionType'
def get_devices(self):
return {
'device_identifier_1': {...},
...
}
Драйвер¶
Після того, як інтерфейс отримає список виявлених пристроїв, він перегляне всі драйвери, які мають однаковий атрибут connection_type
, і перевірить їх відповідний підтримуваний
метод на всіх виявлених пристроях. Якщо підтримуваний метод драйвера повертає True
, екземпляр цього драйвера буде створено для відповідного пристрою.
Примітка
Підтримуваним
методам драйверів надано порядок пріоритетів. Підтримуваний
метод дочірнього класу завжди перевірятиметься перед методом його батьківського класу. Цей пріоритет можна налаштувати шляхом зміни атрибута пріоритет
драйвера.
Для створення нового драйвера потрібно:
Розширення
Драйвер
Встановлення атрибута класу
connection_type
.Налаштування атрибутів
device_type
,device_connection
іdevice_name
.Визначення
підтримуваного
методу
from odoo.addons.hw_drivers.driver import Driver
class DriverName(Driver):
connection_type = 'ConnectionType'
def __init__(self, identifier, device):
super(NewDriver, self).__init__(identifier, device)
self.device_type = 'DeviceType'
self.device_connection = 'DeviceConnection'
self.device_name = 'DeviceName'
@classmethod
def supported(cls, device):
...
Спілкування з пристроями¶
Коли ваш новий пристрій буде виявлено та з’явиться в модулі Інтернету речей, наступним кроком буде встановлення зв’язку з ним. Оскільки ящик має лише локальну IP-адресу, доступ до нього можливий лише з тієї самої локальної мережі. Тому комунікація має відбуватися на стороні браузера, у JavaScript.
Процес залежить від напрямку комунікації: - Від браузера до коробки, через Дії - Від ящика до браузера, через Longpolling
Доступ до обох каналів здійснюється з одного об’єкта JS, DeviceProxy
, який створюється за допомогою IP-адреси IoT-коробки та ідентифікатора пристрою.
var DeviceProxy = require('iot.DeviceProxy');
var iot_device = new DeviceProxy({
iot_ip: iot_ip,
identifier: device_identifier
});
Дії¶
Дії використовуються, щоб наказати вибраному пристрою виконати певну дію, наприклад зробити знімок, надрукувати надходження тощо.
Примітка
Слід зазначити, що на цьому маршруті скринька не надсилатиме “відповідь”, лише статус запиту. Відповідь на дію, якщо така є, має бути отримана через longpolling.
З об’єктом DeviceProxy можна виконати дію.
iot_device.action(data);
У вашому драйвері визначте метод action
, який виконуватиметься під час виклику з модуля Odoo. Він приймає дані, надані під час виклику, як аргумент.
def action(self, data):
...
Longpolling¶
Коли будь-який модуль в Odoo хоче прочитати дані з певного пристрою, він створює слухача, ідентифікованого за IP/доменом ящика та ідентифікатором пристрою, і передає йому функцію зворотного виклику, яка викликається щоразу, коли змінюється статус пристрою. Зворотний виклик викликається новими даними як аргументом.
iot_device.add_listener(this._onValueChange.bind(this));
_onValueChange: function (result) {
...
}
У драйвері подія звільняється шляхом виклику функції device_changed
з event_manager
. Усі зворотні виклики, установлені для слухача, будуть викликані з self.data
як аргумент.
from odoo.addons.hw_drivers.event_manager import event_manager
class DriverName(Driver):
connection_type = 'ConnectionType'
def methodName(self):
self.data = {
'value': 0.5,
...
}
event_manager.device_changed(self)