Ранее я написал несколько статей про подключение беспроводных Zigbee-устройств к контроллеру Wiren Board. Сначала я использовал для программирования сценариев оболочку Sprut.hub, затем перешел на Node-RED. Наконец, я разобрался в языке программирования wb-rules и написал сценарии на нем. Недавно я начал знакомиться с ChatGPT и удивился тому, что он умеет в wb-rules.

Действительно умеет
Действительно умеет

Что ж настало время проверить возможности ChatGPT. Сможет ли он запрограммировать на wb-rules сценарии, которые я использовал в своих статьях ранее? Проверим!

В статье «Подключаем Zigbee-устройства к контроллеру Wiren Board и пишем сценарии на wb-rules» я подробно описал, как установить модуль WBE2R-R-ZIGBEE v.2 в слот контроллера Wiren Board, затем инсталлировать бесплатный программный пакет zigbee2mqtt и подключить устройства Zigbee.

Я проделал все описанные операции и успешно подключил все четыре устройства Zigbee. Задал им понятные имена Lamp, Socket, Motion_Sensor, Temperature_Sensor, но добавил к каждому год 2024, чтобы было меньше путаницы. Пробелы я заменил подчеркиваниями.

Я задал устройствам Zigbee понятные имена
Я задал устройствам Zigbee понятные имена

Через web-интерфейс контроллера Wiren Board 7 управлять устройствами Zigbee нельзя, следует использовать скрипты wb-rules.

Сценарии автоматизации

Настало время написать скрипты wb-rules, но не самому, а с помощью ChatGPT. Я буду использовать модель GPT-4o, которая была доступна на дату публикации. С базовой информацией о скриптах wb-rules можно ознакомиться здесь. Там же приведены примеры термостата и темной комнаты.

Мне потребовался интерфейс Wiren Board, который доступен по IP-адресу. В нем есть полезное меню «Настройки» — «Каналы MQTT», где можно посмотреть все доступные устройства, контролы и темы MQTT. Там же приведены текущие значения. Все свои устройства Zigbee я здесь увидел.

Каналы MQTT
Каналы MQTT

Сами скрипты следует добавлять в пункте «Правила».

Правила
Правила

Сценарий термостата

Здесь я буду использовать умную розетку Aqara Smart Plug и датчик влажности и температуры Aqara Temperature and Humidity Sensor. Они подключены к контроллеру Wiren Board через Zigbee.

Я составил следующий запрос. По опыту работы лучше сразу дать ChatGPT информацию о контролах устройств, саму логику он программирует хорошо.

Напиши мне скрипт для сценария термостата. Я хочу использовать значение температуры датчика, по которому нужно сделать условное ветвление. Если температура меньше 19 градусов, то включаю розетку. Если  температура больше 23 градусов, тогда выключаю розетку. Если температура находится в диапазоне между 19 и 23 градусами, то ничего не делаю.

Название датчик температуры: Temperature_Sensor_2024

Название розетки: Socket_2024

Датчик температуры и розетка работают через модуль wb-zigbee2mqtt. Как с ним работать прочитай в файле (я приложил сохраненную страницу HTML).

Примечание: я специально вставил картинкой, чтобы плохой код не индексировался
Примечание: я специально вставил картинкой, чтобы плохой код не индексировался

Как видим, скрипт почти правильный. Разве что ChatGPT не владеет полностью всем синтаксисом контрола, в строке: 

whenChanged: "zigbee2mqtt/Temperature_Sensor_2024",

должен быть код:

whenChanged: "Temperature_Sensor_2024/temperature",

Попробую скормить страницу, где расписаны контролы датчика температуры (она здесь).

Теперь код почти верный, добавка zigbee2mqtt в топике температуры лишняя. Но эта особенность реализации zigbee2mqtt под Wiren Board, ChatGPT может ее и не знать. Попросил убрать и получил финальный готовый код термостата. Вот он: 

defineRule("thermostat_control", {
  whenChanged: "Temperature_Sensor_2024/temperature",
  then: function (newValue, devName, cellName) {
    var temperature = parseFloat(newValue); // Получаем значение температуры
    if (temperature < 19) {
      publish("zigbee2mqtt/Socket_2024/set", JSON.stringify({ state: "ON" }), 2, false); // Включаем розетку
    } else if (temperature > 23) {
      publish("zigbee2mqtt/Socket_2024/set", JSON.stringify({ state: "OFF" }), 2, false); // Выключаем розетку
    }
  }
});
Скриншот диалога

