forked from platypush/platypush
Support for external_url and image_url on entities
This commit is contained in:
parent
2cc5e3f726
commit
9a5e2899e8
4 changed files with 60 additions and 0 deletions
|
@ -76,6 +76,20 @@
|
|||
<div class="value" v-text="entity.description" />
|
||||
</div>
|
||||
|
||||
<div class="table-row" v-if="entity.external_url">
|
||||
<div class="title">External URL</div>
|
||||
<div class="value url">
|
||||
<a :href="entity.external_url" target="_blank" :text="entity.external_url" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-row" v-if="entity.image_url">
|
||||
<div class="title">Image</div>
|
||||
<div class="value">
|
||||
<img class="entity-image" :src="entity.image_url">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-for="value, attr in entity.data || {}" :key="attr">
|
||||
<div class="table-row" v-if="value != null">
|
||||
<div class="title" v-text="prettify(attr)" />
|
||||
|
@ -314,5 +328,15 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.value {
|
||||
&.url {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.entity-image {
|
||||
max-height: 5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -54,6 +54,9 @@ if 'entity' not in Base.metadata:
|
|||
is_write_only = Column(Boolean, default=False)
|
||||
is_query_disabled = Column(Boolean, default=False)
|
||||
is_configuration = Column(Boolean, default=False)
|
||||
external_url = Column(String)
|
||||
image_url = Column(String)
|
||||
|
||||
created_at = Column(
|
||||
DateTime(timezone=False), default=datetime.utcnow(), nullable=False
|
||||
)
|
||||
|
|
|
@ -292,6 +292,8 @@ class ZigbeeMqttPlugin(MqttPlugin): # lgtm [py/missing-call-to-init]
|
|||
id=dev['ieee_address'],
|
||||
name=dev.get('friendly_name'),
|
||||
description=dev_def.get('description'),
|
||||
external_url=self._get_device_url(dev),
|
||||
image_url=self._get_image_url(dev),
|
||||
reachable=reachable,
|
||||
)
|
||||
|
||||
|
@ -303,6 +305,22 @@ class ZigbeeMqttPlugin(MqttPlugin): # lgtm [py/missing-call-to-init]
|
|||
|
||||
return super().transform_entities(compatible_entities) # type: ignore
|
||||
|
||||
@staticmethod
|
||||
def _get_device_url(device_info: dict) -> Optional[str]:
|
||||
model = device_info.get('definition', {}).get('model')
|
||||
if not model:
|
||||
return
|
||||
|
||||
return f'https://www.zigbee2mqtt.io/devices/{model}.html'
|
||||
|
||||
@staticmethod
|
||||
def _get_image_url(device_info: dict) -> Optional[str]:
|
||||
model = device_info.get('definition', {}).get('model')
|
||||
if not model:
|
||||
return
|
||||
|
||||
return f'https://www.zigbee2mqtt.io/images/devices/{model}.jpg'
|
||||
|
||||
def _get_network_info(self, **kwargs) -> dict:
|
||||
self.logger.info('Fetching Zigbee network information')
|
||||
client = None
|
||||
|
|
|
@ -767,6 +767,7 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin):
|
|||
parent = parent_entities[node_id] = Device(
|
||||
id=node['device_id'],
|
||||
name=node.get('name'),
|
||||
external_url=self._build_external_url(node),
|
||||
reachable=(
|
||||
node.get('is_available', False) and node.get('is_ready', False)
|
||||
),
|
||||
|
@ -777,6 +778,20 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin):
|
|||
entity.parent = parent
|
||||
entity.reachable = parent.reachable
|
||||
|
||||
@staticmethod
|
||||
def _build_external_url(node: dict) -> Optional[str]:
|
||||
manufacturer_id = node.get('manufacturer_id')
|
||||
product_id = node.get('product_id')
|
||||
product_type = node.get('product_type')
|
||||
firmware_version = node.get('firmware_version', '0.0')
|
||||
if not (manufacturer_id and product_id and product_type):
|
||||
return
|
||||
|
||||
return (
|
||||
'https://devices.zwave-js.io/?jumpTo='
|
||||
f'{manufacturer_id}:{product_type}:{product_id}:{firmware_version}'
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _merge_current_and_target_values(cls, values: Iterable[dict]) -> List[dict]:
|
||||
values_by_id = OrderedDict({v.get('id'): v for v in values})
|
||||
|
|
Loading…
Reference in a new issue