SHARE
TWEET

pimatic-led-light color_action edited

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