Поможете с редактированием?
//Путь к RPC
var pathRPC = "/rpc/v1/wb-mqtt-serial/port/Load/";
function createBlind(NameBlind, portBlind, speedPortBlind, pariryBlid, stopBitBlind, blindID, blindCh_L, blindCh_H){
//Создаем виртуальное устройство
makeNewVirtualControl(NameBlind, "position", {type: "range", value: 0, min: 0, max: 200, readonly: false});
makeNewVirtualControl(NameBlind, "position_in", {type: "range", value: 0, min: 0, max: 200, readonly: false});
// кнопка "Открыть" (работает)
makeNewVirtualControl(NameBlind, "open", {type: "pushbutton", readonly: false});
// кнопка "Стоп"(Работает)
makeNewVirtualControl(NameBlind, "Stop", {type: "pushbutton", readonly: false});
// кнопка "Закрыть" (работает)
makeNewVirtualControl(NameBlind, "close", {type: "pushbutton", readonly: false});
// Активность мотора (1 - вращается)
makeNewVirtualControl(NameBlind, "MotorRun", {type: "switch", readonly: true});
// временный для отладки
makeNewVirtualControl(NameBlind, "reply", {type: "text", value: "", readonly: false});
//open:
defineRule(NameBlind+"_rule_open",{
whenChanged: NameBlind+"/open",
then: function () {
log.info(NameBlind+"_open")
//Формируем запрос 0a dd
var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0x03, 0x01);
log.info("open=", req)
//Вызовем запрос
requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
}
});
//Stop:
defineRule(NameBlind+"_rule_Stop",{
whenChanged: NameBlind+"/Stop",
then: function () {
//Формируем запрос 0a 0d
var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0x03, 0x03);
log.info("req_Stop=", req)
//Вызовем запрос, не ожидая ответ. На команды ответа нет.
requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
}
});
//close:
defineRule(NameBlind+"_rule_close",{
whenChanged: NameBlind+"/close",
then: function () {
//Формируем запрос 0a ee
var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0x03, 0x02);
//log.info("close=", req)
requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
}
});
//Сделаем таймер, который будет опрашивать позицию, возвращая ее в контрол.
startTicker(NameBlind+"_timer", 6000);
//И правило, работающее по срабатыванию таймера
defineRule(NameBlind+"_rule",{
when: function () { return timers[NameBlind+"_timer"].firing; },
then: function () {
var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0x03, 0x04);
//log.info("req_timer "+NameBlind+"=", req)
//Вызовем запрос, ожидая 9 байт в ответ
requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 9 );
}
});
trackMqtt(pathRPC+NameBlind+"/reply", function(message){
log.info("from "+NameBlind+" name: {}, value: {}".format(message.topic, message.value))
var replyObj = JSON.parse(message.value);
//log.info("from "+NameBlind+" replyObj.error: ", replyObj.error)
log.info("from "+NameBlind+" replyObj.result.response: {}".format(replyObj.result.response))
dev[NameBlind]["reply"] = replyObj.result.response;
});
return 0
}
function requestRPC(modbusPort, modbusSpeed, modbusParity, reqStopbit, clientID, requiestID, messageType, message, responseSize){
//Формируем JSON запрос. Должно быть что-то такое:
//{"params": {"response_size": 8, "format": "HEX", "path": "/dev/ttyRS485-1", "baud_rate": 9600, "parity" : "N", "data_bits" : 8, "stop_bits" : 1, "msg": "0A03008000018499"}, "id" : 1}
var strJson = JSON.stringify({params: {response_size: responseSize, format: messageType, path: modbusPort, "baud_rate": modbusSpeed, parity: modbusParity, "data_bits" : 8, "stop_bits" : reqStopbit, "msg": message}, "id" : requiestID})
publish(pathRPC+clientID, strJson, 2, false);
}
function blindRequestMsg(blindID, blindCh_L, blindCh_H, commandBlind, dataBlind){
//Сформируем набор байт команды. Первый байт всегда 55.
//Второй - blindID
//третий - blindCh_L
//четвертый - blindCh_H
//пятый - команда
//шестой - данные команды
//седьмой - crc
//0A03008000018499
//на входе ожидаем целые без знака.
//Вычисляем CRC прямо тут, без вызова функции. Она все равно нигде больше не применяется.
var verify = blindID ^ blindCh_L ^ blindCh_L ^ commandBlind ^ dataBlind;
//Готовим строку
return "55"+toHexStr(blindID)+toHexStr(blindCh_L)+toHexStr(blindCh_H)+toHexStr(commandBlind)+toHexStr(dataBlind)+toHexStr(verify);
}
function toHexStr(inArg){
//На входе int, на выходе hex строка дополненные нулями спереди
var tmp = inArg.toString(16);
if (tmp.length < 2) {tmp = "0"+tmp};
return tmp;
}
function makeNewVirtualControl(vdName, nameControl, typeControl){
//log.info("GetDevice", getDevice("vdName"))
if (getDevice(vdName) === undefined) {
log.info("Define new")
defineVirtualDevice(vdName, {
title: vdName,
cells: {},
})
}
//Тут проверим есть ли уже контрол и если нет - создадим.
if (!getDevice(vdName).isControlExists(nameControl)) {
log.debug("Контрола "+nameControl+" нет, создаем.")
getDevice(vdName).addControl(nameControl, typeControl);
}
}
//Создаем виртуальное устройство, с контролами для шторы. По строчке на одну штору.
// имя порт bod parity stopbit ID
createBlind("ONVIZ MR2234F", "/dev/ttyRS485-1", 9600, "N", 1, 0, 0, 0)
Данный код при запуске выдает:
2024-07-16 11:29:51Error in getting device: Device with given ID doesn't exist
2024-07-16 11:29:51Define new
2024-07-16 11:29:51Контрола position нет, создаем.
2024-07-16 11:29:51Контрола position_in нет, создаем.
2024-07-16 11:29:51Контрола open нет, создаем.
2024-07-16 11:29:51Контрола Stop нет, создаем.
2024-07-16 11:29:51Контрола close нет, создаем.
2024-07-16 11:29:51Контрола MotorRun нет, создаем.
2024-07-16 11:29:51Контрола reply нет, создаем.
2024-07-16 11:29:51defineRule: ONVIZ MR2234F_rule_open
2024-07-16 11:29:51defineRule: ONVIZ MR2234F_rule_Stop
2024-07-16 11:29:51defineRule: ONVIZ MR2234F_rule_close
2024-07-16 11:29:51defineRule: ONVIZ MR2234F_rule
2024-07-16 11:29:58from ONVIZ MR2234F name: /rpc/v1/wb-mqtt-serial/port/Load/ONVIZ MR2234F/reply, value: {"error":{"code":-32000,"data":"Port IO error: Serial protocol error: request timed out","message":"Server error"},"id":1}
2024-07-16 11:29:58ECMAScript error: TypeError: invalid base value
duk_hobject_props.c:2000
anon /etc/wb-rules/sasa1.js:69 preventsyield