webrelais 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 23cdd688c5f0f6e80ea7a7a92eb5921575f520dd
4
+ data.tar.gz: 9ceffeed0e590f26e970e486099da0beb792957c
5
+ SHA512:
6
+ metadata.gz: 3bf637a03571c1578784a42755aef74134678ee742ffd0f621f4ca88ffdf21f47680f023047017527c6d614952996f6cfa25fc968ccb5776357cf8a99fa24607
7
+ data.tar.gz: 6e5201292120588fbe8746383331c6516a6a771b329121afb8d0babf0231720860ce50af2008f69e3d24487c8d56e9aae7a88e23f8d450f70b5d4f8e7b1353aa
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
@@ -0,0 +1,7 @@
1
+ # Contributing
2
+
3
+ 1. Fork it ( https://github.com/[my-github-username]/webrelais/fork )
4
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
5
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
6
+ 4. Push to the branch (`git push origin my-new-feature`)
7
+ 5. Create a new Pull Request
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in webrelais.gemspec
4
+ gemspec
@@ -0,0 +1,11 @@
1
+ guard 'bundler' do
2
+ watch('Gemfile')
3
+ watch(%r|^.*\.gemspec|)
4
+ end
5
+
6
+ guard 'minitest' do
7
+ watch(%r|^test/unit/test_(.*)\.rb|)
8
+ watch(%r|^lib/*\.rb|){'test'}
9
+ watch(%r{^lib/.*/([^/]+)\.rb$}){|m| "test/unit/test_#{m[1]}.rb"}
10
+ watch(%r|^test/helper\.rb|){'test'}
11
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Nicholas E. Rabenau
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ web: bundle exec unicorn config.ru -p $PORT
@@ -0,0 +1,18 @@
1
+ # Webrelais
2
+
3
+ This is a simple web interface for controlling a HL-58S relais card via a Raspberry Pi.
4
+
5
+ ## Usage
6
+
7
+ 1. Connect the pins of the relais card to the Rapis's GPIO ports 0..7
8
+ 1. `git clone` this project or install the gem (see below)
9
+ 1. Start the web server with
10
+
11
+ $ foreman start
12
+
13
+ ## Installation
14
+
15
+ 1. Install [WiringPi](http://wiringpi.com/) for the `gpio` command.
16
+ 1. Install this gem:
17
+
18
+ $ gem install webrelais
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << 'test' << 'test/unit'
6
+ t.pattern = 'test/unit/test_*.rb'
7
+ end
8
+
9
+ task :default => :test
@@ -0,0 +1,7 @@
1
+ * Animate status change
2
+ * Allow user to change polling interval
3
+ * Log changes in browser window (not just JS console)
4
+ * Button for 'all on'
5
+ * Button for 'all off'
6
+ * Button for random pattern: `gpio wb $(expr $RANDOM % 255)`
7
+ * Edit pin labels on long click
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'webrelais'
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
5
+ require 'webrelais'
6
+
7
+ run Rack::URLMap.new('/' => Webrelais::WebApp)
@@ -0,0 +1,14 @@
1
+ require 'webrelais/version'
2
+ require 'webrelais/pin'
3
+ require 'webrelais/board'
4
+ require 'webrelais/web_app'
5
+
6
+ module Webrelais
7
+ def self.gpio=(program)
8
+ @gpio = program
9
+ end
10
+
11
+ def self.gpio
12
+ @gpio ||= 'gpio'
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+
3
+ module Webrelais
4
+ class Board
5
+ def initialize(pin_count)
6
+ @pins = pin_count.times.map do |i|
7
+ Pin.new(i)
8
+ end
9
+ end
10
+
11
+ def pin(id)
12
+ @pins[id]
13
+ end
14
+
15
+ def pin_count
16
+ @pins.size
17
+ end
18
+
19
+ def pins
20
+ @pins.dup
21
+ end
22
+
23
+ def to_json
24
+ Hash[@pins.map{|p| [p.id, p.value]}].to_json
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ module Webrelais
2
+ class Pin
3
+ attr_reader :id
4
+
5
+ def initialize(id)
6
+ @id = id
7
+ end
8
+
9
+ def value
10
+ %x[#{Webrelais.gpio} read #{id}].chomp.to_i ^ 1
11
+ rescue
12
+ -1
13
+ end
14
+
15
+ def value=(v)
16
+ %x[#{Webrelais.gpio} write #{id} #{v ^ 1}] rescue -1
17
+ end
18
+
19
+ def to_s
20
+ "Pin #{id}"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module Webrelais
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,43 @@
1
+ require 'sinatra'
2
+ require 'sinatra/partial'
3
+
4
+ module Webrelais
5
+ class WebApp < Sinatra::Base
6
+ register Sinatra::Partial
7
+
8
+ set :show_exceptions, development?
9
+ set :root, File.join(File.dirname(__FILE__), '..', '..')
10
+ set :views, settings.root + '/views'
11
+
12
+ set :partial_template_engine, :erb
13
+ enable :partial_underscores
14
+
15
+ configure :production, :development do
16
+ enable :logging
17
+ end
18
+
19
+ get '/' do
20
+ logger.info("Status is #{board.to_json}")
21
+ if request.xhr?
22
+ board.to_json
23
+ else
24
+ erb :index
25
+ end
26
+ end
27
+
28
+ post %r{/([0-7])} do |i|
29
+ pin = board.pin(i.to_i)
30
+ old_value = params[:value].to_i
31
+ new_value = 0 == old_value ? 1 : 0
32
+
33
+ logger.info("Switching #{pin} from #{old_value} to #{new_value}")
34
+ pin.value = new_value
35
+
36
+ redirect to('/')
37
+ end
38
+
39
+ def board
40
+ @board ||= Board.new(8)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,92 @@
1
+ /* most of the CSS from http://www.dwuser.com/education/content/creating-responsive-tiled-layout-with-pure-css/ */
2
+ body {
3
+ margin: 0;
4
+ padding: 0;
5
+ background: #EEE;
6
+ font: 10px/13px 'Lucida Sans',sans-serif;
7
+ }
8
+ .wrap {
9
+ overflow: hidden;
10
+ margin: 10px;
11
+ }
12
+ .box {
13
+ float: left;
14
+ position: relative;
15
+ width: 20%;
16
+ padding-bottom: 20%;
17
+ }
18
+ .boxInner {
19
+ position: absolute;
20
+ left: 10px;
21
+ right: 10px;
22
+ top: 10px;
23
+ bottom: 10px;
24
+ overflow: hidden;
25
+ }
26
+ .boxInner img {
27
+ width: 100%;
28
+ }
29
+ body.no-touch .boxInner:hover .titleBox, body.touch .boxInner.touchFocus .titleBox {
30
+ margin-bottom: 0;
31
+ }
32
+ @media only screen and (max-width : 480px) {
33
+ /* Smartphone view: 1 tile */
34
+ .box {
35
+ width: 50%;
36
+ padding-bottom: 50%;
37
+ }
38
+ }
39
+ @media only screen and (max-width : 1050px) and (min-width : 481px) {
40
+ /* Tablet view: 2 tiles */
41
+ .box {
42
+ width: 25%;
43
+ padding-bottom: 25%;
44
+ }
45
+ }
46
+
47
+ /* from http://www.scriptol.com/html5/button.php */
48
+ .button, .button:visited
49
+ {
50
+ color: #fff;
51
+ text-decoration: none;
52
+ border-radius: 6px;
53
+ box-shadow: 1px 2px 4px 0 rgba(0,0,0,0.6);
54
+ text-shadow: 0 -1px 1px rgba(0,0,0,0.25);
55
+ border-bottom: 1px solid rgba(0,0,0,0.25);
56
+ border-right: 1px solid rgba(0,0,0,0.25);
57
+ position: relative;
58
+ cursor: pointer;
59
+ font-family:Calibri, Arial;
60
+ margin-left:4px;
61
+ font-size: 16px;
62
+ padding: 1px 8px 3px 8px;
63
+ width: 100px;
64
+ height: 100px;
65
+ }
66
+ .button:active
67
+ {
68
+ top: 1px;
69
+ left:1px;
70
+ }
71
+ .off.button, .off.button:visited
72
+ {
73
+ background-color:#CCCCCC;
74
+ box-shadow: inset 1px 1px 2px 0 rgba(255,255,255,0.6),
75
+ inset -1px -1px 1px 0 rgba(100,120,140,0.6),
76
+ 1px 2px 4px 0 rgba(0,0,0,0.6);
77
+ color:#333;
78
+ border-left:1px solid #999;
79
+ border-top:1px solid #999;
80
+ text-shadow:none;
81
+ }
82
+ .on.button, .on.button:visited
83
+ {
84
+ background-color:#FF0000;
85
+ box-shadow: inset 1px 1px 2px 0 rgba(255,255,255,0.6),
86
+ inset -1px -1px 1px 0 rgba(100,120,140,0.6),
87
+ 1px 2px 4px 0 rgba(0,0,0,0.6);
88
+ color:#ffffff;
89
+ border-left:1px solid #999;
90
+ border-top:1px solid #999;
91
+ text-shadow:none;
92
+ }
@@ -0,0 +1 @@
1
+ // nothing yet
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'webrelais'
3
+ require 'minitest/autorun'
4
+
5
+ module Webrelais
6
+ class TestCase < MiniTest::Test
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'helper'
3
+
4
+ class TestBoard < Webrelais::TestCase
5
+ include Webrelais
6
+
7
+ def setup
8
+ Webrelais.gpio = 'echo 0'
9
+ end
10
+
11
+ def test_pin_count
12
+ board = Board.new(8)
13
+ refute_nil(board)
14
+ assert_equal(8, board.pin_count)
15
+ end
16
+
17
+ def test_all
18
+ board = Board.new(8)
19
+ refute_nil(board)
20
+ assert_equal('{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1}', board.to_json)
21
+ end
22
+ end
@@ -0,0 +1,72 @@
1
+ <% board.pins.each do |pin| %>
2
+ <div class="box">
3
+ <div class="boxInner">
4
+ <form method="POST" action="<%= pin.id %>" class="pin-action">
5
+ <button id="pin-<%= pin.id %>" type="submit" value="Setzen" class="button <%= 1 == pin.value ? 'on' : 'off' %>">
6
+ <div class="titleBox"><%= pin %></div>
7
+ </button>
8
+ </form>
9
+ </div>
10
+ </div>
11
+ <% end %>
12
+
13
+ <script type="text/javascript">
14
+ //<![CDATA[
15
+ $(".pin-action").submit(function(event){
16
+ event.preventDefault();
17
+
18
+ var form = $(this),
19
+ is_on = form.find("button").hasClass("on");
20
+ url = form.attr("action");
21
+
22
+ $.post(url, {value: is_on ? '1' : '0'}, function(response){
23
+ update(response);
24
+ }, 'json')
25
+ .fail(function (jqXHR, textStatus, errorThrown){
26
+ console.error(textStatus + " posting form: " + errorThrown);
27
+ $("#status").append( "<p>content 3</p>" );
28
+ });
29
+ });
30
+
31
+ function poll_pins(){
32
+ if ($("#polling").is(':checked')){
33
+ request = $.getJSON("/");
34
+
35
+ request.fail(function (jqXHR, textStatus, errorThrown){
36
+ console.error(textStatus + " fetching status: " + errorThrown);
37
+ });
38
+
39
+ request.done(function(response, textStatus, jqXHR){
40
+ update(response);
41
+ });
42
+
43
+ setTimeout(poll_pins, 1000);
44
+ }
45
+ }
46
+
47
+ $("#polling").change(function(event) {
48
+ $(poll_pins);
49
+ });
50
+
51
+ $(function(){
52
+ $(poll_pins);
53
+ });
54
+
55
+ function update(response){
56
+ // console.debug(response);
57
+ $.each(response, function(id, value){
58
+ set_pin(id, value);
59
+ });
60
+ }
61
+
62
+ function set_pin(id, value){
63
+ var pin = $("#pin-" + id)
64
+ var msg = "Pin " + id + " = " + value;
65
+
66
+ if (1 == value)
67
+ pin.addClass("on").removeClass("off");
68
+ else
69
+ pin.addClass("off").removeClass("on");
70
+ }
71
+ //]]>
72
+ </script>
@@ -0,0 +1,3 @@
1
+ <div class="wrap">
2
+ <%= partial 'form' %>
3
+ </div>
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html lang="de">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
6
+ <title>Webrelais</title>
7
+ <link rel="stylesheet" href="/css/webrelais.css" />
8
+ <script src="http://code.jquery.com/jquery-2.1.3.js"></script>
9
+ <script src="/javascript/webrelais.js" type="text/javascript"></script>
10
+ </head>
11
+ <body>
12
+ <h1>Webrelais</h1>
13
+ <form>
14
+ <label for="polling">Auto Refresh</label>
15
+ <input id="polling" type="checkbox" checked="true"/>
16
+ </form>
17
+ <%= yield %>
18
+ </body>
19
+ </html>
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'webrelais/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "webrelais"
8
+ spec.version = Webrelais::VERSION
9
+ spec.authors = ["Nicholas E. Rabenau"]
10
+ spec.email = ["nerab@gmx.at"]
11
+ spec.summary = %q{Web interface for a Raspi relais card}
12
+ spec.description = %q{Web interface for a controlling a HL-58S relais card via a Raspberry Pi}
13
+ spec.homepage = "https://github.com/nerab/webrelais"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'sinatra'
22
+ spec.add_dependency 'foreman'
23
+ spec.add_dependency 'unicorn'
24
+ spec.add_dependency 'sinatra-partial'
25
+
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'bundler'
28
+ spec.add_development_dependency 'rerun'
29
+ spec.add_development_dependency 'minitest'
30
+ spec.add_development_dependency 'rack-test'
31
+ spec.add_development_dependency 'guard'
32
+ spec.add_development_dependency 'guard-bundler'
33
+ spec.add_development_dependency 'guard-rack'
34
+ spec.add_development_dependency 'guard-minitest'
35
+ spec.add_development_dependency 'pry'
36
+ spec.add_development_dependency 'pry-stack_explorer'
37
+ spec.add_development_dependency 'rb-inotify'
38
+ spec.add_development_dependency 'rb-fsevent'
39
+ spec.add_development_dependency 'rb-readline'
40
+ end
metadata ADDED
@@ -0,0 +1,325 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webrelais
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nicholas E. Rabenau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: foreman
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: unicorn
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sinatra-partial
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rerun
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rack-test
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-bundler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: guard-rack
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: guard-minitest
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: pry
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: pry-stack_explorer
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: rb-inotify
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rb-fsevent
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: rb-readline
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ description: Web interface for a controlling a HL-58S relais card via a Raspberry
266
+ Pi
267
+ email:
268
+ - nerab@gmx.at
269
+ executables:
270
+ - webrelais
271
+ extensions: []
272
+ extra_rdoc_files: []
273
+ files:
274
+ - ".gitignore"
275
+ - ".travis.yml"
276
+ - CONTRIBUTING.markdown
277
+ - Gemfile
278
+ - Guardfile
279
+ - LICENSE.txt
280
+ - Procfile
281
+ - README.md
282
+ - Rakefile
283
+ - TODO.markdown
284
+ - bin/webrelais
285
+ - config.ru
286
+ - lib/webrelais.rb
287
+ - lib/webrelais/board.rb
288
+ - lib/webrelais/pin.rb
289
+ - lib/webrelais/version.rb
290
+ - lib/webrelais/web_app.rb
291
+ - public/css/webrelais.css
292
+ - public/javascript/webrelais.js
293
+ - test/helper.rb
294
+ - test/unit/test_board.rb
295
+ - views/_form.erb
296
+ - views/index.erb
297
+ - views/layout.erb
298
+ - webrelais.gemspec
299
+ homepage: https://github.com/nerab/webrelais
300
+ licenses:
301
+ - MIT
302
+ metadata: {}
303
+ post_install_message:
304
+ rdoc_options: []
305
+ require_paths:
306
+ - lib
307
+ required_ruby_version: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - ">="
310
+ - !ruby/object:Gem::Version
311
+ version: '0'
312
+ required_rubygems_version: !ruby/object:Gem::Requirement
313
+ requirements:
314
+ - - ">="
315
+ - !ruby/object:Gem::Version
316
+ version: '0'
317
+ requirements: []
318
+ rubyforge_project:
319
+ rubygems_version: 2.4.3
320
+ signing_key:
321
+ specification_version: 4
322
+ summary: Web interface for a Raspi relais card
323
+ test_files:
324
+ - test/helper.rb
325
+ - test/unit/test_board.rb