domotics-core 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/domotics-core.gemspec +1 -1
- data/lib/domotics/core.rb +7 -3
- data/lib/domotics/core/device/file_camera_device.rb +47 -0
- data/lib/domotics/core/element.rb +16 -1
- data/lib/domotics/core/element/button.rb +2 -4
- data/lib/domotics/core/element/dimmer.rb +2 -4
- data/lib/domotics/core/element/motion_sensor.rb +2 -4
- data/lib/domotics/core/element/reed_switch.rb +2 -4
- data/lib/domotics/core/element/switch.rb +2 -4
- data/lib/domotics/core/helper/helper.rb +1 -1
- data/lib/domotics/core/server.rb +14 -2
- data/lib/domotics/core/setup.rb +1 -0
- data/lib/domotics/core/version.rb +1 -1
- data/lib/domotics/file_camera/digital_sensor.rb +6 -0
- data/test/config.test.rb +4 -1
- data/test/test_devices.rb +2 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 885324956d9dd4c0e6da8465153c495b9584ec27
|
4
|
+
data.tar.gz: 97a20a0f02fbba7c1c7d4c1556c1e5ab638476d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 737f3b1537896b46d54f41fe430845964991d4fdc60a757c4cb1714207bcd811dc85ad46d78008c7ce57e3425787b31f8e376bd3cb34c5ee6e5dd577fe5efdf8
|
7
|
+
data.tar.gz: bf230dfc73db18a385c6e7c1775d3bd2c90bcc9fd1926697917e08bdfa4f66d8d8ca50e10bee08fc81e12b2cceea0fb882c1f8ad387e72663c578b0255d732c3
|
data/domotics-core.gemspec
CHANGED
@@ -23,8 +23,8 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_runtime_dependency "hiredis"
|
24
24
|
spec.add_runtime_dependency "mongo"
|
25
25
|
spec.add_runtime_dependency "bson_ext"
|
26
|
-
|
27
26
|
spec.add_runtime_dependency "rack"
|
27
|
+
spec.add_runtime_dependency "rb-inotify"
|
28
28
|
|
29
29
|
spec.add_development_dependency "bundler"
|
30
30
|
spec.add_development_dependency "rake"
|
data/lib/domotics/core.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
require 'bundler/setup'
|
1
2
|
# From data_mongo
|
2
3
|
require 'mongo'
|
3
4
|
# From data_redis
|
4
5
|
require 'redis'
|
5
6
|
require 'hiredis'
|
6
7
|
# From arduino_board
|
8
|
+
#require "../domotics-arduino/lib/domotics/arduino"
|
7
9
|
require 'domotics/arduino'
|
8
10
|
# From server
|
9
11
|
require 'json'
|
12
|
+
# From file_camera_device
|
13
|
+
require 'rb-inotify'
|
10
14
|
|
11
15
|
module Domotics
|
12
16
|
module Core
|
@@ -37,9 +41,9 @@ end
|
|
37
41
|
|
38
42
|
gem_path = File.dirname(__FILE__)
|
39
43
|
#require all
|
40
|
-
|
41
|
-
Dir["#{gem_path}
|
42
|
-
|
44
|
+
%w(core/data/*.rb core/*.rb core/helper/*.rb file_camera/*.rb).each do |path|
|
45
|
+
Dir["#{gem_path}/#{path}"].each {|file| require file}
|
46
|
+
end
|
43
47
|
# scan all devices and elements and populate class map
|
44
48
|
[:device, :room, :element].each do |type|
|
45
49
|
Dir["#{gem_path}/core/#{type}/*.rb"].each do |file|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Domotics::Core
|
2
|
+
class FileCameraDevice < Device #__as__ :file_camera
|
3
|
+
def initialize(args = {})
|
4
|
+
# Emulate element
|
5
|
+
@current_link = "xxx"
|
6
|
+
@camera_element = Element.new args
|
7
|
+
s = self
|
8
|
+
image_lambda = lambda { s.current_link }
|
9
|
+
file_lambda = lambda { |*args| s.current_file }
|
10
|
+
@camera_element.eigenclass.send :define_method, :image, image_lambda
|
11
|
+
@camera_element.eigenclass.send :define_method, :file, file_lambda
|
12
|
+
# Path to shots
|
13
|
+
@path = args[:path] || "/tmp"
|
14
|
+
@path.chop! if @path[-1] == "/"
|
15
|
+
# Shots file extension
|
16
|
+
@file_ext = args[:file_ext] || ".jpg"
|
17
|
+
@file_ext = ".#{@file_ext}" unless @file_ext[0] == "."
|
18
|
+
# Remove old shots
|
19
|
+
FileUtils.rm Dir.glob("#{@path}/*#{@file_ext}")
|
20
|
+
# Watch for new shots
|
21
|
+
Thread.new do
|
22
|
+
INotify::Notifier.new.tap do |x|
|
23
|
+
x.watch(@path, :create) { |event| event_handler event }
|
24
|
+
end.run
|
25
|
+
end
|
26
|
+
super
|
27
|
+
end
|
28
|
+
def event_handler(event)
|
29
|
+
filename = "#{@path}/#{event.name}"
|
30
|
+
# Wait untill close file and rename it
|
31
|
+
inot = INotify::Notifier.new
|
32
|
+
inot.watch(filename, :close_write) do |file|
|
33
|
+
@current_name = "#{@path}/#{Time.now.to_i}#{@file_ext}"
|
34
|
+
sleep 0.1
|
35
|
+
File.rename filename, @current_name
|
36
|
+
end
|
37
|
+
inot.process
|
38
|
+
inot.close
|
39
|
+
end
|
40
|
+
def current_link
|
41
|
+
"#{@camera_element.room.name}/#{@camera_element.name}/file/#{Time.now.to_i}#{@file_ext}"
|
42
|
+
end
|
43
|
+
def current_file(*args)
|
44
|
+
IO.read @current_name
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -10,6 +10,12 @@ module Domotics::Core
|
|
10
10
|
set_state(self.state || :off)
|
11
11
|
end
|
12
12
|
|
13
|
+
def load_driver(args = {})
|
14
|
+
return unless args[:device_type]
|
15
|
+
device_space = args[:device_type].to_s.split("_").map{ |x| x.capitalize }.join
|
16
|
+
self.class.class_eval(%(include Domotics::#{device_space}::#{args[:driver]}), __FILE__, __LINE__)
|
17
|
+
end
|
18
|
+
|
13
19
|
def state
|
14
20
|
@@data[self].state
|
15
21
|
end
|
@@ -19,13 +25,22 @@ module Domotics::Core
|
|
19
25
|
{ :elements =>
|
20
26
|
{ @name =>
|
21
27
|
{ :state => state,
|
22
|
-
:info =>
|
28
|
+
:info => info,
|
29
|
+
:img => image,
|
23
30
|
}
|
24
31
|
}
|
25
32
|
}
|
26
33
|
}
|
27
34
|
end
|
28
35
|
|
36
|
+
def info
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def image
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
29
44
|
def set_state(value)
|
30
45
|
@@data[self].state = value
|
31
46
|
@room.notify({ event: :state_set, element: self }) unless @type == :dimmer
|
@@ -5,10 +5,8 @@ module Domotics::Core
|
|
5
5
|
@touch = args[:touch]
|
6
6
|
@taped = true
|
7
7
|
#@tap_lock = Mutex.new
|
8
|
-
|
9
|
-
|
10
|
-
self.class.class_eval(eval_str, __FILE__, __LINE__)
|
11
|
-
end
|
8
|
+
args[:driver] = @touch ? "DigitalSensor" : "NOSensor"
|
9
|
+
load_driver args
|
12
10
|
super
|
13
11
|
end
|
14
12
|
def set_state(*args)
|
@@ -12,10 +12,8 @@ module Domotics::Core
|
|
12
12
|
@type = args[:type] || :dimmer
|
13
13
|
@fade_lock = Mutex.new
|
14
14
|
@fade_thread = nil
|
15
|
-
|
16
|
-
|
17
|
-
self.class.class_eval(eval_str, __FILE__, __LINE__)
|
18
|
-
end
|
15
|
+
args[:driver] = "PWMPin"
|
16
|
+
load_driver args
|
19
17
|
super
|
20
18
|
end
|
21
19
|
|
@@ -2,10 +2,8 @@ module Domotics::Core
|
|
2
2
|
class MotionSensor < Element
|
3
3
|
def initialize(args = {})
|
4
4
|
@type = args[:type] || :motion_sensor
|
5
|
-
|
6
|
-
|
7
|
-
self.class.class_eval(eval_str, __FILE__, __LINE__)
|
8
|
-
end
|
5
|
+
args[:driver] = "DigitalSensor"
|
6
|
+
load_driver args
|
9
7
|
super
|
10
8
|
end
|
11
9
|
#def to_hls(state)
|
@@ -2,10 +2,8 @@ module Domotics::Core
|
|
2
2
|
class ReedSwitch < Element
|
3
3
|
def initialize(args = {})
|
4
4
|
@type = args[:type] || :reed_switch
|
5
|
-
|
6
|
-
|
7
|
-
self.class.class_eval(eval_str, __FILE__, __LINE__)
|
8
|
-
end
|
5
|
+
args[:driver] = "NCSensor"
|
6
|
+
load_driver args
|
9
7
|
super
|
10
8
|
end
|
11
9
|
#def to_hls(state)
|
@@ -5,10 +5,8 @@ module Domotics::Core
|
|
5
5
|
@type = args[:type] || :switch
|
6
6
|
@lag = nil
|
7
7
|
@lag_lock = Mutex.new
|
8
|
-
|
9
|
-
|
10
|
-
self.class.class_eval(eval_str, __FILE__, __LINE__)
|
11
|
-
end
|
8
|
+
args[:driver] = "DigitalPin"
|
9
|
+
load_driver args
|
12
10
|
@initialized = false
|
13
11
|
super
|
14
12
|
@initialized = true
|
data/lib/domotics/core/server.rb
CHANGED
@@ -5,7 +5,9 @@ module Domotics::Core
|
|
5
5
|
end
|
6
6
|
def call(env)
|
7
7
|
# [object]/[action]/[params]
|
8
|
+
p env['PATH_INFO']
|
8
9
|
request = env['PATH_INFO'][1..-1].split('/')
|
10
|
+
request[-1], form = request.last.split(".")
|
9
11
|
object = request.shift
|
10
12
|
return invalid 'room' unless object and object = Room[object.to_sym]
|
11
13
|
return invalid 'element or action' unless object_action = request.shift
|
@@ -18,13 +20,20 @@ module Domotics::Core
|
|
18
20
|
end
|
19
21
|
return invalid 'action' unless action and object.respond_to? action
|
20
22
|
begin
|
21
|
-
object.public_send(action, *request.map { |param| param.to_isym })
|
23
|
+
result = object.public_send(action, *request.map { |param| param.to_isym })
|
22
24
|
rescue Exception => e
|
23
25
|
@logger.error { e.message }
|
24
26
|
@logger.debug { e }
|
25
27
|
return invalid 'request'
|
26
28
|
end
|
27
|
-
|
29
|
+
case form
|
30
|
+
when "json"
|
31
|
+
return ok object.verbose_state.to_json
|
32
|
+
when "jpg"
|
33
|
+
return jpg result
|
34
|
+
else
|
35
|
+
return ok object.verbose_state
|
36
|
+
end
|
28
37
|
end
|
29
38
|
|
30
39
|
private
|
@@ -35,5 +44,8 @@ module Domotics::Core
|
|
35
44
|
def ok(param)
|
36
45
|
[200, {"Content-Type" => "text/html"}, [param]]
|
37
46
|
end
|
47
|
+
def jpg(param)
|
48
|
+
[200, {"Content-Type" => "image/jpeg"}, [param]]
|
49
|
+
end
|
38
50
|
end
|
39
51
|
end
|
data/lib/domotics/core/setup.rb
CHANGED
@@ -43,6 +43,7 @@ module Domotics::Core
|
|
43
43
|
def device(klass, args = {})
|
44
44
|
@current_device[:name] = args[:name]
|
45
45
|
@current_device[:type] = args[:type]
|
46
|
+
args[:room] = Room[@current_room[:name]]
|
46
47
|
klass.new(args) unless Device[args[:name]]
|
47
48
|
yield if ::Kernel.block_given?
|
48
49
|
@current_device.clear
|
data/test/config.test.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
test_room :test do
|
2
|
+
file_camera :cam do
|
3
|
+
motion_sensor :cam_motion
|
4
|
+
end
|
2
5
|
button :button_no_dev
|
3
6
|
dimmer :dimmer_no_dev
|
4
7
|
motion_sensor :ms_no_dev
|
@@ -13,4 +16,4 @@ test_room :test do
|
|
13
16
|
rgb_strip :rgb, r: 9, g: 10, b: 11
|
14
17
|
switch :light_1, pin: 13
|
15
18
|
end
|
16
|
-
end
|
19
|
+
end
|
data/test/test_devices.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: domotics-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- goredar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: domotics-arduino
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rb-inotify
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: bundler
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,6 +183,7 @@ files:
|
|
169
183
|
- lib/domotics/core/data/data_redis.rb
|
170
184
|
- lib/domotics/core/device.rb
|
171
185
|
- lib/domotics/core/device/arduino_board.rb
|
186
|
+
- lib/domotics/core/device/file_camera_device.rb
|
172
187
|
- lib/domotics/core/element.rb
|
173
188
|
- lib/domotics/core/element/button.rb
|
174
189
|
- lib/domotics/core/element/dimmer.rb
|
@@ -182,6 +197,7 @@ files:
|
|
182
197
|
- lib/domotics/core/server.rb
|
183
198
|
- lib/domotics/core/setup.rb
|
184
199
|
- lib/domotics/core/version.rb
|
200
|
+
- lib/domotics/file_camera/digital_sensor.rb
|
185
201
|
- test/config.test.rb
|
186
202
|
- test/test_devices.rb
|
187
203
|
- test/test_elements.rb
|