Component to integrate with OpenStreetMap Reverse Geocode (places)
Component to integrate with OpenStreetMap Reverse Geocode and create a sensor with numerous address and place attributes from a device_tracker, person, or sensor
places
in HACS or+ Explore & Download Repositories
places
integration Download
You probably do not want to do this! Use the HACS method above unless you know what you are doing and have a good reason as to why you are installing manually
configuration.yaml
)custom_components
directory there, you need to create itcustom_components
directory create a new folder called places
custom_components/places/
directory in this repositoryUsing your HA configuration directory as a starting point you should now also have this:
custom_components/places/__init__.py
custom_components/places/config_flow.py
custom_components/places/const.py
custom_components/places/manifest.json
custom_components/places/sensor.py
custom_components/places/strings.json
custom_components/places/translations
custom_components/places/translations/en.json
Configuration is done in the Integrations section of Home Assistant.
places
sensor or+ Add Integrations
and select places
Submit
places
sensorsplaces
sensors in Home Assistant Integrations by selecting Configure
under the desired places
sensor.Key | Required | Default | Description |
---|---|---|---|
Sensor Name |
Yes |
Friendly name of the places sensor | |
Tracked Entity ID |
Yes |
The location entity to track. Must have latitude and longitude as attributes. Supports these entities: device_tracker , person , sensor , variable & zone |
|
Email Address |
No |
OpenStreetMap API key (your email address). | |
Display Options |
No |
zone_name , place |
Display options: formatted_place (exclusive option), driving (can be used with formatted_place or other options), zone or zone_name , place , place_name , street_number , street , city , county , state , postal_code , country , formatted_address , do_not_show_not_home See optional Advanced Display Options below to use more complex display logic. |
Home Zone |
No |
zone.home |
Used to calculate distance from home and direction of travel |
Map Provider |
No |
apple |
google , apple , osm |
Map Zoom |
No |
18 |
Level of zoom for the generated map link <1-20> |
Language |
No |
location’s local language | Requested* language(s) for state and attributes. Two-Letter language code(s), separated by commas. *Refer to Notes |
Extended Attributes |
No |
False |
Show extended attributes: wikidata_id, osm_dict, osm_details_dict, wikidata_dict (if they exist). Provides many additional attributes for advanced logic. Warning, this will make the attributes very long! |
Show Last Updated |
No |
False |
Show last updated time at end of state (since xx:yy) |
Use GPS Accuracy |
No |
True |
Use GPS Accuracy when determining whether to update the places sensor (if 0, don’t update the places sensor). By not updaing when GPS Accuracy is 0, should prevent inaccurate locations from being set in the places sensors. Set this to False if your Device Tracker has a GPS Accuracy (gps_accuracy ) attribute, but it always shows 0 even if the latitude and longitude are correct. |
To use, simply enter your advanced options into the display_options
text area. Any display_options that contain []
or ()
will be processed with the Advanced Display Options.
Tip: Build your advanced display options string in a text editor and copy/paste it into display_options field as it is pretty small.
These can be nested.
name[type]
will show the name, but if name is blank, will show the type instead. If type is also blank, nothing will show for that fieldname[type[category]]
will show the name, but if name is blank, will show the type instead, but if type is blank, will show the category. If category is also blank, nothing will show for that field.Include: Set the first item inside the parenthesis to + to only show the field if it equals one of the states listed
Exclude: Set the first item inside the parenthesis to - to only show the field if doesn’t equal one of the states listed
If + or - isn’t listed as the first item inside the parenthesis, include(+) is assumed.
type(-, house)
will show type if it is anything but “house”type(+, house)
will show type only if it is “house”type(house)
same as type(+, house)
type(-, house, retail)
will show type if it is anything but “house” or “retail”type(+, house, retail)
will show type only if it is “house” or “retail”Include: List the field to test followed by another set of parenthesis. In there, set the first item inside the parenthesis to + to only show the main field if the field to be tested equals one of the states listed
Exclude: List the field to test followed by another set of parenthesis. In there, set the first item inside the parenthesis to - to only show the main field if the field to be tested doesn’t equal one of the states listed
As above, if + or - isn’t listed as the first item inside the parenthesis, include(+) is assumed.
type(category(-, highway))
will show type if category is anything but “highway”type(category(+, highway))
will show type only if category is “highway”type(category(highway))
same as type(category(+, highway))
type(category(-, highway, building))
will show type if category is anything but “highway” or “building”type(category(+, highway, building))
will show type only if category is “highway” or “building”type(-,motorway, category(-, highway, building))
will show type if it is not “motorway” and if category is not “highway” or “building”place
:name_no_dupe, category(-, place), type(-, yes), neighborhood, house_number, street
formatted_place
:zone_name[driving, name_no_dupe[type(-, unclassified, category(-, highway))[category(-, highway)], house_number, route_number(type(+, motorway, trunk))[street[route_number]], neighborhood(type(house))], city_clean[county], state_abbr]
driving
name
(Synonym: place_name
)name_no_dupe
(Synonym: place_name_no_dupe
)
type
(Synonym: place_type
)category
(Synonym: place_category
)street_number
(Synonym: house_number
)street
route_number
(Synonym: street_ref
)neighborhood
(Synonyms: neighbourhood
, place_neighborhood
, place_neighbourhood
)city
city_clean
city
but removes “Township” and moves “City” to the end if it starts with “City of”postal_town
(Synonyms: borough
, suburb
)state
(Synonym: region
)state_abbr
county
country
country_code
zip_code
(Synonym: postal_code
)latitude
longitude
zone
zone_name
Note: place
and formatted_place
are not valid fields in the advanced display options. See examples above for how to recreate them.
{
"formatted_address": "Richmond Hill GO Station, 6, Newkirk Road, Beverley Acres, Richmond Hill, York Region, Ontario, L4C 1B3, Canada",
"friendly_name": "sharon",
"current_latitude": "43.874149009154095",
"distance_from_home_km": 7.24,
"country": "Canada",
"postal_code": "L4C 1B3",
"direction_of_travel": "towards home",
"neighbourhood": "Beverley Acres",
"entity_picture": "/local/sharon.png",
"street_number": "6",
"devicetracker_entityid": "device_tracker.sharon_iphone7",
"home_longitude": "-79.7323453871",
"devicetracker_zone": "not_home",
"distance_from_home_m": 17239.053,
"home_latitude": "43.983234888",
"previous_location": "43.86684124904056,-79.4253896502715",
"previous_longitude": "-79.4253896502715",
"place_category": "building",
"map_link": "https://maps.apple.com/maps/?ll=43.874149009154095,-79.42642783709209&z=18",
"last_changed": "2018-05-02 13:44:51.019837",
"state_province": "Ontario",
"county": "York Region",
"current_longitude": "-79.42642783709209",
"current_location": "43.874149009154095,-79.42642783709209",
"place_type": "building",
"previous_latitude": "43.86684124904056",
"place_name": "Richmond Hill GO Station",
"street": "Newkirk Road",
"city": "Richmond Hill",
"home_zone": "zone.sharon_home"
}
(the only difference is the second one uses a condition to only trigger for a specific user)
- alias: ReverseLocateEveryone
initial_state: 'on'
trigger:
platform: event
event_type: places_state_update
action:
- service: notify.ios_jim_iphone8
data_template:
title: 'ReverseLocate: {{ trigger.event.data.entity }} ({{ trigger.event.data.devicetracker_zone }}) {{ trigger.event.data.place_name }}'
message: |-
{{ trigger.event.data.entity }} ({{ trigger.event.data.devicetracker_zone }})
{{ trigger.event.data.place_name }}
{{ trigger.event.data.distance_from_home_km }} km from home and traveling {{ trigger.event.data.direction_of_travel }}
{{ trigger.event.data.to_state }} ({{ trigger.event.data.last_changed }})
data:
attachment:
url: '{{ trigger.event.data.map_link }}'
hide_thumbnail: false
- alias: ReverseLocateAidan
initial_state: 'on'
trigger:
platform: event
event_type: places_state_update
condition:
condition: template
value_template: '{{ trigger.event.data.entity == "aidan" }}'
action:
- service: notify.ios_jim_iphone8
data_template:
title: 'ReverseLocate: {{ trigger.event.data.entity }} ({{ trigger.event.data.devicetracker_zone }}) {{ trigger.event.data.place_name }}'
message: |-
{{ trigger.event.data.entity }} ({{ trigger.event.data.devicetracker_zone }})
{{ trigger.event.data.place_name }}
{{ trigger.event.data.distance_from_home_km }} km from home and traveling {{ trigger.event.data.direction_of_travel }}
{{ trigger.event.data.to_state }} ({{ trigger.event.data.last_changed }})
data:
attachment:
url: '{{ trigger.event.data.map_link }}'
hide_thumbnail: false
language
value is given, default language will be in the location’s local language. When a comma separated list of languages is provided - the component will attempt to fill each address field in desired languages by order.configuration.yaml
filelogger:
default: warning
logs:
custom_components.places: debug
If you want to contribute to this please read the Contribution guidelines