mirror of https://github.com/home-assistant/core
69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
"""Support for the QR code image processing."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import io
|
|
|
|
from PIL import Image
|
|
from pyzbar import pyzbar
|
|
|
|
from homeassistant.components.image_processing import ImageProcessingEntity
|
|
from homeassistant.const import CONF_ENTITY_ID, CONF_NAME, CONF_SOURCE
|
|
from homeassistant.core import HomeAssistant, split_entity_id
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
|
|
|
|
|
def setup_platform(
|
|
hass: HomeAssistant,
|
|
config: ConfigType,
|
|
add_entities: AddEntitiesCallback,
|
|
discovery_info: DiscoveryInfoType | None = None,
|
|
) -> None:
|
|
"""Set up the QR code image processing platform."""
|
|
add_entities(
|
|
QrEntity(camera[CONF_ENTITY_ID], camera.get(CONF_NAME))
|
|
for camera in config[CONF_SOURCE]
|
|
)
|
|
|
|
|
|
class QrEntity(ImageProcessingEntity):
|
|
"""A QR image processing entity."""
|
|
|
|
def __init__(self, camera_entity, name):
|
|
"""Initialize QR image processing entity."""
|
|
super().__init__()
|
|
|
|
self._camera = camera_entity
|
|
if name:
|
|
self._name = name
|
|
else:
|
|
self._name = f"QR {split_entity_id(camera_entity)[1]}"
|
|
self._state = None
|
|
|
|
@property
|
|
def camera_entity(self):
|
|
"""Return camera entity id from process pictures."""
|
|
return self._camera
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the state of the entity."""
|
|
return self._state
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the entity."""
|
|
return self._name
|
|
|
|
def process_image(self, image):
|
|
"""Process image."""
|
|
stream = io.BytesIO(image)
|
|
img = Image.open(stream)
|
|
|
|
barcodes = pyzbar.decode(img)
|
|
if barcodes:
|
|
self._state = barcodes[0].data.decode("utf-8")
|
|
else:
|
|
self._state = None
|