UNPKG

@pmouli/isy-matter-server

Version:

Service to expose an ISY device as a Matter Border router

222 lines 7.69 kB
import { DoorLock, FanControl } from '@matter/main/clusters'; import { UnitOfMeasure } from './Definitions/Global/UOM.js'; import { FanLevel, RampRate } from './Definitions/Insteon/index.js'; import { Insteon } from './ISY.js'; let BooleanPercentage; let NullConverter; { to: (value) => value; from: (value) => value; } const StandardConverters = { Boolean: { LevelFrom0To255: { to: (value) => (value ? 255 : 0), from: (value) => value > 0 }, Percent: { to: (value) => (value ? 100 : 0), from: (value) => value > 0 } }, Fahrenheit: { Celsius: { to: (value) => (value - 32) / 1.8, from: (value) => value * 1.8 + 32 }, LevelFrom0To255: { to: (value) => Math.round(value / 2.55), from: (value) => Math.round(value * 2.55) } }, Celsius: { LevelFrom0To255: { to: (value) => Math.round(value / 2.55), from: (value) => Math.round(value * 2.55) } }, LevelFrom0To255: { Percent: { to: (value) => { if (value === 0) return 0; if (value === 255) return 100; return Math.round((value * 100) / 255); }, from: (value) => { if (value === 0) return 0; if (value === 100) return 255; return Math.round((value * 255) / 100); } } } }; //StandardConverters.Percent.LevelFrom0To255 = invert(StandardConverters.LevelFrom0To255.Percent); //StandardConverters.LevelFrom0To255.Boolean = invert(StandardConverters.Boolean.LevelFrom0To255); export const StdConverterRegistry = new Map(); export const ConverterRegistry = new Map(); function registerConverters() { for (const from in StandardConverters) { for (const to in StandardConverters[from]) { registerConverter(from, to, StandardConverters[from][to]); registerConverter(to, from, invert(StandardConverters[from][to])); } } for (const from in Converter.Matter) { for (const to in Converter.Matter[from]) { registerConverter(from, to, Converter.Matter[from][to]); registerConverter(to, from, invert(Converter.Matter[from][to])); } } } function registerConverter(from, to, converter) { if (!StdConverterRegistry.has(from)) { StdConverterRegistry.set(from, new Map()); } StdConverterRegistry.get(from).set(to, converter); let key = from + '.' + to; if (!ConverterRegistry.has(key)) { ConverterRegistry.set(key, converter); } } export var Converter; (function (Converter) { Converter.Standard = StandardConverters; //TODO: Migrate to isy matter //TODO: Simplify Converter.Matter = { LevelFrom0To255: { LightingLevel: { from: (value) => value === 1 ? 0 : value === 254 ? 255 : value, to: (value) => value === 0 ? 1 : value === 255 ? 254 : value } }, Percent: { LightingLevel: { from: (value) => value === 1 ? 0 : value === 254 ? 100 : Math.round((value / 254) * 100), to: (value) => value === 0 ? 1 : value === 100 ? 254 : Math.round((value / 100) * 254) }, InverseBoolean: { from: (value) => (value ? 0 : 100), to: (value) => (value > 0 ? false : true) } }, InsteonLock: { LockState: { from: (value) => (value == DoorLock.LockState.Locked ? Insteon.Lock.Locked : Insteon.Lock.Unlocked), to: (value) => (value == Insteon.Lock.Locked ? DoorLock.LockState.Locked : DoorLock.LockState.Unlocked) } }, Boolean: { LightingLevel: { from: (value) => value > 0, to: (value) => (value ? 254 : 0) } }, RampRate: { Deciseconds: { from: (value) => RampRate.from.seconds(value / 10), to: (value) => RampRate.to.seconds(value) * 10 }, Seconds: { from: (value) => RampRate.from.seconds(value), to: (value) => RampRate.to.seconds(value) } }, FanLevel: { FanMode: { from: (value) => { switch (value) { case FanControl.FanMode.Low: return FanLevel.Low; case FanControl.FanMode.Medium: return FanLevel.Medium; case FanControl.FanMode.High: return FanLevel.High; case FanControl.FanMode.Off: return FanLevel.Off; default: throw new Error('Invalid Fan Mode: ' + FanControl.FanMode[value]); } }, to: (value) => { switch (value) { case FanLevel.Low: return FanControl.FanMode.Low; case FanLevel.Medium: return FanControl.FanMode.Medium; case FanLevel.High: return FanControl.FanMode.High; case FanLevel.Off: return FanControl.FanMode.Off; } } } } }; const cache = {}; function get(from, to) { if (to === undefined) { return ConverterRegistry.get(from) ?? NullConverter; } if (cache[`${from}.${to}`]) { return cache[`${from}.${to}`]; } else if (cache[`${to}.${from}`]) { cache[`${from}.${to}`] = invert(cache[`${to}.${from}`]); return cache[`${from}.${to}`]; } let isString = typeof from === 'string'; let fuom = isString ? from : UnitOfMeasure[from]; if (to) { let tuom = typeof to === 'string' ? to : UnitOfMeasure[to]; if (StdConverterRegistry.has(fuom)) { if (StdConverterRegistry.get(fuom).has(tuom)) { return StdConverterRegistry.get(fuom).get(tuom); } } } return NullConverter; } Converter.get = get; function convert(from, to, value) { const converter = get(from, to); if (converter) { return converter.to(value); } return null; } Converter.convert = convert; function register(from, to, converter) { registerConverter(UnitOfMeasure[from], UnitOfMeasure[to], converter); } Converter.register = register; function registerAll(converters) { for (const from in converters) { for (const to in converters[from]) { registerConverter(from, to, converters[from][to]); } } } Converter.registerAll = registerAll; })(Converter || (Converter = {})); registerConverters(); //type DriverLabel = Values<IdentityOf<DriverType>>; export function invert(converter) { return { from: converter.to, to: converter.from }; } //# sourceMappingURL=Converters.js.map