domotics-core 0.2.1 → 0.2.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d31d71816c9455bade9c824b113015a28910e2d6
4
- data.tar.gz: 05587d42ffd80c7c24a82397293e9f47a9971715
2
+ SHA256:
3
+ metadata.gz: aa3e061dd51a3ebe28885793ab969d98f67df951c4fec5ff3e90bd48b1c76f89
4
+ data.tar.gz: 175278d956f8ccafda95bb89a371172181581c297f3fb9cad6eb9a7e4589027e
5
5
  SHA512:
6
- metadata.gz: 79d8973f4ea95522a1398e06532642858a7379abf44181a7819aae2988b4b8ed9feb0ca3af9336fb8470d59b545722dde781008bffbc0a85fa2e11929b96a153
7
- data.tar.gz: e210292eb529442ab3d7de20dc706e2fd320207064c0b25fdcbdb951b0cf1542e42599519989f22c01c0a833d46993c668823a00b41472fdbc66f5796205d180
6
+ metadata.gz: 67c0ff46d5504c10d22278e300a57047fe45d23310890cb56c2153fd0c6f0e2144efabca02a5f37d7f6b022b45fd61ae387e5fac65cce5cc7443bc86740081f8
7
+ data.tar.gz: 12f3e5e769cb24e392f48c0c10afe6e9d962381294c74588e2372752b005b5f50498ded8a4ce0a6db82936abe9be61384f30a6bb145cb65bdb9226e33293e449
@@ -1,21 +1,20 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'domotics/core/version'
3
+ require "domotics/core/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "domotics-core"
8
- spec.version = Domotics::Core::VERSION
9
- spec.authors = ["goredar"]
10
- spec.email = ["info@goredar.it"]
11
- spec.summary = %q{Home automation system.}
12
- spec.description = %q{Main core elements}
13
- spec.homepage = "https://goredar.it"
14
- spec.license = "MIT"
6
+ spec.name = "domotics-core"
7
+ spec.version = Domotics::Core::VERSION
8
+ spec.authors = ["goredar"]
9
+ spec.email = ["info@goredar.it"]
10
+ spec.summary = "Home automation system."
11
+ spec.description = "Main core elements"
12
+ spec.homepage = "https://goredar.it"
13
+ spec.license = "MIT"
15
14
 
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)/})
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)/})
19
18
  spec.require_paths = ["lib"]
20
19
 
21
20
  spec.add_runtime_dependency "domotics-arduino"
@@ -1,8 +1,11 @@
1
1
  module Domotics::Core
2
2
  class FileCameraDevice < Device #__as__ :file_camera
3
+
3
4
  attr_accessor :mode
4
5
  attr_reader :current_file_name, :camera_element
6
+
5
7
  def initialize(args = {})
8
+ @sensors = []
6
9
  @current_file_name = nil
7
10
  @mode = args[:mode] || :watch
8
11
  # Emulate element
@@ -24,6 +27,11 @@ module Domotics::Core
24
27
  end
25
28
  super
26
29
  end
30
+
31
+ def register_sensor(sensor)
32
+ @sensors << sensor
33
+ end
34
+
27
35
  def event_handler(event)
28
36
  return if File.extname(event.name) != @file_ext
29
37
  # Wait untill close file and rename it
@@ -41,10 +49,14 @@ module Domotics::Core
41
49
  @current_file_name = nil
42
50
  FileUtils.rm "#{@path}/#{event.name}"
43
51
  end
52
+ @sensors.each { |sensor| sensor.state_changed :motion_detection }
53
+ @camera_element.state_changed :new_image
44
54
  end
55
+
45
56
  def current_link
46
57
  "#{@camera_element.room.name}/#{@camera_element.name}/file/#{Time.now.to_i}#{@file_ext}"
47
58
  end
59
+
48
60
  def current_file
49
61
  IO.read @current_file_name if @current_file_name
50
62
  end
@@ -1,7 +1,7 @@
1
1
  module Domotics::Core
