Rootless control of your wireless power outlet sockets with RCSwitch for the Raspberry Pi. Fork of https://github.com/marvinroger/node-rcswitch.
npm install rcswitch-gpiomemFork of /dev/gpiomem
access for rootless use on Raspbian Jessie as well as an exposing
the setPulseLength method and expanding rcswitch.send to accept a decimal
RF code (with bit length), as per the c++ version. Renamed as it may not be
backwards compatible with Wheezy / systems without /dev/gpiomem.
My contribution has been negligible; all credit goes to the original developers
of these libraries:
-
-
-
-
-
-
Additionally, this fork uses
sched.h to
try to give the process a high priority during the RF transmission (currently
only implemented for rcswitch.send()). I've found this important for
optimizing reliability of the transmission if the CPU is busy. Reference my
rf_pi post and
repository
for more information on using libcap2-bin and setcap to accomplish this,
but the short version is: sudo apt-get install libcap2-bin && sudo setcap. It works just fine without this
cap_sys_nice+ep $(readlink -f $(which node))
if you don't want to bother or are concerned about the security ramifications.
Node bindings for the rcswitch Raspberry Pi port:
Personally, I have only tested on node v4.2.3. Per original author:
> It should be compatible with Node 0.8, 0.10 and 0.12 (tested only on 0.10 and
> 0.12). Successfully tested on Raspbian Wheezy up-to-date as of 2015-02-28.
- Like the c++ version of rcswitch, WiringPi must be
installed
in order to compile.
- To work without root by way of /dev/gpiomem part to work, it should be run
on Raspbian Jessie with wiringPi >=
2.29
- Both the data and the power Pins of the 315/433Mhz emitter must be connected
to the RPi. Note the number of the ~~WiringPi data~~ BCM Pin. (see
http://wiringpi.com/pins/)
``javascript
var rcswitch = require('rcswitch-gpiomem'); // May throw an error if /dev/gpiomem is not accessible
rcswitch.enableTransmit(17); // Use BCM pin 17
rcswitch.setPulseLength(190); // Set pulse length (see https://github.com/n8henrie/rf_pi)
rcswitch.setRepeatTransmit(15); // Set number of repeat transmissions
rcswitch.send(12345, 24) // send(code, bitlength)
// Alternative
rcswitch.switchOn("10110", 1); // Switch on the first unit of 10110 (code 1x23x) group
rcswitch.switchOff("11000", 2); // Switch off the second unit of 11000 (code 12xxx) group
`
Note: If testing / experimenting from a local copy of the repo, you need to
require the base directory of the repo:
`bash`
git clone https://github.com/n8henrie/node-rcswitch-gpiomem.git
cd node-rcswitch-gpiomem
npm install .
node
> var rcswitch = require('.')
rcswitch.enableTransmit(17);
#### rcswitch.enableTransmit(int pin)
Enable transmission on BCM pin. On Jessie should "just work". NB: if you to not want to use /dev/gpiomem, you'll need to first export the pin with the wiringPi gpio utility to avoid needing root.
- pin - (Number) data Pin to use following the WiringPi schema
Return true if pin is an integer, false otherwise.
#### rcswitch.disableTransmit()
Disable transmission (set the pin to -1 which disable any following function call).
Return true.
#### rcswitch.setPulseLength(int pLength)
- pLength - RF pulse length, defaults to 190.
- See:
#### rcswitch.setRepeatTransmit(int nRepeat)
- nRepeat - Number of repeat transmissions (default 10)
#### rcswitch.send(int code, int bLength)
- code - decimal RF code to send
- bLength - bit length of decimal RF code
- See:
Return true if both are Uint32, otherwise false.
#### rcswitch.send(char* codeWord)
- codeWord - (String) codeword. Can use this to send the binary RF code,
see:
Return true.
This is for use with specific RF protocols that I have never needed -- I just
use RF_Snifer to get the code. -@n8henrie
#### rcswitch.switchOn(group, switch)
Switch a remote switch on (Type A with 10 pole DIP switches).
* group - (String) code of the switch group (refers to DIP switches 1, 2, 3, 4 and 5 where "1" = on and "0" = off - e.g. if all DIP switches are on it's "11111")
* switch - (Number) switch number (can be 1 (if DIP switch A is on), 2 (if DIP switch B is on) and so on until 4)
Return true.
#### rcswitch.switchOff(group, switch)
Switch a remote switch off (Type A with 10 pole DIP switches).
* group - (String) code of the switch group (refers to DIP switches 1, 2, 3, 4 and 5 where "1" = on and "0" = off - e.g. if all DIP switches are on it's "11111")
* switch - (Number) switch number (can be 1 (if DIP switch A is on), 2 (if DIP switch B is on) and so on until 4)
Return true.
#### rcswitch.switchOn(group, switch)
Switch a remote switch on (Type B with two rotary/sliding switches).
* group - (Number) group (can be 1, 2, 3, 4)
* switch - (Number) switch (can be 1, 2, 3, 4)
Return true.
#### rcswitch.switchOff(group, switch)
Switch a remote switch off (Type B with two rotary/sliding switches).
* group - (Number) group (can be 1, 2, 3, 4)
* switch - (Number) switch (can be 1, 2, 3, 4)
Return true.
#### rcswitch.switchOn(family, group, switch)
Switch a remote switch on (Type C Intertechno).
* family - (String) familycode (can be a, b, c, d, e, f)
* group - (Number) group (can be 1, 2, 3, 4)
* switch - (Number) switch (can be 1, 2, 3, 4)
Return true.
#### rcswitch.switchOff(family, group, switch)
Switch a remote switch off (Type C Intertechno).
* family - (String) familycode (can be a, b, c, d, e, f)
* group - (Number) group (can be 1, 2, 3, 4)
* switch - (Number) switch (can be 1, 2, 3, 4)
Return true.