@keload/node-red-contrib-js-philips-tv-control
Version:
A collection of nodes to control Philips TV with Node-RED, including Ambilight control.
2 lines (1 loc) • 4.38 kB
JavaScript
var F=Object.create;var m=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var U=(e,o)=>{for(var t in o)m(e,t,{get:o[t],enumerable:!0})},N=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let l of M(o))!B.call(e,l)&&l!==t&&m(e,l,{get:()=>o[l],enumerable:!(n=O(o,l))||n.enumerable});return e};var G=(e,o,t)=>(t=e!=null?F($(e)):{},N(o||!e||!e.__esModule?m(t,"default",{value:e,enumerable:!0}):t,e)),J=e=>N(m({},"__esModule",{value:!0}),e);var H={};U(H,{default:()=>z});module.exports=J(H);var a=G(require("superstruct")),x=require("superstruct");var b=require("philtv-js");function I(e){return new b.PhilTVApi({apiUrl:e.url,user:e.digest_user,password:e.digest_password})}function c(e,o){let t=e.nodes.getNode(o);return{tvClient:I({url:t.url,digest_user:t.credentials.digest_user,digest_password:t.credentials.digest_password}),tvConfig:t}}var y=require("philtv-js/constants"),P=[{text:"Set Brightness",value:"set_brightness"},{text:"Set Video Mode",value:"set_video_mode"}],X=y.JOINTSPACE_CONSTANTS.ambilight.ambilightChangeBrightnessAvailableSinglesValues,Y=y.JOINTSPACE_CONSTANTS.ambilight.followVideoMode;function A(e){RED.nodes.createNode(this,e);let{tvClient:o}=c(RED,e.tv);this.on("input",async t=>{let n=e.action,l=e.value,d=e.returnInfo,s={value:l,action:n,returnInfo:d};t.payload&&(s=t.payload);let r=a.object({action:a.enums(P.map(h=>h.value)),value:a.union([a.string(),a.number()]),returnInfo:a.optional(a.boolean())}),[i]=(0,x.validate)(s,r);if(i){this.error(`Validation failed: ${i.message}`,t);return}let g={set_brightness:{call:()=>o.changeAmbilightBrightness(s.value)},set_video_mode:{call:()=>o.setAmbilightFollowVideoMode(s.value)}}[s.action],[C]=await g.call();if(C){this.error(`Error: ${C.message}`,t);return}if(s.returnInfo){let[,h]=await o.getAmbilightFullInformation();s.info=h}this.send({...t,payload:s})})}var T={};var u=require("superstruct");var _={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)}};function w(e){RED.nodes.createNode(this,e);let{tvClient:o}=c(RED,e.tv),t=Object.freeze({tv_ambilight_info:()=>o.getAmbilightFullInformation(),tv_system:()=>o.getSystem(),tv_structure:()=>o.getMenuStructure({flat:!0})}),n=e.kind,l=(0,u.enums)(_.getAvailableKinds()),d=r=>{let[i,p]=(0,u.validate)(r,l);return i?[!1,i.message]:[!0,p]},s=async(r,i)=>{try{let[p,g]=await t[r]();p?this.error(p.message,i):this.send({...i,payload:g})}catch(p){this.error(`Unexpected error: ${p.message}`,i)}};this.on("input",async r=>{if(n===""&&r.payload){let[i,p]=d(r.payload);if(!i){this.error(`Validation failed: ${p}`,r);return}n=r.payload}await s(n,r)})}var S={};var V={digest_user:{type:"text"},digest_password:{type:"password"}};function E(e){RED.nodes.createNode(this,e),this.name=e.name,this.url=e.url}var f=require("superstruct");var K=require("philtv-js/constants"),v=K.JOINTSPACE_CONSTANTS.inputKeys,le=v.map(e=>({value:e,text:e}));function D(e){RED.nodes.createNode(this,e);let{tvClient:o}=c(RED,e.tv);this.on("input",async t=>{let n=t.payload,l=e.key,d=n||l,s=(0,f.enums)(v),[r]=(0,f.validate)(d,s);if(r){this.error(`Validation failed: ${r.message}`,t);return}let[i]=await o.sendKey(d);if(i){this.error(i.message,t);return}this.send({...t,payload:d})})}var R={};var k=require("philtv-js");function j(){let e;RED.httpNode.post("/js-philips-tv-control/pairing",async(o,t)=>{let{action:n,ip:l,pin:d}=o.body;if(n==="start"){e=new k.PhilTVPairing({tvIp:l});let[s,r]=await e.init();if(s){t.status(400).json({success:!1,message:s.message});return}let[i]=await e.startPairing();if(i){t.status(400).json({success:!1,message:i.message});return}t.status(200).json({success:!1,message:r})}else if(n==="complete"){let[s,r]=await e.completePairing(d);s&&t.status(400).json({success:!1,message:s.message}),r&&t.status(200).json({user:r.user,password:r.password})}else t.status(400).json({success:!1,message:"Undefined action"})})}var z=async e=>{global.RED=e,global.RED.nodes.registerType("ambilight",A,{credentials:T}),global.RED.nodes.registerType("info",w,{credentials:S}),global.RED.nodes.registerType("philips-tv-config",E,{credentials:V}),global.RED.nodes.registerType("send-key",D,{credentials:R}),j()};