tilt_hydrometer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7787ee96428a2985cce2db098e27ef62e488f36c7bb261df9553985686bba5ae
4
- data.tar.gz: e9b0fa8ed0434d3948635b24567ea1f47442b0ce6b687fbd265104d35da5c196
3
+ metadata.gz: da6e3efa982aaafa172cc2a9e0dc12fda976df1ba3300a618aadd0f398e7a116
4
+ data.tar.gz: 8f80be83fe3afc2881876d3a513e93db8b883287e52b74be2ea43ca01f4538d6
5
5
  SHA512:
6
- metadata.gz: 6c2a109b1eaf8763e297e748dec7dabae01c5bfa9d1cbf10769691758e35e9e591beedf6b13bf48bc3d2be7b6eb4eb9250cac6275559c191876ced3a55b45166
7
- data.tar.gz: 98acc5748a92c113f7b1f9001b2d8787f6ff0aea55a036fa184a1b98d9953cb2c4e1dfead82d5eef4e6b9ce0c1508595cdd2f5bd088d0beba2ff78bb72b2e92d
6
+ metadata.gz: a7bd9aa98f2f157b95b58cdc0ab18b79e02cbfcfc9db5dc88b513e224af33c039139608442cc2a3a368548ca4b20cb9bdc25dd8917a769a8ea752d624d05b6d5
7
+ data.tar.gz: 35f7da991f06c8d105db96389e34c438c430337323d61993738595d45ddf82ea9996736fd2a196fd191f8d05a0455f5993ef69ac9e8094adc3f8b701a0ecde1c
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TiltHydrometer
4
+ class Beacon
5
+ def initialize(uuid, temp, gravity)
6
+ @uuid = uuid
7
+ @temp = temp
8
+ @gravity = gravity
9
+ end
10
+
11
+ def uuid
12
+ @uuid
13
+ end
14
+
15
+ def color
16
+ TiltHydrometer::DEVICES[@uuid]
17
+ end
18
+
19
+ def temp
20
+ if pro?
21
+ @temp.to_i/10.0
22
+ else
23
+ @temp.to_i
24
+ end
25
+ end
26
+
27
+ def gravity
28
+ gravity_string = @gravity.to_s
29
+
30
+ if pro?
31
+ "#{gravity_string[-5] || 0}.#{gravity_string[-4..-1]}".to_f
32
+ else
33
+ "#{gravity_string[-4] || 0}.#{gravity_string[-3..-1]}".to_f
34
+ end
35
+ end
36
+
37
+ def plato
38
+ (
39
+ (-1 * 616.868) +
40
+ (1111.14 * gravity) -
41
+ (630.272 * (gravity**2)) +
42
+ (135.997 * (gravity**3))
43
+ ).round(1)
44
+ end
45
+
46
+ def celsius
47
+ (
48
+ (temp - 32.0) * (5.0 / 9.0)
49
+ ).round(1)
50
+ end
51
+
52
+ def values_out_of_range?
53
+ temp > 212 || temp < 1
54
+ end
55
+
56
+ def log
57
+ LOGGER.debug("Beacon: #{inspect}")
58
+ LOGGER.debug("Temp: #{temp}")
59
+ LOGGER.debug("Celsius: #{celsius}")
60
+ LOGGER.debug("Gravity: #{gravity}")
61
+ LOGGER.debug("Color: #{color}")
62
+ LOGGER.debug("UUID: #{@uuid}")
63
+ end
64
+
65
+ def pro?
66
+ @gravity.to_s[-5] == '1'
67
+ end
68
+ end
69
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'open3'
4
+
3
5
  module TiltHydrometer
4
6
  class Core
5
7
  def initialize(options = {})
@@ -7,32 +9,36 @@ module TiltHydrometer
7
9
  end
8
10
 
9
11
  def run
