Skip to content

Commit

Permalink
New event codes
Browse files Browse the repository at this point in the history
I have updated the parcels sensors so the latest event code is always used to determine state and icon until it is delivered, then we use summary status for consistent delivered message.
  • Loading branch information
jampez77 committed Oct 9, 2024
1 parent 1f5aed5 commit 56a190b
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 35 deletions.
6 changes: 4 additions & 2 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ This is by no means an extensive list of event codes that a parcel can encounter
- EVOAC: Item received at
- EVAIE/EVAIP: Sender preparing/despatching item
- EVPPA: Accepted at Parcelshop
- EVDAV/EVIMC/EVDAC: Item Received
- EVDAV/EVIMC/EVDAC/EVBAV: Item Received
- EVKOP: Delivered by
- EVNRT: Item Retention
- EVOCO: We've received your item and its now being processed for delivery.
- EVKNR: Delivery Attempted
- RSRXS: Delivery request received
- RSRXS/RORXS: Delivery request received
- EVKLS: Delivered to Your Collection Point by
- EVPLA: Available for collection


# Royal Mail Tracking API
Expand Down
11 changes: 8 additions & 3 deletions custom_components/royalmail/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@
CONF_SUMMARY = "summary"
CONF_STATUS_DESCRIPTION = "statusDescription"
CONF_DELIVERIES_TODAY = "deliveriesToday"
CONF_LAST_EVENT_CODE = "lastEventCode"
CONF_LAST_EVENT_NAME = "lastEventName"
CONF_LAST_EVENT_DATE_TIME = "lastEventDateTime"
CONF_EVENTS = "events"
CONF_EVENTCODE = "eventCode"
CONF_EVENTNAME = "eventName"
CONF_EVENTDATETIME = "eventDateTime"
DELIVERY_TRANSIT_EVENTS = [
"EVNSR",
"EVODO",
Expand All @@ -61,10 +62,14 @@
"EVNRT",
"EVOCO",
"RSRXS",
"RORXS",
"EVNDA",
"EVBAV",
"EVKLS",
]
DELIVERY_FAILED = ["EVKNR"]
DELIVERY_DELIVERED_EVENTS = ["EVKSP", "EVKOP", "EVKSF"]
DELIVERY_PENDING = ["EVPLA"]
DELIVERY_TODAY_EVENTS = ["EVGPD"]
CONF_PARCELS = "parcels"
CONF_OUT_FOR_DELIVERY = "out_for_delivery"
2 changes: 1 addition & 1 deletion custom_components/royalmail/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
"issue_tracker": "https://github.com/jampez77/RoyalMail/issues",
"requirements": [],
"ssdp": [],
"version": "2024.10.2",
"version": "2024.10.3",
"zeroconf": []
}
52 changes: 23 additions & 29 deletions custom_components/royalmail/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,18 @@
from homeassistant.util import dt as dt_util

