UNPKG

pimatic-johnny-five

Version:

Pimatic Plugin for Johnny Five, a Robotics and IoT programming framework.

95 lines (78 loc) 2.89 kB
module.exports = (env) -> Promise = env.require 'bluebird' assert = env.require 'cassert' _ = env.require 'lodash' M = env.matcher colors = require 'colornames' colorNames = colors.all().filter((v) -> v.css is true).map((v) -> v.name) class JohnnyFiveRgbColorActionHandler extends env.actions.ActionHandler constructor: (@provider, @device, @color, @variable) -> @_variableManager = @provider.framework.variableManager super() setup: -> @dependOnDevice(@device) super() executeAction: (simulate) => if @variable? @_variableManager.evaluateStringExpression([@variable]) .then (value) => if value.match(/(#[a-fA-F\d]{6})(.*)/)? or colors(value)? @setColor value, simulate else Promise.reject new Error __("variable value #{value} is not a valid color") else @setColor @color, simulate setColor: (color, simulate) => if simulate return Promise.resolve(__("would log set color #{color}")) else @device.setColor color return Promise.resolve(__("set color #{color}")) class JohnnyFiveRgbColorActionProvider extends env.actions.ActionProvider constructor: (@framework) -> super() parseAction: (input, context) => j5ColorDevices = _(@framework.deviceManager.devices).values().filter( (device) => device.config.class is 'JohnnyFiveRgbLed' ).value() # Try to match the input string with: set -> m = M(input, context).match(['j5 set color ']) device = null color = null match = null variable = null # device name -> color m.matchDevice j5ColorDevices, (m, d) -> # Already had a match with another device? if device? and device.id isnt d.id context?.addError(""""#{input.trim()}" is ambiguous.""") return device = d m.match [' to '], (m) -> m.or [ # rgb hex like #00FF00 (m) -> m.match [/(#[a-fA-F\d]{6})(.*)/], (m, s) -> color = s.trim() match = m.getFullMatch() # color name like red (m) -> m.match colorNames, (m, s) -> color = colors(s) match = m.getFullMatch() # a variable holding the color value (m) -> m.matchVariable (m, s) -> variable = s match = m.getFullMatch() ] if match? assert device? # either variable or color should be set assert variable? ^ color? assert typeof match is "string" return { token: match nextInput: input.substring(match.length) actionHandler: new JohnnyFiveRgbColorActionHandler(@, device, color, variable) } else return null return JohnnyFiveRgbColorActionProvider