//clear priority and other tasks if people reload the page or lost connection while a wizard was active $(window.hyperion).one("ready", function(event) { if(getStorage("wizardactive") === 'true') { requestPriorityClear(); setStorage("wizardactive", false); if(getStorage("kodiAddress") != null) { kodiAddress = getStorage("kodiAddress"); sendToKodi("stop"); } } }); function resetWizard(reload) { $("#wizard_modal").modal('hide'); clearInterval(wIntveralId); requestPriorityClear(); setStorage("wizardactive", false); $('#wizp1').toggle(true); $('#wizp2').toggle(false); $('#wizp3').toggle(false); //cc if(withKodi) sendToKodi("stop"); step = 0; if(!reload) location.reload(); } //rgb byte order wizard var wIntveralId; var new_rgb_order; function changeColor() { var color = $("#wiz_canv_color").css('background-color'); if (color == 'rgb(255, 0, 0)') { $("#wiz_canv_color").css('background-color','rgb(0, 255, 0)'); requestSetColor('0','255','0'); } else { $("#wiz_canv_color").css('background-color','rgb(255, 0, 0)'); requestSetColor('255','0','0'); } } function startWizardRGB() { //create html $('#wiz_header').html(''+$.i18n('wiz_rgb_title')); $('#wizp1_body').html('

'+$.i18n('wiz_rgb_title')+'

'+$.i18n('wiz_rgb_intro1')+'

'+$.i18n('wiz_rgb_intro2')+'

'); $('#wizp1_footer').html(''); $('#wizp2_body').html('

'+$.i18n('wiz_rgb_expl')+'

'); $('#wizp2_body').append('
'+$.i18n('edt_append_s')+'
'); $('#wizp2_body').append(''); $('#wizp2_body').append('
'); $('#wizp2_footer').html(''); //open modal $("#wizard_modal").modal({ backdrop : "static", keyboard: false, show: true }); //listen for continue $('#btn_wiz_cont').off().on('click',function() { beginWizardRGB(); $('#wizp1').toggle(false); $('#wizp2').toggle(true); }); } function beginWizardRGB() { $("#wiz_switchtime_select").off().on('change',function() { clearInterval(wIntveralId); var time = $("#wiz_switchtime_select").val(); wIntveralId = setInterval(function() { changeColor(); }, time*1000); }); $('.wselect').change(function () { var rgb_order = window.serverConfig.device.colorOrder.split(""); var redS = $("#wiz_r_select").val(); var greenS = $("#wiz_g_select").val(); var blueS = rgb_order.toString().replace(/,/g,"").replace(redS, "").replace(greenS,""); for (var i = 0; i'; if(withKodi) { sendToKodi('playP',"HGradient"); h +=''; } else h += '

'+$.i18n('wiz_cc_lettvshowm', "gey_1, grey_2, grey_3, HGradient, VGradient")+'

'; $('#wiz_cc_desc').html(h); $('#wiz_cc_btn_sp').off().on('click', function(){ switchPicture(["VGradient","grey_1","grey_2","grey_3","HGradient"]); }); } if(step == 4) { updateWEditor(["red"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_red_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_red_title')); sendToKodi('playP',"red"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_red_title')); $('#wiz_cc_desc').html(h); } if(step == 5) { updateWEditor(["green"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_green_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_green_title')); sendToKodi('playP',"green"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_green_title')); $('#wiz_cc_desc').html(h); } if(step == 6) { updateWEditor(["blue"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_blue_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_blue_title')); sendToKodi('playP',"blue"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_blue_title')); $('#wiz_cc_desc').html(h); } if(step == 7) { updateWEditor(["cyan"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_cyan_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_cyan_title')); sendToKodi('playP',"cyan"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_cyan_title')); $('#wiz_cc_desc').html(h); } if(step == 8) { updateWEditor(["magenta"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_magenta_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_magenta_title')); sendToKodi('playP',"magenta"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_magenta_title')); $('#wiz_cc_desc').html(h); } if(step == 9) { updateWEditor(["yellow"]); h = $.i18n('wiz_cc_adjustit',$.i18n('edt_conf_color_yellow_title')); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_yellow_title')); sendToKodi('playP',"yellow"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_yellow_title')); $('#wiz_cc_desc').html(h); } if(step == 10) { updateWEditor(["backlightThreshold","backlightColored"]); h = $.i18n('wiz_cc_backlight'); if(withKodi) { h += '
'+$.i18n('wiz_cc_kodishould',$.i18n('edt_conf_color_black_title')); sendToKodi('playP',"black"); } else h += '
'+$.i18n('wiz_cc_lettvshow',$.i18n('edt_conf_color_black_title')); $('#wiz_cc_desc').html(h); } if(step == 11) { updateWEditor([""], true); h = '

