homebridge-sonybravia-platform
Version:
homebridge-sonybravia-platform
311 lines (234 loc) • 10.1 kB
JavaScript
var http = require("http");
var Accessory,
Service,
Characteristic;
class VOLUME {
constructor(log, config, api) {
Accessory = api.platformAccessory;
Service = api.hap.Service;
Characteristic = api.hap.Characteristic;
var platform = this;
this.log = log;
this.name = config.name + " Volume";
this.psk = config.psk;
this.ipadress = config.ipadress;
this.interval = config.interval;
this.maxVolume = config.maxVolume;
this.port = config.port;
this.setOnCount = 0;
this.setOffCount = 0;
this.getCount = 0;
!this.state ? this.state = false : this.state;
!this.volume ? this.volume = 0 : this.volume;
this.getContent = function(setPath, setMethod, setParams, setVersion) {
return new Promise((resolve, reject) => {
var options = {
host: platform.ipadress,
port: platform.port,
family: 4,
path: setPath,
method: 'POST',
headers: {
'X-Auth-PSK': platform.psk
}
};
var post_data = {
"method": setMethod,
"params": [setParams],
"id": 1,
"version": setVersion
};
var req = http.request(options, function(res) {
if (res.statusCode < 200 || res.statusCode > 299) {
reject(new Error('Failed to load data, status code: ' + res.statusCode));
}
const body = []
res.on('data', (chunk) => body.push(chunk));
res.on('end', () => resolve(body.join('')));
});
req.on('error', (err) => reject(err));
req.write(JSON.stringify(post_data));
req.end();
})
};
}
getServices() {
var self = this;
this.informationService = new Service.AccessoryInformation()
.setCharacteristic(Characteristic.Name, this.name)
.setCharacteristic(Characteristic.Identify, this.name)
.setCharacteristic(Characteristic.Manufacturer, 'Sony')
.setCharacteristic(Characteristic.Model, 'Volume Control')
.setCharacteristic(Characteristic.SerialNumber, "Sony-Volume")
.setCharacteristic(Characteristic.FirmwareRevision, require('../package.json').version);
this.VolumeBulb = new Service.Lightbulb(this.name);
this.VolumeBulb.getCharacteristic(Characteristic.On)
.updateValue(self.state)
.on('set', this.setMuteState.bind(this));
this.VolumeBulb.addCharacteristic(new Characteristic.Brightness())
.setProps({
maxValue: 100,
minValue: 0,
minStep: 1
})
.updateValue(self.volume)
.on('set', this.setVolume.bind(this));
this.getStates();
return [this.informationService, this.VolumeBulb];
}
getStates() {
var self = this;
self.getContent("/sony/audio", "getVolumeInformation", "1.0", "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("result" in response) {
var name = response.result[0];
for (var i = 0; i < name.length; i++) {
if (name[i].target.match("speaker")) {
self.state = name[i].mute == false;
self.volume = name[i].volume;
}
}
} else {
self.state = false;
self.volume = 0;
}
self.VolumeBulb.getCharacteristic(Characteristic.On).updateValue(self.state);
self.VolumeBulb.getCharacteristic(Characteristic.Brightness).updateValue(self.volume);
self.getCount = 0;
setTimeout(function() {
self.getStates();
}, self.interval)
})
.catch((err) => {
self.VolumeBulb.getCharacteristic(Characteristic.On).updateValue(self.state);
self.VolumeBulb.getCharacteristic(Characteristic.Brightness).updateValue(self.volume);
if (self.getCount > 5) {
self.log(self.name + ": " + err);
}
setTimeout(function() {
self.getCount += 1;
self.getStates();
}, 60000)
});
}
setMuteState(state, callback) {
var self = this;
if (state) {
self.getContent("/sony/audio", "setAudioMute", {
"status": false
}, "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
if (response.error[0] == 7 || response.error[0] == 40005) {
self.log("TV OFF");
self.state = false;
} else if (response.error[0] == 3 || response.error[0] == 5) {
self.log("Illegal argument!");
self.state = false;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.state = false;
}
} else {
//self.log("Turn ON: " + self.name);
self.state = true;
}
self.VolumeBulb.getCharacteristic(Characteristic.On).updateValue(self.state);
self.setOnCount = 0;
callback(null, self.state)
})
.catch((err) => {
if (self.setOnCount <= 5) {
self.state = true;
setTimeout(function() {
self.setOnCount += 1;
self.VolumeBulb.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = false;
self.log("Can't set " + self.name + " on! " + err)
callback(null, self.state)
}
});
} else {
self.getContent("/sony/audio", "setAudioMute", {
"status": true
}, "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
if (response.error[0] == 7 || response.error[0] == 40005) {
self.log("TV OFF");
self.state = false;
} else if (response.error[0] == 3 || response.error[0] == 5) {
self.log("Illegal argument!");
self.state = false;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.state = false;
}
} else {
//self.log("Turn OFF: " + self.name);
self.state = false;
}
self.VolumeBulb.getCharacteristic(Characteristic.On).updateValue(self.state);
self.setOffCount = 0;
callback(null, self.state)
})
.catch((err) => {
if (self.setOffCount <= 5) {
self.state = false;
setTimeout(function() {
self.setOffCount += 1;
self.VolumeBulb.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = true;
self.log("Can't set " + self.name + " off! " + err)
callback(null, self.state)
}
});
}
}
setVolume(value, callback) {
var self = this;
if(value > self.maxVolume){
value = self.maxVolume
}
var newValue = value.toString();
self.getContent("/sony/audio", "setAudioVolume", {
"target": "speaker",
"volume": newValue
}, "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
if (response.error[0] == 7 || response.error[0] == 40005) {
self.log("TV OFF");
self.volume = 0;
} else if (response.error[0] == 3 || response.error[0] == 5) {
self.log("Illegal argument!");
self.volume = 0;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.volume = 0;
}
} else {
self.log("Volume: " + value);
self.volume = value;
}
self.VolumeBulb.getCharacteristic(Characteristic.Brightness).updateValue(self.volume);
callback(null, self.volume)
})
.catch((err) => {
self.log(self.name + ": " + err);
self.VolumeBulb.getCharacteristic(Characteristic.Brightness).updateValue(self.volume);
callback(null, self.volume)
});
}
}
module.exports = VOLUME