homebridge-orbit-irrigation
Version:
Orbit Irrigation System platform plugin for [Homebridge](https://github.com/nfarina/homebridge).
218 lines • 12.4 kB
JavaScript
import pkg from 'homebridge-orbit-irrigation/package.json' with { type: 'json' };
import OrbitAPI from '../orbitapi.js';
export default class sensor {
platform;
orbitapi;
log;
Service;
Characteristic;
constructor(platform, orbitapi = new OrbitAPI(platform), log = platform.log) {
this.platform = platform;
this.orbitapi = orbitapi;
this.log = log;
this.Service = platform.Service;
this.Characteristic = platform.Characteristic;
}
createFloodAccessory(device, uuid, platformAccessory) {
if (!platformAccessory) {
this.log.debug('Create flood accessory %s %s', device.id, device.location_name + ' ' + device.name);
platformAccessory = new this.platform.api.platformAccessory(device.location_name + ' ' + device.name, uuid);
}
else {
this.log.debug('Update flood accessory %s %s', device.id, device.location_name + ' ' + device.name);
}
platformAccessory.getService(this.Service.AccessoryInformation)
.setCharacteristic(this.Characteristic.Name, device.location_name + ' ' + device.name)
.setCharacteristic(this.Characteristic.Manufacturer, 'Orbit Irrigation')
.setCharacteristic(this.Characteristic.SerialNumber, device.mac_address)
.setCharacteristic(this.Characteristic.Model, device.hardware_version || 'Orbit Sensor')
.setCharacteristic(this.Characteristic.Identify, true)
.setCharacteristic(this.Characteristic.FirmwareRevision, device.firmware_version || 'unknown')
.setCharacteristic(this.Characteristic.HardwareRevision, device.hardware_version || 'unknown')
.setCharacteristic(this.Characteristic.SoftwareRevision, pkg.version);
platformAccessory.getService(this.Service.AccessoryInformation).getCharacteristic(this.Characteristic.Identify)
//.onSet(this.setIdentify.bind(this, device)); //homebridge warning, need to use old method
.on('set', () => {
this.setIdentify.bind(this, device);
});
return platformAccessory;
}
setIdentify(device) {
(this.orbitapi.identify(this.platform.token, device));
return;
}
createBatteryService(device, platformAccessory) {
let batteryStatus = platformAccessory.getService(this.Service.Battery);
if (!batteryStatus) {
if (device.location_name) {
this.log.debug('create battery service for %s', device.location_name + ' ' + device.name);
batteryStatus = new this.Service.Battery(device.location_name + ' ' + device.name, device.id);
}
else {
this.log.debug('create battery service for %s', device.name);
batteryStatus = new this.Service.Battery(device.name, device.id);
}
}
else {
if (device.location_name) {
this.log.debug('update battery service for %s', device.location_name + ' ' + device.name);
}
else {
this.log.debug('update battery service for %s', device.name);
}
}
let percent = 100;
if (device.battery.percent) {
percent = device.battery.percent;
}
batteryStatus
.setCharacteristic(this.Characteristic.ChargingState, this.Characteristic.ChargingState.NOT_CHARGEABLE)
.setCharacteristic(this.Characteristic.StatusLowBattery, this.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL)
.setCharacteristic(this.Characteristic.BatteryLevel, percent);
return batteryStatus;
}
configureBatteryService(batteryStatus) {
this.log.debug('configured battery service for %s', batteryStatus.getCharacteristic(this.Characteristic.Name).value);
batteryStatus.getCharacteristic(this.Characteristic.StatusLowBattery)
.onGet(this.getStatusLowBattery.bind(this, batteryStatus));
}
createLeakService(device) {
this.log.debug('create leak sensor for %s', device.location_name + ' ' + device.name);
let currentAlarm;
switch (device.status.flood_alarm_status) {
case 'ok':
currentAlarm = false;
break;
case 'alarm':
currentAlarm = true;
break;
default:
currentAlarm = false;
break;
}
const leakSensor = new this.Service.LeakSensor(device.location_name + ' ' + device.name, device.id);
leakSensor
.setCharacteristic(this.Characteristic.StatusActive, true)
.setCharacteristic(this.Characteristic.LeakDetected, currentAlarm)
.setCharacteristic(this.Characteristic.StatusFault, !device.is_connected)
.setCharacteristic(this.Characteristic.StatusTampered, this.Characteristic.StatusTampered.NOT_TAMPERED);
return leakSensor;
}
configureLeakService(leakSensor) {
this.log.debug('configured leak sensor for %s', leakSensor.getCharacteristic(this.Characteristic.Name).value);
leakSensor.getCharacteristic(this.Characteristic.LeakDetected)
.onGet(this.getLeakStatus.bind(this, leakSensor));
}
createTempService(device) {
this.log.debug('create temperature sensor service for %s', device.location_name + ' ' + device.name);
const tempSensor = new this.Service.TemperatureSensor(device.location_name + ' ' + device.name + ' Temp', 'tempSensor');
tempSensor
.setCharacteristic(this.Characteristic.StatusActive, true)
.setCharacteristic(this.Characteristic.CurrentTemperature, ((device.status.temp_f - 32) * 5) / 9)
.setCharacteristic(this.Characteristic.StatusFault, !device.is_connected)
.setCharacteristic(this.Characteristic.StatusTampered, this.Characteristic.StatusTampered.NOT_TAMPERED);
return tempSensor;
}
configureTempService(tempSensor) {
this.log.debug('configured temp sensor for %s', tempSensor.getCharacteristic(this.Characteristic.Name).value);
tempSensor.getCharacteristic(this.Characteristic.CurrentTemperature)
.onGet(this.getTempStatus.bind(this, tempSensor));
}
createOccupancyService(device) {
this.log.debug('create Occupancy service for %s', device.location_name + ' ' + device.name);
const occupancyStatus = new this.Service.OccupancySensor(device.location_name + ' ' + device.name + ' Limits', device.id);
occupancyStatus
.setCharacteristic(this.Characteristic.StatusActive, true)
.setCharacteristic(this.Characteristic.OccupancyDetected, this.Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED)
.setCharacteristic(this.Characteristic.StatusFault, !device.is_connected)
.setCharacteristic(this.Characteristic.StatusTampered, this.Characteristic.StatusTampered.NOT_TAMPERED);
return occupancyStatus;
}
configureOccupancyService(occupancyStatus) {
this.log.debug('configured Occupancy service');
occupancyStatus.getCharacteristic(this.Characteristic.OccupancyDetected)
.onGet(this.getStatusOccupancy.bind(this, occupancyStatus));
}
async getStatusLowBattery(batteryStatus) {
const name = batteryStatus.getCharacteristic(this.Characteristic.Name).value;
const batteryValue = batteryStatus.getCharacteristic(this.Characteristic.BatteryLevel).value;
let currentValue = batteryStatus.getCharacteristic(this.Characteristic.StatusLowBattery).value;
if (batteryValue <= this.platform.lowBattery) {
this.log.warn('%s Battery Status Low %s% Remaining', name, batteryValue);
batteryStatus.setCharacteristic(this.Characteristic.StatusLowBattery, this.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW);
currentValue = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
}
try {
const sensorResponse = await this.orbitapi.getDevice(this.platform.token, batteryStatus.subtype).catch(err => {
throw (err);
});
this.log.debug('check sensor battery status %s %s', sensorResponse.location_name, sensorResponse.name);
sensorResponse.device_id = sensorResponse.id;
sensorResponse.event = 'battery_status';
this.platform.orbit.updateService.bind(this.platform)(JSON.stringify(sensorResponse));
}
catch (err) {
this.log.warn('Failed to read sensor', err);
}
return currentValue;
}
async getLeakStatus(leakSensor) {
if (leakSensor.getCharacteristic(this.Characteristic.StatusFault).value == this.Characteristic.StatusFault.GENERAL_FAULT) {
if (leakSensor.getCharacteristic(this.Characteristic.StatusActive).value == true) {
this.log.debug('%s, Fault Detected', leakSensor.getCharacteristic(this.Characteristic.Name).value);
leakSensor.setCharacteristic(this.Characteristic.StatusActive, false);
}
throw new this.platform.HapStatusError(-70402 /* this.platform.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
}
else {
leakSensor.setCharacteristic(this.Characteristic.StatusActive, true);
const leak = leakSensor.getCharacteristic(this.Characteristic.LeakDetected).value;
let currentValue = this.Characteristic.LeakDetected.LEAK_NOT_DETECTED;
if (leak) {
this.log.warn('%s, Leak Detected', leakSensor.getCharacteristic(this.Characteristic.Name).value);
leakSensor.setCharacteristic(this.Characteristic.LeakDetected, this.Characteristic.LeakDetected.LEAK_DETECTED);
currentValue = this.Characteristic.LeakDetected.LEAK_DETECTED;
}
return currentValue;
}
}
async getTempStatus(tempSensor) {
if (tempSensor.getCharacteristic(this.Characteristic.StatusFault).value == this.Characteristic.StatusFault.GENERAL_FAULT) {
if (tempSensor.getCharacteristic(this.Characteristic.StatusActive).value == true) {
this.log.debug('%s, Fault Detected', tempSensor.getCharacteristic(this.Characteristic.Name).value);
tempSensor.setCharacteristic(this.Characteristic.StatusActive, false);
}
throw new this.platform.HapStatusError(-70402 /* this.platform.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
}
else {
tempSensor.setCharacteristic(this.Characteristic.StatusActive, true);
const temp = tempSensor.getCharacteristic(this.Characteristic.CurrentTemperature).value;
const currentValue = temp;
if (this.platform.showExtraDebugMessages) {
this.log.debug('Temp Detected', Math.round((temp * 9) / 5 + 32));
}
return currentValue;
}
}
async getStatusOccupancy(OccupancySensor) {
if (OccupancySensor.getCharacteristic(this.Characteristic.StatusFault).value == this.Characteristic.StatusFault.GENERAL_FAULT) {
if (OccupancySensor.getCharacteristic(this.Characteristic.StatusActive).value == true) {
this.log.debug('%s, Fault Detected', OccupancySensor.getCharacteristic(this.Characteristic.Name).value);
OccupancySensor.setCharacteristic(this.Characteristic.StatusActive, false);
}
throw new this.platform.HapStatusError(-70402 /* this.platform.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
}
else {
OccupancySensor.setCharacteristic(this.Characteristic.StatusActive, true);
const alarm = OccupancySensor.getCharacteristic(this.Characteristic.OccupancyDetected).value;
let currentValue = this.Characteristic.OccupancyDetected.OCCUPANCY_NOT_DETECTED;
if (alarm) {
this.log.warn('%s, Alarm Detected', OccupancySensor.getCharacteristic(this.Characteristic.Name).value);
this.log.info('Temperture limits for %s exceeded', OccupancySensor.getCharacteristic(this.Characteristic.Name).value);
currentValue = this.Characteristic.OccupancyDetected.OCCUPANCY_DETECTED;
}
return currentValue;
}
}
}
//# sourceMappingURL=sensor.js.map