2
2
  class Element
3
3
  @@data = DataHash.new
4
- attr_reader :name, :type, :room
4
+ attr_reader :name, :type, :room, :device
5
5
 
6
6
  def initialize(args = {})
7
7
  @room = args[:room]
@@ -57,7 +57,7 @@ module Domotics::Core
57
57
  end
58
58
 
59
59
  def to_s
60
- "Element[#{@room.name}@#{@name}](id:#{__id__})"
60
+ "#{@room.name}@#{@name}(id:#{__id__})"
61
61
  end
62
62
  end
63
63
  end
@@ -3,35 +3,26 @@ module Domotics::Core
3
3
  def initialize(args = {})
4
4
  @type = args[:type] || :button
5
5
  @touch = args[:touch]
6
- @taped = true
7
- #@tap_lock = Mutex.new
6
+ @last_on = nil
8
7
  args[:driver] = @touch ? "DigitalSensor" : "NOSensor"
9
8
  load_driver args
10
9
  super
11
10
  end
12
- def set_state(*args)
11
+
12
+ def set_state(*_args)
13
13
  nil
14
14
  end
15
15
 
16
16
  def state_changed(value)
17
17
  case value
18
18
  when :on
19
- (@last_on = Time.now; @taped = false) if @taped
19
+ @last_on = Time.now
20
20
  when :off
21
21
  case Time.now - (@last_on || Time.now)
22
- when 0...0.01 then return # debounce
23
- when 0.01...0.3 then super :tap; @taped = true
24
- when 0.3...1 then super :long_tap; @taped = true
25
- #@tap_lock.synchronize do
26
- # if @tap and @tap.alive?
27
- # @tap.kill
28
- # @tap = nil
29
- # super :double_tap
30
- # else
31
- # @tap = Thread.new { sleep 0.25; super :tap }
32
- # end
33
- #end
34
- else super :long_tap_x2; @taped = true
22
+ when 0...0.03 then nil # debounce
23
+ when 0.03...0.3 then super :tap
24
+ when 0.3...1 then super :long_tap
25
+ when 1...2 then super :long_tap_x2
35
26
  end
36
27
  end
37
28
  end
@@ -6,9 +6,9 @@ module Domotics::Core
6
6
  load_driver args
7
7
  super
8
8
  end
9
- #def to_hls(state)
10
- # super == :on ? :move : :no_move
11
- #end
9
+ def to_hls(state)
10
+ super == :on ? :move : :no_move
11
+ end
12
12
  def set_state(*args)
13
13
  nil
14
14
  end
@@ -6,9 +6,9 @@ module Domotics::Core
6
6
  load_driver args
7
7
  super
8
8
  end
9
- #def to_hls(state)
10
- # super == :on ? :open : :close
11
- #end
9
+ def to_hls(state)
10
+ super == :on ? :open : :close
11
+ end
12
12
  def set_state(*args)
13
13
  nil
14
14
  end
@@ -1,6 +1,6 @@
1
1
  module Domotics::Core
2
2
  class Switch < Element
3
- MINIMUM_LAG = 1
3
+ MINIMUM_LAG = 0
4
4
  def initialize(args = {})
5
5
  @type = args[:type] || :switch
6
6
  @lag = nil
@@ -11,52 +11,62 @@ module Domotics::Core
11
11
  super
12
12
  @initialized = true
13
13
  end
14
+
14
15
  def set_state(value)
15
16
  @initialized ? (super unless state == value) : super
16
17
  end
18
+
17
19
  def on(timer = nil)
18
20
  set_state :on
19
21
  lag(:off, timer)
20
22
  end
23
+
21
24
  def on?
22
25
  state == :on
23
26
  end
27
+
24
28
  def delay_on(timer)
25
29
  lag(:on, timer)
26
30
  end
31
+
27
32
  def off(timer = nil)
28
33
  set_state :off
29
34
  lag(:on, timer)
30
35
  end
36
+
31
37
  def off?
