Zigbee2mqtt+ikea lamp + ikea switch howto

Здравствуйте, есть такая задача:

управлять лампочкой Ikea с пульта Ikea

в наличие:

Контроллер WB7+WBE2R-R-ZIGBEE
Лампа TRADFRI 1000Lm (ikea smart home zigbee)
Пульт TRADFRI (круглый 5 кнопок вкл, лево, право, верх, вниз)

на контроллере установлено и настроено NODE-RED

, а также по этой статье (Подключение устройств Zigbee к контроллеру Wiren Board — Wiren Board)
Screenshot 2022-03-03 at 01.35.00

установлено и настроено

zigbee2mqtt
wb-zigbee2mqtt

на контроллер WB подключены Лампа и Пульт

ЛАМПА
Screenshot 2022-03-03 at 01.35.31

ПУЛЬТ
Screenshot 2022-03-03 at 01.21.18

0x000d6ffffe256597 - Пульт
0x8cf681fffe2a0b0b - Лампа

на контроллере завел несколько правил (RULE) они прекрасно работают:

LAMP_BRIG.js (могу регулировать яркость лампы меняя параметр brightness в диапозоне от 0 - 254)
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ brightness: “20” }), 2, false);

LAMP_OFF.js (могу выключать лампу)
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ state: “OFF” }), 2, false);

LAMP_ON.js (могу включать лампу)
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ state: “on” }), 2, false);

правила “писал” копипастом с небольшой дороботкой параметров (state: ON/OFF, brightness: 0-254)

тут есть интересные свойства лампы IKEA LED1623G12 control via MQTT | Zigbee2MQTT

при нажатии на кнопки Пульта также вижу какую кнопку нажал (action)

Screenshot 2022-03-03 at 01.20.13
Screenshot 2022-03-03 at 01.20.30

при коротком нажатии:
toggle - центральная кнопка
arrow_right_click - стрелка в право
arrow_right_click - стрелка в лево
brightness_up_click - стрелка(яркость) наверх
brightness_down_click - стрелка(яркость) вниз

при длинном нажатии:
arrow_right_hold
arrow_right_hold
brightness_up_hold
brightness_down_hold

после того как отпустил кнопку после длинного нажатия:
arrow_right_release
arrow_right_release
brightness_up_release
brightness_down_release

все по отдельности вроде нормально, но как все совместить, чтоб при нажатии на кнопку пульта реагировала лампочка никак не могу разобраться, также никак не пойму как сделать виртуальный аналог пульта чтоб из веб интерфейсам можно было управлять лампой. (по типу управления пищалкой Buzzer)

помогите пожалуйста пошаговым руководством или может кто то, что то похожее делал и написал статью

в настройке WB я прям совсем новичок, и Java и JSON запросы тоже не знаю,

мне будет достаточно нескольких примеров и методики что зачем настраивается

заранее большое спасибо!

Здравствуйте!

В этом случае нужно создать правило, которое по изменению канала action пульта будет выполнять публикацию сообщения, аналогично тому, что вы уже делаете из правил. Пример есть здесь:
https://wirenboard.com/wiki/Rule_Examples#Слежение_за_контролом

Если нужна помощь с конкретным правилом - выберите, например, для начала одно действие и реакцию на него (что нужно отправить), постараемся помочь с написанием правила на wb-rules.

Для создания виртуального пульта нужно создать в веб-интерфейсе контроллера виртуальное устройство (реализация есть в примере выше).

Также было бы хорошо ознакомиться с документацией по написанию правил и конвенцией MQTT, используемой в контроллере:

https://wirenboard.com/wiki/Rule_Examples

добрый день, спасибо за инфо, очень ценно!

сделал правило:

defineVirtualDevice(“simple_test”, {
title: “Simple switch”,
cells: {
enabled: {
type: “switch”,
value: false
},
}
});

defineRule(“simple_switch”, {
whenChanged: “simple_test/enabled”,
then: function (newValue, devName, cellName) {
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ state: “ON” }), 2, false);
}
});

в разделе DEVICES появилась виртуальная кнопка Simple switch