'+$.i18n('wiz_cc_testintro')+'

'; if(withKodi) { h += '

'+$.i18n('wiz_cc_testintrok')+'

'; sendToKodi('stop'); for(var i = 0; i '+txt+''; } h +='
'; } else h += '

'+$.i18n('wiz_cc_testintrowok')+' '+$.i18n('wiz_cc_link')+'

'; h += '

'+$.i18n('wiz_cc_summary')+'

'; $('#wiz_cc_desc').html(h); $('.videobtn').off().on('click', function(e){ if(e.target.id == "stop") sendToKodi("stop"); else sendToKodi("playV",e.target.id+'.mp4'); $(this).attr("disabled", true); setTimeout(function(){$('.videobtn').attr("disabled", false)},10000); }); $('#btn_wiz_next').attr("disabled", true); $('#btn_wiz_save').toggle(true); } else { $('#btn_wiz_next').attr("disabled", false); $('#btn_wiz_save').toggle(false); } } function updateWEditor(el, all) { for (var key in cobj) { if(all === true || el[0] == key || el[1] == key || el[2] == key) $('#editor_container_wiz [data-schemapath*=".'+profile+'.'+key+'"]').toggle(true); else $('#editor_container_wiz [data-schemapath*=".'+profile+'.'+key+'"]').toggle(false); } } function startWizardCC() { //create html $('#wiz_header').html(''+$.i18n('wiz_cc_title')); $('#wizp1_body').html('

'+$.i18n('wiz_cc_title')+'

'+$.i18n('wiz_cc_intro1')+'

'); $('#wizp1_footer').html(''); $('#wizp2_body').html('
'); $('#wizp2_footer').html(''); //open modal $("#wizard_modal").modal({ backdrop : "static", keyboard: false, show: true }); $('#wiz_cc_kodiip').off().on('change',function() { kodiAddress = $(this).val(); setStorage("kodiAddress", kodiAddress); sendToKodi("msg", $.i18n('wiz_cc_kodimsg_start'), function(cb){ if(cb == "error") { $('#kodi_status').html('

'+$.i18n('wiz_cc_kodidiscon')+'

'+$.i18n('wiz_cc_kodidisconlink')+' '+$.i18n('wiz_cc_link')+'

'); withKodi = false; } else { $('#kodi_status').html('

'+$.i18n('wiz_cc_kodicon')+'

'); withKodi = true; } $('#btn_wiz_cont').attr('disabled', false); }); }); //listen for continue $('#btn_wiz_cont').off().on('click',function() { beginWizardCC(); $('#wizp1').toggle(false); $('#wizp2').toggle(true); }); $('#wiz_cc_kodiip').trigger("change"); colorLength = window.serverConfig.color.channelAdjustment; cobj = window.schema.color.properties.channelAdjustment.items.properties; websAddress = document.location.hostname+':'+window.serverConfig.webConfig.port; imgAddress = 'http://'+websAddress+'/img/cc/'; setStorage("wizardactive", true); //check profile count if(colorLength.length > 1) { $('#multi_cali').html('

'+$.i18n('wiz_cc_morethanone')+'

