Skip to content

Instantly share code, notes, and snippets.

@yariv
Created January 15, 2021 23:29
Show Gist options
  • Save yariv/42fad622bf8f6ab4554d7de51fbaf7f5 to your computer and use it in GitHub Desktop.
Save yariv/42fad622bf8f6ab4554d7de51fbaf7f5 to your computer and use it in GitHub Desktop.
var fs = require('fs');
function readJsonFile(fileName) {
var buf = fs.readFileSync(fileName);
return JSON.parse(buf.toString('utf8'));
}
var deviceRegistry = readJsonFile('./.storage/core.device_registry')
var devices = deviceRegistry.data.devices;
var smokeDetectors = {};
for (var device of devices) {
if (device.name === "First Alert (BRK Brands Inc) ZCombo Smoke and Carbon Monoxide Detector") {
smokeDetectors[device.id] = {name: device.name_by_user}
}
}
var entitiesRegistry = readJsonFile('./.storage/core.entity_registry')
var entities = entitiesRegistry.data.entities;
for (var entity of entities) {
var entityDevice = smokeDetectors[entity.device_id];
if (entityDevice) {
var entityType;
if (entity.device_class === "battery") {
entityDevice.battery = entity;
} else if (entity.entity_id.indexOf("alarm_level") > 0) {
entityDevice.alarmLevel = entity;
} else if (entity.entity_id.indexOf("alarm_type") > 0) {
entityDevice.alarmType = entity;
}
}
}
var smokeDetectorsArr = Object.values(smokeDetectors);
console.log(`
binary_sensor:
- platform: template
sensors:`);
for (var idx in smokeDetectorsArr) {
const smokeDetector = smokeDetectorsArr[idx];
console.log(printConfig(idx, smokeDetector.name, smokeDetector.alarmLevel.entity_id, smokeDetector.alarmType.entity_id));
}
console.log(`homekit:
auto_start: false
entity_config:`);
for (var idx in smokeDetectorsArr) {
const smokeDetector = smokeDetectorsArr[idx];
console.log(printHomeKitConfig(idx, smokeDetector.name, smokeDetector.battery.entity_id));
}
function printConfig(idx, deviceName, alarmLevelSensorId, alarmTypeSensorId) {
var template =
` smoke_sensor_${idx}:
unique_id: smoke_sensor_${idx}
friendly_name: ${deviceName}
device_class: smoke
value_template: >-
{% if is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '1') %}
smoke
{% elif is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '2') %}
co
{% elif is_state('${alarmLevelSensorId}', '0') and is_state('${alarmTypeSensorId}', '12') %}
test
{% elif is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '13') %}
idle
{% endif %}
icon_template: >-
{% if is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '1') %}
mdi:fire
{% elif is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '2') %}
mdi:cloud-outline
{% elif is_state('${alarmLevelSensorId}', '0') and is_state('${alarmTypeSensorId}', '12') %}
mdi:alert-octagram
{% elif is_state('${alarmLevelSensorId}', '255') and is_state('${alarmTypeSensorId}', '13') %}
mdi:smoke-detector
{% endif %}
`
return template;
}
function printHomeKitConfig(idx, name, batterySensorId) {
var template = `
binary_sensor.smoke_sensor_${idx}:
linked_battery_sensor: ${batterySensorId}`
return template;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment