Объявление виртуальных устройств из внешнего сервиса

Добрый день!

Написал свой сервис, который управляет рядом внешних устройств и связывает их с wb-rules через виртуальные устройства и правила. Все работает, но!!!

Заметил, что несмотря на все танцы с бубнами, декларации виртуальных устройств и реальный функционал сервиса периодически уходят в рассинхрон (делать зависимости при сборке докер-контейнера через guthub workflows не помогло). Поэтому решил перейти к декларации устройств прямо в коде сервиса на питоне по такому примеру:

  • /devices/media_center/meta{"driver": "my_python_service", "title": {"en": "Media Center"}} (retained)github.com.
  • /devices/media_center/controls/Power/meta{"type": "switch", "readonly": false, "order": 1, "title": "Power"} (retained).
  • /devices/media_center/controls/Power"0" (current value, off – retained).
  • /devices/media_center/controls/Power/on(subscribe to this for commands, accept "0"/"1" to turn off/on) github.com.
  • /devices/media_center/controls/Volume/meta{"type": "range", "min":0, "max":100, "units":"%", "order": 2, "readonly": false, "title": "Volume"} (retained).
  • /devices/media_center/controls/Volume"30" (current volume level – retained).
  • /devices/media_center/controls/Volume/on(subscribe here for volume set commands, expecting values 0–100).
  • (If needed: /devices/media_center/meta/error – empty or not set normally; set to e.g. "offline" by LWT if service disconnects).

Так, например работает драйвер кондиционеров Mitsibushi (не родной, а послесанкционный :). Проверил, принципиально работает, есть только одно но!!!

Когда контейнер не запущен, wb-rules этих устройств не знает. Поэтому - вопрос:

что я должен сделать с правилами, работающими с такими устройствами? Пример:

// Kitchen hood management

// ------------------Virtual device to support kitchen hood-------------

defineVirtualDevice(“kitchen_hood”, {
title: “Контроль за вытяжкой”,
cells: {
light: {
type: “switch”,
readOnly: false,
value: false
},
speed: {
type: “range”,
readOnly: false,
max: 4,
value: 0
}
}
});

// Kitchen hood light control with debounce
defineRule(“Kitchen Light Switch Control”, {
whenChanged: [“wb-mr6c_47/K6”],
then: function(newValue, devName, cellName) {
// Process the signal immediately
log("Rule triggered: " + newValue);
// Action logic:
// log("Before: " + dev[“kitchen_hood/light”]);
dev[“kitchen_hood/light”] = dev[“wb-mr6c_47/K6”];
}
});

Так выглядит управление вытяжкой сейчас. Написанное правило гарантирует включение/выключение подсветки вытяжки вместе с подсветкой кухни при нажатии выключателя. Если я уберу декларацию устройства из файла и буду объявлять его из питона (на 100% повторяя его нынешнюю декларацию), как я должен изменить код правила, чтобы оно не выдавало ошибку при неработающем контейнере с сервисом?

Я правильно понимаю, что надо сделать что-то вроде:

defineRule(“Kitchen Light Switch Control”, {
whenChanged: [“wb-mr6c_47/K6”],
then: function(newValue, devName, cellName) {
if (dev[“kitchen_hood”] && dev[“kitchen_hood/light”] !== undefined) {
dev[“kitchen_hood/light”] = dev[“wb-mr6c_47/K6”];
} else {
log(“Kitchen hood device or control is not available, skipping update”);
}
}
});

Добрый день!

Как мне кажется, не стоит реализовывать это таким образом. Если контейнер не работает — это аварийная ситуация, и отображение её в интерфейсе красным цветом как раз уместно. Это сигнал о том, что необходимо принять меры для восстановления работоспособности системы.

Вы правы, чуть не упустил правильную мысль :slight_smile:

Спасибо!

1 лайк