Giter VIP home page Giter VIP logo

rfcontroljs's Introduction

rfcontroljs

rfcontroljs is a node.js module written to parse and construct 433mhz On-off keying (OOK) signals for various devices switches or weather stations.

It works well together with the RFControl Arduino library for receiving the signals.

You can find a list of all supported protocols here.

The Processing Pipeline

1. Receiving

The arduino is connected via serial bus to the processing computer (for example a raspberry pi) and waits for rf signal.

Mostly all 433mhzw OOK signals from devices are send multiple times directly in row and have a longer footer pulse in between. They differ by the pulse lengths used to encode the data and footer and the pulse count.

RFControl running on the arduino detects the start of a signal by its longer footer pulse and verifies it one time by comparing it with the next signal. It it unaware of the specific protocol, it just uses the stated fact above. Also we are not interested in it if the pulse was a high or low pulse (presence or absence of a carrier wave), because the information is decoded in the pulse lengths.

We will call the received sequence of pulse lengths now timings sequence. For example a timing sequence in microseconds could look like this:

288  972  292  968  292  972  292  968  292  972  920  344  288  976  920  348  
284  976  288  976  284  976  288  976  288  976  916  348  284  980  916  348  
284  976  920  348  284  976  920  348  284  980  280  980  284  980  916  348  
284  9808

You can clearly see the two different pulse lengths (around 304 and 959 microseconds) for the data encoding and the longer footer pulse (9808 microseconds).

All observed protocols have less than 8 different pulse length and all pulse length do differ by at least a factor of 2. This makes a further compression and simplification possible: We map each pulse length to a number from 0 to 7 (a bucket) and calculate for a better accuracy the average of all timings mapped to each of the bucket. The result is something like that:

buckets: 304, 959, 9808
pulses: 01010101011001100101010101100110011001100101011002

To make the representation unique, we choose the buckets in ascending order (respectively we are sorting it after receiving from the arduino).

We call the sorted buckets pulse lengths, the compressed timings pulse sequence and the length of the pulse sequence (inclusive footer) pulse count.

2. Protocol Matching

We detect possible protocols by two criteria. The pulse length must match with a small tolerance and the pulse count must match.

3. Protocol Parsing

If a protocol matches, its parse function is called with the pulse sequence. Most protocols are parsed almost the same way. First the pulse squence must be converted to a binary representation.

In almost all cases there exist a mapping from pulse sequences to a binary 0 and 1. In this example the pulse sequence 0110 represents a binary 0 and 0101 maps to a binary 1:

pulsesToBinaryMapping = {
  '0110': '0' #binary 0
  '0101': '1' #binary 1 
  '02': ''    #footer
}
binary = helper.map(pulses, pulsesToBinaryMapping)

The binary reprsentation now looks like this:

110011000010

As last step the protocol dependent information must be extracted from the binary representation:

result = {
  houseCode: helper.binaryToNumber(binary, 0, 5)
  unitCode: helper.binaryToNumber(binary, 6, 10)
  state: helper.binaryToBoolean(binary, 12)
}

Details

RFControl is more sensitive than needed for most protocols. So we get sometimes, depending of the accuracy of the sender/remote, different bucket counts.

This is by design, to catch up further protocols that maybe need a higher sensitivity. The specific protocol has not to deal with this issue, because rfcontroljs auto merges similar buckets before calling the decodePulses function of each protocol.

The algorithm is the following:

  1. Record the (maybe to many) buckets and compressed pulses with RFControl (arduino / c++)
  2. Sort the buckets in rfcontroljs prepareCompressedPulses
  3. Try to find a matching protocol in rfcontroljs decodePulses
  4. If we have more than 3 buckets and two of the buckets are similar (b1*2 < b2) we merge them to just one bucket by averaging and adapting the pulses in rfcontroljs fixPulses
  5. Go to step 3

Adding a new Protocol

Preparation

  1. Fork the rfcontroljs repository and clone your fork into a local directory.
  2. run npm install inside the cloned directory, so that all dependencies get installed.
  3. We are using gulp for automating tests and automatic coffee-script compilation. So best to install it global: npm install --global gulp
  4. You should be able to run the tests with gulp test.
  5. Running just gulp let it compile all files and whats for changes. So always keep in running while editing coffee-files.

Protocol development

  1. Create a new protocol file (like the other) in src/protocols.
  2. Add its name in the src/controller.coffee file to the protocol list.
  3. Add a test case to the #decodePulses() test case list in test/lib-controller.coffee with the data from the arduino (like this one). For the pulseLengths: strip the zero's at the end and sort them in ascending order, also adapt the pulse to the changed sorting. [1]
  4. Adapt the protocol file, so that the test get passed.

[1] You can also use this script to convert the output to a valid test input:

controller = require './index.js'
result = controller.prepareCompressedPulses('255 2904 1388 771 11346 0 0 0 0100020002020000020002020000020002000202000200020002000200000202000200020000020002000200020002020002000002000200000002000200020002020002000200020034')
console.log result
result2 = controller.fixPulses(result.pulseLengths, result.pulses)
console.log result2

sample output:

coffee convert.coffee 
{ pulseLengths: [ 255, 771, 1388, 2904, 11346 ],
  pulses: '0300020002020000020002020000020002000202000200020002000200000202000200020000020002000200020002020002000002000200000002000200020002020002000200020014' }
{ pulseLengths: [ 255, 1079, 2904, 11346 ],
  pulses: '0200010001010000010001010000010001000101000100010001000100000101000100010000010001000100010001010001000001000100000001000100010001010001000100010013' }

The second line should be used for protocol developing.

rfcontroljs's People

Contributors

360manu avatar abmantis avatar andurii avatar charlycha avatar chr1sj avatar drcobra avatar georg90 avatar hvdwolf avatar icesory avatar incmve avatar kenci avatar mhilcher avatar mwittig avatar philicibine avatar primatic avatar rolandkaeufl avatar rrooggiieerr avatar sweebee avatar sweetpi avatar teodoc avatar theraspydev avatar xento avatar yves911 avatar zholer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rfcontroljs's Issues

Support for Projector Screen iVisions Electro M

Hi,

First of all thank you for creating and maintaining this great piece of software, I'm having a lot of fun with it as part of Pimatic.

I recently bought a projector screen, the iVisions Electro M. Most probably some re-branded screen as I can only find one shop on the internet who sells them under that name.

The screen comes with a 433mhz remote which is currently not supported by rfcontroljs.

This are the codes:

Screen up
debug [pimatic-homeduino]: received: [ 199, 588, 824, 5164 ] 110011001010110100101101010100101011010100110010110100101100101010101010101010110010101010101010101011001011001011001011010100110123
debug [pimatic-homeduino]: data: "RF receive 588 199 824 5164 0 0 0 0 001100110101001011010010101011010100101011001101001011010011010101010101010101001101010101010101010100110100110100110100101011001023"
debug [pimatic-homeduino]: received: [ 153, 217, 599, 5104 ] 221022102020221210202212121210202022121210221020221210202210212021212120202021221020212021212120202121202210221212102121202211212223
debug [pimatic-homeduino]: data: "RF receive 599 217 153 5104 0 0 0 0 001200120202001012020010101012020200101012001202001012020012010201010102020201001202010201010102020101020012001010120101020011010003"

Stop
debug [pimatic-homeduino]: received: [ 154, 172, 240, 598, 5100 ] 332033203030332320303323232320303033232320332030332320303320303030303030303032332030313030303230303033203030332323203233232322313334
debug [pimatic-homeduino]: data: "RF receive 598 240 154 172 5100 0 0 0 001200120202001012020010101012020200101012001202001012020012020202020202020201001202030202020102020200120202001010120100101011030004"

Screen down
debug [pimatic-homeduino]: received: [ 198, 589, 832, 5164 ] 110011001010110100101101010100101011010100110010110100101100101010101010101010110010101010101010101011001011001011001011010100110123
debug [pimatic-homeduino]: data: "RF receive 589 198 832 5164 0 0 0 0 001100110101001011010010101011010100101011001101001011010011010101010101010101001101010101010101010100110100110100110100101011001023"
debug [pimatic-homeduino]: received: [ 199, 591, 5180 ] 110011001010110100101101010100101011010100110010110100101100101010101010101010110010101010101010101011001011001011001011010100110112
debug [pimatic-homeduino]: data: "RF receive 591 199 5180 0 0 0 0 0 001100110101001011010010101011010100101011001101001011010011010101010101010101001101010101010101010100110100110100110100101011001002"

Is it possible to have this protocol supported?

Thanks and keep up the good work!

Request: Alecto WS-4500 Weather Station

I have the Alecto WS-4500 Weather Station and would like to add it to my Pimatic configuration :

ws-4500

The set consists of :

  • Teperature sensor
  • Humidity sensor
  • Wind speed sensor
  • Wind direction sensor
  • Rain fall sensor
  • Network Forecast Unit

Teperature sensor, Humidity sensor, Wind speed sensor, Wind direction sensor :

winddirection

Received :

