SHARE
TWEET

pimatic-led-light color_action original

a guest Oct 27th, 2017 4 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top