@keload/node-red-contrib-js-philips-tv-control
Version:
A collection of nodes to control Philips TV with Node-RED, including Ambilight control.
99 lines (88 loc) • 26.5 kB
HTML
<script type="text/html" data-template-name="ambilight"><div class="keload-node-red-contrib-js-philips-tv-control"><div id="keload-node-red-contrib-js-philips-tv-control-ambilight"><div class="dxp-template-form-row"><label for="node-input-tv"><i class="fa fa-tv"></i><span data-i18n="ambilight.tv;[title]ambilight.tv" title="TV">TV</span></label><div class="content force-w-full"><select id="node-input-tv"></select></div></div><div class="dxp-template-form-row"><label for="node-input-name"><i class="fa fa-tag"></i><span data-i18n="ambilight.name;[title]ambilight.name" title="Name">Name</span></label><div class="content"><input type="text" id="node-input-name" data-i18n="[placeholder]ambilight.name-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-action"><i class="fa fa-bolt"></i><span data-i18n="ambilight.action;[title]ambilight.action" title="Action">Action</span></label><div class="content"><select id="node-input-action"></select></div></div><div class="dxp-template-form-row"><label for="node-input-value"><i class="fa fa-cube"></i><span data-i18n="ambilight.value;[title]ambilight.value" title="Value">Value</span></label><div class="content"><select id="node-input-value"></select></div></div><div class="dxp-template-form-row"><label for="node-input-returnInfo"><i class="fa fa-table"></i><span data-i18n="ambilight.returnInfo;[title]ambilight.returnInfo" title="Return info">Return info</span></label><div class="content"><div class="checkbox"><input type="checkbox" id="node-input-returnInfo"><span class="italic">Return ambilight information after operation</span></div></div></div></div></div></script><script type="text/html" data-template-name="info"><div class="keload-node-red-contrib-js-philips-tv-control"><div id="keload-node-red-contrib-js-philips-tv-control-info"><div class="dxp-template-form-row"><label for="node-input-tv"><i class="fa fa-tv"></i><span data-i18n="info.tv;[title]info.tv" title="TV">TV</span></label><div class="content force-w-full"><select id="node-input-tv"></select></div></div><div class="dxp-template-form-row"><label for="node-input-name"><i class="fa fa-tag"></i><span data-i18n="info.name;[title]info.name" title="Name">Name</span></label><div class="content"><input type="text" id="node-input-name" data-i18n="[placeholder]info.name-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-kind"><i class="fa fa-bolt"></i><span data-i18n="info.kind;[title]info.kind" title="Action">Action</span></label><div class="content"><select id="node-input-kind"></select></div></div></div></div></script><script type="text/html" data-template-name="philips-tv-config"><div class="keload-node-red-contrib-js-philips-tv-control"><div id="keload-node-red-contrib-js-philips-tv-control-philips-tv-config"><div class="dxp-template-form-row"><label for="node-config-input-name"><i class="fa fa-tag"></i><span data-i18n="philips-tv-config.name;[title]philips-tv-config.name" title="Name">Name</span></label><div class="content"><input type="text" id="node-config-input-name" data-i18n="[placeholder]philips-tv-config.name-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-config-input-ip"><i class="fa fa-link"></i><span data-i18n="philips-tv-config.ip;[title]philips-tv-config.ip" title="TV IP">TV IP</span></label><div class="content"><input type="text" id="node-config-input-ip" data-i18n="[placeholder]philips-tv-config.ip-placeholder" placeholder="192.168.1.22"></div></div><div class="dxp-template-form-row"><label for="node-config-input-url"><i class="fa fa-link"></i><span data-i18n="philips-tv-config.url;[title]philips-tv-config.url" title="API Url">API Url</span></label><div class="content"><input type="text" id="node-config-input-url" data-i18n="[placeholder]philips-tv-config.url-placeholder" placeholder="" readonly="readonly"><div class="hint"><i class="fa fa-info-circle mr-1"></i> Port<span class="font-bold ml-1">1926</span> and version<span class="font-bold ml-1">6</span> is automatically added to the API Url.</div></div></div><div class="alert alert-info text-center"><p>If you already have credentials, you can fill in the following fields</p><p>Otherwise, you can try to pair the TV below.</p></div><div class="dxp-template-form-row"><label for="node-config-input-digest_user"><i class="fa fa-user"></i><span data-i18n="philips-tv-config.digest_user;[title]philips-tv-config.digest_user" title="Digest User">Digest User</span></label><div class="content"><input type="text" id="node-config-input-digest_user" data-i18n="[placeholder]philips-tv-config.digest_user-placeholder" placeholder="Digest user name"></div></div><div class="dxp-template-form-row"><label for="node-config-input-digest_password"><i class="fa fa-lock"></i><span data-i18n="philips-tv-config.digest_password;[title]philips-tv-config.digest_password" title="Digest Password">Digest Password</span></label><div class="content"><input type="password" id="node-config-input-digest_password" data-i18n="[placeholder]philips-tv-config.digest_password-placeholder" placeholder="Digest password"></div></div><div class="form-row text-center hidden" id="pairing-section"><button class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600" id="trigger-action-start-pairing">Start Pairing</button><div class="hidden" id="pairing-ready"><div class="alert alert-success"><p>Your TV is ready to pair. 🎉</p><p>Please enter the pin code displayed on your TV.</p></div><div><input class="text-center !w-[30%] !mb-3" id="pairing-pin-input" type="text"></div><div class="hidden text-red-800 my-1" id="invalid-pin">Pin must be 4 digits.</div><button class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600" id="trigger-action-complete-pairing">Complete Pairing</button><div class="hidden alert alert-success" id="paring-success">Your TV is successfully paired. 🎉</div></div></div></div></div></script><script type="text/html" data-template-name="send-key"><div class="keload-node-red-contrib-js-philips-tv-control"><div id="keload-node-red-contrib-js-philips-tv-control-send-key"><div class="dxp-template-form-row"><label for="node-input-tv"><i class="fa fa-tv"></i><span data-i18n="send-key.tv;[title]send-key.tv" title="TV">TV</span></label><div class="content force-w-full"><select id="node-input-tv"></select></div></div><div class="dxp-template-form-row"><label for="node-input-name"><i class="fa fa-tag"></i><span data-i18n="send-key.name;[title]send-key.name" title="Name">Name</span></label><div class="content"><input type="text" id="node-input-name" data-i18n="[placeholder]send-key.name-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-key"><i class="fa fa-keyboard-o"></i><span data-i18n="send-key.key;[title]send-key.key" title="Key">Key</span></label><div class="content"><select id="node-input-key"></select></div></div></div></div></script>
<style>.keload-node-red-contrib-js-philips-tv-control{.my-1{margin-bottom:.25rem;margin-top:.25rem}.\!mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.mr-1{margin-right:.25rem}.\!block{display:block}.block{display:block}.\!hidden{display:none}.hidden{display:none}.\!w-\[30\%\]{width:30%}.rounded{border-radius:.25rem}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.text-center{text-align:center}.\!font-bold{font-weight:700}.font-bold{font-weight:700}.italic{font-style:italic}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.alert{border-radius:.5rem;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;padding:1rem}.alert-info{background-color:rgb(239 246 255/var(--tw-bg-opacity,1));color:rgb(30 64 175/var(--tw-text-opacity,1))}.alert-info,.alert-success{--tw-bg-opacity:1;--tw-text-opacity:1}.alert-success{background-color:rgb(240 253 244/var(--tw-bg-opacity,1));color:rgb(22 101 52/var(--tw-text-opacity,1))}div.form-row{select{width:70%}input[type=checkbox]{margin-top:0;width:auto}}.dxp-template-form-row{align-items:flex-start;display:flex;margin-bottom:1rem;label{flex:none;margin-right:1rem;overflow:hidden;padding-bottom:.375rem;padding-top:.375rem;position:relative;text-overflow:ellipsis;white-space:nowrap;width:100px}label{i{margin-right:.25rem}}.content{flex:1 1 0%}.content{.red-ui-typedInput-container,input,select,textarea{width:100%}.red-ui-typedInput-container{border:1px solid var(--red-ui-form-input-border-color);.red-ui-typedInput-type-select{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.red-ui-typedInput-type-select{.red-ui-typedInput-type-label{display:inline}.red-ui-typedInput-icon{margin-left:5px}}.red-ui-typedInput-option-trigger{.red-ui-typedInput-option-label{background-color:transparent;margin-top:.5rem}}}div.checkbox{margin-top:.35rem}div.checkbox{input[type=checkbox]{width:auto}}&.force-w-full{>div{width:100%}}}.hint{font-size:.875rem;line-height:1.25rem;margin-top:.25rem;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hint{&.hint-info{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}&.hint-danger{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}&.hint-success{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}&.hint-warning{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}}}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } /*
! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}}</style>
<script type="application/javascript">(()=>{function w(e){return Object.prototype.toString.call(e).slice(8,-1)}function E(e){if(w(e)!=="Object")return!1;let t=Object.getPrototypeOf(e);return!!t&&t.constructor===Object&&t===Object.prototype}function _(e){return w(e)==="Symbol"}function C(e,t,r,i){let n={}.propertyIsEnumerable.call(i,t)?"enumerable":"nonenumerable";n==="enumerable"&&(e[t]=r),n==="nonenumerable"&&Object.defineProperty(e,t,{value:r,enumerable:!1,writable:!0,configurable:!0})}function x(e,t,r){if(!E(t))return t;let i={};if(E(e)){let a=Object.getOwnPropertyNames(e),s=Object.getOwnPropertySymbols(e);i=[...a,...s].reduce((u,l)=>{if(l==="__proto__")return u;let c=e[l];return(!_(l)&&!Object.getOwnPropertyNames(t).includes(l)||_(l)&&!Object.getOwnPropertySymbols(t).includes(l))&&C(u,l,c,e),u},{})}let n=Object.getOwnPropertyNames(t),o=Object.getOwnPropertySymbols(t);return[...n,...o].reduce((a,s)=>{if(s==="__proto__")return a;let u=t[s],l=E(e)?e[s]:void 0;return l!==void 0&&E(u)&&(u=x(l,u,r)),C(a,s,r?r(l,u,s):u,t),a},i)}function H(e,...t){return t.reduce((r,i)=>x(r,i),e)}var X={};function p(e){return H(X,e)}function z(e){let t=e.startsWith("$"),r=e.startsWith("$$"),i=e.startsWith("#node-config-input")||e.startsWith("#node-input");return{isNodeIdShortcut:t,isNodeConfigIdShortcut:r,isFullSelector:i,value:t||r||i}}function S(e){let t=z(e);return t.isNodeConfigIdShortcut?`#node-config-input-${e.replace("$$","")}`:t.isNodeIdShortcut?`#node-input-${e.replace("$","")}`:e}function f(e,t,r){let i=S(e),n=t;r!=null&&r.emptyValue&&(n=[{value:"",text:r.emptyValue},...t]),$(i).empty().append(n.map(o=>$("<option>",{value:o.value,text:o.text,selected:o.value===(r==null?void 0:r.selected)})))}function b(e,t,r={additionalEvents:[]}){let i=(Array.isArray(e)?e:[e]).map(S).join(", "),n=["input",...r.additionalEvents];$(i).on(n.join(" "),()=>{t($(i).map(function(){return $(this).val()}).get())})}function I(e,t){let r=S(e);$(r).val(t)}function d(e){let t=S(e);return $(t)}var m="philips tv",h="#E28413",g="font-awesome/fa-tv";var P="Adjust.AmbilightOnOff.Back.BlueColour.ChannelStepDown.ChannelStepUp.Confirm.CursorDown.CursorLeft.CursorRight.CursorUp.Digit0.Digit1.Digit2.Digit3.Digit4.Digit5.Digit6.Digit7.Digit8.Digit9.Dot.FastForward.Find.GreenColour.Home.Info.Mute.Next.Online.Options.Pause.PlayPause.Previous.Record.RedColour.Rewind.Source.Standby.Stop.Subtitle.Teletext.Viewmode.VolumeDown.VolumeUp.WatchTV.YellowColour".split("."),D=["COMFORT","GAME","IMMERSIVE","NATURAL","RELAX","STANDARD","VIVID"],R=["ENERGY_ADAPTIVE_BRIGHTNESS","ENERGY_ADAPTIVE_COLORS","KNIGHT_RIDER_ALTERNATING","MODE_RANDOM","RANDOM_PIXEL_FLASH","SPECTRUM_ANALYSER","VU_METER","SPECTRUM_ANALYZER","KNIGHT_RIDER_CLOCKWISE","STROBO","PARTY"],T=[0,1,2,3,4,5,6,7,8,9,10];var V=[{text:"Set Brightness",value:"set_brightness"},{text:"Increase Brightness",value:"increase_brightness"},{text:"Decrease Brightness",value:"decrease_brightness"},{text:"Set Video Mode",value:"set_video_mode"},{text:"Set Audio Mode",value:"set_audio_mode"}],F={set_brightness:T.map(String),set_video_mode:D,set_audio_mode:R};var J=p({category:m,color:h,defaults:{name:{value:""},action:{value:""},value:{value:""},returnInfo:{value:!1},tv:{value:"",type:"philips-tv-config",required:!0}},inputs:1,outputs:1,icon:g,paletteLabel:"Ambilight",label:function(){return this.name||this.action||"Ambilight"},oneditprepare:function(){f("$action",V,{emptyValue:"Select an action",selected:this.action});let e=t=>{var n,o,a;let r=(a=(o=(n=F)==null?void 0:n[t])==null?void 0:o.map)==null?void 0:a.call(o,s=>({value:s,text:s})),i=d("$value");i.addClass("!hidden"),r&&(i.removeClass("!hidden"),f("$value",r,{selected:this.value}))};e(this.action),b(["$action"],([t])=>{e(t)})}}),k=J;var L={kinds:[{value:"tv_structure",text:"TV Structure"},{value:"tv_ambilight_info",text:"Ambilight Info"},{value:"tv_system",text:"System Info"}],getAvailableKinds(){return this.kinds.map(e=>e.value)}};var Q=p({category:m,color:h,defaults:{name:{value:""},tv:{value:"",type:"philips-tv-config",required:!0},kind:{value:""}},inputs:1,outputs:1,icon:g,paletteLabel:"Info",label:function(){return this.name||this.kind||"Info"},oneditprepare:function(){f("$kind",L.kinds,{selected:this.kind,emptyValue:"-- from payload --"})}}),j=Q;var q=e=>!!(e&&e.constructor&&e.call&&e.apply),ee=e=>!(!e||!e.then||!q(e.then)),te=(e,t,r=!1)=>e?e.slice().sort(r===!0?(i,n)=>t(n)-t(i):(i,n)=>t(i)-t(n)):[];function*G(e,t,r=n=>n,i=1){let n=q(r)?r:()=>r,o=t?e:0,a=t==null?e:t;for(let s=o;s<=a&&(yield n(s),!(s+i>a));s+=i);}var re=(e,t,r,i)=>Array.from(G(e,t,r,i)),ie=(e,t)=>e?e.reduce((r,i)=>{let[n,o]=r;return t(i)?[[...n,i],o]:[n,[...o,i]]},[[],[]]):[[],[]];function M(e,t,r,i,n,o,a){try{var s=e[o](a),u=s.value}catch(l){r(l);return}s.done?t(u):Promise.resolve(u).then(i,n)}function v(e){return function(){var t=this,r=arguments;return new Promise(function(i,n){var o=e.apply(t,r);function a(u){M(o,i,n,a,s,"next",u)}function s(u){M(o,i,n,a,s,"throw",u)}a(void 0)})}}(function(){var e=v(function*(t,r,i){let n=i!==void 0;if(!n&&(t==null?void 0:t.length)<1)throw Error("Cannot reduce empty array with no init value");let o=n?t:t.slice(1),a=n?i:t[0];for(let[s,u]of o.entries())a=yield r(a,u,s);return a});return function(t,r,i){return e.apply(this,arguments)}})(),(function(){var e=v(function*(t,r){if(!t)return[];let i=[],n=0;for(let o of t){let a=yield r(o,n++);i.push(a)}return i});return function(t,r){return e.apply(this,arguments)}})(),(function(){var e=v(function*(t){let r=[],[i,n]=yield O(t)((o,a)=>{var s;return r.push({fn:o,rethrow:(s=a==null?void 0:a.rethrow)==null?!1:s})});for(let{fn:o,rethrow:a}of r){let[s]=yield O(o)(i);if(s&&a)throw s}if(i)throw i;return n});return function(t){return e.apply(this,arguments)}})();var ne=class extends Error{constructor(e=[]){var t,r,i,n;super(),this.name=`AggregateError(${(t=(r=e.find(o=>o.name))==null?void 0:r.name)==null?"":t}...)`,this.message=`AggregateError with ${e.length} errors`,this.stack=(i=(n=e.find(o=>o.stack))==null?void 0:n.stack)==null?this.stack:i,this.errors=e}};(function(){var e=v(function*(t,r,i){let n=r.map((l,c)=>({index:c,item:l})),o=(function(){var l=v(function*(c){let y=[];for(;;){let N=n.pop();if(!N)return c(y);let[Z,W]=yield O(i)(N.item);y.push({error:Z,result:W,index:N.index})}});return function(c){return l.apply(this,arguments)}})(),a=re(1,t).map(()=>new Promise(o)),[s,u]=ie(te((yield Promise.all(a)).flat(),l=>l.index),l=>!!l.error);if(s.length>0)throw new ne(s.map(l=>l.error));return u.map(l=>l.result)});return function(t,r,i){return e.apply(this,arguments)}})(),(function(){var e=v(function*(t,r){var i,n;let o=(i=t==null?void 0:t.times)==null?3:i,a=t==null?void 0:t.delay,s=(n=t==null?void 0:t.backoff)==null?null:n;for(let u of G(1,o)){let[l,c]=yield O(r)(y=>{throw{_exited:y}});if(!l)return c;if(l._exited)throw l._exited;if(u===o)throw l;a&&(yield K(a)),s&&(yield K(s(u)))}});return function(t,r){return e.apply(this,arguments)}})();var K=e=>new Promise(t=>setTimeout(t,e)),O=e=>(...t)=>{try{let r=e(...t);return ee(r)?r.then(i=>[void 0,i]).catch(i=>[i,void 0]):[void 0,r]}catch(r){return[r,void 0]}};function oe(e){return/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)}function se(e){return/^(([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4}|:)|(([0-9a-fA-F]{1,4}:){1,6}:)|(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|([0-9a-fA-F]{1,4}:)((:[0-9a-fA-F]{1,4}){1,6})|(:((:[0-9a-fA-F]{1,4}){1,7}|:))|(fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,})|(::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9]))|(([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9])?[0-9])))$/.test(e)}function A(e){return oe(e)||se(e)}var U=p({category:"config",defaults:{name:{value:"",required:!0},url:{value:"",required:!0},ip:{value:"",required:!0,validate:e=>A(e)}},credentials:{digest_user:{type:"text"},digest_password:{type:"password"}},label:function(){return this.name||"Philips TV Configuration"},oneditprepare:function(){let e=r=>`https://${r}:1926/6`,t=r=>{RED.notify(`Error : ${r}`,{type:"error",timeout:1e4})};$("#trigger-action-start-pairing").on("click",()=>{$.ajax({url:"js-philips-tv-control/pairing",type:"POST",data:{action:"start",ip:this.ip||d("$$ip").val()},beforeSend(){$("#pairing-ready").addClass("hidden")},success:r=>{$("#pairing-ready").removeClass("hidden")},error:r=>{t(r.responseJSON.message)}})}),$("#trigger-action-complete-pairing").on("click",()=>{$.ajax({url:"js-philips-tv-control/pairing",type:"POST",data:{action:"complete",pin:d("#pairing-pin-input").val()},beforeSend(){d("#invalid-pin").addClass("hidden");let r=d("#pairing-pin-input").val();if(!/^\d{4}$/.test(r))return d("#invalid-pin").removeClass("hidden"),!1},success:r=>{$("#paring-success").removeClass("hidden"),d("$$digest_user").val(r.user),d("$$digest_password").val(r.password)},error:r=>{t(r.responseJSON.message)}})}),this.ip&&A(this.ip)&&$("#pairing-section").removeClass("hidden"),b(["$$ip"],([r])=>{let i=e(r);I("$$url",i),A(r)?$("#pairing-section").removeClass("hidden"):$("#pairing-section").addClass("hidden")})}});var Y=P.map(e=>({value:e,text:e}));var ae=p({category:m,color:h,defaults:{name:{value:""},tv:{value:"",type:"philips-tv-config",required:!0},key:{value:""}},inputs:1,outputs:1,icon:g,paletteLabel:"Send Key",label:function(){return this.name||this.key||"Send Key"},oneditprepare:function(){f("$key",Y,{selected:this.key,emptyValue:"-- from payload --"})}}),B=ae;window.RED.nodes.registerType("ambilight",k);window.RED.nodes.registerType("info",j);window.RED.nodes.registerType("philips-tv-config",U);window.RED.nodes.registerType("send-key",B);})();</script>
<script type="text/markdown" data-help-name="ambilight">
Manage Ambilight brightness and modes.
_If payload is passed, it will set values passed in the payload. All other values configured in the node will be ignored._
Valid `msg.payload`:
```
{
"action": "set_brightness",
"value": "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10"
}
```
```
{
"action": "set_video_mode",
"value": "COMFORT | GAME | IMMERSIVE | NATURAL | RELAX | STANDARD | VIVID"
}
```
```
{
"action": "set_audio_mode",
"value": "ENERGY_ADAPTIVE_BRIGHTNESS | ENERGY_ADAPTIVE_COLORS | KNIGHT_RIDER_ALTERNATING | MODE_RANDOM | RANDOM_PIXEL_FLASH | SPECTRUM_ANALYSER | VU_METER | SPECTRUM_ANALYZER | KNIGHT_RIDER_CLOCKWISE | STROBO | PARTY"
}
```
</script>
<script type="text/markdown" data-help-name="info">
Get TV information System, Ambilight current information and TV structure.
_If payload is passed, it will set values passed in the payload. All other values configured in the node will be ignored._
Valid `msg.payload`:
* `tv_structure`
* `tv_ambilight_info`
* `tv_system`
</script>
<script type="text/markdown" data-help-name="send-key">
Send key to your TV (Play, Pause, Volume Up, Volume Down, etc.)
_If payload is passed, it will set values passed in the payload. All other values configured in the node will be ignored._
Valid `msg.payload`:
* `Adjust`
* `AmbilightOnOff`
* `Back`
* `BlueColour`
* `ChannelStepDown`
* `ChannelStepUp`
* `Confirm`
* `CursorDown`
* `CursorLeft`
* `CursorRight`
* `CursorUp`
* `Digit0`
* `Digit1`
* `Digit2`
* `Digit3`
* `Digit4`
* `Digit5`
* `Digit6`
* `Digit7`
* `Digit8`
* `Digit9`
* `Dot`
* `FastForward`
* `Find`
* `GreenColour`
* `Home`
* `Info`
* `Mute`
* `Next`
* `Online`
* `Options`
* `Pause`
* `PlayPause`
* `Previous`
* `Record`
* `RedColour`
* `Rewind`
* `Source`
* `Standby`
* `Stop`
* `Subtitle`
* `Teletext`
* `Viewmode`
* `VolumeDown`
* `VolumeUp`
* `WatchTV`
* `YellowColour`
</script>