в случае если лампочка выключена переключение ползунка приводит к включению лампочки.

Можете подсказать как этот выключатель сделать универсальным, чтоб и включалась и выключалась ?

удалось решить вопрос но как-то совсем коряво

defineVirtualDevice(“simple_test”, {
title: “Simple switch”,
cells: {
enabled: {
type: “switch”,
value: false
},
disabled: {
type: “switch”,
value: true
},
}
});

defineRule(“simple_switch_ON”, {
whenChanged: “simple_test/enabled”,
then: function (newValue, devName, cellName) {
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ state: “ON” }), 2, false);
}
});

defineRule(“simple_switch_OFF”, {
whenChanged: “simple_test/disabled”,
then: function (newValue, devName, cellName) {
publish(“zigbee2mqtt/0x8cf681fffe2a0b0b/set”, JSON.stringify({ state: “OFF” }), 2, false);
}
});

помогите пожалуйста с более корректным написанием(описанием) действий

Я бы сделал так:

defineVirtualDevice("room_light", {
    title: "Room light",
    cells: {
        lamp_switch: {
            type: "switch",
            value: false,
        },
    },
});

defineRule("switch_lamp", {
    whenChanged: "room_light/lamp_switch",
    then: function (newValue, devName, cellName) {
        //проверяем, нужно включить или выключить в зависимости от нового положения контрола, которое будет передано в newValue
        if (newValue) {
            //действия при включении
            publish(
                "zigbee2mqtt/0x8cf681fffe2a0b0b/set",
                JSON.stringify({ state: "ON" }),
                2,
                false
            );
        } else {
            //действия при выключении
            publish(
                "zigbee2mqtt/0x8cf681fffe2a0b0b/set",
                JSON.stringify({ state: "OFF" }),
                2,
                false
            );
        }
    },
});

Тут проще решается:

defineVirtualDevice("simple_test", {
  title: "Simple switch",
  cells: {
    enabled: {
    type: "switch",
    value: false
    },
  }
});

defineRule("simple_switch", {
whenChanged: "simple_test/enabled",
then: function (newValue, devName, cellName) {
  if (newValue){ //В newValue передается значение контрола
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "ON" }), 2, false);
  }
  else{
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "OFF" }), 2, false);
  }
}
});

Еще можно оставить одну строку “publish” а занчение ON или OFF передавать переменной.

И сюда же можно добавить правило для пульта, которое будет менять состояние контрола simple_test/enabled

Спасибо большое все вышесказанное прекрасно заработало, теперь вопрос с кнопкой

кнопка у меня 0x000d6ffffe256597 (IKEA tradfri E1524)

значит устройство будет называться zigbee2mqtt/0x000d6ffffe256597

ну и например будем центральной кнопкой выключать и включать лампу

насколько видно при нажатии на эту кнопку
state не изменяется
action - изменяется и приобретает состояние toggle

помогите пожалуйста с примером кода как написать правило для того, чтоб при нажатии на центр включалась или выключалась лампа

и еще с 1 примером для ползунка (яркость)

за это будут отвечать кнопки вверх и вниз

action:

brightness_up_click
brightness_up_hold
brightness_up_release
brightness_down_click
brightness_down_hold
brightness_down_release

сейчас я успешно управляю лампой вот таким правилом:

defineVirtualDevice("simple_button", {
  title: "Simple button",
  cells: {
    enabled: {
    type: "switch",
    value: false
    },
    brightness: {
	    type: "range",
	    value: 25,
      max: 254
    },
      color_temp: {
	    type: "range",
	    value: 25,
		max: 500,
        min: 100
    },
  }
});

defineRule("simple_switch", {
whenChanged: "simple_button/enabled",
then: function (newValue, devName, cellName) {
  if (newValue){ //В newValue передается значение контрола
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "ON" }), 2, false);
  }
  else{
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "OFF" }), 2, false);
  }
}
});

defineRule("simple_switch_BR", {
  whenChanged: "simple_button/brightness",
  then: function (newValue, devName, cellName) {
	publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ brightness: "{}".format(newValue) }), 2, false);
   }
});

