Установка значений каналов через REST API



  • Добрый день! Подскажите, пожалуйста, каким образом я могу установить данные в канал плагина codesysV2 через REST API IntraSCADA? В документации удалось обнаружить только пример получения данных устройства с помощью holder.dnSet[] с последующим указанием через точку имени нужного параметра. А как через REST API установить данные в переменную канала и устройства? Из сценариев можно вызывать функции assign() или setValue(). Есть ли аналог setValue для REST API? Или, может быть, можно вызвать определённый сценарий из REST API, передав ему устанавливаемое значение? Заранее спасибо за ответ!



  • Добрый день! В канал плагина установить данные через REST API не получится. Можно записать значение в свойство устройства минуя канал. Для этого нужно сгенерировать событие 'received:device:data'. Такое же событие генерируется при получении данных с плагина для привязанных к каналам устройств.
    Объект события: {<device1 ID>:{<prop1>:val1,...}, <device2 ID>:{<prop2>:val2,...} }
    Пример 1. Передается ID устройства, имя свойства и значение

    /**
     * Обработчик запроса REST API
     * /restapi/device/set?did=d0021&prop=setpoint&value=42
     *    => {d0021:{setpoint:42}}
     */
    module.exports = async (req, res, holder, debug) => { 
      try {
        const did =  req.query.did;
        const prop =  req.query.prop;
        const val =  req.query.value || 0;
        holder.emit('received:device:data', {[did]: {[prop]: val} });
        res.json({ res: 1});
      } catch (e) {
        res.json({ res: 0, message: e.message });
        debug(e.message)
      }
    };
    

    Пример 2. Передается dn (device name) устройства, по нему сначала нужно определить device ID

    /**
     * Обработчик запроса REST API
     * /restapi/device/set?dn=DT101&prop=setpoint&value=42
     *    => {d0021:{setpoint:42}}
     */
    module.exports = async (req, res, holder, debug) => { 
      try {
        const dn =  req.query.dn;
        const prop =  req.query.prop;
        const val =  req.query.value || 0;
        const dobj = holder.dnSet[dn];
        if (!dobj) throw {message:'Not found device '+dn};
        
        const did = dobj._id;
        holder.emit('received:device:data', {[did]: {[prop]: val} });
        res.json({ res: 1});
      } catch (e) {
        res.json({ res: 0, message: e.message });
        debug(e.message)
      }
    };
    

    Конечно, аналогично можно передать POST запрос с множеством значений



  • Спасибо большое, это очень помогло! Благодаря вашей помощи удалось поменять значение на устройстве, а уже в канале получилось менять сценарием с помощью startOnChange (поставленный на значение переменной устройства), где записываю только что изменённое REST API значение устройства в канал с помощью setValue.



  • Добрый день, Александр! Очень изобретательно 🙂
    Но теперь понимаю, что задача у вас - организовать через API управление (запись на железо).
    Конечно, система должна предоставить для этого прямой способ.

    В версии 5.9 это к сожалению не работает, сейчас выполняем унификацию API для разных скриптов системы (скрипты визуализации, сценарии, REST API).

    В 5.10 (релиз выйдет в начале следующей недели) можно будет выполнять команды устройства напрямую:

    const dev = holder.getDevice('VENT1');             
    dev.setValue('setpoint', 22);        
    dev.on();          
    
    


  • @intrapro Отлично! Это то, что нужно. Спасибо за информацию, ждём обновление.


Авторизуйтесь, чтобы ответить