Ich habe für die Jalousien mal angefangen eine generische Klasse zu bauen. Aufbauend auf dieser und der Lightbulb Klassen kann man Jalousien steuern. Ist es bei weitem nicht perfekt, aber vielleicht hilft es dem einen oder anderen ja.
Wichtig ist, dass die types.js unter /homebridge/lib/HAP-NodeJS/accessories angepasst wird.
Anbei die types.js
var exports = module.exports = {};
//HomeKit Types UUID's
var stPre = "000000";
var stPost = "-0000-1000-8000-0026BB765291";
//HomeKitServiceTypes
exports.LIGHTBULB_STYPE = stPre + "43" + stPost;
exports.SWITCH_STYPE = stPre + "49" + stPost;
exports.THERMOSTAT_STYPE = stPre + "4A" + stPost;
exports.GARAGE_DOOR_OPENER_STYPE = stPre + "41" + stPost;
exports.ACCESSORY_INFORMATION_STYPE = stPre + "3E" + stPost;
exports.FAN_STYPE = stPre + "40" + stPost;
exports.OUTLET_STYPE = stPre + "47" + stPost;
exports.LOCK_MECHANISM_STYPE = stPre + "45" + stPost;
exports.LOCK_MANAGEMENT_STYPE = stPre + "44" + stPost;
exports.WINDOW_COVERING_STYPE = stPre + "8C" + stPost;
//HomeKitCharacteristicsTypes
exports.ADMIN_ONLY_ACCESS_CTYPE = stPre + "01" + stPost;
exports.AUDIO_FEEDBACK_CTYPE = stPre + "05" + stPost;
exports.BRIGHTNESS_CTYPE = stPre + "08" + stPost;
exports.COOLING_THRESHOLD_CTYPE = stPre + "0D" + stPost;
exports.CURRENT_DOOR_STATE_CTYPE = stPre + "0E" + stPost;
exports.CURRENT_LOCK_MECHANISM_STATE_CTYPE = stPre + "1D" + stPost;
exports.CURRENT_RELATIVE_HUMIDITY_CTYPE = stPre + "10" + stPost;
exports.CURRENT_TEMPERATURE_CTYPE = stPre + "11" + stPost;
exports.HEATING_THRESHOLD_CTYPE = stPre + "12" + stPost;
exports.HUE_CTYPE = stPre + "13" + stPost;
exports.IDENTIFY_CTYPE = stPre + "14" + stPost;
exports.LOCK_MANAGEMENT_AUTO_SECURE_TIMEOUT_CTYPE = stPre + "1A" + stPost;
exports.LOCK_MANAGEMENT_CONTROL_POINT_CTYPE = stPre + "19" + stPost;
exports.LOCK_MECHANISM_LAST_KNOWN_ACTION_CTYPE = stPre + "1C" + stPost;
exports.LOGS_CTYPE = stPre + "1F" + stPost;
exports.MANUFACTURER_CTYPE = stPre + "20" + stPost;
exports.MODEL_CTYPE = stPre + "21" + stPost;
exports.MOTION_DETECTED_CTYPE = stPre + "22" + stPost;
exports.NAME_CTYPE = stPre + "23" + stPost;
exports.OBSTRUCTION_DETECTED_CTYPE = stPre + "24" + stPost;
exports.OUTLET_IN_USE_CTYPE = stPre + "26" + stPost;
exports.POWER_STATE_CTYPE = stPre + "25" + stPost;
exports.ROTATION_DIRECTION_CTYPE = stPre + "28" + stPost;
exports.ROTATION_SPEED_CTYPE = stPre + "29" + stPost;
exports.SATURATION_CTYPE = stPre + "2F" + stPost;
exports.SERIAL_NUMBER_CTYPE = stPre + "30" + stPost;
exports.TARGET_DOORSTATE_CTYPE = stPre + "32" + stPost;
exports.TARGET_LOCK_MECHANISM_STATE_CTYPE = stPre + "1E" + stPost;
exports.TARGET_RELATIVE_HUMIDITY_CTYPE = stPre + "34" + stPost;
exports.TARGET_TEMPERATURE_CTYPE = stPre + "35" + stPost;
exports.TEMPERATURE_UNITS_CTYPE = stPre + "36" + stPost;
exports.VERSION_CTYPE = stPre + "37" + stPost;
exports.CURRENTHEATINGCOOLING_CTYPE = stPre + "0F" + stPost;
exports.TARGETHEATINGCOOLING_CTYPE = stPre + "33" + stPost;
exports.WINDOW_COVERING_TARGET_POSITION_CTYPE = stPre + "7C" + stPost;
exports.WINDOW_COVERING_CURRENT_POSITION_CTYPE = stPre + "6D" + stPost;
exports.WINDOW_COVERING_OPERATION_STATE_CTYPE = stPre + "72" + stPost;
exports.HUE_CTYPE = stPre + "13" + stPost;
…und die generische Klasse:
var types = require("HAP-NodeJS/accessories/types.js");
var symconGeneric = require('../SymconGenericAccessory.js');
function SymconGenericWindowCoveringAccessory(log, rpcClientOptions, instanceId, name, instance, instanceConfig) {
symconGeneric.call(this, log, rpcClientOptions, instanceId, name, instance, instanceConfig);
};
SymconGenericWindowCoveringAccessory.prototype = Object.create(symconGeneric.prototype, {
setWindowCoveringTargetPosition: {
value: function(value) {
this.writeLogEntry('Error: generic method called! Overwrite for specific module!');
}
},
getWindowCoveringTargetPosition: {
value: function(callback) {
this.writeLogEntry('Error: generic method called! Overwrite for specific module!');
}
},
getWindowCoveringCurrentPosition: {
value: function(callback) {
this.writeLogEntry('Error: generic method called! Overwrite for specific module!');
}
},
getControlCharacteristics : {
value: function () {
var that = this;
var cTypes = symconGeneric.prototype.getControlCharacteristics.call(this);
this.writeLogEntry('adding control characteristic WINDOW_COVERING_TARGET_POSITION_CTYPE...');
this.writeLogEntry('adding control characteristic WINDOW_COVERING_CURRENT_POSITION_CTYPE...');
this.writeLogEntry('adding control characteristic WINDOW_COVERING_OPERATION_STATE_CTYPE...');
cTypes.push(
{
cType : types.WINDOW_COVERING_TARGET_POSITION_CTYPE,
onUpdate : function(value) {
that.setWindowCoveringTargetPosition(value);
},
onRead: function(callback) {
that.getWindowCoveringTargetPosition(callback);
},
perms: ["pr","pw","ev"],
format: "int",
initialValue: 0,
supportEvents: false,
supportBonjour: false,
manfDescription: "Target window covering position",
designedMinValue: 0,
designedMaxValue: 100,
designedMinStep: 10,
//unit : "%"
},
{
cType: types.WINDOW_COVERING_CURRENT_POSITION_CTYPE,
onUpdate: function(value) { that.writeLogEntry("onUpdate called for CURRENT_DOOR_STATE_CTYPE with value: " + value); },
onRead : function(callback) { that.getWindowCoveringCurrentPosition(callback); },
perms: ["pr", "ev"],
format: "int",
initialValue: 0,
supportEvents: false,
supportBonjour: false,
manfDescription: "Current window covering position",
designedMinValue: 0,
designedMaxValue: 100,
designedMinStep: 10,
//unit: "%"
},
{
cType: types.WINDOW_COVERING_OPERATION_STATE_CTYPE,
onUpdate: function(value) { that.writeLogEntry("onUpdate called for WINDOW_COVERING_STATE_CTYPE"); },
onRead : function(callback) { that.writeLogEntry("onRead calld for WINDOW_COVERING_OPERATION_STATE_CTYPE"); },
perms: ["pr","ev"],
format: "boolean",
initialValue: false,
supportEvents:false,
supportBonjour: false,
manfDescription: "Window Covering Operation State",
}
);
return cTypes;
}
},
getServices : {
value: function () {
var services = [{
sType : types.ACCESSORY_INFORMATION_STYPE,
characteristics : this.getInformationCharacteristics(),
}, {
sType : types.WINDOW_COVERING_STYPE,
characteristics : this.getControlCharacteristics()
}
];
this.writeLogEntry("services loaded");
return services;
}
}
});
SymconGenericWindowCoveringAccessory.prototype.constructor = SymconGenericWindowCoveringAccessory;
module.exports = SymconGenericWindowCoveringAccessory;
Was mir auch aufgefallen ist, dass es auch schon eine Implementierung für HUE gibt. Eventuell kann man das ja für RGB Controller benutzen.