Add initial code
This commit is contained in:
parent
0ec5cb8ff8
commit
7c058e03df
2 changed files with 133 additions and 1 deletions
|
@ -1,3 +1,5 @@
|
||||||
click
|
click
|
||||||
click_config_file
|
click_config_file
|
||||||
PyYAML
|
PyYAML
|
||||||
|
pyxplora-api
|
||||||
|
requests
|
||||||
|
|
|
@ -14,6 +14,8 @@ from logging.handlers import SysLogHandler
|
||||||
import click
|
import click
|
||||||
import click_config_file
|
import click_config_file
|
||||||
import yaml
|
import yaml
|
||||||
|
from pyxplora_api.pyxplora_api import PyXploraApi
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
HOME_FOLDER = os.environ.get('HOME', os.environ.get('USERPROFILE', '/'))
|
HOME_FOLDER = os.environ.get('HOME', os.environ.get('USERPROFILE', '/'))
|
||||||
|
@ -24,7 +26,55 @@ else:
|
||||||
CACHE_FOLDER = f"{HOME_FOLDER}/.local/"
|
CACHE_FOLDER = f"{HOME_FOLDER}/.local/"
|
||||||
LOG_FOLDER = f"{HOME_FOLDER}/log/"
|
LOG_FOLDER = f"{HOME_FOLDER}/log/"
|
||||||
|
|
||||||
|
WATCH_STATES = [
|
||||||
|
{
|
||||||
|
"function": "getWatchBattery",
|
||||||
|
"entity_name": "battery_level"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchIsCharging",
|
||||||
|
"entity_name": "battery_charging"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchIsInSafeZone",
|
||||||
|
"entity_name": "in_safe_zone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchLastLocation",
|
||||||
|
"entity_name": "last_location"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchOnlineStatus",
|
||||||
|
"entity_name": "online_status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchSafeZoneLabel",
|
||||||
|
"entity_name": "safe_zone_label"
|
||||||
|
},
|
||||||
|
# {
|
||||||
|
# "function": "getWatchState",
|
||||||
|
# "entity_name": "state"
|
||||||
|
# },
|
||||||
|
{
|
||||||
|
"function": "getWatchUnReadChatMsgCount",
|
||||||
|
"entity_name": "unread_chat_count"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchUserCurrentStep",
|
||||||
|
"entity_name": "current_step"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchUserSteps",
|
||||||
|
"params": {
|
||||||
|
"date": time.time()
|
||||||
|
},
|
||||||
|
"entity_name": "user_steps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "getWatchUserTotalStep",
|
||||||
|
"entity_name": "user_total_step"
|
||||||
|
}
|
||||||
|
]
|
||||||
class XploraHa:
|
class XploraHa:
|
||||||
"""Integrate Xplora watches into Home Assistant"""
|
"""Integrate Xplora watches into Home Assistant"""
|
||||||
|
|
||||||
|
@ -48,6 +98,50 @@ class XploraHa:
|
||||||
}
|
}
|
||||||
self.data = self._read_cached_data()
|
self.data = self._read_cached_data()
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {self.config['home_assistant_token']}",
|
||||||
|
"content-type": "application/json",
|
||||||
|
}
|
||||||
|
self.ha_session = requests.Session()
|
||||||
|
self.ha_session.headers.update(headers)
|
||||||
|
|
||||||
|
self.xplora = PyXploraApi(
|
||||||
|
self.config['xplora_country_code'],
|
||||||
|
self.config['xplora_phone_number'],
|
||||||
|
self.config['xplora_password']
|
||||||
|
)
|
||||||
|
self.xplora.init(forceLogin=False, signup=True)
|
||||||
|
while True:
|
||||||
|
self._process_watches()
|
||||||
|
time.sleep(self.config['interval'])
|
||||||
|
|
||||||
|
def _process_watches(self):
|
||||||
|
for watch in self.xplora.watchs:
|
||||||
|
self._debug(watch['ward'])
|
||||||
|
base_sensor_entity = f"sensor.xplora_watch_{watch['ward']['name']}_"
|
||||||
|
for watch_state in WATCH_STATES:
|
||||||
|
function = getattr(self.xplora, watch_state['function'])
|
||||||
|
if 'params' in watch_state:
|
||||||
|
state = function(watch['ward']['id'], **watch_state['params'])
|
||||||
|
else:
|
||||||
|
state = function(watch['ward']['id'])
|
||||||
|
self._publish_ha_state(
|
||||||
|
f"{base_sensor_entity}{watch_state['entity_name']}",
|
||||||
|
{
|
||||||
|
"state": state,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _publish_ha_state(self, entity_id, state):
|
||||||
|
self._debug(
|
||||||
|
{ "posting": { "entity": entity_id, "state": state } }
|
||||||
|
)
|
||||||
|
result = self.ha_session.post(
|
||||||
|
f"{self.config['home_assistant_url']}/api/states/{entity_id}",
|
||||||
|
json=state
|
||||||
|
)
|
||||||
|
self._debug( { "result": result.json() })
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
'''Close class and save data'''
|
'''Close class and save data'''
|
||||||
self._save_cached_data(self.data)
|
self._save_cached_data(self.data)
|
||||||
|
@ -181,6 +275,42 @@ class XploraHa:
|
||||||
default=60*60*24*7,
|
default=60*60*24*7,
|
||||||
help='Max age in seconds for the cache'
|
help='Max age in seconds for the cache'
|
||||||
)
|
)
|
||||||
|
@click.option(
|
||||||
|
'--home-assistant-url',
|
||||||
|
'-u',
|
||||||
|
required=True,
|
||||||
|
help='Home Assistant URL, like http://example.org:8123'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'--home-assistant-token',
|
||||||
|
'-t',
|
||||||
|
required=True,
|
||||||
|
help='Home Assistant token'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'--xplora-country-code',
|
||||||
|
'-c',
|
||||||
|
required=True,
|
||||||
|
help='Xplora phone country code'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'--xplora-phone-number',
|
||||||
|
'-p',
|
||||||
|
required=True,
|
||||||
|
help='Xplora phone number of your account'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'--xplora-password',
|
||||||
|
'-P',
|
||||||
|
required=True,
|
||||||
|
help='Xplora account password'
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
'--interval',
|
||||||
|
'-i',
|
||||||
|
default=30,
|
||||||
|
help='Interval in seconds between checks on the Xplora API'
|
||||||
|
)
|
||||||
# @click.option("--dummy","-n", is_flag=True,
|
# @click.option("--dummy","-n", is_flag=True,
|
||||||
# help="Don't do anything, just show what would be done.")
|
# help="Don't do anything, just show what would be done.")
|
||||||
@click_config_file.configuration_option()
|
@click_config_file.configuration_option()
|
||||||
|
|
Loading…
Reference in a new issue