да у вас так, у меня раньше считал положение nodered, но я обновил контроллер на 8ой, и пытаюсь запустить это все на home assistant без использования nodered, вот что мне выдает chat gpt,
Чтобы переделать ваш скрипт для управления рольставнями с отображением положения в процентах для интеграции с Home Assistant, необходимо:
1. Ввести расчет текущего положения на основе времени движения.
2. Обрабатывать команды, задающие целевую позицию в процентах.
3. Сохранять и публиковать состояние устройства через MQTT.
Вот переработанный скрипт:
function coverLogic(id, cmd) {
var run_time = scripts[id].run_time;
var relay = scripts[id].config.relay;
var relay_direction = scripts[id].config.relay_direction;
if (!relay || !relay_direction) {
log('{} relay or relay_direction not defined', id);
return;
}
log('{} cmd {}', id, cmd);
// Очистка таймеров, если они активны
if (scripts[id].timer) {
clearTimeout(scripts[id].timer);
scripts[id].timer = false;
}
if (scripts[id].timer2) {
clearTimeout(scripts[id].timer2);
scripts[id].timer2 = false;
}
if (scripts[id].timer3) {
clearTimeout(scripts[id].timer3);
scripts[id].timer3 = false;
}
// Остановка движения
if (cmd === 'stop') {
dev[relay] = false;
dev[id]['state'] = 'stopped';
return;
}
// Получение целевой позиции
var currentPosition = dev[id]['position'] || 0; // Текущее положение (в процентах)
var targetPosition = typeof cmd === 'number' ? cmd : (cmd === 'open' ? 100 : 0);
if (targetPosition === currentPosition) {
log('{} already at target position: {}%', id, currentPosition);
return;
}
var isOpen = targetPosition > currentPosition; // true - вверх, false - вниз
var delay = dev[relay] ? 500 : 50; // Задержка перед переключением реле
var movementTime = Math.abs(targetPosition - currentPosition) / 100 * run_time * 1000; // Время движения в мс
// Отключение реле, если оно активно
log('{} relay off, delay = {}', id, delay);
dev[relay] = false;
scripts[id].timer = setTimeout(function () {
scripts[id].timer = false;
log('{} do {}', id, isOpen ? 'open' : 'close');
dev[relay_direction] = isOpen;
scripts[id].timer2 = setTimeout(function () {
scripts[id].timer2 = false;
dev[relay] = true;
dev[id]['state'] = isOpen ? 'opening' : 'closing';
var startTime = Date.now();
scripts[id].timer3 = setTimeout(function () {
scripts[id].timer3 = false;
// Остановка движения
log('{} relay off', id);
dev[relay] = false;
dev[id]['state'] = 'stopped';
// Обновление текущего положения
var elapsedTime = (Date.now() - startTime) / 1000;
var deltaPosition = (elapsedTime / run_time) * 100;
if (isOpen) {
currentPosition = Math.min(100, currentPosition + deltaPosition);
} else {
currentPosition = Math.max(0, currentPosition - deltaPosition);
}
currentPosition = Math.round(currentPosition);
dev[id]['position'] = currentPosition; // Синхронизация позиции
log('{} position updated to {}%', id, currentPosition);
}, movementTime);
}, 100);
}, delay);
}
// Пример: привязка к виртуальному устройству
defineVirtualDevice(“living”, {
title: “Рольставни гостиная”,
cells: {
position: {
type: “range”,
value: 0, // Начальное положение
max: 100, // Максимум 100%
},
state: {
type: “text”,
value: “stopped”, // Начальное состояние
},
},
});
// MQTT-обработка
defineRule(“living_position_command”, {
whenReceiveCommand: “/devices/living/controls/position/on”,
then: function (cmd) {
var position = parseInt(cmd, 10);
if (isNaN(position) || position < 0 || position > 100) {
log(“Invalid position command: {}”, cmd);
return;
}
coverLogic(“living”, position);
},
});
// Публикация состояния
defineRule(“living_position_publish”, {
whenChanged: “living/position”,
then: function (newValue) {
publish(“/devices/living/controls/position”, newValue.toString());
},
});
Основные изменения:
- Поддержка позиции в процентах:
• Позиция (position) теперь обновляется на основе времени движения.
• Обработка команды position через MQTT для установки целевой позиции (0–100%).
- Состояние ( state**):**
• Поле state отображает текущее состояние устройства (opening, closing, stopped).
- MQTT-интеграция:
• Поддержка установки позиции через MQTT (/devices/living/controls/position/on).
• Публикация текущей позиции (/devices/living/controls/position).
- Виртуальное устройство:
• Поле position для отображения текущего положения (0–100%).
• Поле state для отображения состояния (stopped, opening, closing).
Настройка Home Assistant:
Добавьте в configuration.yaml:
cover:
- platform: mqtt
name: “Рольставни гостиная”
command_topic: “/devices/living/controls/position/on”
set_position_topic: “/devices/living/controls/position/on”
position_topic: “/devices/living/controls/position”
value_template: “{{ value | int }}”
payload_open: “100”
payload_close: “0”
optimistic: false
retain: false
не могу найти где у вас хранятся скрипты устройства