Skip to content

Commit c3d63b7

Browse files
committed
Fix logic of constructing device name if cartridge type is not available
1 parent 543c61f commit c3d63b7

File tree

3 files changed

+142
-86
lines changed

3 files changed

+142
-86
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 2.0.0b7
4+
5+
- Safe code blocks (try / catch / log) for generating entities
6+
- Fix logic of constructing device name if cartridge type is not available
7+
38
## 2.0.0b6
49

510
- When constructing device name, avoid null parts of it [#113](https://github.com/elad-bar/ha-hpprinter/issues/113)

custom_components/hpprinter/managers/ha_coordinator.py

+136-85
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import sys
23

34
from homeassistant.core import Event
45
from homeassistant.helpers.dispatcher import (
@@ -92,128 +93,178 @@ async def initialize(self):
9293
await self.async_config_entry_first_refresh()
9394

9495
def create_main_device(
95-
self, device_key: str, device_data: dict, _device_config: dict
96+
self, device_key: str, device_data: dict, device_config: dict
9697
):
97-
self._main_device_data = device_data
98-
self._main_device_id = device_key
98+
try:
99+
self._main_device_data = device_data
100+
self._main_device_id = device_key
99101

100-
model = device_data.get("make_and_model")
101-
serial_number = device_data.get("serial_number")
102-
manufacturer = device_data.get("manufacturer_name")
102+
model = device_data.get("make_and_model")
103+
serial_number = device_data.get("serial_number")
104+
manufacturer = device_data.get("manufacturer_name")
103105

104-
device_identifier = (DOMAIN, self._main_device_id)
106+
device_identifier = (DOMAIN, self._main_device_id)
105107

106-
device_info = DeviceInfo(
107-
identifiers={device_identifier},
108-
name=self.entry_title,
109-
model=model,
110-
serial_number=serial_number,
111-
manufacturer=manufacturer,
112-
)
108+
device_info = DeviceInfo(
109+
identifiers={device_identifier},
110+
name=self.entry_title,
111+
model=model,
112+
serial_number=serial_number,
113+
manufacturer=manufacturer,
114+
)
113115

114-
self._devices[device_key] = device_info
116+
self._devices[device_key] = device_info
117+
118+
except Exception as ex:
119+
exc_type, exc_obj, tb = sys.exc_info()
120+
line_number = tb.tb_lineno
121+
_LOGGER.error(
122+
f"Failed to create main device, "
123+
f"Device Key: {device_key}, "
124+
f"Data: {device_data}, "
125+
f"Config: {device_config}, "
126+
f"Error: {ex}, "
127+
f"Line: {line_number}"
128+
)
115129

116130
def create_sub_unit_device(
117-
self, device_key: str, _device_data: dict, device_config: dict
131+
self, device_key: str, device_data: dict, device_config: dict
118132
):
119-
model = self._main_device_data.get("make_and_model")
120-
serial_number = self._main_device_data.get("serial_number")
121-
manufacturer = self._main_device_data.get("manufacturer_name")
133+
try:
134+
model = self._main_device_data.get("make_and_model")
135+
serial_number = self._main_device_data.get("serial_number")
136+
manufacturer = self._main_device_data.get("manufacturer_name")
122137

123-
device_type = device_config.get("device_type")
138+
device_type = device_config.get("device_type")
124139

125-
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
140+
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
126141

127-
sub_unit_device_name = f"{self.entry_title} {device_type}"
142+
sub_unit_device_name = f"{self.entry_title} {device_type}"
128143

129-
device_identifier = (DOMAIN, device_unique_id)
144+
device_identifier = (DOMAIN, device_unique_id)
130145

131-
device_info = DeviceInfo(
132-
identifiers={device_identifier},
133-
name=sub_unit_device_name,
134-
model=model,
135-
serial_number=serial_number,
136-
manufacturer=manufacturer,
137-
via_device=(DOMAIN, self._main_device_id),
138-
)
146+
device_info = DeviceInfo(
147+
identifiers={device_identifier},
148+
name=sub_unit_device_name,
149+
model=model,
150+
serial_number=serial_number,
151+
manufacturer=manufacturer,
152+
via_device=(DOMAIN, self._main_device_id),
153+
)
139154

140-
self._devices[device_key] = device_info
155+
self._devices[device_key] = device_info
156+
157+
except Exception as ex:
158+
exc_type, exc_obj, tb = sys.exc_info()
159+
line_number = tb.tb_lineno
160+
_LOGGER.error(
161+
f"Failed to sub unit device, "
162+
f"Device Key: {device_key}, "
163+
f"Data: {device_data}, "
164+
f"Config: {device_config}, "
165+
f"Error: {ex}, "
166+
f"Line: {line_number}"
167+
)
141168

142169
def create_consumable_device(
143-
self, device_key: str, device_data: dict, _device_config: dict
170+
self, device_key: str, device_data: dict, device_config: dict
144171
):
145-
printer_device_unique_id = slugify(f"{self.entry_id}.printer")
172+
try:
173+
printer_device_unique_id = slugify(f"{self.entry_id}.printer")
146174

147-
device_name_parts = [self.entry_title]
148-
cartridge_type: str = device_data.get("consumable_type_enum")
149-
cartridge_color = device_data.get("marker_color")
150-
manufacturer = device_data.get("consumable_life_state_brand")
151-
serial_number = device_data.get("serial_number")
175+
device_name_parts = [self.entry_title]
176+
cartridge_type: str = device_data.get("consumable_type_enum")
177+
cartridge_color = device_data.get("marker_color")
178+
manufacturer = device_data.get("consumable_life_state_brand")
179+
serial_number = device_data.get("serial_number")
152180

153-
model = device_data.get("consumable_selectibility_number")
181+
model = device_data.get("consumable_selectibility_number")
154182

155-
if cartridge_type == "printhead":
156-
device_name_parts.append(cartridge_type.capitalize())
157-
model = cartridge_type.capitalize()
183+
if cartridge_type == "printhead":
184+
model = cartridge_type.capitalize()
185+
else:
186+
device_name_parts.append(cartridge_color)
158187

159-
else:
160-
device_name_parts.append(cartridge_color)
161-
device_name_parts.append(cartridge_type.capitalize())
188+
if cartridge_type is not None:
189+
device_name_parts.append(cartridge_type.capitalize())
162190

163-
device_name_parts = [
164-
device_name_part
165-
for device_name_part in device_name_parts
166-
if device_name_part is not None
167-
]
191+
device_name_parts = [
192+
device_name_part
193+
for device_name_part in device_name_parts
194+
if device_name_part is not None
195+
]
168196

169-
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
197+
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
170198

171-
cartridge_device_name = " ".join(device_name_parts)
199+
cartridge_device_name = " ".join(device_name_parts)
172200

173-
device_identifier = (DOMAIN, device_unique_id)
201+
device_identifier = (DOMAIN, device_unique_id)
174202

175-
device_info = DeviceInfo(
176-
identifiers={device_identifier},
177-
name=cartridge_device_name,
178-
model=model,
179-
serial_number=serial_number,
180-
manufacturer=manufacturer,
181-
via_device=(DOMAIN, printer_device_unique_id),
182-
)
203+
device_info = DeviceInfo(
204+
identifiers={device_identifier},
205+
name=cartridge_device_name,
206+
model=model,
207+
serial_number=serial_number,
208+
manufacturer=manufacturer,
209+
via_device=(DOMAIN, printer_device_unique_id),
210+
)
183211

184-
self._devices[device_key] = device_info
212+
self._devices[device_key] = device_info
213+
214+
except Exception as ex:
215+
exc_type, exc_obj, tb = sys.exc_info()
216+
line_number = tb.tb_lineno
217+
_LOGGER.error(
218+
f"Failed to consumable device, "
219+
f"Device Key: {device_key}, "
220+
f"Data: {device_data}, "
221+
f"Config: {device_config}, "
222+
f"Error: {ex}, "
223+
f"Line: {line_number}"
224+
)
185225

186226
def create_adapter_device(
187227
self, device_key: str, device_data: dict, device_config: dict
188228
):
189-
serial_number = self._main_device_data.get("serial_number")
190-
manufacturer = self._main_device_data.get("manufacturer_name")
191-
192-
adapter_name = device_data.get("hardware_config_name").upper()
193-
model = (
194-
device_data.get("hardware_config_device_connectivity_port_type")
195-
.replace("Embedded", "")
196-
.upper()
197-
)
229+
try:
230+
serial_number = self._main_device_data.get("serial_number")
231+
manufacturer = self._main_device_data.get("manufacturer_name")
198232

199-
device_type = device_config.get("device_type")
233+
adapter_name = device_data.get("hardware_config_name").upper()
200234

201-
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
235+
port_type_key = "hardware_config_device_connectivity_port_type"
236+
model = device_data.get(port_type_key).replace("Embedded", "").upper()
202237

203-
adapter_device_name = f"{self.entry_title} {device_type} {adapter_name}"
238+
device_type = device_config.get("device_type")
204239

205-
device_identifier = (DOMAIN, device_unique_id)
240+
device_unique_id = slugify(f"{self.entry_id}.{device_key}")
206241

207-
device_info = DeviceInfo(
208-
identifiers={device_identifier},
209-
name=adapter_device_name,
210-
model=model,
211-
serial_number=serial_number,
212-
manufacturer=manufacturer,
213-
via_device=(DOMAIN, self._main_device_id),
214-
)
242+
adapter_device_name = f"{self.entry_title} {device_type} {adapter_name}"
243+
244+
device_identifier = (DOMAIN, device_unique_id)
215245

216-
self._devices[device_key] = device_info
246+
device_info = DeviceInfo(
247+
identifiers={device_identifier},
248+
name=adapter_device_name,
249+
model=model,
250+
serial_number=serial_number,
251+
manufacturer=manufacturer,
252+
via_device=(DOMAIN, self._main_device_id),
253+
)
254+
255+
self._devices[device_key] = device_info
256+
257+
except Exception as ex:
258+
exc_type, exc_obj, tb = sys.exc_info()
259+
line_number = tb.tb_lineno
260+
_LOGGER.error(
261+
f"Failed to adapter device, "
262+
f"Device Key: {device_key}, "
263+
f"Data: {device_data}, "
264+
f"Config: {device_config}, "
265+
f"Error: {ex}, "
266+
f"Line: {line_number}"
267+
)
217268

218269
def get_device(self, device_key: str) -> DeviceInfo | None:
219270
result = self._devices.get(device_key)

custom_components/hpprinter/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"iot_class": "local_polling",
1010
"issue_tracker": "https://github.com/elad-bar/ha-hpprinter/issues",
1111
"requirements": ["xmltodict~=0.13.0", "flatten_json", "defusedxml"],
12-
"version": "2.0.0b6"
12+
"version": "2.0.0b7"
1313
}

0 commit comments

Comments
 (0)