mirror of
https://github.com/mtan93/homebridge.git
synced 2026-03-08 05:31:55 +00:00
77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
var Service = require("HAP-NodeJS").Service;
|
|
var Characteristic = require("HAP-NodeJS").Characteristic;
|
|
var chokidar = require("chokidar");
|
|
var debug = require("debug")("FileSensorAccessory");
|
|
var crypto = require("crypto");
|
|
|
|
module.exports = {
|
|
accessory: FileSensorAccessory
|
|
}
|
|
|
|
function FileSensorAccessory(log, config) {
|
|
this.log = log;
|
|
|
|
// url info
|
|
this.name = config["name"];
|
|
this.path = config["path"];
|
|
this.window_seconds = config["window_seconds"] || 5;
|
|
this.sensor_type = config["sensor_type"] || "m";
|
|
this.inverse = config["inverse"] || false;
|
|
|
|
if(config["sn"]){
|
|
this.sn = config["sn"];
|
|
} else {
|
|
var shasum = crypto.createHash('sha1');
|
|
shasum.update(this.path);
|
|
this.sn = shasum.digest('base64');
|
|
debug('Computed SN ' + this.sn);
|
|
}
|
|
}
|
|
|
|
FileSensorAccessory.prototype = {
|
|
|
|
getServices: function() {
|
|
|
|
// you can OPTIONALLY create an information service if you wish to override
|
|
// the default values for things like serial number, model, etc.
|
|
var informationService = new Service.AccessoryInformation();
|
|
|
|
informationService
|
|
.setCharacteristic(Characteristic.Name, this.name)
|
|
.setCharacteristic(Characteristic.Manufacturer, "Homebridge")
|
|
.setCharacteristic(Characteristic.Model, "File Sensor")
|
|
.setCharacteristic(Characteristic.SerialNumber, this.sn);
|
|
|
|
var service, changeAction;
|
|
if(this.sensor_type === "c"){
|
|
service = new Service.ContactSensor();
|
|
changeAction = function(newState){
|
|
service.getCharacteristic(Characteristic.ContactSensorState)
|
|
.setValue(newState ? Characteristic.ContactSensorState.CONTACT_DETECTED : Characteristic.ContactSensorState.CONTACT_NOT_DETECTED);
|
|
};
|
|
} else {
|
|
service = new Service.MotionSensor();
|
|
changeAction = function(newState){
|
|
service.getCharacteristic(Characteristic.MotionDetected)
|
|
.setValue(newState);
|
|
};
|
|
}
|
|
|
|
var changeHandler = function(path, stats){
|
|
var d = new Date();
|
|
if(d.getTime() - stats.mtime.getTime() <= (this.window_seconds * 1000)){
|
|
var newState = this.inverse ? false : true;
|
|
changeAction(newState);
|
|
if(this.timer !== undefined) clearTimeout(this.timer);
|
|
this.timer = setTimeout(function(){changeAction(!newState);}, this.window_seconds * 1000);
|
|
}
|
|
}.bind(this);
|
|
|
|
var watcher = chokidar.watch(this.path, {alwaysStat: true});
|
|
watcher.on('add', changeHandler);
|
|
watcher.on('change', changeHandler);
|
|
|
|
return [informationService, service];
|
|
}
|
|
};
|