10
- scanner.scan do |beacons|
11
- beacons.each do |beacon|
12
- beacon.extend(TiltHydrometer::BeaconDecorator)
13
- beacon.log
12
+ Open3.popen3 'hcidump -R' do |_stdin, stdout, _stderr, _thread|
13
+ buffer = []
14
+ while line = stdout.gets
15
+ if line.start_with?('>') || line.start_with?('<')
16
+ process_advertisement(buffer.join.gsub(/\s+/, ''))
14
17
 
15
- if beacon.values_out_of_range?
16
- LOGGER.debug('values out of range') && next
18
+ buffer = []
17
19
  end
18
20
 
19
- brewfather&.post(beacon)
20
- mqtt&.publish(beacon)
21
+ buffer << line[2..-2]
21
22
  end
22
23
  end
23
24
  end
24
25
 
25
26
  private
26
27
 
27
- def scanner
28
- @scanner ||=
29
- ScanBeacon::DefaultScanner.new.tap do |s|
30
- s.add_parser(
31
- ScanBeacon::BeaconParser.new(
32
- :tilt, 'm:0-5=4c000215a495,i:4-19,d:20-21,d:22-23,p:24-25'
33
- )
34
- )
28
+ def process_advertisement(data)
29
+ if match = data.match(/\h{40}(A495BB[1-8]0C5B14B44B5121370F02D74DE)(\h{4})(\h{4})(\h{2})(\h{2})/i)
30
+ uuid, temp, gravity, _power, _rssi = match.captures
31
+
32
+ beacon = Beacon.new(uuid, temp.to_i(16), gravity.to_i(16))
33
+ beacon.log
34
+
35
+ if beacon.values_out_of_range?
36
+ LOGGER.debug('values out of range')
37
+ else
38
+ brewfather&.post(beacon)
39
+ mqtt&.publish(beacon)
35
40
  end
41
+ end
36
42
  end
37
43
 
38
44
  def brewfather
@@ -2,13 +2,13 @@
2
2
 
3
3
  module TiltHydrometer
4
4
  DEVICES = {
5
- 'A495BB10-C5B1-4B44-B512-1370F02D74DE' => 'Red',
6
- 'A495BB20-C5B1-4B44-B512-1370F02D74DE' => 'Green',
7
- 'A495BB30-C5B1-4B44-B512-1370F02D74DE' => 'Black',
8
- 'A495BB40-C5B1-4B44-B512-1370F02D74DE' => 'Purple',
9
- 'A495BB50-C5B1-4B44-B512-1370F02D74DE' => 'Orange',
10
- 'A495BB60-C5B1-4B44-B512-1370F02D74DE' => 'Blue',
11
- 'A495BB70-C5B1-4B44-B512-1370F02D74DE' => 'Yellow',
12
- 'A495BB80-C5B1-4B44-B512-1370F02D74DE' => 'Pink'
5
+ 'A495BB10C5B14B44B5121370F02D74DE' => 'Red',
6
+ 'A495BB20C5B14B44B5121370F02D74DE' => 'Green',
7
+ 'A495BB30C5B14B44B5121370F02D74DE' => 'Black',
8
+ 'A495BB40C5B14B44B5121370F02D74DE' => 'Purple',
9
+ 'A495BB50C5B14B44B5121370F02D74DE' => 'Orange',
10
+ 'A495BB60C5B14B44B5121370F02D74DE' => 'Blue',
11
+ 'A495BB70C5B14B44B5121370F02D74DE' => 'Yellow',
12
+ 'A495BB80C5B14B44B5121370F02D74DE' => 'Pink'
13
13
  }.freeze
14
14
  end
@@ -9,7 +9,11 @@ module TiltHydrometer
9
9
 
10
10
  def publish(beacon)
11
11
  ::MQTT::Client.connect(@mqtt_uri) do |c|
12
- c.publish(topic(beacon), beacon_json(beacon), true)
12
+ c.publish(topic(beacon), beacon_json(beacon))
13
+ c.publish(topic(beacon) + '/temp_f', beacon.temp)
14
+ c.publish(topic(beacon) + '/temp_c', beacon.celsius)
15
+ c.publish(topic(beacon) + '/gravity_sg', beacon.gravity)
16
+ c.publish(topic(beacon) + '/gravity_p', beacon.plato)
13
17
  end
