連接設備?
IoT驅動程序允許任何Odoo模塊與連接到IoT Box的任何設備實時通信。與IoT Box的通信是雙向的,因此Odoo客戶端可以向任何受支持的設備發送命令并接收信息。
要為設備添加支持,我們所需要的是:
一個
接口
,用于檢測特定類型的已連接設備一個
驅動程序
,用于與單個設備通信
每次啟動時,IoT Box 將加載連接的 Odoo 實例中可以找到的所有接口和驅動程序。每個模塊都可以包含一個 iot_handlers
目錄,該目錄將被復制到 IoT Box。該目錄的結構如下:
your_module
├── ...
└── iot_handlers
├── drivers
│ ├── DriverName.py
│ └── ...
│
└── interfaces
├── InterfaceName.py
└── ...
檢測設備?
IoT Box 連接的設備是通過 接口
檢測到的。每種支持的連接類型(USB、藍牙、視頻、打印機、串口等)都有一個接口。接口維護了檢測到的設備列表,并將它們與正確的驅動程序關聯起來。
支持的設備將會出現在IoT Box主頁上,您可以通過其IP地址訪問,并出現在連接的Odoo實例的IoT模塊中。
接口?
接口的作用是維護通過確定的連接類型連接的設備列表。創建新接口需要
擴展
Interface
類設置
connection_type
類屬性實現
get_devices
方法,該方法應返回一個包含有關每個檢測到的設備的數據的字典。這些數據將作為構造函數和驅動程序的supported
方法的參數。
注解
設置 _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
屬性的驅動程序,并在所有檢測到的設備上測試它們各自的 supported
方法。如果驅動程序的 supported
方法返回 True
,則將為相應的設備創建此驅動程序的實例。
注解
supported
方法的驅動程序按優先級順序給出。子類的 supported
方法將始終在其父類之前進行測試??梢酝ㄟ^修改 Driver
的 priority
屬性來調整此優先級。
創建一個新的驅動程序需要:
擴展
Driver
設置
connection_type
類屬性。設置
device_type
、device_connection
和device_name
屬性。定義
supported
方法
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):
...
與設備通信?
一旦您的新設備被檢測到并出現在IoT模塊中,下一步就是與它通信。由于該盒子只有本地IP地址,因此只能從同一本地網絡訪問。因此,通信需要在瀏覽器端使用JavaScript進行。
通信方向決定了該過程的步驟:- 從瀏覽器到盒子,通過 Actions - 從盒子到瀏覽器,通過 Longpolling
兩個通道都可以從同一個JS對象 DeviceProxy
中訪問,該對象使用IoT Box的IP和設備標識符進行實例化。
var DeviceProxy = require('iot.DeviceProxy');
var iot_device = new DeviceProxy({
iot_ip: iot_ip,
identifier: device_identifier
});
操作?
操作用于告訴所選設備執行特定的操作,例如拍照、打印收據等。
注解
需要注意的是,盒子在此路由上不會發送任何“答案”,只會發送請求狀態。如果有任何操作的答案,必須通過長輪詢來檢索。
可以在DeviceProxy對象上執行操作。
iot_device.action(data);
在您的驅動程序中,定義一個 action
方法,當從Odoo模塊調用時將被執行。它將接受調用時傳遞的數據作為參數。
def action(self, data):
...
長輪詢?
當Odoo中的任何模塊想要從特定設備讀取數據時,它會創建一個偵聽器,該偵聽器由盒子的IP/域和設備標識符標識,并傳遞一個回調函數,每次設備狀態更改時都會調用該函數?;卣{函數將新數據作為參數調用。
iot_device.add_listener(this._onValueChange.bind(this));
_onValueChange: function (result) {
...
}
在驅動程序中,通過從 event_manager
調用 device_changed
函數來釋放事件。然后,所有在監聽器上設置的回調函數都將使用 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)