Сценарий темной комнаты

Перейдем к сценарию темной комнаты. Здесь я буду использовать лампу Aqara LED Light Bulb, E27, 9Вт и датчик движения Aqara Motion Sensor. Они подключены к контроллеру Wiren Board через Zigbee.

Давай напишем сценарий включения света при наличии движения. Таймер выстави на две минуты. Алгоритм следующий:

Если движение есть (датчик отправил true), то включаем лампу, сбрасываем таймер.

Если движения нет (датчик отправил false), то ставим задержку 2 минуты, а после ее истечения выключаем лампу. Если во время задержки будет определено движение, то таймер сбросится.

Название датчика движения: Motion_Sensor_2024

Название лампы: Lamp_2024

В файлах посмотри, как правильно работать с контролами датчика движения и розетки, а также с модулем wb-zigbee2mqtt, через который они подключены.

Я приложил страницы с контролами лампы и датчика движения. Датчик температуры и розетка работают через модуль wb-zigbee2mqtt. Как с ним работать можно прочитать в файле (тоже приложил).

Скриншот диалога

Продолжаем отладку. Здесь я столкнулся с той же ошибкой, что и в предыдущей статье: датчик высылает true или false как текст. Это «фича» данного датчика движения, ChatGPT может ее и не знать. Попрошу поправить код.

Скриншот диалога

Что ж, почти правильно, разве что ChatGPT переусердствовал с добавлением zigbee2mqtt во все топики. Поправим.

Вот правильный код:

var motionTimer = null;

defineRule("motion_control", {
  whenChanged: "Motion_Sensor_2024/occupancy",
  then: function (newValue, devName, cellName) {
    if (newValue === "true") {
      // Движение обнаружено: включаем свет и сбрасываем таймер
      publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "ON" }));
      if (motionTimer) {
        clearTimeout(motionTimer); // Сбрасываем существующий таймер
        motionTimer = null;
      }
    } else if (newValue === "false") {
      // Нет движения: устанавливаем таймер на 2 минуты для выключения света
      if (motionTimer) {
        clearTimeout(motionTimer); // Сбрасываем предыдущий таймер
      }
      motionTimer = setTimeout(function () {
        publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "OFF" }));
        motionTimer = null; // Сбрасываем таймер
      }, 120000); // 2 минуты = 120000 миллисекунд
    }
  }
});

Для темной комнаты приведенного выше скрипта достаточно. Но допустим, нам нужно включать лампу при наличии движения на веранде или в коридоре с окнами, причем только в темноте или сумерках. Сначала нужно выбрать пороговый уровень включения датчика. Он должен быть ниже освещенности от солнечного света, чтобы днем датчик не срабатывал. Но уровень должен быть выше освещенности от ламп, чтобы датчик продолжал срабатывать после их включения (допустим, в коридоре продолжается движение на протяжении десяти минут, свет должен гореть). Я взял за порог 100 люкс и добавил в скрипт еще одно условие. Датчик движения будет работать только при яркости меньше 100 люкс. Если яркость больше 100 люкс, лампа выключится. Вы можете добавить любое другое условие, исходя из конфигурации вашего умного дома.

Скрипт рабочий, давай его улучшим. Я хочу, чтобы лампа включалась только при яркости меньше 100 люкс. Если яркость больше 100 люкс, то лампа не включается.

Скриншот диалога

Скрипт получился полностью рабочий, вот его код.

var motionTimer = null;

defineRule("motion_control", {
  whenChanged: "Motion_Sensor_2024/occupancy",
  then: function (newValue, devName, cellName) {
    if (newValue === "true") {
      // Получаем текущую яркость
      var illuminance = parseFloat(dev["Motion_Sensor_2024"]["illuminance"]);
      
      // Проверяем уровень освещенности
      if (illuminance < 100) {
        // Яркость ниже 100 люкс: включаем свет и сбрасываем таймер
        publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "ON" }));
        if (motionTimer) {
          clearTimeout(motionTimer); // Сбрасываем существующий таймер
          motionTimer = null;
        }
      }
    } else if (newValue === "false") {
      // Нет движения: устанавливаем таймер на 2 минуты для выключения света
      if (motionTimer) {
        clearTimeout(motionTimer); // Сбрасываем предыдущий таймер
      }
      motionTimer = setTimeout(function () {
        publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "OFF" }));
        motionTimer = null; // Сбрасываем таймер
      }, 120000); // 2 минуты = 120000 миллисекунд
    }
  }
});

