mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2024-11-16 18:39:09 -07:00
173 lines
4.9 KiB
JavaScript
173 lines
4.9 KiB
JavaScript
const settings = require('./util/settings');
|
|
|
|
const configurations = {
|
|
// Binary sensor
|
|
'binary_sensor_occupancy': {
|
|
type: 'binary_sensor',
|
|
object_id: 'occupancy',
|
|
discovery_payload: {
|
|
payload_on: true,
|
|
payload_off: false,
|
|
value_template: '{{ value_json.occupancy }}',
|
|
device_class: 'motion',
|
|
json_attributes: ['battery']
|
|
}
|
|
},
|
|
'binary_sensor_contact': {
|
|
type: 'binary_sensor',
|
|
object_id: 'contact',
|
|
discovery_payload: {
|
|
payload_on: false,
|
|
payload_off: true,
|
|
value_template: '{{ value_json.contact }}',
|
|
device_class: 'door',
|
|
json_attributes: ['battery']
|
|
}
|
|
},
|
|
'binary_sensor_water_leak': {
|
|
type: 'binary_sensor',
|
|
object_id: 'water_leak',
|
|
discovery_payload: {
|
|
payload_on: true,
|
|
payload_off: false,
|
|
value_template: '{{ value_json.water_leak }}',
|
|
device_class: 'moisture',
|
|
json_attributes: ['battery']
|
|
}
|
|
},
|
|
|
|
// Sensor
|
|
'sensor_illuminance': {
|
|
type: 'sensor',
|
|
object_id: 'illuminance',
|
|
discovery_payload: {
|
|
unit_of_measurement: 'lx',
|
|
icon: 'mdi:theme-light-dark',
|
|
value_template: '{{ value_json.illuminance }}',
|
|
json_attributes: ['battery'],
|
|
}
|
|
},
|
|
'sensor_humidity': {
|
|
type: 'sensor',
|
|
object_id: 'humidity',
|
|
discovery_payload: {
|
|
unit_of_measurement: '%',
|
|
icon: 'mdi:water-percent',
|
|
value_template: '{{ value_json.humidity }}',
|
|
json_attributes: ['battery'],
|
|
}
|
|
},
|
|
'sensor_temperature': {
|
|
type: 'sensor',
|
|
object_id: 'temperature',
|
|
discovery_payload: {
|
|
unit_of_measurement: '°C',
|
|
icon: 'mdi:temperature-celsius',
|
|
value_template: '{{ value_json.temperature }}',
|
|
json_attributes: ['battery'],
|
|
}
|
|
},
|
|
'sensor_pressure': {
|
|
type: 'sensor',
|
|
object_id: 'pressure',
|
|
discovery_payload: {
|
|
unit_of_measurement: 'Pa',
|
|
icon: 'mdi:speedometer',
|
|
value_template: '{{ value_json.pressure }}',
|
|
json_attributes: ['battery'],
|
|
}
|
|
},
|
|
'sensor_button': {
|
|
type: 'sensor',
|
|
object_id: 'button',
|
|
discovery_payload: {
|
|
icon: 'mdi:toggle-switch',
|
|
value_template: '{{ value_json.click }}',
|
|
json_attributes: ['battery'],
|
|
}
|
|
},
|
|
'sensor_power': {
|
|
type: 'sensor',
|
|
object_id: 'power',
|
|
discovery_payload: {
|
|
unit_of_measurement: 'Watt',
|
|
icon: 'mdi:flash',
|
|
value_template: '{{ value_json.power }}',
|
|
}
|
|
},
|
|
|
|
// Light
|
|
'light_brightness_colortemp_xy': {
|
|
type: 'light',
|
|
object_id: 'light',
|
|
discovery_payload: {
|
|
brightness: true,
|
|
color_temp: true,
|
|
xy: true,
|
|
platform: 'mqtt_json',
|
|
command_topic: true
|
|
}
|
|
},
|
|
'light_brightness_colortemp': {
|
|
type: 'light',
|
|
object_id: 'light',
|
|
discovery_payload: {
|
|
brightness: true,
|
|
color_temp: true,
|
|
platform: 'mqtt_json',
|
|
command_topic: true
|
|
}
|
|
},
|
|
|
|
// Switch
|
|
'switch': {
|
|
type: 'switch',
|
|
object_id: 'switch',
|
|
discovery_payload: {
|
|
payload_off: 'OFF',
|
|
payload_on: 'ON',
|
|
value_template: '{{ value_json.state }}',
|
|
command_topic: true
|
|
}
|
|
},
|
|
};
|
|
|
|
// A map of all discoverd devices
|
|
const discovered = {};
|
|
|
|
function discover(deviceID, configs, mqtt) {
|
|
// Check if already discoverd and check if there are configs.
|
|
if (discovered[deviceID] || !configs) {
|
|
return;
|
|
}
|
|
|
|
const friendlyName = settings.getDevice(deviceID).friendly_name;
|
|
|
|
configs.forEach((config) => {
|
|
const topic = `${config.type}/${deviceID}/${config.object_id}/config`;
|
|
const payload = config.discovery_payload;
|
|
payload.state_topic = `${settings.get().mqtt.base_topic}/${friendlyName}`;
|
|
payload.availability_topic = `${settings.get().mqtt.base_topic}/bridge/state`;
|
|
|
|
// Set unique names in cases this device produces multiple entities in homeassistant.
|
|
if (configs.length > 1) {
|
|
payload.name = `${friendlyName}_${config.object_id}`;
|
|
} else {
|
|
payload.name = friendlyName;
|
|
}
|
|
|
|
if (payload.command_topic) {
|
|
payload.command_topic = `${settings.get().mqtt.base_topic}/${friendlyName}/set`;
|
|
}
|
|
|
|
mqtt.publish(topic, JSON.stringify(payload), true, null, 'homeassistant');
|
|
});
|
|
|
|
discovered[deviceID] = true;
|
|
}
|
|
|
|
module.exports = {
|
|
configurations: configurations,
|
|
discover: (deviceID, configs, mqtt) => discover(deviceID, configs, mqtt),
|
|
};
|