233 lines
4.8 KiB
TypeScript
233 lines
4.8 KiB
TypeScript
'use strict';
|
|
import { BufferLengthError } from './errors/BufferLengthError';
|
|
import { InvalidValueError } from './errors/InvalidValueError';
|
|
import { DPT } from './definitions';
|
|
|
|
export class DPT1 implements DPT {
|
|
id = '1';
|
|
name = '1-bit value';
|
|
bufferLength = 1;
|
|
|
|
/**
|
|
* Decode a buffer
|
|
*
|
|
* @param buffer the buffer
|
|
* @returns the on/off value
|
|
*/
|
|
decoder(buffer: Buffer): number {
|
|
if (buffer.length !== this.bufferLength)
|
|
throw new BufferLengthError(`Invalid buffer length ${buffer.length}/${buffer} for DPT1. Expected ${this.bufferLength}.`);
|
|
|
|
const val = buffer.readUInt8(0);
|
|
if (val !== 0 && val !== 1) {
|
|
throw new InvalidValueError(`Invalid binary value ${val} for DPT1. Expected 1 or 0`);
|
|
}
|
|
return val;
|
|
};
|
|
|
|
/**
|
|
* Encode a buffer
|
|
*
|
|
* @param value the value to be converted to buffer
|
|
* @returns the buffer
|
|
*/
|
|
encoder(value: number): Buffer {
|
|
if (value !== 0 && value !== 1) {
|
|
throw new InvalidValueError(`Invalid value ${value} for a DPT1. Should be 0 or 1.`);
|
|
}
|
|
const buf = Buffer.alloc(this.bufferLength);
|
|
buf.writeUInt8(value, 0);
|
|
return buf;
|
|
}
|
|
|
|
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: '???' },
|
|
},
|
|
};
|
|
|
|
}
|