@pmouli/isy-matter-server
Version:
Service to expose an ISY device as a Matter Border router
222 lines • 7.69 kB
JavaScript
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