Hi, I have created a simple plugin for Lirc (https://github.com/tester22/pimatic-lirc).
More features will be added before i release it to npm.
Example of rule I use it for:
if state of sonos-livingroom is equal to “play” set lirc remote:“Marantz_raw” command:“KEY_POWER”
-
New plugin for Lirc
-
@tester22
nice! if you are ready with publishing to npm please also create a readme / howto.pimatic v0.9 has been released!
Support Pimatic and get some free stickers
Like us on Facebookmake it so !
-
Sure, will just finalize the parsing of the lirc commands to make rule creation easier.
-
Finally got some time to spend on this.
The rules engine is now completed and it is only possible to select commands that are available in the current lirc config. -
Thanks for the plugin
Gonna have a look next week -
@leader21 I am still working in the plugin and have an problem.
The latest version of the plugin support incoming IR signals consisting of two params. Remote and Key.What way should I return that to the rule engine? Should it be two variables or an attribute of a device? And if so do I need to create an device with a new class or should I use the Sensor Class?
-
pimatic v0.9 has been released!
Support Pimatic and get some free stickers
Like us on Facebookmake it so !
-
@tester22 I would create a subclass of Sensor (for example
class LircReceiver extends env.devices.Sensor
). Using two attributes for “remote” and “key” would be the easiest as you don’t need to write your own PredicateHandler for this. This way you can use “remote” and “command” as part of a rules likeif remote of lircReceiver is "tv" and command of lircReceiver is "VolumeUp" then ...
."It always takes longer than you expect, even when you take into account Hofstadter's Law.", Hofstadter's Law
-
This post is deleted!
-
@mwittig I am stuck getting the emit to work?
Can you see if I have made any obvious errors.# This plugin gives functionality to pimatic to control lirc (ir remotes). module.exports = (env) -> # Require the bluebird promise library Promise = env.require 'bluebird' # Require the [cassert library](https://github.com/rhoot/cassert). assert = env.require 'cassert' _ = require 'lodash' M = env.matcher # Require the [lirc_node](https://github.com/alexbain/lirc_node) library lirc_node = require 'lirc_node' fs = require "fs" # ###LircPlugin class class LircPlugin extends env.plugins.Plugin init: (app, @framework, @config) => lirc_node.init(); deviceConfigDef = require("./device-config-schema") Promise.promisifyAll(lirc_node) @framework.ruleManager.addActionProvider(new LircActionProvider @framework, config) @framework.deviceManager.registerDeviceClass("LircReceiver", { configDef: deviceConfigDef.LircReceiver, createCallback: (config) -> device = new LircReceiver(config) return device }) class LircActionProvider extends env.actions.ActionProvider constructor: (@framework, @config) -> return parseAction: (input, context) => getRemotes = lirc_node.remotes remote = "" command = "" match = null m = M(input, context) .match('set ', optional: yes) .match(['lirc']) m.match [' remote: '], (m) -> m.match _.keys(getRemotes), (next, r) -> remote = r next.match [' command: '], (m) -> m.match _.valuesIn(getRemotes[remote]), (m, c) -> command = c match = m.getFullMatch() if match? # either variable or color should be set return { token: match nextInput: input.substring(match.length) actionHandler: new LircActionHandler( @framework, remote, command ) } class LircActionHandler extends env.actions.ActionHandler constructor: (@framework, @remote, @command) -> executeAction: (simulate, context) -> if simulate # just return a promise fulfilled with a description about what we would do. return __( "would send ir command \"%s\" with remote \"%s\"", @command, @remote) else lirc_node.irsend.send_once(@remote, @command, -> return __("Sending command \"%s\" with remote \"%s\"", @command, @remote)) return __("Sending command \"%s\" with remote \"%s\"", @command, @remote) module.exports.LircActionHandler = LircActionHandler class LircReceiver extends env.devices.Sensor remote: null command: null attributes: remote: description: 'last remote used' type: "string" command: description: 'last key pressed' type: "string" constructor: (@config) -> @name = config.name @id = config.id super() @listenForIR() listenForIR: () -> lirc_node.addListener (data) -> env.logger.debug("Data received %s, remote %s", data.remote, data.key) @remote = data.remote @command = data.key @emit "remote", @remote @emit "command", @command getRemote: -> Promise.resolve(@remote) getCommand: -> Promise.resolve(@command) # Create a instance of my plugin lircPlugin = new LircPlugin() # and return it to the framework. return lircPlugin
This is what I am getting in the debug log:
23:02:29.690 [pimatic-lirc] Data received KEYES, remote KEY_5 23:02:29.766 [pimatic] A uncaught exception occured: TypeError: Object #<Object> has no method 'emit' 23:02:29.766 [pimatic]> at Object.callback (/home/apps/pimatic-app/node_modules/pimatic-lirc/lirc.coffee:119:10) 23:02:29.766 [pimatic]> at /home/apps/pimatic-app/node_modules/pimatic-lirc/node_modules/lirc_node/lib/irreceive.js:147:22 23:02:29.766 [pimatic]> at Array.forEach (native) 23:02:29.766 [pimatic]> at IRReceive._handleIRData (/home/apps/pimatic-app/node_modules/pimatic-lirc/node_modules/lirc_node/lib/irreceive.js:140:20) 23:02:29.766 [pimatic]> at Socket.EventEmitter.emit (events.js:95:17) 23:02:29.766 [pimatic]> at Socket.<anonymous> (_stream_readable.js:745:14) 23:02:29.766 [pimatic]> at Socket.EventEmitter.emit (events.js:92:17) 23:02:29.766 [pimatic]> at emitReadable_ (_stream_readable.js:407:10) 23:02:29.766 [pimatic]> at emitReadable (_stream_readable.js:403:5) 23:02:29.766 [pimatic]> at readableAddChunk (_stream_readable.js:165:9) 23:02:29.766 [pimatic]> at Socket.Readable.push (_stream_readable.js:127:10) 23:02:29.766 [pimatic]> at Pipe.onread (net.js:528:21) 23:02:29.766 [pimatic]> This is most probably a bug in pimatic or in a module, please report it!
So the functionality seems to work but when I emit I get this error. Could it be the type of the incoming data?
-
@tester22 Hi!
Try to change the following line
lirc_node.addListener (data) ->
to
lirc_node.addListener (data) =>
=> binds
this
to the callback function"It always takes longer than you expect, even when you take into account Hofstadter's Law.", Hofstadter's Law
-
@mwittig Thanks it worked. I will clean up the plugin and push it to npm now.
-
@tester22 said:
@mwittig Thanks it worked. I will clean up the plugin and push it to npm now.
That’s great! Before publishing it, please also add a README which briefly describes the configuration. Much appreciated.
"It always takes longer than you expect, even when you take into account Hofstadter's Law.", Hofstadter's Law
-
@mwittig Is there any easy way to add a timer so that an attribute of an device is changed if the attribute hasn’t been changed for a number of minutes?
I have an problem with my lirc setup where I perform an action if an value is received from lirc in combination with two other variables. The problem is that if no button is pressed on any remote before the the next time the rule is checked the rule is always true.So is there any way to be able to cancel out the values of the plugin after a limited time?
-
Hi, what’s the current state of the LIRC plugin? Looks like the latest changes of the plugin are from 10 months ago and it’s not yet possible to define a device.
Currently I’m using a ButtonsDevice and create a rule for every button to work around the problem.
Also I’m having issues with the temporary file, sometimes it’s empty. Why is there a temporary file used anyways? Cant the commands be stored in memory?