Csatlakozás egy eszközhöz

Az IoT illesztőprogramok lehetővé teszik bármely Odoo modul számára, hogy valós időben kommunikáljon bármely, az IoT Boxhoz csatlakoztatott eszközzel. Az IoT Boxszal való kommunikáció kétirányú, így az Odoo kliens parancsokat küldhet és információkat fogadhat bármely támogatott eszköztől.

Egy eszköz támogatásának hozzáadásához mindössze a következőkre van szükség:

  • egy Interface, amely érzékeli a csatlakoztatott eszközöket egy adott típusból

  • egy Driver, amely kommunikál egy egyedi eszközzel

Minden indításkor az IoT Box betölti az összes Interfacet és Drivert, amely megtalálható a csatlakoztatott Odoo példányon. Minden modul tartalmazhat egy iot_handlers könyvtárat, amelyet az IoT Boxra másolnak. Ennek a könyvtárnak a szerkezete a következő

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

Eszközök érzékelése

Az IoT Boxhoz csatlakoztatott eszközöket Interface-eken keresztül érzékelik. Minden támogatott csatlakozási típushoz (USB, Bluetooth, Video, Nyomtatók, Soros, stb.) van egy Interface. Az interface fenntart egy listát az érzékelt eszközökről, és társítja őket a megfelelő Driverrel.

A támogatott eszközök megjelennek mind az IoT Box Kezdőlapján, amelyet az IP címén keresztül érhet el, mind a csatlakoztatott Odoo példány IoT moduljában.

Felület

A Felület szerepe az, hogy fenntartson egy listát a meghatározott kapcsolattípuson keresztül csatlakoztatott eszközökről. Egy új felület létrehozása megköveteli

  • Az Interface osztály kiterjesztése

  • A connection_type osztályattribútum beállítása

  • A get_devices metódus implementálása, amelynek egy szótárt kell visszaadnia, amely az észlelt eszközökről tartalmaz adatokat. Ezeket az adatokat argumentumként adjuk át a Vezérlők konstruktorainak és supported metódusának.

Megjegyzés

A _loop_delay attribútum beállítása módosítja a get_devices hívások közötti intervallumot. Alapértelmezés szerint ez az intervallum 3 másodpercre van állítva.

from odoo.addons.hw_drivers.interface import Interface

class InterfaceName(Interface):
    connection_type = 'ConnectionType'

    def get_devices(self):
        return {
            'device_identifier_1': {...},
            ...
        }

Vezérlő

Miután a felület lekérte az észlelt eszközök listáját, végigmegy az összes Vezérlőn, amelyeknek ugyanaz a connection_type attribútuma, és teszteli az adott eszközökön a supported metódusukat. Ha egy Vezérlő supported metódusa True értéket ad vissza, akkor az adott eszközhöz létrejön egy példány ebből a Vezérlőből.

Megjegyzés

A vezérlők supported metódusai prioritási sorrendben vannak megadva. Egy gyermekosztály supported metódusát mindig a szülőjéé előtt tesztelik. Ez a prioritás a Vezérlő priority attribútumának módosításával állítható be.

Egy új Vezérlő létrehozása megköveteli:

  • A Driver kiterjesztése

  • A connection_type osztályattribútum beállítása.

  • A device_type, device_connection és device_name attribútumok beállítása.

  • A supported metódus definiálása

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):
        ...

Kommunikáció az eszközökkel

Miután az új eszköz észlelésre került és megjelenik az IoT modulban, a következő lépés a kommunikáció vele. Mivel a doboznak csak helyi IP-címe van, csak ugyanarról a helyi hálózatról érhető el. A kommunikációnak ezért a böngésző oldalon, JavaScript-ben kell történnie.

A folyamat a kommunikáció irányától függ: - A böngészőtől a dobozig, Actions segítségével - A doboztól a böngészőig, Longpolling segítségével

Mindkét csatorna ugyanabból a JS objektumból érhető el, a DeviceProxy-ból, amelyet az IoT Box IP-címével és az eszköz azonosítójával példányosítanak.

var DeviceProxy = require('iot.DeviceProxy');

var iot_device = new DeviceProxy({
    iot_ip: iot_ip,
    identifier: device_identifier
});

Műveletek

A műveleteket arra használják, hogy egy kiválasztott eszközt egy adott művelet végrehajtására utasítsanak, például egy kép készítésére, egy nyugta nyomtatására stb.

Megjegyzés

Meg kell jegyezni, hogy ezen az útvonalon a doboz nem küld „választ”, csak a kérés állapotát. Az akcióra adott válasz, ha van ilyen, a longpolling segítségével kérhető le.

Egy művelet végrehajtható a DeviceProxy objektumon.

iot_device.action(data);

A meghajtóban definiáljon egy action metódust, amely végrehajtásra kerül, amikor egy Odoo modulból hívják. Az argumentumként a hívás során megadott adatokat veszi át.

def action(self, data):
    ...

Hosszú lekérdezés

Amikor bármely Odoo modul adatot szeretne olvasni egy adott eszközről, létrehoz egy hallgatót, amelyet a doboz IP/domain és az eszköz azonosítója azonosít, és átad neki egy visszahívási függvényt, amelyet minden alkalommal meghívnak, amikor az eszköz állapota megváltozik. A visszahívást az új adatokkal hívják meg argumentumként.

iot_device.add_listener(this._onValueChange.bind(this));

_onValueChange: function (result) {
    ...
}

A meghajtóban egy esemény felszabadul az event_manager device_changed függvényének hívásával. Az összes visszahívás, amely a hallgatón be van állítva, ezután self.data argumentummal kerül meghívásra.

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)