platypush/platypush/backend/http/static/js/plugins/zwave/index.js

370 lines
12 KiB
JavaScript

Vue.component('zwave', {
template: '#tmpl-zwave',
props: ['config'],
data: function() {
return {
bus: new Vue({}),
status: {},
views: {},
nodes: {},
groups: {},
scenes: {},
commandRunning: false,
values: {
switches: {},
dimmers: {},
sensors: {},
battery_levels: {},
power_levels: {},
bulbs: {},
doorlocks: {},
usercodes: {},
thermostats: {},
protections: {},
},
selected: {
view: 'nodes',
nodeId: undefined,
groupId: undefined,
sceneId: undefined,
},
loading: {
status: false,
nodes: false,
groups: false,
scenes: false,
},
modal: {
networkInfo: {
visible: false,
},
group: {
visible: false,
},
},
};
},
computed: {
networkDropdownItems: function() {
const self = this;
return [
{
text: 'Start Network',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.start_network');
self.commandRunning = false;
},
},
{
text: 'Stop Network',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.start_network');
self.commandRunning = false;
},
},
{
text: 'Switch All On',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.switch_all', {state: true});
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Switch All Off',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.switch_all', {state: false});
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Cancel Command',
click: async function() {
await request('zwave.cancel_command');
},
},
{
text: 'Kill Command',
click: async function() {
await request('zwave.kill_command');
},
},
{
text: 'Set Controller Name',
disabled: this.commandRunning,
click: async function() {
const name = prompt('Controller name');
if (!name) {
return;
}
self.commandRunning = true;
await request('zwave.set_controller_name', {name: name});
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Receive Configuration From Primary',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.receive_configuration');
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Create New Primary',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.create_new_primary');
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Transfer Primary Role',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.transfer_primary_role');
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Heal Network',
disabled: this.commandRunning,
click: async function() {
self.commandRunning = true;
await request('zwave.heal');
self.commandRunning = false;
self.refresh();
},
},
{
text: 'Soft Reset',
disabled: this.commandRunning,
click: async function() {
if (!confirm('Are you sure that you want to do a device soft reset? Network information will not be lost')) {
return;
}
await request('zwave.soft_reset');
},
},
{
text: 'Hard Reset',
disabled: this.commandRunning,
click: async function() {
if (!confirm('Are you sure that you want to do a device soft reset? ALL network information will be lost!')) {
return;
}
await request('zwave.hard_reset');
},
},
]
},
},
methods: {
refreshNodes: async function () {
this.loading.nodes = true;
this.nodes = await request('zwave.get_nodes');
if (Object.keys(this.nodes).length) {
Vue.set(this.views, 'values', true);
}
},
refreshGroups: async function () {
this.loading.groups = true;
this.groups = Object.values(await request('zwave.get_groups'))
.filter((group) => group.index)
.reduce((groups, group) => {
groups[group.index] = group;
return groups;
}, {});
if (Object.keys(this.groups).length) {
Vue.set(this.views, 'groups', true);
}
this.loading.groups = false;
},
refreshScenes: async function () {
this.loading.scenes = true;
this.scenes = Object.values(await request('zwave.get_scenes'))
.filter((scene) => scene.scene_id)
.reduce((scenes, scene) => {
scenes[scene.scene_id] = scene;
return scenes;
}, {});
this.loading.scenes = false;
},
refreshValues: async function(type) {
Vue.set(this.values, type, Object.values(await request('zwave.get_' + type))
.filter((item) => item.id_on_network)
.reduce((values, value) => {
values[value.id_on_network] = true;
return values;
}, {}));
if (Object.keys(this.values[type]).length) {
Vue.set(this.views, type, true);
}
},
refreshStatus: async function() {
this.loading.status = true;
this.status = await request('zwave.status');
this.loading.status = false;
},
refresh: function () {
this.views = {
nodes: true,
scenes: true,
};
this.refreshNodes();
this.refreshGroups();
this.refreshScenes();
this.refreshValues('switches');
this.refreshValues('dimmers');
this.refreshValues('sensors');
this.refreshValues('bulbs');
this.refreshValues('doorlocks');
this.refreshValues('usercodes');
this.refreshValues('thermostats');
this.refreshValues('protections');
this.refreshValues('battery_levels');
this.refreshValues('power_levels');
this.refreshValues('node_config');
this.refreshStatus();
},
onNodeUpdate: function(event) {
Vue.set(this.nodes, event.node.node_id, event.node);
},
onViewChange: function(event) {
Vue.set(this.selected, 'view', event.target.value);
},
onNodeClicked: function(event) {
Vue.set(this.selected, 'nodeId', event.nodeId === this.selected.nodeId ? undefined : event.nodeId);
},
onGroupClicked: function(event) {
Vue.set(this.selected, 'groupId', event.groupId === this.selected.groupId ? undefined : event.groupId);
},
onNetworkInfoModalOpen: function() {
this.refreshStatus();
this.modal.networkInfo.visible = true;
},
onCommandEvent: function(event) {
if (event.error && event.error.length) {
createNotification({
text: event.state_description + ': ' + event.error_description,
error: true,
});
}
},
openNetworkCommandsDropdown: function() {
openDropdown(this.$refs.networkCommandsDropdown);
},
addNode: async function() {
this.commandRunning = true;
await request('zwave.add_node');
this.commandRunning = false;
},
addToGroup: async function(nodeId, groupId) {
this.commandRunning = true;
await request('zwave.add_node_to_group', {
node_id: nodeId,
group_index: groupId,
});
this.commandRunning = false;
this.refreshGroups();
},
removeNode: async function() {
this.commandRunning = true;
await request('zwave.remove_node');
this.commandRunning = false;
},
},
created: function() {
const self = this;
this.bus.$on('refresh', this.refresh);
this.bus.$on('refreshNodes', this.refreshNodes);
this.bus.$on('nodeClicked', this.onNodeClicked);
this.bus.$on('groupClicked', this.onGroupClicked);
this.bus.$on('openAddToGroupModal', () => {self.modal.group.visible = true});
registerEventHandler(this.refreshGroups, 'platypush.message.event.zwave.ZwaveNodeGroupEvent');
registerEventHandler(this.refreshScenes, 'platypush.message.event.zwave.ZwaveNodeSceneEvent');
registerEventHandler(this.refreshNodes, 'platypush.message.event.zwave.ZwaveNodeRemovedEvent');
registerEventHandler(this.onCommandEvent, 'platypush.message.event.zwave.ZwaveCommandEvent');
registerEventHandler(this.refreshStatus,
'platypush.message.event.zwave.ZwaveNetworkReadyEvent',
'platypush.message.event.zwave.ZwaveNetworkStoppedEvent',
'platypush.message.event.zwave.ZwaveNetworkErrorEvent',
'platypush.message.event.zwave.ZwaveNetworkResetEvent');
registerEventHandler(this.onNodeUpdate,
'platypush.message.event.zwave.ZwaveNodeEvent',
'platypush.message.event.zwave.ZwaveNodeAddedEvent',
'platypush.message.event.zwave.ZwaveNodeRenamedEvent',
'platypush.message.event.zwave.ZwaveNodeReadyEvent',
'platypush.message.event.zwave.ZwaveValueAddedEvent',
'platypush.message.event.zwave.ZwaveValueChangedEvent',
'platypush.message.event.zwave.ZwaveValueRemovedEvent',
'platypush.message.event.zwave.ZwaveValueRefreshedEvent');
},
mounted: function() {
this.refresh();
},
});