Шаблон для электрокарниза

Добрый день. Электрокарниз Dauerhaft CM5. Получился для него шаблон? Что- нибудь потестировать?

Добрый день.
Ну, собственно пока реализовал управление скриптом, без шаблона. Но да, вполне работает.

А попробовать можно?

Присоединяюсь! Очень было бы интересно попробовать.

//Путь к 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, "Up", {type: "pushbutton", readonly: false});
  // кнопка "Шаг вверх" ()
  makeNewVirtualControl(NameBlind, "stepDotUp", {type: "pushbutton", readonly: false});
  // кнопка "Стоп"(Работает)
  makeNewVirtualControl(NameBlind, "Stop", {type: "pushbutton", readonly: false});
  // кнопка "Шаг вниз"
  makeNewVirtualControl(NameBlind, "stepDotDown", {type: "pushbutton", readonly: false});
  // кнопка "вниз" (работает)
  makeNewVirtualControl(NameBlind, "Down", {type: "pushbutton", readonly: false});
  // Активность мотора (1 - вращается)
  makeNewVirtualControl(NameBlind, "MotorRun", {type: "switch", readonly: true});
  // временный для отладки
  makeNewVirtualControl(NameBlind, "reply", {type: "text", value: "", readonly: false});
  
  //Up: 
  defineRule(NameBlind+"_rule_Up",{
  whenChanged: NameBlind+"/Up",
    then: function () {
      log.info(NameBlind+"_Up")
      //Формируем запрос 0a dd 
      var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0xa, 0xdd);
      log.info("Up=", req)
      //Вызовем запрос
      requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
    }
  });
  //DotUP: 
  defineRule(NameBlind+"_rule_stepDotUp",{
  whenChanged: NameBlind+"/stepDotUp",
    then: function () {
      log.info(NameBlind+"_stepDotUp")
      //Формируем запрос 0a 0d 
      var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0xa, 0xd);
      log.info("req_stepDotUp=", 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, 0xa, 0xcc);
      log.info("req_Stop=", req)
      //Вызовем запрос, не ожидая ответ. На команды ответа нет.
      requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
    }
  });
  //DotDown: 
  defineRule(NameBlind+"_rule_stepDotDown",{
  whenChanged: NameBlind+"/stepDotDown",
    then: function () {
      //Формируем запрос 0a 0e 
      var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0xa, 0xe);
      log.info("req_stepDotDown=", req)
      requestRPC(portBlind, speedPortBlind, pariryBlid, stopBitBlind, NameBlind, 1, "HEX", req, 0 );
    }
  });
  //Down: 
  defineRule(NameBlind+"_rule_Down",{
  whenChanged: NameBlind+"/Down",
    then: function () {
      //Формируем запрос 0a ee 
      var req = blindRequestMsg(blindID, blindCh_L, blindCh_H, 0xa, 0xee);
      //log.info("Down=", 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, 0xcc, 0xcc);
      //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-2", "baud_rate": 9600, "parity" : "N", "data_bits" : 8, "stop_bits" : 2, "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){
  //Сформируем набор байт команды. Первый байт всегда 9A.
  //Второй - blindID
  //третий - blindCh_L
  //четвертый - blindCh_H
  //пятый - команда
  //шестой - данные команды
  //седьмой - crc
  //0A03008000018499
  //на входе ожидаем целые без знака.

  //Вычисляем CRC прямо тут, без вызова функции. Она все равно нигде больше не применяется.
  var verify = blindID ^ blindCh_L ^ blindCh_L ^ commandBlind ^ dataBlind;
  //Готовим строку
  return "9a"+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);
    }
}




//II. Motor sends data to PC, the data description is as follows:
//1. Baud Rate: 2400     Data: 8 bit     Stop Bit:1 bit     Verify Bit:None
//2. Single Frame Data:Head code(0xd8) + ID(1Byte) + Chanel(2Byte) + Data(5Byte) + Verify(ID ^Channel  ^ Data)
//3. When get inquiry command, it feedback data to PC, otherwise, no feedback. 








//Создаем виртуальное устройство, с контролами для шторы. По строчке на одну штору.
//                имя               порт          bod parity stopbit  ID
createBlind("testRPCroll35", "/dev/ttyRS485-2", 2400, "N",   1,       0, 0, 0)
1 Like

Спасибо.

Отправлено из мобильной Почты Mail.ru

Сможете после того как попробуете данный скрипт отписаться тут и если будет возможность видео как оно работает.
Спасибо

Получилось проверить?

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.