growbot-web 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.bowerrc +3 -0
- data/.gitignore +22 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +39 -0
- data/arduino_data.txt +6137 -0
- data/bower.json +19 -0
- data/config.ru +13 -0
- data/growbot-web.gemspec +35 -0
- data/lib/growbot/web.rb +6 -0
- data/lib/growbot/web/app.rb +49 -0
- data/lib/growbot/web/data.rb +42 -0
- data/lib/growbot/web/env.rb +9 -0
- data/lib/growbot/web/version.rb +5 -0
- data/lib/growbot/web/views/coffee/app.coffee +131 -0
- data/lib/growbot/web/views/index.haml +10 -0
- data/lib/growbot/web/views/layout.haml +20 -0
- data/lib/growbot/web/views/sass/app.scss +59 -0
- data/lib/growbot/web/views/sass/bitters/_bitters.scss +16 -0
- data/lib/growbot/web/views/sass/bitters/_flashes.scss +11 -0
- data/lib/growbot/web/views/sass/bitters/_forms.scss +95 -0
- data/lib/growbot/web/views/sass/bitters/_grid-settings.scss +14 -0
- data/lib/growbot/web/views/sass/bitters/_lists.scss +31 -0
- data/lib/growbot/web/views/sass/bitters/_tables.scss +22 -0
- data/lib/growbot/web/views/sass/bitters/_typography.scss +104 -0
- data/lib/growbot/web/views/sass/bitters/_variables.scss +43 -0
- data/lib/growbot/web/views/sass/bitters/extends/_base.scss +1 -0
- data/lib/growbot/web/views/sass/bitters/extends/_button.scss +7 -0
- data/lib/growbot/web/views/sass/bitters/mixins/_base.scss +1 -0
- data/lib/growbot/web/views/sass/bitters/mixins/_flash.scss +15 -0
- data/lib/growbot/web/views/sass/bourbon/_bourbon-deprecated-upcoming.scss +8 -0
- data/lib/growbot/web/views/sass/bourbon/_bourbon.scss +78 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_button.scss +374 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_clearfix.scss +23 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_directional-values.scss +111 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_ellipsis.scss +7 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_font-family.scss +5 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_hide-text.scss +10 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_html5-input-types.scss +86 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_position.scss +32 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_prefixer.scss +45 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_retina-image.scss +31 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_size.scss +16 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_timing-functions.scss +32 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_triangle.scss +83 -0
- data/lib/growbot/web/views/sass/bourbon/addons/_word-wrap.scss +8 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_animation.scss +52 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_appearance.scss +3 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_backface-visibility.scss +6 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_background-image.scss +42 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_background.scss +55 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_border-image.scss +59 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_border-radius.scss +22 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_box-sizing.scss +4 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_calc.scss +4 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_columns.scss +47 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_filter.scss +5 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_flex-box.scss +321 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_font-face.scss +23 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_font-feature-settings.scss +10 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_hidpi-media-query.scss +10 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_hyphens.scss +4 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_image-rendering.scss +14 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_keyframes.scss +35 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_linear-gradient.scss +38 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_perspective.scss +8 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_placeholder.scss +8 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_radial-gradient.scss +39 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_transform.scss +15 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_transition.scss +77 -0
- data/lib/growbot/web/views/sass/bourbon/css3/_user-select.scss +3 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_assign.scss +11 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_color-lightness.scss +13 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_flex-grid.scss +39 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_golden-ratio.scss +3 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_grid-width.scss +13 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_modular-scale.scss +66 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_px-to-em.scss +13 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_px-to-rem.scss +15 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_strip-units.scss +5 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_tint-shade.scss +9 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_transition-property-name.scss +22 -0
- data/lib/growbot/web/views/sass/bourbon/functions/_unpack.scss +17 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_convert-units.scss +15 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_gradient-positions-parser.scss +13 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_is-num.scss +8 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_linear-angle-parser.scss +25 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_linear-gradient-parser.scss +41 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_linear-positions-parser.scss +61 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_linear-side-corner-parser.scss +31 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_radial-arg-parser.scss +69 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_radial-gradient-parser.scss +50 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_radial-positions-parser.scss +18 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_render-gradients.scss +26 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_shape-size-stripper.scss +10 -0
- data/lib/growbot/web/views/sass/bourbon/helpers/_str-to-num.scss +50 -0
- data/lib/growbot/web/views/sass/bourbon/settings/_prefixer.scss +6 -0
- data/lib/growbot/web/views/sass/bourbon/settings/_px-to-em.scss +1 -0
- data/lib/growbot/web/views/sass/neat/_neat-helpers.scss +7 -0
- data/lib/growbot/web/views/sass/neat/_neat.scss +21 -0
- data/lib/growbot/web/views/sass/neat/functions/_new-breakpoint.scss +16 -0
- data/lib/growbot/web/views/sass/neat/functions/_private.scss +125 -0
- data/lib/growbot/web/views/sass/neat/grid/_fill-parent.scss +7 -0
- data/lib/growbot/web/views/sass/neat/grid/_grid.scss +5 -0
- data/lib/growbot/web/views/sass/neat/grid/_media.scss +38 -0
- data/lib/growbot/web/views/sass/neat/grid/_omega.scss +61 -0
- data/lib/growbot/web/views/sass/neat/grid/_outer-container.scss +8 -0
- data/lib/growbot/web/views/sass/neat/grid/_pad.scss +8 -0
- data/lib/growbot/web/views/sass/neat/grid/_private.scss +43 -0
- data/lib/growbot/web/views/sass/neat/grid/_reset.scss +12 -0
- data/lib/growbot/web/views/sass/neat/grid/_row.scss +17 -0
- data/lib/growbot/web/views/sass/neat/grid/_shift.scss +16 -0
- data/lib/growbot/web/views/sass/neat/grid/_span-columns.scss +43 -0
- data/lib/growbot/web/views/sass/neat/grid/_to-deprecate.scss +57 -0
- data/lib/growbot/web/views/sass/neat/grid/_visual-grid.scss +41 -0
- data/lib/growbot/web/views/sass/neat/settings/_grid.scss +7 -0
- data/lib/growbot/web/views/sass/neat/settings/_visual-grid.scss +5 -0
- data/lib/growbot/web/views/sass/refills/_navigation.scss +190 -0
- data/lib/growbot/web/views/sass/refills/_refills.scss +1 -0
- data/lib/growbot/web/views/sass/widgets/_big-number.scss +21 -0
- data/lib/growbot/web/views/sass/widgets/_widgets.scss +1 -0
- data/public/javascripts/app.js +150 -0
- data/public/stylesheets/app.css +1 -0
- data/public/vendor/colorbrewer/.bower.json +35 -0
- data/public/vendor/colorbrewer/LICENSE +38 -0
- data/public/vendor/colorbrewer/README.md +7 -0
- data/public/vendor/colorbrewer/bower.json +23 -0
- data/public/vendor/colorbrewer/colorbrewer.css +1690 -0
- data/public/vendor/colorbrewer/colorbrewer.js +302 -0
- data/public/vendor/d3/.bower.json +35 -0
- data/public/vendor/d3/CONTRIBUTING.md +25 -0
- data/public/vendor/d3/LICENSE +26 -0
- data/public/vendor/d3/README.md +9 -0
- data/public/vendor/d3/bower.json +24 -0
- data/public/vendor/d3/composer.json +19 -0
- data/public/vendor/d3/d3.js +9263 -0
- data/public/vendor/d3/d3.min.js +5 -0
- data/public/vendor/jquery/.bower.json +38 -0
- data/public/vendor/jquery/MIT-LICENSE.txt +21 -0
- data/public/vendor/jquery/bower.json +27 -0
- data/public/vendor/jquery/dist/jquery.js +9190 -0
- data/public/vendor/jquery/dist/jquery.min.js +5 -0
- data/public/vendor/jquery/dist/jquery.min.map +1 -0
- data/public/vendor/jquery/src/ajax.js +806 -0
- data/public/vendor/jquery/src/ajax/jsonp.js +89 -0
- data/public/vendor/jquery/src/ajax/load.js +75 -0
- data/public/vendor/jquery/src/ajax/parseJSON.js +13 -0
- data/public/vendor/jquery/src/ajax/parseXML.js +28 -0
- data/public/vendor/jquery/src/ajax/script.js +64 -0
- data/public/vendor/jquery/src/ajax/var/nonce.js +5 -0
- data/public/vendor/jquery/src/ajax/var/rquery.js +3 -0
- data/public/vendor/jquery/src/ajax/xhr.js +135 -0
- data/public/vendor/jquery/src/attributes.js +11 -0
- data/public/vendor/jquery/src/attributes/attr.js +143 -0
- data/public/vendor/jquery/src/attributes/classes.js +158 -0
- data/public/vendor/jquery/src/attributes/prop.js +96 -0
- data/public/vendor/jquery/src/attributes/support.js +35 -0
- data/public/vendor/jquery/src/attributes/val.js +163 -0
- data/public/vendor/jquery/src/callbacks.js +205 -0
- data/public/vendor/jquery/src/core.js +498 -0
- data/public/vendor/jquery/src/core/access.js +60 -0
- data/public/vendor/jquery/src/core/init.js +123 -0
- data/public/vendor/jquery/src/core/parseHTML.js +39 -0
- data/public/vendor/jquery/src/core/ready.js +97 -0
- data/public/vendor/jquery/src/core/var/rsingleTag.js +4 -0
- data/public/vendor/jquery/src/css.js +451 -0
- data/public/vendor/jquery/src/css/addGetHookIf.js +24 -0
- data/public/vendor/jquery/src/css/curCSS.js +57 -0
- data/public/vendor/jquery/src/css/defaultDisplay.js +70 -0
- data/public/vendor/jquery/src/css/hiddenVisibleSelectors.js +15 -0
- data/public/vendor/jquery/src/css/support.js +91 -0
- data/public/vendor/jquery/src/css/swap.js +28 -0
- data/public/vendor/jquery/src/css/var/cssExpand.js +3 -0
- data/public/vendor/jquery/src/css/var/getStyles.js +5 -0
- data/public/vendor/jquery/src/css/var/isHidden.js +13 -0
- data/public/vendor/jquery/src/css/var/rmargin.js +3 -0
- data/public/vendor/jquery/src/css/var/rnumnonpx.js +5 -0
- data/public/vendor/jquery/src/data.js +179 -0
- data/public/vendor/jquery/src/data/Data.js +181 -0
- data/public/vendor/jquery/src/data/accepts.js +20 -0
- data/public/vendor/jquery/src/data/var/data_priv.js +5 -0
- data/public/vendor/jquery/src/data/var/data_user.js +5 -0
- data/public/vendor/jquery/src/deferred.js +149 -0
- data/public/vendor/jquery/src/deprecated.js +13 -0
- data/public/vendor/jquery/src/dimensions.js +50 -0
- data/public/vendor/jquery/src/effects.js +649 -0
- data/public/vendor/jquery/src/effects/Tween.js +114 -0
- data/public/vendor/jquery/src/effects/animatedSelector.js +13 -0
- data/public/vendor/jquery/src/event.js +868 -0
- data/public/vendor/jquery/src/event/alias.js +39 -0
- data/public/vendor/jquery/src/event/support.js +9 -0
- data/public/vendor/jquery/src/exports/amd.js +24 -0
- data/public/vendor/jquery/src/exports/global.js +32 -0
- data/public/vendor/jquery/src/intro.js +44 -0
- data/public/vendor/jquery/src/jquery.js +36 -0
- data/public/vendor/jquery/src/manipulation.js +582 -0
- data/public/vendor/jquery/src/manipulation/_evalUrl.js +18 -0
- data/public/vendor/jquery/src/manipulation/support.js +31 -0
- data/public/vendor/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/public/vendor/jquery/src/offset.js +204 -0
- data/public/vendor/jquery/src/outro.js +1 -0
- data/public/vendor/jquery/src/queue.js +142 -0
- data/public/vendor/jquery/src/queue/delay.js +22 -0
- data/public/vendor/jquery/src/selector-native.js +172 -0
- data/public/vendor/jquery/src/selector-sizzle.js +14 -0
- data/public/vendor/jquery/src/selector.js +1 -0
- data/public/vendor/jquery/src/serialize.js +111 -0
- data/public/vendor/jquery/src/sizzle/dist/sizzle.js +2044 -0
- data/public/vendor/jquery/src/sizzle/dist/sizzle.min.js +3 -0
- data/public/vendor/jquery/src/sizzle/dist/sizzle.min.map +1 -0
- data/public/vendor/jquery/src/traversing.js +200 -0
- data/public/vendor/jquery/src/traversing/findFilter.js +100 -0
- data/public/vendor/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/public/vendor/jquery/src/var/arr.js +3 -0
- data/public/vendor/jquery/src/var/class2type.js +4 -0
- data/public/vendor/jquery/src/var/concat.js +5 -0
- data/public/vendor/jquery/src/var/hasOwn.js +5 -0
- data/public/vendor/jquery/src/var/indexOf.js +5 -0
- data/public/vendor/jquery/src/var/pnum.js +3 -0
- data/public/vendor/jquery/src/var/push.js +5 -0
- data/public/vendor/jquery/src/var/rnotwhite.js +3 -0
- data/public/vendor/jquery/src/var/slice.js +5 -0
- data/public/vendor/jquery/src/var/strundefined.js +3 -0
- data/public/vendor/jquery/src/var/support.js +4 -0
- data/public/vendor/jquery/src/var/toString.js +5 -0
- data/public/vendor/jquery/src/wrap.js +78 -0
- metadata +468 -0
data/bower.json
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"name": "growbot-web",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"authors": [
|
5
|
+
"David Long <dave@davejlong.com>"
|
6
|
+
],
|
7
|
+
"license": "MIT",
|
8
|
+
"ignore": [
|
9
|
+
"**/.*",
|
10
|
+
"node_modules",
|
11
|
+
"bower_components",
|
12
|
+
"public/vendor",
|
13
|
+
"test",
|
14
|
+
"tests"
|
15
|
+
],
|
16
|
+
"dependencies": {
|
17
|
+
"jquery": "~2.1.1"
|
18
|
+
}
|
19
|
+
}
|
data/config.ru
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
Bundler.require(:default)
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(::File.expand_path('lib', ::File.dirname(__FILE__)))
|
7
|
+
|
8
|
+
require 'growbot/web/env'
|
9
|
+
Growbot::Web::Env.root = File.expand_path '.', File.dirname(__FILE__)
|
10
|
+
|
11
|
+
require 'growbot/web/app'
|
12
|
+
|
13
|
+
run Growbot::Web::App
|
data/growbot-web.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'growbot/web/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'growbot-web'
|
8
|
+
spec.version = Growbot::Web::VERSION
|
9
|
+
spec.authors = ['David Long']
|
10
|
+
spec.email = ['dave@davejlong.com']
|
11
|
+
spec.summary = %q{Web client to display Growbot metrics}
|
12
|
+
spec.homepage = 'http://github.com/davejlong/growbot-web'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'sinatra', '~> 1.4'
|
21
|
+
spec.add_runtime_dependency 'sinatra-contrib', ' ~> 1.4'
|
22
|
+
spec.add_runtime_dependency 'yajl-ruby', '~> 1.2'
|
23
|
+
spec.add_runtime_dependency 'ashikawa-core', '~> 0.10'
|
24
|
+
spec.add_runtime_dependency 'haml', '~> 4.0'
|
25
|
+
spec.add_runtime_dependency 'coffee-script', '~> 2.2'
|
26
|
+
spec.add_runtime_dependency 'bourbon', '~> 4.0'
|
27
|
+
spec.add_runtime_dependency 'neat', '~> 1.6'
|
28
|
+
spec.add_runtime_dependency 'bitters', '~> 0.9'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
31
|
+
spec.add_development_dependency 'rake'
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.0.0.beta'
|
33
|
+
spec.add_development_dependency 'dotenv'
|
34
|
+
spec.add_development_dependency 'yard'
|
35
|
+
end
|
data/lib/growbot/web.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'sinatra/json'
|
3
|
+
require 'yajl'
|
4
|
+
|
5
|
+
require_relative '../web'
|
6
|
+
require_relative 'data'
|
7
|
+
|
8
|
+
module Growbot
|
9
|
+
module Web
|
10
|
+
class App < Sinatra::Base
|
11
|
+
configure do
|
12
|
+
set :root, File.expand_path(File.dirname(__FILE__))
|
13
|
+
|
14
|
+
set :public_folder, File.join(settings.root, '..', '..', '..', 'public')
|
15
|
+
|
16
|
+
set :haml, format: :html5, layout: :layout
|
17
|
+
set :scss, views: File.join(settings.root, 'views/sass')
|
18
|
+
if ENV['RACK_ENV'].eql? 'production'
|
19
|
+
set :scss, style: :compressed,
|
20
|
+
cache: true,
|
21
|
+
cache_location: '/tmp/growbot-sass-cache'
|
22
|
+
else
|
23
|
+
set :scss, style: :expanded
|
24
|
+
end
|
25
|
+
|
26
|
+
set :coffee, views: File.join(settings.root, 'views/coffee'),
|
27
|
+
cache: true,
|
28
|
+
cache_location: '/tmp/growbot-coffee-cache'
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/' do
|
33
|
+
haml :index
|
34
|
+
end
|
35
|
+
|
36
|
+
get '/data.json' do
|
37
|
+
json Data.new.get
|
38
|
+
end
|
39
|
+
|
40
|
+
get '/stylesheets/:sheet.css' do
|
41
|
+
scss params[:sheet].to_sym
|
42
|
+
end
|
43
|
+
|
44
|
+
get '/javascripts/:script.js' do
|
45
|
+
coffee params[:script].to_sym
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'ashikawa-core'
|
2
|
+
module Growbot
|
3
|
+
module Web
|
4
|
+
class Data
|
5
|
+
attr_accessor :database
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def get
|
11
|
+
dataset = []
|
12
|
+
query = <<-QUERY
|
13
|
+
FOR row in readings
|
14
|
+
FILTER row.moisture != 0
|
15
|
+
FILTER row.light != 0
|
16
|
+
FILTER row.time >= #{start_time}
|
17
|
+
SORT row.time ASC
|
18
|
+
RETURN row
|
19
|
+
QUERY
|
20
|
+
collection.query.execute(query).each do |document|
|
21
|
+
dataset << document.to_h
|
22
|
+
end
|
23
|
+
dataset
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def start_time
|
28
|
+
(Time.now - 6*24*60*60).to_i * 1000
|
29
|
+
end
|
30
|
+
|
31
|
+
def database
|
32
|
+
@database ||= Ashikawa::Core::Database.new do |config|
|
33
|
+
config.url = 'http://localhost:8529/_db/growbot'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def collection
|
38
|
+
@collection ||= database[:readings]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
menu = $('#navigation-menu')
|
2
|
+
menuToggle = $('#js-mobile-menu')
|
3
|
+
alert('Hello')
|
4
|
+
menuToggle.on 'click', (e) ->
|
5
|
+
e.preventDefault()
|
6
|
+
menu.slideToggle () ->
|
7
|
+
menu.removeAttr 'style' if menu.is ':hidden'
|
8
|
+
|
9
|
+
|
10
|
+
displayError = () ->
|
11
|
+
error = document.createElement 'div'
|
12
|
+
error.classList.add 'error'
|
13
|
+
|
14
|
+
text = document.createElement 'span'
|
15
|
+
text.innerText = 'An error has occurred. Please try again later.'
|
16
|
+
error.appendChild text
|
17
|
+
|
18
|
+
document.querySelector('.message-center').appendChild error
|
19
|
+
|
20
|
+
drawAverages = (rawData) ->
|
21
|
+
# Reduce down the data to build averages
|
22
|
+
hourAgo = new Date()
|
23
|
+
hourAgo.setHours hourAgo.getHours()-1
|
24
|
+
|
25
|
+
|
26
|
+
data = rawData.filter (d) -> d.time >= hourAgo
|
27
|
+
return unless data.length
|
28
|
+
|
29
|
+
totalLevels = data.reduce ((p, c) ->
|
30
|
+
p.moisture += c.moisture
|
31
|
+
p.light += c.light
|
32
|
+
p
|
33
|
+
), { moisture: 0, light: 0 }
|
34
|
+
averageLevels = {
|
35
|
+
moisture: Math.floor(totalLevels.moisture / data.length)
|
36
|
+
light: Math.floor(totalLevels.light / data.length)
|
37
|
+
}
|
38
|
+
|
39
|
+
d3.select('#moistureWidget .number').text averageLevels.moisture
|
40
|
+
d3.select('#lightWidget .number').text averageLevels.light
|
41
|
+
|
42
|
+
getContainerWidth = (container) ->
|
43
|
+
$(container).innerWidth()
|
44
|
+
|
45
|
+
drawLine = (data, container, xKey='x', yKey='y', scales) ->
|
46
|
+
width = getContainerWidth(container)
|
47
|
+
m = [15, 80, 15, 80] # Margins
|
48
|
+
w = width - m[1] - m[3] # Width
|
49
|
+
h = 400 - m[0] - m[2] # Height
|
50
|
+
# Create the initial chart to work with
|
51
|
+
chart = d3.select(container).append('svg')
|
52
|
+
.attr('width', w + m[1] + m[3]).attr('height', h + m[0] + m[1])
|
53
|
+
.append('g')
|
54
|
+
.attr('transform', "translate(#{m[3]}, #{m[0]})")
|
55
|
+
|
56
|
+
scales.x.range([0, w])
|
57
|
+
scales.y.range([0, h])
|
58
|
+
|
59
|
+
xAxis = d3.svg.axis().scale(scales.x)
|
60
|
+
yAxis = d3.svg.axis().scale(scales.y).orient('left')
|
61
|
+
chart.append('g').attr('class', 'x axis')
|
62
|
+
.attr('transform', "translate(0, #{h})")
|
63
|
+
.call(xAxis)
|
64
|
+
chart.append('g').attr('class', 'y axis')
|
65
|
+
.attr('transform', "translate(0, 0)")
|
66
|
+
.call(yAxis)
|
67
|
+
|
68
|
+
line = d3.svg.line()
|
69
|
+
.x((d) -> scales.x(d[xKey]))
|
70
|
+
.y((d) -> scales.y(d[yKey]))
|
71
|
+
# .interpolate('cardinal')
|
72
|
+
|
73
|
+
chart.append('path').attr('d', line(data))
|
74
|
+
|
75
|
+
|
76
|
+
d3.json('/data.json')
|
77
|
+
.get (error, data) ->
|
78
|
+
data = data.map (d) ->
|
79
|
+
d.time = new Date(d.time)
|
80
|
+
d.x = d.time
|
81
|
+
d
|
82
|
+
min =
|
83
|
+
time: d3.min data, (d) -> d.time
|
84
|
+
light: d3.min data, (d) -> d.light
|
85
|
+
moisture: d3.min data, (d) -> d.moisture
|
86
|
+
max =
|
87
|
+
time: d3.max data, (d) -> d.time
|
88
|
+
light: d3.max data, (d) -> d.light
|
89
|
+
moisture: d3.max data, (d) -> d.moisture
|
90
|
+
|
91
|
+
drawAverages(data)
|
92
|
+
|
93
|
+
|
94
|
+
width = getContainerWidth('#lineChart')
|
95
|
+
m = [15, 80, 15, 80] # Margins
|
96
|
+
w = width - m[1] - m[3] # Width
|
97
|
+
h = 300 - m[0] - m[2] # Height
|
98
|
+
|
99
|
+
scales =
|
100
|
+
x: d3.time.scale().domain([min.time, max.time]).range([0, w])
|
101
|
+
y: d3.scale.linear().range([0, h])
|
102
|
+
if max.light > max.moisture
|
103
|
+
scales.y.domain([max.light, 0])
|
104
|
+
else
|
105
|
+
scales.y.domain([max.moisture, 0])
|
106
|
+
|
107
|
+
chart = d3.select('#lineChart').append('svg')
|
108
|
+
.attr('width', w + m[1] + m[3]).attr('height', h + m[0] + m[1])
|
109
|
+
.append('g')
|
110
|
+
.attr('transform', "translate(#{m[3]}, #{m[0]})")
|
111
|
+
|
112
|
+
xAxis = d3.svg.axis().scale(scales.x)
|
113
|
+
yAxis = d3.svg.axis().scale(scales.y).orient('left')
|
114
|
+
chart.append('g').attr('class', 'x axis')
|
115
|
+
.attr('transform', "translate(0, #{h})")
|
116
|
+
.call xAxis
|
117
|
+
chart.append('g').attr('class', 'y axis')
|
118
|
+
.attr('transform', 'translate(0, 0)')
|
119
|
+
.call yAxis
|
120
|
+
|
121
|
+
moistureLine = d3.svg.line()
|
122
|
+
.x((d) -> scales.x(d.time))
|
123
|
+
.y((d) -> scales.y(d.moisture))
|
124
|
+
lightLine = d3.svg.line()
|
125
|
+
.x((d) -> scales.x(d.time))
|
126
|
+
.y((d) -> scales.y(d.light))
|
127
|
+
|
128
|
+
colorScale = d3.scale.category10()
|
129
|
+
console.log(colorScale)
|
130
|
+
chart.append('path').attr('d', moistureLine(data)).style('stroke', colorScale(0))
|
131
|
+
chart.append('path').attr('d', lightLine(data)).style('stroke', colorScale(1))
|
@@ -0,0 +1,20 @@
|
|
1
|
+
%html(lang="en")
|
2
|
+
%head
|
3
|
+
%title Growbot
|
4
|
+
%link(href="/vendor/colorbrewer/colorbrewer.css" type="text/css" rel="stylesheet")
|
5
|
+
%link(href="/stylesheets/app.css" type="text/css" rel="stylesheet")
|
6
|
+
%body
|
7
|
+
%header.navigation
|
8
|
+
.menu-wrapper
|
9
|
+
%a.logo(href="/") Growbot
|
10
|
+
%p#js-mobile-menu.navigation-menu-button MENU
|
11
|
+
.nav
|
12
|
+
%ul#navigation-menu
|
13
|
+
%li.take-reading
|
14
|
+
%a(href="javascript:void(0)") Read Sensors
|
15
|
+
.message-center
|
16
|
+
= yield
|
17
|
+
%script(src="/vendor/jquery/dist/jquery.js")
|
18
|
+
%script(src="/vendor/d3/d3.js")
|
19
|
+
%script(src="/vendor/colorbrewer/colorbrewer.js")
|
20
|
+
%script(src="/javascripts/app.js")
|
@@ -0,0 +1,59 @@
|
|
1
|
+
@import 'bourbon/bourbon';
|
2
|
+
@import 'neat/neat';
|
3
|
+
@import 'bitters/bitters';
|
4
|
+
|
5
|
+
@import 'refills/refills';
|
6
|
+
|
7
|
+
@import 'widgets/widgets';
|
8
|
+
|
9
|
+
body {
|
10
|
+
margin: 0;
|
11
|
+
padding: 0;
|
12
|
+
}
|
13
|
+
|
14
|
+
// Layout
|
15
|
+
section {
|
16
|
+
@include outer-container;
|
17
|
+
|
18
|
+
main { @include span-columns(9); }
|
19
|
+
aside { @include span-columns(3); }
|
20
|
+
}
|
21
|
+
|
22
|
+
// Sections
|
23
|
+
section {
|
24
|
+
.title {
|
25
|
+
border-bottom: 1px solid #eee;
|
26
|
+
margin-bottom: golden-ratio(15px, 1);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
// Flash messages
|
31
|
+
div.notice { @extend %flash-notice; }
|
32
|
+
div.success { @extend %flash-success; }
|
33
|
+
div.error { @extend %flash-error; }
|
34
|
+
|
35
|
+
// Charting
|
36
|
+
|
37
|
+
path {
|
38
|
+
// stroke: $base-accent-color;
|
39
|
+
stroke-width: 1;
|
40
|
+
fill: none;
|
41
|
+
}
|
42
|
+
|
43
|
+
.axis {
|
44
|
+
shape-rendering: crispEdges;
|
45
|
+
|
46
|
+
text {
|
47
|
+
font-size: 10px;
|
48
|
+
}
|
49
|
+
|
50
|
+
line, path {
|
51
|
+
stroke: $light-gray;
|
52
|
+
}
|
53
|
+
|
54
|
+
&.x {
|
55
|
+
.minor {
|
56
|
+
stroke-opacity: 0.5;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// Neat Settings -- uncomment if using Neat
|
2
|
+
///////////////////////////////////////////////////////////////////////////////
|
3
|
+
@import "../neat/neat-helpers"; // or "neat/neat-helpers" when not in Rails
|
4
|
+
@import "grid-settings";
|
5
|
+
|
6
|
+
|
7
|
+
// Bitters
|
8
|
+
///////////////////////////////////////////////////////////////////////////////
|
9
|
+
@import "variables";
|
10
|
+
@import "extends/base";
|
11
|
+
@import "mixins/base";
|
12
|
+
@import "typography";
|
13
|
+
@import "forms";
|
14
|
+
@import "tables";
|
15
|
+
@import "lists";
|
16
|
+
@import "flashes";
|