1- """Person detection using Sighthound cloud service."""
1+ """Vehicle detection using Plate Recognizer cloud service."""
22import logging
33import requests
44import voluptuous as vol
1717
1818_LOGGER = logging .getLogger (__name__ )
1919
20- PLATE_READER_URL = ' https://api.platerecognizer.com/v1/plate-reader/'
20+ PLATE_READER_URL = " https://api.platerecognizer.com/v1/plate-reader/"
2121
2222EVENT_VEHICLE_DETECTED = "platerecognizer.vehicle_detected"
2323
2424ATTR_PLATE = "plate"
2525ATTR_CONFIDENCE = "confidence"
26+ ATTR_REGION_CODE = "region_code"
27+ ATTR_VEHICLE_TYPE = "vehicle_type"
28+
2629CONF_API_TOKEN = "api_token"
2730
2831DATETIME_FORMAT = "%Y-%m-%d_%H-%M-%S"
@@ -51,12 +54,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
5154class PlateRecognizerEntity (ImageProcessingEntity ):
5255 """Create entity."""
5356
54- def __init__ (
55- self , api_token , camera_entity , name
56- ):
57+ def __init__ (self , api_token , camera_entity , name ):
5758 """Init."""
5859 self ._headers = {
59- ' Authorization' : f' Token { api_token } ' ,
60+ " Authorization" : f" Token { api_token } " ,
6061 }
6162 self ._camera = camera_entity
6263 if name :
@@ -65,32 +66,41 @@ def __init__(
6566 camera_name = split_entity_id (camera_entity )[1 ]
6667 self ._name = f"platerecognizer_{ camera_name } "
6768 self ._state = None
68- self ._plates = []
69+ self ._results = {}
70+ self ._vehicles = [{}]
6971 self ._last_detection = None
7072
7173 def process_image (self , image ):
7274 """Process an image."""
73- self ._plates = []
75+ self ._results = {}
76+ self ._vehicles = [{}]
7477 try :
75- response = requests .post (PLATE_READER_URL , files = {"upload" : image }, headers = self ._headers ).json ()
76- self ._plates = [{'plate' : r ['plate' ], 'score' :r ['score' ]} for r in response ['results' ]]
78+ self ._results = requests .post (
79+ PLATE_READER_URL , files = {"upload" : image }, headers = self ._headers
80+ ).json ()["results" ]
81+ self ._vehicles = [
82+ {
83+ ATTR_PLATE : r ["plate" ],
84+ ATTR_CONFIDENCE : r ["score" ],
85+ ATTR_REGION_CODE : r ["region" ]["code" ],
86+ ATTR_VEHICLE_TYPE : r ["vehicle" ]["type" ],
87+ }
88+ for r in self ._results
89+ ]
7790 except Exception as exc :
7891 _LOGGER .error ("platerecognizer error : %s" , exc )
7992
80- self ._state = len (self ._plates )
93+ self ._state = len (self ._vehicles )
8194 if self ._state > 0 :
8295 self ._last_detection = dt_util .now ().strftime (DATETIME_FORMAT )
96+ for vehicle in self ._vehicles :
97+ self .fire_vehicle_detected_event (vehicle )
8398
84- # def fire_vehicle_detected_event(self, vehicle):
85- # """Send event."""
86- # self.hass.bus.fire(
87- # EVENT_VEHICLE_DETECTED,
88- # {
89- # ATTR_ENTITY_ID: self.entity_id,
90- # ATTR_PLATE: vehicle["licenseplate"],
91- # ATTR_VEHICLE_TYPE: vehicle["vehicleType"],
92- # },
93- # )
99+ def fire_vehicle_detected_event (self , vehicle ):
100+ """Send event."""
101+ vehicle_copy = vehicle .copy ()
102+ vehicle_copy .update ({ATTR_ENTITY_ID : self .entity_id })
103+ self .hass .bus .fire (EVENT_VEHICLE_DETECTED , vehicle_copy )
94104
95105 @property
96106 def camera_entity (self ):
@@ -121,6 +131,6 @@ def unit_of_measurement(self):
121131 def device_state_attributes (self ):
122132 """Return the attributes."""
123133 attr = {}
124- attr .update ({"last_plate " : self ._last_detection })
125- attr .update ({"plates " : self ._plates })
134+ attr .update ({"last_detection " : self ._last_detection })
135+ attr .update ({"vehicles " : self ._vehicles })
126136 return attr
0 commit comments