# # # # I COMMENTED OUT ALL THE TAGBOX RELATED STUFF AS I USE TENSORFLOW COMPONENT FOR IT. # # # homeassistant: # customize: # image_processing.facebox_frontdoor_camera: # friendly_name: People @ Front Door # image_processing.facebox_driveway_camera: # friendly_name: People @ Driveway # image_processing.facebox_patio_camera: # friendly_name: People @ Patio # image_processing.facebox_playarea_camera: # friendly_name: People @ Playarea # image_processing.facebox_garage_camera: # friendly_name: People @ Garage # image_processing.tagbox_frontdoor_camera: # friendly_name: Frontdoor Tag # image_processing.tagbox_driveway_camera: # friendly_name: Driveway Tag # image_processing.tagbox_playarea_camera: # friendly_name: Playarea Tag # image_processing.tagbox_patio_camera: # friendly_name: Patio Tag # image_processing.tagbox_garage_camera: # friendly_name: Garage Tag # sensor.frontdoor_camera_objects: # friendly_name: Things At Front Door # sensor.driveway_camera_objects: # friendly_name: Things At Driveway # sensor.playarea_camera_objects: # friendly_name: Things At Playarea # sensor.patio_camera_objects: # friendly_name: Things At Patio # sensor.garage_camera_objects: # friendly_name: Things in Garage # sensor.frontdoor_camera_people: # friendly_name: People At Front Door # sensor.driveway_camera_people: # friendly_name: People Driveway # sensor.playarea_camera_people: # friendly_name: People Playarea # sensor.patio_camera_people: # friendly_name: People Patio # sensor.garage_camera_people: # friendly_name: Garage Patio # image_processing: # - platform: facebox # ip_address: !secret ha_ip_address # scan_interval: 360 # port: 8080 # source: # - entity_id: camera.frontdoor_camera # - entity_id: camera.driveway_camera # - entity_id: camera.patio_camera # - entity_id: camera.playarea_camera # - entity_id: camera.garage_camera # # - platform: tagbox # # scan_interval: 10000 # Default 10 # # ip_address: !secret ha_ip_address # # port: 8081 # # source: # # - entity_id: camera.frontdoor_camera # # - entity_id: camera.driveway_camera # # - entity_id: camera.patio_camera # # - entity_id: camera.playarea_camera # # - entity_id: camera.garage_camera # sensor: # ## # #Facebox related sensors # ## # - platform: template # sensors: # frontdoor_camera_people: # value_template: >- # {% set faces = state_attr('image_processing.facebox_frontdoor_camera', 'matched_faces') %} # {% if None != faces %} # {% if faces | list | count == 0 %} # Clear # {% else %} # {%- for face in faces | list %}{%- if loop.first %}{% elif loop.last %} and {% else %}, {% endif -%}{{ face }}{%- endfor %} # {% endif %} # {% endif %} # icon_template: mdi:cctv # - platform: template # sensors: # driveway_camera_people: # value_template: >- # {% set faces = state_attr('image_processing.facebox_driveway_camera', 'matched_faces') %} # {% if None != faces %} # {% if faces | list | count == 0 %} # Clear # {% else %} # {%- for face in faces | list %}{%- if loop.first %}{% elif loop.last %} and {% else %}, {% endif -%}{{ face }}{%- endfor %} # {% endif %} # {% endif %} # icon_template: mdi:cctv # - platform: template # sensors: # patio_camera_people: # value_template: >- # {% set faces = state_attr('image_processing.facebox_patio_camera', 'matched_faces') %} # {% if None != faces %} # {% if faces | list | count == 0 %} # Clear # {% else %} # {%- for face in faces | list %}{%- if loop.first %}{% elif loop.last %} and {% else %}, {% endif -%}{{ face }}{%- endfor %} # {% endif %} # {% endif %} # icon_template: mdi:cctv # - platform: template # sensors: # playarea_camera_people: # value_template: >- # {% set faces = state_attr('image_processing.facebox_playarea_camera', 'matched_faces') %} # {% if None != faces %} # {% if faces | list | count == 0 %} # Clear # {% else %} # {%- for face in faces | list %}{%- if loop.first %}{% elif loop.last %} and {% else %}, {% endif -%}{{ face }}{%- endfor %} # {% endif %} # {% endif %} # icon_template: mdi:cctv # - platform: template # sensors: # garage_camera_people: # value_template: >- # {% set faces = state_attr('image_processing.facebox_garage_camera', 'matched_faces') %} # {% if None != faces %} # {% if faces | list | count == 0 %} # Clear # {% else %} # {%- for face in faces | list %}{%- if loop.first %}{% elif loop.last %} and {% else %}, {% endif -%}{{ face }}{%- endfor %} # {% endif %} # {% endif %} # icon_template: mdi:cctv # # ########################################################################################################################### # # # Tagbox related Sensors; Please don't go crazy looking at the code. Here is the simple explanation. # # # The tagbox gives a bunch of tags for each picture, and I eliminate a bunch of unwanted tags by filtering them out # # # The unwanted tags are something that I really don't care - like a Tree in the front yard. # # # Then I do custom mapping of the tags that fits my needs. That way I can display what I want rather than what I was given. # # # I have no control over what tagbox gives, I want to pick and choose tags irrespective of confidence level. # # ########################################################################################################################### # # - platform: template # # sensors: # # frontdoor_camera_objects: # # value_template: >- # # {% set attribs = state_attr('image_processing.tagbox_frontdoor_camera', 'tags') %} # # {%- if None != attribs -%} # # {%- set tag_map = {'Vehicle':'Car', 'Sedan':'Car', 'Luxury vehicle':'Car', 'Driving':'Car', # # 'Wheel':'Car', 'Automotive design':'Car', 'Automotive exterior':'Car', # # 'Transport':'Car', 'Sports car':'Car', 'Land vehicle':'Car', 'Supercar':'Car', # # 'Waterway':'Rain', 'Super car': 'Car' # # } -%} # # {%- set unwanted_tags = ['Asphalt', 'Backyard', 'City', 'Estate', 'Flower', 'Garden', 'Grass', 'Tree', 'Car', 'Vehicle', 'Suburb', 'Street', # # 'Highway', 'Infrastructure', 'Lane', 'Lawn', 'Neighbourhood', 'Public space', 'Super car', 'Snow', 'Winter', 'Supercar', # # 'Residential area', 'Road', 'Road surface', 'Sidewalk', 'Tarmac', 'Race track', 'Sport venue', 'Soil', 'Outdoor structure', 'Cartoon', 'Poster', 'Illustration', # # 'Transport', 'Walkway', 'Yard', 'Screenshot', 'Night', 'Lighting and Light', 'Drawing', 'Sketch', 'Stadium', # # 'Black-and-white', 'Monochrome', 'Monochrome photography', 'Black and White', 'Parking lot', 'Parking', # # 'Black', 'White', 'Darkness', 'Light', 'Text'] -%} # # {%- macro filter_unwanted(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in unwanted_tags -%}{{- comma() -}}{{- item -}}{% endfor %}{%- endmacro -%} # # {%- macro mapped_items(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in tag_map -%}{{- comma() -}}{{- item -}} # # {%- endfor -%} # # {%- for item in tags if item in tag_map -%}{{- comma() -}}{{- tag_map[item] -}}{%- endfor -%} # # {%- endmacro -%} # # {% macro get_final_output(output_list) %} # # {%- for x in output_list if x != "" -%} # # {%- if loop.first %}{% elif loop.last %},{% else %},{% endif -%}{{- x -}} # # {%- endfor -%} # # {% endmacro %} # # {%- set result = filter_unwanted(attribs| map(attribute='name')|list).split(',') -%} # # {%- set output = get_final_output(mapped_items(result).split(',') | unique|list) -%} # # {{- "Clear" if output |trim == "" else output -}} # # {% endif %} # # icon_template: mdi:cctv # # - platform: template # # sensors: # # driveway_camera_objects: # # value_template: >- # # {%- set attribs = state_attr('image_processing.tagbox_driveway_camera', 'tags') -%} # # {%- if None != attribs -%} # # {%- set tag_map = {'Vehicle':'Car', 'Sedan':'Car', 'Luxury vehicle':'Car', 'Driving':'Car', # # 'Wheel':'Car', 'Automotive design':'Car', 'Automotive exterior':'Car', # # 'Transport':'Car', 'Sports car':'Car', 'Land vehicle':'Car','Supercar':'Car', # # 'Waterway':'Rain', 'Super car': 'Car' # # } -%} # # {%- set unwanted_tags = ['Asphalt', 'Backyard', 'City', 'Estate', 'Flower', 'Garden', 'Grass', 'Tree', 'Car', 'Vehicle', 'Suburb', 'Street', # # 'Highway', 'Infrastructure', 'Lane', 'Lawn', 'Neighbourhood', 'Public space', 'Super car', 'Sport venue', 'Supercar', # # 'Residential area', 'Road', 'Road surface', 'Sidewalk', 'Tarmac', 'Race track', 'Snow', 'Winter', 'Soil', 'Outdoor structure', 'Cartoon', 'Poster', 'Illustration', # # 'Transport', 'Walkway', 'Yard', 'Screenshot', 'Night', 'Lighting and Light', 'Drawing', 'Sketch', 'Stadium', # # 'Black-and-white', 'Monochrome', 'Monochrome photography', 'Black and White', # # 'Black', 'White', 'Darkness', 'Light', 'Text'] -%} # # {%- macro filter_unwanted(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in unwanted_tags -%}{{- comma() -}}{{- item -}}{% endfor %}{%- endmacro -%} # # {%- macro mapped_items(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in tag_map -%}{{- comma() -}}{{- item -}} # # {%- endfor -%} # # {%- for item in tags if item in tag_map -%}{{- comma() -}}{{- tag_map[item] -}}{%- endfor -%} # # {%- endmacro -%} # # {% macro get_final_output(output_list) %} # # {%- for x in output_list if x != "" -%} # # {%- if loop.first %}{% elif loop.last %},{% else %},{% endif -%}{{- x -}} # # {%- endfor -%} # # {% endmacro %} # # {%- set result = filter_unwanted(attribs| map(attribute='name')|list).split(',') -%} # # {%- set output = get_final_output(mapped_items(result).split(',') | unique|list) -%} # # {{- "Clear" if output |trim == "" else output -}} # # {% endif %} # # icon_template: mdi:cctv # # - platform: template # # sensors: # # patio_camera_objects: # # value_template: >- # # {% set attribs = state_attr('image_processing.tagbox_patio_camera', 'tags') %} # # {%- if None != attribs -%} # # {%- set tag_map = {'Waterway':'Rain'} -%} # # {%- set unwanted_tags = ['Asphalt', 'Backyard', 'City', 'Estate', 'Flower', 'Garden', 'Grass', 'Tree', 'Vehicle','Driving', 'Transport', 'Car', 'Vehicle', 'Suburb', 'Street', # # 'Highway', 'Infrastructure', 'Lane', 'Lawn', 'Neighbourhood', 'Public space', 'Car', 'Wheel', 'Sports car','Super car', 'Sport venue', 'Outdoor structure', 'Cartoon', 'Poster', 'Illustration', # # 'Residential area', 'Road', 'Road surface', 'Sidewalk', 'Tarmac', 'Race track', 'Sedan', 'Automotive design', 'Snow', 'Winter', 'Soil', 'Stadium', # # 'Transport', 'Walkway', 'Yard', 'Screenshot', 'Night', 'Lighting and Light', 'Luxury vehicle', 'Automotive exterior', 'Drawing', 'Sketch', # # 'Black-and-white', 'Monochrome', 'Monochrome photography', 'Black and White', 'Black', 'White', 'Light', 'Text'] -%} # # {%- macro filter_unwanted(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in unwanted_tags -%}{{- comma() -}}{{- item -}}{% endfor %}{%- endmacro -%} # # {%- macro mapped_items(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in tag_map -%}{{- comma() -}}{{- item -}} # # {%- endfor -%} # # {%- for item in tags if item in tag_map -%}{{- comma() -}}{{- tag_map[item] -}}{%- endfor -%} # # {%- endmacro -%} # # {% macro get_final_output(output_list) %} # # {%- for x in output_list if x != "" -%} # # {%- if loop.first %}{% elif loop.last %},{% else %},{% endif -%}{{- x -}} # # {%- endfor -%} # # {% endmacro %} # # {%- set result = filter_unwanted(attribs| map(attribute='name')|list).split(',') -%} # # {%- set output = get_final_output(mapped_items(result).split(',') | unique|list) -%} # # {{- "Clear" if output |trim == "" else output -}} # # {% endif %} # # icon_template: mdi:cctv # # - platform: template # # sensors: # # playarea_camera_objects: # # value_template: >- # # {% set attribs = state_attr('image_processing.tagbox_playarea_camera', 'tags') %} # # {%- if None != attribs -%} # # {%- set tag_map = {'Waterway':'Rain'} -%} # # {%- set unwanted_tags = ['Asphalt', 'Backyard', 'City', 'Estate', 'Flower', 'Garden', 'Grass', 'Tree', 'Vehicle','Driving', 'Transport', 'Car', 'Vehicle', 'Suburb', 'Street', # # 'Highway', 'Infrastructure', 'Lane', 'Lawn', 'Neighbourhood', 'Public space', 'Car', 'Wheel', 'Sports car', 'Super car', 'Winter', 'Soil', 'Stadium', # # 'Residential area', 'Road', 'Road surface', 'Sidewalk', 'Tarmac', 'Race track', 'Sedan', 'Automotive design', 'Snow', 'Sport venue', 'Outdoor structure', 'Cartoon', 'Poster', 'Illustration', # # 'Transport', 'Walkway', 'Yard', 'Screenshot', 'Night', 'Lighting and Light', 'Luxury vehicle', 'Automotive exterior', 'Drawing', 'Sketch', # # 'Black-and-white', 'Monochrome', 'Monochrome photography', 'Black and White', 'Black', 'White', 'Light', 'Text'] -%} # # {%- macro filter_unwanted(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in unwanted_tags -%}{{- comma() -}}{{- item -}}{% endfor %}{%- endmacro -%} # # {%- macro mapped_items(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in tag_map -%}{{- comma() -}}{{- item -}}{%- endfor -%} # # {%- for item in tags if item in tag_map -%}{{- comma() -}}{{- tag_map[item] -}}{%- endfor -%} # # {%- endmacro -%} # # {% macro get_final_output(output_list) %} # # {%- for x in output_list if x != "" -%} # # {%- if loop.first %}{% elif loop.last %},{% else %},{% endif -%}{{- x -}} # # {%- endfor -%} # # {% endmacro %} # # {%- set result = filter_unwanted(attribs| map(attribute='name')|list).split(',') -%} # # {%- set output = get_final_output(mapped_items(result).split(',') | unique|list) -%} # # {{- "Clear" if output |trim == "" else output -}} # # {% endif %} # # icon_template: mdi:cctv # # - platform: template # # sensors: # # garage_camera_objects: # # value_template: >- # # {% set attribs = state_attr('image_processing.tagbox_garage_camera', 'tags') %} # # {%- if None != attribs -%} # # {%- set tag_map = {'Waterway':'Rain'} -%} # # {%- set unwanted_tags = ['Asphalt', 'Backyard', 'City', 'Estate', 'Flower', 'Garden', 'Grass', 'Tree', 'Driving', 'Transport', 'Suburb', 'Street', # # 'Highway', 'Infrastructure', 'Lane', 'Lawn', 'Neighbourhood', 'Public space', 'Winter', 'Soil', 'Stadium', # # 'Residential area', 'Road', 'Road surface', 'Sidewalk', 'Tarmac', 'Race track', 'Sedan', 'Automotive design', 'Snow', 'Sport venue', 'Outdoor structure', 'Cartoon', 'Poster', 'Illustration', # # 'Transport', 'Walkway', 'Yard', 'Screenshot', 'Night', 'Lighting and Light', 'Luxury vehicle', 'Automotive exterior', 'Drawing', 'Sketch', # # 'Black-and-white', 'Monochrome', 'Monochrome photography', 'Black and White', 'Black', 'White', 'Light', 'Text'] -%} # # {%- macro filter_unwanted(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in unwanted_tags -%}{{- comma() -}}{{- item -}}{% endfor %}{%- endmacro -%} # # {%- macro mapped_items(tags) -%} # # {%- set comma = joiner(',') -%} # # {%- for item in tags if item not in tag_map -%}{{- comma() -}}{{- item -}}{%- endfor -%} # # {%- for item in tags if item in tag_map -%}{{- comma() -}}{{- tag_map[item] -}}{%- endfor -%} # # {%- endmacro -%} # # {% macro get_final_output(output_list) %} # # {%- for x in output_list if x != "" -%} # # {%- if loop.first %}{% elif loop.last %},{% else %},{% endif -%}{{- x -}} # # {%- endfor -%} # # {% endmacro %} # # {%- set result = filter_unwanted(attribs| map(attribute='name')|list).split(',') -%} # # {%- set output = get_final_output(mapped_items(result).split(',') | unique|list) -%} # # {{- "Clear" if output |trim == "" else output -}} # # {% endif %} # # icon_template: mdi:cctv # automation: # - alias: Alert Family Member Activity # trigger: # - platform: state # entity_id: # - sensor.frontdoor_camera_people # - sensor.driveway_camera_people # - sensor.patio_camera_people # - sensor.playarea_camera_people # - sensor.garage_camera_people # condition: # - condition: template # value_template: "{{ states('input_boolean.notify_camera_alerts') == 'on' }}" # - condition: template # value_template: '{{ trigger.to_state.state | trim != "" and # trigger.to_state.state | lower | trim != "unknown" and # trigger.to_state.state | lower | trim != "clear" }}' # action: # - service: script.notify_me # data_template: # message: >- # {% set camera_name = states['camera'][trigger.entity_id.split('.')[1].split('_')[0] ~ '_camera'].attributes.friendly_name %} # {{ trigger.to_state.state }} is at the {{ camera_name }}. # # - alias: Alert Object Activity # # trigger: # # - platform: state # # entity_id: # # - sensor.frontdoor_camera_objects # # - sensor.driveway_camera_objects # # - sensor.patio_camera_objects # # - sensor.playarea_camera_objects # # - sensor.garage_camera_objects # # condition: # # - condition: template # # value_template: "{{ states('input_boolean.notify_camera_alerts') == 'on' }}" # # - condition: template # # value_template: '{{ trigger.to_state.state | trim != "" and # # trigger.to_state.state | lower | trim != "unknown" and # # trigger.to_state.state | lower | trim != "clear" }}' # # action: # # - service: script.notify_me # # data_template: # # message: >- # # {% set camera_name = states['camera'][trigger.entity_id.split('.')[1].split('_')[0] ~ '_camera'].attributes.friendly_name %} # # {{ trigger.to_state.state }} detected at the {{ camera_name }}. # # # # This automation basically scans image and keeps a count of people from each camera view and notifies using iOS notification # # There is another automation that alerts in the house (using TTS) based on the data # # # - alias: Scan People and Objects # initial_state: true # trigger: # - platform: state # entity_id: # - binary_sensor.frontdoor_camera_motion # - binary_sensor.driveway_camera_motion # - binary_sensor.patio_camera_motion # - binary_sensor.playarea_camera_motion # - binary_sensor.frontdoor_camera_field_detection # - binary_sensor.driveway_camera_field_detection # - binary_sensor.patio_camera_field_detection # - binary_sensor.playarea_camera_field_detection # - binary_sensor.frontdoor_camera_line_crossing # - binary_sensor.driveway_camera_line_crossing # - binary_sensor.patio_camera_line_crossing # - binary_sensor.playarea_camera_line_crossing # - binary_sensor.garage_motion # to: 'on' # condition: # - condition: template # value_template: "{{ states('input_boolean.notify_camera_alerts') == 'on' }}" # - condition: template # value_template: > # {% macro last_triggered(entity) %} # {% set time_in_seconds = 30 %} # {{ ( (as_timestamp(now()) - as_timestamp(states["binary_sensor"][entity].attributes.last_tripped_time)))|round|abs < time_in_seconds }} # {% endmacro %} # {{ last_triggered(trigger.entity_id.split('.')[1].split('_')[0] ~ '_camera_motion')}} # action: # - service: image_processing.scan # data_template: # entity_id: "image_processing.facebox_{{- trigger.entity_id.split('.')[1].split('_')[0] -}}_camera" # # - service: image_processing.scan # # data_template: # # entity_id: "image_processing.tagbox_{{- trigger.entity_id.split('.')[1].split('_')[0] -}}_camera"