homebridge-sonybravia-platform
Version:
homebridge-sonybravia-platform
493 lines (379 loc) • 19.1 kB
JavaScript
var http = require("http");
var Accessory,
Service,
Characteristic;
class INPUTS {
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;
this.title = config.title;
this.uri = config.uri;
this.meta = config.meta;
this.ipadress = config.ipadress;
this.port = config.port;
this.psk = config.psk;
this.interval = config.interval;
this.homeapp = config.homeapp;
this.offState = config.offState;
this.favChannel = config.favChannel;
this.channelSource = config.channelSource;
this.customuri = config.customuri;
this.setOnCount = 0;
this.setOffCount = 0;
this.getCount = 0;
!this.state ? this.state = false : this.state;
if (this.meta == "meta:playbackdevice") {
if (this.uri.match("logicalAddr")) {
var port = this.uri.split("port=")[1].split("&logicalAddr=")[0];
} else {
var port = this.uri.split("port=")[1];
}
//this.logaddr = this.uri.split("port=")[1].split("&logicalAddr=")[1];
this.simpleuri = "extInput:hdmi?port=" + port;
} else {
this.simpleuri = this.uri;
}
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, 'Input Control')
.setCharacteristic(Characteristic.SerialNumber, "Sony-Inputs")
.setCharacteristic(Characteristic.FirmwareRevision, require('../package.json').version);
this.SourceSwitch = new Service.Switch(this.name);
this.SourceSwitch.getCharacteristic(Characteristic.On)
.updateValue(this.state)
.on('set', this.setSourceSwitch.bind(this));
this.getStates();
return [this.informationService, this.SourceSwitch];
}
getStates() {
var self = this;
self.getContent("/sony/avContent", "getPlayingContentInfo", "1.0", "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("result" in response) {
if (response.result[0].uri == self.uri || response.result[0].uri == self.simpleuri || response.result[0].uri == self.customuri) {
self.state = true;
} else {
self.state = false;
}
} else {
self.state = false;
}
self.SourceSwitch.getCharacteristic(Characteristic.On).updateValue(self.state);
self.getCount = 0;
setTimeout(function() {
self.getStates();
}, self.interval)
})
.catch((err) => {
self.SourceSwitch.getCharacteristic(Characteristic.On).updateValue(self.state);
if (self.getCount > 5) {
self.log(self.name + ": " + err);
}
setTimeout(function() {
self.getCount += 1;
self.getStates();
}, 60000)
});
}
setSourceSwitch(state, callback) {
var self = this;
if (state) {
self.getContent("/sony/avContent", "setPlayContent", {
"uri": self.uri
}, "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
if (response.error[0] == 7 || response.error[0] == 40005) {
self.getContent("/sony/system", "setPowerStatus", {
"status": true
}, "1.0")
.then((data) => {
self.log("Turning on the TV...");
self.state = true;
setTimeout(function() {
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
}, 2000)
})
.catch((err) => {
self.log(self.name + ": " + err + " Try setting again...");
self.state = true;
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
callback(null, self.state)
});
} 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.setOnCount = 0;
self.log("Turn ON: " + self.name);
self.state = true;
}
self.SourceSwitch.getCharacteristic(Characteristic.On).updateValue(self.state);
callback(null, self.state)
})
.catch((err) => {
if (self.setOnCount <= 5) {
self.state = true;
setTimeout(function() {
self.setOnCount += 1;
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = false;
self.log("Can't set " + self.name + " on! " + err)
self.setOnCount = 0
callback(null, self.state)
}
});
} else {
if (self.offState == "HOME") {
if (!self.homeapp) {
self.getContent("/sony/appControl", "getApplicationList", "1.0", "1.0")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
self.log("An error occured by setting home app!");
if (response.error[0] == 7 || response.error[0] == 40005) {
self.log("Please turn on the TV! Trying again...");
} else if (response.error[0] == 3 || response.error[0] == 5) {
self.log("Illegal argument!");
} else {
self.log("ERROR: " + JSON.stringify(response));
}
setTimeout(function() {
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
}, 10000)
} else {
var result = response.result[0];
self.homeapp = result[0].uri;
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
callback()
}
})
.catch((err) => {
self.log("Apps: " + err + " - Trying again");
setTimeout(function() {
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
}, 10000)
callback()
});
} else {
self.getContent("/sony/appControl", "setActiveApp", {
"uri": self.homeapp
}, "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 = true;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.state = true;
}
} else {
self.log("Switch to Home App")
self.state = false;
}
self.SourceSwitch.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.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = true;
self.log("Can't set " + self.name + " off! " + err)
self.setOffCount = 0
callback(null, self.state)
}
});
}
} else if (self.offState == "CHANNEL") {
if (!self.favChannel) {
self.getContent("/sony/avContent", "getContentList", {
"source": self.channelSource,
"stIdx": 0
}, "1.2")
.then((data) => {
var response = JSON.parse(data);
if ("error" in response) {
self.log("An error occured by setting favourite channel!");
if (response.error[0] == 7 || response.error[0] == 40005) {
self.log("Please turn on the TV! Trying again...");
} else if (response.error[0] == 3 || response.error[0] == 5) {
self.log("Illegal argument!");
} else {
self.log("ERROR: " + JSON.stringify(response));
}
setTimeout(function() {
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
}, 10000)
callback()
} else {
var name = response.result[0];
for (var i = 0; i <= name.length; i++) {
switch (i) {
case 0:
self.favChannel = name[0].uri;
break;
}
}
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
callback()
}
})
.catch((err) => {
self.log("Favourite Channel: " + err + " - Trying again");
setTimeout(function() {
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
}, 10000)
callback()
});
} else {
self.getContent("/sony/avContent", "setPlayContent", {
"uri": self.favChannel
}, "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 = true;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.state = true;
}
} else {
self.log("Switch to Channel")
self.state = false;
}
self.SourceSwitch.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.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = true;
self.log("Can't set " + self.name + " off! " + err)
self.setOffCount = 0
callback(null, self.state)
}
});
}
} else if (self.offState == "OFF") {
self.getContent("/sony/system", "setPowerStatus", {
"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 = true;
} else {
self.log("ERROR: " + JSON.stringify(response));
self.state = true;
}
} else {
self.log("Turning off the TV");
self.state = false;
}
self.SourceSwitch.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.SourceSwitch.getCharacteristic(Characteristic.On).setValue(self.state);
}, 3000)
callback(null, self.state)
} else {
self.state = true;
self.log("Can't set " + self.name + " off! " + err)
self.setOffCount = 0
callback(null, self.state)
}
});
} else {
self.log("Off State could not be detected. Please check your config file. Available modes are: HOME, CHANNEL and OFF!. Setting offState to HOME. Trying again...")
self.offState = "HOME";
self.SourceSwitch.getCharacteristic(Characteristic.On).setValue(false);
callback()
}
}
}
}
module.exports = INPUTS