Created
January 15, 2021 23:29
-
-
Save yariv/42fad622bf8f6ab4554d7de51fbaf7f5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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