mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
commit
31f2707b2f
@ -10,14 +10,17 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
import homeassistant.components.mqtt as mqtt
|
import homeassistant.components.mqtt as mqtt
|
||||||
|
from homeassistant.const import (STATE_HOME, STATE_NOT_HOME)
|
||||||
|
|
||||||
DEPENDENCIES = ['mqtt']
|
DEPENDENCIES = ['mqtt']
|
||||||
|
|
||||||
|
CONF_TRANSITION_EVENTS = 'use_events'
|
||||||
LOCATION_TOPIC = 'owntracks/+/+'
|
LOCATION_TOPIC = 'owntracks/+/+'
|
||||||
|
EVENT_TOPIC = 'owntracks/+/+/event'
|
||||||
|
|
||||||
|
|
||||||
def setup_scanner(hass, config, see):
|
def setup_scanner(hass, config, see):
|
||||||
""" Set up a OwnTracksks tracker. """
|
""" Set up an OwnTracks tracker. """
|
||||||
|
|
||||||
def owntracks_location_update(topic, payload, qos):
|
def owntracks_location_update(topic, payload, qos):
|
||||||
""" MQTT message received. """
|
""" MQTT message received. """
|
||||||
@ -48,6 +51,56 @@ def setup_scanner(hass, config, see):
|
|||||||
|
|
||||||
see(**kwargs)
|
see(**kwargs)
|
||||||
|
|
||||||
mqtt.subscribe(hass, LOCATION_TOPIC, owntracks_location_update, 1)
|
def owntracks_event_update(topic, payload, qos):
|
||||||
|
""" MQTT event (geofences) received. """
|
||||||
|
|
||||||
|
# Docs on available data:
|
||||||
|
# http://owntracks.org/booklet/tech/json/#_typetransition
|
||||||
|
try:
|
||||||
|
data = json.loads(payload)
|
||||||
|
except ValueError:
|
||||||
|
# If invalid JSON
|
||||||
|
logging.getLogger(__name__).error(
|
||||||
|
'Unable to parse payload as JSON: %s', payload)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not isinstance(data, dict) or data.get('_type') != 'transition':
|
||||||
|
return
|
||||||
|
|
||||||
|
# check if in "home" fence or other zone
|
||||||
|
location = ''
|
||||||
|
if data['event'] == 'enter':
|
||||||
|
|
||||||
|
if data['desc'] == 'home':
|
||||||
|
location = STATE_HOME
|
||||||
|
else:
|
||||||
|
location = data['desc']
|
||||||
|
|
||||||
|
elif data['event'] == 'leave':
|
||||||
|
location = STATE_NOT_HOME
|
||||||
|
else:
|
||||||
|
logging.getLogger(__name__).error(
|
||||||
|
'Misformatted mqtt msgs, _type=transition, event=%s',
|
||||||
|
data['event'])
|
||||||
|
return
|
||||||
|
|
||||||
|
parts = topic.split('/')
|
||||||
|
kwargs = {
|
||||||
|
'dev_id': '{}_{}'.format(parts[1], parts[2]),
|
||||||
|
'host_name': parts[1],
|
||||||
|
'gps': (data['lat'], data['lon']),
|
||||||
|
'location_name': location,
|
||||||
|
}
|
||||||
|
if 'acc' in data:
|
||||||
|
kwargs['gps_accuracy'] = data['acc']
|
||||||
|
|
||||||
|
see(**kwargs)
|
||||||
|
|
||||||
|
use_events = config.get(CONF_TRANSITION_EVENTS)
|
||||||
|
|
||||||
|
if use_events:
|
||||||
|
mqtt.subscribe(hass, EVENT_TOPIC, owntracks_event_update, 1)
|
||||||
|
else:
|
||||||
|
mqtt.subscribe(hass, LOCATION_TOPIC, owntracks_location_update, 1)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
Loading…
x
Reference in New Issue
Block a user