Jak nastavit virtuální termostat místnosti pomocí dvojčat zařízení Azure IoT Hubu

Dokončeno

V této lekci se naučíte ovládat jednotku topení, ventilace a klimatizace (TVK) připojenou k Azure Sphere ze služby Azure IoT Hub.

Principy dvojčat zařízení IoT Hubu

Azure IoT Hub používá dvojčata zařízení k vyjádření hodnot k bodu v čase. IoT Hub může použít dvojčata zařízení k nastavení stavu na zařízení. Může například nastavit požadovanou teplotu místnosti. Zařízení může také pomocí dvojčat zařízení nahlásit svůj aktuální stav, například ohlásit režim provozu jednotky TVK (topení, ventilace a klimatizace) – zda aktuálně probíhá topení, chlazení nebo je jednotka vypnutá.

Dvojčata zařízení jsou dokumenty JSON, které Azure IoT Hub udržuje v cloudu pro všechna zařízení a slouží k ukládání informací o zařízení, včetně metadat, konfigurací a podmínek. Dvojčata zařízení IoT Hubu se často používají v případě dlouhotrvajících příkazů, které jsou určeny k tomu, aby dostaly zařízení do určitého stavu a po restartu zařízení do tohoto stavu vrátily. Například je to nastavení požadované teploty v místnosti.

Vlastnosti můžete používat následujícími způsoby:

  • Aktualizace cloud-zařízení
  • Aktualizace zařízení-cloud
  • Dotazování na hlášené vlastnosti

Řízení jednotky topení, ventilace a klimatizace (TVK) pomocí dvojčat zařízení Azure IoT Hubu

V Azure IoT Exploreru můžete nastavit požadované dvojče pro teplotu. Zařízení požadavek provede a potvrdí. Azure IoT Hub aktualizuje hlášenou vlastnost dvojčete zařízení a IoT Explorer pak zadá dotaz na tuto hlášenou vlastnost a zobrazí ji.

The illustration shows a cloud to device device twin configuration pattern.

Postup řízení jednotky TVK ze služby IoT Explorer

Následující postup popisuje, jak Azure IoT Explorer používá dvojčata zařízení k nastavování vlastností na zařízení:

  1. V Azure IoT Exploreru můžete nastavit požadovanou teplotu místnosti.
  2. Azure IoT Hub aktualizuje požadovanou vlastnost dvojčete zařízení a pošle do zařízení zprávu dvojčete zařízení.
  3. Zavolá se odpovídající funkce obslužné rutiny dvojčete zařízení.
  4. Zařízení implementuje požadovanou vlastnost (v tomto případě zapne topení nebo chlazení, aby se dosáhlo požadované teploty v místnosti).
  5. Zařízení potvrdí aktualizovanou konfiguraci do Azure IoT Hubu. Azure IoT Hub aktualizuje hlášenou vlastnost dvojčete zařízení.
  6. IoT Explorer zadá dotaz a zobrazí data hlášené vlastnosti dvojčete zařízení.

Začínáme s vazbami dvojčat zařízení

Vazba dvojčete zařízení namapuje název vlastnosti dvojčete zařízení na funkci obslužné rutiny, která se zavolá, aby implementovala příslušnou akci.

Následující příklad deklaruje vazbu dvojčete zařízení, aby nastavila požadovanou teplotu v místnosti. Tato deklarace mapuje dvojče zařízení vlastnosti DesiredTemperature Azure IoT Hubu na funkci obslužné rutiny s názvem DeviceTwinSetTemperatureHandler.

static LP_DEVICE_TWIN_BINDING dt_desiredTemperature = {
    .twinProperty = "DesiredTemperature",
    .twinType = LP_TYPE_FLOAT,
    .handler = DeviceTwinSetTemperatureHandler };

Nastavení požadované teploty

Následuje implementace funkce obslužné rutiny DeviceTwinSetTemperatureHandler. Funkce obslužné rutiny DesiredTemperature se volá, když zařízení obdrží zprávu o požadované vlastnosti z Azure IoT Hubu.

Poznámka:

V rámci konvencí technologie IoT Plug and Play by zařízení by mělo potvrdit aktualizaci dvojčete zařízení zavoláním lp_deviceTwinAckDesiredState.

/// <summary>
/// Device Twin Handler to set the desired temperature value
/// </summary>
static void DeviceTwinSetTemperatureHandler(LP_DEVICE_TWIN_BINDING* deviceTwinBinding)
{
    // validate data is sensible range before applying
    if (deviceTwinBinding->twinType == LP_TYPE_FLOAT && *(float*)deviceTwinBinding->twinState >= -20.0f && *(float*)deviceTwinBinding->twinState <= 80.0f)
    {
        lp_deviceTwinAckDesiredState(deviceTwinBinding, deviceTwinBinding->twinState, LP_DEVICE_TWIN_COMPLETED);
        SetHvacStatusColour((int)previous_temperature);
    }
    else {
        lp_deviceTwinAckDesiredState(deviceTwinBinding, deviceTwinBinding->twinState, LP_DEVICE_TWIN_ERROR);
    }
}

Hlášení aktuálního režimu provozu TVK

Režim provozu TVK závisí na teplotě místnosti. Může jít o topení, chlazení nebo stav vypnutí. K nahlášení aktuálního režimu provozu jednotky TVK můžeme použít aktualizaci dvojčete zařízení typu zařízení-cloud.

Aktualizace zařízení-cloud

The illustration shows a device to cloud device twin configuration pattern.

  1. Azure Sphere zjistí, že se změnil režim provozu TVK.
  2. Azure Sphere pošle zprávu dvojčeti zařízení, aby nahlásilo nový režim provozu TVK do Azure IoT Hubu.
  3. IoT Explorer zadá dotaz a zobrazí aktualizovaný provozní režim jednotky TVK.

V následujícím příkladu je deklarována vlastnost ReportedHvacState dvojčete zařízení typu řetězec. Funkce obslužné rutiny není potřeba, protože jde o jednosměrnou vazbu zařízení-cloud.

static LP_DEVICE_TWIN_BINDING dt_reportedHvacState = {
    .twinProperty = "ReportedHvacState",
    .twinType = LP_TYPE_STRING };

Zařízení aktualizuje vlastnost ReportedHvacState zavoláním funkce lp_deviceTwinReportState. Musíte předat vlastnost správného typu.

lp_deviceTwinReportState(&dt_reportedHvacState, (void*)hvacState[(int)current_led]);

Postup mapování zprávy dvojčat zařízení na obslužné rutiny

Všechny deklarované vazby dvojčat zařízení musí být přidány s odkazem na pole deviceTwinBindingSet. Když zařízení přijme zprávu dvojčete zařízení, hledá se v poli deviceTwinBindingSet odpovídající název twinProperty. Když je nalezena shoda, je volána odpovídající funkce obslužné rutiny.

LP_DEVICE_TWIN_BINDING* deviceTwinBindingSet[] = { &dt_desiredTemperature, &dt_reportedTemperature, &dt_reportedHvacState };

Otevření sady vazeb dvojčat zařízení

Sada vazeb dvojčat zařízení se inicializuje ve funkci InitPeripheralsAndHandlers v souboru main.c.

lp_deviceTwinSetOpen(deviceTwinBindingSet, NELEMS(deviceTwinBindingSet));

Zavření sady vazeb dvojčat zařízení

Sada vazeb dvojčat zařízení se zavírá ve funkci ClosePeripheralsAndHandlers v souboru main.c.

lp_deviceTwinSetClose();