Skip to content

Commit 9897b55

Browse files
Merge pull request #218 from vincentwolsink/missing_report_time
Handle missing report timestamps
2 parents 323fbbb + 6415a47 commit 9897b55

File tree

3 files changed

+63
-47
lines changed

3 files changed

+63
-47
lines changed

custom_components/enphase_envoy/binary_sensor.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,19 +165,20 @@ def unique_id(self):
165165
@property
166166
def extra_state_attributes(self):
167167
"""Return the state attributes."""
168-
if self.coordinator.data.get("inverter_info"):
169-
value = (
170-
self.coordinator.data.get("inverter_info")
171-
.get(self._device_serial_number)
172-
.get("last_rpt_date")
173-
)
174-
return {
175-
"last_reported": datetime.datetime.fromtimestamp(
176-
int(value), tz=datetime.timezone.utc
168+
try:
169+
if self.coordinator.data.get("inverter_info"):
170+
value = (
171+
self.coordinator.data.get("inverter_info")
172+
.get(self._device_serial_number)
173+
.get("last_rpt_date")
177174
)
178-
}
179-
180-
return None
175+
return {
176+
"last_reported": datetime.datetime.fromtimestamp(
177+
int(value), tz=datetime.timezone.utc
178+
)
179+
}
180+
except (ValueError, TypeError):
181+
return None
181182

182183
@property
183184
def device_info(self) -> DeviceInfo or None:

custom_components/enphase_envoy/envoy_reader.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ class EnvoyError(EnvoyReaderError):
207207

208208
class FileData:
209209
def __init__(self, file):
210+
self.file = file
211+
210212
if file.endswith(".json"):
211213
self.content_type = "application/json"
212214
with open(file) as json_file:
@@ -226,9 +228,21 @@ def status_code(self):
226228
def headers(self):
227229
return {"content-type": self.content_type}
228230

231+
@property
232+
def url(self):
233+
return self.Url(self.file)
234+
229235
def json(self):
230236
return self.json_data
231237

238+
class Url:
239+
def __init__(self, url):
240+
self.url = url
241+
242+
@property
243+
def path(self):
244+
return self.url.split("/")[-1]
245+
232246

233247
class StreamData:
234248
class PhaseData:

custom_components/enphase_envoy/sensor.py

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -438,44 +438,45 @@ def native_value(self):
438438
@property
439439
def extra_state_attributes(self):
440440
"""Return the state attributes."""
441-
if self.entity_description.key == "inverter_data_watts":
442-
if self.coordinator.data.get("inverter_production"):
443-
value = (
444-
self.coordinator.data.get("inverter_production")
445-
.get(self._device_serial_number)
446-
.get("lastReportDate")
447-
)
448-
return {
449-
"last_reported": datetime.datetime.fromtimestamp(
450-
int(value), tz=datetime.timezone.utc
441+
try:
442+
if self.entity_description.key == "inverter_data_watts":
443+
if self.coordinator.data.get("inverter_production"):
444+
value = (
445+
self.coordinator.data.get("inverter_production")
446+
.get(self._device_serial_number)
447+
.get("lastReportDate")
451448
)
452-
}
453-
elif self.entity_description.key.startswith("inverter_info_"):
454-
if self.coordinator.data.get("inverter_info"):
455-
value = (
456-
self.coordinator.data.get("inverter_info")
457-
.get(self._device_serial_number)
458-
.get("last_rpt_date")
459-
)
460-
return {
461-
"last_reported": datetime.datetime.fromtimestamp(
462-
int(value), tz=datetime.timezone.utc
449+
return {
450+
"last_reported": datetime.datetime.fromtimestamp(
451+
int(value), tz=datetime.timezone.utc
452+
)
453+
}
454+
elif self.entity_description.key.startswith("inverter_info_"):
455+
if self.coordinator.data.get("inverter_info"):
456+
value = (
457+
self.coordinator.data.get("inverter_info")
458+
.get(self._device_serial_number)
459+
.get("last_rpt_date")
463460
)
464-
}
465-
elif self.entity_description.key.startswith("inverter_data_"):
466-
if self.coordinator.data.get("inverter_device_data"):
467-
value = (
468-
self.coordinator.data.get("inverter_device_data")
469-
.get(self._device_serial_number)
470-
.get("last_reading")
471-
)
472-
return {
473-
"last_reported": datetime.datetime.fromtimestamp(
474-
int(value), tz=datetime.timezone.utc
461+
return {
462+
"last_reported": datetime.datetime.fromtimestamp(
463+
int(value), tz=datetime.timezone.utc
464+
)
465+
}
466+
elif self.entity_description.key.startswith("inverter_data_"):
467+
if self.coordinator.data.get("inverter_device_data"):
468+
value = (
469+
self.coordinator.data.get("inverter_device_data")
470+
.get(self._device_serial_number)
471+
.get("last_reading")
475472
)
476-
}
477-
478-
return None
473+
return {
474+
"last_reported": datetime.datetime.fromtimestamp(
475+
int(value), tz=datetime.timezone.utc
476+
)
477+
}
478+
except (ValueError, TypeError):
479+
return None
479480

480481
@property
481482
def device_info(self) -> DeviceInfo | None:

0 commit comments

Comments
 (0)