連接設備?

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 方法將始終在其父類之前進行測試??梢酝ㄟ^修改 Driverpriority 屬性來調整此優先級。

創建一個新的驅動程序需要:

  • 擴展 Driver

  • 設置 connection_type 類屬性。

  • 設置 device_type 、 device_connectiondevice_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)