Guest User

pimatic-led-light color_action original

a guest
Oct 27th, 2017
27
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module.exports = (env) ->
  2.  
  3.   Promise = env.require 'bluebird'
  4.  
  5.   assert = require 'cassert'
  6.   _ = require 'lodash'
  7.   M = env.matcher
  8.  
  9.   color_schema = require '../color_schema'
  10.  
  11.   class ColorActionHandler extends env.actions.ActionHandler
  12.     constructor: (@provider, @device, @color, @variable) ->
  13.       @_variableManager = null
  14.  
  15.       if @variable
  16.         @_variableManager = @provider.framework.variableManager
  17.  
  18.     executeAction: (simulate) =>
  19.       getColor = (callback) =>
  20.         if @variable
  21.           @_variableManager.evaluateStringExpression([@variable])
  22.             .then (temperature) =>
  23.               temperatureColor = new Color()
  24.               hue = 30 + 240 * (30 - temperature) / 60;
  25.               temperatureColor.hsl(hue, 70, 50)
  26.  
  27.               hexColor = '#'
  28.               hexColor += temperatureColor.rgb().r.toString(16)
  29.               hexColor += temperatureColor.rgb().g.toString(16)
  30.               hexColor += temperatureColor.rgb().b.toString(16)
  31.  
  32.               callback hexColor, simulate
  33.         else
  34.           callback @color, simulate
  35.  
  36.       getColor @setColor
  37.  
  38.     setColor: (color, simulate) =>
  39.       if simulate
  40.         return Promise.resolve(__("would log set color #{color}"))
  41.       else
  42.         @device.setColor color
  43.         return Promise.resolve(__("set color #{color}"))
  44.  
  45.   class ColorActionProvider extends env.actions.ActionProvider
  46.       constructor: (@framework) ->
  47.  
  48.       parseAction: (input, context) =>
  49.         iwyDevices = _(@framework.deviceManager.devices).values().filter(
  50.           (device) => device.hasAction("setColor")
  51.         ).value()
  52.  
  53.         hadPrefix = false
  54.  
  55.         # Try to match the input string with: set ->
  56.         m = M(input, context).match(['set '])
  57.  
  58.         device = null
  59.         color = null
  60.         match = null
  61.         variable = null
  62.  
  63.         # device name -> color
  64.         m.matchDevice iwyDevices, (m, d) ->
  65.           # Already had a match with another device?
  66.           if device? and device.id isnt d.id
  67.             context?.addError(""""#{input.trim()}" is ambiguous.""")
  68.             return
  69.  
  70.           device = d
  71.  
  72.           m.match [' to '], (m) ->
  73.             m.or [
  74.               # rgb hex like #00FF00
  75.               (m) ->
  76.                 # TODO: forward pattern to UI
  77.                 m.match [/(#[a-fA-F\d]{6})(.*)/], (m, s) ->
  78.                   color = s.trim()
  79.                   match = m.getFullMatch()
  80.  
  81.               # color name like red
  82.               (m) -> m.match _.keys(color_schema), (m, s) ->
  83.                   color = color_schema[s]
  84.                   match = m.getFullMatch()
  85.  
  86.               # color by temperature from variable like $weather.temperature = 30
  87.               (m) ->
  88.                 m.match ['temperature based color by variable '], (m) ->
  89.                   m.matchVariable (m, s) ->
  90.                     variable = s
  91.                     match = m.getFullMatch()
  92.             ]
  93.  
  94.         if match?
  95.           assert device?
  96.           # either variable or color should be set
  97.           assert variable? ^ color?
  98.           assert typeof match is "string"
  99.           return {
  100.             token: match
  101.             nextInput: input.substring(match.length)
  102.             actionHandler: new ColorActionHandler(@, device, color, variable)
  103.           }
  104.         else
  105.           return null
  106.  
  107.   return ColorActionProvider
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×