UNPKG

iobroker.vis

Version:

Graphical user interface for iobroker.

370 lines (351 loc) 14.9 kB
/** * ioBroker.vis * https://github.com/ioBroker/ioBroker.vis * * Copyright (c) 2013-2018 bluefox https://github.com/GermanBluefox, hobbyquaker https://github.com/hobbyquaker, * Creative Common Attribution-NonCommercial (CC BY-NC) * * http://creativecommons.org/licenses/by-nc/4.0/ * * Short content: * Licensees may copy, distribute, display and perform the work and make derivative works based on it only if they give the author or licensor the credits in the manner specified by these. * Licensees may copy, distribute, display, and perform the work and make derivative works based on it only for noncommercial purposes. * (Free for non-commercial use). */ // visEdit - the ioBroker.vis Editor Wizard 'use strict'; // Add words for bars jQuery.extend(systemDictionary, { "All except Low battery": {"en" : "All except 'Battery Indicator'", "de": "Alle außer 'Battery Indicator'", "ru": "Все, кроме 'Battery Indicator'"}, "Place following widget to the room and start wizard again": { "en" : "Place following widget to the room and start wizard again", "de" : "Platziere diesen Widget auf dem View im zugehörigen Raum und starte Wizard neu", "ru" : "Поместите элемент в комнате, где он должен быть и запустите Помошника снова" } }); vis = $.extend(true, vis, { hm2Widget: { 'tplHqButton' : {findImage: false, hssType: ['HM-LC-Sw1-Pl', 'HM-LC-Sw1-FM', 'HM-LC-Sw1-PB-FM', 'HM-LC-Sw2-PB-FM', 'HM-LC-Sw2-FM','HM-ES-PMSw1-Pl','HM-LC-Sw1PBU-FM','HM-LC-Sw1-SM','HM-LC-Sw4-SM']}, 'tplHqLowbat' : {findImage: true, hssType: ['HM-PB-4-WM', 'HM-PB-2-WM', 'HM-PB-4Dis-WM', 'HM-PB-2-WM55','HM-CC-VD',//'HM-SCI-3-FM', 'HM-Sec-WDS','HM-Sec-SD','HM-Sec-TiS', 'HM-RC-4-2', 'HM-RC-Key4-2', 'HM-RC-Sec4-2', 'HM-RC-4', 'HM-RC-4-B', 'HM-RC-Sec3', 'HM-RC-Key3', 'HM-RC-Key3-B', 'HM-RC-12', 'HM-RC-12-B', 'HM-RC-19', 'HM-RC-19-B', 'HM-RC-P1', 'HM-PB-6-WM55', 'HM-Sen-EP', 'HM-SCI-3-FM', 'HM-SwI-3-FM', 'HM-PBI-4-FM', 'HM-LC-Sw4-Ba-PCB', 'HM-WDS30-OT2-SM','HM-Sen-Wa-Od', 'HM-Dis-TD-T'], point: "LOWBAT"}, 'tplHqMotion' : {findImage: false, hssType: ['HM-Sen-MDIR-O', 'HM-Sec-MDIR'], point: 'MOTION'}, 'tplHqIp' : {findImage: false, hssType: ['PING']}, 'tplHqGong' : {findImage: false, hssType: ['HM-OU-CF-PL', 'HM-OU-CFM-Pl']}, 'tplHqOutTemp': {findImage: false, hssType: ['HM-WDC7000','HM-WDS10-TH-O','HM-WDS40-TH-I','HM-WDS100-C6-O','HM-WDS30-T-O']}, 'tplHqInTemp' : {findImage: false, hssType: ['HM-CC-TC','HM-CC-RT-DN'], aux: [{hssType: ['HM-CC-VD'], attr:'hm_idV'}], useDevice: true}, 'tplHqShutter': {findImage: false, hssType: ['HM-LC-Bl1-SM','HMW-LC-Bl1-DR','HM-LC-Bl1-FM','HM-LC-Bl1-PB-FM','HM-LC-Bl1PBU-FM'], aux : [{hssType: ['HM-Sec-RHS'], attr:'hm_id_hnd0'}, {hssType: ['HM-Sec-SC','CC-SC-Rd-WM-W-R5','FHT80TF-2'], attr:'hm_id0'}]}, 'tplHqDimmer' : {findImage: false, hssType: ['HM-LC-Dim1TPBU-FM','HM-LC-Dim1PWM-CV','HM-LC-Dim1T-FM','HM-LC-Dim1T-CV','HM-LC-Dim1T-PI','HM-LC-Dim1L-CV','HM-LC-Dim1L-Pl','HM-LC-Dim2L-SM','HMW-LC-Dim1L-DR']}, 'tplHqLock' : {findImage: false, hssType: ['HM-Sec-Key-S']} }, hmDeviceToWidget: function (device) { for (var w in vis.hm2Widget) { for (var j = 0; j < vis.hm2Widget[w].hssType.length; j++) { if (vis.hm2Widget[w].hssType[j] == device) { return w; } } } return null; }, wizardGetFunction : function (channel) { var hm_id = channel; var func = null; while (hm_id && localData.metaObjects[hm_id]) { for (var t = 0; t < localData.metaIndex["ENUM_FUNCTIONS"].length; t++) { var list = localData.metaObjects[localData.metaIndex["ENUM_FUNCTIONS"][t]]; for (var z = 0; z < list['Channels'].length; z++) { if (list['Channels'][z] == hm_id) { func = localData.metaIndex["ENUM_FUNCTIONS"][t];//list.Name; break; } } if (func) break; } if (func) break; hm_id = localData.metaObjects[hm_id]['Parent']; } return func; }, // Try to find point for wirget wizardGetPoint: function (widgetName, channel) { if (vis.hm2Widget[widgetName].point) { for (var p in localData.metaObjects[channel]["DPs"]) { if (p == vis.hm2Widget[widgetName].point) { return localData.metaObjects[channel]["DPs"][p]; } } var parent = localData.metaObjects[channel]["Parent"]; if (localData.metaObjects[parent]["Channels"]) { for (var i = 0; i < localData.metaObjects[parent]["Channels"].length; i++) { var chn = localData.metaObjects[localData.metaObjects[parent]["Channels"][i]]; if (channel == localData.metaObjects[parent]["Channels"][i]) { continue; } for (var p in chn["DPs"]) { if (p == vis.hm2Widget[widgetName].point) { return chn["DPs"][p]; } } } } } else if (vis.hm2Widget[widgetName].useDevice) { while (localData.metaObjects[channel]["Parent"]) { channel = localData.metaObjects[channel]["Parent"]; } } return channel; }, findUniqueDeviceInRoom: function (devNames, roomID) { var idFound = null; // Find all HM Devices belongs to this room var elems = localData.metaObjects[roomID]["Channels"]; for (var i = 0; i < elems.length; i++) { var devID = localData.metaObjects[elems[i]]["Parent"]; for(var j = 0;j < devNames.length; j++) { if (localData.metaObjects[devID]["HssType"] == devNames[j]) { if (idFound) { return null; } idFound = elems[i]; break; } } } return idFound; }, wizardCreateWidget: function (view, roomID, func, widgetName, devID, channel, point, pos) { var field = null; if (pos) { field = {x: pos.left, y: pos.top, width: 500}; } // Find empty position for new widget var style = vis.findFreePosition (view, null, field, hqWidgets.gOptions.gBtWidth, hqWidgets.gOptions.gBtHeight); // Find function of the widget for filter key func = func || vis.wizardGetFunction (channel); // get device description var title = hmSelect._convertName(localData.metaObjects[channel].Name); // Remove ROOM from device name if (title.length > localData.metaObjects[roomID]["Name"].length && title.substring(0, localData.metaObjects[roomID]["Name"].length) == localData.metaObjects[roomID]["Name"]) title = title.substring(localData.metaObjects[roomID]["Name"].length); // Remove the leading dot if (title.length > 0 && title[0] == '.') title = title.substring(1); // Get default settings var hqoptions = vis.binds.hqWidgetsExt.hqEditDefault(widgetName); hqoptions = $.extend(hqoptions, {"x": style.left,"y": style.top, "title": title, "hm_id": point, "room": localData.metaObjects[roomID]["Name"]}); // Set image of widget if (vis.hm2Widget[widgetName].findImage) { hqoptions['iconName'] = hmSelect._getImage(localData.metaObjects[devID].HssType); } if (vis.hm2Widget[widgetName].aux) { for (var t = 0; t < vis.hm2Widget[widgetName].aux.length; t++) { // Try to find if only one device are in the room var hmId = vis.findUniqueDeviceInRoom (vis.hm2Widget[widgetName].aux[t].hssType, roomID); if (hmId) { hqoptions[vis.hm2Widget[widgetName].aux[t].attr] = hmId; } } } //var data = {"filterkey":func, "hqoptions": hqoptions}; TODO hqoptions stringify var data = {"filterkey":func, "hqoptions": JSON.stringify (hqoptions)}; var wid = vis.addWidget (widgetName, data, style, null, view); $("#select_active_widget").append("<option value='"+wid+"'>"+wid+" ("+$("#"+vis.views[view].widgets[wid].tpl).attr("data-dashui-name")+")</option>"); $("#select_active_widget").multiselect("refresh"); return wid; }, wizardIsWidgetExists: function (view, widgetName) { for (var w in vis.views[view].widgets) { if (vis.views[view].widgets[w].tpl == widgetName) { return true; } } return false; }, // Create Date, time, history and may be weather wizardRunGeneral: function (view) { var data = { hm_id: 'nothing_selected', digits: "", factor: 1, min: 0.00, max: 1.00, step: 0.01 }; if (!vis.wizardIsWidgetExists (view, "tplTwSimpleClock")) { var wid = vis.addWidget ("tplTwSimpleClock", {"hideSeconds": "true"}); $("#select_active_widget").append("<option value='"+wid+"'>"+wid+" ("+$("#"+vis.views[view].widgets[wid].tpl).attr("data-dashui-name")+")</option>"); $("#select_active_widget").multiselect("refresh"); } if (!vis.wizardIsWidgetExists (view, "tplTwSimpleDate")) { var wid = vis.addWidget ("tplTwSimpleDate", {"showWeekDay": "true"}); $("#select_active_widget").append("<option value='"+wid+"'>"+wid+" ("+$("#"+vis.views[view].widgets[wid].tpl).attr("data-dashui-name")+")</option>"); $("#select_active_widget").multiselect("refresh"); } if (!vis.wizardIsWidgetExists (view, "tplTwYahooWeather")) { var wid = vis.addWidget ("tplTwYahooWeather", data, {"width": 205, "height": 229}); $("#select_active_widget").append("<option value='"+wid+"'>"+wid+" ("+$("#"+vis.views[view].widgets[wid].tpl).attr("data-dashui-name")+")</option>"); $("#select_active_widget").multiselect("refresh"); } if (!vis.wizardIsWidgetExists (view, "tplHqEventlist")) { var wid = vis.addWidget ("tplHqEventlist", data); $("#select_active_widget").append("<option value='"+wid+"'>"+wid+" ("+$("#"+vis.views[view].widgets[wid].tpl).attr("data-dashui-name")+")</option>"); $("#select_active_widget").multiselect("refresh"); } }, wizardRunOneRoom: function (view, roomID, funcs, widgets) { // Find first created element belongs to this room var pos = null; var idCreated = null; for (var w in vis.views[view].widgets) { var wObj = vis.views[view].widgets[w]; if (wObj.data.hqoptions && wObj.data.hqoptions.indexOf ('"room":"' + localData.metaObjects[roomID]["Name"] + '"') != -1) { // wObj.data.hqoptions.room == localData.metaObjects[roomID]["Name"]) { TODO hqoptions stringify if (pos == null) { pos = {left: wObj.style.left, top: wObj.style.top}; } else { if (pos.left > wObj.style.left) { pos.left = wObj.style.left; } if (pos.top > wObj.style.top) { pos.top = wObj.style.top; } } break; } } // Find all HM Devices belongs to this room var elems = localData.metaObjects[roomID]["Channels"]; for (var i = 0; i < elems.length; i++) { var devID = localData.metaObjects[elems[i]]["Parent"]; var widgetName = vis.hmDeviceToWidget (localData.metaObjects[devID]["HssType"]); if (widgetName) { // filter out not selected widgets if (widgets) { if (widgets == "_nobat") { if (widgetName == "tplHqLowbat") { continue; } } else if (widgetName != widgets) { continue; } } var isFound = false; var func = null; var hm_id = vis.wizardGetPoint(widgetName, elems[i]); // Check if this widget exists for (var w in vis.views[view].widgets) { if (vis.views[view].widgets[w].data.hqoptions) { var btn = hqWidgets.Get (w); if (btn) { var opt = btn.GetSettings(); if (elems[i] == opt["hm_id"] || opt["hm_id"] == hm_id) { isFound = true; break; } } } } // Check function if (funcs) { func = vis.wizardGetFunction (elems[i]); if (funcs != func) { continue; } } if (!isFound) { if (pos == null && idCreated) { return idCreated; } // Create this widget var widgetId = vis.wizardCreateWidget (view, roomID, localData.metaObjects[func]["Name"], widgetName, devID, elems[i], hm_id, pos); if (pos == null) { idCreated = widgetId; } } } } return null; }, wizardRun: function (view) { var room = $('#wizard_rooms').val(); var widgetIds = []; if (!room) { var elems = localData.metaIndex['ENUM_ROOMS'];// IDs of all ROOMS for (var r in elems) { if (room != '_general') { var wid = vis.wizardRunOneRoom (view, elems[r], $('#wizard_funcs').val(), $('#wizard_widgets').val()); if (wid) { widgetIds[widgetIds.length] = wid; } } else { vis.wizardRunGeneral (view); } } } else { if (room != '_general') { var wid = vis.wizardRunOneRoom (view, room, $('#wizard_funcs').val(), $('#wizard_widgets').val()); if (wid) { widgetIds[widgetIds.length] = wid; } } else { vis.wizardRunGeneral (view); } } if (widgetIds.length) { window.alert(_("Place following widget to the room and start wizard again")); for (var i = 0; i < widgetIds.length; i++) { vis.actionNewWidget (widgetIds[i]); } vis.inspectWidget(widgetIds[widgetIds.length - 1]); } // Save the changes vis.binds.hqWidgetsExt.hqEditSave (); }, fillWizard: function () { var elems = localData.metaIndex['ENUM_ROOMS'];// IDs of all ROOMS var jSelect = $('#wizard_rooms').html("").addClass('dashui-wizard-select'); for (var r in elems) { jSelect.append("<option value='"+elems[r]+"'>"+localData.metaObjects[elems[r]]["Name"]+"</option>\n"); } jSelect.append('<option value="_general">' + _("General")+'</option>'); jSelect.append('<option value="">' + _("All")+'</option>'); elems = localData.metaIndex['ENUM_FUNCTIONS'];// IDs of all ROOMS jSelect = $('#wizard_funcs').html("").addClass('dashui-wizard-select'); jSelect.append('<option value="">' + _("All")+'</option>'); for (var r in elems) { jSelect.append("<option value='"+elems[r]+"'>"+localData.metaObjects[elems[r]]["Name"]+"</option>\n"); } jSelect = $('#wizard_widgets').html("").addClass('dashui-wizard-select'); jSelect.append('<option value="_nobat">'+_("All except Low battery")+'</option>'); jSelect.append('<option value="">'+_("All")+'</option>'); for (var r in vis.hm2Widget) { for (var i = 0; i < vis.widgetSets.length; i++) { var name = vis.widgetSets[i].name || vis.widgetSets[i]; $(".dashui-tpl[data-dashui-set='" + name + "']").each(function () { if (r == $(this).attr("id")) { $('#wizard_widgets').append("<option value='"+$(this).attr("id")+"'>"+$(this).attr("data-dashui-name")+"</option>\n"); } }); } } $( "#wizard_run" ).button ({icons: {primary: "ui-icon-wrench"}}).bind( "click", function() { vis.wizardRun(vis.activeView); }); } });