netatmo 0.1.0
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 +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +169 -0
- data/lib/netatmo.rb +20 -0
- data/lib/netatmo/administrative.rb +23 -0
- data/lib/netatmo/air_care/home_coach.rb +25 -0
- data/lib/netatmo/battery_status/battery_status.rb +34 -0
- data/lib/netatmo/battery_status/indoor_battery_status.rb +16 -0
- data/lib/netatmo/battery_status/outdoor_battery_status.rb +16 -0
- data/lib/netatmo/battery_status/wind_gauge_battery_status.rb +16 -0
- data/lib/netatmo/client.rb +98 -0
- data/lib/netatmo/dashboard_data/co2.rb +29 -0
- data/lib/netatmo/dashboard_data/health_index.rb +34 -0
- data/lib/netatmo/dashboard_data/humidity.rb +29 -0
- data/lib/netatmo/dashboard_data/noise.rb +29 -0
- data/lib/netatmo/dashboard_data/pressure.rb +43 -0
- data/lib/netatmo/dashboard_data/rain.rb +35 -0
- data/lib/netatmo/dashboard_data/temperature.rb +35 -0
- data/lib/netatmo/dashboard_data/wind.rb +33 -0
- data/lib/netatmo/place.rb +21 -0
- data/lib/netatmo/user.rb +13 -0
- data/lib/netatmo/util/battery_status.rb +9 -0
- data/lib/netatmo/util/device_type.rb +14 -0
- data/lib/netatmo/util/feel_like.rb +9 -0
- data/lib/netatmo/util/health_index.rb +9 -0
- data/lib/netatmo/util/pressureunit.rb +9 -0
- data/lib/netatmo/util/temp_trend.rb +9 -0
- data/lib/netatmo/util/unit.rb +9 -0
- data/lib/netatmo/util/wifi_status.rb +9 -0
- data/lib/netatmo/util/windunit.rb +9 -0
- data/lib/netatmo/version.rb +5 -0
- data/lib/netatmo/weather/base_station.rb +61 -0
- data/lib/netatmo/weather/battery_device.rb +24 -0
- data/lib/netatmo/weather/device.rb +121 -0
- data/lib/netatmo/weather/indoor_module.rb +20 -0
- data/lib/netatmo/weather/outdoor_module.rb +19 -0
- data/lib/netatmo/weather/rain_gauge.rb +15 -0
- data/lib/netatmo/weather/station_data.rb +19 -0
- data/lib/netatmo/weather/wifi_status.rb +34 -0
- data/lib/netatmo/weather/wind_gauge.rb +15 -0
- data/lib/netatmo_inflector.rb +24 -0
- metadata +224 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class CO2
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :value
|
8
|
+
attr_accessor :unit
|
9
|
+
|
10
|
+
def initialize(data)
|
11
|
+
self.time = Time.at(data['time_utc'])
|
12
|
+
self.value = data['CO2'].to_f
|
13
|
+
self.unit = 'ppm'
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"#{value} #{unit}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def co2
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
def status
|
25
|
+
# TODO: calculate status
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Netatmo
|
6
|
+
module DashboardData
|
7
|
+
class HealthIndex
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
attr_accessor :time
|
11
|
+
attr_accessor :value
|
12
|
+
attr_accessor :unit
|
13
|
+
|
14
|
+
def initialize(data)
|
15
|
+
self.time = Time.at(data['time_utc'])
|
16
|
+
self.value = data['health_idx'].to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def status
|
20
|
+
Netatmo::Util::HealthIndex.value(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def_delegators :status, :healthy?, :fine?, :fair?, :poor?, :unhealthy?
|
24
|
+
|
25
|
+
def health_idx
|
26
|
+
value
|
27
|
+
end
|
28
|
+
|
29
|
+
def health_index
|
30
|
+
value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class Humidity
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :value
|
8
|
+
attr_accessor :unit
|
9
|
+
|
10
|
+
def initialize(data)
|
11
|
+
self.time = Time.at(data['time_utc'])
|
12
|
+
self.value = data['Humidity'].to_f
|
13
|
+
self.unit = '%'
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"#{value}#{unit}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def humidity
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
def status
|
25
|
+
# TODO: calculate status (green/yellow/red)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class Noise
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :value
|
8
|
+
attr_accessor :unit
|
9
|
+
|
10
|
+
def initialize(data)
|
11
|
+
self.time = Time.at(data['time_utc'])
|
12
|
+
self.value = data['Noise'].to_f
|
13
|
+
self.unit = 'dB'
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"#{value} #{unit}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def noise
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
def status
|
25
|
+
# TODO: calculate status (quiet/load/...)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Netatmo
|
6
|
+
module DashboardData
|
7
|
+
class Pressure
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
attr_accessor :time
|
11
|
+
attr_accessor :value
|
12
|
+
attr_accessor :absolute_pressure
|
13
|
+
attr_accessor :trend
|
14
|
+
attr_accessor :unit
|
15
|
+
|
16
|
+
def initialize(data)
|
17
|
+
self.time = Time.at(data['time_utc'])
|
18
|
+
self.value = data['Pressure'].to_f
|
19
|
+
self.absolute_pressure = data['AbsolutePressure'].to_f
|
20
|
+
self.trend = Netatmo::Util::TempTrend.key(data['pressure_trend'].to_sym)
|
21
|
+
self.unit = 'mbar'
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
"#{value} #{unit}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def_delegators :trend, :stable?, :down?, :up?
|
29
|
+
|
30
|
+
def pressure
|
31
|
+
value
|
32
|
+
end
|
33
|
+
|
34
|
+
def abs
|
35
|
+
absolute_pressure
|
36
|
+
end
|
37
|
+
|
38
|
+
def absolute
|
39
|
+
absolute_pressure
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class Rain
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :value
|
8
|
+
attr_accessor :sum_rain_1
|
9
|
+
attr_accessor :sum_rain_24
|
10
|
+
|
11
|
+
def initialize(data)
|
12
|
+
self.time = Time.at(data['time_utc'])
|
13
|
+
self.value = data['Rain'].to_f
|
14
|
+
self.sum_rain_1 = data['sum_rain_1'].to_f
|
15
|
+
self.sum_rain_24 = data['sum_rain_24'].to_f
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
value
|
20
|
+
end
|
21
|
+
|
22
|
+
def rain
|
23
|
+
value
|
24
|
+
end
|
25
|
+
|
26
|
+
def last_hour
|
27
|
+
sum_rain_1
|
28
|
+
end
|
29
|
+
|
30
|
+
def last_day
|
31
|
+
sum_rain_24
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class Temperature
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :value
|
8
|
+
attr_accessor :min
|
9
|
+
attr_accessor :max
|
10
|
+
attr_accessor :min_date
|
11
|
+
attr_accessor :max_date
|
12
|
+
attr_accessor :trend
|
13
|
+
attr_accessor :unit
|
14
|
+
|
15
|
+
def initialize(data)
|
16
|
+
self.time = Time.at(data['time_utc'])
|
17
|
+
self.value = data['Temperature'].to_f
|
18
|
+
self.min = data['min_temp'].to_f
|
19
|
+
self.max = data['max_temp'].to_f
|
20
|
+
self.min_date = Time.at(data['date_min_temp'])
|
21
|
+
self.max_date = Time.at(data['date_max_temp'])
|
22
|
+
self.trend = Netatmo::Util::TempTrend.key(data['temp_trend'].to_sym)
|
23
|
+
self.unit = '°C'
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"#{value} #{unit}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def temperature
|
31
|
+
value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module DashboardData
|
5
|
+
class Wind
|
6
|
+
attr_accessor :time
|
7
|
+
attr_accessor :wind_strength
|
8
|
+
attr_accessor :max_wind_strength
|
9
|
+
attr_accessor :max_wind_strength_date
|
10
|
+
attr_accessor :wind_angle
|
11
|
+
attr_accessor :gust_strength
|
12
|
+
attr_accessor :gust_angle
|
13
|
+
attr_accessor :wind_historic
|
14
|
+
attr_accessor :unit
|
15
|
+
|
16
|
+
def initialize(data)
|
17
|
+
self.time = Time.at(data['time_utc'])
|
18
|
+
self.wind_strength = data['WindStrength'].to_f
|
19
|
+
self.max_wind_strength = data['max_wind_str'].to_f
|
20
|
+
self.max_wind_strength_date = Time.at(data['date_max_wind_str'])
|
21
|
+
self.wind_angle = data['WindAngle'].to_f
|
22
|
+
self.gust_strength = data['Guststrength'].to_f
|
23
|
+
self.gust_angle = data['GustAngle'].to_f
|
24
|
+
self.wind_historic = data['WindHistoric']
|
25
|
+
self.unit = 'km/h'
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
"#{wind_strength} #{unit}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'geocoder'
|
4
|
+
|
5
|
+
module Netatmo
|
6
|
+
class Place
|
7
|
+
attr_accessor :altitude
|
8
|
+
attr_accessor :city
|
9
|
+
attr_accessor :country
|
10
|
+
attr_accessor :location
|
11
|
+
attr_accessor :timezone
|
12
|
+
|
13
|
+
def initialize(data)
|
14
|
+
self.altitude = data['altitude']
|
15
|
+
self.city = data['city']
|
16
|
+
self.country = data['country']
|
17
|
+
self.timezone = data['timezone']
|
18
|
+
self.location = ::Geocoder.search(data['location'].reverse)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/netatmo/user.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
class User
|
5
|
+
attr_accessor :mail
|
6
|
+
attr_accessor :administrative
|
7
|
+
|
8
|
+
def initialize(data)
|
9
|
+
self.mail = data['mail']
|
10
|
+
self.administrative = Netatmo::Administrative.new(data['administrative'])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module Util
|
5
|
+
class DeviceType < EasyEnum::EasyEnum
|
6
|
+
easy_enum base_station: 'NAMain',
|
7
|
+
outdoor_module: 'NAModule1',
|
8
|
+
wind_gauge: 'NAModule2',
|
9
|
+
rain_gauge: 'NAModule3',
|
10
|
+
indoor_module: 'NAModule4',
|
11
|
+
health_coach: 'NHC'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Netatmo
|
4
|
+
module Weather
|
5
|
+
class BaseStation < Device
|
6
|
+
attr_accessor :cipher_id
|
7
|
+
attr_accessor :date_setup
|
8
|
+
attr_accessor :last_status_store
|
9
|
+
attr_accessor :last_upgrade
|
10
|
+
attr_accessor :co2_calibrating
|
11
|
+
attr_accessor :station_name
|
12
|
+
attr_accessor :friend_users
|
13
|
+
attr_accessor :read_only
|
14
|
+
|
15
|
+
attr_accessor :temperature
|
16
|
+
attr_accessor :co2
|
17
|
+
attr_accessor :humidity
|
18
|
+
attr_accessor :noise
|
19
|
+
attr_accessor :pressure
|
20
|
+
|
21
|
+
attr_accessor :wifi_status
|
22
|
+
attr_accessor :place
|
23
|
+
|
24
|
+
attr_accessor :modules
|
25
|
+
|
26
|
+
# DeviceType: NAMain
|
27
|
+
def initialize(data)
|
28
|
+
super(data)
|
29
|
+
|
30
|
+
self.cipher_id = data['cipher_id']
|
31
|
+
self.date_setup = Time.at(data['date_setup']) if data['date_setup']
|
32
|
+
self.last_status_store = Time.at(data['last_status_store']) if data['last_status_store']
|
33
|
+
self.last_upgrade = Time.at(data['last_upgrade']) if data['last_upgrade']
|
34
|
+
self.co2_calibrating = data['co2_calibrating']
|
35
|
+
self.station_name = data['station_name']
|
36
|
+
self.friend_users = data['friend_users']
|
37
|
+
self.read_only = data['read_only']
|
38
|
+
|
39
|
+
self.modules = []
|
40
|
+
|
41
|
+
data['modules']&.each do |module_data|
|
42
|
+
modules << Device.parse(module_data)
|
43
|
+
end
|
44
|
+
|
45
|
+
if data['dashboard_data']
|
46
|
+
self.co2 = DashboardData::CO2.new(data['dashboard_data'])
|
47
|
+
self.humidity = DashboardData::Humidity.new(data['dashboard_data'])
|
48
|
+
self.temperature = DashboardData::Temperature.new(data['dashboard_data'])
|
49
|
+
self.noise = DashboardData::Temperature.new(data['dashboard_data'])
|
50
|
+
self.pressure = DashboardData::Pressure.new(data['dashboard_data']) if pressure?
|
51
|
+
end
|
52
|
+
self.wifi_status = WifiStatus.new(data['wifi_status'])
|
53
|
+
self.place = Netatmo::Place.new(data['place'])
|
54
|
+
end
|
55
|
+
|
56
|
+
def name
|
57
|
+
station_name
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|