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 class="value" v-text="entity.description" />
|
||||||
</div>
|
</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 v-for="value, attr in entity.data || {}" :key="attr">
|
||||||
<div class="table-row" v-if="value != null">
|
<div class="table-row" v-if="value != null">
|
||||||
<div class="title" v-text="prettify(attr)" />
|
<div class="title" v-text="prettify(attr)" />
|
||||||
|
@ -314,5 +328,15 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
&.url {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entity-image {
|
||||||
|
max-height: 5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -54,6 +54,9 @@ if 'entity' not in Base.metadata:
|
||||||
is_write_only = Column(Boolean, default=False)
|
is_write_only = Column(Boolean, default=False)
|
||||||
is_query_disabled = Column(Boolean, default=False)
|
is_query_disabled = Column(Boolean, default=False)
|
||||||
is_configuration = Column(Boolean, default=False)
|
is_configuration = Column(Boolean, default=False)
|
||||||
|
external_url = Column(String)
|
||||||
|
image_url = Column(String)
|
||||||
|
|
||||||
created_at = Column(
|
created_at = Column(
|
||||||
DateTime(timezone=False), default=datetime.utcnow(), nullable=False
|
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'],
|
id=dev['ieee_address'],
|
||||||
name=dev.get('friendly_name'),
|
name=dev.get('friendly_name'),
|
||||||
description=dev_def.get('description'),
|
description=dev_def.get('description'),
|
||||||
|
external_url=self._get_device_url(dev),
|
||||||
|
image_url=self._get_image_url(dev),
|
||||||
reachable=reachable,
|
reachable=reachable,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -303,6 +305,22 @@ class ZigbeeMqttPlugin(MqttPlugin): # lgtm [py/missing-call-to-init]
|
||||||
|
|
||||||
return super().transform_entities(compatible_entities) # type: ignore
|
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:
|
def _get_network_info(self, **kwargs) -> dict:
|
||||||
self.logger.info('Fetching Zigbee network information')
|
self.logger.info('Fetching Zigbee network information')
|
||||||
client = None
|
client = None
|
||||||
|
|
|
@ -767,6 +767,7 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin):
|
||||||
parent = parent_entities[node_id] = Device(
|
parent = parent_entities[node_id] = Device(
|
||||||
id=node['device_id'],
|
id=node['device_id'],
|
||||||
name=node.get('name'),
|
name=node.get('name'),
|
||||||
|
external_url=self._build_external_url(node),
|
||||||
reachable=(
|
reachable=(
|
||||||
node.get('is_available', False) and node.get('is_ready', False)
|
node.get('is_available', False) and node.get('is_ready', False)
|
||||||
),
|
),
|
||||||
|
@ -777,6 +778,20 @@ class ZwaveMqttPlugin(MqttPlugin, ZwaveBasePlugin):
|
||||||
entity.parent = parent
|
entity.parent = parent
|
||||||
entity.reachable = parent.reachable
|
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
|
@classmethod
|
||||||
def _merge_current_and_target_values(cls, values: Iterable[dict]) -> List[dict]:
|
def _merge_current_and_target_values(cls, values: Iterable[dict]) -> List[dict]:
|
||||||
values_by_id = OrderedDict({v.get('id'): v for v in values})
|
values_by_id = OrderedDict({v.get('id'): v for v in values})
|
||||||
|
|
Loading…
Reference in a new issue