'); for(var i = 0; i'+$.i18n(hue_title)); $('#wizp1_body').html('

'+$.i18n(hue_title)+'

'+$.i18n(hue_intro1)+'

'); $('#wizp1_footer').html(''); $('#wizp2_body').html('
'); $('#wh_topcontainer').append('

'+$.i18n(hue_desc1)+'

'); $('#wh_topcontainer').append(); $('#wh_topcontainer').append(''); if(hueType == 'philipshue') { $('#usrcont').append('
'); } if(hueType == 'philipshueentertainment') { $('#usrcont').append('
'); } $('#usrcont').append('
'); if(hueType == 'philipshueentertainment') { $('#wizp2_body').append(''); createTable("gidsh", "gidsb", "hue_grp_ids_t"); $('.gidsh').append(createTableRow([$.i18n('edt_dev_spec_groupId_title'),$.i18n('wiz_hue_e_use_group')], true)); $('#wizp2_body').append(''); } else { $('#wizp2_body').append(''); } createTable("lidsh", "lidsb", "hue_ids_t"); $('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lightid_title'),$.i18n('wiz_pos'),$.i18n('wiz_identify')], true)); $('#wizp2_footer').html(''); $('#wizp3_body').html(''+$.i18n('wiz_hue_press_link')+'


'); //open modal $("#wizard_modal").modal({ backdrop : "static", keyboard: false, show: true }); //listen for continue $('#btn_wiz_cont').off().on('click',function() { beginWizardHue(); $('#wizp1').toggle(false); $('#wizp2').toggle(true); }); } function checkHueBridge(cb,hueUser) { var usr = (typeof hueUser != "undefined") ? hueUser : 'config'; if(usr == 'config') $('#wiz_hue_discovered').html(""); $.ajax({ url: 'http://'+hueIPs[hueIPsinc].internalipaddress+'/api/'+usr, type: "GET", dataType: "json", success: function( json ) { if (json.config) { cb(true, usr); } else if( json.name && json.bridgeid && json.modelid) { $('#wiz_hue_discovered').html("Bridge: " + json.name + ", Modelid: " + json.modelid + ", API-Version: " + json.apiversion); cb(true); } else { cb(false); } }, timeout: 2500 }).fail(function() { cb(false); }); } function checkBridgeResult(reply, usr){ if(reply) { //abort checking, first reachable result is used $('#wiz_hue_ipstate').html(""); $('#ip').val(hueIPs[hueIPsinc].internalipaddress) //now check hue user on this bridge $('#usrcont').toggle(true); checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); } else { //increment and check again if(hueIPs.length-1 > hueIPsinc) { hueIPsinc++; checkHueBridge(checkBridgeResult); } else { $('#usrcont').toggle(false); $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); } } }; function checkUserResult(reply, usr) { if(reply) { $('#user').val(usr); if(hueType == 'philipshueentertainment' && $('#clientkey').val() == "") { $('#usrcont').toggle(true); $('#wiz_hue_usrstate').html($.i18n('wiz_hue_e_clientkey_needed')); $('#wiz_hue_create_user').toggle(true); } else { $('#wiz_hue_usrstate').html(""); $('#wiz_hue_create_user').toggle(false); if(hueType == 'philipshue') { get_hue_lights(); } if(hueType == 'philipshueentertainment') { get_hue_groups(); } } } else { $('#wiz_hue_usrstate').html($.i18n('wiz_hue_failure_user')); $('#wiz_hue_create_user').toggle(true); } }; function identHueId(id, off, oState) { if(off !== true) { setTimeout(identHueId,1500,id,true,oState); var put_data = '{"on":true,"bri":254,"hue":47000,"sat":254}'; } else { var put_data = '{"on":'+oState.on+',"bri":' + oState.bri +',"hue":' + oState.hue +',"sat":' + oState.sat +'}'; } $.ajax({ url: 'http://'+$('#ip').val()+'/api/'+$('#user').val()+'/lights/'+id+'/state', type: 'PUT', timeout: 2000, data: put_data }) } function useGroupId(id) { $('#groupId').val(id); groupLights = groupIDs[id].lights; groupLightsLocations = groupIDs[id].locations; get_hue_lights(); } async function discover_hue_bridges(){ const res = await requestLedDeviceDiscovery ('philipshue'); // TODO: error case unhandled // res can be: false (timeout) or res.error (not found) if(res && !res.error){ const r = res.info // Process devices returned by discovery console.log(r); if(r.devices.length == 0) $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); else { for(const device of r.devices) { console.log("Device:", device); var ip = device.hostname + ":" + device.port; console.log("Host:", ip); hueIPs.push({internalipaddress : ip}); } var usr = $('#user').val(); if(usr != "") { checkHueBridge(checkUserResult, usr); } else { checkHueBridge(checkBridgeResult); } } } } async function getProperties_hue_bridge(hostAddress, username, resourceFilter){ let params = { host: hostAddress, user: username, filter: resourceFilter}; const res = await requestLedDeviceProperties ('philipshue', params); // TODO: error case unhandled // res can be: false (timeout) or res.error (not found) if(res && !res.error){ const r = res.info // Process properties returned console.log(r); } } function identify_hue_device(hostAddress, username, id){ console.log("identify_hue_device"); let params = { host: hostAddress, user: username, lightId: id }; const res = requestLedDeviceIdentification ("philipshue", params); // TODO: error case unhandled // res can be: false (timeout) or res.error (not found) if(res && !res.error){ const r = res.info console.log(r); } } function getHueIPs(){ $('#wiz_hue_ipstate').html($.i18n('wiz_hue_searchb')); $.ajax({ url: 'https://discovery.meethue.com', crossDomain: true, type: 'GET', timeout: 3000 }) .done( function( data, textStatus, jqXHR ) { if(data.length == 0) { $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); } else { hueIPs = data; checkHueBridge(checkBridgeResult); } }) .fail( function( jqXHR, textStatus ) { $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); }); }; //return editor Value function eV(vn) { return (vn) ? conf_editor.getEditor("root.specificOptions." + vn).getValue() : ""; } function beginWizardHue() { var usr = eV("username"); if(usr != "") { $('#user').val(usr); } if(hueType == 'philipshueentertainment') { var clkey = eV("clientkey"); if(clkey != "") { $('#clientkey').val(clkey); } } //check if ip is empty/reachable/search for bridge if(eV("output") == "") { //getHueIPs(); discover_hue_bridges(); } else { var ip = eV("output"); $('#ip').val(ip); hueIPs.unshift({internalipaddress : ip}); if(usr != "") { checkHueBridge(checkUserResult, usr); }else{ checkHueBridge(checkBridgeResult); } } $('#retry_bridge').off().on('click', function(){ if($('#ip').val()!="") { hueIPs.unshift({internalipaddress : $('#ip').val()}) hueIPsinc = 0; } else discover_hue_bridges(); var usr = $('#user').val(); if(usr != "") { checkHueBridge(checkUserResult, usr); }else{ checkHueBridge(checkBridgeResult); } }); $('#retry_usr').off().on('click', function(){ checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); }); $('#wiz_hue_create_user').off().on('click',function() { if($('#ip').val()!="") hueIPs.unshift({internalipaddress : $('#ip').val()}); createHueUser(); }); $('#btn_wiz_save').off().on("click", function(){ var hueLedConfig = []; var finalLightIds = []; //create hue led config for(var key in lightIDs) { if(hueType == 'philipshueentertainment') { if(groupLights.indexOf(key) == -1) continue; } if($('#hue_'+key).val() != "disabled") { finalLightIds.push(key); var idx_content = assignLightPos(key, $('#hue_'+key).val(), lightIDs[key].name); hueLedConfig.push(JSON.parse(JSON.stringify(idx_content))); } } var sc = window.serverConfig; sc.leds = hueLedConfig; //Adjust gamma, brightness and compensation var c = sc.color.channelAdjustment[0]; c.gammaBlue = 1.0; c.gammaRed = 1.0; c.gammaGreen = 1.0; c.brightness = 100; c.brightnessCompensation = 0; //device config //Start with a clean configuration var d = {}; d.output = $('#ip').val(); d.username = $('#user').val(); d.type = 'philipshue'; d.colorOrder = 'rgb'; d.lightIds = finalLightIds; d.latchTime = 0; d.transitiontime = parseInt(eV("transitiontime") ); d.restoreOriginalState = (eV("restoreOriginalState") == true); d.switchOffOnBlack = (eV("switchOffOnBlack") == true); d.brightnessFactor = parseFloat(eV("brightnessFactor")); d.clientkey = $('#clientkey').val(); d.groupId = parseInt($('#groupId').val()); d.blackLightsTimeout = parseInt(eV("blackLightsTimeout")); d.brightnessMin = parseFloat(eV("brightnessMin")); d.brightnessMax = parseFloat(eV("brightnessMax")); d.brightnessThreshold = parseFloat(eV("brightnessThreshold")); d.sslReadTimeout = parseInt(eV("sslReadTimeout")); d.sslHSTimeoutMin = parseInt(eV("sslHSTimeoutMin")); d.sslHSTimeoutMax = parseInt(eV("sslHSTimeoutMax")); d.verbose = (eV("verbose") == true); d.debugStreamer = (eV("debugStreamer") == true); d.debugLevel = (eV("debugLevel")); if(hueType == 'philipshue') { d.useEntertainmentAPI = false; d.hardwareLedCount = finalLightIds.length; d.rewriteTime = 0; d.verbose = false; //smoothing off sc.smoothing.enable = false; } if(hueType == 'philipshueentertainment') { d.useEntertainmentAPI = true; d.hardwareLedCount = groupLights.length; d.rewriteTime = 20; //smoothing on sc.smoothing.enable = true; } window.serverConfig.device = d; requestWriteConfig(sc, true); resetWizard(); }); $('#btn_wiz_abort').off().on('click', resetWizard); } function createHueUser() { var connectionRetries = 30; var data = {"devicetype":"hyperion#"+Date.now()} if(hueType == 'philipshueentertainment') { data = {"devicetype":"hyperion#"+Date.now(), "generateclientkey":true} } var UserInterval = setInterval(function(){ $.ajax({ type: "POST", url: 'http://'+$("#ip").val()+'/api', processData: false, timeout: 1000, contentType: 'application/json', data: JSON.stringify(data), success: function(r) { $('#wizp1').toggle(false); $('#wizp2').toggle(false); $('#wizp3').toggle(true); connectionRetries--; $("#connectionTime").html(connectionRetries); if(connectionRetries == 0) { abortConnection(UserInterval); } else { if (typeof r[0].error != 'undefined') { console.log(connectionRetries+": link not pressed"); } if (typeof r[0].success != 'undefined') { $('#wizp1').toggle(false); $('#wizp2').toggle(true); $('#wizp3').toggle(false); if(r[0].success.username != 'undefined') { $('#user').val(r[0].success.username); conf_editor.getEditor("root.specificOptions.username").setValue( r[0].success.username ); } if(hueType == 'philipshueentertainment') { if(r[0].success.clientkey != 'undefined') { $('#clientkey').val(r[0].success.clientkey); conf_editor.getEditor("root.specificOptions.clientkey").setValue( r[0].success.clientkey ); } } checkHueBridge(checkUserResult,r[0].success.username); clearInterval(UserInterval); } } }, error: function(XMLHttpRequest, textStatus, errorThrown) { $('#wizp1').toggle(false); $('#wizp2').toggle(true); $('#wizp3').toggle(false); clearInterval(UserInterval); } }); },1000); } function get_hue_groups(){ $.ajax({ type: "GET", url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/groups', processData: false, contentType: 'application/json', success: function(r) { if(Object.keys(r).length > 0) { $('#wh_topcontainer').toggle(false); $('#hue_grp_ids_t').toggle(true); groupIDs = r; var gC = 0; for(var groupid in r) { if(r[groupid].type=='Entertainment') { $('.gidsb').append(createTableRow([groupid+' ('+r[groupid].name+')', ''])); gC++; } } if(gC == 0) { noAPISupport('wiz_hue_e_noegrpids'); } } else { noAPISupport('wiz_hue_e_nogrpids'); } } }); } function noAPISupport(txt) { showNotification('danger', $.i18n('wiz_hue_e_title'), $.i18n('wiz_hue_e_noapisupport_hint')); conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").setValue( false ); $("#root_specificOptions_useEntertainmentAPI").trigger("change"); $('#btn_wiz_holder').append('
'+$.i18n('wiz_hue_e_noapisupport_hint')+'
'); $('#hue_grp_ids_t').toggle(false); var txt = (txt) ? $.i18n(txt) : $.i18n('wiz_hue_e_nogrpids'); $('

'+txt+'
'+$.i18n('wiz_hue_e_noapisupport')+'

').insertBefore('#wizp2_body #hue_ids_t'); $('#hue_id_headline').html($.i18n('wiz_hue_desc2')); hueType = 'philipshue'; get_hue_lights(); } function get_light_state(id){ $.ajax({ type: "GET", url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/lights/'+id, processData: false, contentType: 'application/json', success: function(r) { if(Object.keys(r).length > 0) { identHueId(id, false, r['state']); } } }); } function get_hue_lights(){ $.ajax({ type: "GET", url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/lights', processData: false, contentType: 'application/json', success: function(r) { if(Object.keys(r).length > 0) { if(hueType == 'philipshue') { $('#wh_topcontainer').toggle(false); } $('#hue_ids_t, #btn_wiz_save').toggle(true); lightIDs = r; var lightOptions = [ "top", "topleft", "topright", "bottom", "bottomleft", "bottomright", "left", "lefttop", "leftmiddle", "leftbottom", "right", "righttop", "rightmiddle", "rightbottom", "entire" ]; if(hueType == 'philipshue') { lightOptions.unshift("disabled"); } $('.lidsb').html(""); var pos = ""; for(var lightid in r) { if(hueType == 'philipshueentertainment') { if(groupLights.indexOf(lightid) == -1) continue; if(groupLightsLocations.hasOwnProperty(lightid)) { lightLocation = groupLightsLocations[lightid]; var x = lightLocation[0]; var y = lightLocation[1]; var z = lightLocation[2]; var xval = (x < 0) ? "left" : "right"; if(z != 1 && x >= -0.25 && x <= 0.25 ) xval = ""; switch (z) { case 1: // top / Ceiling height pos = "top" + xval; break; case 0: // middle / TV height pos = (xval == "" && y >= 0.75) ? "bottom" : xval + "middle"; break; case -1: // bottom / Ground height pos = xval + "bottom"; break; } } } var options = ""; for(var opt in lightOptions) { var val = lightOptions[opt]; var txt = (val != 'entire' && val != 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_'; options+= '