19:30:36.315 [pimatic-homeduino] debug: data: "RF receive 508 1977 3957 8925 0 0 0 0 01020201010201010101010102010102010102020101010101010201020202010202020103"
19:30:36.363 [pimatic-homeduino] debug: received: [ 508, 1977, 3957, 8925 ] 01020201010201010101010102010102010102020101010101010201020202010202020103
19:30:36.414 [pimatic-homeduino] debug: weather1:  { temperature: 77, humidity: 238 }

19:30:36.695 [pimatic-homeduino] debug: data: "RF receive 476 2006 3990 8976 0 0 0 0 01020201010201010101010102010102010102020101010101010201020202010202020103"
19:30:36.743 [pimatic-homeduino] debug: received: [ 476, 2006, 3990, 8976 ] 01020201010201010101010102010102010102020101010101010201020202010202020103
19:30:36.794 [pimatic-homeduino] debug: weather1:  { temperature: 77, humidity: 238 }

Rain fall meter :

rain

20:48:25.017 [pimatic-homeduino] debug: data: "RF receive 502 4020 1991 9044 0 0 0 0 01010101020202010201010201010202010101010101020202020202020202020102020103"
20:48:25.054 [pimatic-homeduino] debug: received: [ 502, 1991, 4020, 9044 ] 02020202010101020102020102020101020202020202010101010101010101010201010203
20:48:25.088 [pimatic-homeduino] debug: weather1:  { temperature: 96, humidity: 9 }

20:49:01.614 [pimatic-homeduino] debug: data: "RF receive 532 3985 1966 9005 0 0 0 0 01010101020202010201010201010202010101010101020202020202020202020102020103"
20:49:01.650 [pimatic-homeduino] debug: received: [ 532, 1966, 3985, 9005 ] 02020202010101020102020102020101020202020202010101010101010101010201010203
20:49:01.688 [pimatic-homeduino] debug: weather1:  { temperature: 96, humidity: 9 }

Network Forecast Unit :

netwerk-unit

21:53:42.683 [pimatic-homeduino] debug: data: "RF receive 481 1013 2003 5957 0 0 0 0 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203"
21:53:42.754 [pimatic-homeduino] debug: received: [ 481, 1013, 2003, 5957 ] 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203

21:54:21.406 [pimatic-homeduino] debug: data: "RF receive 490 1003 1996 5949 0 0 0 0 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203"
21:54:21.446 [pimatic-homeduino] debug: received: [ 490, 1003, 1996, 5949 ] 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203

21:55:00.405 [pimatic-homeduino] debug: data: "RF receive 474 1018 2012 5994 0 0 0 0 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203"
21:55:00.446 [pimatic-homeduino] debug: received: [ 474, 1018, 2012, 5994 ] 0101010201010201010101010101010201010101010101010101010101010201010101010101020102020201020202010202010201010101010102010202010203

For a Complete Capture see Pastebin :

http://pastebin.com/YxgZQm7Q

RF RGB controller support

Can anyone build a protocol for a RGB controller? I receive the raw code in pimatic (in combination with the pimatic-homeduino plugin), but i'm unable to control it.
This is the RGB controller: http://www.ebay.com/itm/12V-Touch-Screen-Dimmable-Remote-Wireless-RF-Controller-For-Led-RGB-Module-Strip/371239945160?_trksid=p3693.c100102.m2452&_trkparms=ao%3D1%26asc%3D20140212121249%26meid%3D066cfc0809fc45f7b07629d56234a045%26pid%3D100102%26

I saved for every button the code:
On:
debug [pimatic-homeduino]: contact2: { id: 1035831, contact: false }
23:38:04debug [pimatic-homeduino]: switch5: { id: 1035831, unit: 0, all: true, state: true }
23:38:04debug [pimatic-homeduino]: received: [ 344, 981, 1312, 9464 ] 01010101010110100101011010100101100101010110010203
23:38:04debug [pimatic-homeduino]: data: "RF receive 344 981 1312 9464 0 0 0 0 01010101010110100101011010100101100101010110010203"
23:38:04debug [pimatic-homeduino]: received: [ 345, 967, 9484 ] 01010101010110100101011010100101100101010110011102
23:38:04debug [pimatic-homeduino]: data: "RF receive 345 967 9484 0 0 0 0 0 01010101010110100101011010100101100101010110011102"

Off:
debug [pimatic-homeduino]: received: [ 346, 966, 9476 ] 01010101010110100101011010100101100101010110011102
23:38:31debug [pimatic-homeduino]: data: "RF receive 346 966 9476 0 0 0 0 0 01010101010110100101011010100101100101010110011102"
23:38:31debug [pimatic-homeduino]: received: [ 347, 966, 9448 ] 01010101010110100101011010100101100101010110011102
23:38:31debug [pimatic-homeduino]: data: "RF receive 347 966 9448 0 0 0 0 0 01010101010110100101011010100101100101010110011102"

Dim:
debug [pimatic-homeduino]: contact2: { id: 1035831, contact: false }
23:39:06debug [pimatic-homeduino]: switch5: { id: 1035831, unit: 0, all: true, state: true }
23:39:06debug [pimatic-homeduino]: received: [ 342, 982, 1320, 9476 ] 01010101010110100101011010100101100101010101100203
23:39:06debug [pimatic-homeduino]: data: "RF receive 342 982 1320 9476 0 0 0 0 01010101010110100101011010100101100101010101100203"

bright:
debug [pimatic-homeduino]: received: [ 346, 966, 9484 ] 01010101010110100101011010100101100101010101101102
23:39:22debug [pimatic-homeduino]: data: "RF receive 346 966 9484 0 0 0 0 0 01010101010110100101011010100101100101010101101102"
23:39:22debug [pimatic-homeduino]: received: [ 332, 524, 979, 9440 ] 12110212120220200202122020200202201202020202202103
23:39:22debug [pimatic-homeduino]: data: "RF receive 524 979 332 9440 0 0 0 0 01002101012112122121011212122121120121212121121023"

change-color (upper button):
debug [pimatic-homeduino]: contact2: { id: 1035831, contact: false }
23:41:04debug [pimatic-homeduino]: switch5: { id: 1035831, unit: 4, all: false, state: false }
23:41:04debug [pimatic-homeduino]: received: [ 341, 983, 1328, 9500 ] 01010101010110100101011010100101100101010110100203
23:41:04debug [pimatic-homeduino]: data: "RF receive 341 983 1328 9500 0 0 0 0 01010101010110100101011010100101100101010110100203"

change-color (lower button):
debug [pimatic-homeduino]: received: [ 344, 970, 9464 ] 01010101010110100101011010100101100101010110101102
23:41:59debug [pimatic-homeduino]: data: "RF receive 344 970 9464 0 0 0 0 0 01010101010110100101011010100101100101010110101102"

color wheel Red:
debug [pimatic-homeduino]: received: [ 346, 968, 9504 ] 01010101010110100101011010100101010101101010011102
23:43:44debug [pimatic-homeduino]: data: "RF receive 346 968 9504 0 0 0 0 0 01010101010110100101011010100101010101101010011102"

color wheel Green:
debug [pimatic-homeduino]: received: [ 345, 969, 9504 ] 01010101010110100101011010100101010110101001101102
23:45:02debug [pimatic-homeduino]: data: "RF receive 345 969 9504 0 0 0 0 0 01010101010110100101011010100101010110101001101102"

color wheel Blue:
debug [pimatic-homeduino]: contact2: { id: 1035839, contact: false }
23:45:59debug [pimatic-homeduino]: switch7: { unit: 3, id: 1, state: true }
23:45:59debug [pimatic-homeduino]: switch5: { id: 1035839, unit: 0, all: true, state: true }
23:45:59debug [pimatic-homeduino]: received: [ 341, 1000, 9492 ] 01010101010110100101011010100101010101010110010102
23:45:59debug [pimatic-homeduino]: data: "RF receive 341 1000 9492 0 0 0 0 0 01010101010110100101011010100101010101010110010102"

On the color wheel it was tricky, because i'm not sure if the color I picked is only reb/green/blue.

Fault in 0.0.59 release

