belphanior-2412n-servant 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -0,0 +1,70 @@
1
+ # Copyright 2012 Mark T. Tomczak
2
+
3
+ module Belphanior
4
+ module Servant
5
+ module HomeNetwork
6
+ class Insteon_2412n_Insteon_Codec
7
+ class BadCode < RuntimeError
8
+ end
9
+ COMMAND_CODE_TABLE = {
10
+ :on => "11",
11
+ :fast_on => "12",
12
+ :off => "13",
13
+ :fast_off => "14",
14
+ }
15
+ BRIGHTNESS_CODE_LIST = [
16
+ [0, "00"],
17
+ [0.1, "19"],
18
+ [0.25, "40"],
19
+ [0.5, "7F"],
20
+ [0.75, "BF"],
21
+ [0.9, "E6"],
22
+ [1, "FF"]
23
+ ]
24
+ INSTEON_PREFIX = "0262"
25
+
26
+ def initialize(marshaller)
27
+ @marshaller = marshaller
28
+ end
29
+
30
+ def device_on(address)
31
+ send_command(address, :fast_on, "FF")
32
+ end
33
+
34
+ def device_off(address)
35
+ send_command(address, :fast_off, "FF")
36
+ end
37
+
38
+ # Set the brightness level.
39
+ # address: 6-hexcode address of INSTEON device.
40
+ # brightness: float value between 0 and 1
41
+ def device_set_brightness(address, brightness)
42
+ send_command(address, :on, brightness_value_to_code(brightness))
43
+ end
44
+ private
45
+
46
+ # sends command to device specified by address.
47
+ def send_command(address, command, brightness_code)
48
+ @marshaller.send(INSTEON_PREFIX + address + "0F" +
49
+ COMMAND_CODE_TABLE[command] + brightness_code)
50
+ end
51
+
52
+ def brightness_value_to_code(brightness)
53
+ if brightness < 0 then
54
+ brightness = 0
55
+ end
56
+ if brightness > 1 then
57
+ brightness = 1
58
+ end
59
+ BRIGHTNESS_CODE_LIST.each do |codepair|
60
+ if brightness <= codepair[0] then
61
+ return codepair[1]
62
+ end
63
+ end
64
+ return "FF"
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,30 @@
1
+ # Marshaller for the Insteon 2412N home automation server
2
+ require 'net/http'
3
+
4
+ module Belphanior
5
+ module Servant
6
+ module HomeNetwork
7
+ class Insteon_2412n_Marshaller
8
+ attr_accessor :host
9
+ class ConnectionFailure < RuntimeError
10
+ end
11
+ def initialize(host, network_class=nil)
12
+ @host = host
13
+ if network_class
14
+ @network_class = network_class
15
+ else
16
+ @network_class = Net::HTTP
17
+ end
18
+ end
19
+ def send(command)
20
+ @network_class.start(@host, 80) {|http|
21
+ # I don't know what the prefix and suffix here mean;
22
+ # they were determined empirically by examining the output
23
+ # from the 2412N's built-in web GUI
24
+ http.post("/3?"+command+"=I=3", "")
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,81 @@
1
+ module Belphanior
2
+ module Servant
3
+ module HomeNetwork
4
+ class Insteon_2412n_x10_Codec
5
+ class BadCode < RuntimeError
6
+ end
7
+ HOUSE_CODE_TABLE = {
8
+ "A"=>"6", "B"=>"E", "C"=>"2", "D"=>"A",
9
+ "E"=>"1", "F"=>"9", "G"=>"5", "H"=>"D",
10
+ "I"=>"7", "J"=>"F", "K"=>"3", "L"=>"B",
11
+ "M"=>"0", "N"=>"8", "O"=>"4", "P"=>"C",
12
+ }
13
+ UNIT_CODE_TABLE = {
14
+ "1"=>"6", "2"=>"E", "3"=>"2", "4"=>"A",
15
+ "5"=>"1", "6"=>"9", "7"=>"5", "8"=>"D",
16
+ "9"=>"7", "10"=>"F", "11"=>"3", "12"=>"B",
17
+ "13"=>"0", "14"=>"8", "15"=>"4", "16"=>"C",
18
+ }
19
+ COMMAND_CODE_TABLE = {
20
+ :all_on => "6",
21
+ :on => "2",
22
+ :brighter => "5",
23
+ :off => "3",
24
+ :all_off => "0",
25
+ :dimmer => "4",
26
+ }
27
+ X10_PREFIX = "0263"
28
+ ADDRESS_SUFFIX = "00"
29
+ COMMAND_SUFFIX = "80"
30
+
31
+ def initialize(marshaller)
32
+ @marshaller = marshaller
33
+ end
34
+
35
+ def device_on(identifier)
36
+ send_command(identifier, :on)
37
+ end
38
+
39
+ def device_off(identifier)
40
+ send_command(identifier, :off)
41
+ end
42
+
43
+ def device_brighter(identifier)
44
+ send_command(identifier, :brighter)
45
+ end
46
+
47
+ def device_dimmer(identifier)
48
+ send_command(identifier, :dimmer)
49
+ end
50
+ private
51
+
52
+ # sends command to device specified by house and unit string
53
+ def send_command(house_and_unit, command)
54
+ house_code, unit_code = select_code(house_and_unit)
55
+ @marshaller.send(X10_PREFIX + house_code + unit_code + ADDRESS_SUFFIX)
56
+ @marshaller.send(X10_PREFIX + house_code + COMMAND_CODE_TABLE[command] +
57
+ COMMAND_SUFFIX)
58
+ end
59
+
60
+ # Converts house, unit code string to hex command string
61
+ def select_code(house_and_unit)
62
+ if not house_and_unit.length <= 3
63
+ raise BadCode,
64
+ "Code should be three characters or less."
65
+ end
66
+ house = house_and_unit[0..0]
67
+ unit = house_and_unit[1..2]
68
+ if not HOUSE_CODE_TABLE.has_key? house
69
+ raise BadCode,
70
+ "House code was '" << house << "', must be between 'A' and 'P'"
71
+ end
72
+ if not UNIT_CODE_TABLE.has_key? unit
73
+ raise BadCode,
74
+ "Unit code was '" << unit << "', must be between '1' and '16'"
75
+ end
76
+ [HOUSE_CODE_TABLE[house], UNIT_CODE_TABLE[unit]]
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,70 @@
1
+ require 'rubygems'
2
+ require 'belphanior/servant/homenetwork/insteon_2412n_x10_codec'
3
+ require 'test/unit'
4
+ require 'mocha'
5
+
6
+
7
+ # Test of X10 code generator for Insteon 2412N central controller
8
+
9
+ class TestInsteon_2412N_X10_Codec < Test::Unit::TestCase
10
+ def setup
11
+ @marshaller = mock(
12
+ 'Belphanior::Servant::HomeNetwork::Insteon_2412n_Marshaller')
13
+ @codec = Belphanior::Servant::HomeNetwork::Insteon_2412n_x10_Codec.new(
14
+ @marshaller)
15
+ end
16
+
17
+ def test_house_codes
18
+ # map from house codes to hex names
19
+ house_code_table = {
20
+ "A"=>"6", "B"=>"E", "C"=>"2", "D"=>"A",
21
+ "E"=>"1", "F"=>"9", "G"=>"5", "H"=>"D",
22
+ "I"=>"7", "J"=>"F", "K"=>"3", "L"=>"B",
23
+ "M"=>"0", "N"=>"8", "O"=>"4", "P"=>"C",
24
+ }
25
+ unit_1_code = "6"
26
+ house_code_table.each do |key, value|
27
+ cur_sequence = sequence(key)
28
+ @marshaller.expects(:send).with(
29
+ "0263"+value+unit_1_code+"00").in_sequence(cur_sequence)
30
+ @marshaller.expects(:send).in_sequence(cur_sequence)
31
+ @codec.device_on(key+"1")
32
+ end
33
+ end
34
+ def test_unit_codes
35
+ # map from house codes to hex names
36
+ unit_code_table = {
37
+ "1"=>"6", "2"=>"E", "3"=>"2", "4"=>"A",
38
+ "5"=>"1", "6"=>"9", "7"=>"5", "8"=>"D",
39
+ "9"=>"7", "10"=>"F", "11"=>"3", "12"=>"B",
40
+ "13"=>"0", "14"=>"8", "15"=>"4", "16"=>"C",
41
+ }
42
+ house_a_code = "6"
43
+ unit_code_table.each do |key, value|
44
+ cur_sequence = sequence(key)
45
+ @marshaller.expects(:send).with(
46
+ "0263"+house_a_code+value+"00").in_sequence(cur_sequence)
47
+ @marshaller.expects(:send).in_sequence(cur_sequence)
48
+ @codec.device_on("A"+key)
49
+ end
50
+ end
51
+ def test_command_codes
52
+ code_segments = [
53
+ "2", # on
54
+ "5", # brighter
55
+ "3", # off
56
+ "4", # dimmer
57
+ ]
58
+ house_a_code = "6"
59
+ cur_sequence = sequence("command codes")
60
+ code_segments.each do |code|
61
+ @marshaller.expects(:send).in_sequence(cur_sequence)
62
+ @marshaller.expects(:send).with("0263" + house_a_code +
63
+ code + "80").in_sequence(cur_sequence)
64
+ end
65
+ @codec.device_on("A1")
66
+ @codec.device_brighter("A1")
67
+ @codec.device_off("A1")
68
+ @codec.device_dimmer("A1")
69
+ end
70
+ end
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'belphanior/servant/homenetwork/insteon_2412n_insteon_codec'
3
+ require 'test/unit'
4
+ require 'mocha'
5
+
6
+
7
+ # Test of INSTEON code generator for Insteon 2412N central controller
8
+
9
+ class TestInsteon_2412N_Insteon_Codec < Test::Unit::TestCase
10
+ def setup
11
+ @marshaller = mock(
12
+ 'Belphanior::Servant::HomeNetwork::Insteon_2412n_Marshaller')
13
+ @codec = Belphanior::Servant::HomeNetwork::Insteon_2412n_Insteon_Codec.new(
14
+ @marshaller)
15
+ @insteon_prefix = "0262"
16
+ end
17
+
18
+ def test_on_off
19
+ address = "001122"
20
+ fast_on_code = "12"
21
+ fast_off_code = "14"
22
+ @marshaller.expects(:send).with(
23
+ @insteon_prefix + address + "0F" + fast_on_code + "FF")
24
+ @codec.device_on(address)
25
+ end
26
+
27
+ def test_brightness
28
+ address = "001122"
29
+ on_code = "11"
30
+ @marshaller.expects(:send).with(
31
+ @insteon_prefix + address + "0F" + on_code + "00")
32
+ @codec.device_set_brightness(address, 0)
33
+
34
+ @marshaller.expects(:send).with(
35
+ @insteon_prefix + address + "0F" + on_code + "FF")
36
+ @codec.device_set_brightness(address, 1)
37
+
38
+ # Exact equality
39
+ @marshaller.expects(:send).with(
40
+ @insteon_prefix + address + "0F" + on_code + "7F")
41
+ @codec.device_set_brightness(address, 0.5)
42
+
43
+ # Near-equality
44
+ @marshaller.expects(:send).with(
45
+ @insteon_prefix + address + "0F" + on_code + "7F")
46
+ @codec.device_set_brightness(address, 0.4)
47
+
48
+ # Out of bounds
49
+ @marshaller.expects(:send).with(
50
+ @insteon_prefix + address + "0F" + on_code + "00")
51
+ @codec.device_set_brightness(address, -1)
52
+
53
+ @marshaller.expects(:send).with(
54
+ @insteon_prefix + address + "0F" + on_code + "FF")
55
+ @codec.device_set_brightness(address, 1.5)
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'belphanior/servant/homenetwork/insteon_2412n_marshaller'
3
+ require 'test/unit'
4
+ require 'mocha'
5
+
6
+
7
+ class TestInsteon_2412N_Marshaller < Test::Unit::TestCase
8
+ def setup
9
+ @netmock = mock('Net::HTTP')
10
+ @requestmock = mock()
11
+ @marshaller =
12
+ Belphanior::Servant::HomeNetwork::Insteon_2412n_Marshaller.new(
13
+ 'localhost', @netmock)
14
+ end
15
+ def test_send
16
+ input = "02636600"
17
+ @netmock.expects(:start).with('localhost',80).yields(@requestmock)
18
+ @requestmock.expects(:post).with("/3?"+input+"=I=3","")
19
+ @marshaller.send(input)
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: belphanior-2412n-servant
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - Mark T. Tomczak
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-11-03 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: belphanior-servant
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 29
29
+ segments:
30
+ - 0
31
+ - 0
32
+ - 1
33
+ version: 0.0.1
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: " The Belphanior 2412n servant interfaces to a Smarthome 2412n SmartLinc controller\n (http://www.smarthome.com/2412N/SmartLinc-INSTEON-Central-Controller/p.aspx). It can\n be used to send commands directly to the controller to switch lights and appliances\n on and off and control brightness and intensity.\n"
37
+ email: belphanior+2412n-servant@fixermark.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - LICENSE
46
+ - lib/belphanior/servant/homenetwork/insteon_2412n_marshaller.rb
47
+ - lib/belphanior/servant/homenetwork/insteon_2412n_x10_codec.rb
48
+ - lib/belphanior/servant/homenetwork/insteon_2412n_insteon_codec.rb
49
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_codec.rb
50
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_insteon_codec.rb
51
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_marshaller.rb
52
+ homepage: http://belphanior.net
53
+ licenses:
54
+ - http://www.apache.org/licenses/LICENSE-2.0.txt
55
+ post_install_message:
56
+ rdoc_options: []
57
+
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ requirements: []
79
+
80
+ rubyforge_project:
81
+ rubygems_version: 1.8.24
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: Control an x10 or INSTEON system using the Belphanior home-network protocol and a Smarthome 2412n SmartLinc central controller.
85
+ test_files:
86
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_codec.rb
87
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_insteon_codec.rb
88
+ - lib/belphanior/servant/homenetwork/test/tc_insteon_2412n_marshaller.rb