Сценарий реле

Два сценария выше описывают работу беспроводных устройств Zigbee с контроллером Wiren Board, но почему бы не добавить проводные модули? В моем тестовом чемодане установлен модуль реле WB-MR6C v.2, к трем каналам которого (K1, K2, K3) штатно подключены индикаторы трех кнопок.

Схема тестового чемодана
Схема тестового чемодана
Кольцевые индикаторы кнопок
Кольцевые индикаторы кнопок
Модули в тестовом чемодане, в том числе релейный WB-MR6C v.2
Модули в тестовом чемодане, в том числе релейный WB-MR6C v.2

На странице с примерами можно посмотреть, как правильно работать с модулями реле. Я «скормил» эту страницу ChatGPT при постановке задачи. 

Давай дополним сценарий и будем включать по условию не только лампу, но и каналы K1, K2 и K3 проводного модуля реле с названием wb-mr6c_46. 

Примеры кода работы с реле ты можешь посмотреть в файле, который я приложил.

ChatGPT сгенерировал рабочий код с первого раза.

Скриншот диалога

Ниже я приведу код.

var motionTimer = null;

defineRule("motion_control", {
  whenChanged: "Motion_Sensor_2024/occupancy",
  then: function (newValue, devName, cellName) {
    if (newValue === "true") {
      // Получаем текущую яркость
      var illuminance = parseFloat(dev["Motion_Sensor_2024"]["illuminance"]);

      // Проверяем уровень освещенности
      if (illuminance < 100) {
        // Яркость ниже 100 люкс: включаем свет и реле, сбрасываем таймер
        publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "ON" }));
        dev["wb-mr6c_46/K1"] = true;
        dev["wb-mr6c_46/K2"] = true;
        dev["wb-mr6c_46/K3"] = true;

        if (motionTimer) {
          clearTimeout(motionTimer); // Сбрасываем существующий таймер
          motionTimer = null;
        }
      }
    } else if (newValue === "false") {
      // Нет движения: устанавливаем таймер на 2 минуты для выключения света и реле
      if (motionTimer) {
        clearTimeout(motionTimer); // Сбрасываем предыдущий таймер
      }
      motionTimer = setTimeout(function () {
        publish("zigbee2mqtt/Lamp_2024/set", JSON.stringify({ state: "OFF" }));
        dev["wb-mr6c_46/K1"] = false;
        dev["wb-mr6c_46/K2"] = false;
        dev["wb-mr6c_46/K3"] = false;
        motionTimer = null; // Сбрасываем таймер
      }, 120000); // 2 минуты = 120000 миллисекунд
    }
  }
});

Заключение

Да, ChatGPT действительно может программировать на wb-rules. Он устраняет головную боль тех электриков и инженеров, кто панически боится кода и программирования. Конечно, ошибки есть, но с ними можно разбираться. Все ошибки, с которыми я столкнулся, связаны с неправильным синтаксисом контролов, а логика кода везде была правильная. Кроме того, ChatGPT учится на вашем коде, и, если указывать ему на ошибки, он будет их исправлять.

Чтобы код был корректный, не забывайте «скармливать» документацию с примерами wb-rules и подробное описание правил wb-rules, правильными контролами устройств Zigbee и т.д. Можно дать ChatGPT и эту статью с примерами кода.

В статье ChatGPT сгенерировал мне код для сценариев термостата и темной комнаты, а также доработал его для управления проводным модулем реле, поэтому для простых сценариев его вполне можно использовать.

А вы уже использовали ChatGPT, чтобы писать код на wb-rules? Есть ли у вас положительный или отрицательный опыт? Пишите в комментариях.