The 0.0.59 release on npmjs.org contains an error in `lib/protocols/switch13.js' that is causing an issue starting pimatic (pimatic/pimatic-homeduino#91).

$ mkdir rfcontroljs-0.0.58
$ mkdir rfcontroljs-0.0.59
$ wget https://registry.npmjs.org/rfcontroljs/-/rfcontroljs-0.0.58.tgz
$ wget https://registry.npmjs.org/rfcontroljs/-/rfcontroljs-0.0.59.tgz
$ tar x -C rfcontroljs-0.0.58/ -f rfcontroljs-0.0.58.tgz
$ tar x -C rfcontroljs-0.0.59/ -f rfcontroljs-0.0.59.tgz

$ hexdump -C rfcontroljs-0.0.58/package/lib/protocols/switch13.js | head
00000000  6d 6f 64 75 6c 65 2e 65  78 70 6f 72 74 73 20 3d  |module.exports =|
00000010  20 66 75 6e 63 74 69 6f  6e 28 68 65 6c 70 65 72  | function(helper|
00000020  29 20 7b 0a 20 20 76 61  72 20 62 69 6e 61 72 79  |) {.  var binary|
00000030  54 6f 50 75 6c 73 65 2c  20 70 72 6f 74 6f 63 6f  |ToPulse, protoco|
00000040  6c 49 6e 66 6f 2c 20 70  75 6c 73 65 73 54 6f 42  |lInfo, pulsesToB|
00000050  69 6e 61 72 79 4d 61 70  70 69 6e 67 3b 0a 20 20  |inaryMapping;.  |
00000060  70 75 6c 73 65 73 54 6f  42 69 6e 61 72 79 4d 61  |pulsesToBinaryMa|
00000070  70 70 69 6e 67 20 3d 20  7b 0a 20 20 20 20 27 31  |pping = {.    '1|
00000080  30 27 3a 20 27 31 27 2c  0a 20 20 20 20 27 30 31  |0': '1',.    '01|
00000090  27 3a 20 27 30 27 2c 0a  20 20 20 20 27 32 27 3a  |': '0',.    '2':|

$ hexdump -Cv rfcontroljs-0.0.59/package/lib/protocols/switch13.js | head
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  72 20 62 69 6e 61 72 79  |........r binary|
00000030  54 6f 50 75 6c 73 65 2c  20 70 72 6f 74 6f 63 6f  |ToPulse, protoco|
00000040  6c 49 6e 66 6f 2c 20 70  75 6c 73 65 73 54 6f 42  |lInfo, pulsesToB|
00000050  69 6e 61 72 79 4d 61 70  70 69 6e 67 3b 0a 20 20  |inaryMapping;.  |
00000060  70 75 6c 73 65 73 54 6f  42 69 6e 61 72 79 4d 61  |pulsesToBinaryMa|
00000070  70 70 69 6e 67 20 3d 20  7b 0a 20 20 20 20 27 31  |pping = {.    '1|
00000080  30 27 3a 20 27 31 27 2c  0a 20 20 20 20 27 30 31  |0': '1',.    '01|
00000090  27 3a 20 27 30 27 2c 0a  20 20 20 20 27 32 27 3a  |': '0',.    '2':|

There are 40 0-bytes in switch13.js file. These are not in the repo. Recreating and uploading the release might fix it.

Request : (new) protocol for Intertechno Shutterswitch CMR500

Hi,

I have a Intertechno shutter CMR-500 as well as remote control ITZ-500.
The shutter is working in pilight by using "elro-hc" protocol. But pilight is only able to open and close the shutter completely - not stopping the shutter in the middle of the window...

So I tried to control the shutter by pimatic and available class": "HomeduinoRFShutter" . I tried all switching protocols but without success :-(

This problem is equal to an earlier issue from "leader21". But the solution for switch4 protocol is not working in my case.

That' s why I used the 'RF receive' command to track the RF signal from remote control.
Systemcode A - unitcode 1 --> State on
0101 0101 0101 0101 0101 0101 0101 0101 0101 0110 0110 0110 02
Systemcode A - unitcode 2 --> State on
0101 0101 0101 0101 0110 0101 0101 0101 0101 0110 0110 0110 02
Systemcode A - unitcode 3 --> State on
0101 0101 0101 0101 0101 0110 0101 0101 0101 0110 0110 0110 02
Systemcode A - unitcode4 --> State on
0101 0101 0101 0101 0110 0110 0101 0101 0101 0110 0110 0110 02
Systemcode A - unitcode 16 --> State on
0101 0101 0101 0101 0110 0110 0110 0110 0101 0110 0110 0110 02
Systemcode B - unitcode 1 --> State on
0110 0101 0101 0101 0101 0101 0101 0101 0101 0110 0110 0110 02
Systemcode B - unitcode 2 --> State off
0110 0101 0101 0101 0110 0101 0101 0101 0101 0110 0110 0101 02

The schema seems to be as follow
pulseCount: 50
systemcode: 0-3
unicode: 4-7
?: 8 --> fix 0101
?: 9 --> fix 0110
?:10 --> fix 0110
state: 11

When we use '0' as "0101" and '1' / 'F' as '0110', so we can use the following overview for system- and unit codes
http://www.fhemwiki.de/wiki/Intertechno_Code_Berechnung

According to this schema I'm able to generate each sequence for systemcode and unitcode manually and control the shutter by the 'RF send' on command line, e.g.
RF send 4 3 376 1074 9964 0 0 0 0 0 1100101010101010110010101010101010101100110010102

Could you please support me for choosing the right (available) protocol or could you please implement a new suitable protocol?

Thanks in advance!

Shutter4 protocol - Rohrmotor24 - 5 channel remotes not recognized

I have several 5 channel Rohrmotor24 emotes in my house, but they are not recognized correctly by Homeduino-pimatic plugin.

1 channel remotes are correctly decoded:

22:03:25debug [pimatic-homeduino]: shutter4:  { id: 65542026, channel: '0', all: true, command: 'stop' }
22:03:25debug [pimatic-homeduino]: shutter3:  { id: 65542026, channel: 1, command: 'stop' }
22:03:25debug [pimatic-homeduino]: awning2:  { id: 262168104, command: 'stop' }
22:03:25debug [pimatic-homeduino]: received: [ 364, 732, 1712, 5284, 10560 ] 3201010110101010100110010101010101100110101010010101100110010101100110011001100114
22:03:25debug [pimatic-homeduino]: data: "RF receive 5284 1712 364 732 10560 0 0 0 0123232332323232322332232323232323322332323232232323322332232323322332233223322334"

but 5 channel is not:

debug [pimatic-homeduino]: received: [ 360, 728, 1728, 5124, 10944 ] 3210101010101010110110010101010101011001100101100101101001010101010110011001100114
22:06:04debug [pimatic-homeduino]: data: "RF receive 5124 1728 728 360 10944 0 0 0 0123232323232323223223323232323232322332233232233232232332323232323223322332233224"

Elro HomeEasy HE800 series support

I have a Elro HomeEasy HE878 wallswitch/dimmer (http://www.elro.eu/nl/producten/cat/home-automation/home-easy/ontvangers-dimmen2/dimmer-ontvanger) and a HE850 remotecontrol (http://www.elro.eu/nl/producten/cat/home-automation/home-easy/zenders2/timer-afstandsbediening).

The remote can send 4 different protocols. For the HE800 series receiver I should use protocol 1.
This protocol is not recognized by pimatic.

Is itpossible to create a pimatic protocol for this hardware ? The HE800 series is the latest series (looking at the website).

1 on
08:45:09.441 [pimatic-homeduino] debug: data: "RF receive 301 983 407 5040 0 0 0 0 0101100101100101010101100110101210121212120112010101120103"
08:45:09.482 [pimatic-homeduino] debug: received: [ 301, 407, 983, 5040 ] 0202200202200202020202200220202120212121210221020202210203

1 off
08:45:40.773 [pimatic-homeduino] debug: data: "RF receive 249 997 414 5056 0 0 0 0 0101120101120112010101121201120101120112120101010112120103"
08:45:40.813 [pimatic-homeduino] debug: received: [ 249, 414, 997, 5056 ] 0202210202210221020202212102210202210221210202020221210203

2 on
08:45:57.340 [pimatic-homeduino] debug: data: "RF receive 242 974 421 5052 0 0 0 0 0101120101121212011212011212120101121212011201010112011203"
08:45:57.381 [pimatic-homeduino] debug: received: [ 242, 421, 974, 5052 ] 0202210202212121022121022121210202212121022102020221022103

2 off
08:46:15.359 [pimatic-homeduino] debug: data: "RF receive 241 978 426 5052 0 0 0 0 0101120101120112011201121201121212120101011212011201011203"
08:46:15.399 [pimatic-homeduino] debug: received: [ 241, 426, 978, 5052 ] 0202210202210221022102212102212121210202022121022102022103

3 on
08:46:32.925 [pimatic-homeduino] debug: data: "RF receive 981 429 232 5052 0 0 0 0 0101012020012001012020010120012020200120202001010120200123"
08:46:32.965 [pimatic-homeduino] debug: received: [ 232, 429, 981, 5052 ] 2121210202210221210202212102210202022102020221212102022103

3 off
08:46:47.311 [pimatic-homeduino] debug: data: "RF receive 979 331 5028 0 0 0 0 0 0101011010010110101001100110011001011001011010100101100112"
08:46:47.352 [pimatic-homeduino] debug: received: [ 331, 979, 5028 ] 1010100101101001010110011001100110100110100101011010011002

4 on
08:47:02.394 [pimatic-homeduino] debug: data: "RF receive 246 987 415 5044 0 0 0 0 0112120101121212010101121201120112011212011201010101120103"
08:47:02.435 [pimatic-homeduino] debug: received: [ 246, 415, 987, 5044 ] 0221210202212121020202212102210221022121022102020202210203

4 off
08:47:19.299 [pimatic-homeduino] debug: data: "RF receive 234 952 430 5048 0 0 0 0 0112120101121201121212120112121212010112120112120112120103"
08:47:19.338 [pimatic-homeduino] debug: received: [ 234, 430, 952, 5048 ] 0221210202212102212121210221212121020221210221210221210203

5 on
08:47:30.808 [pimatic-homeduino] debug: data: "RF receive 974 335 5048 0 0 0 0 0 0101011010011001101001010101100110101010010101010101101012"
08:47:30.849 [pimatic-homeduino] debug: received: [ 335, 974, 5048 ] 1010100101100110010110101010011001010101101010101010010102

5 off
08:47:39.348 [pimatic-homeduino] debug: data: "RF receive 983 425 233 5044 0 0 0 0 0101012020012001010120200120200120200120200101200101202023"
08:47:39.387 [pimatic-homeduino] debug: received: [ 233, 425, 983, 5044 ] 2121210202210221212102022102022102022102022121022121020203

6 on
08:47:57.018 [pimatic-homeduino] debug: data: "RF receive 240 994 422 5044 0 0 0 0 0112120101120112120112010112010112010112121201010112010103"
08:47:57.058 [pimatic-homeduino] debug: received: [ 240, 422, 994, 5044 ] 0221210202210221210221020221020221020221212102020221020203

6 off
08:48:07.766 [pimatic-homeduino] debug: data: "RF receive 234 972 432 5036 0 0 0 0 0112120101121201011201121212010112121201011212120112010103"
08:48:07.815 [pimatic-homeduino] debug: received: [ 234, 432, 972, 5036 ] 0221210202212102022102212121020221212102022121210221020203

7 on
08:48:24.577 [pimatic-homeduino] debug: data: "RF receive 973 336 5044 0 0 0 0 0 0110011010010101100101010110101001100101010110100110011012"
08:48:24.616 [pimatic-homeduino] debug: received: [ 336, 973, 5044 ] 1001100101101010011010101001010110011010101001011001100102

7 off
08:48:45.254 [pimatic-homeduino] debug: data: "RF receive 977 414 230 5056 0 0 0 0 0120012010010101200101200120010101200101012020202020012023"
08:48:45.294 [pimatic-homeduino] debug: received: [ 230, 414, 977, 5056 ] 2102210212212121022121022102212121022121210202020202210203

8 on
08:48:58.376 [pimatic-homeduino] debug: data: "RF receive 970 429 228 5044 0 0 0 0 0101012020010101012001012020010120010120202001200120012023"
08:48:58.418 [pimatic-homeduino] debug: received: [ 228, 429, 970, 5044 ] 2121210202212121210221210202212102212102020221022102210203

8 off
08:49:10.166 [pimatic-homeduino] debug: data: "RF receive 976 421 237 5044 0 0 0 0 0101012020010101200101202020012001200101010120202020012023"
08:49:10.207 [pimatic-homeduino] debug: received: [ 237, 421, 976, 5044 ] 2121210202212121022121020202210221022121212102020202210203

9 on
08:49:23.626 [pimatic-homeduino] debug: data: "RF receive 235 984 435 5052 0 0 0 0 0101120101121201011201010101010101121212121212120101121203"
08:49:23.665 [pimatic-homeduino] debug: received: [ 235, 435, 984, 5052 ] 0202210202212102022102020202020202212121212121210202212103

9 off
08:49:41.034 [pimatic-homeduino] debug: data: "RF receive 234 973 429 5044 0 0 0 0 0101120101121212011201120101011201120101011212121212121203"
08:49:41.074 [pimatic-homeduino] debug: received: [ 234, 429, 973, 5044 ] 0202210202212121022102210202022102210202022121212121212103

10 on
08:49:54.206 [pimatic-homeduino] debug: data: "RF receive 245 986 419 5048 0 0 0 0 0101120101120112010101121212011212010101121201121212010103"
08:49:54.246 [pimatic-homeduino] debug: received: [ 245, 419, 986, 5048 ] 0202210202210221020202212121022121020202212102212121020203

10 off
08:50:04.769 [pimatic-homeduino] debug: data: "RF receive 256 991 407 5040 0 0 0 0 0101120101120112120101121212120112010112010112120101010103"
08:50:04.809 [pimatic-homeduino] debug: received: [ 256, 407, 991, 5040 ] 0202210202210221210202212121210221020221020221210202020203

Creating a RAW switch

I have created a RAW switch which outputs the set pulses directly to pimatic:

The protocol src/protocols/raw.coffee

module.exports = (helper) ->
  return protocolInfo = {
    name: 'raw'
    type: 'switch'
    values:
      pulseCount:
        type: "number"
      pulseLengths:
        type: "object"
      pulsesOn:
        type: "string"
      pulsesOff:
        type: "string"
    brands: ["RAW"]
    pulseLengths: []
    pulseCount: 0
    decodePulses: (pulses) ->
      # Currently only encodeMessage is supported
      return null
    encodeMessage: (message) ->
      this.pulseLengths =  message.pulseLengths
      pulses = (if message.state then message.pulsesOn else message.pulsesOff )
      return pulses
  }

I also needed to update src/controller.coffee, I switched lines 171 and 172 so the protocol.pulseLengths is read after protocol.encodeMessage(message) is executed
from:

171       pulseLengths: protocol.pulseLengths
172       pulses: protocol.encodeMessage(message)

to:

171       pulses: protocol.encodeMessage(message)
172       pulseLengths: protocol.pulseLengths

The config in pimatic:

    {
      "id": "test-raw",
      "name": "Test RAW",
      "class": "HomeduinoRFSwitch",
      "protocols": [
        {
          "name": "raw",
          "options": {
            "pulseCount": 58,
            "pulseLengths": [
              222,
              438,
              952,
              5028
            ],
            "pulsesOn": "2121210202210202212102020221212121022102212121212102022103",
            "pulsesOff": "2121210202210221020202212121022102210202020221210221022103"
          },
          "send": true,
          "receive": false
        }
      ]
    }

How should I be able to also support decodePulses?

Protocol request: Eurodomest 972080

I got this RF device, very cheap to get at Action.

I got this data from it, is it enough to get this in a protocol?
First run all buttons.

1 ON
RF receive 284 888 346 9660 0 0 0 0 01010110010101011010100110011001010101011010101002
1 OFF
RF receive 295 886 9626 0 0 0 0 0  01010110010101011010100110011001010101011010100102
2 ON
RF receive 294 887 9620 0 0 0 0 0 01010110010101011010100110011001010101011010011002
2 OFF
RF receive 294 887 9636 0 0 0 0 0 01010110010101011010100110011001010101011010010102
3 ON
RF receive 245 915 319 9621 0 0 0 0 01010110010101011010100110011001010101011001101002
3 OFF
RF receive 287 891 360 9621 0 0 0 0 01010110010101011010100110011001010101011001100102
4 ON
RF receive 289 892 9652 0 0 0 0 0 01010110010101011010100110011001010101010110101002
4 OFF
RF receive 291 891 9617 0 0 0 0 0 01010110010101011010100110011001010101010110100102
All ON
RF receive 282 892 357 9632 0 0 0 0 01010110010101011010100110011001010101010101100102
All OFF
RF receive 282 894 416 9604 0 0 0 0 01010110010101011010100110011001010101010101011002

img 2014-10-14 13 10 42
img 2014-10-14 13 10 16
img 2014-10-14 13 10 30

New switch eHome and REV

Hi,
just installed everything and it's working great! Really like this solution and I want to replace my pilight installation with it.

I need a couple new protocols..for now one for REV devices (rev2 with pilight) and more important, one for eHome.
In pilight we couldn't finish the development yet, see: http://forum.pilight.org/Thread-eHome-Switches

So I started adding support for the eHome switch: https://github.com/georg90/rfcontroljs/

Now I have a couple of questions:

  1. I have different pulseLenghts (see paste file) for on/off: Should I just add all (in the right order) ?
  2. Whats systemcode / id ? Do I put just some "dummy" values in there? Since I don't know them..
  3. Once the test passes, how do I proceed to implement this protocol ? (Especially regarding pulsesToBinaryMapping values etc. in the switch7.coffee/js)

Thanks! Hope I can get started once somebody cleared this out..so we'll have two more protocols :)

I also added the pulses: http://pastebin.com/eAL05f1F

For rev: http://pastebin.com/8J6Dtn4F

Switch1 dim support

For the KaKu brand we can use the switch1 protocol. Will there be support for dim values soon?
The KaKu protocol supports 15 steps of dim level.
When implementing a dimmer in the config, I would like to suggest to make it optional if a normall ON signal has to be send or allways send a full bright (100%) dim level to the device.

If needed, I can provide debug data from the receiver for the dimlevels.

Flamingo ABR400R

Hi,

I used this device under pilight with the protocol elro_hc, in pimatic it doens't seem to work.
here is a piece of the log
http://pastebin.com/PA1j0v3K

and my device

{
      "id": "beneden-buitenlicht",
      "name": "Buitenlamp",
      "class": "HomeduinoRFSwitch",
      "protocol": "switch3",
      "protocolOptions": {
        "houseCode": 8,
        "unitCode": 27
      }

rc-switch

Is this module similar to rc-switch?
Does it use the same protocols?

DRU Heater support

Hi,

I have a DRU Heater at home. It has a 433Mhz remote that homeduino can receive. I tried to make a protocol with rfcontroljs, but i can't get it to work. Is there someone who can help or create a protocol?

I receive codes like this:

RF receive 298 644 26356 0 0 0 0 0 01101110011010101001101010101010011012"
debug: received: [ 298, 644, 26356 ] 01101110011010101001101010101010011012

and this is the remote (4 buttons).
m_31967

After update current version is 0.8.66 to pimatic-homeduino (0.8.69)

Error loading device Ben_st_lamp: Protocol "rolling1" has no property named "codeOn". Available properties are: "code"

{
  "id": "Ben_st_lamp",
  "name": "Beneden_St_lamp",
  "class": "HomeduinoRFSwitch",
  "protocols": [
    {
      "name": "rolling1",
      "options": {
        "codeOn": [
          "001100000110011110101100",
          "001100101001000000011100",
          "001110110001101101101100",
          "001111101010001101011100"
        ],
        "codeOff": [
          "001100110010110101111100",
          "001101111101010010111100",
          "001110010100100000101100",
          "001111001000000110001100"
        ]
      }
    }
  ]
},

RGB LED strip

Hi folks,

Just started with Pimatic and the rfcontroljs on my Raspberry Pi. Normal (KAKU) rf switches work but my RGB strip give issues.
As I saw in this post, I added my RGB LED strip from Ebay.

"id": "ledstriptuin",
      "name": "Tuin_RGBLED_olijf",
      "class": "HomeduinoRFButtonsDevice",
      "buttons": [
        {
          "id": "on-button",
          "text": "Aan",
          "protocols": [
            {
              "name": "led4",
              "options": {
                "command": "code:00010011",
                "id": 14754
              }
            }
          ]
        },
        {
          "id": "off-button",
          "text": "Uit",
          "protocols": [
            {
              "name": "led4",
              "options": {
                "command": "code:00010011",
                "id": 14754
              }
            }
          ]
        },
        {
          "id": "buttonRed",
          "text": "Rood",
          "protocols": [
            {
              "name": "led4",
              "options": {
                "command": "code:00000010",
                "id": 14754
              }
            }
          ]
        },
        {
          "id": "buttonGreen",
          "text": "Groen",
          "protocols": [
            {
              "name": "led4",
              "options": {
                "command": "code:00001000",
                "id": 14754
              }
            }
          ]
        }
      ]
    }
  ],

I got the following error in pimatic:

error [pimatic]: Error loading device "ledstriptuin": Protocol "led4" can´t handle the command "code:00010011". Available commands are: "on/off, bright+, bright-, color-, color+"
error [pimatic]: Error loading device "ledstriptuin": Protocol "led1" can´t handle the command "code:00010011". Available commands are: "on/off, up, down"

As you can see i tried with led 4 and led 1 protocol. I coppied the command codes from the log messages window.
What am i doing wrong? Thank you in advance

Add support for the wp515s doorbell protocol

I reconstructed the protocol using a 433 receiver hooked up to the mic input of my computer to record the pulse sequences. From that I constructed the protocol.

Using the homeduino transmission works, but reception fails.

Using the simulate tool of the homeduino and protocol timing as
295, 590,295,590,295,590,295,590,295, 295,590,295,590,295,590,590,295,295,590,590,295,295,590,9864,
295, 590,295,590,295,590,295,590,295, 295,590,295,590,295,590,590,295,295,590,590,295,295,590,9864,
...
reveals that it restarts detecting at
rec_pos= 23 pack_pos= 23 duration= 2466 => restart package => start recoding

no clue why....
I did not do a deep dive into the homeduino code, but others seem to have problems with the current implementation of the doorbell3 protocol (for which a pull is still pending)

Homeduino / openHAB integration

Dear maintainers,

I used pimatic for some time but felt more comfortable with openHAB (also because I'm a fulltime java developer). However I still think that homeduino could be a great addition in combination with openHAB.

So a long time ago I started playing with the idea to make a binding to be able to connect the Homeduino to openHAB, to get some feeling of the process you can read along on the following thread: https://community.openhab.org/t/interest-in-a-homeduino-binding/8017

However to be able to parse the protocols as they are returned by the homeduino I used the source of rfcontroljs. I did not literally copy code because its not compatible but I definitely used ideas and of course the efforts of people to reverse engineer the protocols. Do you think that there are any objections to this given that I'll make sure that there is proper crediting to the Homeduino & RFControlJs projects?

Thank you very much for your time!

Conrad S3318P (TFA) not recognized

Hi,

I tested the sensor with pilight before, it worked using the following protocol:
http://wiki.pilight.org/doku.php/tfa_v6_0 (The photo in the pilight wiki is showing exactly my sensor model).

Here is what i get from pimatic-homeduino debug log when i press the "TX" button on the sensor:

22:58:13.427 [pimatic-homeduino] debug: data: "RF receive 598 1875 3785 7610 0 0 0 0 0101010201010201020101020101010202010201010101020201010102010101020102010201010101010303"
22:58:13.444 [pimatic-homeduino] debug: received: [ 598, 1875, 3785, 7610 ] 0101010201010201020101020101010202010201010101020201010102010101020102010201010101010303
22:58:13.863 [pimatic-homeduino] debug: data: "RF receive 591 1883 3788 7612 0 0 0 0 0101010201010201020101020101010202010201010101020201010102010101020102010201010101010303"
22:58:13.879 [pimatic-homeduino] debug: received: [ 591, 1883, 3788, 7612 ] 0101010201010201020101020101010202010201010101020201010102010101020102010201010101010303

22:58:18.358 [pimatic-homeduino] debug: data: "RF receive 596 1877 3787 7618 0 0 0 0 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303"
22:58:18.374 [pimatic-homeduino] debug: received: [ 596, 1877, 3787, 7618 ] 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303
22:58:18.811 [pimatic-homeduino] debug: data: "RF receive 583 1891 3800 7637 0 0 0 0 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303"
22:58:18.829 [pimatic-homeduino] debug: received: [ 583, 1891, 3800, 7637 ] 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303

22:58:21.358 [pimatic-homeduino] debug: data: "RF receive 598 1872 3788 7612 0 0 0 0 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303"
22:58:21.375 [pimatic-homeduino] debug: received: [ 598, 1872, 3788, 7612 ] 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303
22:58:21.811 [pimatic-homeduino] debug: data: "RF receive 583 1889 3803 7633 0 0 0 0 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303"
22:58:21.827 [pimatic-homeduino] debug: received: [ 583, 1889, 3803, 7633 ] 0101010201010201020101020101010202010201010101020201010201010101020102010201020201020303

I wanted to switch over to pimatic using my existing sensors. Maybe there is a possibility to implement this sensor?

Elro Home Easy HE877 switch problem

Elro Home Easy HE877 switch working with protocol "switch 2".
I have a problem with the receiving mode.
On receiver mode decode the off command from the remote control but the on command decode the same result off.

Debug
ON
switch3: { houseCode: 22, unitCode: 10, state: false }
switch2: { houseCode: 22, unitCode: 10, state: false }

OFF
switch3: { houseCode: 22, unitCode: 10, state: true }
switch2: { houseCode: 22, unitCode: 10, state: false }

Any help......

Error with Led2 device

Since (I think) yesterday I get an error on a Led2 device which has until now worked fine. I configured it half a year ago and haven't had any real trouble with it.
Error loading device rfswitch-ledstrip-keuken: "led2" must be one of the following types: "switch, dimmer"
Is the Led2 protocol not recognised as dimmer anymore?

The device configuration:
{
"id": "rfswitch-ledstrip-keuken",
"name": "LEDstrip keuken",
"class": "HomeduinoRFDimmer",
"protocols": [
{
"name": "led2",
"options": {
"id": 2977,
"command": "on/off"
},
"send": true,
"receive": false
}
]
},

Add support for GT-3000 / GT-FSI-10

Is it still possible to add support for additional protocols?
The auto discovery shows only rolling switch. Use the protocol with the codes from debug do not work.

Here is the debug for Button A on (only this one)

rolling1:  { code: '010000110110000000110000' }
received: [ 356, 652, 1068, 2872, 7260 ] 02210202020221210221210202020202020221210202020234

data: "RF receive 356 1068 652 2872 7260 0 0 0 01120101010112120112120101010101010112120101010134"

rolling1:  { code: '010010010100111110110000' }
received: [ 360, 644, 1020, 2896, 7228 ] 02210202210202210221020221212121210221210202020234

data: "RF receive 360 1020 644 2896 7228 0 0 0 01120101120101120112010112121212120112120101010134"

rolling1:  { code: '010000101100111001110000' }
received: [ 364, 640, 1036, 2876, 7236 ] 02210202020221022121020221212102022121210202020234

data: "RF receive 364 1036 640 2876 7236 0 0 0 01120101010112011212010112121201011212120101010134"

rolling1:  { code: '010011001011011101000000' }
received: [ 368, 640, 1032, 2884, 7304 ] 02210202212102022102212102212121022102020202020234

data: "RF receive 368 1032 640 2884 7304 0 0 0 01120101121201011201121201121212011201010101010134"

rolling1:  { code: '010000110110000000110000' }
received: [ 380, 624, 1060, 2904, 7232 ] 02210202020221210221210202020202020221210202020234

data: "RF receive 380 1060 624 2904 7232 0 0 0 01120101010112120112120101010101010112120101010134"

rolling1:  { code: '010010010100111110110000' }
received: [ 368, 640, 1020, 2888, 7252 ] 02210202210202210221020221212121210221210202020234

data: "RF receive 368 1020 640 2888 7252 0 0 0 01120101120101120112010112121212120112120101010134"

Require assistance

Hi guys,

Sorry to bother but I'm quite a noob in most of the subjects here and I'm a bit lost. I'm trying to replicate the signal of the remote control for projection screen.

I tried many lib, but only RFControl look to give me feedback.

b: 612 244 144 5204 0 0 0 0 
t: 001200120202001012020012020010101012001010101200120012020202001012020202020201001202010202020202020200120200120202001201001012010013

I understand the pulse lengths are [144, 244, 612, 5204](not exactly doubled each times :s). The pulse count is 132 and the pulse sequence is written above.

The protocols with a pulse count of 132 are:

  • contact1.js [268, 1282, 2632, 10168]
  • pir5 [268, 1282, 2632, 10168]
  • switch1.js [268, 1282, 2632, 10168]
  • switch17.js [260, 2680, 1275, 10550]

None of those have a close pulse length.

I'd like hints to:

  1. Identify the next steps
  2. Get a few instruction on which file to edit, where and how to run tests with gulp (not very familliar)

I opened a Stackoverflow without answer since weeks, I'm now trying to contact any of you.

Thank you in advance, once again sorry to rise an issue for that.

Best,
PJ

Shutter 3 - Add "program" command mode

https://forum.pimatic.org/topic/2203/need-protocol-for-program-button

21:41:14debug [pimatic-homeduino]: shutter3:  { id: 302736933, channel: 1, command: undefined }
21:41:14debug [pimatic-homeduino]: received: [ 356, 720, 1524, 4692, 8672 ] 3210010110010101010110011010011010010110100101011001011001100101101010010110100104
21:41:14debug [pimatic-homeduino]: data: "RF receive 4692 1524 720 356 8672 0 0 0 0123323223323232323223322323322323323223233232322332322332233232232323323223233234"

Request: Protocol Auriol-Wetterstation Z31601A-RX

I have a WeatherStation with a protocol that i cant understand.

RAW:
988, 1032, 984, 1032, 980, 1036, 980, 1032, 556, 7920, 532, 4124, 544, 4096, 548, 4092,
548, 1988, 544, 1808, 548, 4092, 548, 1896, 544, 1988, 548, 4000, 548, 4096, 544, 4096,
548, 1988, 544, 1804, 548, 4092, 548, 4096, 548, 1984, 548, 1804, 548, 4092, 548, 4096,
544, 1988, 544, 1808, 548, 4092, 548, 1892, 548, 1988, 548, 4000, 548, 4096, 544, 4096,
548, 4184, 548, 4004, 544, 1896, 548, 1896, 544, 1988, 548, 1804, 548, 4092, 548, 4096,
544, 4188, 548, 1800, 548, 1896, 548, 1896, 544, 4116, 592, 16056

18,8°C
70%
b: 1009 548 7920 4096 1895 16052 0 0
t: 00000000121313131413131314141413141413141414131314141414131314141414131313141414141414141315

-0,7°C
49%
b: 990 524 7828 4125 1915 16076 0 0
t: 00000000121313131413131314141414141413131414131414131413131413131414131413141413131414141315

-19,4°C
53%
b: 980 533 7936 4119 1899 16056 0 0
t: 00000000121313131413131314131414131413131414141313141313141413131414131413141413131414141315

-17,5°C
57%
b: 979 534 7940 4116 1901 16060 0 0
t: 00000000121313131413131314141314141413141314141313131414141314141314131413141313131414141315

-13,4°C
65%
b: 991 531 7856 4121 1903 16060 0 0
t: 00000000121313131413131314141314141413141314141313131314131414131414131314141314131414141315

-10.2°C
72%
b: 990 526 7856 4124 1912 16080 0 0
t: 00000000121313131413131314141413141413141314131414141414141314131314131313141413141414141315

-7,0°C
77%
b: 990 526 7828 4130 1903 16076 0 0
t: 00000000121313131413131314131314131413141314131414141314141413141314131313141313131414141315

18,8°C
71%
b: 990 526 7828 4130 1903 16076 0 0
t: 00000000121313131413131314141314131413141314131314141414131314141414131313141414131414141315

I think only the first and the last Data are right. Its look that the station make a interpolation or so.

doorbell1.coffee encode message state incorrect?

encodeMessage: (message) ->
      id  = helper.map(helper.numberToBinaryLSBMSB(message.id, 12), binaryToPulse)
      unit = helper.map(helper.numberToBinaryLSBMSB(message.unit, 11), binaryToPulse)
      state = (if message.state then binaryToPulse['0'] else binaryToPulse[''])
return "#{id}#{unit}#{state}02"

should state line be

      state = (if message.state then binaryToPulse['0'] else binaryToPulse['1'])

?

Add weather 19 Landmann BBQ Thermometer

See here: https://forum.pimatic.org/topic/1768/protocol-for-thermometer
weather19.js:

module.exports = function(helper) {
  var protocolInfo, pulsesToBinaryMapping;
  pulsesToBinaryMapping = {
    '01': '0',
    '02': '1',
    '03': ''
  };
  return protocolInfo = {
    name: 'weather19',
    type: 'weather',
    values: {
      temperature: {
        type: "number"
      },
      id: {
        type: "number"
      },
      channel: {
        type: "number"
      },
    },
    brands: ["Landmann BBQ Thermometer"],
    pulseLengths: [548, 1008, 1996, 3936],
    pulseCount: 66,
    decodePulses: function(pulses) {
     /*
      Pulse like:
      |020202010101|0101|01010101010101020101010102010201|0201010102010202|03|
      | 1 1 1 0 0 0| 0 0| 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0| 1 0 0 0 1 0 1 1|  |
      |ID          | CH |            Temperature         |?               |  |
      |56          |  1 |            266(26.6)           |?               |  |
    */
      var binary, result;
      binary = helper.map(pulses, pulsesToBinaryMapping);
      return result = {
        id: helper.binaryToNumber(binary, 0, 5),
        temperature: helper.binaryToSignedNumber(binary, 8, 23) / 10,
        channel: helper.binaryToNumber(binary, 6, 7) + 1,
      };
    }
  };
};

weather19.coffee:

module.exports = (helper) ->
  pulsesToBinaryMapping = {
    '01': '0' #binary 0
    '02': '1' #binary 1
    '03': ''  #footer
  }
  return protocolInfo = {
    name: 'weather19'
    type: 'weather'
    values:
      temperature:
        type: "number"
      id:
        type: "number"
      channel:
        type: "number"
    brands: ["Landmann BBQ Thermometer"]
    pulseLengths: [548, 1008, 1996, 3936]
    pulseCount: 66
    decodePulses: (pulses) ->
      # pulses is something like: '020202010101010101010101010101020101010102010201020101010201020203'
      # we first map the pulse sequences to binary
      binary = helper.map(pulses, pulsesToBinaryMapping)
      # binary is now something like: '11100000000000010000101010001011'
      # now we extract the temperature and humidity from that string
      #1110 0000 0000 0001 0000 1010 1000 1011
      # IIII IICC TTTT TTTT TTTT TTTT xxxx xxxx
      #0    4    8    12   16   20   24   28  
      # I: Device ID, 6-bit unsigned Int
      # C: Channel (2 bits + 1, 00=1, 01=2, 10=3)  
      # T: Temperature Value, 16-bit signed Int (divide decimal by 10)
      # x: Unused
      return result = {
        id: helper.binaryToNumber(binary, 0, 5)
        channel: helper.binaryToNumber(binary, 6, 7) + 1
        temperature: helper.binaryToSignedNumber(binary, 8, 23) / 10
      }
}

lib-controller.coffee part

      protocol: 'weather19'
      pulseLengths: [548, 1008, 1996, 3936]
      pulses: [
        '020202010101010101010101010101020101010102010201020101010201020203'
        '020102020102010101010101010101020101020101020201010102020201020203'
        '020102020102010101010101010101020101020201010101020102010102010203'
        '020102020102010101010101010101020202010102020101020102010101010203'
      ]
      values: [
        { id: 56, channel: 1, temperature: 26.6 }
        { id: 45, channel: 1, temperature: 29.4 }
        { id: 45, channel: 1, temperature: 30.4 }
        { id: 45, channel: 1, temperature: 46.0 }
      ]
    },

controller.js including changes for weather 17 and 18

var doesProtocolMatch, helper, protocols, sortIndices,
  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

helper = require('./helper');

protocols = ['weather1', 'weather2', 'weather3', 'weather4', 'weather5', 'weather6', 'weather7', 'weather8', 'weather9', 'weather10', 'weather11', 'weather12', 'weather13', 'weather14', 'weather15', 'weather16', 'weather17', 'weather18', 'weather19', 'switch1', 'switch2', 'switch3', 'switch4', 'switch5', 'switch6', 'switch7', 'switch8', 'switch9', 'switch10', 'switch11', 'switch12', 'switch13', 'switch14', 'switch15', 'switch16', 'switch17', 'switch18', 'switch19', 'switch20', 'switch21', 'switch22', 'switch23', 'switch24', 'switch25', 'switch26', 'switch27', 'switch28', 'rolling1', 'dimmer1', 'dimmer2', 'pir1', 'pir2', 'pir3', 'pir4', 'pir5', 'contact1', 'contact2', 'contact3', 'generic', 'generic2', 'alarm1', 'alarm2', 'led1', 'led2', 'led3', 'led4', 'doorbell1', 'doorbell2', 'doorbell3', 'awning1', 'awning2', 'shutter1', 'shutter3', 'shutter4', 'shutter5', 'rawswitch'];

protocols = protocols.map((function(_this) {
  return function(p) {
    return require("./protocols/" + p)(helper);
  };
})(this));

doesProtocolMatch = function(pulseLengths, pulses, protocol) {
  var i, maxDelta, _ref;
  if (protocol.pulseCounts != null) {
    if (_ref = pulses.length, __indexOf.call(protocol.pulseCounts, _ref) < 0) {
      return false;
    }
  } else {
    if (pulses.length !== protocol.pulseCount) {
      return false;
    }
  }
  if (pulseLengths.length !== protocol.pulseLengths.length) {
    return false;
  }
  i = 0;
  while (i < pulseLengths.length) {
    maxDelta = pulseLengths[i] * 0.4;
    if (Math.abs(pulseLengths[i] - protocol.pulseLengths[i]) > maxDelta) {
      return false;
    }
    i++;
  }
  return true;
};

sortIndices = function(array) {
  var e, i, indices, j, tuple, tuples, _i, _j, _len, _len1;
  tuples = new Array(array.length);
  for (i = _i = 0, _len = array.length; _i < _len; i = ++_i) {
    e = array[i];
    tuples[i] = [e, i];
  }
  tuples.sort(function(left, right) {
    if (left[0] < right[0]) {
      return -1;
    } else {
      return 1;
    }
  });
  indices = new Array(array.length);
  for (j = _j = 0, _len1 = tuples.length; _j < _len1; j = ++_j) {
    tuple = tuples[j];
    indices[tuple[1]] = j;
  }
  return indices;
};

module.exports = {
  debug: false,
  compressTimings: function(timings) {
    var bucket, buckets, counts, hasMatch, i, j, pulses, sums, timing, _i, _j, _k, _len, _len1, _len2;
    pulses = '';
    buckets = [];
    sums = [];
    counts = [];
    for (i = _i = 0, _len = timings.length; _i < _len; i = ++_i) {
      timing = timings[i];
      hasMatch = false;
      for (j = _j = 0, _len1 = buckets.length; _j < _len1; j = ++_j) {
        bucket = buckets[j];
        if (Math.abs(bucket - timing) < bucket * 0.5) {
          pulses += j;
          sums[j] += timing;
          counts[j]++;
          hasMatch = true;
        }
      }
      if (!hasMatch) {
        pulses += buckets.length;
        buckets.push(timing);
        sums.push(timing);
        counts.push(1);
      }
    }
    for (j = _k = 0, _len2 = buckets.length; _k < _len2; j = ++_k) {
      bucket = buckets[j];
      buckets[j] = Math.round(sums[j] / counts[j]);
    }
    return {
      buckets: buckets,
      pulses: pulses
    };
  },
  prepareCompressedPulses: function(input) {
    var parts, pulseLengths, pulses;
    parts = input.split(' ');
    pulseLengths = parts.slice(0, 8);
    pulses = parts[8];
    pulseLengths = pulseLengths.filter(function(puls) {
      return puls !== '0';
    }).map(function(puls) {
      return parseInt(puls, 10);
    });
    return this.sortCompressedPulses(pulseLengths, pulses);
  },
  sortCompressedPulses: function(pulseLengths, pulses) {
    var sortedIndices;
    sortedIndices = sortIndices(pulseLengths);
    pulseLengths.sort(function(l, r) {
      return l - r;
    });
    pulses = helper.mapByArray(pulses, sortedIndices);
    return {
      pulseLengths: pulseLengths,
      pulses: pulses
    };
  },
  fixPulses: function(pulseLengths, pulses) {
    var i, newPulseLength, newPulseLengths, newPulses;
    if (pulseLengths.length <= 3) {
      return null;
    }
    i = 1;
    while (i < pulseLengths.length) {
      if (pulseLengths[i - 1] * 2 < pulseLengths[i]) {
        i++;
        continue;
      }
      newPulseLength = Math.floor((pulseLengths[i - 1] + pulseLengths[i]) / 2);
      newPulseLengths = pulseLengths.slice();
      newPulseLengths.splice(i - 1, 2, newPulseLength);
      break;
    }
    if (i === pulseLengths.length) {
      return null;
    }
    newPulses = pulses;
    while (i < pulseLengths.length) {
      newPulses = newPulses.replace(new RegExp("" + i, 'g'), "" + (i - 1));
      i++;
    }
    return {
      pulseLengths: newPulseLengths,
      pulses: newPulses
    };
  },
  decodePulses: function(pulseLengths, pulses) {
    var err, fixed, p, results, values, _i, _len;
    results = [];
    for (_i = 0, _len = protocols.length; _i < _len; _i++) {
      p = protocols[_i];
      if (doesProtocolMatch(pulseLengths, pulses, p)) {
        try {
          values = p.decodePulses(pulses);
          results.push({
            protocol: p.name,
            values: values
          });
        } catch (_error) {
          err = _error;
          if (this.debug) {
            if (err instanceof helper.ParsingError) {
              console.log("Warning trying to parse message with protocol " + p.name + ": " + err.message);
              console.log("" + (err.stack.split("\n")[2]));
            } else {
              throw err;
            }
          }
        }
      }
    }
    fixed = this.fixPulses(pulseLengths, pulses);
    if (fixed == null) {
      return results;
    }
    return results.concat(this.decodePulses(fixed.pulseLengths, fixed.pulses));
  },
  encodeMessage: function(protocolName, message) {
    var p, protocol, _i, _len;
    protocol = null;
    for (_i = 0, _len = protocols.length; _i < _len; _i++) {
      p = protocols[_i];
      if (p.name === protocolName) {
        protocol = p;
        break;
      }
    }
    if (protocol == null) {
      throw new Error("Could not find a protocol named " + protocolName);
    }
    if (protocol.encodeMessage == null) {
      throw new Error("The protocol has no send report.");
    }
    return {
      pulses: protocol.encodeMessage(message),
      pulseLengths: protocol.pulseLengths
    };
  },
  getAllProtocols: function() {
    return protocols;
  },
  getProtocol: function(protocolName) {
    var p, _i, _len;
    for (_i = 0, _len = protocols.length; _i < _len; _i++) {
      p = protocols[_i];
      if (p.name === protocolName) {
        return p;
      }
    }
    return null;
  }
};

Switch3 (Brennstuhl) switching wrong way

Hey there,
I am using Pimatic with the Homeduino plugin for swiching my remote sockets.
The pruducer is "Brennstuhl" so I use the switch3 protocol which works fine.

There is just one small issue, the switching works the wrong way.
Switching on in the Pimatic GUI turns off the socket and switching off in the GUI turns the socket on.

Add support for the Hideki/UPM protocol for Hama TS33C and other sensors

Unfortunately, the signal sent by sensor is not picked up by homeduino (no debug log output). According to http://forum.pilight.org/Thread-hama-ts33c-temperature-hygrometer the TS33C sensor is using the Hideki/UPM protocol used by various OEM products such as TFA Nexus, Mebus, Irox, Irox-Pro X, Honeywell, Cresta TE923, TE923W, TE821W,
WXR810, DV928, Ventus W906. Another thread indicates the protocl has been reverse engineered, see http://www.wetterstationen.info/forum/entwicklerforum/tx-protokoll-offen-te923-cresta815-irox-(hideki)

The protocol document can be found here http://members.upc.nl/m.beukelaar/Crestaprotocol.pdf

See also http://forum.pimatic.org/topic/807/hama-wheater-sensor-not-showing-up-in-debug-logs

pir recognized as switch

Hello.

My Name is Alex and i use a raspberry Pi B+ with 433mhz sender & reciever with pimatic and homeduino-plugin.

I'm now getting pilight-less with your plugin and my old+new intertechnos and weathersensors works fine. many thanks for your awesome work ;)

ill see your homeduino-plugin has 2 pir-protocolls (pir1, pir2) included and i would use one of them with this PIR-sensor:

http://www.importe-uzman.de//funkalarmanlagen-bewegungsmelder-kompatibel-zonen-anlage-p-4476.html?osCsid=0cd6b4f19f537ee2fd0a0afcf6a33f30

my problem was the rfcontroljs recognized the device as two-protocoll-switch, but i need them as pir

debug [pimatic-homeduino]: switch8: { systemcode: 18, programcode: 'A4', state: false }
debug [pimatic-homeduino]: switch6: { systemcode: 9, programcode: 28, state: true }
debug [pimatic-homeduino]: received: [ 170, 514, 5318 ] 01010110011001010110011001100101101010100101010102
debug [pimatic-homeduino]: data: "RF receive 170 514 5318 0 0 0 0 0 01010110011001010110011001100101101010100101010102"

I try to add following lines in my config - but useless and give me error outputs

{
  "id": "homeduino-pir",
  "name": "PIR",
  "class": "HomeduinoRFPir",
  "protocols": [
    {
      "name": "switch6",
      "options": {
        "systemcode": 9,
        "programcode": 28
      }
    }
  ],
  "resetTime": 6000
}

Debuglog:
error [pimatic]: Error loading device homeduino-pir: "switch6" is not a pir protocol.

{
  "id": "homeduino-pir2",
  "name": "PIR2",
  "class": "HomeduinoRFSwitch",
  "protocols": [
    {
      "name": "switch6",
      "options": {
        "systemcode": 9,
        "programcode": 28
      }
    }
  ],
  "resetTime": 6000
}

Makes me a Switch in pimatic and Debuglog:
error [pimatic]: Error loading device homeduino-pir: "switch6" is not a pir protocol.

Maybe you could help me with a new plugin for this type PIR-sensor?

Many thanks in advance and sorry for my bad english.
-Greedings from Austria -
Alex

Request : Intertechno Shutterswitch CMR500

Since there is no protocol for shutter switches I'm requesting these here now.
I'm operating 6 blinds with these switches actually over pilight-plugin.
Here's the shutterdevice : http://www.intertechno.at/produkte/empfaenger/jalousien/CMR-500.html
and here's the manual : http://www.intertechno.at/medien/produkte/empfaenger/jalousien/manual-CMR-500.pdf
in pilight this screen protocol is described here (if this helps) http://wiki.pilight.org/doku.php/arctech_screen_old

Well, there are pimatic Intertechno protocols aIready developed for usual on/off switches.
I tried to embed a switch device as follows, just to see if the protocol works and will switch the device (what it actually does!):

   {
        "id": "shutterswitch-test",
        "name": "Rolladenschalter Test",
        "class": "HomeduinoRFSwitch",
        "protocol": "switch4",
        "protocolOptions": {
        "id": 26,
        "unit": 29
       }
    }

so this creates just a normal on/off button at the gui. the button can switch one outlet of the shutterswitch on/off. with this i can switch the device but not as it should, 'cause i can't switch on/off for each outlet separtely.

then i created a buttonsdevice for switching the outlets 1 (on) and 2 (off) as follows :

    {
        "id": "rolladenbuttons-testschalter",
        "name": "Rolladen Test",
        "class": "ButtonsDevice",
        "buttons": [
        {
          "id": "testrolladen-rauf",
          "text": "Rauf"
        },
        {
          "id": "testrolladen-runter",
          "text": "Runter"
        }
      ]
    }

(for explanation - rauf is up and runter is down)

both devices are looking like that in the gui :
rollotestschalter

I'm having a wall switch here (ywt8500) with this i can switch the device up and down by pressing either up (on) or down (off) as it usually should be.
so i thought creating a buttonsdevice with two buttons like up and down and rule to operate the device when button up or down is pressed could solve the problem but it doesn't.
My thought was very simple - pressing the up button on the wallswitch ywt8500 will raise the shutter - so it switches power to outlet 1. pressing the up button on the wallswitch again will shut off power on outlet 1 at the shutterswitch. so a rule like "if testrolladen-rauf is pressed then switch shutterswitch-test on" and "if testrolladen-runter is pressed then switch shutterswitch-test off" just switches the device on and off, but only the outlet that has been switched by the wallswitch before!
so if i press up on the wallswitch i can switch outlet 1 on. now i can switch the shutterswitch on outlet 1 with my pimatic rule or with the buttonsdevice rauf or runter for on/off. if i press the down button on the wallswitch, i can switch the outlet 2 on the shutter device on or off.

so what i now tried, I pressed up on the wallswitch - the outlet 1 will be powered. then i press the "rauf" on my buttons device in the gui so the rule is switching the shutterdevice on (since this is like pressing up on the wallswitch for switching on) - the shutterdevice powers off on outlet 1.
This experiment will work vice versa - if pressing down on the wallswitch, outlet 2 is powered, pressing the down button on the gui, the rule switches off and the device powers off on outlet 2.

it seems that the switch is "remembering" the last button pressed on the wall switch somehow. when i am pressing the buttons up and down on the gui i can only switch on and off on that outlet that has been switched before with the wallswitch.

so to cut a long story short - the protocol exists and is working but needs to be adapted to the screen/shutter application somehow.

hope this wasn't too confusing at all ... ?!?

switch 4: Is the State inverted?

I have a Düwi Terminal to control some Lights. In pimatic this is the switch4 protocol.
But for me the protocol is inverted. On is off and off is on. Can some one confirm this?

Switch1 protocol in rfcontroljs is different from the output from RFControl

The Protocol switch1 in rfcontroljs is different from the output from the RFControl compressed output.

Output from RFControl
Timing_size: 132
b: 217 2676 314 1317 10124 0 0 0
t: 010203020303020203020303020203020302030302020302030203030203020203030203020203030202030302020303020302020302030203020302030203030204

Values in switch1
Timing_size: 132
b: 268 1282 2632 10168 0 0 0 0
t: 020001000101000001000100010100010001000100000101000001000101000001000100010100000100010100010000010100000100010100000100010001000103

Remote is a ITT-1500 wich use se new KlikAanKlikUit protocol

Sometimes is the order of the buckets different.
Most it is so: 217 2676 314 1317 10124 0 0 0
But seen so too : 217 2676 1317 314 10124 0 0 0
this ends in a other compressed string which cant decode from my algorythmus. Is this a bug in RFControl?
It was easier, the RFControl.compressTimings will first sort the buckets from the lowest to the highest.

strange behavior in lib-controller.coffee

I develop a new protocol for the Quigg switches.
To verify this i wrote a normal test in the lib.

But it looks like the test don´t call the decodePulses function on an normal way.
For this protocol we need to erase the first pulse.
My first try was to set the first pulse to 2. A two is mapped to nothing.

  pulsesToBinaryMapping = {
    '10': '1' #binary 1
    '01': '0' #binary 0
    '2' : ''  #footer
  }
    decodePulses: (pulses) ->
      pulses[0] = 2
      binary = helper.map(pulses, pulsesToBinaryMapping)

but this fails in the test. For me is this really strange.
The first pulse isn´t set to two.

I have found this solution

    decodePulses: (pulses) ->
      binary = helper.map(pulses[1..], pulsesToBinaryMapping)

@sweetpi do i have a error in reasoning?

Test script not working?

Hi,

I'm trying to implement a new protocol for my projector screen and think I have the testenvironment set up (lots of dependencies!)

Before I start developing I run the test script to see if it works and am getting all kinds of errors.

gulp test
[08:35:17] Using gulpfile ~/rfcontroljs/gulpfile.js
[08:35:17] Starting 'test'...


  #decodePulses()
    ✓ generic should decode the pulses
    ✓ generic2 should decode the pulses
    ✓ pir1 should decode the pulses
Warning trying to parse message with protocol switch2: Data did not match mapping
  at Object.protocolInfo.decodePulses (/home/pimatic/rfcontroljs/src/protocols/switch2.coffee:27:23)
Warning trying to parse message with protocol switch3: Data did not match mapping
  at Object.protocolInfo.decodePulses (/home/pimatic/rfcontroljs/src/protocols/switch3.coffee:27:23)
...
...
  77 passing (7s)
  2 failing

  1) #decodePulses() pir2 should decode the pulses:
     Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.


  2) #decodePulses() doorbell3 should decode the pulses:

      AssertionError: pulse of doorbell3 should be detected.
      + expected - actual

      -false
      +true

    at Context.runTest (test/lib-controller.coffee:750:9)

Is the test script actually maintained, or is it deprecated?

Help porting protocol from pilight

I've written a protocol for pilight for the RSL366 switches (apparently also sold as PROmax) in pilight - link to pilight wiki.

I'm trying to port the protocol to pimatic, however, I'm unable to get it to work.

Some background on my setup:
I use the cheap RF sender (no receiver as I don't have my switches' remote) connected directly to the Pi's GPIO pin. (WiringPi: 0)
I am able to use pilight v6.0 to switch the devices on and off without any issue.
I used the "arctech_switch_old" protocol with pilight before my protocol was added to the master and tried to simply port the unit/id configuration - that didn't work and after some googling I found that these are not always the same in pimatic - pimatic/pimatic#380.

I've gotten to the point to give the commands directly to the vhduino, but I'm having trouble figuring out what the "buckets" are.

I've gotten to the point to construct the following string and feed it to vhduino:
RF send 0 5 390 1170 13260 0 0 0 0 0 01100110011001010110011001010110011001100110010102

This should be switching unit 4-3 on.

I'm also uncertain on what the five zeroes between 13260 and the beginning of the pulses are supposed to do and whether these are correct values for the switches.

Add FA20RF support

Could you add support for FA20RF smoke detecors?
It is already supported by fhemduino, there you could get the protocol from.
I looked at your code but I don't really understand where to implement the different timings.
Is there any documentation?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.