デバイスと接続する

IoTドライバを使用すると、OdooモジュールはIoTボックスに接続されたあらゆるデバイスとリアルタイムで通信できます。 IoT Boxとの通信は両方の方法で行われるため、Odooクライアントはサポートされているどのデバイスからでもコマンドを送信して情報を受信することができます。

デバイスのサポートを追加するには、以下が必要です:

  • 特定の種類の接続されたデバイスを検出する Interface

  • 個々のデバイスと通信するための

各ブートで、IoTボックスは、接続されたOdooインスタンス上に配置できるインターフェースとドライバのすべてをロードします。 各モジュールには、IoT Boxにコピーされる iot_handlers ディレクトリを含めることができます。このディレクトリの構造は次のとおりです。

your_module
├── ...
└── iot_handlers
    ├── drivers
    │   ├── DriverName.py
    │   └── ...
    │
    └── interfaces
        ├── InterfaceName.py
        └── ...

デバイスを検出

IoT Boxに接続されているデバイスは、Interface を介して検出されます。サポートされている接続タイプ(USB、Bluetooth、ビデオ、プリンタ、シリアルなど)ごとにインターフェイスがあります。 をクリックします。インターフェイスは検出されたデバイスのリストを維持し、正しいドライバーと関連付けます。

サポートされているデバイスは、IPアドレスを介して接続されたOdooインスタンスのIoTモジュールにアクセスできる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`メソッドをすべての検出デバイスでテストします。 Driverのサポートされているメソッドが`True`を返す場合、対応するデバイス用にこのドライバのインスタンスが作成されます。

注釈

ドライバーの supported メソッドは優先順位を与えられます。 子クラスの supported メソッドは、常に親クラスのいずれかの前にテストされます。 この優先度は、ドライバーの priority 属性を変更することで調整できます。

新しいドライバを作成するには以下が必要です:

  • 「ドライバー」を拡張

  • connection_type クラス属性を設定します。

  • device_typedevice_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);

ドライバでは、Odoo モジュールから呼び出されたときに実行される action メソッドを定義します。 呼び出し中に与えられたデータを引数に取ります。

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)