UNPKG

knx

Version:

KNXnet/IP protocol implementation for Node(>=6.x)

224 lines (195 loc) 4.29 kB
/** * knx.js - a KNX protocol stack in pure Javascript * (C) 2016-2018 Elias Karakoulakis */ const log = require('log-driver').logger; const custom_truthiness = (value) => { const f = parseFloat(value); return !isNaN(f) && isFinite(f) ? // numeric values (in native and string form) are truthy if NOT zero f !== 0.0 : // non-numeric value truthiness is Boolean true or the string 'true'. value === true || value === 'true'; }; exports.formatAPDU = (value) => Buffer.from([custom_truthiness(value)]); exports.fromBuffer = (buf) => { if (buf.length !== 1) return log.warn( 'DPT1.fromBuffer: buf should be 1 byte (got %d bytes)', buf.length ); return buf[0] !== 0; }; // DPT basetype info hash exports.basetype = { bitlength: 1, valuetype: 'basic', desc: '1-bit value', }; // DPT subtypes info hash exports.subtypes = { // 1.001 on/off '001': { use: 'G', name: 'DPT_Switch', desc: 'switch', enc: { 0: 'Off', 1: 'On' }, }, // 1.002 boolean '002': { use: 'G', name: 'DPT_Bool', desc: 'bool', enc: { 0: 'false', 1: 'true' }, }, // 1.003 enable '003': { use: 'G', name: 'DPT_Enable', desc: 'enable', enc: { 0: 'disable', 1: 'enable' }, }, // 1.004 ramp '004': { use: 'FB', name: 'DPT_Ramp', desc: 'ramp', enc: { 0: 'No ramp', 1: 'Ramp' }, }, // 1.005 alarm '005': { use: 'FB', name: 'DPT_Alarm', desc: 'alarm', enc: { 0: 'No alarm', 1: 'Alarm' }, }, // 1.006 binary value '006': { use: 'FB', name: 'DPT_BinaryValue', desc: 'binary value', enc: { 0: 'Low', 1: 'High' }, }, // 1.007 step '007': { use: 'FB', name: 'DPT_Step', desc: 'step', enc: { 0: 'Decrease', 1: 'Increase' }, }, // 1.008 up/down '008': { use: 'G', name: 'DPT_UpDown', desc: 'up/down', enc: { 0: 'Up', 1: 'Down' }, }, // 1.009 open/close '009': { use: 'G', name: 'DPT_OpenClose', desc: 'open/close', enc: { 0: 'Open', 1: 'Close' }, }, // 1.010 start/stop '010': { use: 'G', name: 'DPT_Start', desc: 'start/stop', enc: { 0: 'Stop', 1: 'Start' }, }, // 1.011 state '011': { use: 'FB', name: 'DPT_State', desc: 'state', enc: { 0: 'Inactive', 1: 'Active' }, }, // 1.012 invert '012': { use: 'FB', name: 'DPT_Invert', desc: 'invert', enc: { 0: 'Not inverted', 1: 'inverted' }, }, // 1.013 dim send style '013': { use: 'FB', name: 'DPT_DimSendStyle', desc: 'dim send style', enc: { 0: 'Start/stop', 1: 'Cyclically' }, }, // 1.014 input source '014': { use: 'FB', name: 'DPT_InputSource', desc: 'input source', enc: { 0: 'Fixed', 1: 'Calculated' }, }, // 1.015 reset '015': { use: 'G', name: 'DPT_Reset', desc: 'reset', enc: { 0: 'no action(dummy)', 1: 'reset command(trigger)' }, }, // 1.016 acknowledge '016': { use: 'G', name: 'DPT_Ack', desc: 'ack', enc: { 0: 'no action(dummy)', 1: 'acknowledge command(trigger)' }, }, // 1.017 trigger '017': { use: 'G', name: 'DPT_Trigger', desc: 'trigger', enc: { 0: 'trigger', 1: 'trigger' }, }, // 1.018 occupied '018': { use: 'G', name: 'DPT_Occupancy', desc: 'occupancy', enc: { 0: 'not occupied', 1: 'occupied' }, }, // 1.019 open window or door '019': { use: 'G', name: 'DPT_WindowDoor', desc: 'open window/door', enc: { 0: 'closed', 1: 'open' }, }, // 1.021 and/or '021': { use: 'FB', name: 'DPT_LogicalFunction', desc: 'and/or', enc: { 0: 'logical function OR', 1: 'logical function AND' }, }, // 1.022 scene A/B '022': { use: 'FB', name: 'DPT_Scene_AB', desc: 'scene A/B', enc: { 0: 'scene A', 1: 'scene B' }, }, // 1.023 shutter/blinds mode '023': { use: 'FB', name: 'DPT_ShutterBlinds_Mode', desc: 'shutter/blinds mode', enc: { 0: 'only move Up/Down mode (shutter)', 1: 'move Up/Down + StepStop mode (blind)', }, }, // 1.100 cooling/heating ---FIXME--- 100: { use: '???', name: 'DPT_Heat/Cool', desc: 'heat/cool', enc: { 0: '???', 1: '???' }, }, };