14
18
  end
15
19
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TiltHydrometer
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -2,15 +2,15 @@
2
2
 
3
3
  require 'logger'
4
4
  require 'json'
5
+ require 'open3'
5
6
 
6
- require 'scan_beacon'
7
7
  require 'faraday'
8
8
  require 'mqtt'
9
9
 
10
10
  require 'tilt_hydrometer/version'
11
11
  require 'tilt_hydrometer/logger'
12
12
  require 'tilt_hydrometer/devices'
13
- require 'tilt_hydrometer/beacon_decorator'
13
+ require 'tilt_hydrometer/beacon'
14
14
  require 'tilt_hydrometer/throttled_execution'
15
15
  require 'tilt_hydrometer/brewfather'
16
16
  require 'tilt_hydrometer/mqtt'
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tilt_hydrometer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steffen Schröder
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-19 00:00:00.000000000 Z
11
+ date: 2023-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.4
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.1.4
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.0
33
+ version: 2.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0
40
+ version: 2.2.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mqtt
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.5.0
55
- - !ruby/object:Gem::Dependency
56
- name: scan_beacon
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 0.7.11
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '='
67
- - !ruby/object:Gem::Version
68
- version: 0.7.11
69
55
  description: Read Tilt Hydrometer beacons and post to Brewfather
70
56
  email: steffen@schroeder-blog.de
71
57
  executables:
@@ -75,7 +61,7 @@ extra_rdoc_files: []
75
61
  files:
76
62
  - bin/tilt_hydrometer
77
63
  - lib/tilt_hydrometer.rb
78
- - lib/tilt_hydrometer/beacon_decorator.rb
64
+ - lib/tilt_hydrometer/beacon.rb
79
65
  - lib/tilt_hydrometer/brewfather.rb
80
66
  - lib/tilt_hydrometer/core.rb
81
67
  - lib/tilt_hydrometer/devices.rb
@@ -87,7 +73,7 @@ homepage: https://github.com/ChaosSteffen/tilt_hydrometer
87
73
  licenses:
88
74
  - BSD-2-Clause
89
75
  metadata: {}
90
- post_install_message:
76
+ post_install_message:
91
77
  rdoc_options: []
92
78
  require_paths:
93
79
  - lib
@@ -95,16 +81,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
95
81
  requirements:
96
82
  - - ">="
97
83
  - !ruby/object:Gem::Version
98
- version: 2.5.5
84
+ version: 2.7.8
99
85
  required_rubygems_version: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
102
88
  - !ruby/object:Gem::Version
103
89
  version: '0'
104
90
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 2.7.6.2
107
- signing_key:
91
+ rubygems_version: 3.1.6
92
+ signing_key:
108
93
  specification_version: 4
109
94
  summary: Tilt Hydrometer
110
95
  test_files: []
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TiltHydrometer
4
- module BeaconDecorator
5
- def color
6
- TiltHydrometer::DEVICES[uuid]
7
- end
8
-
9
- def temp
10
- data[0].to_i
11
- end
12
-
13
- def gravity
14
- gravity_string = data[1].to_s
15
-
16
- "#{gravity_string[-4] || 0}.#{gravity_string[-3..-1]}".to_f
17
- end
18
-
19
- def plato
20
- (
21
- (-1 * 616.868) +
22
- (1111.14 * gravity) -
23
- (630.272 * (gravity**2)) +
24
- (135.997 * (gravity**3))
25
- ).round(1)
26
- end
27
-
28
- def celsius
29
- (
30
- (temp - 32.0) * (5.0 / 9.0)
31
- ).round(1)
32
- end
33
-
34
- def values_out_of_range?
35
- temp > 212
36
- end
37
-
38
- def log
39
- LOGGER.debug("Beacon: #{inspect}")
40
- LOGGER.debug("Data: #{data.inspect}")
41
- LOGGER.debug("UUID: #{uuid.inspect}")
42
- end
43
- end
44
- end