homebridge-raspberrypi-switch/index.js

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;
}
};