150 lines
4.5 KiB
JavaScript
150 lines
4.5 KiB
JavaScript
Vue.component('zigbee-group', {
|
|
template: '#tmpl-zigbee-group',
|
|
props: ['group','bus','selected'],
|
|
data: function() {
|
|
return {
|
|
properties: {},
|
|
};
|
|
},
|
|
|
|
methods: {
|
|
anyOn: async function() {
|
|
for (const dev of this.group.devices) {
|
|
const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name});
|
|
if (params.state === 'ON') {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
allOn: async function() {
|
|
for (const dev of this.group.devices) {
|
|
const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name});
|
|
if (params.state === 'OFF') {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
refreshProperties: async function() {
|
|
const props = {};
|
|
|
|
for (const dev of this.group.devices) {
|
|
const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name});
|
|
for (const [name, value] of Object.entries(params)) {
|
|
if (name === 'linkquality') {
|
|
continue;
|
|
}
|
|
|
|
if (name in props) {
|
|
props[name].push(value);
|
|
} else {
|
|
props[name] = [value];
|
|
}
|
|
}
|
|
}
|
|
|
|
for (const [name, values] of Object.entries(props)) {
|
|
if (name === 'state') {
|
|
props[name] = values.filter((value) => value === 'ON').length > 0;
|
|
} else if (!isNaN(values[0])) {
|
|
props[name] = values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
} else {
|
|
props[name] = values[0];
|
|
}
|
|
}
|
|
|
|
this.properties = props;
|
|
},
|
|
|
|
onGroupClicked: function() {
|
|
this.bus.$emit('groupClicked', {
|
|
groupId: this.group.id,
|
|
});
|
|
},
|
|
|
|
setValue: async function(event) {
|
|
const name = event.target.dataset.name;
|
|
if (!name || !name.length) {
|
|
return;
|
|
}
|
|
|
|
await request('zigbee.mqtt.group_set', {
|
|
group: this.group.friendly_name,
|
|
property: name,
|
|
value: event.target.value,
|
|
});
|
|
|
|
this.bus.$emit('refreshDevices');
|
|
},
|
|
|
|
toggleState: async function() {
|
|
const state = (await this.anyOn()) ? 'OFF' : 'ON';
|
|
await request('zigbee.mqtt.group_set', {
|
|
group: this.group.friendly_name,
|
|
property: 'state',
|
|
value: state,
|
|
});
|
|
|
|
this.bus.$emit('refreshDevices');
|
|
},
|
|
|
|
renameGroup: async function() {
|
|
const name = prompt('New name', this.group.friendly_name);
|
|
if (!name || !name.length || name === this.group.friendly_name) {
|
|
return;
|
|
}
|
|
|
|
this.commandRunning = true;
|
|
await request('zigbee.mqtt.group_rename', {
|
|
name: name,
|
|
group: this.group.friendly_name,
|
|
});
|
|
|
|
this.commandRunning = false;
|
|
const self = this;
|
|
|
|
setTimeout(() => {
|
|
self.bus.$emit('refreshGroups');
|
|
}, 100);
|
|
},
|
|
|
|
removeGroup: async function() {
|
|
if (!confirm('Are you sure that you want to delete this group?')) {
|
|
return;
|
|
}
|
|
|
|
this.commandRunning = true;
|
|
await request('zigbee.mqtt.group_remove', {name: this.group.friendly_name});
|
|
this.commandRunning = false;
|
|
this.bus.$emit('refreshGroups');
|
|
},
|
|
|
|
removeFromGroup: async function(device) {
|
|
if (!confirm('Are you sure that you want to remove this node from ' + this.group.label + '?')) {
|
|
return;
|
|
}
|
|
|
|
await request('zigbee.mqtt.group_remove_device', {
|
|
device: device,
|
|
group: this.group.friendly_name,
|
|
});
|
|
|
|
this.bus.$emit('refreshGroups');
|
|
},
|
|
},
|
|
|
|
created: function() {
|
|
this.refreshProperties();
|
|
this.bus.$on('refresh', this.refreshProperties);
|
|
this.bus.$on('refreshDevices', this.refreshProperties);
|
|
this.bus.$on('refreshGroups', this.refreshProperties);
|
|
this.bus.$on('refreshProperties', this.refreshProperties);
|
|
},
|
|
});
|
|
|