Некорректно работает правило для Мастер-выключателя

Добрый день! Есть выключатель кнопочный для мастер-выключателя (сценарного) контакты заведены на контроллер А1 и 5V OUT. Использовал правило приведенное в примерах “Мастер-выключатель с восстановлением последнего состояния”, только с моими устройствами:

defineVirtualDevice("power_off", {

    title: "Мастер-выключатель",

    cells: {

        power_off: {

            type: "pushbutton"

        },

    }

});

 

var ps = new PersistentStorage("power-storage", { global: true });

var lights = ["wb-mr6cv3_119/K1", "wb-mr6cv3_119/K2", "wb-mr6cv3_119/K3", "wb-mr6cv3_119/K4", "wb-mr6cv3_119/K5", "wb-mr6cv3_119/K6",

              "wb-mr6cv3_113/K1", "wb-mr6cv3_113/K2", "wb-mr6cv3_113/K3", "wb-mr6cv3_113/K4", "wb-mr6cv3_113/K5", "wb-mr6cv3_113/K6"];

 

var isPowerOff = true;

 

defineRule({

    whenChanged: ["wb-gpio/A1_IN", "power_off/power_off"],

    then: function (newValue, devName, cellName) {

        if (isPowerOff) {

            lights.forEach(function (light) {

                ps[light] = dev[light];

                dev[light] = false;

            });

        } else {

            lights.forEach(function (light) {

                dev[light] = ps[light];

            });

        }

        isPowerOff = !isPowerOff;

    }

});


Начал проверять, нажимаю клавишу свет выключился, нажимаю еще раз тишина. Виртуальное устройство проверяю, такая же история выключает, но не включает. Подождал какое-то время, попутно обновил одно реле. Пробую еще раз, при нажатии на клавишу, свет выключается, но как, только отпускаешь клавишу - свет обратно включается, длительность и скорость нажатия никак не влияет. Разобрал выключатель замкнул провода свет не горит - естественно, размыкаю - горит. Как будто сценарий написан для обычного выключателя). Виртуальные устройство - без проблем выключает и включает по нажатию. Менял входы контактов “А”, проверял соединения не чего не помогает.

Контроллер не перезагружал

Подскажите, в чем может быть проблема, если в правиле нет ошибки?

Добрый день.

А сколько событий возникает при изменении состояния этого входа? Предполагаю что два. При соединении и размыкании входа.
Соответственно - нужно обрабатывать только одно из них.
Ну и советую использовать логи для отладки.

1 Like
defineVirtualDevice('light-control', {
	title: {en: 'Light control', ru: 'Управление освещением'},
	cells: {
		master: {title: {en: 'Nobody at home', ru: 'Никого нет дома'}, type: 'switch', value: false, order: 1}
	}
});

var save = new PersistentStorage('power-storage', { global: true });

var lights = [
	'wb-mr6cv3_119/K1', 'wb-mr6cv3_119/K2', 'wb-mr6cv3_119/K3', 'wb-mr6cv3_119/K4', 'wb-mr6cv3_119/K5', 'wb-mr6cv3_119/K6',
	'wb-mr6cv3_113/K1', 'wb-mr6cv3_113/K2', 'wb-mr6cv3_113/K3', 'wb-mr6cv3_113/K4', 'wb-mr6cv3_113/K5', 'wb-mr6cv3_113/K6'
];

defineRule('power-off triggers', {
    whenChanged: ['wb-gpio/A1_IN', 'light-control/master'],
	then: function (value, topic, control) {
		defineAlias('power_off', 'light-control/master');

		if (topic == 'wb-gpio' && !value) return;
		if (control != 'master') power_off = !power_off;

		switch (power_off) {
			case true:
				lights.forEach(function(lamp) {
					save[lamp] = dev[lamp];
					dev[lamp] = false;
				});
			break;

			case false:
				lights.forEach(function(lamp) {
					if (save[lamp] != undefined)
					dev[lamp] = save[lamp];
				});
			break;
		}
	}
});

Вот переделанный код под вашу задачу :backhand_index_pointing_up:

Иметь кнопку под переключение не совсем хорошая идея - лцчше уж тумблер.
С таким подходом и переменную на последнее состояние можно упразднить.

2 Likes

Благодарю, просто я сам “дурак”)) подумал, что правило для выключателей без фиксацией. Исходя из этого мне не было понятно, так как пока с правилами и основными функциями не особо знаком и пытался логически проследить действия описанные в нем, как же обрабатываться сменяющиеся состояния. А так, все верно при нажатии происходит событие, на контакт “А” подается питание 5В - 1, отпускаю оно пропадает - 0, в логах все это прекрасно видно)

Большое Спасибо!, я хотел в последующем заморочиться на типы нажатия и соответствующие действия, согласен для реализации правилами “классического” мастер-выключателя, лучше использовать обычный выключатель, хотя бы для понимания, что его включали