growbot-web 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (229) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +22 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +35 -0
  7. data/Rakefile +39 -0
  8. data/arduino_data.txt +6137 -0
  9. data/bower.json +19 -0
  10. data/config.ru +13 -0
  11. data/growbot-web.gemspec +35 -0
  12. data/lib/growbot/web.rb +6 -0
  13. data/lib/growbot/web/app.rb +49 -0
  14. data/lib/growbot/web/data.rb +42 -0
  15. data/lib/growbot/web/env.rb +9 -0
  16. data/lib/growbot/web/version.rb +5 -0
  17. data/lib/growbot/web/views/coffee/app.coffee +131 -0
  18. data/lib/growbot/web/views/index.haml +10 -0
  19. data/lib/growbot/web/views/layout.haml +20 -0
  20. data/lib/growbot/web/views/sass/app.scss +59 -0
  21. data/lib/growbot/web/views/sass/bitters/_bitters.scss +16 -0
  22. data/lib/growbot/web/views/sass/bitters/_flashes.scss +11 -0
  23. data/lib/growbot/web/views/sass/bitters/_forms.scss +95 -0
  24. data/lib/growbot/web/views/sass/bitters/_grid-settings.scss +14 -0
  25. data/lib/growbot/web/views/sass/bitters/_lists.scss +31 -0
  26. data/lib/growbot/web/views/sass/bitters/_tables.scss +22 -0
  27. data/lib/growbot/web/views/sass/bitters/_typography.scss +104 -0
  28. data/lib/growbot/web/views/sass/bitters/_variables.scss +43 -0
  29. data/lib/growbot/web/views/sass/bitters/extends/_base.scss +1 -0
  30. data/lib/growbot/web/views/sass/bitters/extends/_button.scss +7 -0
  31. data/lib/growbot/web/views/sass/bitters/mixins/_base.scss +1 -0
  32. data/lib/growbot/web/views/sass/bitters/mixins/_flash.scss +15 -0
  33. data/lib/growbot/web/views/sass/bourbon/_bourbon-deprecated-upcoming.scss +8 -0
  34. data/lib/growbot/web/views/sass/bourbon/_bourbon.scss +78 -0
  35. data/lib/growbot/web/views/sass/bourbon/addons/_button.scss +374 -0
  36. data/lib/growbot/web/views/sass/bourbon/addons/_clearfix.scss +23 -0
  37. data/lib/growbot/web/views/sass/bourbon/addons/_directional-values.scss +111 -0
  38. data/lib/growbot/web/views/sass/bourbon/addons/_ellipsis.scss +7 -0
  39. data/lib/growbot/web/views/sass/bourbon/addons/_font-family.scss +5 -0
  40. data/lib/growbot/web/views/sass/bourbon/addons/_hide-text.scss +10 -0
  41. data/lib/growbot/web/views/sass/bourbon/addons/_html5-input-types.scss +86 -0
  42. data/lib/growbot/web/views/sass/bourbon/addons/_position.scss +32 -0
  43. data/lib/growbot/web/views/sass/bourbon/addons/_prefixer.scss +45 -0
  44. data/lib/growbot/web/views/sass/bourbon/addons/_retina-image.scss +31 -0
  45. data/lib/growbot/web/views/sass/bourbon/addons/_size.scss +16 -0
  46. data/lib/growbot/web/views/sass/bourbon/addons/_timing-functions.scss +32 -0
  47. data/lib/growbot/web/views/sass/bourbon/addons/_triangle.scss +83 -0
  48. data/lib/growbot/web/views/sass/bourbon/addons/_word-wrap.scss +8 -0
  49. data/lib/growbot/web/views/sass/bourbon/css3/_animation.scss +52 -0
  50. data/lib/growbot/web/views/sass/bourbon/css3/_appearance.scss +3 -0
  51. data/lib/growbot/web/views/sass/bourbon/css3/_backface-visibility.scss +6 -0
  52. data/lib/growbot/web/views/sass/bourbon/css3/_background-image.scss +42 -0
  53. data/lib/growbot/web/views/sass/bourbon/css3/_background.scss +55 -0
  54. data/lib/growbot/web/views/sass/bourbon/css3/_border-image.scss +59 -0
  55. data/lib/growbot/web/views/sass/bourbon/css3/_border-radius.scss +22 -0
  56. data/lib/growbot/web/views/sass/bourbon/css3/_box-sizing.scss +4 -0
  57. data/lib/growbot/web/views/sass/bourbon/css3/_calc.scss +4 -0
  58. data/lib/growbot/web/views/sass/bourbon/css3/_columns.scss +47 -0
  59. data/lib/growbot/web/views/sass/bourbon/css3/_filter.scss +5 -0
  60. data/lib/growbot/web/views/sass/bourbon/css3/_flex-box.scss +321 -0
  61. data/lib/growbot/web/views/sass/bourbon/css3/_font-face.scss +23 -0
  62. data/lib/growbot/web/views/sass/bourbon/css3/_font-feature-settings.scss +10 -0
  63. data/lib/growbot/web/views/sass/bourbon/css3/_hidpi-media-query.scss +10 -0
  64. data/lib/growbot/web/views/sass/bourbon/css3/_hyphens.scss +4 -0
  65. data/lib/growbot/web/views/sass/bourbon/css3/_image-rendering.scss +14 -0
  66. data/lib/growbot/web/views/sass/bourbon/css3/_keyframes.scss +35 -0
  67. data/lib/growbot/web/views/sass/bourbon/css3/_linear-gradient.scss +38 -0
  68. data/lib/growbot/web/views/sass/bourbon/css3/_perspective.scss +8 -0
  69. data/lib/growbot/web/views/sass/bourbon/css3/_placeholder.scss +8 -0
  70. data/lib/growbot/web/views/sass/bourbon/css3/_radial-gradient.scss +39 -0
  71. data/lib/growbot/web/views/sass/bourbon/css3/_transform.scss +15 -0
  72. data/lib/growbot/web/views/sass/bourbon/css3/_transition.scss +77 -0
  73. data/lib/growbot/web/views/sass/bourbon/css3/_user-select.scss +3 -0
  74. data/lib/growbot/web/views/sass/bourbon/functions/_assign.scss +11 -0
  75. data/lib/growbot/web/views/sass/bourbon/functions/_color-lightness.scss +13 -0
  76. data/lib/growbot/web/views/sass/bourbon/functions/_flex-grid.scss +39 -0
  77. data/lib/growbot/web/views/sass/bourbon/functions/_golden-ratio.scss +3 -0
  78. data/lib/growbot/web/views/sass/bourbon/functions/_grid-width.scss +13 -0
  79. data/lib/growbot/web/views/sass/bourbon/functions/_modular-scale.scss +66 -0
  80. data/lib/growbot/web/views/sass/bourbon/functions/_px-to-em.scss +13 -0
  81. data/lib/growbot/web/views/sass/bourbon/functions/_px-to-rem.scss +15 -0
  82. data/lib/growbot/web/views/sass/bourbon/functions/_strip-units.scss +5 -0
  83. data/lib/growbot/web/views/sass/bourbon/functions/_tint-shade.scss +9 -0
  84. data/lib/growbot/web/views/sass/bourbon/functions/_transition-property-name.scss +22 -0
  85. data/lib/growbot/web/views/sass/bourbon/functions/_unpack.scss +17 -0
  86. data/lib/growbot/web/views/sass/bourbon/helpers/_convert-units.scss +15 -0
  87. data/lib/growbot/web/views/sass/bourbon/helpers/_gradient-positions-parser.scss +13 -0
  88. data/lib/growbot/web/views/sass/bourbon/helpers/_is-num.scss +8 -0
  89. data/lib/growbot/web/views/sass/bourbon/helpers/_linear-angle-parser.scss +25 -0
  90. data/lib/growbot/web/views/sass/bourbon/helpers/_linear-gradient-parser.scss +41 -0
  91. data/lib/growbot/web/views/sass/bourbon/helpers/_linear-positions-parser.scss +61 -0
  92. data/lib/growbot/web/views/sass/bourbon/helpers/_linear-side-corner-parser.scss +31 -0
  93. data/lib/growbot/web/views/sass/bourbon/helpers/_radial-arg-parser.scss +69 -0
  94. data/lib/growbot/web/views/sass/bourbon/helpers/_radial-gradient-parser.scss +50 -0
  95. data/lib/growbot/web/views/sass/bourbon/helpers/_radial-positions-parser.scss +18 -0
  96. data/lib/growbot/web/views/sass/bourbon/helpers/_render-gradients.scss +26 -0
  97. data/lib/growbot/web/views/sass/bourbon/helpers/_shape-size-stripper.scss +10 -0
  98. data/lib/growbot/web/views/sass/bourbon/helpers/_str-to-num.scss +50 -0
  99. data/lib/growbot/web/views/sass/bourbon/settings/_prefixer.scss +6 -0
  100. data/lib/growbot/web/views/sass/bourbon/settings/_px-to-em.scss +1 -0
  101. data/lib/growbot/web/views/sass/neat/_neat-helpers.scss +7 -0
  102. data/lib/growbot/web/views/sass/neat/_neat.scss +21 -0
  103. data/lib/growbot/web/views/sass/neat/functions/_new-breakpoint.scss +16 -0
  104. data/lib/growbot/web/views/sass/neat/functions/_private.scss +125 -0
  105. data/lib/growbot/web/views/sass/neat/grid/_fill-parent.scss +7 -0
  106. data/lib/growbot/web/views/sass/neat/grid/_grid.scss +5 -0
  107. data/lib/growbot/web/views/sass/neat/grid/_media.scss +38 -0
  108. data/lib/growbot/web/views/sass/neat/grid/_omega.scss +61 -0
  109. data/lib/growbot/web/views/sass/neat/grid/_outer-container.scss +8 -0
  110. data/lib/growbot/web/views/sass/neat/grid/_pad.scss +8 -0
  111. data/lib/growbot/web/views/sass/neat/grid/_private.scss +43 -0
  112. data/lib/growbot/web/views/sass/neat/grid/_reset.scss +12 -0
  113. data/lib/growbot/web/views/sass/neat/grid/_row.scss +17 -0
  114. data/lib/growbot/web/views/sass/neat/grid/_shift.scss +16 -0
  115. data/lib/growbot/web/views/sass/neat/grid/_span-columns.scss +43 -0
  116. data/lib/growbot/web/views/sass/neat/grid/_to-deprecate.scss +57 -0
  117. data/lib/growbot/web/views/sass/neat/grid/_visual-grid.scss +41 -0
  118. data/lib/growbot/web/views/sass/neat/settings/_grid.scss +7 -0
  119. data/lib/growbot/web/views/sass/neat/settings/_visual-grid.scss +5 -0
  120. data/lib/growbot/web/views/sass/refills/_navigation.scss +190 -0
  121. data/lib/growbot/web/views/sass/refills/_refills.scss +1 -0
  122. data/lib/growbot/web/views/sass/widgets/_big-number.scss +21 -0
  123. data/lib/growbot/web/views/sass/widgets/_widgets.scss +1 -0
  124. data/public/javascripts/app.js +150 -0
  125. data/public/stylesheets/app.css +1 -0
  126. data/public/vendor/colorbrewer/.bower.json +35 -0
  127. data/public/vendor/colorbrewer/LICENSE +38 -0
  128. data/public/vendor/colorbrewer/README.md +7 -0
  129. data/public/vendor/colorbrewer/bower.json +23 -0
  130. data/public/vendor/colorbrewer/colorbrewer.css +1690 -0
  131. data/public/vendor/colorbrewer/colorbrewer.js +302 -0
  132. data/public/vendor/d3/.bower.json +35 -0
  133. data/public/vendor/d3/CONTRIBUTING.md +25 -0
  134. data/public/vendor/d3/LICENSE +26 -0
  135. data/public/vendor/d3/README.md +9 -0
  136. data/public/vendor/d3/bower.json +24 -0
  137. data/public/vendor/d3/composer.json +19 -0
  138. data/public/vendor/d3/d3.js +9263 -0
  139. data/public/vendor/d3/d3.min.js +5 -0
  140. data/public/vendor/jquery/.bower.json +38 -0
  141. data/public/vendor/jquery/MIT-LICENSE.txt +21 -0
  142. data/public/vendor/jquery/bower.json +27 -0
  143. data/public/vendor/jquery/dist/jquery.js +9190 -0
  144. data/public/vendor/jquery/dist/jquery.min.js +5 -0
  145. data/public/vendor/jquery/dist/jquery.min.map +1 -0
  146. data/public/vendor/jquery/src/ajax.js +806 -0
  147. data/public/vendor/jquery/src/ajax/jsonp.js +89 -0
  148. data/public/vendor/jquery/src/ajax/load.js +75 -0
  149. data/public/vendor/jquery/src/ajax/parseJSON.js +13 -0
  150. data/public/vendor/jquery/src/ajax/parseXML.js +28 -0
  151. data/public/vendor/jquery/src/ajax/script.js +64 -0
  152. data/public/vendor/jquery/src/ajax/var/nonce.js +5 -0
  153. data/public/vendor/jquery/src/ajax/var/rquery.js +3 -0
  154. data/public/vendor/jquery/src/ajax/xhr.js +135 -0
  155. data/public/vendor/jquery/src/attributes.js +11 -0
  156. data/public/vendor/jquery/src/attributes/attr.js +143 -0
  157. data/public/vendor/jquery/src/attributes/classes.js +158 -0
  158. data/public/vendor/jquery/src/attributes/prop.js +96 -0
  159. data/public/vendor/jquery/src/attributes/support.js +35 -0
  160. data/public/vendor/jquery/src/attributes/val.js +163 -0
  161. data/public/vendor/jquery/src/callbacks.js +205 -0
  162. data/public/vendor/jquery/src/core.js +498 -0
  163. data/public/vendor/jquery/src/core/access.js +60 -0
  164. data/public/vendor/jquery/src/core/init.js +123 -0
  165. data/public/vendor/jquery/src/core/parseHTML.js +39 -0
  166. data/public/vendor/jquery/src/core/ready.js +97 -0
  167. data/public/vendor/jquery/src/core/var/rsingleTag.js +4 -0
  168. data/public/vendor/jquery/src/css.js +451 -0
  169. data/public/vendor/jquery/src/css/addGetHookIf.js +24 -0
  170. data/public/vendor/jquery/src/css/curCSS.js +57 -0
  171. data/public/vendor/jquery/src/css/defaultDisplay.js +70 -0
  172. data/public/vendor/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  173. data/public/vendor/jquery/src/css/support.js +91 -0
  174. data/public/vendor/jquery/src/css/swap.js +28 -0
  175. data/public/vendor/jquery/src/css/var/cssExpand.js +3 -0
  176. data/public/vendor/jquery/src/css/var/getStyles.js +5 -0
  177. data/public/vendor/jquery/src/css/var/isHidden.js +13 -0
  178. data/public/vendor/jquery/src/css/var/rmargin.js +3 -0
  179. data/public/vendor/jquery/src/css/var/rnumnonpx.js +5 -0
  180. data/public/vendor/jquery/src/data.js +179 -0
  181. data/public/vendor/jquery/src/data/Data.js +181 -0
  182. data/public/vendor/jquery/src/data/accepts.js +20 -0
  183. data/public/vendor/jquery/src/data/var/data_priv.js +5 -0
  184. data/public/vendor/jquery/src/data/var/data_user.js +5 -0
  185. data/public/vendor/jquery/src/deferred.js +149 -0
  186. data/public/vendor/jquery/src/deprecated.js +13 -0
  187. data/public/vendor/jquery/src/dimensions.js +50 -0
  188. data/public/vendor/jquery/src/effects.js +649 -0
  189. data/public/vendor/jquery/src/effects/Tween.js +114 -0
  190. data/public/vendor/jquery/src/effects/animatedSelector.js +13 -0
  191. data/public/vendor/jquery/src/event.js +868 -0
  192. data/public/vendor/jquery/src/event/alias.js +39 -0
  193. data/public/vendor/jquery/src/event/support.js +9 -0
  194. data/public/vendor/jquery/src/exports/amd.js +24 -0
  195. data/public/vendor/jquery/src/exports/global.js +32 -0
  196. data/public/vendor/jquery/src/intro.js +44 -0
  197. data/public/vendor/jquery/src/jquery.js +36 -0
  198. data/public/vendor/jquery/src/manipulation.js +582 -0
  199. data/public/vendor/jquery/src/manipulation/_evalUrl.js +18 -0
  200. data/public/vendor/jquery/src/manipulation/support.js +31 -0
  201. data/public/vendor/jquery/src/manipulation/var/rcheckableType.js +3 -0
  202. data/public/vendor/jquery/src/offset.js +204 -0
  203. data/public/vendor/jquery/src/outro.js +1 -0
  204. data/public/vendor/jquery/src/queue.js +142 -0
  205. data/public/vendor/jquery/src/queue/delay.js +22 -0
  206. data/public/vendor/jquery/src/selector-native.js +172 -0
  207. data/public/vendor/jquery/src/selector-sizzle.js +14 -0
  208. data/public/vendor/jquery/src/selector.js +1 -0
  209. data/public/vendor/jquery/src/serialize.js +111 -0
  210. data/public/vendor/jquery/src/sizzle/dist/sizzle.js +2044 -0
  211. data/public/vendor/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  212. data/public/vendor/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  213. data/public/vendor/jquery/src/traversing.js +200 -0
  214. data/public/vendor/jquery/src/traversing/findFilter.js +100 -0
  215. data/public/vendor/jquery/src/traversing/var/rneedsContext.js +6 -0
  216. data/public/vendor/jquery/src/var/arr.js +3 -0
  217. data/public/vendor/jquery/src/var/class2type.js +4 -0
  218. data/public/vendor/jquery/src/var/concat.js +5 -0
  219. data/public/vendor/jquery/src/var/hasOwn.js +5 -0
  220. data/public/vendor/jquery/src/var/indexOf.js +5 -0
  221. data/public/vendor/jquery/src/var/pnum.js +3 -0
  222. data/public/vendor/jquery/src/var/push.js +5 -0
  223. data/public/vendor/jquery/src/var/rnotwhite.js +3 -0
  224. data/public/vendor/jquery/src/var/slice.js +5 -0
  225. data/public/vendor/jquery/src/var/strundefined.js +3 -0
  226. data/public/vendor/jquery/src/var/support.js +4 -0
  227. data/public/vendor/jquery/src/var/toString.js +5 -0
  228. data/public/vendor/jquery/src/wrap.js +78 -0
  229. 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
@@ -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
@@ -0,0 +1,6 @@
1
+ require_relative 'web/version'
2
+
3
+ module Growbot
4
+ module Web
5
+ end
6
+ end
@@ -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,9 @@
1
+ module Growbot
2
+ module Web
3
+ module Env
4
+ class << self
5
+ attr_accessor :root
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module Growbot
2
+ module Web
3
+ VERSION = "0.0.1"
4
+ end
5
+ 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,10 @@
1
+ %section
2
+ %main
3
+ #lineChart
4
+ %aside
5
+ #moistureWidget.big-number.widget
6
+ .number 0
7
+ .label Avg moisture over last hour
8
+ #lightWidget.big-number.widget
9
+ .number 0
10
+ .label Avg light over last hour
@@ -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";
@@ -0,0 +1,11 @@
1
+ %flash-error {
2
+ @include flash($error-color);
3
+ }
4
+
5
+ %flash-notice {
6
+ @include flash($notice-color);
7
+ }
8
+
9
+ %flash-success {
10
+ @include flash($success-color);
11
+ }