Добрый день!
Написал свой сервис, который управляет рядом внешних устройств и связывает их с 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% повторяя его нынешнюю декларацию), как я должен изменить код правила, чтобы оно не выдавало ошибку при неработающем контейнере с сервисом?