defineRule("simple_switch_CT", {
  whenChanged: "simple_button/color_temp",
  then: function (newValue, devName, cellName) {
	publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ color_temp: "{}".format(newValue) }), 2, false);
   }
});

Думаю, что для этого нужно завести переменную с состоянием лампы. Если канал action при каждом нажатии кнопки изменяется на toggle, а затем в исходное состояние, то аналогично создать правило с условием whenChange. В правиле осуществлять проверку, что newValue == toggle. Если условие верно, то переключать лампу относительно текущего значения переменной состояния (публиковать в топик нужное сообщение) и изменять состояние самой переменной на противоположное.

1 лайк

Спасибо, но я в написании скриптов прям профан, поэтому если можно то напишите в виде кода

defineRule("switch_ligth", {
  whenChanged: "zigbee2mqtt/0x000d6ffffe256597/action",
  then: function (newValue, devName, cellName) {
  if (newValue){ //В newValue передается значение контрола
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "ON" }), 2, false);
  }
  else{
    publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "OFF" }), 2, false);
  }
}
});

так не работает

Пример ниже. Но он будет работать, если после нажатия на кнопку в канале action появляется значение toggle, а потом пропадает. Если же значение toggle будет присутствовать постоянно, то правило сработает только один раз. Нужно будет найти еще какой-нибудь признак нажатия кнопки или самостоятельно очищать значение в канале action.

//создаем переменную со статусом лампы
var lamp_on = false;
//приводим реальное состояние лампы в соответствии с ее программным статусом (один раз при записи правила)
publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "OFF" }), 2, false);

defineRule("switch_ligth", {
    whenChanged: "zigbee2mqtt/0x000d6ffffe256597/action",
    then: function (newValue, devName, cellName) {
        if (newValue == "toggle") { //проверяем, что нажата центральная кнопка
            if (!lamp_on) {     //проверяем, что лампа была выключена
                publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "ON" }), 2, false);  //если лампа была выключена, то включаем ее
                lamp_on = true;     //изменяем текущее состояние лампы
            }
            else {
                publish("zigbee2mqtt/0x8cf681fffe2a0b0b/set", JSON.stringify({ state: "OFF" }), 2, false);  //если лампа была включена, то выключаем ее
                lamp_on = false;    //изменяем текущее состояние лампы
            }
        }
}
});

Рекомендую все-таки ознакомиться с основами JavaScript и движка правил wb-rules, будет очень полезно

Спасибо за ответ но это не работает =(

мне кажется, что вот тут неправильно: whenChanged: “zigbee2mqtt/0x000d6ffffe256597/action”

но как правильно я никак понять не могу

по поводу статуса TOGGLE - он действительно постоянен при нажатии
я пробывал использовать arrow_right_click тоже не работает

Попробуйте нажать любую другую кнопку на пульте, значение toggle в топике action должно смениться. А затем снова нажать центральную кнопку - значение снова станет равным toggle, и правило должно отработать. То есть, чтобы правило срабатывало, перед нажатием на центральную кнопку нужно, чтобы в топике action было значение, отличное от toggle.

так как раз в этом и вопрос, я пробовал и нажимать на разные и по всякому не работает

мне кажется что параметр action как то по другому надо получать но не понимаю как
whenChanged: “zigbee2mqtt/0x000d6ffffe256597/action” вот тут как будтобы ошибка
вот тут про эту кнопку описано но не понимаю как сделать =(
https://www.zigbee2mqtt.io/devices/E1524_E1810.html

Да, я ошибся. После whenChanged нужно указывать канал устройства, соответствующий конвенции Wirenboard MQTT. Здесь следует указать топик, который соответствует каналу в окне устройства на странице Devices (можно кликнуть мышкой по названию канала и оно скопируется в буфер обмена).
Попробуйте так:

whenChanged: "0x000d6ffffe256597/action",

Урррра заработало!! спасибо

осталось разобраться с ползунками :star_struck:

1 лайк