amjs-api¶

функции среды integra-node-red используемые при разработке новых нодов

  • typedef-loader
  • typedef
  • typedef_version
  • last_modified

  • translation-loader
  • translate
  • translation
  • last_modified

  • protobuf-loader

  • event-unloader
  • unloadEvents

  • integra-node-red
  • require
  • uuid
  • nodes
  • firefly
  • srv2ff
  • obtainToken
  • resolveRouter
  • resolveServer
  • dissolveRouter
  • dissolveServer
  • invokeProc
  • invokeStoredProc
  • applyOnServers
  • isInvalidUpdate
  • processUpdates
  • getLocalServerAt
  • isLocalServer
  • isAllowedServer
  • isAllowedObject
  • isAllowedChange
  • getStaticPath
  • readStaticFileSync
  • readStaticFileAsync
  • writeStaticFileSync
  • writeStaticFileAsync
  • parseTimeZoneOffset

In [1]:
// только для загрузки в исходнике нода integra-node-red:
//     var gobal = this.context().global

// загрузка в function ноде или исходнике нода integra-node-red:
//     var { typedef } = gobal.get('typedef-loader')
//     var { translate } = gobal.get('translation-loader')
//     var { uuid, processUpdates } = global.get('integra-node-red')

// нужно вызывать это в конце каждой ячейки
// для предотвращения постоянных логов
function disableLogging() {
    var log  = console.log;
    console.log = (title, ...args) => {
        switch(title) {
            case 'PULSE:': break;
            case 'INPUT:': break;
            case 'OUTPUT:': break;
            default: log(title, ...args);
        }
    }
}

// загрузка в nodejs:
require("babel-polyfill");
Object.assign(global, require('./amjs.js'));
startPlugins();    
processPluginCallback(null, 'onstart');
Object.values(firefly).map(connectToRouter);
disableLogging();
'ok'
miscutils-api
miscutils v1.36
static-eval-api
static-eval v1.16
GRAPH-LOAD-API
GRAPH-CHANGE-API
GRAPH-PATH-API
FIELDS-SELECTION-API
TYPEDEF-UTILS
supergraph.js v1.47
wamp-client-api
ff-client-api
ffwamp.js v1.16
__dirname: /home/undwad/ipynb/daisyjs/docs
NO TIMESTAMP!
argv: { _: [] }
Promise.allSettled: [Function: allSettled]
Object.fromEntries: [Function: fromEntries]
GLOBALS: {
  "auth": {
    "origin": "http://192.168.10.13:8888",
    "user": "undwad",
    "pass": "undwad"
  },
  "firefly": {
    "ff1": {
      "url": "ws://192.168.10.72:8301/ws"
    }
  },
  "plugins": {
    "typedef-loader": {},
    "translation-loader": {}
  },
  "pulse": {
    "timeout": 30
  },
  "reconnection": {
    "interval": 10
  },
  "mainloop": {
    "delay": 0.1
  }
}
FIREFLY: {
  ff1: {
    url: 'ws://192.168.10.72:8301/ws',
    key: 'ff1',
    loaded: [],
    servers: [ 'local' ]
  }
}
[Function: run]
amjs v1.48
PLUGIN(typedef-loader): {} http://maps.integra-s.com:5434/resources/typedef2017/acuario2.types.json
PLUGIN(typedef-loader): typedef.json loaded 0.0.0.1419 Tue Sep 13 2022 09:32:49 GMT+0000 (Coordinated Universal Time)
PLUGIN(translation-loader): {} http://maps.integra-s.com:5434/resources/typedef2017/acuario2.types.ru.ts
PLUGIN(translation-loader): translation.json loaded Tue Sep 13 2022 09:32:49 GMT+0000 (Coordinated Universal Time)
CONNECTING: ff1 ws://192.168.10.72:8301/ws
Out[1]:
'ok'
TOPIC: com.integra.selector.71.afe1ac7ee74a5b2800a4e8ef806cac89
CONNECTED: ff1 ws://192.168.10.72:8301/ws {
  last: 1663250268.445,
  num: 1,
  gap: 0.746999979019165,
  cma: 0.746999979019165
}
LOADING: ff1 ws://192.168.10.72:8301/ws [ '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5' ]
LOADED: ff1 ws://192.168.10.72:8301/ws [ '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5' ] {
  last: 1663250268.704,
  num: 1,
  gap: 0.25799989700317383,
  cma: 0.25799989700317383
}
GRAPH: 5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5 items: 37, links: 29

