Управление шторами скрипт от ChatGPT

Здравствуйте. При помощи ChatGPT создал скрипт для управления шторами, но ничего не происходит :). Проверьте пожалуйста, в чем может быть проблема, или он целиком неправильный.

// Инициализация переменных
var motion_timer_timeout_ms = 30 * 1000; // Время движения штор (30 секунд)
var motion_timer_id = null; // Идентификатор таймера
var quantity = 0; // Счетчик нажатий

// Создание виртуального устройства для управления шторами
defineVirtualDevice("curtains", {
    title: "Curtains", // Название виртуального устройства
    cells: {
        direction: {
            type: "switch", // Переключатель для направления движения
            value: false // Начальное значение: false (вверх)
        },
        moving: {
            type: "switch", // Переключатель для отслеживания движения
            value: false // Начальное значение: false (не движется)
        }
    }
});

// Функция для управления движением штор
function controlCurtains() {
    if (!dev["curtains"]["moving"]) {
        // Если шторы не движутся, начать движение
        dev["curtains"]["moving"] = true;
        dev["wb-gpio"]["ext2_dir1"] = dev["curtains"]["direction"]; // Установить направление движения
        dev["wb-gpio"]["ext2_on1"] = true; // Включить движение

        motion_timer_id = setTimeout(function () {
            stopCurtains();
        }, motion_timer_timeout_ms); // Остановить через 30 секунд
    } else {
        // Если шторы движутся, остановить движение
        stopCurtains();
    }
}

// Функция для остановки движения штор
function stopCurtains() {
    dev["curtains"]["moving"] = false;
    dev["wb-gpio"]["ext2_on1"] = false; // Выключить движение
    if (motion_timer_id) {
        clearTimeout(motion_timer_id); // Очистить таймер
        motion_timer_id = null;
    }
}

// Обработчик нажатия кнопки на 12-м входе
defineRule("curtainsControl", {
    whenChanged: "wb-gpio/ext1_in12", // Вход для кнопки
    then: function (newValue, devName, cellName) {
        if (newValue) {
            quantity++;
            if (quantity == 1) {
                dev["curtains"]["direction"] = !dev["curtains"]["direction"]; // Изменить направление
                controlCurtains();
            }
        }
    }
});

// Обработчик изменения состояния виртуального устройства
defineRule("virtualCurtainsControl", {
    whenChanged: "curtains/direction", // Переключатель направления
    then: function (newValue, devName, cellName) {
        dev["curtains"]["direction"] = newValue; // Обновить направление движения
        if (dev["curtains"]["moving"]) {
            controlCurtains(); // Если шторы движутся, изменить направление
        }
    }
});

Добрый день.
Для начала - расскажите как должен работать скрипт?

Зачем вот это? Правило “curtainsControl” выполниится один раз и до перезапуска?

Скрипт должен выполнить следующее:

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

эээ :). не могу ответить ), скрипт целиком написан в Copilote ),и хотелось бы чтобы он начал работать )

То есть ожидаете что я напишу работающий скрипт? Нет, боюсь именно написание в функции техподдержки не входит.
Можем помочь в том случае если есть какая-то ошибка, например.

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

Нет, ну прямо явных синтаксических ошибок я не вижу. Но как оно должно все вместе работать - понять не удается.

Держи мой обработчик нажатий, в том числе для штор.
onbuttonpress.js (8,4 КБ)
curtain.js (8,4 КБ)

onbuttonpress и curtain в wb-modules

И пример правила, подстрой под себя уже сам
Обработка нажатий:

function curtain_open_close(device) {
  if(dev[device]['positionNow'] < 95 && dev[device]['positionNow'] > 50 || dev[device]['positionNow'] <= 5) {
    dev[device]['position'] = 100;
  }
  else if(dev[device]['positionNow'] <= 50 && dev[device]['positionNow'] > 5 || dev[device]['positionNow'] >= 95) {
    dev[device]['position'] = 0;
  }
}

function curtain_stop(device) {
  dev[device]['direction'] = 'stop';
}


/**/
btn = require('onbuttonpress');
btnPressTimeout = 500; //Время короткого нажатия
btnPressLongTimeout = 700; //Время длинного нажатия
/*

btn.onButtonPress(
  {
      name: "wb-gpio/EXT1_IN8", title: "Гостиная - S10"
  },
  {
      singlePress: EXT1_IN8_single, 
      doublePress: EXT1_IN8_double, 
      threePress: EXT1_IN8_three, 
      longLaunch: EXT1_IN8_launch, 
      longRelease: EXT1_IN8_release 
  },
  1000, btnPressLongTimeout
);

function EXT1_IN8_single(on_off_state) {
  if(on_off_state == true ) {
    dev['wb-mr6c_51']['K3'] = true;
  }
  else {
    dev['wb-mr6c_51']['K3'] = false;
  }
}
function EXT1_IN8_double(on_off_state) {
  if(on_off_state == true ) {
    dev['wb-mr6c_65']['K3'] = true;
  }
  else {
    dev['wb-mr6c_65']['K3'] = false;
  }
}

function EXT1_IN8_three(on_off_state) {
  curtain_open_close('Curtian1');
}
function EXT1_IN8_launch(on_off_state) {
  curtain_open_close('Curtian1');
}
function EXT1_IN8_release(on_off_state) {
  curtain_stop('Curtian1');
}

Таймауты штор:

curtian = require('curtain');

curtian.newCurtain(
  {
      name: "Curtian1",
      title: "Штора - Гостиная"
  },
  {
//      timer: 15000, //Время открытия в ms
      timer: 20000, //Время открытия в ms
    changeDirectionTimeout: 1000, //Время изменения направления
      directionRevers: false,
      powerRelay: { module: "wb-mio-gpio_135:1", channel: "ON1" },
      directionRelay: { module: "wb-mio-gpio_135:1", channel: "DIR1" } 
  }
);
1 лайк

Привет, правило для управления шторами
Правило создает виртуальное устройсво для управления Шторами\Жалюзи\Маркизами итд с возможностью установить положение
Правило так же принимает команды OPEN\CLOSE\STOP (В верхнем регистре!)
Направление открытия, у кого то может быть что 100 процентов это закрыто у кого то открыто, для этого на строке 136 и 138 надо поменять значния со 100 на 0 и с 0 на 100 или перекидываем фазы двигателя
Формула: makeBaseCover(‘Название’, ‘Топик’, Секунд, ‘Устройсво R10R-4/DIR1’, ‘Устройсво R10R-4/ON1’);
Название: Название которое будет отображатся в панели WB
Топик: префикс топика в MQTT Chanels Cover_Префикс (Cover_mark1)
Секунды: Сколько секунд требуется для открытия\закрытия на основании этого будет высчитыватся процент
Устройство\Контрол: Можно взять из певрой колонкив MQTTChannels (Устройство/Контрол")
Дополнительно приложил файл как прописывать в HA
в HA используется домен cover
В конфине не забываем добавить или прописать
mqtt:

Шторы

cover: !include_dir_merge_list includes/cover
curtains.js (9,7 КБ)
mio-gpio_83_1.yaml (1,8 КБ)

1 лайк

Добрый день.
Сохраните пожалуйста файл

например просто текстом в сообщениии. Движок формума не дает выполнять операции с .js файлами.