Комментарии (7)


  1. abutorin
    05.12.2024 08:04

    Напиши мне скрипт для сценария термостата. Я хочу использовать значение температуры датчика, по которому нужно сделать условное ветвление. Если температура меньше 19 градусов, то включаю розетку. Если температура больше 23 градусов, тогда выключаю розетку. Если температура находится в диапазоне между 19 и 23 градусами, то ничего не делаю.

    Кажется что этот запрос и есть в чистом виде код который просто нужно переложить на синтаксис. А дальше в статье написано что синтаксис ИИ понимает не очень хорошо. тогда в чем выгода?


    1. Dmitrii43 Автор
      05.12.2024 08:04

      Там задачка со звёздочкой была - зигби модули, которые работают не так как все остальное и там не с синтаксисом беда была, а с именем топика. На задачах с проводными устройствами чатжпт очень, очень не плох. Развлекаюсь иногда просто вставляя вопросы из чата Wiren Board в телеграм, и оно прям пишет и рабочее. wb-rules сам по себе очень прост, но многих пугает перекладывать алгоритм в код.


  1. aborouhin
    05.12.2024 08:04

    Не, LLM - ну только не в промавтоматике, пожалуйста. Ладно умный дом, а так ведь для производства начнут писать :( А тут код должен быть простой, лаконичный и десять раз внимательно продуманный.

    Для инженеров, которые боятся программировать, есть контроллеры с языками IEC, где они могут в своём любимом FBD кубики двигать (да и на WB, вроде, можно что-то такое вкорячить).


    1. Dmitrii43 Автор
      05.12.2024 08:04

      Пишут, и уже давно. ИИ хорошо помогает программистам, забирая на себя часть рутинной работы. Какие-то процедуры сделать и т.д. Не надо бояться ИИ, надо его правильно использовать.
      Визуальная среда - можно тот же Node-RED использовать для умного дома если хочется. Или Sprut.Hub


      1. aborouhin
        05.12.2024 08:04

        Помогает - безусловно, подсказки Github Copilot часто экономят чёртову уйму нажатий клавиш (а при написании Ansible-плейбуков - этак 90% нажатий клавиш, вообще бы без Copilot никогда не дописал все роли для своих серверов...) Попросить написать какой-то кусок кода на незнакомом языке / с использованием незнакомого фреймворка / т.п., чтобы в принципе понять, куда дальше гуглить, - тоже ОК. Написать что-то условно одноразовое - ну уже так себе идея (нет ничего постояннее временных вещей), но готов понять и простить. Но вот с нуля поручать писать ответственный код нейросетке, да ещё и по такой узкой теме, как wb-rules, по которой за пару часов можно прочитать примерно всю имеющуюся в сети информацию...

        А про визуальные среды - на форумах WB же уже сто раз обсуждался вопрос. Суровые инженеры-электрики хотят языки IEC, хоть ты тресни. Хотя меня это тоже удивляет, т.к., по-моему, даже мимолётного взгляда на современные языки программирования должно хватить, чтобы в ужасе навсегда убежать от ST, а на современные NoCode-решения - от FBD :)


        1. Dmitrii43 Автор
          05.12.2024 08:04

          Я общался с электромонтажниками, которые ставят автоматизацию, но панически боятся любого кода. Какие-то зачатки бейсика или лого они в школе проходили, но писать с нуля код не могут. А если ИИ для них напишет код, который можно будет достаточно быстро отладить, то задачу получится решить. Те же самые простые сценарии термостата или темной комнаты обычно нужны. Ну или там свет по расписанию включать.
          Собственно, статья про это - как сделать первый шаг в сторону написания кода и простых скриптов. Понятно, что про какие-то ответственные сценарии, которые может наворотить дилетант с ИИ, здесь речь не идет.


          1. aborouhin
            05.12.2024 08:04

            Как потенциальному заказчику автоматизации (хотя кого я обманываю, опять буду упарываться и всё делать сам :) мне было бы спокойнее, если бы электромонтажник, боящийся кода, рисовал на привычном FBD, чем использовал нейросетку, в результатах работы которой он не может квалифицированно разобраться и внести правки.

            Хотя у меня да, там котельная на мегаватт в планах на автоматизацию и теплицы на гектар, я всё подсознательно на эти проекты примеряю :) Впрочем, из-за ошибки в управлении домашним термостатом тоже можно по возврату из зимнего отпуска обнаружить ущерба на многоденег от разморозки дома...