Skip to content

Commit 32424b4

Browse files
committed
handle missing data
1 parent dc53417 commit 32424b4

File tree

3 files changed

+87
-86
lines changed

3 files changed

+87
-86
lines changed

custom_components/waterguru/sensor.py

+2
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,6 @@ def native_value(self) -> StateType:
287287
"""Return the value reported by the sensor."""
288288

289289
strTs = self.coordinator.data[self._id].last_measurement_time
290+
if strTs is None:
291+
return None
290292
return dt_util.parse_datetime(strTs)

custom_components/waterguru/waterguru.py

+2-86
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from warrant import Cognito
99
from warrant.aws_srp import AWSSRP
1010

11+
from .waterguru_device import WaterGuruDevice
12+
1113
_LOGGER = logging.getLogger(__name__)
1214

1315
class WaterGuruApiError(Exception):
@@ -75,89 +77,3 @@ def get(self):
7577

7678
data = response.json()
7779
return {waterBodyData['waterBodyId']: WaterGuruDevice(waterBodyData) for waterBodyData in data['waterBodies']}
78-
79-
80-
81-
class WaterGuruDevice:
82-
"""Representation of a WaterGuru device."""
83-
84-
def __init__(self, waterBodyData):
85-
"""Initialize the device."""
86-
self._data = waterBodyData
87-
self._sensors = dict[str, str]
88-
self._standard_sensors = {
89-
'temp': self._data['waterTemp'],
90-
'rssi': self._data['pods'][0]['rssiInfo']['rssi'],
91-
}
92-
for r in self._data['pods'][0]['refillables']:
93-
if r['type'] == 'BATT':
94-
self._standard_sensors['battery'] = r['pctLeft']
95-
if r['type'] == 'LAB':
96-
self._standard_sensors['cassette'] = r['pctLeft']
97-
if 'timeLeftText' in r:
98-
number = int(r['timeLeftText'].split()[0])
99-
if "weeks" in r['timeLeftText']:
100-
number = number * 7
101-
elif "months" in r['timeLeftText']:
102-
number = number * 30
103-
self._standard_sensors['cassette_days_remaining'] = number
104-
self._measurements = {measurement['type']: measurement for measurement in self._data['measurements']}
105-
106-
@property
107-
def device_id(self):
108-
"""Return the device ID."""
109-
return self._data['waterBodyId']
110-
111-
@property
112-
def name(self):
113-
"""Return the name of the device."""
114-
return f"WaterGuru {self._data['name']}"
115-
116-
@property
117-
def product_name(self):
118-
"""Return the product name of the device."""
119-
return self._data['pods'][0]['pod']['product']
120-
121-
@property
122-
def serial_number(self):
123-
"""Return the serial number of the device."""
124-
return self._data['pods'][0]['pod']['podId']
125-
126-
@property
127-
def firmware_version(self):
128-
"""Return the firmware version of the device."""
129-
return self._data['pods'][0]['pod']['fwUpdateVersion']
130-
131-
@property
132-
def sensors(self):
133-
"""Return the sensors of the device."""
134-
return self._standard_sensors
135-
136-
@property
137-
def measurements(self):
138-
"""Return the measurements of the device."""
139-
return self._measurements
140-
141-
@property
142-
def status(self):
143-
"""Return the status of the device."""
144-
return self._data['status']
145-
146-
@property
147-
def last_measurement_time(self):
148-
"""Return the last measurement time."""
149-
return self._data['latestMeasureTime']
150-
151-
@property
152-
def diagnostics(self):
153-
"""Return the diagnostics of the device."""
154-
return {
155-
"name": self.name,
156-
"product_name": self.product_name,
157-
"firmware_version": self.firmware_version,
158-
"status": self.status,
159-
"last_measurement_time": self.last_measurement_time,
160-
"standard_sensors": self.sensors,
161-
"measurements": self.measurements,
162-
"raw_data": self._data
163-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
class WaterGuruDevice:
2+
"""Representation of a WaterGuru device."""
3+
4+
def __init__(self, waterBodyData):
5+
"""Initialize the device."""
6+
self._data = waterBodyData
7+
self._sensors = dict[str, str]
8+
self._standard_sensors = {
9+
'temp': self._data.get('waterTemp', None),
10+
'rssi': self._data['pods'][0].get('rssiInfo', {}).get('rssi', None),
11+
}
12+
for r in self._data['pods'][0].get('refillables', []):
13+
if r['type'] == 'BATT':
14+
self._standard_sensors['battery'] = r['pctLeft']
15+
if r['type'] == 'LAB':
16+
self._standard_sensors['cassette'] = r['pctLeft']
17+
if 'timeLeftText' in r:
18+
number = int(r['timeLeftText'].split()[0])
19+
if "weeks" in r['timeLeftText']:
20+
number = number * 7
21+
elif "months" in r['timeLeftText']:
22+
number = number * 30
23+
self._standard_sensors['cassette_days_remaining'] = number
24+
self._measurements = {measurement['type']: measurement for measurement in self._data.get('measurements', [])}
25+
26+
@property
27+
def device_id(self):
28+
"""Return the device ID."""
29+
return self._data['waterBodyId']
30+
31+
@property
32+
def name(self):
33+
"""Return the name of the device."""
34+
return f"WaterGuru {self._data['name']}"
35+
36+
@property
37+
def product_name(self):
38+
"""Return the product name of the device."""
39+
return self._data['pods'][0]['pod']['product']
40+
41+
@property
42+
def serial_number(self):
43+
"""Return the serial number of the device."""
44+
return str(self._data['pods'][0]['pod']['podId'])
45+
46+
@property
47+
def firmware_version(self):
48+
"""Return the firmware version of the device."""
49+
return self._data['pods'][0]['pod'].get('fwUpdateVersion', None)
50+
51+
@property
52+
def sensors(self):
53+
"""Return the sensors of the device."""
54+
return self._standard_sensors
55+
56+
@property
57+
def measurements(self):
58+
"""Return the measurements of the device."""
59+
return self._measurements
60+
61+
@property
62+
def status(self):
63+
"""Return the status of the device."""
64+
return self._data['status']
65+
66+
@property
67+
def last_measurement_time(self):
68+
"""Return the last measurement time."""
69+
return self._data.get('latestMeasureTime', None)
70+
71+
@property
72+
def diagnostics(self):
73+
"""Return the diagnostics of the device."""
74+
return {
75+
"name": self.name,
76+
"product_name": self.product_name,
77+
"firmware_version": self.firmware_version,
78+
"status": self.status,
79+
"last_measurement_time": self.last_measurement_time,
80+
"standard_sensors": self.sensors,
81+
"measurements": self.measurements,
82+
"raw_data": self._data
83+
}

0 commit comments

Comments
 (0)