32
38
  state == :off
33
39
  end
34
- def delay_off(timer)
35
- lag(:off, timer)
40
+
41
+ def delay_off(timer, &block)
42
+ lag(:off, timer, &block)
36
43
  end
44
+
37
45
  def toggle(timer = nil)
38
46
  set_state state == :off ? :on : :off
39
47
  lag(:toggle, timer)
40
48
  end
49
+
41
50
  def delay_toggle(timer)
42
51
  lag(:toggle, timer)
43
52
  end
44
53
 
45
54
  private
46
55
 
47
- def lag(action = nil, timer = nil)
56
+ def lag(action = nil, timer = nil, &block)
48
57
  # Kill previous action -> out of date
49
58
  @lag_lock.synchronize do
50
- if @lag and @lag.alive?
59
+ if @lag && @lag.alive?
51
60
  @lag.kill
52
61
  @lag = nil
53
62
  end
54
- raise ArgumentError unless (timer.is_a?(Integer) and timer >= MINIMUM_LAG)
63
+ raise ArgumentError unless timer.is_a?(Integer) && (timer >= MINIMUM_LAG)
64
+
55
65
  # Delayed action
56
- @lag = Thread.new do
66
+ @lag = Thread.new {
57
67
  sleep timer
58
- public_send action
59
- end
68
+ block_given? ? (public_send(action) if block.call) : public_send(action)
69
+ }
60
70
  end
61
71
  rescue ArgumentError
62
72
  nil
@@ -7,7 +7,7 @@ Thread.class_eval do
7
7
  block.call
8
8
  rescue Exception => e
9
9
  Domotics::Core::Setup.logger.error { e.message }
10
- Domotics::Core::Setup.logger.debug { e.inspect }
10
+ Domotics::Core::Setup.logger.debug { e.backtrace.join $/ }
11
11
  nil
12
12
  end
13
13
  end
@@ -57,7 +57,7 @@ module Domotics::Core
57
57
  # Default - simple prints event
58
58
  def event_handler(msg = {})
59
59
  event, element = msg[:event], msg[:element]
60
- @logger.info { "Event message :#{event} from #{element} with state [#{element.state}]" }
60
+ @logger.info { "[Domotics] event [#{event}] element [#{element}] state [#{element.state}]" }
61
61
  Domotics::Core::WsServer.publish "#{element.room.name}/#{element.name}"
62
62
  end
63
63
 
@@ -2,8 +2,6 @@ module Domotics::Core
2
2
  class Server
3
3
  def initialize(args = {})
4
4
  @logger = Domotics::Core::Setup.logger || Logger.new(STDERR)
5
- @args = {}
6
- @args[:Host], @args[:Port] = args[:host], args[:port]
7
5
  end
8
6
  def call(env)
9
7
  # [object]/[action]/[params]
@@ -38,8 +36,8 @@ module Domotics::Core
38
36
  end
39
37
  end
40
38
 
41
- def run
42
- Rack::Handler::Thin.run Rack::Builder.new{ run Domotics::Core::Server.new }, @args
39
+ def self.run(args = {})
40
+ Rack::Handler::Thin.run self.new, args
43
41
  end
44
42
 
45
43
  private
@@ -1,6 +1,6 @@
1
1
  module Domotics
2
2
  module Core
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.8"
4
4
  end
5
5
  end
6
6
 
@@ -1,28 +1,34 @@
1
1
  module Domotics::Core
2
2
  class WsServer
3
- @@channel = EM::Channel.new
3
+ @@parent = nil
4
4
  def initialize(args = {})
5
5
  @logger = Domotics::Core::Setup.logger || Logger.new(STDERR)
6
6
  @args = args
7
+ @@parent, @child = Socket.pair(:UNIX, :DGRAM, 0)
7
8
  end
8
9
  def run
