homebridge-aron-airquality
Version:
homebridge plugin airquality
137 lines (123 loc) • 5.52 kB
JavaScript
var Service,Characteristic;
var http=require('http');
WeatherService = function(platform, config) {
this.platform = platform;
this.config = config;
this.platform.log.debug("[WeatherService]Initializing Weather: " + this.config["city"]);
return new WeatherServiceService(this);
}
WeatherServiceService = function(dThis) {
this.name = dThis.config['name'];
this.city = dThis.config['city'];
this.platform = dThis.platform;
this.temperature = 26;
this.humidity = 50;
this.pm25value = 50;
this.pm10value = 50;
this.timer = true;
Service = dThis.platform.HomebridgeAPI.hap.Service;
Characteristic = dThis.platform.HomebridgeAPI.hap.Characteristic;
this.getData();
}
WeatherServiceService.prototype.updateTimer = function() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = setTimeout(function() {
this.getData();
}.bind(this), 1000 * 60 * 5);
}
}
WeatherServiceService.prototype.getData = function() {
var that = this;
try{
http.get('http://tj.nineton.cn/Heart/index/all?city=' + this.city,function(req,res){
var datas = "";
req.on('data',function(data){
datas = data;
});
req.on('end',function(){
try{
var dataa = JSON.parse(datas);
if(dataa.status == "OK"){
var weather = dataa.weather;
that.temperature = weather[0]['now']['temperature'];
that.humidity = weather[0]['now']['humidity'];
that.pm25value = weather[0]['now']['air_quality']['city']['pm25'];
that.pm10value = weather[0]['now']['air_quality']['city']['pm10'];
that.platform.log.debug('[' + that.name + ']temperature: %s °C', that.temperature);
that.platform.log.debug('[' + that.name + ']humidity: %s %', that.humidity);
that.platform.log.debug('[' + that.name + ']PM2.5: %s μg/m³', that.pm25value);
that.platform.log.debug('[' + that.name + ']PM10: %s μg/m³', that.pm10value);
that.updateAllValue();
}
}catch(ex){
that.platform.log.error('Error JSON: ' + ex);
}
});
});
}catch(ex){
that.platform.log.error('Error: ' + ex);
}
this.updateTimer();
}
WeatherServiceService.prototype.updateAllValue = function() {
this.TemperatureService.getCharacteristic(Characteristic.CurrentTemperature).updateValue(this.temperature);
this.HumidityService.getCharacteristic(Characteristic.CurrentRelativeHumidity).updateValue(this.humidity);
this.AirQualityService.getCharacteristic(Characteristic.AirQuality).updateValue(this.calcAirQuality(this.pm25value));
this.AirQualityService.getCharacteristic(Characteristic.PM2_5Density).updateValue(this.pm25value);
this.platform.log.debug('[' + this.name + ']Value Updated!');
}
WeatherServiceService.prototype.getServices = function() {
var that = this;
var services = [];
var infoService = new Service.AccessoryInformation();
infoService
.setCharacteristic(Characteristic.Manufacturer, "Zzm317")
.setCharacteristic(Characteristic.Model, "Weather-" + this.city)
.setCharacteristic(Characteristic.SerialNumber, this.city);
services.push(infoService);
this.TemperatureService = new Service.TemperatureSensor(this.name);
this.TemperatureService.getCharacteristic(Characteristic.CurrentTemperature)
.on('get', function(callback) {
callback(null,this.temperature);
}.bind(this))
this.HumidityService = new Service.HumiditySensor(this.name);
this.HumidityService.getCharacteristic(Characteristic.CurrentRelativeHumidity)
.on('get', function(callback) {
callback(null,this.humidity);
}.bind(this))
this.AirQualityService = new Service.AirQualitySensor(this.name);
this.AirQualityService.getCharacteristic(Characteristic.AirQuality)
.on('get', function(callback) {
callback(null,this.calcAirQuality(this.pm25value));
}.bind(this));
this.AirQualityService.addCharacteristic(Characteristic.PM2_5Density);
this.AirQualityService.getCharacteristic(Characteristic.PM2_5Density)
.on('get', function(callback) {
callback(null,this.pm25value);
}.bind(this))
this.AirQualityService.addCharacteristic(Characteristic.PM10Density);
this.AirQualityService.getCharacteristic(Characteristic.PM10Density)
.on('get', function(callback) {
callback(null,this.pm10value);
}.bind(this))
services.push(this.TemperatureService);
services.push(this.HumidityService);
services.push(this.AirQualityService);
return services;
}
WeatherServiceService.prototype.calcAirQuality = function(pm25) {
if(pm25 <= 50){
return Characteristic.AirQuality.EXCELLENT
}else if(pm25 > 50 && pm25 <= 100){
return Characteristic.AirQuality.GOOD
}else if(pm25 > 100 && pm25 <= 200){
return Characteristic.AirQuality.FAIR
}else if(pm25 > 200 && pm25 <= 300){
return Characteristic.AirQuality.INFERIOR
}else if(pm25 > 300){
return Characteristic.AirQuality.POOR
}else{
return Characteristic.AirQuality.UNKNOWN
}
}