UNPKG

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
"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