147 lines
3.6 KiB
JavaScript
147 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
var os = require("os");
|
|
const exec = require('child_process').exec;
|
|
const inherits = require('util').inherits;
|
|
const version = require('./package.json').version;
|
|
let deviceInfo = {};
|
|
let Service;
|
|
let Characteristic;
|
|
|
|
module.exports = function (homebridge) {
|
|
Service = homebridge.hap.Service;
|
|
Characteristic = homebridge.hap.Characteristic;
|
|
|
|
homebridge.registerAccessory('homebridge-raspberrypi-switch', 'pi_switch', pi_switch);
|
|
}
|
|
|
|
function initCustomService() {
|
|
/**
|
|
* Service "pi_switch" Based on Service.Switch
|
|
*/
|
|
let raspberryPiUUID = '00000049-0000-1000-8000-0026BB765291';
|
|
Service.pi_switch = function (displayName, subType) {
|
|
Service.call(this, displayName, raspberryPiUUID, subType);
|
|
|
|
// Required Characteristics
|
|
this.addCharacteristic(Characteristic.On);
|
|
|
|
// Optional Characteristics
|
|
this.addOptionalCharacteristic(Characteristic.Name);
|
|
}
|
|
|
|
inherits(Service.pi_switch, Service);
|
|
Service.pi_switch.UUID = raspberryPiUUID;
|
|
}
|
|
|
|
function getModel() {
|
|
|
|
const { execSync } = require('child_process');
|
|
// stderr is sent to stderr of parent process
|
|
// you can set options.stdio if you want it to go elsewhere
|
|
let stdout = execSync('cat /sys/firmware/devicetree/base/model');
|
|
const data = stdout.toString();
|
|
return data.substring(0, data.length - 1);
|
|
};
|
|
|
|
function pi_switch(log, config) {
|
|
this.log = log;
|
|
this.services = [];
|
|
this.name = config.name || 'Respberry Pi';
|
|
this.os = config.os || 'linux';
|
|
this.serial = config.serial || os.hostname();
|
|
this.operatingState = true;
|
|
|
|
initCustomService();
|
|
|
|
this.service = new Service.pi_switch(this.name, 'Shutdown');
|
|
this.serviceInfo = new Service.AccessoryInformation();
|
|
|
|
this.service
|
|
.getCharacteristic(Characteristic.On)
|
|
.on('get', this.getPowerState.bind(this))
|
|
.on('set', this.setPowerState.bind(this));
|
|
|
|
this.serviceInfo
|
|
.setCharacteristic(Characteristic.Manufacturer, 'Raspberry Pi Foundation')
|
|
.setCharacteristic(Characteristic.Model, getModel())
|
|
.setCharacteristic(Characteristic.SerialNumber, this.serial)
|
|
.setCharacteristic(Characteristic.FirmwareRevision, version);
|
|
|
|
this.services.push(this.service);
|
|
this.services.push(this.serviceInfo);
|
|
|
|
this.rebootService = new Service.Switch(this.name + ' Reboot', 'Reboot');
|
|
|
|
this.rebootService
|
|
.getCharacteristic(Characteristic.On)
|
|
.on('get', this.getRebootState.bind(this))
|
|
.on('set', this.setRebootState.bind(this));
|
|
|
|
this.services.push(this.rebootService);
|
|
|
|
}
|
|
|
|
pi_switch.prototype = {
|
|
|
|
getPowerState: function (callback) {
|
|
callback(null, this.operatingState);
|
|
},
|
|
|
|
setPowerState: function (state, callback) {
|
|
if (!this.operatingState) {
|
|
return;
|
|
}
|
|
|
|
const that = this;
|
|
|
|
exec('sudo shutdown -h now', function (error, stdout, stderr) {
|
|
if (error) {
|
|
that.log(error);
|
|
} else {
|
|
that.operatingState = false;
|
|
|
|
that.log.debug('operating state: %s', that.operatingState);
|
|
|
|
callback(null, that.operatingState);
|
|
}
|
|
});
|
|
},
|
|
|
|
getRebootState: function (callback) {
|
|
if (!this.operatingState) {
|
|
return;
|
|
}
|
|
|
|
callback(null, !this.operatingState);
|
|
},
|
|
|
|
setRebootState: function (state, callback) {
|
|
if (!this.operatingState) {
|
|
return;
|
|
}
|
|
|
|
const that = this;
|
|
|
|
exec('sudo reboot', function (error, stdout, stderr) {
|
|
if (error) {
|
|
that.log(error);
|
|
} else {
|
|
that.operatingState = false;
|
|
|
|
that.log.debug('operating state: %s', that.operatingState);
|
|
|
|
callback(null, that.operatingState);
|
|
}
|
|
});
|
|
},
|
|
|
|
identify: function (callback) {
|
|
callback();
|
|
},
|
|
|
|
getServices: function () {
|
|
return this.services;
|
|
}
|
|
};
|