from .const import (
CONF_LAST_EVENT_CODE,
CONF_LAST_EVENT_DATE_TIME,
CONF_LAST_EVENT_NAME,
CONF_EVENTCODE,
CONF_EVENTDATETIME,
CONF_EVENTNAME,
CONF_EVENTS,
CONF_MAILPIECE_ID,
CONF_MP_DETAILS,
CONF_OUT_FOR_DELIVERY,
CONF_PARCELS,
CONF_STATUS_DESCRIPTION,
CONF_SUMMARY,
DELIVERY_DELIVERED_EVENTS,
DELIVERY_PENDING,
DELIVERY_TODAY_EVENTS,
DELIVERY_TRANSIT_EVENTS,
DOMAIN,
Expand Down Expand Up @@ -94,15 +96,15 @@ async def get_sensors(
totalMailPieces = len(parcels)

for key, value in parcels.items():
if CONF_SUMMARY in value and CONF_LAST_EVENT_CODE in value[CONF_SUMMARY]:
lastEventCode = value[CONF_SUMMARY][CONF_LAST_EVENT_CODE]
if value is not None and CONF_EVENTS in value:
lastEventCode = value[CONF_EVENTS][0][CONF_EVENTCODE]

if lastEventCode in DELIVERY_TODAY_EVENTS:
parcels_out_for_delivery.append(value)
add_entity = True

if lastEventCode in DELIVERY_DELIVERED_EVENTS:
lastEventDateTime = value[CONF_SUMMARY][CONF_LAST_EVENT_DATE_TIME]
lastEventDateTime = value[CONF_EVENTS][0][CONF_EVENTDATETIME]
if hasMailPieceExpired(hass, lastEventDateTime):
add_entity = False
removeMailPieceCoordinator = RoyalMailRemoveMailPieceCoordinator(
Expand Down Expand Up @@ -234,7 +236,7 @@ def update_parcels(self):

def is_parcel_delivery_today(self, parcel: dict) -> bool:
"""Check if the parcel has been delivered."""
lastEventCode = parcel[CONF_SUMMARY][CONF_LAST_EVENT_CODE]
lastEventCode = parcel[CONF_EVENTS][0][CONF_EVENTCODE]
return lastEventCode in DELIVERY_TODAY_EVENTS

@property
Expand All @@ -251,9 +253,10 @@ def native_value(self) -> str | date | None:
def extra_state_attributes(self) -> dict[str, Any]:
"""Define entity attributes."""

self.attrs[CONF_PARCELS] = [
parcel[CONF_MAILPIECE_ID] for key, parcel in self.total_parcels.items()
]
if self.total_parcels is not None:
self.attrs[CONF_PARCELS] = [
parcel[CONF_MAILPIECE_ID] for key, parcel in self.total_parcels.items()
]

self.attrs[CONF_OUT_FOR_DELIVERY] = [
parcel[CONF_MAILPIECE_ID] for parcel in self.parcels_out_for_delivery
Expand Down Expand Up @@ -298,13 +301,9 @@ def __init__(
def update_from_coordinator(self):
"""Update sensor state and attributes from coordinator data."""

if (
isinstance(self.data, (dict, list))
and CONF_SUMMARY in self.data
and CONF_LAST_EVENT_CODE in self.data[CONF_SUMMARY]
):
lastEventCode = self.data[CONF_SUMMARY][CONF_LAST_EVENT_CODE]
lastEventDateTime = self.data[CONF_SUMMARY][CONF_LAST_EVENT_DATE_TIME]
if isinstance(self.data, (dict, list)) and CONF_EVENTS in self.data:
lastEventCode = self.data[CONF_EVENTS][0][CONF_EVENTCODE]
lastEventDateTime = self.data[CONF_EVENTS][0][CONF_EVENTDATETIME]
if lastEventCode in DELIVERY_DELIVERED_EVENTS:
if hasMailPieceExpired(self.hass, lastEventDateTime):
session = async_get_clientsession(self.hass)
Expand Down Expand Up @@ -341,32 +340,27 @@ def get_state(self) -> str:

value = self.data.get(self.entity_description.key)

if (
CONF_SUMMARY in self.data
and CONF_LAST_EVENT_NAME in self.data[CONF_SUMMARY]
and CONF_LAST_EVENT_CODE in self.data[CONF_SUMMARY]
):
lastEventCode = self.data[CONF_SUMMARY][CONF_LAST_EVENT_CODE]
if CONF_SUMMARY in self.data and CONF_EVENTS in self.data:
lastEventCode = self.data[CONF_EVENTS][0][CONF_EVENTCODE]
if lastEventCode in DELIVERY_DELIVERED_EVENTS:
value = self.data[CONF_SUMMARY][CONF_STATUS_DESCRIPTION]
else:
value = self.data[CONF_SUMMARY][CONF_LAST_EVENT_NAME]
value = self.data[CONF_EVENTS][0][CONF_EVENTNAME]

return value

def get_icon(self) -> str:
"""Generate Icon."""
if (
CONF_SUMMARY in self.data
and CONF_LAST_EVENT_CODE in self.data[CONF_SUMMARY]
):
lastEventCode = self.data[CONF_SUMMARY][CONF_LAST_EVENT_CODE]
if CONF_EVENTS in self.data:
lastEventCode = self.data[CONF_EVENTS][0][CONF_EVENTCODE]
if lastEventCode in DELIVERY_DELIVERED_EVENTS:
return "mdi:package-variant-closed-check"
if lastEventCode in DELIVERY_TODAY_EVENTS:
return "mdi:truck-delivery-outline"
if lastEventCode in DELIVERY_TRANSIT_EVENTS:
return "mdi:transit-connection-variant"
if lastEventCode in DELIVERY_PENDING:
return "mdi:human-dolly"
return self.entity_description.icon

@callback
Expand Down

0 comments on commit 56a190b

Please sign in to comment.