typedef-loader¶

плагин управляющий обновлением метаданных системы в формате json
по умолчанию источником актуальной копии описания типов является:
http://maps.integra-s.com:5434/resources/typedef2017/acuario2.types.json

In [2]:
// загрузка в исходнике нода integra-node-red:
//     var { typedef } = this.context().gobal.get('typedef-loader')

// загрузка в function ноде integra-node-red:
//     var { typedef } = gobal.get('typedef-loader')

// загрузка в плагине amjs:
var { typedef, typedef_version, last_modified } = global.plugins['typedef-loader'].api
disableLogging()

typedef-loader.typedef¶

содержит актуальное описание типов в формате json
используется в качестве первого аргумента функций работы с метаданными:

  • queryEntityTypes
  • queryEntityHeirs
  • queryEntityDef
  • changesToGraph
In [3]:
console.log(truncate(JSON.stringify(typedef,null,2),1000))
disableLogging()
{
  "version": "0.0.0.1419",
  "types": {
    "TensorPump": {
      "attributes": {
        "type": "TensorPump"
      },
      "is": [
        "Item",
        "TensorPump",
        "BaseObject",
        "SpatialObject"
      ],
      "param": {
        "position": {
          "attributes": {
            "name": "position",
            "type": "point",
            "editable": "true"
          },
          "default": "POINT(0 0)"
        },
        "altitude": {
          "attributes": {
            "name": "altitude",
            "type": "real",
            "editable": "true"
          },
          "default": -65535
        },
        "organization": {
          "attributes": {
            "name": "organization",
            "editable": "true"
          },
          "default": null
        },
        "additional_info": {
          "attributes": {
            "name": "additional_info",
            "editable": "true"
          },
          "default": null
        },
        "state": {
 ...

typedef-loader.typedef_version¶

содержит версию актуального описания типов

In [4]:
console.log(typedef_version)
disableLogging()
0.0.0.1419

typedef-loader.last_modified¶

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

In [5]:
console.log(last_modified)
disableLogging()
2022-09-13T09:32:49.000Z

translation-loader¶

плагин управляющий обновлением файла локализации системы в формате json
по умолчанию источником актуальной копии файла локализации является:
http://maps.integra-s.com:5434/resources/typedef2017/acuario2.types.ru.ts

In [6]:
// загрузка в исходнике нода integra-node-red:
//     var { translate } = this.context().gobal.get('translation-loader')

// загрузка в function ноде integra-node-red:
//     var { translate } = gobal.get('translation-loader')

// загрузка в плагине amjs:
var { translate, translation, last_modified } = global.plugins['translation-loader'].api
disableLogging()

translation-loader.translate¶

функция translate используется для перевода на русский различных текстовых данных и структур их содержащих

In [7]:
var obj = queryPath('Item/ZoneLink/1')
console.log("перевести строку:", translate('command'), '\n') 
console.log("перевести гуид сервера в имя:", translate(obj.serverId), '\n')
console.log("перевести гуид датчика в имя:", translate(obj.id), '\n')
console.log("перевести строку в указаном контексте:", translate('alarm.alarm', {context: 'FireSensorState'}), '\n')
console.log("перевести все знакомое в датчике:", JSON.stringify(translate(obj),null,2), '\n')
console.log("перевести все знакомое в датчике включая атрибуты:", JSON.stringify(translate(obj, {keys: true}),null,2), '\n')
disableLogging()
перевести строку: Команда 

перевести гуид сервера в имя: Local server 

перевести гуид датчика в имя: aca0eda9-6abe-4a1e-879b-bca997e05c86 

перевести строку в указаном контексте: Тревога 

перевести все знакомое в датчике: {
  "params": {
    "out": {
      "version": 2468956,
      "value": "b5f7bcf0-2156-413e-8704-ff8e2993cd10.zoneOutputPin",
      "datetime": 1656490400,
      "dateName": "2022-06-29",
      "timeName": "08:13:20",
      "valueName": "b5f7bcf0-2156-413e-8704-ff8e2993cd10.zoneOutputPin"
    },
    "weight": {
      "version": 2498181,
      "value": 2,
      "datetime": 1663244038,
      "dateName": "2022-09-15",
      "timeName": "12:13:58",
      "valueName": 2
    },
    "in": {
      "version": 2468954,
      "value": "5c8728ad-3619-4a14-a487-74c36db84112.zoneInputPin",
      "datetime": 1656490400,
      "dateName": "2022-06-29",
      "timeName": "08:13:20",
      "valueName": "5c8728ad-3619-4a14-a487-74c36db84112.zoneInputPin"
    }
  },
  "types": [
    "Link",
    "ZoneLink"
  ],
  "serverId": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
  "id": "aca0eda9-6abe-4a1e-879b-bca997e05c86",
  "time": 1663250268.711,
  "objectName": "aca0eda9-6abe-4a1e-879b-bca997e05c86",
  "serverName": "Local server",
  "typeName": "Связь с зоной",
  "typeNames": [
    "Link",
    "Связь с зоной"
  ]
} 

перевести все знакомое в датчике включая атрибуты: {
  "params": {
    "Выход": {
      "Версия": 2468956,
      "Значение": "b5f7bcf0-2156-413e-8704-ff8e2993cd10.zoneOutputPin",
      "Дата и время": 1656490400,
      "dateName": "2022-06-29",
      "timeName": "08:13:20",
      "valueName": "b5f7bcf0-2156-413e-8704-ff8e2993cd10.zoneOutputPin"
    },
    "Вес": {
      "Версия": 2498181,
      "Значение": 2,
      "Дата и время": 1663244038,
      "dateName": "2022-09-15",
      "timeName": "12:13:58",
      "valueName": 2
    },
    "Вход": {
      "Версия": 2468954,
      "Значение": "5c8728ad-3619-4a14-a487-74c36db84112.zoneInputPin",
      "Дата и время": 1656490400,
      "dateName": "2022-06-29",
      "timeName": "08:13:20",
      "valueName": "5c8728ad-3619-4a14-a487-74c36db84112.zoneInputPin"
    }
  },
  "Типы целей": [
    "Link",
    "ZoneLink"
  ],
  "serverId": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
  "Идентификатор": "aca0eda9-6abe-4a1e-879b-bca997e05c86",
  "Время": 1663250268.711,
  "objectName": "aca0eda9-6abe-4a1e-879b-bca997e05c86",
  "serverName": "Local server",
  "typeName": "Связь с зоной",
  "typeNames": [
    "Link",
    "Связь с зоной"
  ]
} 

translation-loader.translation¶

содержит актуальные данные локализациив формате json

In [8]:
console.log(truncate(JSON.stringify(translation,null,2),1000))
disableLogging()
{
  "_": {
    "LockState": "Состояние замка",
    "NULL": "Неизвестно",
    "ok.normal": "В норме",
    "error.defective": "Неисправно",
    "alarm.alarm": "Тревога",
    "none.unknown": "Неизвестно",
    "": "",
    "alarm.blocked": "Внимание блокировка",
    "ok.unlocked": "Открыт",
    "ok.security_off": "Не под охраной",
    "ok.unblocked": "Разблокировано",
    "ok.security_on": "Под охраной",
    "ok.locked": "Закрыт",
    "ok.securityOff": "Не под охраной",
    "ok.openOut": "Выход открыт",
    "ok.openIn": "Вход открыт",
    "ok.securityOn": "Под охраной",
    "alarm.outOfRange": "Вне диапазона",
    "ok.inputPortOpened": "Порт ввода разомкнут",
    "ok.inputPortClosed": "Порт ввода замкнут",
    "alarm.passByRule2Persons": "Проход по правилу 2(3) лиц",
    "alarm.passByLostCard": "Проход по утерянной карте",
    "alarm.breakin": "Взлом",
    "ok.barrierDowning": "Опускание стрелы",
    "ok.delayBeforeBarrierDown": "Задержка перед опусканием стрелы, стрела поднята",
    "ok.b...

translation-loader.last_modified¶

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

In [9]:
console.log(last_modified)
disableLogging()
2022-09-13T09:32:49.000Z

protobuf-loader¶

плагин загружающий описание типов в формате google protocol buffers

In [ ]:
// НАСТРОЙКА в globals.js
'protobuf-loader': { proto: [ 'Graph.proto', 'Locations.proto' ] },

// ИСПОЛЬЗОВАНИЕ
var api = global.plugins['protobuf-loader']?.api||{};
var { eily_acuario_3d: {Graph} } = api;
// ...
var profile = Graph.decode(profile);

event-unloader¶

плагин выгружающий из суперграфа устаревшие эвенты (события)

In [ ]:
// НАСТРОЙКА в globals.js
'event-unloader': { 
    interval: 60, // интервал автоматического вызова unloadEvents
    verbose: true 
},

event-unloader.unloadEvents¶

выгрузить устаревшие события прямо сейчас

In [ ]:
var {unloadEvents} = global.plugins['event-unloader']?.api||{};
if(unloadEvents) unloadEvents();

integra-node-red¶

плагин интегрирующий Node-RED в amjs

In [10]:
// загрузка в исходнике нода integra-node-red:
//     var { uuid } = this.context().gobal.get('integra-node-red')

// загрузка в function ноде integra-node-red:
//     var { processUpdate } = gobal.get('integra-node-red')

// загрузка в плагине amjs:
// var { invokeProc, invokeStoredProc } = global.plugins['integra-node-red'].api
disableLogging()

integra-node-red.nodes¶

используется при написании новых нодов integra-node-red, которым нужна подписка на изменения FireFly

In [11]:
module.exports = function(RED) {    
    function ExampleNode(cfg) {
        RED.nodes.createNode(this, cfg);               
        
        // добавление обработчика
        var global     = this.context().global;
        var { nodes }  = global.get('integra-node-red');    
        nodes[this.id] = this; 
                
        var onchange  = (changes) => { 
            // обработка входящих изменений
        };
                        
        // обработка загрузки графов
        plugin.beforegraph = (graph) => {};        
        plugin.aftergraph  = (graph) => {};                
        
        // обработка изменений
        this.beforechange = (changes) => cfg.mode === 'before' && onchange(changes);
        this.afterchange  = (changes) => cfg.mode === 'after'  && onchange(changes);
        
        // удаление обработчика
        this.on('close', () => {
            delete nodes[this.id]; 
            clearInterval(timer);
        });       
    }
    
    RED.nodes.registerType('example-node', ExampleNode);
}
disableLogging()

integra-node-red.firefly¶

глобальный объект содержащий информацию о подключениях к роутерам FireFly

In [12]:
console.log(JSON.stringify(firefly,null,2))
disableLogging()
{
  "ff1": {
    "url": "ws://192.168.10.72:8301/ws",
    "key": "ff1",
    "loaded": [
      "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5"
    ],
    "servers": [
      "local"
    ],
    "status": "connected",
    "pulse": {
      "last": 1663250323.436,
      "num": 7,
      "gap": 8,
      "cma": 7.962571450642177
    },
    "connstats": {
      "last": 1663250268.445,
      "num": 1,
      "gap": 0.746999979019165,
      "cma": 0.746999979019165
    },
    "api": {
      "defaultTopicConfig": {
        "$type": "OrCompositeSelector",
        "selectors": [
          {
            "$type": "PropertyEqualitySelector",
            "name": "entity",
            "value": "item"
          },
          {
            "$type": "PropertyEqualitySelector",
            "name": "entity",
            "value": "link"
          },
          {
            "$type": "PropertyEqualitySelector",
            "name": "entity",
            "value": "pin"
          },
          {
            "$type": "PropertyEqualitySelector",
            "name": "entity",
            "value": "event"
          }
        ]
      },
      "servers": {
        "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5": {
          "is_local": true,
          "status": "online",
          "position": "POINT(0 0)",
          "hash": "e2ba6b08-dc48-36d2-814a-af37201bdb38",
          "name": "Local server",
          "adm_level": null,
          "router_url": "localhost",
          "typedef_version": "0.0.0.1360",
          "is_virtual": false,
          "is_ready": true,
          "synch": true,
          "write_archive": true,
          "is_auto_synch": false,
          "is_online": true,
          "typedef_id": 33
        }
      },
      "serverId": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
      "typedefVersion": "0.0.0.1360"
    },
    "loadstats": {
      "last": 1663250268.704,
      "num": 1,
      "gap": 0.25799989700317383,
      "cma": 0.25799989700317383
    }
  }
}

integra-node-red.srv2ff¶

глобальный объект содержащий информацию о принадлежности серверов FireFly роутерам FireFly

In [13]:
console.log(srv2ff)
disableLogging()
{
  '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5': {
    url: 'ws://192.168.10.72:8301/ws',
    key: 'ff1',
    loaded: [ '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5' ],
    servers: [ 'local' ],
    status: 'connected',
    pulse: { last: 1663250331.436, num: 8, gap: 8, cma: 7.967250019311905 },
    connstats: {
      last: 1663250268.445,
      num: 1,
      gap: 0.746999979019165,
      cma: 0.746999979019165
    },
    api: {
      getServers: [Function: getServers],
      getTypeDef: [Function: getTypeDef],
      getTypeDefJson: [Function: getTypeDefJson],
      getGraph: [Function: getGraph],
      getFilteredGraph: [Function: getFilteredGraph],
      getCompressedGraph: [Function: getCompressedGraph],
      openTopic: [Function: openTopic],
      defaultTopicConfig: [Object],
      subscribeToChanges: [Function: subscribeToChanges],
      subscribeToPulse: [Function: subscribeToPulse],
      changeGraph: [Function: changeGraph],
      searchGraphSnapshot: [Function: searchGraphSnapshot],
      getRuntimeChanges: [Function: getRuntimeChanges],
      getArchiveChanges: [Function: getArchiveChanges],
      getArchivedParams: [Function: getArchivedParams],
      invoke: [Function: bound invoke],
      subscribe: [Function: bound subscribe],
      goodbye: [Function: bound goodbye],
      shutdown: [Function: shutdown],
      servers: [Object],
      serverId: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
      typedefVersion: '0.0.0.1360'
    },
    loadstats: {
      last: 1663250268.704,
      num: 1,
      gap: 0.25799989700317383,
      cma: 0.25799989700317383
    }
  }
}

integra-node-red.obtainToken¶

функция получения токена безопасности для заданого пользователя

In [14]:
var user   = 'undwad';
var pass   = 'undwad';
var origin = 'http://192.168.10.13:8888';
async function test() {
    console.log(await obtainToken({ origin, user, pass }))
    console.log(await obtainToken(global.auth))
}

test()
disableLogging()
5236239b-0777-49e6-8979-33187a05216f
20e9605d-bfc2-4c62-bfb8-d9d0c9e4391c

integra-node-red.resolveRouter¶

функция используемая конфигурационными нодами integra-node-red для добавления нового роутера FireFly

In [ ]:
var routerId = randomId()
await resolveRouter({ 
    auth: { user, pass, origin }, 
    id: routerId, 
    name: 'новый роутер', 
    url: 'ws://192.168.10.72:8301/ws',
}

integra-node-red.resolveServer¶

функция используемая конфигурационными нодами integra-node-red для добавления нового сервера FireFly

In [ ]:
await resolveServer({ 
    router: { // для поиска роутера нужно указать id и/или name и/или url
        id: routerId, 
//         name: 'новый роутер', 
//         url: 'ws://192.168.10.72:8301/ws',
    }, 
    // если не указать сервер, то будет взят локальный
    server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
}

integra-node-red.dissolveRouter¶

функция используемая конфигурационными нодами integra-node-red для удаления существующего роутера FireFly

In [ ]:
// для поиска роутера нужно указать id и/или name и/или url
await dissolveRouter({ 
//         id: routerId, 
        name: 'новый роутер', 
//         url: 'ws://192.168.10.72:8301/ws',
})

integra-node-red.dissolveServer¶

функция используемая конфигурационными нодами integra-node-red для удаления существующего сервера FireFly

In [ ]:
await dissolveServer({ 
    router: { // для поиска роутера нужно указать id и/или name и/или url
//         id: routerId, 
//         name: 'новый роутер', 
        url: 'ws://192.168.10.72:8301/ws',
    }, 
    // если не указать сервер, то будет взят локальный
    server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
}

integra-node-red.invokeProc¶

функция вызова встроенной функции сервера FireFly

In [15]:
var server = "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5"
var proc   = "com.integra.firefly.info"
var args   = []
async function test() {
    var result = await invokeProc(server, proc, args)
    console.log(result)
}

test()
disableLogging()
OUTPUT: [48,6,{"disclose_me":true},"com.integra.firefly.info",[],{}]
[
  {
    build_version: '3.0.323',
    db_version: '0.2021.12.16',
    version: '6.58'
  }
]

integra-node-red.invokeStoredProc¶

функция вызова хранимой процедуры базы данных сервера FireFly

In [16]:
var server = "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5"
var proc   = "graph.get_time"
var args   = ["5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",0]
async function test() {
    var result = await invokeStoredProc(server, proc, args)
    console.log(result)
}

test()
disableLogging()
OUTPUT: [48,7,{"disclose_me":true},"com.integra.ember.call_stored",["graph.get_time",["5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",0]],{}]
[ { result: 'ok' } ]

integra-node-red.applyOnServers¶

выполнить действия с api указанных серверов

In [17]:
var server = "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5"
var action = (api) => api.getServers()
async function test() {
//     var result = await applyOnServers([ [server, action], ])
    var result = await applyOnServers({ [server]: action, })
    console.log(result)
}

test()
disableLogging()
OUTPUT: [48,8,{"disclose_me":true},"com.integra.ember.call_stored",["server.get",[0]],{}]
[
  {
    status: 'fulfilled',
    value: '{"5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5": {"is_local": true, "status": "online", "position": "POINT(0 0)", "hash": "e2ba6b08-dc48-36d2-814a-af37201bdb38", "name": "Local server", "adm_level": null, "router_url": "localhost", "typedef_version": "0.0.0.1360", "is_virtual": false, "is_ready": true, "synch": true, "write_archive": true, "is_auto_synch": false, "is_online": true, "typedef_id": 33}}'
  }
]

integra-node-red.isInvalidUpdate¶

проверяет невалидность пакета с командой на изменение данных сервера FireFly, т.е. проверяет, что в пакете отсутствуют параметры, а так же, что какой либо из параметров одновременно не имеет ни значения value, ни атрибутов datetime и status

In [18]:
var obj = queryPath('Item/ZoneLink/1')
var upd = obj.update('weight', 2)
console.log(isInvalidUpdate(upd), upd)
upd.params.weight.value = null
console.log(isInvalidUpdate(upd), upd)
delete upd.params
console.log(isInvalidUpdate(upd), upd)
disableLogging()
undefined {
  operation: 'update',
  entity: 'link',
  server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  owner: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  id: 'aca0eda9-6abe-4a1e-879b-bca997e05c86',
  params: { weight: { value: 2 } },
  datetime: 0
}
true {
  operation: 'update',
  entity: 'link',
  server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  owner: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  id: 'aca0eda9-6abe-4a1e-879b-bca997e05c86',
  params: { weight: { value: null } },
  datetime: 0
}
true {
  operation: 'update',
  entity: 'link',
  server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  owner: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
  id: 'aca0eda9-6abe-4a1e-879b-bca997e05c86',
  datetime: 0
}

integra-node-red.processUpdates¶

функция отправляющая пакеты с изменениями на соответствующие сервера FireFly, соединение с которыми установлено в данный момент

In [19]:
var obj = queryPath('Item/ZoneLink/1')
var upd = obj.update('weight', 2)
async function test(updates) {
    console.log(updates)
    var result = await processUpdates(updates)
    console.log(JSON.stringify(result,null,2))
}
test([upd])
disableLogging()
[
  {
    operation: 'update',
    entity: 'link',
    server: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
    owner: '5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5',
    id: 'aca0eda9-6abe-4a1e-879b-bca997e05c86',
    params: { weight: [Object] },
    datetime: 0
  }
]
OUTPUT: [48,9,{"disclose_me":true},"com.integra.ember.put",[[{"operation":"update","entity":"link","server":"5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5","owner":"5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5","id":"aca0eda9-6abe-4a1e-879b-bca997e05c86","params":{"weight":{"value":2}},"datetime":0}]],{}]
CHANGES: [
  {
    "status": null,
    "name": "weight",
    "datetime": 1663250386,
    "value": 2,
    "server": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
    "owner": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
    "version": 2498182,
    "entity": "link",
    "txid": 23817309,
    "operation": "update",
    "paramid": 643851,
    "type": "ZoneLink",
    "id": "aca0eda9-6abe-4a1e-879b-bca997e05c86"
  }
]
[
  {
    "status": "fulfilled",
    "value": [
      {
        "status": null,
        "paramid": 643851,
        "name": "weight",
        "server": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
        "entity": "link",
        "value": 2,
        "txid": 23817309,
        "version": 2498182,
        "owner": "5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5",
        "operation": "update",
        "datetime": 1663250386,
        "type": "ZoneLink",
        "id": "aca0eda9-6abe-4a1e-879b-bca997e05c86"
      }
    ]
  }
]

integra-node-red.getLocalServerAt¶

находит идентификатор локального сервера на роутере FireFly по его имени или индексу в настройках amjs
т.е. выполняет следующее firefly[ff]?.api?.serverId

In [20]:
var guid = getLocalServerAt('ff1')
console.log(guid)
disableLogging()
5331e7ee-08aa-4655-90aa-fc1bd2ab3ba5

integra-node-red.isLocalServer¶

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

In [21]:
console.log([isLocalServer(guid), isLocalServer(obj.id)])
disableLogging()
[ true, false ]

integra-node-red.isAllowedServer¶

возвращает функцию проверяющую, что поданный ей идентификатор сервера FireFly удовлетворяет заданному фильтру

In [22]:
var obj = queryPath('Item/1')
console.log(isAllowedServer(obj.serverId)(obj.serverId))
console.log(isAllowedServer([obj.serverId])(obj.serverId))
console.log(isAllowedServer(['local'])(obj.serverId))
disableLogging()
true
true
true

integra-node-red.isAllowedObject¶

возвращает функцию проверяющую, что поданный ей объект FireFly сервера удовлетворяет заданному фильтру по серверу

In [23]:
var obj = queryPath('Item/1')
console.log(isAllowedServer(obj.serverId)(obj))
console.log(isAllowedServer([obj.serverId])(obj))
console.log(isAllowedServer(['local'])(obj))
disableLogging()
true
true
true

integra-node-red.isAllowedChange¶

возвращает функцию проверяющую, что поданный ей пакет с изменениями FireFly сервера удовлетворяет заданному фильтру по серверу

In [24]:
var obj = queryPath('Item/1')
var upd = obj.update('name', 'new name')
console.log(isAllowedServer(obj.serverId)(upd))
console.log(isAllowedServer([obj.serverId])(upd))
console.log(isAllowedServer(['local'])(upd))
disableLogging()
true
true
true

integra-node-red.getStaticPath¶

проверяет присутствует ли файл в папке для записи __rwdir и возвращает его полный путь

иначе возвращает путь к этому файлу в папке только для чтения __dirname

In [ ]:
getStaticPath(filename)

integra-node-red.readStaticFileSync¶

синхронно считать ресурсный файл

In [ ]:
readStaticFileSync(filename, encoding='utf-8')

integra-node-red.readStaticFileAsync¶

ассинхронно считать ресурсный файл

In [ ]:
readStaticFileAsync(filename, encoding='utf-8')

integra-node-red.writeStaticFileSync¶

синхронно записать файл в папку для записи

In [ ]:
writeStaticFileSync(filename, data, encoding='utf-8')

integra-node-red.writeStaticFileAsync¶

ассинхронно записать файл в папку для записи

In [ ]:
writeStaticFileAsync(filename, data, encoding='utf-8')

integra-node-red.parseTimeZoneOffset¶

конвертирует текстовое смещение временной зоны в разницу в минутах

In [1]:
parseTimeZoneOffset('+4:00')
Out[1]:
240
In [3]:
system(`jupyter-nbconvert --output-dir=./static --to HTML docs-amjs-api.ipynb`)
[NbConvertApp] Converting notebook docs-amjs-api.ipynb to HTML
[NbConvertApp] Writing 768183 bytes to static/docs-amjs-api.html

In [ ]:

In [ ]: