{"id":13614053,"url":"https://github.com/twrecked/hass-aarlo","last_synced_at":"2025-05-15T16:04:07.567Z","repository":{"id":37251592,"uuid":"167885769","full_name":"twrecked/hass-aarlo","owner":"twrecked","description":"Asynchronous Arlo Component for Home Assistant","archived":false,"fork":false,"pushed_at":"2025-02-20T12:52:19.000Z","size":2577,"stargazers_count":420,"open_issues_count":243,"forks_count":81,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-04-07T21:13:02.188Z","etag":null,"topics":["arlo","homeassistant","homeassistant-components","netgear","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twrecked.png","metadata":{"files":{"readme":"README-202405.md","changelog":"changelog","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-28T02:24:59.000Z","updated_at":"2025-04-06T19:27:25.000Z","dependencies_parsed_at":"2023-10-16T12:55:29.326Z","dependency_job_id":"d49b56f4-a069-44f9-a059-cd25c3aeb44b","html_url":"https://github.com/twrecked/hass-aarlo","commit_stats":{"total_commits":881,"total_committers":33,"mean_commits":"26.696969696969695","dds":0.1555051078320091,"last_synced_commit":"26895c3fbcbdc9328998bf93cda0ac1258218840"},"previous_names":[],"tags_count":224,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twrecked%2Fhass-aarlo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twrecked%2Fhass-aarlo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twrecked%2Fhass-aarlo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twrecked%2Fhass-aarlo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twrecked","download_url":"https://codeload.github.com/twrecked/hass-aarlo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254374403,"owners_count":22060609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arlo","homeassistant","homeassistant-components","netgear","python"],"created_at":"2024-08-01T20:00:56.277Z","updated_at":"2025-05-15T16:04:07.548Z","avatar_url":"https://github.com/twrecked.png","language":"Python","funding_links":[],"categories":["Custom Components","Install from Source","Custom Integrations"],"sub_categories":["Alternative Dashboards","Smart Home Automation"],"readme":"# hass-aarlo\n\n\n## Version 0.7??\n**This is the _README_ for 0.8.1, if you are using version 0.7; see\n[here](https://github.com/twrecked/hass-aarlo/blob/version-0.7.x/README.md)\nfor the correct _README_**\n\n\n## New Features in 0.8.1\n\n### Config Flow\n\nFinally. Thanks to @NickM-27 for starting this. After sitting on it for far too\nlong I decided to do the work I needed to, this integration now acts much like \nevery intergration, splitting down by entity, device and integration.\n\nThis means a lot of this documentation is now out of date, I will upgrade it\nwhen all the option changes have been finalised, for now I will just add a\nquick note inline. \n\n#### What pieces are done\n\n- _upgrade_; the code will upgrade a _0.7_ build to the _config flow_ system.\n  Your current configuration will be moved into 2 places. The username, \n  password and 2FA setting will be moved into the code config regisrty, all\n  other config will be moved into a _aarlo.yaml_ file. For all other setting\n  they have been moved into the _Integration_ configure dialogs.\n- _device groupings_; for example, a camera battery will appear as\n  an entity under a camera device.\n\n#### What pieces need doing\n\n- _integration creation_; you can create new integrations but you will need \n  to reconfigure them to get all the sensors working\n- _reload/reconfigure_; works, but I need to deal with orphans when devices \n  are turned off\n- _unique ids_; create better one for new integrations\n- _config_; maybe work out which config pieces are really needed\n\n#### What if it goes wrong?\n\nFor now I recommend leaving your old configuration in place so you can revert\nback to a _0.7_ release if you encounter an issue.\n\n\n## New Features in 0.8.0\n\n### Split Out Pyaarlo\nThe code now uses _Pyaarlo_ by installing it via _pip_ rather than maintaining\nits own version. If you run into a problem check the [Pyaarlo\nREADME](https://github.com/twrecked/pyaarlo/blob/master/README.md) file,it may\nhave a fix not mentioned here.\n\n### Authentication Caching\nThe code will retry authorization tokens for as long as they are valid. This\nmeans a reduction in authentication attempts and 2FA requests. If this does\nnot work for you send me some logs showing the error and restart with\n`save_session: False` added to your configuration.\n\n### Saner Defaults\nYou will now have less to configure... for example, device refresh and stream\ntimeouts are enabled by default.\n\n## Breaking Changes in 0.8\nThe following options have been removed:\n- `hide_deprecated_services`; all component services are now in the `aarlo`\n  domain.\n- `http_connections`; no longer used after _cloudscraper_ was needed\n- `http_max_size`; no longer used after _cloudscraper_ was needed\n\n\n## Table of Contents\n- [Introduction](#introduction)\n- [Installation](#installation)\n- [Configuration](#configuration)\n   - [Moving from Arlo](#configuration-moving)\n   - [Creating a Login](#configuration-login)\n   - [Main Configuration](#configuration-main)\n   - [Alarm Configuration](#configuration-alarm)\n   - [Camera Configuration](#configuration-camera)\n   - [Binary Sensor Configuration](#configuration-binary)\n   - [Sensor Configuration](#configuration-sensor)\n   - [Light Configuration](#configuration-light)\n   - [Switch Configuration](#configuration-switch)\n   - [Media Player Configuration](#configuration-media)\n   - [Custom Lovelace Card Configuration](#configuration-lovelace)\n- [2-Factor Authentication](#2fa)\n   - [IMAP](#2fa-automatic)\n   - [PUSH](#2fa-push)\n- [Other](#other)\n   - [Naming](#other-naming)\n   - [Saving Media](#other-saving-media)\n   - [Streaming](#other-streaming)\n   - [Snapshots](#other-snapshots)\n   - [User Agents](#other-user-agents)\n   - [Adding Devices](#other-adding)\n   - [Best Practises and Known Limitations](#other-best)\n- [It's Not Working!](#notworking)\n   - [Cloud Flare](#notworking-cloudflare)\n   - [Missing Events](#notworking-missing-events)\n   - [Missing/Incorrect Values](#notworking-missing-values)\n   - [Debug Logs](#notworking-debug)\n   - [Bug Reports](#notworking-bug-reports)\n     - [Hiding Sensitive Data](#notworking-sensitive)\n   - [Reverse Engineering](#notworking-browser)\n- [Advanced Use](#advanced)\n   - [All Parameters](#advanced-parameters)\n   - [Camera Statuses](#advanced-statuses)\n   - [Services](#advanced-services)\n   - [Web Sockets](#advanced-websockets)\n   - [Automation Examples](#advanced-automations)\n- [To Do](#to-do)\n\n\n\u003ca name=\"introduction\"\u003e\u003c/a\u003e\n## Introduction\n_Aarlo_ is an _Asynchronous Arlo_ component for [Home\nAssistant](https://www.home-assistant.io/), it uses the [Arlo\nWebsite](https://my.arlo.com/#/cameras) APIs to function and supports base\nstations, cameras, lights and doorbells.\n\n_Aarlo_ is based on the original [Arlo\ncomponent](https://www.home-assistant.io/integrations/arlo/) and it can\noperate as replacement with minimal configuration changes.\n\n_Aarlo_ also provides a custom [_Lovelace\nCard_](https://github.com/twrecked/lovelace-hass-aarlo), which overlays a\ncamera's last snapshot with its current status and allows access to the\ncameras recording library and live-streaming.\n\n\u003ca name=\"introduction-features\"\u003e\u003c/a\u003e\n#### Features\n\n_Aarlo_ provides:\n- Access to cameras, base stations, sirens, doorbells and lights.\n- Asynchronous, almost immediate, notification of motion, sound and button\n  press events.\n- Ability to view library recordings, take snapshots and direct stream from\n  cameras.\n- Tracking of environmental stats from certain base station types.\n- Special switches to trip alarms and take snapshots from cameras.\n- Enhanced state notifications.\n- Media player support for select devices.\n\n\u003ca name=\"introduction-notes\"\u003e\u003c/a\u003e\n#### Notes\nThis document assumes you are familiar with _Home Assistant_ setup and\nconfiguration.\n\nWherever you see `/config` in this document it refers to your _Home Assistant_\nconfiguration directory. For example, for my installation it's\n`/home/steve/ha` which is mapped to `/config` by my docker container.\n\nIf you aren't familiar with _Home Assistant_ I recommend visiting the\n[Community Website](https://community.home-assistant.io/). It's full of\nhelpful people and there is always someone who's encountered the problem you\nare trying to fix.\n\n\u003ca name=\"introduction-thanks\"\u003e\u003c/a\u003e\n#### Thanks\nMany thanks to:\n* [Pyarlo](https://github.com/tchellomello/python-arlo) and\n  [Arlo](https://github.com/jeffreydwalter/arlo) for doing all the hard work\n  figuring the API out and the free Python lesson!\n* [sseclient](https://github.com/btubbs/sseclient) for reading from the event\n  stream\n* [Button Card](https://github.com/kuuji/button-card/blob/master/button-card.js)\n  for a working Lovelace card I could understand\n* [JetBrains](https://www.jetbrains.com/?from=hass-aarlo) for the excellent\n  **PyCharm IDE** and providing me with an open source licence to speed up the\n  project development.\n\n  [![JetBrains](images/jetbrains.svg)](https://www.jetbrains.com/?from=hass-aarlo)\n\n\n\u003ca name=\"installation\"\u003e\u003c/a\u003e\n## Installation\n\n**You only need to use one of these installation mechanisms. I recommend HACS.** \n\n\u003ca name=\"installation-hacs\"\u003e\u003c/a\u003e\n#### HACS\n[![hacs_badge](https://img.shields.io/badge/HACS-Default-orange.svg?style=for-the-badge)](https://github.com/hacs/integration)\n\n_Aarlo is part of the default HACS store. If you're not interested in\ndevelopment branches this is the easiest way to install._\n\n\u003ca name=\"installation-manually\"\u003e\u003c/a\u003e\n#### Manually\nCopy the `aarlo` directory into your `/config/custom_components` directory.\n\n\u003ca name=\"installation-from-script\"\u003e\u003c/a\u003e\n#### From Script\nRun the installation script. Run it once to make sure the operations look sane\nand run it a second time with the `go` parameter to do the actual work. If you\nupdate just rerun the script, it will overwrite all installed files.\n\n```sh\ninstall /config\n# check output looks good\ninstall go /config\n```\n\n\u003ca name=\"configuration\"\u003e\u003c/a\u003e\n## Configuration\n\n\u003ca name=\"configuration-moving\"\u003e\u003c/a\u003e\n### Moving From Arlo\nYou can replace all instances of `arlo` with `aarlo` in your _Home Assistant_\nconfiguration files to start using _Aarlo_. The following sections detail new\nconfiguration items you can use to add extra functionality to your new _Aarlo_\ncomponent.\n\nYou can also run _Arlo_ and _Aarlo_ side by side but you will need to create an\n_Aarlo_ specific login.\n\n\u003ca name=\"configuration-login\"\u003e\u003c/a\u003e\n### Creating a Login\n_If you are replacing the original _Arlo_ component you don't need to do this\nstep._\n\n_Aarlo_ needs a dedicated _Aarlo_ login. If you try to reuse an existing login -\nfor example, the login from the _Arlo_ app on your phone - the app and this\ncomponent will constantly fight to log in.\n\nWhen you have created the _Aarlo_ login, from your original _Arlo_ account grant\naccess to any devices you want to share and give the _Aarlo_ user admin access.\n\n\u003ca name=\"configuration-main\"\u003e\u003c/a\u003e\n### Main Configuration\n\n**This is now handled from the Integration Page**\n\nThe following configuration is the minimum needed.\n\n```yaml\naarlo:\n  username: !secret arlo_username\n  password: !secret arlo_password\n```\n\n\u003ca name=\"configuration-alarm\"\u003e\u003c/a\u003e\n### Alarm Configuration\n\n** This is now handled from the Integration Configure Pages **\n\nThe following enables and configures the base stations.\n\n```yaml\nalarm_control_panel:\n  - platform: aarlo\n    away_mode_name: armed\n    home_mode_name: home\n    night_mode_name: night\n    trigger_time: 30\n    alarm_volume: 8\n```\n\n* `away_mode_name` _Arlo_ mode to use when setting alarm to `Armed Away`.\n  Default value is `armed` which maps to _Arlo_'s default `Armed` mode.\n* `disarmed_mode_name` _Arlo_ mode to use when setting alarm to `Disarmed`.\n  Default value is `disarmed` which maps to _Arlo_'s default `Disarmed` mode.\n* `home_mode_name` _Arlo_ mode to use when setting alarm to `Armed Home`.\n  Default value `home`.\n* `night_mode_name` _Arlo_ mode to use when setting alarm to `Armed Night`.\n  Default value `night`.\n* `trigger_time` determines how long, in seconds, the triggered alarm will\n  sound\n* `alarm_volume` determine how loud, from 1 to 8, the triggered alarm will\n  sound\n\n_Arlo_ does not have a built in `home` or `night` mode. If you need them create\na custom mode in _Arlo_ and `home_mode_name` and `night_mode_name` to map to\nthem. You don't need to map all modes - I don't use `night_mode`. Names are\ncase-insensitive. Using duplicate names will cause problems, for example,\nmapping both `away` and `night` mode to `armed` will work when setting the\nmode from _Home Assistant_ but might not show the correct mode if you change it\nin the _Arlo_ app.\n\nSee [here](https://www.home-assistant.io/components/arlo/#alarm) for more\ninformation on mode names.\n\n\n\u003ca name=\"configuration-camera\"\u003e\u003c/a\u003e\n### Camera Configuration\n\n**This is now handled from the Integration Configure Pages**\n\nThe following enables any cameras.\n\n```yaml\ncamera:\n  - platform: aarlo\n```\n\n\u003ca name=\"configuration-binary\"\u003e\u003c/a\u003e\n### Binary Sensor Configuration\n\nThe following enables and configures the binary sensors.\n\n```yaml\nbinary_sensor:\n  - platform: aarlo\n    monitored_conditions:\n      - motion\n      - sound\n      - ding\n      - cry\n      - connectivity\n```\n\nItems on the `monitored_conditions` can be one or more of the following:\n\n* `motion` fires when a camera, doorbell or light detects motion.\n* `sound` fires when a camera detects a sound.\n* `ding` fires when a doorbell is pressed.\n* `cry` fires when crying is detected (ArloBaby only)\n* `connectivity` is true when _Arlo_ a device is connected\n\nThe _Arlo_ backend sends the notifications on the event stream so they are\n(almost) real time.\n\n\u003ca name=\"configuration-sensor\"\u003e\u003c/a\u003e\n### Sensor Configuration\n\n**This is now handled from the Integration Configure Pages**\n\nThe following enables and configures the sensors.\n\n```yaml\nsensor:\n  - platform: aarlo\n    monitored_conditions:\n      - total_cameras\n      - last_capture\n      - recent_activity\n      - captured_today\n      - battery_level\n      - signal_strength\n      - temperature\n      - humidity\n      - air_quality\n```\n\nItems on the `monitored_conditions` can be one or more of the following:\n\n* `total_cameras` is a global sensor showing the number of cameras detected.\n\nThe rest of the sensors appear per camera.\n\n* `last_capture` The last time an event was captured by this camera.\n* `recent_activity` Is `on` if activity was recently seen on the camera.\n* `captured_today` The number of events captured by the camera today.\n* `battery_level` The percentage of battery remaining.\n* `signal_strength` The Wi-Fi signal strength of the camera.\n* `temperature` The temperature in the room where the camera is, if supported.\n* `humidity` The humidity in the room where the camera is, if supported.\n* `air_quality` The air quality in the room where the camera is, if supported.\n\nIf you have an _Arlo Smart Plan_ the `last_capture` sensor has the attribute\n'object_type' containing what _Arlo_ cloud service identified as starting the\nrecording (\"Person\", \"Vehicle\", \"Animal\", ...). You can use templates in _Home\nAssistant_ to trigger automations on different object types.\n\n_Note:_ It is important to note a limitation from [pyaarlo](https://github.com/twrecked/pyaarlo#limitations) that the 'object_type' only gets updated AFTER arlo has processed what caused the motion. \n\n\u003ca name=\"configuration-light\"\u003e\u003c/a\u003e\n### Light Configuration\n\n**This is now handled from the Integration Configure Pages**\n\nThe following enables any lights:\n\n```yaml\nlight:\n  - platform: aarlo\n```\nThe component supports the standard _Arlo Light_, _Arlo Baby Light_ and\n_Arlo Pro 3 Floodlight_.\n\nThere is one quirk; on all lights but the _Arlo Pro 3 Floodlight_ you can\nadjust the brightness of a light while it is on but the change will not take\neffect until you turn the light off and back on again. This how the official\nweb interface works.\n\n\u003ca name=\"configuration-switch\"\u003e\u003c/a\u003e\n### Switch Configuration\n\n**This is now handled from the Integration Configure Pages**\n\nThe following enables and configures some pseudo switches:\n\n```yaml\nswitch:\n  - platform: aarlo\n    siren: True\n    all_sirens: True\n    snapshot: True\n    doorbell_silence: True\n    siren_volume: 1\n    siren_duration: 10\n```\n\n* `siren` If `True`, will create a switch for each siren device that allows\n  you to turn it on or off.\n* `all_sirens` If `True`, will create a switch for all the siren devices that\n  allows you to turn them all on and off.\n* `snapshot` If `True`, will create a switch for each camera to allow you to\n  take a snapshot.\n* `doorbell_silence` If `True`, will create two switches for each doorbell, to\n  allow silencing of chimes alone, or both chimes and calls.\n\n`siren_volume` and `siren_duration` controls how loud, from 1 to 10, the siren\nis and how long, in seconds, it sounds.\n\n\u003ca name=\"configuration-media\"\u003e\u003c/a\u003e\n### Media Player Configuration\n\n**This is now handled from the Integration Configure Pages**\n\nThe following enables media player for supported devices:\n\n```yaml\nmedia_player:\n  - platform: aarlo\n```\n\n\u003ca name=\"configuration-lovelace\"\u003e\u003c/a\u003e\n### Custom Lovelace Card Configuration\n\nA custom Lovelace card which is based on the `picture-glance` can be found here:\nhttps://github.com/twrecked/lovelace-hass-aarlo\n\nThe custom Lovelace card allows access to the video recordings library and\npresents customizable camera information on the camera feed. It was influenced\nby the _Arlo_ web interface camera view.\n\n*This piece is optional, _Aarlo_ will work with the standard Lovelace cards.*\n\n\n\u003ca name=\"2fa\"\u003e\u003c/a\u003e\n## 2FA\n\n_Aarlo_ supports 2-factor authentication.\n\n**This is now handled from the Integration Page**\n\nTo check if you need to enable 2FA, log in to actual _Arlo_ website using your\n_Home Assistant_ account and see if it sends you a verification code. If it\ndoes, you will need to provide a mechanism to get this code, choose one of the\nfollowing:\n\n\u003ca name=\"2fa-automatic\"\u003e\u003c/a\u003e\n### IMAP\n\nFor IMAP 2FA _Aarlo_ needs to access and your email account form where it reads\nthe token _Arlo_ sent.\n\n```yaml\naarlo:\n  tfa_source: imap\n  tfa_type: email\n  tfa_host: imap.host.com\n  tfa_username: your-user-name\n  tfa_password: your-imap-password\n```\n\nIf needed, you can specify a port by appending it to the host.\n\n```yaml\naarlo:\n  tfa_source: imap\n  tfa_type: email\n  tfa_host: imap.host.com:1234\n  tfa_username: your-user-name\n  tfa_password: your-imap-password\n```\n\n#### Application Passwords\n\n  For _GMail_ and _Yahoo_ (and other web based email client) you can't log in\n  with your usual password, you will have to create an application specific\n  password. Explaining why this is necessary is out of the scope of this\n  document so see the following pages.\n\n  - [Gmail App Password](https://support.google.com/mail/answer/185833?hl=en)\n  - [Yahoo App Password](https://help.yahoo.com/kb/SLN15241.html)\n\n  If you find you can't log in to your _IMAP_ account check the application\n  password requirement.\n  \n  Once you have created the application password use it in the 2FA\n  configuration.\n\n\nFor `GMail` the set-up would look like this:\n\n```yaml\naarlo:\n  #..other config..\n  tfa_source: imap\n  tfa_type: email\n  tfa_host: imap.gmail.com\n  tfa_username: !secret gmail_username\n  tfa_password: !secret gmail_app_password\n```\n\n\n\u003ca name=\"2fa-push\"\u003e\u003c/a\u003e\n### PUSH\n\nPUSH 2FA _Arlo_ is used when account is set for 2FA to phone app.\n\n```yaml\naarlo:\n  tfa_source: push\n  tfa_type: PUSH\n```\n\n\n\u003ca name=\"other\"\u003e\u003c/a\u003e\n## Other\n\n\u003ca name=\"other-naming\"\u003e\u003c/a\u003e\n### Naming\nEntity ID naming follows this pattern\n`component-type.aarlo_lower_case_name_with_underscores`.\n\nFor example, a camera called \"Front Door\" will have an entity id of\n`camera.aarlo_front_door`.\n\nFor full compatibility _Aarlo_ will decode Unicode characters. This means a\ncamera called `Haustür` will be called `component-type.aarlo_haustur`.\n\nIf you do not want this behaviour - and be warned, this may cause problems\nusing certain _Home Assistant_ services - add `no_unicode_squash: True` to your\nconfiguration.\n\n\n\u003ca name=\"other-saving-media\"\u003e\u003c/a\u003e\n### Saving Media\nIf you use the `save_media_to` parameter to specify a file naming scheme\n_Aarlo_ will use that to save all media - videos and snapshots - locally. You\ncan use the following substitutions:\n\n- `SN`; the device serial number\n- `N`; the device name\n- `Y`; the year of the recording, include century\n- `m`; the month of the year as a number (range 01 to 12)\n- `d`; the day of the month as a number (range 01 to 31)\n- `H`; the hour of the day (range 00 to 23)\n- `M`; the minute of the hour (range 00 to 59)\n- `S`; the seconds of the minute (range 00 to 59)\n- `F`; a shortcut for `Y-m-d`\n- `T`; a shortcut for `H:M:S`\n- `t`; a shortcut for `H-M-S`\n- `s`; the number of seconds since the epoch\n\nYou specify the substitution by prefixing it with a `$` in the format string.\nYou can optionally use curly brackets to remove any ambiguity. For example,\nthe following configuration will save all media under `/config/media`\norganized by serial number and then by date. The code will add the correct\nfile extension.\n\n```yaml\n  save_media_to: \"/config/media/${SN}/${Y}/${m}/${d}/${T}\"\n```\n\nThe first time you configure `save_media_to` the system can take several\nminutes to download all the currently available media. The download is\nthrottled to not overload _Home Assistant_ or _Arlo_. Once the initial download is\ncompleted updates should happen a lot faster.\n\nThe code doesn't provide any management of the downloads, it will keep\ndownloading them until your device is full. It also doesn't provide a _NAS_\ninterface, you need to mount the _NAS_ device and point `save_media_to` at it.\n\n\u003ca name=\"other-streaming\"\u003e\u003c/a\u003e\n### Streaming\n\nYou need to use the custom `aarlo-glance card. And you need to do one or both\nof these:\n- add `stream` to the `image_click` options of the card\n- add `stream` to the `image_top` or `image_bottom` options of the card\n\nStreaming works with _Home Assistant_ and, for most people, will just work. But\nthere are still some things to be wary of.\n\n#### Direct Streaming\n\n_Arlo_ recently upgraded their streaming servers to support `mpeg-dash`. You can\nstream this directly to your browser without going through your _Home Assistant_\ninstall.\n\nOne of the biggest advantages of direct streaming was audio support but that\nhas been added to non-direct streaming in recent _Home Assistant_ releases.\nDirect streaming still offloads the conversion from your _Home Assistant_ server\nand reduces the bandwidth usage of your home network, this is especially true\nif streaming from outside your home network.\n\nYou can not stream directly to Apple devices, they don't support `mpeg-dash`.\n\nInternally the code will use non-direct streaming as needed. For example, to\nsave recording into the _Arlo_ library of longer than 30 seconds the code must\nopen a stream to the _Arlo_ servers, it can only do this in non-direct mode\nbecause the stream component doesn't support `mpeg-dash`.\n\nTo use it on your `aarlo-glance` card you need to add `direct` to the\n`image_view` options of the card. You can mix direct and non-direct cards on\nthe UI.\n\n#### Virtual Env\n\nTo get streaming working in `virtualenv` you still need to make sure a couple\nof libraries are installed. For `ubuntu` the following works:\n\n```\nsource your-env/bin/activate\nsudo apt install libavformat-dev\nsudo apt install libavdevice-dev\npip install av==6.1.2\n```\n\n#### Further Help\n\nIf you are still having issues please read these 3 posts:\n   * https://github.com/twrecked/hass-aarlo/issues/55\n   * https://community.home-assistant.io/t/arlo-replacement-pyarlo-module/93511/293\n   * https://community.home-assistant.io/t/arlo-replacement-pyarlo-module/93511/431?u=sherrell\n\n\n\u003ca name=\"other-snapshots\"\u003e\u003c/a\u003e\n### Snapshots\nSnapshots can be tricky.\n\nThe initial implementation would issue a `fullFrameSnapshot` request and _Arlo_\nwould return a snapshot. The problem was it wasn't very consistent, I have 2\nidentical cameras where snapshot will work on one and not the other. _Arlo_ uses\nthis implementation to allow you to position the camera and I've seen it not\nwork on their web interface and app.\n\nThe next implementation would start a stream and issues a snapshot command -\nmimicking the camera button show on the live stream on the web interface.\nAgain, this mostly worked but some cameras would steadfastly refuse to send\nback a snapshot.\n\nThe latest version adds to the previous stream version by allowing the updated\nthumbnail from the stream to be used as the snapshot image. This method works\nbest but there are still some pieces of configuration you can tweak to make it\nbetter.\n\n* `stream_snapshot`; set to `True` to turn on stream snapshots, default `False`.\n* `stream_snapshot_stop`; a positive integer, the number of seconds to stop\n  the stream after starting it for a snapshot, default 10. This can help speed\n  up cameras that won't send a snapshot on request. Setting it to 0 will let\n  _Arlo_ stop the stream when it thinks it has become idle.\n* `snapshot_checks`; an integer array, default values 1 and 5. Force _Aarlo_ to\n  do a media library check to see if the snapshot has appeared. Useful when\n  systems fail to send `mediaUploadNotifications`.\n* `snapshot_timeout`; a positive integer, default 60. How long to give the\n  snapshot to appear before stopping everything.\n\n\nThis is a summary of possible sizes:\n\n| camera | user_agent | stream_snapshot | worked    | size      |\n|--------|------------|-----------------|-----------|-----------|\n| street | linux      | yes             | yes       | 640x352   |\n| street | linux      | no              | sometimes |           |\n| front  | linux      | yes             | yes       | 1920x1072 |\n| front  | linux      | no              | yes       |           |\n| street | apple      | yes             | no*       |           |\n| street | apple      | no              | sometimes | 1280x720  |\n| front  | apple      | yes             | yes       |           |\n| front  | apple      | no              | yes       | 1920x1072 |\n\n_*And I know up until about 2 weeks ago this row was working._\n\n_street_ is an 1st gen _Arlo_ (VMC3030)\n_front_ is an _Arlo Pro_ (VMC4030P)\n\n\u003ca name=\"other-user-agents\"\u003e\u003c/a\u003e\n### User Agents\n\nThe following user agents are available:\n- `arlo`; the original `netgear` use agent, this is the default and will get\n  `rtsps` streams from the _Arlo_ servers.\n- `linux`; a newer `Chrome` user agent, this will get `mpeg-dash` streams from\n  the _Arlo_ servers.\n- `apple`, `ipad`, `iphone`, `mac`, `firefox`; these simulate these devices or\n  browsers and, for now, these return `mpeg_dash` streams.\n\nAs you can see, the user agent you supply to _Arlo_ determines what streaming\nformat is used. I used to think that the agent you used to log in had to be\nthe same as the agent you use to start a stream. After some testing I find\nthis is not the case.\n\nWhat this means is _Aarlo_ can select the best user agent for the task.\n\n- The `camera.record` service will use `arlo` agent so _Home Assistant_ can save\n  the stream as `mp4`.\n- The `camera.play_stream` service will use `arlo` agent so _Home Assistant_ can\n  convert the stream to `hls`.\n- The `arlo_stream_url` web service will use the `linux` agent to return a URL\n  to an `mpeg-dash` stream.\n\nThose `camera.play_stream` and `arlo_stream_url` changes are important, they\nallow the `aarlo-glance` Lovelace card to choose direct or non-direct streams\nregardless of the default user agent provided.\n\nThe default user agent is used in all other cases. This means, for example,\nthe one you set if picked for snapshot operations.\n\n\u003ca name=\"other-best\"\u003e\u003c/a\u003e\n### Best Practises and Known Limitations\nThe component uses the _Arlo_ webapi.\n* There is no documentation so the API has been reverse engineered using\n  browser debug tools.\n* Streaming times out after 30 minutes.\n* The webapi doesn't seem like it was really designed for permanent\n  connections so the system will sometimes appear to lock up. Various\n  workarounds are in the code and can be configured at the `arlo` component\n  level. See next paragraph.\n\nIf you do find the component locks up after a while (I've seen reports of\nhours, days or weeks), you can add the following to the main configuration.\nStart from the top and work down:\n* `refresh_devices_every`, tell _Aarlo_ to request the device list every so\n  often. This will sometimes prevent the back end from ageing you out. The\n  value is in hours and a good starting point is 3.\n* `stream_timeout`, tell _Aarlo_ to close and reopen the event stream after a\n  certain period of inactivity. _Aarlo_ will send keep alive every minute so a\n  good starting point is 180 seconds.\n* `reconnect_every`, tell _Aarlo_ to logout and back in every so often. This\n  establishes a new session at the risk of losing an event notification. The\n  value is minutes and a good starting point is 90.\n* `request_timeout`, the amount of time to allow for a http request to work. A\n  good starting point is 120 seconds.\n\nUnify your alarm mode names across all your base stations. There is no way to\nspecify different mode names for each device.\n\n_Arlo_ will allow shared accounts to give cameras their own name. If you find\ncameras appearing with unexpected names (or not appearing at all), log into\nthe _Arlo_ web interface with your _Home Assistant_ account and make sure the\ncamera names are correct.\n\nYou can change the brightness on the light but not while it's turned on. You\nneed to turn it off and back on again for the change to take. This is how the\nweb interface does it.\n\n\n\u003ca name=\"other-adding\"\u003e\u003c/a\u003e\n### Adding Devices\n\n*Coming soon...*\n\n\n\u003ca name=\"notworking\"\u003e\u003c/a\u003e\n## It's Not Working\n\n\u003ca name=\"notworking-cloudflare\"\u003e\u003c/a\u003e\n### Cloud Flare\n_Arlo_ recently added Cloud Flare anti-bot protection to the _Arlo_ website. This\nservice doesn't work well with the Python Requests package. If you see the\nfollowing errors you are running into Cloud Flare issues.\n\n```\n2021-06-03 13:28:32 WARNING (SyncWorker_4) [pyaarlo] request-error=CloudflareChallengeError\n```\n\nThere are a couple of things you can try:\n* Change your `user_agent` and restart _Home Assistant_. You can even try\n  setting the `user_agent` to `random` if things get desperate.\n* Modify `/etc/hosts` to point to a specific _Arlo_ web server. You can try\n  adding the following and changing which entry you comment out.\n  \n```  \n#104.18.30.98 ocapi-app.arlo.com\n#104.18.31.98 ocapi-app.arlo.com\n```\n\nThe good news, _Aarlo_ will now cache the authentication token so once you've\nlogged in you should be not need to be bothered by Cloud Flare for 2 weeks.\n\nThis problem affects me, and I'm constantly trying to refine the code.\n\n\u003ca name=\"notworking-missing-events\"\u003e\u003c/a\u003e\n### Missing Events\n_Arlo_ is in the middle of (or seems to be in the middle of) changing their back\nend event system. The original system used a `Server Side Event` socket but\nthey now support a `MQTT` broker system. \n\nBy default, the system will use try to work out which event system to use by\nlooking for keywords in the _Arlo_ server responses. If you aren't seeing the\nevents you expect to see then try changing to the `Server Side Event` back\nend. Use the `backend` keyword.\n\n```yaml\naarlo:\n  #..your current config..\n  #..use either sse or mqtt for this\n  backend: sse\n```\n\nIf that doesn't help then you will need to turn on\n[logging](#notworking-debug) and examine the output.\n\nOnce you have the logs look for the event you are missing at around the time\nyou are expecting it. The events are usually helpfully named, i.e.\n`motionDetected` for motion events, `batteryLevel` for battery levels.\n\n\n\u003ca name=\"notworking-missing-values\"\u003e\u003c/a\u003e\n### Missing/Incorrect Values\nSee [Missing Events](#notworking-missing-events), they share a lot of the same\nissues.\n\nAnd make sure you have enabled `Access Rights` for your secondary account.\n_Arlo_ won't update some values for non-admin accounts.\n\n\n\u003ca name=\"notworking-debug\"\u003e\u003c/a\u003e\n### Debug Logs\nI might ask you to provide logging, the follow paragraphs show you how. It's\nsafe to leave these enabled, they just increase the size of the log file.\n\nHome assistant logs everything to `/config/home-assistant.log`, a typical piece of\ndebug from _Aarlo_ looks like this.\n\n```\n2020-01-21 11:44:48 DEBUG (ArloBackgroundWorker) [pyaarlo] fast refresh\n2020-01-21 11:44:48 DEBUG (ArloBackgroundWorker) [pyaarlo] day testing with 2020-01-21!\n2020-01-21 11:44:50 DEBUG (ArloEventStream) [pyaarlo] async ping response subscriptions/XXXXXX-XXX-XXXXXXX_web\n```\n\n_If you fancy poking around and trying to find out what it going wrong, dive \nin, searching for `ERROR` and any reference to `traceBack` is a good place \nto start._\n\n#### Basic Debug\nYou can turn this on by adding the following to your `configuration.yaml`\nfile. This provides a high level view of what is happening.\n \n```yaml\nlogger:\n  default: info\n  logs:\n    pyaarlo: debug\n    custom_components.aarlo: debug\n    custom_components.aarlo.alarm_control_panel: debug\n    custom_components.aarlo.binary_sensor: debug\n    custom_components.aarlo.camera: debug\n    custom_components.aarlo.light: debug\n    custom_components.aarlo.media_player: debug\n    custom_components.aarlo.sensor: debug\n    custom_components.aarlo.switch: debug\n```\n\nIf, for example, you suspect the problem is just with your lights you can\nremove unneeded debug:\n\n```yaml\nlogger:\n  default: info\n  logs:\n    pyaarlo: debug\n    custom_components.aarlo: debug\n    custom_components.aarlo.light: debug\n```\n\n#### Verbose Debug\nIt sometimes helps to turn on more verbose debug, this provides more\ninformation about the program's internal states.\n\nFollow the _Basic Debug_ instructions and then add this to your _Aarlo_ config. \n\n```yaml\naarlo:\n  # old config\n  verbose_debug: True\n``` \n\n#### Very Verbose Debug\nFinally, you can look at what events _Arlo_ is sending you by turning on\npacket dumping.\n\nFollow the _Basic Debug_ instructions and then add this to your _Aarlo_ config. \n\n```yaml\naarlo:\n  # old config\n  verbose_debug: True\n  packet_dump: True\n```\n\nThe logs will now include dumps of packets sent by _Arlo_. The following\nis an example of a subscription response:\n\n```json\n{ \"status\": \"connected\"},\n{ \"action\": \"is\",\n    \"from\": \"XXXXXXXXXXXXX\",\n    \"resource\": \"subscriptions/XXXXXX-XXX-XXXXXXX_web\",\n    \"to\": \"XXXXXX-XXX-XXXXXXX_web\",\n    \"transId\": \"web!38a29262-1ce0-4c4d-8f75-fafec2c34332\"}\n```\n\nAnother example, if _Arlo_ detects motion you will see a packet with the\nfollowing field in it:\n\n```json\n\"properties\": {\"motionDetected\": \"True\"},\n```\n\n\n\u003ca name=\"notworking-bug-reports\"\u003e\u003c/a\u003e\n### Bug Reports\nIf you run into problems please create a bug report, include the following\ninformation in the bug report to help debugging.\n* Version of software running.\n* Make of cameras and base stations you have.\n* What you were doing or expecting\n* Include debug logs if available.\n\n\u003ca name=\"notworking-sensitive\"\u003e\u003c/a\u003e\n#### Hiding Sensitive Data\n\nIf you attach any logs to the bug report it's a good idea to encrypt them\nbefore uploading them. You can do this in several ways.\n\n##### Online\n\nYou can encrypt your output on this\n[webpage](https://pyaarlo-tfa.appspot.com/). You can upload the file or copy\nand paste it into the buffer. Press `Submit`.\n\n**This page doesn't forward automatically the output to me, so you will have\nto copy and paste it into a file and attach it to the bug report.**\n\n##### Command Line\n\nIf you are comfortable using the command line you can use `curl` to encrypt\nthe logs. Attach `home-assistant.log.enc` to the bug report.\n\n_If you are using a Linux environment you don't need to run this from the\ndocker._\n\n```sh\ndocker exec -it YOUR_DOCKER_NAME bash\ncd /config/\ncat home-assistant.log | curl -s -F 'plain_text_file=@-;filename=clear.txt' https://pyaarlo-tfa.appspot.com/encrypt \u003e home-assistant.log.enc\nexit\n```\n\n##### Pyaarlo\n\nYou can do this using the [pyaarlo](https://github.com/twrecked/pyaarlo)\ncomponent. The easiest way to install it is in a virtual environment. The\nfollowing steps will install Pyaarlo.\n\n```bash\n$ python3 -m venv pyaarlo\n$ source pyaarlo/bin/activate\n(pyaarlo) $ pip install pyaarlo\n(pyaarlo) $ pyaarlo --help\n```\n\nTo encrypt your logs save the output to a file and do the following. Attach\n`home-assistant.log.enc` to the bug report.\n\n```bash\n(pyaarlo)$ cat your-log-file | pyaarlo encrypt \u003e home-assistant.log.enc\n```\n\nYou don't need to keep re-installing pyaarlo, just re-activate the virtualenv.\n```bash\n$ cd where-you-where-before\n$ source pyaarlo/bin/activate\n(pyaarlo) $ pyaarlo --help\n```\n\nWhen you're finished with pyaarlo deactivate the virtualenv.\n```bash\n(pyaarlo) $ deactivate\n$\n```\n\n#### Notes\n_Data isn't anonymized internally... I will be adding that functionality._\n\n\n\u003ca name=\"notworking-browser\"\u003e\u003c/a\u003e\n### Reverse Engineering\n\nI don't own every piece _Arlo_ of equipment so sometimes, when things go\nwrong, I need to see what _Arlo_ actually expects this code to send and what\nthis code can expect back from _Arlo_. _Aarlo_ simulates a web browser\nconnection so you can find out what is expected by using the browser\n_Developer Tools_.\n\n_This instructions are for Chrome but most browsers (I hope!) have similar\nfunctionality._\n\n- Open your browser.\n- Go to [the Arlo camera website](https://my.arlo.com/#/home).\n- With the _Arlo_ website open enable you browser's developer tools. On Chrome\n  you click the three dots in the upper right corner, then select `More Tools`\n  and finally select `Developer Tools`. You can also use the shortcut\n  `CTRL+SHIFT+I`.\n- Select the `Network` tab in the newly opened window.\n- Now log in to the _Arlo_ website.\n\nWhen you log in the data passed between the browser and _Arlo_ website will\nstart to appear, and keep appearing, in this tab. If you click on an entry\nunder `Name` you can examine the packets in more detail.\n\n- The `Headers` tab shows you what was sent in the headers of the request.\n- The `Payload` tabs shows you what was sent in the body of the request\n- The `Preview` tab shows the reply sent back from _Arlo_.\n\n![Network TAB](images/chrome-2.png)\n\nIf you hover over the field under `name` a pop up will display the full URL the\nrequest was sent to.\n\nFor example, _Arlo_ creates a new device with a `WOOHOO` button, I don't\nposses such a device but you'd like the `WOOHOO` functionality implementing in\n_Aarlo_. What I need is the sequence of packets and their replies when you\npress the button. The only real way to do this is to press the button and see\nwhat new packets appear in the `Name` tab.\n\nYou will then need to copy and paste them into a bug report on _GitHub_. See\nthe previous section on how to hide sensitive data.\n\n\n\u003ca name=\"advanced\"\u003e\u003c/a\u003e\n## Advanced Use\n\n\u003ca name=\"advanced-parameters\"\u003e\u003c/a\u003e\n### All Parameters\nThe following additional parameters can be specified against the aarlo platform for more\ngranular control:\n\n| Field                   | Type        | Default                      | Description                                                                                                                                                                                                                              |\n|-------------------------|-------------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `db_motion_time`        | integer     | `30` (s)                     | Duration of doorbell motion. (Arlo doorbell only indicates motion is present not that it stops)                                                                                                                                          |\n| `db_ding_time`          | integer     | `60` (s)                     | Duration of doorbell press. (Arlo doorbell only indicates doorbell was pressed, not that it was released)                                                                                                                                |\n| `recent_time`           | integer     | `60` (s)                     | Used to hold the cameras in a recent activity state after a recording or streaming event. (Streaming \u0026 recording can be over in a few seconds, without this the camera will revert to idle, possibly looking like nothing has happened.) |\n| `last_format`           | strftime    | `'%m-%d %H:%M'`              | Display format of last captured time                                                                                                                                                                                                     |\n| `serial_ids`            | boolean     | False                        | Use device IDS for the entity names.  **BE CAREFUL, WILL RENAME ALL YOUR ENTITIES**                                                                                                                                                      |\n| `request_timeout`       | time period | `60`                         | Timeout for requests sent to Arlo server. 0 means no timeout.                                                                                                                                                                            |\n| `stream_timeout`        | time period | `120`                        | Timeout for inactivity on the Arlo event stream. 0 means no timeout. Used to help with Arlo components becoming unresponsive.                                                                                                            |\n| `reconnect_every`       | integer     | `0` (minutes)                | If not 0 then force a logout every `reconect_entry` time period. Used to help with Arlo components becoming unresponsive.                                                                                                                |\n| `refresh_devices_every` | integer     | `2` (hours)                  | Used to force a device refresh every x hours. 0 = no refreshing. Used to resolve issue with mode changes failing after several days of use.                                                                                              |\n| `refresh_modes_every`   | integer     | `0` (minutes)                | Used to force a mode refresh every x minutes. 0 = no refreshing. Used to resolve issue with mode changes failing after several days of use.                                                                                              |\n| `packet_dump`           | boolean     | `False`                      | Causes aarlo to store all the packets it sees in `/config/.aarlo/packets.dump` file. Only really needed for debugging and reverse engineering the API.                                                                                   |\n| `conf_dir`              | string      | `'/config/.aarlo'`           | Location to store component state. (The default is fine for hass.io, docker, and virtualenv systems - don't set this value unless asked to.)                                                                                             |\n| `host`                  | string      | `https://my.arlo.com`        | Sets the host aarlo will connect to                                                                                                                                                                                                      |\n| `auth_host`             | string      | `https://ocapi-app.arlo.com` | Sets the authentication host aarlo will connect to                                                                                                                                                                                       |\n| `backend`               | string      | `mqtt`                       | Use mqtt or sse backend                                                                                                                                                                                                                  |\n| `no_media_upload`       | boolean     | `False`                      | Used as a workaround for Arlo issues where the camera never gets a media upload notification. (Not needed in most cases.) *Deprecated, prefer `media_retry`.                                                                             |\n| `media_retry`           | list(ints)  | 5, 15, 25                    | Used as a workaround for Arlo issues where the camera never gets a media upload notification. (Not needed in most cases.)                                                                                                                |\n| `mode_api`              | string      | `auto`                       | available options: [`v1`, `v2`, `v3`] You can override this by setting this option to  v1 or v2 to use the old or new version exclusively. The default is  auto, choose based on device                                                  |\n| `save_updates_to`       | string      | ''                           | A directory to automatically save updated camera images to. Has format `$save_updates_to/$unique_id.jpg`                                                                                                                                 |\n| `save_media_to`         | string      | ''                           | A string describing where to save new media files. This include both video and snapshots. See the \"Save Media\" section.                                                                                                                  |\n| `verbose_debug`         | boolean     | `False`                      | Turn on extra debug. This extra information is usually not needed!                                                                                                                                                                       |\n| `library_days`          | integer     | `27` (days)                  | Change the number of days of video the component downloads from Arlo.                                                                                                                                                                    |\n| `injection_service`     | boolean     | `False`                      | If `True` enable the packet injection service.                                                                                                                                                                                           |\n| `user_agent`            | string      | `arlo`                       | Tells the system which user agent to pass to Arlo.                                                                                                                                                                                       |\n| `stream_snapshot`       | boolean     | `False`                      | If `True` will always try to start a stream before taking a snapshot. If `False` will take and idle or streaming snapshot depending on the camera state.                                                                                 |\n| `stream_snapshot_stop`  | integer     | `10` (seconds)               | How long to wait before stopping the snapshot stream, 0 means let Arlo do it.                                                                                                                                                            |\n| `snapshot_checks`       | list(ints)  | 1 and 5 (seconds)            | Force Aarlo to check for a snapshot before `mediaUploadNotification` appears.                                                                                                                                                            |\n| `snapshot_timeout`      | integer     | 65 (seconds)                 | How long to wait before abandoning snapshot attempt                                                                                                                                                                                      |\n\n\n\u003ca name=\"advanced-statuses\"\u003e\u003c/a\u003e\n### Camera Statuses\n\nThe following camera statuses are reported:\n  * `Idle` camera is doing nothing\n  * `Turned Off` user has turned the camera off\n  * `Recording` camera has detected something and is recording\n  * `Streaming` camera is streaming live video to another other login\n  * `Taking Snapshot` cameras is updating the thumbnail\n  * `Recently Active` camera has seen activity within the last few minutes\n  * `Too Cold!` the camera is shutdown until it warms up\n\n\u003ca name=\"advanced-services\"\u003e\u003c/a\u003e\n### Services\n\nThe component provides the following services:\n\n| Service                                 | Parameters                                                                                                                         | Description                                                                                                                    |\n|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|\n| `aarlo.camera_request_snapshot`         | `entity_id` - name(s) of entities to use                                                                                           | This requests a snapshot be taken. Camera will move from `taking_snapshot` state when finished                                 |\n| `aarlo.camera_request_snapshot_to_file` | `entity_id` - name(s) of entities to use \u003cbr/\u003e`filename` - where to save snapshot                                                  | This requests a snapshot be taken and written to the passed file. Camera will move from  `taking_snapshot` state when finished |\n| `aarlo.camera_start_recording`          | `entity_id` - name(s) of entities to use \u003cbr\u003e`duration` - amount of time in seconds to record                                      | Begins video capture from the specified camera                                                                                 |\n| `aarlo.camera_request_video_to_file`    | `entity_id` - name(s) of entities to use \u003cbr/\u003e`filename` - where to save video                                                     | This requests a video be taken and written to the passed file. Camera will move from `recording` state when finished           |\n| `aarlo.camera_stop_activity`            | `entity_id` - name(s) of entities to use                                                                                           | This moves the camera into the idle state. Can be used to stop streaming or recording.                                         |\n| `aarlo.alarm_set_mode`                  | `entity_id` - name(s) of entities to use \u003cbr/\u003e`mode` - custom mode to change to                                                    | Set the alarm to a custom mode                                                                                                 |\n| `aarlo.siren_on`                        | `duration` - amount of time in seconds to record\u003cbr/\u003e`volume` - how loud to set siren                                              | Turn a siren on.                                                                                                               |\n| `aarlo.sirens_on`                       | `entity_id` - name(s) of entities to use \u003cbr\u003e`duration` - amount of time in seconds to record\u003cbr/\u003e`volume` - how loud to set siren | Turns all sirens on.                                                                                                           |\n| `aarlo.siren_off`                       | `entity_id` - name(s) of entities to use                                                                                           | Turns a siren off.                                                                                                             |\n| `aarlo.sirens_off`                      |                                                                                                                                    | Turns all sirens off.                                                                                                          |\n| `aarlo.restart_device`                  | `entity_id` - name(s) of entities to reboot                                                                                        | Restarts a base station. You need admin access to do this.                                                                     |\n| `aarlo.inject_response`                 | `filename` - file to read packet from                                                                                              | Inject a packet into the event stream.                                                                                         |\n\nFor recordings longer than 30 seconds you will need to white list the `/tmp`\ndirectory. This is because we have to keep a stream to _Arlo_ open to prevent\nthem from stopping the recording after 30 seconds. And we write this stream to\nthe `/tmp` directory.\n\nFor `restart_device` you need to log in with the main account.\n\nThese services are deprecated and will be going away. By moving services under\nthe aarlo domain it allows _Home Assistant_ to use the `services.yaml`\ndescriptions.\n\n| Service                                 | Parameters                                                                                  | Description                                                                                                                  |\n|-----------------------------------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|\n| `camera.aarlo_request_snapshot`         | `entity_id` - camera to get snapshot from                                                   | This requests a snapshot be taken. Camera will move from  taking_snapshot state when finished                                |\n| `camera.aarlo_request_snapshot_to_file` | `entity_id` - camera to get snapshot from\u003cbr/\u003e`filename` - where to save snapshot           | This requests a snapshot be taken and written to the passed file. Camera will move from  taking_snapshot state when finished |\n| `camera.aarlo_stop_activity`            | `entity_id` - camera to get snapshot from                                                   | This moves the camera into the idle state. Can be used to stop streaming                                                     |\n| `camera.start_recording`                | `entity_id` - camera to start recording\u003cbr\u003e`duration` - amount of time in seconds to record | Begins video capture from the specified camera                                                                               |\n| `camera.stop_recording`                 | `entity_id` - camera to stop recording                                                      | Ends video capture from the specified camera                                                                                 |\n| `alarm_control_panel.aarlo_set_mode`    | `entity_id` - camera to get snapshot from\u003cbr/\u003e`mode` - custom mode to change to             | Set the alarm to a custom mode                                                                                               |\n\n\u003ca name=\"advanced-events\"\u003e\u003c/a\u003e\n### Events\n\nThe following events can fire:\n\n| Event                  | Description                                                |\n|------------------------|------------------------------------------------------------|\n| aarlo_image_updated    | The image updated                                          |\n| aarlo_snapshot_updated | The image updated, and it was caused by a snapshot.        |\n| aarlo_capture_updated  | The image updated, and it was caused by an Arlo recording. |\n\nThe following events are deprecated:\n\n| Event                | Description          |\n|----------------------|----------------------|\n| aarlo_snapshot_ready | The image is updated |\n\n\n\u003ca name=\"advanced-websockets\"\u003e\u003c/a\u003e\n### Web Sockets\n\nThe component provides the following extra web sockets:\n\n| Service              | Parameters                                                                                     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n|----------------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| aarlo_video_url      | \u003cul\u003e\u003cli\u003e`entity_id` - camera to get details from\u003c/li\u003e\u003cul\u003e                                      | Request details of the last recorded video. Returns: \u003cul\u003e\u003cli\u003e`url` - video url\u003c/li\u003e\u003cli\u003e`url_type` - video type\u003c/li\u003e\u003cli\u003e`thumbnail` - thumbnail image url\u003c/li\u003e\u003cli\u003e`thumbnail_type` - thumbnail image type\u003c/li\u003e\u003c/ul\u003e                                                                                                                                                                                                                                                                          |\n| aarlo_library        | \u003cul\u003e\u003cli\u003e`at-most` - return at most this number of entries\u003c/li\u003e\u003cul\u003e                             | Request up the details of `at-most` recently recorded videos. Returns an array of:\u003cul\u003e\u003cli\u003e`created_at`: unix time stamp\u003c/li\u003e\u003cli\u003e`created_at_pretty`: pretty version of the create time\u003c/li\u003e\u003cli\u003e`url`: URL of the video\u003c/li\u003e\u003cli\u003e`url_type`: video type\u003c/li\u003e\u003cli\u003e`thumbnail`: URL of the thumbnail\u003c/li\u003e\u003cli\u003e`thumbnail_type`: thumbnail type\u003c/li\u003e\u003cli\u003e`object`: object in the video that triggered the capture\u003c/li\u003e\u003cli\u003e`object_region`: region in the video that triggered the capture\u003c/li\u003e\u003c/ul\u003e |\n| aarlo_stream_url     | \u003cul\u003e\u003cli\u003e`entity_id` -  camera to get snapshot from\u003c/li\u003e\u003cli\u003e`filename` - where to save snapshot | Ask the camera to start streaming. Returns:\u003cul\u003e\u003cli\u003e`url` - URL of the video stream\u003c/li\u003e\u003c/ul\u003e                                                                                                                                                                                                                                                                                                                                                                                                |\n| aarlo_snapshot_image | \u003cul\u003e\u003cli\u003e`entity_id` -  camera to get snapshot from\u003c/li\u003e\u003c/ul\u003e                                   | Request a snapshot. Returns image details: \u003cul\u003e\u003cli\u003e`content_type`: the image type\u003c/li\u003e\u003cli\u003e`content`: the image\u003c/li\u003e\u003c/ul\u003e                                                                                                                                                                                                                                                                                                                                                                    |\n| aarlo_stop_activity  | \u003cul\u003e\u003cli\u003e`entity_id` - camera to stop activity on\u003c/li\u003e\u003c/ul\u003e                                     | Stop all the activity in the camera. Returns: \u003cul\u003e\u003cli\u003e`stopped`: True if stop request went in\u003c/li\u003e\u003c/ul\u003e                                                                                                                                                                                                                                                                                                                                                                                     |\n\n\u003ca name=\"advanced-automations\"\u003e\u003c/a\u003e\n### Automation Examples\n\n#### Update camera snapshot 3 seconds after a recording event happens\n\n```yaml\n- id: 'automation-0100'\n  alias: Camera Snapshot\n  trigger:\n  - entity_id: camera.aarlo_camera1,camera.aarlo_camera2\n    for: 00:00:03\n    from: 'idle'\n    platform: state\n    to: 'recording'\n  - entity_id: camera.aarlo_camera1,camera.aarlo_camera2\n    for: 00:00:03\n    from: 'recently active'\n    platform: state\n    to: 'recording'\n  condition: []\n  action:\n  - data_template:\n      entity_id: \"{{ trigger.entity_id }}\"\n    service: camera.aarlo_request_snapshot\n```\n\n#### Begin recording when an entity changes state\n\n```yaml\n- id: 'automation-0101'\n  alias: Record video when garage opens\n  description: ''\n  trigger:\n  - entity_id: cover.garage_door\n    platform: state\n    to: open\n  condition: []\n  action:\n  - data:\n      duration: 300\n      entity_id: camera.aarlo_garage\n    service: camera.aarlo_start_recording\n```\n\n\n\u003ca name=\"to-do\"\u003e\u003c/a\u003e\n## To Do\n\n* smarter light brightness...\n* coloured lights\n* custom mode - like SmartThings to better control motion detection\n* use asyncio loop internally\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwrecked%2Fhass-aarlo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwrecked%2Fhass-aarlo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwrecked%2Fhass-aarlo/lists"}