homebridge-plugin-wrapper
Version:
Wrapper for Homebridge and NodeJS-HAP with reduced dependencies that allows to intercept plugin values and also send to them
175 lines • 8.41 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/// <reference path="../../../@types/simple-plist.d.ts" />
var fs_1 = __importDefault(require("fs"));
var path_1 = __importDefault(require("path"));
var simple_plist_1 = __importDefault(require("simple-plist"));
var Characteristic_1 = require("../Characteristic");
/**
* This module is intended to be run from the command line. It is a script that extracts Apple's Service
* and Characteristic UUIDs and structures from Apple's own HomeKit Accessory Simulator app.
*/
// assumed location of the plist we need (might want to make this a command-line argument at some point)
var plistPath = '/Applications/HomeKit Accessory Simulator.app/Contents/Frameworks/HAPAccessoryKit.framework/Versions/A/Resources/default.metadata.plist';
var metadata = simple_plist_1.default.readFileSync(plistPath);
// begin writing the output file
var outputPath = path_1.default.join(__dirname, '..', '..', '..', 'src', 'lib', 'gen', 'HomeKitTypes.generated.ts');
var output = fs_1.default.createWriteStream(outputPath);
output.write("// THIS FILE IS AUTO-GENERATED - DO NOT MODIFY\n");
output.write("\n");
// output.write("var inherits = require('util').inherits;\n");
output.write("import {\n");
output.write(" Characteristic,\n");
output.write(" CharacteristicProps,\n");
output.write(" Formats,\n");
output.write(" Perms,\n");
output.write(" Units,\n");
output.write("} from '../Characteristic';\n");
output.write("import { Service } from '../Service';\n");
output.write("\n");
/**
* Characteristics
*/
// index Characteristics for quick access while building Services
var characteristics = {}; // characteristics[UUID] = classyName
for (var index in metadata.Characteristics) {
var characteristic = metadata.Characteristics[index];
var classyName = characteristic.Name.replace(/[\s\-]/g, ""); // "Target Door State" -> "TargetDoorState"
classyName = classyName.replace(/[.]/g, "_"); // "PM2.5" -> "PM2_5"
// index classyName for when we want to declare these in Services below
characteristics[characteristic.UUID] = classyName;
output.write("/**\n * Characteristic \"" + characteristic.Name + "\"\n */\n\n");
output.write("export class " + classyName + " extends Characteristic {\n\n");
output.write(" static readonly UUID: string = \"" + characteristic.UUID + "\";\n\n");
if (characteristic.Constraints && characteristic.Constraints.ValidValues) {
// this characteristic can only have one of a defined set of values (like an enum). Define the values
// as static members of our subclass.
output.write(" // The value property of " + classyName + " must be one of the following:\n");
for (var value in characteristic.Constraints.ValidValues) {
var name = characteristic.Constraints.ValidValues[value];
var constName = name.toUpperCase().replace(/[^\w]+/g, '_');
if ((/^[1-9]/).test(constName))
constName = "_" + constName; // variables can't start with a number
output.write(" static readonly " + constName + " = " + value + ";\n");
}
output.write('\n');
}
// constructor
output.write(" constructor(\n");
output.write(" displayName = \"\",\n");
output.write(" props?: CharacteristicProps,\n");
output.write(" ) {\n");
output.write(" props = props || {\n");
// apply Characteristic properties
// output.write(" this.setProps({\n");
output.write(" format: Formats." + getCharacteristicFormatsKey(characteristic.Format));
// special unit type?
if (characteristic.Unit)
output.write(",\n unit: Units." + getCharacteristicUnitsKey(characteristic.Unit));
// apply any basic constraints if present
if (characteristic.Constraints && typeof characteristic.Constraints.MaximumValue !== 'undefined')
output.write(",\n maxValue: " + characteristic.Constraints.MaximumValue);
if (characteristic.Constraints && typeof characteristic.Constraints.MinimumValue !== 'undefined')
output.write(",\n minValue: " + characteristic.Constraints.MinimumValue);
if (characteristic.Constraints && typeof characteristic.Constraints.StepValue !== 'undefined')
output.write(",\n minStep: " + characteristic.Constraints.StepValue);
output.write(",\n perms: [");
var sep = "";
for (var i in characteristic.Properties) {
var perms = getCharacteristicPermsKey(characteristic.Properties[i]);
if (perms) {
output.write(sep + "Perms." + getCharacteristicPermsKey(characteristic.Properties[i]));
sep = ", ";
}
}
output.write("]");
output.write("\n };\n");
output.write(" super(displayName, " + classyName + ".UUID, props);\n\n");
output.write(" this.value = this.getDefaultValue();\n");
output.write(" }\n");
// set default value
output.write("};\n\n");
// output.write("inherits(Characteristic." + classyName + ", Characteristic);\n\n");
// output.write("Characteristic." + classyName + ".UUID = '" + characteristic.UUID + "';\n\n");
}
/**
* Services
*/
for (var index in metadata.Services) {
var service = metadata.Services[index];
var classyName = service.Name.replace(/[\s\-]/g, ""); // "Smoke Sensor" -> "SmokeSensor"
output.write("/**\n * Service \"" + service.Name + "\"\n */\n\n");
output.write("export class " + classyName + " extends Service {\n\n");
output.write(" static readonly UUID = '" + service.UUID + "';\n\n");
// constructor
output.write(" constructor(displayName: string, subtype: string) {\n");
output.write(" super(displayName, ${classyName}.UUID, subtype);\n\n");
// add Characteristics for this Service
if (service.RequiredCharacteristics) {
output.write("\n // Required Characteristics\n");
for (var index in service.RequiredCharacteristics) {
var characteristicUUID = service.RequiredCharacteristics[index];
// look up the classyName from the hash we built above
var characteristicClassyName = characteristics[characteristicUUID];
output.write(" this.addCharacteristic(Characteristic." + characteristicClassyName + ");\n");
}
}
// add "Optional" Characteristics for this Service
if (service.OptionalCharacteristics) {
output.write("\n // Optional Characteristics\n");
for (var index in service.OptionalCharacteristics) {
var characteristicUUID = service.OptionalCharacteristics[index];
// look up the classyName from the hash we built above
var characteristicClassyName = characteristics[characteristicUUID];
output.write(" this.addOptionalCharacteristic(Characteristic." + characteristicClassyName + ");\n");
}
}
output.write(" }\n");
output.write("}\n\n");
}
output.write("var HomeKitTypesBridge = require('./HomeKitTypes-Bridge');\n\n");
/**
* Done!
*/
output.end();
/**
* Useful functions
*/
function getCharacteristicFormatsKey(format) {
// coerce 'int32' to 'int'
if (format == 'int32')
format = 'int';
// look up the key in our known-formats dict
// @ts-ignore
for (var key in Characteristic_1.Characteristic.Formats) {
// @ts-ignore
if (Characteristic_1.Characteristic.Formats[key] == format) {
return key;
}
}
throw new Error("Unknown characteristic format '" + format + "'");
}
function getCharacteristicUnitsKey(units) {
// look up the key in our known-units dict
// @ts-ignore
for (var key in Characteristic_1.Characteristic.Units) {
// @ts-ignore
if (Characteristic_1.Characteristic.Units[key] == units) {
return key;
}
}
throw new Error("Unknown characteristic units '" + units + "'");
}
function getCharacteristicPermsKey(perm) {
switch (perm) {
case "read": return "READ";
case "write": return "WRITE";
case "cnotify": return "NOTIFY";
case "uncnotify": return undefined;
default: throw new Error("Unknown characteristic permission '" + perm + "'");
}
}
//# sourceMappingURL=importAsClasses.js.map