9
- Thread.new do
10
- @logger.info { "Starting WebSocet Server on #{@args[:host]}:#{@args[:port]}" }
10
+ @logger.info { "[WebSocket] server [#{@args[:host]}:#{@args[:port]}]" }
11
+ fork do
12
+ @@parent.close
13
+ channel = EventMachine::Channel.new
14
+ Thread.new { loop { channel.push @child.recv(2**10) }}
11
15
  EventMachine::WebSocket.start(@args) do |ws|
12
16
  ws.onopen do
13
- sid = @@channel.subscribe { |msg| ws.send msg }
17
+ sid = channel.subscribe { |msg| ws.send msg }
18
+ @logger.info { "[WebSocket] client [#{sid}]" }
14
19
  ws.onmessage do |msg|
15
- @logger.info { "WebSocket message [#{msg}] from client [#{sid}]" }
20
+ @logger.info { "[WebSocket] message [#{msg}] from [#{sid}]" }
16
21
  end
17
22
  ws.onclose do
18
- @@channel.unsubscribe(sid)
23
+ channel.unsubscribe(sid)
19
24
  end
20
25
  end
21
26
  end
22
27
  end
28
+ @child.close
23
29
  end
24
30
  def self.publish(msg)
25
- @@channel.push msg
31
+ @@parent.send msg, 0 if @@parent
26
32
  end
27
33
  end
28
34
  end
@@ -3,7 +3,7 @@ module Domotics
3
3
  class CameraElement < Domotics::Core::Element
4
4
  def initialize(args = {})
5
5
  super
6
- set_state @device.mode
6
+ set_state @device.mode if state != @device.mode
7
7
  end
8
8
  def image
9
9
  @device.current_link
@@ -1,6 +1,13 @@
1
1
  module Domotics
2
2
  module FileCamera
3
3
  module DigitalSensor
4
+
5
+ def initialize(args = {})
6
+ @device ||= args[:device]
7
+ @device && @device.register_sensor(self)
8
+ super
9
+ end
10
+
4
11
  end
5
12
  end
6
13
  end
@@ -38,5 +38,6 @@ class DomoticsDevicesTestCase < Test::Unit::TestCase
38
38
  %x{echo "[test foto content]" > /tmp/test_foto_4.jpg}
39
39
  sleep 0.5
40
40
  assert_equal "[test foto content]", cam.camera_element.file.chomp
41
+ assert_equal Domotics::Core::Room[:test].last_event(cam.camera_element.name), :state_changed => :new_image
41
42
  end
42
43
  end
@@ -60,4 +60,14 @@ class DomoticsElementsTestCase < Test::Unit::TestCase
60
60
  sleep 0.01
61
61
  assert_equal room.last_event(btn.name), :state_changed => :long_tap
62
62
  end
63
- end
63
+
64
+ def test_camera_motion_sensor
65
+ room = Domotics::Core::Room[:test]
66
+ cam_mt = room.cam_motion
67
+ saved_mode = cam_el.device.mode
68
+ %x{echo "[test foto content]" > /tmp/test_foto.jpg}
69
+ sleep 0.5
70
+ assert_equal room.last_event(cam_mt.name), :state_changed => :motion_detection
71
+ assert_equal cam_el.device.mode, saved_mode
72
+ end
73
+ end
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.2.1
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - goredar
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-02 00:00:00.000000000 Z
11
+ date: 2020-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: domotics-arduino
@@ -223,7 +223,7 @@ homepage: https://goredar.it
223
223
  licenses:
224
224
  - MIT
225
225
  metadata: {}
226
- post_install_message:
226
+ post_install_message:
227
227
  rdoc_options: []
228
228
  require_paths:
229
229
  - lib
@@ -238,9 +238,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
238
238
  - !ruby/object:Gem::Version
239
239
  version: '0'
240
240
  requirements: []
241
- rubyforge_project:
242
- rubygems_version: 2.2.2
243
- signing_key:
241
+ rubygems_version: 3.1.4
242
+ signing_key:
244
243
  specification_version: 4
245
244
  summary: Home automation system.
246
245
  test_files: