diff --git a/homeassistant/components/device_tracker/icloud.py b/homeassistant/components/device_tracker/icloud.py new file mode 100644 index 0000000000000000000000000000000000000000..a4adaa547bcc94c5693e939c82da8057b7e0f6bc --- /dev/null +++ b/homeassistant/components/device_tracker/icloud.py @@ -0,0 +1,89 @@ +""" +homeassistant.components.device_tracker.icloud +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Device tracker platform that supports scanning iCloud devices. + +It does require that your device has beend registered with Find My iPhone. + +Note: that this may cause battery drainage as it wakes up your device to +get the current location. + +Note: You may receive an email from Apple stating that someone has logged +into your account. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/device_tracker.icloud/ +""" +import logging + +import re +from homeassistant.const import CONF_USERNAME, CONF_PASSWORD +from homeassistant.helpers.event import track_utc_time_change + +SCAN_INTERVAL = 1800 + +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['https://github.com/picklepete/pyicloud/archive/' + '80f6cd6decc950514b8dc43b30c5bded81b34d5f.zip' + '#pyicloud==0.8.0'] + + +def setup_scanner(hass, config, see): + """ + Set up the iCloud Scanner + """ + from pyicloud import PyiCloudService + from pyicloud.exceptions import PyiCloudFailedLoginException + from pyicloud.exceptions import PyiCloudNoDevicesException + + # Get the username and password from the configuration + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + + try: + _LOGGER.info('Logging into iCloud Account') + # Attempt the login to iCloud + api = PyiCloudService(username, + password, + verify=True) + except PyiCloudFailedLoginException as error: + _LOGGER.exception( + 'Error logging into iCloud Service: %s' % error + ) + return + + def update_icloud(now): + """ + Authenticate against iCloud and scan for devices. + """ + try: + # The session timeouts if we are not using it so we + # have to re-authenticate. This will send an email. + api.authenticate() + # Loop through every device registered with the iCloud account + for device in api.devices: + status = device.status() + location = device.location() + # If the device has a location add it. If not do nothing + if location: + see( + dev_id=re.sub(r"(\s|\W|')", + '', + status['name']), + host_name=status['name'], + gps=(location['latitude'], location['longitude']), + battery=status['batteryLevel']*100, + gps_accuracy=location['horizontalAccuracy'] + ) + else: + # No location found for the device so continue + continue + except PyiCloudNoDevicesException: + _LOGGER.info('No iCloud Devices found!') + + track_utc_time_change( + hass, + update_icloud, + second=range(0, 60, SCAN_INTERVAL) + ) diff --git a/requirements_all.txt b/requirements_all.txt index 0712569561a01ef77040a0ea8c3fe89ebb6bdc61..c9835294a20eb0fc26a90877c33c8630ca0f577c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -177,3 +177,6 @@ https://github.com/persandstrom/python-verisure/archive/9873c4527f01b1ba1f72ae60 # homeassistant.components.zwave pydispatcher==2.0.5 + +# homeassistant.sensor.icloud +https://github.com/picklepete/pyicloud/archive/80f6cd6decc950514b8dc43b30c5bded81b34d5f.zip#pyicloud==0.8.0