mirror of
https://github.com/home-assistant/core.git
synced 2025-08-03 04:35:11 +02:00
Merge branch 'dev' of https://github.com/home-assistant/home-assistant into solax-inverter
This commit is contained in:
@@ -10,7 +10,7 @@ executors:
|
||||
parameters:
|
||||
tag:
|
||||
type: string
|
||||
default: latest
|
||||
default: latest
|
||||
docker:
|
||||
- image: circleci/python:<< parameters.tag >>
|
||||
- image: circleci/buildpack-deps:stretch
|
||||
@@ -52,7 +52,8 @@ commands:
|
||||
command: |
|
||||
python3 -m venv venv
|
||||
. venv/bin/activate
|
||||
pip install -U pip
|
||||
pip install -q -U pip
|
||||
pip install -q -U setuptools
|
||||
<<# parameters.all >>pip install -q --progress-bar off -r requirements_all.txt -c homeassistant/package_constraints.txt<</ parameters.all>>
|
||||
<<# parameters.test >>pip install -q --progress-bar off -r requirements_test.txt -c homeassistant/package_constraints.txt<</ parameters.test>>
|
||||
<<# parameters.test_all >>pip install -q --progress-bar off -r requirements_test_all.txt -c homeassistant/package_constraints.txt<</ parameters.test_all>>
|
||||
@@ -68,29 +69,49 @@ commands:
|
||||
name: install
|
||||
command: |
|
||||
. venv/bin/activate
|
||||
pip install --progress-bar off -e .
|
||||
pip install -q --progress-bar off -e .
|
||||
|
||||
jobs:
|
||||
|
||||
static-check:
|
||||
executor:
|
||||
name: python
|
||||
tag: 3.7-stretch
|
||||
tag: 3.5.5-stretch
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
- docker-prereqs
|
||||
- install-requirements:
|
||||
python: 3.5.5-stretch
|
||||
test: true
|
||||
|
||||
- run:
|
||||
name: run static check
|
||||
command: |
|
||||
python3 -m venv venv
|
||||
. venv/bin/activate
|
||||
pip install -U pip
|
||||
pip install --progress-bar off flake8
|
||||
flake8
|
||||
|
||||
- run:
|
||||
name: validate CODEOWNERS
|
||||
command: |
|
||||
. venv/bin/activate
|
||||
python script/manifest/codeowners.py validate
|
||||
|
||||
- run:
|
||||
name: run static type check
|
||||
command: |
|
||||
. venv/bin/activate
|
||||
TYPING_FILES=$(cat mypyrc)
|
||||
mypy $TYPING_FILES
|
||||
|
||||
- install
|
||||
|
||||
- run:
|
||||
name: validate manifests
|
||||
command: |
|
||||
. venv/bin/activate
|
||||
python script/manifest/validate.py
|
||||
|
||||
- run:
|
||||
name: run gen_requirements_all
|
||||
command: |
|
||||
@@ -100,27 +121,27 @@ jobs:
|
||||
pre-install-all-requirements:
|
||||
executor:
|
||||
name: python
|
||||
tag: 3.7-stretch
|
||||
tag: 3.5.5-stretch
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
- docker-prereqs
|
||||
- install-requirements:
|
||||
python: 3.7-stretch
|
||||
python: 3.5.5-stretch
|
||||
all: true
|
||||
test: true
|
||||
|
||||
pylint:
|
||||
executor:
|
||||
name: python
|
||||
tag: 3.7-stretch
|
||||
parallelism: 3
|
||||
tag: 3.5.5-stretch
|
||||
parallelism: 2
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
- docker-prereqs
|
||||
- install-requirements:
|
||||
python: 3.7-stretch
|
||||
python: 3.5.5-stretch
|
||||
all: true
|
||||
test: true
|
||||
- install
|
||||
@@ -154,7 +175,7 @@ jobs:
|
||||
executor:
|
||||
name: python
|
||||
tag: << parameters.python >>
|
||||
parallelism: 3
|
||||
parallelism: 2
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
@@ -165,14 +186,14 @@ jobs:
|
||||
- install
|
||||
|
||||
- run:
|
||||
name: run tests
|
||||
name: run tests with code coverage
|
||||
command: |
|
||||
. venv/bin/activate
|
||||
CC_SWITCH="--cov --cov-report="
|
||||
TESTFILES=$(circleci tests glob "tests/**/test_*.py" | circleci tests split --split-by=timings)
|
||||
if [ -z "$CODE_COVERAGE" ]; then CC_SWITCH=""; else CC_SWITCH="--cov --cov-report html:htmlcov"; fi
|
||||
pytest --timeout=9 --duration=10 --junitxml=test-reports/homeassistant/results.xml -qq -o junit_family=xunit2 -o junit_suite_name=homeassistant -o console_output_style=count -p no:sugar $CC_SWITCH -- ${TESTFILES}
|
||||
pytest --timeout=9 --durations=10 --junitxml=test-reports/homeassistant/results.xml -qq -o junit_family=xunit2 -o junit_suite_name=homeassistant -o console_output_style=count -p no:sugar $CC_SWITCH -- ${TESTFILES}
|
||||
script/check_dirty
|
||||
when: always
|
||||
codecov
|
||||
|
||||
- store_test_results:
|
||||
path: test-reports
|
||||
@@ -185,23 +206,48 @@ jobs:
|
||||
path: test-reports
|
||||
destination: test-reports
|
||||
|
||||
# This job use machine executor, e.g. classic CircleCI VM because we need both lokalise-cli and a Python runtime.
|
||||
# Classic CircleCI included python 2.7.12 and python 3.5.2 managed by pyenv, the Python version may need change if
|
||||
# CircleCI changed its VM in future.
|
||||
upload-translations:
|
||||
machine: true
|
||||
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- run:
|
||||
name: upload english translations
|
||||
command: |
|
||||
pyenv versions
|
||||
pyenv global 3.5.2
|
||||
docker pull lokalise/lokalise-cli@sha256:2198814ebddfda56ee041a4b427521757dd57f75415ea9693696a64c550cef21
|
||||
script/translations_upload
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
build:
|
||||
jobs:
|
||||
- static-check
|
||||
- pre-install-all-requirements
|
||||
- pre-install-all-requirements:
|
||||
requires:
|
||||
- static-check
|
||||
- pylint:
|
||||
requires:
|
||||
- pre-install-all-requirements
|
||||
- pre-test:
|
||||
name: pre-test 3.5.5
|
||||
requires:
|
||||
- static-check
|
||||
python: 3.5.5-stretch
|
||||
- pre-test:
|
||||
name: pre-test 3.6
|
||||
requires:
|
||||
- static-check
|
||||
python: 3.6-stretch
|
||||
- pre-test:
|
||||
name: pre-test 3.7
|
||||
requires:
|
||||
- static-check
|
||||
python: 3.7-stretch
|
||||
- test:
|
||||
name: test 3.5.5
|
||||
@@ -222,3 +268,9 @@ workflows:
|
||||
# - test:
|
||||
# name: test 3.8
|
||||
# python: 3.8-rc-stretch
|
||||
- upload-translations:
|
||||
requires:
|
||||
- static-check
|
||||
filters:
|
||||
branches:
|
||||
only: dev
|
||||
|
15
.codecov.yml
Normal file
15
.codecov.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
codecov:
|
||||
branch: dev
|
||||
coverage:
|
||||
status:
|
||||
project:
|
||||
default:
|
||||
target: 90
|
||||
threshold: 0.09
|
||||
notify:
|
||||
# Notify codecov room in Discord. The webhook URL (encrypted below) ends in /slack which is why we configure a Slack notification.
|
||||
slack:
|
||||
default:
|
||||
url: "secret:TgWDUM4Jw0w7wMJxuxNF/yhSOHglIo1fGwInJnRLEVPy2P2aLimkoK1mtKCowH5TFw+baUXVXT3eAqefbdvIuM8BjRR4aRji95C6CYyD0QHy4N8i7nn1SQkWDPpS8IthYTg07rUDF7s5guurkKv2RrgoCdnnqjAMSzHoExMOF7xUmblMdhBTWJgBpWEhASJy85w/xxjlsE1xoTkzeJu9Q67pTXtRcn+5kb5/vIzPSYg="
|
||||
comment:
|
||||
require_changes: yes
|
18
.coveragerc
18
.coveragerc
@@ -21,6 +21,7 @@ omit =
|
||||
homeassistant/components/alarmdecoder/*
|
||||
homeassistant/components/alarmdotcom/alarm_control_panel.py
|
||||
homeassistant/components/alpha_vantage/sensor.py
|
||||
homeassistant/components/amazon_polly/tts.py
|
||||
homeassistant/components/ambient_station/*
|
||||
homeassistant/components/amcrest/*
|
||||
homeassistant/components/ampio/*
|
||||
@@ -46,9 +47,7 @@ omit =
|
||||
homeassistant/components/august/*
|
||||
homeassistant/components/automatic/device_tracker.py
|
||||
homeassistant/components/avion/light.py
|
||||
homeassistant/components/aws_lambda/notify.py
|
||||
homeassistant/components/aws_sns/notify.py
|
||||
homeassistant/components/aws_sqs/notify.py
|
||||
homeassistant/components/baidu/tts.py
|
||||
homeassistant/components/bbb_gpio/*
|
||||
homeassistant/components/bbox/device_tracker.py
|
||||
homeassistant/components/bbox/sensor.py
|
||||
@@ -85,6 +84,7 @@ omit =
|
||||
homeassistant/components/channels/media_player.py
|
||||
homeassistant/components/cisco_ios/device_tracker.py
|
||||
homeassistant/components/cisco_mobility_express/device_tracker.py
|
||||
homeassistant/components/cisco_webex_teams/notify.py
|
||||
homeassistant/components/ciscospark/notify.py
|
||||
homeassistant/components/citybikes/sensor.py
|
||||
homeassistant/components/clementine/media_player.py
|
||||
@@ -93,6 +93,7 @@ omit =
|
||||
homeassistant/components/clicksend_tts/notify.py
|
||||
homeassistant/components/cloudflare/*
|
||||
homeassistant/components/cmus/media_player.py
|
||||
homeassistant/components/co2signal/*
|
||||
homeassistant/components/coinbase/*
|
||||
homeassistant/components/comed_hourly_pricing/sensor.py
|
||||
homeassistant/components/comfoconnect/*
|
||||
@@ -342,6 +343,7 @@ omit =
|
||||
homeassistant/components/meteo_france/*
|
||||
homeassistant/components/metoffice/sensor.py
|
||||
homeassistant/components/metoffice/weather.py
|
||||
homeassistant/components/microsoft/tts.py
|
||||
homeassistant/components/miflora/sensor.py
|
||||
homeassistant/components/mikrotik/device_tracker.py
|
||||
homeassistant/components/mill/climate.py
|
||||
@@ -364,6 +366,7 @@ omit =
|
||||
homeassistant/components/mystrom/binary_sensor.py
|
||||
homeassistant/components/mystrom/light.py
|
||||
homeassistant/components/mystrom/switch.py
|
||||
homeassistant/components/n26/*
|
||||
homeassistant/components/nad/media_player.py
|
||||
homeassistant/components/nadtcp/media_player.py
|
||||
homeassistant/components/nanoleaf/light.py
|
||||
@@ -395,6 +398,7 @@ omit =
|
||||
homeassistant/components/nzbget/sensor.py
|
||||
homeassistant/components/octoprint/*
|
||||
homeassistant/components/oem/climate.py
|
||||
homeassistant/components/oasa_telematics/sensor.py
|
||||
homeassistant/components/ohmconnect/sensor.py
|
||||
homeassistant/components/onewire/sensor.py
|
||||
homeassistant/components/onkyo/media_player.py
|
||||
@@ -423,6 +427,7 @@ omit =
|
||||
homeassistant/components/pencom/switch.py
|
||||
homeassistant/components/philips_js/media_player.py
|
||||
homeassistant/components/pi_hole/sensor.py
|
||||
homeassistant/components/picotts/tts.py
|
||||
homeassistant/components/piglow/light.py
|
||||
homeassistant/components/pilight/*
|
||||
homeassistant/components/ping/binary_sensor.py
|
||||
@@ -607,10 +612,6 @@ omit =
|
||||
homeassistant/components/trafikverket_weatherstation/sensor.py
|
||||
homeassistant/components/transmission/*
|
||||
homeassistant/components/travisci/sensor.py
|
||||
homeassistant/components/tts/amazon_polly.py
|
||||
homeassistant/components/tts/baidu.py
|
||||
homeassistant/components/tts/microsoft.py
|
||||
homeassistant/components/tts/picotts.py
|
||||
homeassistant/components/tuya/*
|
||||
homeassistant/components/twilio_call/notify.py
|
||||
homeassistant/components/twilio_sms/notify.py
|
||||
@@ -652,6 +653,7 @@ omit =
|
||||
homeassistant/components/wirelesstag/*
|
||||
homeassistant/components/worldtidesinfo/sensor.py
|
||||
homeassistant/components/worxlandroid/sensor.py
|
||||
homeassistant/components/wunderlist/*
|
||||
homeassistant/components/x10/light.py
|
||||
homeassistant/components/xbox_live/sensor.py
|
||||
homeassistant/components/xeoma/camera.py
|
||||
@@ -665,7 +667,7 @@ omit =
|
||||
homeassistant/components/yale_smart_alarm/alarm_control_panel.py
|
||||
homeassistant/components/yamaha/media_player.py
|
||||
homeassistant/components/yamaha_musiccast/media_player.py
|
||||
homeassistant/components/yeelight/light.py
|
||||
homeassistant/components/yeelight/*
|
||||
homeassistant/components/yeelightsunflower/light.py
|
||||
homeassistant/components/yi/camera.py
|
||||
homeassistant/components/zabbix/*
|
||||
|
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
7
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -23,7 +23,8 @@ If user exposed functionality or configuration variables are added/changed:
|
||||
- [ ] Documentation added/updated in [home-assistant.io](https://github.com/home-assistant/home-assistant.io)
|
||||
|
||||
If the code communicates with devices, web services, or third-party tools:
|
||||
- [ ] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).
|
||||
- [ ] [_The manifest file_][manifest-docs] has all fields filled out correctly ([example][ex-manifest]).
|
||||
- [ ] New dependencies have been added to `requirements` in the manifest ([example][ex-requir]).
|
||||
- [ ] New dependencies are only imported inside functions that use them ([example][ex-import]).
|
||||
- [ ] New or updated dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.
|
||||
- [ ] New files were added to `.coveragerc`.
|
||||
@@ -31,5 +32,7 @@ If the code communicates with devices, web services, or third-party tools:
|
||||
If the code does not interact with devices:
|
||||
- [ ] Tests have been added to verify that the new code works.
|
||||
|
||||
[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard/__init__.py#L14
|
||||
[ex-manifest]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/mobile_app/manifest.json
|
||||
[ex-requir]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/mobile_app/manifest.json#L5
|
||||
[ex-import]: https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard/__init__.py#L23
|
||||
[manifest-docs]: https://developers.home-assistant.io/docs/en/development_checklist.html#_the-manifest-file_
|
||||
|
14
.github/main.workflow
vendored
Normal file
14
.github/main.workflow
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
workflow "Mention CODEOWNERS of integrations when integration label is added to an issue" {
|
||||
on = "issues"
|
||||
resolves = "codeowners-mention"
|
||||
}
|
||||
|
||||
workflow "Mention CODEOWNERS of integrations when integration label is added to an PRs" {
|
||||
on = "pull_request"
|
||||
resolves = "codeowners-mention"
|
||||
}
|
||||
|
||||
action "codeowners-mention" {
|
||||
uses = "home-assistant/codeowners-mention@master"
|
||||
secrets = ["GITHUB_TOKEN"]
|
||||
}
|
55
.travis.yml
55
.travis.yml
@@ -1,55 +0,0 @@
|
||||
sudo: false
|
||||
dist: xenial
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: "ppa:jonathonf/ffmpeg-4"
|
||||
packages:
|
||||
- libudev-dev
|
||||
- libavformat-dev
|
||||
- libavcodec-dev
|
||||
- libavdevice-dev
|
||||
- libavutil-dev
|
||||
- libswscale-dev
|
||||
- libswresample-dev
|
||||
- libavfilter-dev
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- python: "3.5.3"
|
||||
env: TOXENV=lint
|
||||
- python: "3.5.3"
|
||||
env: TOXENV=pylint
|
||||
- python: "3.5.3"
|
||||
env: TOXENV=typing
|
||||
- python: "3.5.3"
|
||||
env: TOXENV=cov
|
||||
after_success: coveralls
|
||||
- python: "3.6"
|
||||
env: TOXENV=py36
|
||||
- python: "3.7"
|
||||
env: TOXENV=py37
|
||||
- python: "3.8-dev"
|
||||
env: TOXENV=py38
|
||||
if: branch = dev AND type = push
|
||||
allow_failures:
|
||||
- python: "3.8-dev"
|
||||
env: TOXENV=py38
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache/pip
|
||||
install: pip install -U tox coveralls
|
||||
language: python
|
||||
script: travis_wait 40 tox --develop
|
||||
services:
|
||||
- docker
|
||||
before_deploy:
|
||||
- docker pull lokalise/lokalise-cli@sha256:2198814ebddfda56ee041a4b427521757dd57f75415ea9693696a64c550cef21
|
||||
deploy:
|
||||
skip_cleanup: true
|
||||
provider: script
|
||||
script: script/travis_deploy
|
||||
on:
|
||||
branch: dev
|
||||
condition: $TOXENV = lint
|
360
CODEOWNERS
360
CODEOWNERS
@@ -1,3 +1,4 @@
|
||||
# This file is generated by script/manifest/codeowners.py
|
||||
# People marked here will be automatically requested for a review
|
||||
# when the code that they own is touched.
|
||||
# https://github.com/blog/2392-introducing-code-owners
|
||||
@@ -7,286 +8,249 @@ setup.py @home-assistant/core
|
||||
homeassistant/*.py @home-assistant/core
|
||||
homeassistant/helpers/* @home-assistant/core
|
||||
homeassistant/util/* @home-assistant/core
|
||||
homeassistant/components/api/* @home-assistant/core
|
||||
homeassistant/components/auth/* @home-assistant/core
|
||||
homeassistant/components/automation/* @home-assistant/core
|
||||
homeassistant/components/cloud/* @home-assistant/core
|
||||
homeassistant/components/config/* @home-assistant/core
|
||||
homeassistant/components/configurator/* @home-assistant/core
|
||||
homeassistant/components/conversation/* @home-assistant/core
|
||||
homeassistant/components/frontend/* @home-assistant/core
|
||||
homeassistant/components/group/* @home-assistant/core
|
||||
homeassistant/components/history/* @home-assistant/core
|
||||
homeassistant/components/http/* @home-assistant/core
|
||||
homeassistant/components/input_*/* @home-assistant/core
|
||||
homeassistant/components/introduction/* @home-assistant/core
|
||||
homeassistant/components/logger/* @home-assistant/core
|
||||
homeassistant/components/lovelace/* @home-assistant/core
|
||||
homeassistant/components/mqtt/* @home-assistant/core
|
||||
homeassistant/components/panel_custom/* @home-assistant/core
|
||||
homeassistant/components/panel_iframe/* @home-assistant/core
|
||||
homeassistant/components/onboarding/* @home-assistant/core
|
||||
homeassistant/components/persistent_notification/* @home-assistant/core
|
||||
homeassistant/components/scene/__init__.py @home-assistant/core
|
||||
homeassistant/components/scene/homeassistant.py @home-assistant/core
|
||||
homeassistant/components/script/* @home-assistant/core
|
||||
homeassistant/components/shell_command/* @home-assistant/core
|
||||
homeassistant/components/sun/* @home-assistant/core
|
||||
homeassistant/components/updater/* @home-assistant/core
|
||||
homeassistant/components/weblink/* @home-assistant/core
|
||||
homeassistant/components/websocket_api/* @home-assistant/core
|
||||
homeassistant/components/zone/* @home-assistant/core
|
||||
|
||||
# Home Assistant Developer Teams
|
||||
# Virtualization
|
||||
Dockerfile @home-assistant/docker
|
||||
virtualization/Docker/* @home-assistant/docker
|
||||
|
||||
homeassistant/components/zwave/* @home-assistant/z-wave
|
||||
homeassistant/components/*/zwave.py @home-assistant/z-wave
|
||||
# Other code
|
||||
homeassistant/scripts/check_config.py @kellerza
|
||||
|
||||
homeassistant/components/hassio/* @home-assistant/hassio
|
||||
|
||||
# Individual platforms
|
||||
homeassistant/components/notify/aws_lambda.py @robbiet480
|
||||
homeassistant/components/notify/aws_sns.py @robbiet480
|
||||
homeassistant/components/notify/aws_sqs.py @robbiet480
|
||||
homeassistant/components/notify/file.py @fabaff
|
||||
homeassistant/components/notify/flock.py @fabaff
|
||||
homeassistant/components/notify/gntp.py @robbiet480
|
||||
homeassistant/components/notify/html5.py @robbiet480
|
||||
homeassistant/components/notify/mastodon.py @fabaff
|
||||
homeassistant/components/notify/smtp.py @fabaff
|
||||
homeassistant/components/notify/syslog.py @fabaff
|
||||
homeassistant/components/notify/twilio_call.py @robbiet480
|
||||
homeassistant/components/notify/twilio_sms.py @robbiet480
|
||||
homeassistant/components/notify/xmpp.py @fabaff
|
||||
homeassistant/components/notify/yessssms.py @flowolf
|
||||
homeassistant/components/tts/amazon_polly.py @robbiet480
|
||||
|
||||
# A
|
||||
homeassistant/components/airvisual/sensor.py @bachya
|
||||
homeassistant/components/alarm_control_panel/manual_mqtt.py @colinodell
|
||||
homeassistant/components/alpha_vantage/sensor.py @fabaff
|
||||
# Integrations
|
||||
homeassistant/components/airvisual/* @bachya
|
||||
homeassistant/components/alarm_control_panel/* @colinodell
|
||||
homeassistant/components/alpha_vantage/* @fabaff
|
||||
homeassistant/components/amazon_polly/* @robbiet480
|
||||
homeassistant/components/ambient_station/* @bachya
|
||||
homeassistant/components/api/* @home-assistant/core
|
||||
homeassistant/components/arduino/* @fabaff
|
||||
homeassistant/components/arest/* @fabaff
|
||||
homeassistant/components/asuswrt/device_tracker.py @kennedyshead
|
||||
homeassistant/components/automatic/device_tracker.py @armills
|
||||
homeassistant/components/asuswrt/* @kennedyshead
|
||||
homeassistant/components/auth/* @home-assistant/core
|
||||
homeassistant/components/automatic/* @armills
|
||||
homeassistant/components/automation/* @home-assistant/core
|
||||
homeassistant/components/aws/* @awarecan @robbiet480
|
||||
homeassistant/components/axis/* @kane610
|
||||
|
||||
# B
|
||||
homeassistant/components/bitcoin/sensor.py @fabaff
|
||||
homeassistant/components/bitcoin/* @fabaff
|
||||
homeassistant/components/blink/* @fronzbot
|
||||
homeassistant/components/bmw_connected_drive/* @ChristianKuehnel
|
||||
homeassistant/components/braviatv/media_player.py @robbiet480
|
||||
homeassistant/components/braviatv/* @robbiet480
|
||||
homeassistant/components/broadlink/* @danielhiversen
|
||||
homeassistant/components/brunt/cover.py @eavanvalkenburg
|
||||
homeassistant/components/bt_smarthub/device_tracker.py @jxwolstenholme
|
||||
|
||||
# C
|
||||
homeassistant/components/brunt/* @eavanvalkenburg
|
||||
homeassistant/components/bt_smarthub/* @jxwolstenholme
|
||||
homeassistant/components/cisco_ios/* @fbradyirl
|
||||
homeassistant/components/cisco_mobility_express/* @fbradyirl
|
||||
homeassistant/components/cisco_webex_teams/* @fbradyirl
|
||||
homeassistant/components/ciscospark/* @fbradyirl
|
||||
homeassistant/components/cloud/* @home-assistant/core
|
||||
homeassistant/components/cloudflare/* @ludeeus
|
||||
homeassistant/components/coolmaster/climate.py @OnFreund
|
||||
homeassistant/components/config/* @home-assistant/core
|
||||
homeassistant/components/configurator/* @home-assistant/core
|
||||
homeassistant/components/conversation/* @home-assistant/core
|
||||
homeassistant/components/coolmaster/* @OnFreund
|
||||
homeassistant/components/counter/* @fabaff
|
||||
homeassistant/components/cover/group.py @cdce8p
|
||||
homeassistant/components/cpuspeed/sensor.py @fabaff
|
||||
homeassistant/components/cups/sensor.py @fabaff
|
||||
|
||||
# D
|
||||
homeassistant/components/cover/* @home-assistant/core
|
||||
homeassistant/components/cpuspeed/* @fabaff
|
||||
homeassistant/components/cups/* @fabaff
|
||||
homeassistant/components/daikin/* @fredrike @rofrantz
|
||||
homeassistant/components/darksky/* @fabaff
|
||||
homeassistant/components/discogs/sensor.py @thibmaek
|
||||
homeassistant/components/deconz/* @kane610
|
||||
homeassistant/components/demo/weather.py @fabaff
|
||||
homeassistant/components/demo/* @home-assistant/core
|
||||
homeassistant/components/digital_ocean/* @fabaff
|
||||
homeassistant/components/discogs/* @thibmaek
|
||||
homeassistant/components/doorbird/* @oblogic7
|
||||
homeassistant/components/dweet/* @fabaff
|
||||
|
||||
# E
|
||||
homeassistant/components/ecovacs/* @OverloadUT
|
||||
homeassistant/components/edp_redy/* @abmantis
|
||||
homeassistant/components/eight_sleep/* @mezz64
|
||||
homeassistant/components/egardia/* @jeroenterheerdt
|
||||
homeassistant/components/emby/media_player.py @mezz64
|
||||
homeassistant/components/ephember/climate.py @ttroy50
|
||||
homeassistant/components/eq3btsmart/climate.py @rytilahti
|
||||
homeassistant/components/eight_sleep/* @mezz64
|
||||
homeassistant/components/emby/* @mezz64
|
||||
homeassistant/components/enigma2/* @fbradyirl
|
||||
homeassistant/components/ephember/* @ttroy50
|
||||
homeassistant/components/eq3btsmart/* @rytilahti
|
||||
homeassistant/components/esphome/* @OttoWinter
|
||||
|
||||
# F
|
||||
homeassistant/components/file/sensor.py @fabaff
|
||||
homeassistant/components/filter/sensor.py @dgomes
|
||||
homeassistant/components/fitbit/sensor.py @robbiet480
|
||||
homeassistant/components/fixer/sensor.py @fabaff
|
||||
homeassistant/components/flunearyou/sensor.py @bachya
|
||||
homeassistant/components/file/* @fabaff
|
||||
homeassistant/components/filter/* @dgomes
|
||||
homeassistant/components/fitbit/* @robbiet480
|
||||
homeassistant/components/fixer/* @fabaff
|
||||
homeassistant/components/flock/* @fabaff
|
||||
homeassistant/components/flunearyou/* @bachya
|
||||
homeassistant/components/foursquare/* @robbiet480
|
||||
homeassistant/components/freebox/* @snoof85
|
||||
|
||||
# G
|
||||
homeassistant/components/gearbest/sensor.py @HerrHofrat
|
||||
homeassistant/components/gitter/sensor.py @fabaff
|
||||
homeassistant/components/glances/sensor.py @fabaff
|
||||
homeassistant/components/google_travel_time/sensor.py @robbiet480
|
||||
homeassistant/components/frontend/* @home-assistant/core
|
||||
homeassistant/components/gearbest/* @HerrHofrat
|
||||
homeassistant/components/gitter/* @fabaff
|
||||
homeassistant/components/glances/* @fabaff
|
||||
homeassistant/components/gntp/* @robbiet480
|
||||
homeassistant/components/google_travel_time/* @robbiet480
|
||||
homeassistant/components/googlehome/* @ludeeus
|
||||
homeassistant/components/gpsd/sensor.py @fabaff
|
||||
homeassistant/components/gtfs/sensor.py @robbiet480
|
||||
|
||||
# H
|
||||
homeassistant/components/gpsd/* @fabaff
|
||||
homeassistant/components/group/* @home-assistant/core
|
||||
homeassistant/components/gtfs/* @robbiet480
|
||||
homeassistant/components/harmony/* @ehendrix23
|
||||
homeassistant/components/hassio/* @home-assistant/hass-io
|
||||
homeassistant/components/heos/* @andrewsayre
|
||||
homeassistant/components/hikvision/binary_sensor.py @mezz64
|
||||
homeassistant/components/hikvision/* @mezz64
|
||||
homeassistant/components/hikvisioncam/* @fbradyirl
|
||||
homeassistant/components/history/* @home-assistant/core
|
||||
homeassistant/components/history_graph/* @andrey-git
|
||||
homeassistant/components/hive/* @Rendili @KJonline
|
||||
homeassistant/components/homeassistant/* @home-assistant/core
|
||||
homeassistant/components/homekit/* @cdce8p
|
||||
homeassistant/components/html5/* @robbiet480
|
||||
homeassistant/components/http/* @home-assistant/core
|
||||
homeassistant/components/huawei_lte/* @scop
|
||||
homeassistant/components/huawei_router/device_tracker.py @abmantis
|
||||
|
||||
# I
|
||||
homeassistant/components/huawei_router/* @abmantis
|
||||
homeassistant/components/hue/* @balloob
|
||||
homeassistant/components/influxdb/* @fabaff
|
||||
homeassistant/components/integration/sensor.py @dgomes
|
||||
homeassistant/components/input_boolean/* @home-assistant/core
|
||||
homeassistant/components/input_datetime/* @home-assistant/core
|
||||
homeassistant/components/input_number/* @home-assistant/core
|
||||
homeassistant/components/input_select/* @home-assistant/core
|
||||
homeassistant/components/input_text/* @home-assistant/core
|
||||
homeassistant/components/integration/* @dgomes
|
||||
homeassistant/components/introduction/* @home-assistant/core
|
||||
homeassistant/components/ios/* @robbiet480
|
||||
homeassistant/components/ipma/* @dgomes
|
||||
homeassistant/components/irish_rail_transport/sensor.py @ttroy50
|
||||
|
||||
# J
|
||||
homeassistant/components/jewish_calendar/sensor.py @tsvi
|
||||
|
||||
# K
|
||||
homeassistant/components/irish_rail_transport/* @ttroy50
|
||||
homeassistant/components/jewish_calendar/* @tsvi
|
||||
homeassistant/components/knx/* @Julius2342
|
||||
homeassistant/components/kodi/media_player.py @armills
|
||||
homeassistant/components/kodi/* @armills
|
||||
homeassistant/components/konnected/* @heythisisnate
|
||||
|
||||
# L
|
||||
homeassistant/components/lametric/notify.py @robbiet480
|
||||
homeassistant/components/launch_library/sensor.py @ludeeus
|
||||
homeassistant/components/lametric/* @robbiet480
|
||||
homeassistant/components/launch_library/* @ludeeus
|
||||
homeassistant/components/lifx/* @amelchio
|
||||
homeassistant/components/lifx_cloud/scene.py @amelchio
|
||||
homeassistant/components/lifx_legacy/light.py @amelchio
|
||||
homeassistant/components/linux_battery/sensor.py @fabaff
|
||||
homeassistant/components/liveboxplaytv/media_player.py @pschmitt
|
||||
homeassistant/components/lifx_cloud/* @amelchio
|
||||
homeassistant/components/lifx_legacy/* @amelchio
|
||||
homeassistant/components/linux_battery/* @fabaff
|
||||
homeassistant/components/liveboxplaytv/* @pschmitt
|
||||
homeassistant/components/logger/* @home-assistant/core
|
||||
homeassistant/components/lovelace/* @home-assistant/core
|
||||
homeassistant/components/luci/* @fbradyirl
|
||||
homeassistant/components/luftdaten/* @fabaff
|
||||
|
||||
# M
|
||||
homeassistant/components/mastodon/* @fabaff
|
||||
homeassistant/components/matrix/* @tinloaf
|
||||
homeassistant/components/mediaroom/media_player.py @dgomes
|
||||
homeassistant/components/mediaroom/* @dgomes
|
||||
homeassistant/components/melissa/* @kennedyshead
|
||||
homeassistant/components/met/weather.py @danielhiversen
|
||||
homeassistant/components/miflora/sensor.py @danielhiversen @ChristianKuehnel
|
||||
homeassistant/components/mill/climate.py @danielhiversen
|
||||
homeassistant/components/min_max/sensor.py @fabaff
|
||||
homeassistant/components/met/* @danielhiversen
|
||||
homeassistant/components/miflora/* @danielhiversen @ChristianKuehnel
|
||||
homeassistant/components/mill/* @danielhiversen
|
||||
homeassistant/components/min_max/* @fabaff
|
||||
homeassistant/components/mobile_app/* @robbiet480
|
||||
homeassistant/components/monoprice/media_player.py @etsinko
|
||||
homeassistant/components/moon/sensor.py @fabaff
|
||||
homeassistant/components/mpd/media_player.py @fabaff
|
||||
homeassistant/components/monoprice/* @etsinko
|
||||
homeassistant/components/moon/* @fabaff
|
||||
homeassistant/components/mpd/* @fabaff
|
||||
homeassistant/components/mqtt/* @home-assistant/core
|
||||
homeassistant/components/mystrom/* @fabaff
|
||||
|
||||
# N
|
||||
homeassistant/components/nello/lock.py @pschmitt
|
||||
homeassistant/components/nello/* @pschmitt
|
||||
homeassistant/components/ness_alarm/* @nickw444
|
||||
homeassistant/components/netdata/sensor.py @fabaff
|
||||
homeassistant/components/nest/* @awarecan
|
||||
homeassistant/components/netdata/* @fabaff
|
||||
homeassistant/components/nissan_leaf/* @filcole
|
||||
homeassistant/components/nmbs/sensor.py @thibmaek
|
||||
homeassistant/components/nmbs/* @thibmaek
|
||||
homeassistant/components/no_ip/* @fabaff
|
||||
homeassistant/components/nuki/lock.py @pschmitt
|
||||
homeassistant/components/nsw_fuel_station/sensor.py @nickw444
|
||||
|
||||
# O
|
||||
homeassistant/components/ohmconnect/sensor.py @robbiet480
|
||||
homeassistant/components/notify/* @flowolf
|
||||
homeassistant/components/nsw_fuel_station/* @nickw444
|
||||
homeassistant/components/nuki/* @pschmitt
|
||||
homeassistant/components/ohmconnect/* @robbiet480
|
||||
homeassistant/components/onboarding/* @home-assistant/core
|
||||
homeassistant/components/openuv/* @bachya
|
||||
homeassistant/components/openweathermap/weather.py @fabaff
|
||||
homeassistant/components/openweathermap/* @fabaff
|
||||
homeassistant/components/owlet/* @oblogic7
|
||||
|
||||
# P
|
||||
homeassistant/components/pi_hole/sensor.py @fabaff
|
||||
homeassistant/components/panel_custom/* @home-assistant/core
|
||||
homeassistant/components/panel_iframe/* @home-assistant/core
|
||||
homeassistant/components/persistent_notification/* @home-assistant/core
|
||||
homeassistant/components/pi_hole/* @fabaff
|
||||
homeassistant/components/plant/* @ChristianKuehnel
|
||||
homeassistant/components/point/* @fredrike
|
||||
homeassistant/components/pollen/sensor.py @bachya
|
||||
homeassistant/components/push/camera.py @dgomes
|
||||
homeassistant/components/pvoutput/sensor.py @fabaff
|
||||
|
||||
# Q
|
||||
homeassistant/components/qnap/sensor.py @colinodell
|
||||
homeassistant/components/quantum_gateway/device_tracker.py @cisasteelersfan
|
||||
homeassistant/components/pollen/* @bachya
|
||||
homeassistant/components/push/* @dgomes
|
||||
homeassistant/components/pvoutput/* @fabaff
|
||||
homeassistant/components/qnap/* @colinodell
|
||||
homeassistant/components/quantum_gateway/* @cisasteelersfan
|
||||
homeassistant/components/qwikswitch/* @kellerza
|
||||
|
||||
# R
|
||||
homeassistant/components/raincloud/* @vanstinator
|
||||
homeassistant/components/rainmachine/* @bachya
|
||||
homeassistant/components/random/* @fabaff
|
||||
homeassistant/components/rfxtrx/* @danielhiversen
|
||||
homeassistant/components/rmvtransport/* @cgtobi
|
||||
homeassistant/components/roomba/vacuum.py @pschmitt
|
||||
homeassistant/components/ruter/sensor.py @ludeeus
|
||||
|
||||
# S
|
||||
homeassistant/components/scrape/sensor.py @fabaff
|
||||
homeassistant/components/sensibo/climate.py @andrey-git
|
||||
homeassistant/components/serial/sensor.py @fabaff
|
||||
homeassistant/components/seventeentrack/sensor.py @bachya
|
||||
homeassistant/components/roomba/* @pschmitt
|
||||
homeassistant/components/ruter/* @ludeeus
|
||||
homeassistant/components/scene/* @home-assistant/core
|
||||
homeassistant/components/scrape/* @fabaff
|
||||
homeassistant/components/script/* @home-assistant/core
|
||||
homeassistant/components/sensibo/* @andrey-git
|
||||
homeassistant/components/serial/* @fabaff
|
||||
homeassistant/components/seventeentrack/* @bachya
|
||||
homeassistant/components/shell_command/* @home-assistant/core
|
||||
homeassistant/components/shiftr/* @fabaff
|
||||
homeassistant/components/shodan/sensor.py @fabaff
|
||||
homeassistant/components/shodan/* @fabaff
|
||||
homeassistant/components/simplisafe/* @bachya
|
||||
homeassistant/components/sma/sensor.py @kellerza
|
||||
homeassistant/components/sma/* @kellerza
|
||||
homeassistant/components/smartthings/* @andrewsayre
|
||||
homeassistant/components/smtp/* @fabaff
|
||||
homeassistant/components/sonos/* @amelchio
|
||||
homeassistant/components/spaceapi/* @fabaff
|
||||
homeassistant/components/spider/* @peternijssen
|
||||
homeassistant/components/sql/sensor.py @dgomes
|
||||
homeassistant/components/statistics/sensor.py @fabaff
|
||||
homeassistant/components/swiss_*/* @fabaff
|
||||
homeassistant/components/switchbot/switch.py @danielhiversen
|
||||
homeassistant/components/switchmate/switch.py @danielhiversen
|
||||
homeassistant/components/synology_srm/device_tracker.py @aerialls
|
||||
homeassistant/components/sytadin/sensor.py @gautric
|
||||
|
||||
# T
|
||||
homeassistant/components/sql/* @dgomes
|
||||
homeassistant/components/statistics/* @fabaff
|
||||
homeassistant/components/sun/* @home-assistant/core
|
||||
homeassistant/components/swiss_hydrological_data/* @fabaff
|
||||
homeassistant/components/swiss_public_transport/* @fabaff
|
||||
homeassistant/components/switchbot/* @danielhiversen
|
||||
homeassistant/components/switchmate/* @danielhiversen
|
||||
homeassistant/components/synology_srm/* @aerialls
|
||||
homeassistant/components/syslog/* @fabaff
|
||||
homeassistant/components/sytadin/* @gautric
|
||||
homeassistant/components/tahoma/* @philklei
|
||||
homeassistant/components/tautulli/sensor.py @ludeeus
|
||||
homeassistant/components/tautulli/* @ludeeus
|
||||
homeassistant/components/tellduslive/* @fredrike
|
||||
homeassistant/components/template/cover.py @PhracturedBlue
|
||||
homeassistant/components/template/* @PhracturedBlue
|
||||
homeassistant/components/tesla/* @zabuldon
|
||||
homeassistant/components/tfiac/* @fredrike @mellado
|
||||
homeassistant/components/thethingsnetwork/* @fabaff
|
||||
homeassistant/components/threshold/binary_sensor.py @fabaff
|
||||
homeassistant/components/threshold/* @fabaff
|
||||
homeassistant/components/tibber/* @danielhiversen
|
||||
homeassistant/components/tile/device_tracker.py @bachya
|
||||
homeassistant/components/time_date/sensor.py @fabaff
|
||||
homeassistant/components/tile/* @bachya
|
||||
homeassistant/components/time_date/* @fabaff
|
||||
homeassistant/components/toon/* @frenck
|
||||
homeassistant/components/tplink/* @rytilahti
|
||||
homeassistant/components/traccar/device_tracker.py @ludeeus
|
||||
homeassistant/components/traccar/* @ludeeus
|
||||
homeassistant/components/tradfri/* @ggravlingen
|
||||
|
||||
# U
|
||||
homeassistant/components/uber/sensor.py @robbiet480
|
||||
homeassistant/components/tts/* @robbiet480
|
||||
homeassistant/components/twilio_call/* @robbiet480
|
||||
homeassistant/components/twilio_sms/* @robbiet480
|
||||
homeassistant/components/uber/* @robbiet480
|
||||
homeassistant/components/unifi/* @kane610
|
||||
homeassistant/components/upcloud/* @scop
|
||||
homeassistant/components/updater/* @home-assistant/core
|
||||
homeassistant/components/upnp/* @robbiet480
|
||||
homeassistant/components/uptimerobot/binary_sensor.py @ludeeus
|
||||
homeassistant/components/uptimerobot/* @ludeeus
|
||||
homeassistant/components/utility_meter/* @dgomes
|
||||
|
||||
# V
|
||||
homeassistant/components/velux/* @Julius2342
|
||||
homeassistant/components/version/sensor.py @fabaff
|
||||
|
||||
# W
|
||||
homeassistant/components/waqi/sensor.py @andrey-git
|
||||
homeassistant/components/weather/__init__.py @fabaff
|
||||
homeassistant/components/version/* @fabaff
|
||||
homeassistant/components/waqi/* @andrey-git
|
||||
homeassistant/components/weather/* @fabaff
|
||||
homeassistant/components/weblink/* @home-assistant/core
|
||||
homeassistant/components/websocket_api/* @home-assistant/core
|
||||
homeassistant/components/wemo/* @sqldiablo
|
||||
homeassistant/components/worldclock/sensor.py @fabaff
|
||||
|
||||
# X
|
||||
homeassistant/components/xfinity/device_tracker.py @cisasteelersfan
|
||||
homeassistant/components/worldclock/* @fabaff
|
||||
homeassistant/components/xfinity/* @cisasteelersfan
|
||||
homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi
|
||||
homeassistant/components/xiaomi_miio/* @rytilahti @syssi
|
||||
homeassistant/components/xiaomi_tv/media_player.py @fattdev
|
||||
|
||||
# Y
|
||||
homeassistant/components/xiaomi_tv/* @fattdev
|
||||
homeassistant/components/xmpp/* @fabaff
|
||||
homeassistant/components/yamaha_musiccast/* @jalmeroth
|
||||
homeassistant/components/yeelight/* @rytilahti @zewelor
|
||||
homeassistant/components/yeelightsunflower/light.py @lindsaymarkward
|
||||
homeassistant/components/yi/camera.py @bachya
|
||||
|
||||
# Z
|
||||
homeassistant/components/yeelightsunflower/* @lindsaymarkward
|
||||
homeassistant/components/yessssms/* @flowolf
|
||||
homeassistant/components/yi/* @bachya
|
||||
homeassistant/components/zeroconf/* @robbiet480
|
||||
homeassistant/components/zha/* @dmulcahey @adminiuga
|
||||
homeassistant/components/zone/* @home-assistant/core
|
||||
homeassistant/components/zoneminder/* @rohankapoorcom
|
||||
homeassistant/components/zwave/* @home-assistant/z-wave
|
||||
|
||||
# Other code
|
||||
homeassistant/scripts/check_config.py @kellerza
|
||||
# Individual files
|
||||
homeassistant/components/group/cover @cdce8p
|
||||
homeassistant/components/demo/weather @fabaff
|
||||
|
@@ -1,4 +1,4 @@
|
||||
Home Assistant |Build Status| |Coverage Status| |Chat Status|
|
||||
Home Assistant |Build Status| |CI Status| |Coverage Status| |Chat Status|
|
||||
=================================================================================
|
||||
|
||||
Home Assistant is a home automation platform running on Python 3. It is able to track and control all devices at home and offer a platform for automating control.
|
||||
@@ -27,8 +27,10 @@ components <https://developers.home-assistant.io/docs/en/creating_component_inde
|
||||
If you run into issues while using Home Assistant or during development
|
||||
of a component, check the `Home Assistant help section <https://home-assistant.io/help/>`__ of our website for further help and information.
|
||||
|
||||
.. |Build Status| image:: https://travis-ci.org/home-assistant/home-assistant.svg?branch=master
|
||||
.. |Build Status| image:: https://travis-ci.org/home-assistant/home-assistant.svg?branch=dev
|
||||
:target: https://travis-ci.org/home-assistant/home-assistant
|
||||
.. |CI Status| image:: https://circleci.com/gh/home-assistant/home-assistant.svg?style=shield
|
||||
:target: https://circleci.com/gh/home-assistant/home-assistant
|
||||
.. |Coverage Status| image:: https://img.shields.io/coveralls/home-assistant/home-assistant.svg
|
||||
:target: https://coveralls.io/r/home-assistant/home-assistant?branch=master
|
||||
.. |Chat Status| image:: https://img.shields.io/discord/330944238910963714.svg
|
||||
|
10
homeassistant/components/abode/manifest.json
Normal file
10
homeassistant/components/abode/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "abode",
|
||||
"name": "Abode",
|
||||
"documentation": "https://www.home-assistant.io/components/abode",
|
||||
"requirements": [
|
||||
"abodepy==0.15.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/acer_projector/manifest.json
Normal file
10
homeassistant/components/acer_projector/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "acer_projector",
|
||||
"name": "Acer projector",
|
||||
"documentation": "https://www.home-assistant.io/components/acer_projector",
|
||||
"requirements": [
|
||||
"pyserial==3.1.1"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Use serial protocol of Acer projector to obtain state of the projector.
|
||||
|
||||
For more details about this component, please refer to the documentation
|
||||
at https://home-assistant.io/components/switch.acer_projector/
|
||||
"""
|
||||
"""Use serial protocol of Acer projector to obtain state of the projector."""
|
||||
import logging
|
||||
import re
|
||||
|
||||
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Actiontec MI424WR (Verizon FIOS) routers.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/device_tracker.actiontec/
|
||||
"""
|
||||
"""Support for Actiontec MI424WR (Verizon FIOS) routers."""
|
||||
import logging
|
||||
import re
|
||||
import telnetlib
|
||||
|
8
homeassistant/components/actiontec/manifest.json
Normal file
8
homeassistant/components/actiontec/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "actiontec",
|
||||
"name": "Actiontec",
|
||||
"documentation": "https://www.home-assistant.io/components/actiontec",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -4,12 +4,15 @@ import struct
|
||||
import logging
|
||||
import ctypes
|
||||
from collections import namedtuple
|
||||
import asyncio
|
||||
import async_timeout
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import (
|
||||
CONF_DEVICE, CONF_IP_ADDRESS, CONF_PORT, EVENT_HOMEASSISTANT_STOP)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
REQUIREMENTS = ['pyads==3.0.7']
|
||||
|
||||
@@ -31,6 +34,9 @@ CONF_ADS_VALUE = 'value'
|
||||
CONF_ADS_VAR = 'adsvar'
|
||||
CONF_ADS_VAR_BRIGHTNESS = 'adsvar_brightness'
|
||||
|
||||
STATE_KEY_STATE = 'state'
|
||||
STATE_KEY_BRIGHTNESS = 'brightness'
|
||||
|
||||
DOMAIN = 'ads'
|
||||
|
||||
SERVICE_WRITE_DATA_BY_NAME = 'write_data_by_name'
|
||||
@@ -154,28 +160,41 @@ class AdsHub:
|
||||
|
||||
def write_by_name(self, name, value, plc_datatype):
|
||||
"""Write a value to the device."""
|
||||
import pyads
|
||||
with self._lock:
|
||||
return self._client.write_by_name(name, value, plc_datatype)
|
||||
try:
|
||||
return self._client.write_by_name(name, value, plc_datatype)
|
||||
except pyads.ADSError as err:
|
||||
_LOGGER.error("Error writing %s: %s", name, err)
|
||||
|
||||
def read_by_name(self, name, plc_datatype):
|
||||
"""Read a value from the device."""
|
||||
import pyads
|
||||
with self._lock:
|
||||
return self._client.read_by_name(name, plc_datatype)
|
||||
try:
|
||||
return self._client.read_by_name(name, plc_datatype)
|
||||
except pyads.ADSError as err:
|
||||
_LOGGER.error("Error reading %s: %s", name, err)
|
||||
|
||||
def add_device_notification(self, name, plc_datatype, callback):
|
||||
"""Add a notification to the ADS devices."""
|
||||
from pyads import NotificationAttrib
|
||||
attr = NotificationAttrib(ctypes.sizeof(plc_datatype))
|
||||
import pyads
|
||||
attr = pyads.NotificationAttrib(ctypes.sizeof(plc_datatype))
|
||||
|
||||
with self._lock:
|
||||
hnotify, huser = self._client.add_device_notification(
|
||||
name, attr, self._device_notification_callback)
|
||||
hnotify = int(hnotify)
|
||||
self._notification_items[hnotify] = NotificationItem(
|
||||
hnotify, huser, name, plc_datatype, callback)
|
||||
try:
|
||||
hnotify, huser = self._client.add_device_notification(
|
||||
name, attr, self._device_notification_callback)
|
||||
except pyads.ADSError as err:
|
||||
_LOGGER.error("Error subscribing to %s: %s", name, err)
|
||||
else:
|
||||
hnotify = int(hnotify)
|
||||
self._notification_items[hnotify] = NotificationItem(
|
||||
hnotify, huser, name, plc_datatype, callback)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Added device notification %d for variable %s", hnotify, name)
|
||||
_LOGGER.debug(
|
||||
"Added device notification %d for variable %s",
|
||||
hnotify, name)
|
||||
|
||||
def _device_notification_callback(self, notification, name):
|
||||
"""Handle device notifications."""
|
||||
@@ -210,3 +229,68 @@ class AdsHub:
|
||||
_LOGGER.warning("No callback available for this datatype")
|
||||
|
||||
notification_item.callback(notification_item.name, value)
|
||||
|
||||
|
||||
class AdsEntity(Entity):
|
||||
"""Representation of ADS entity."""
|
||||
|
||||
def __init__(self, ads_hub, name, ads_var):
|
||||
"""Initialize ADS binary sensor."""
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self._state_dict = {}
|
||||
self._state_dict[STATE_KEY_STATE] = None
|
||||
self._ads_hub = ads_hub
|
||||
self._ads_var = ads_var
|
||||
self._event = None
|
||||
|
||||
async def async_initialize_device(
|
||||
self, ads_var, plctype, state_key=STATE_KEY_STATE, factor=None):
|
||||
"""Register device notification."""
|
||||
def update(name, value):
|
||||
"""Handle device notifications."""
|
||||
_LOGGER.debug('Variable %s changed its value to %d', name, value)
|
||||
|
||||
if factor is None:
|
||||
self._state_dict[state_key] = value
|
||||
else:
|
||||
self._state_dict[state_key] = value / factor
|
||||
|
||||
asyncio.run_coroutine_threadsafe(async_event_set(), self.hass.loop)
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
async def async_event_set():
|
||||
"""Set event in async context."""
|
||||
self._event.set()
|
||||
|
||||
self._event = asyncio.Event()
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
ads_var, plctype, update)
|
||||
try:
|
||||
with async_timeout.timeout(10):
|
||||
await self._event.wait()
|
||||
except asyncio.TimeoutError:
|
||||
_LOGGER.debug('Variable %s: Timeout during first update',
|
||||
ads_var)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the default name of the binary sensor."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state to HA."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
"""Return False if state has not been updated yet."""
|
||||
return self._state_dict[STATE_KEY_STATE] is not None
|
||||
|
@@ -1,7 +1,5 @@
|
||||
"""Support for ADS binary sensors."""
|
||||
import logging
|
||||
import asyncio
|
||||
import async_timeout
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
@@ -10,7 +8,7 @@ from homeassistant.components.binary_sensor import (
|
||||
from homeassistant.const import CONF_DEVICE_CLASS, CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import CONF_ADS_VAR, DATA_ADS
|
||||
from . import CONF_ADS_VAR, DATA_ADS, AdsEntity, STATE_KEY_STATE
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -36,70 +34,25 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
add_entities([ads_sensor])
|
||||
|
||||
|
||||
class AdsBinarySensor(BinarySensorDevice):
|
||||
class AdsBinarySensor(AdsEntity, BinarySensorDevice):
|
||||
"""Representation of ADS binary sensors."""
|
||||
|
||||
def __init__(self, ads_hub, name, ads_var, device_class):
|
||||
"""Initialize ADS binary sensor."""
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self._state = None
|
||||
super().__init__(ads_hub, name, ads_var)
|
||||
self._device_class = device_class or 'moving'
|
||||
self._ads_hub = ads_hub
|
||||
self.ads_var = ads_var
|
||||
self._event = None
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register device notification."""
|
||||
def update(name, value):
|
||||
"""Handle device notifications."""
|
||||
_LOGGER.debug('Variable %s changed its value to %d', name, value)
|
||||
self._state = value
|
||||
asyncio.run_coroutine_threadsafe(async_event_set(), self.hass.loop)
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
async def async_event_set():
|
||||
"""Set event in async context."""
|
||||
self._event.set()
|
||||
|
||||
self._event = asyncio.Event()
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
self.ads_var, self._ads_hub.PLCTYPE_BOOL, update)
|
||||
try:
|
||||
with async_timeout.timeout(10):
|
||||
await self._event.wait()
|
||||
except asyncio.TimeoutError:
|
||||
_LOGGER.debug('Variable %s: Timeout during first update',
|
||||
self.ads_var)
|
||||
await self.async_initialize_device(self._ads_var,
|
||||
self._ads_hub.PLCTYPE_BOOL)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the default name of the binary sensor."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
def is_on(self):
|
||||
"""Return True if the entity is on."""
|
||||
return self._state_dict[STATE_KEY_STATE]
|
||||
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the device class."""
|
||||
return self._device_class
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return if the binary sensor is on."""
|
||||
return self._state
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state to HA."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
"""Return False if state has not been updated yet."""
|
||||
return self._state is not None
|
||||
|
@@ -1,7 +1,5 @@
|
||||
"""Support for ADS light sources."""
|
||||
import logging
|
||||
import asyncio
|
||||
import async_timeout
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
@@ -10,12 +8,12 @@ from homeassistant.components.light import (
|
||||
from homeassistant.const import CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from . import CONF_ADS_VAR, CONF_ADS_VAR_BRIGHTNESS, DATA_ADS
|
||||
from . import CONF_ADS_VAR, CONF_ADS_VAR_BRIGHTNESS, DATA_ADS, \
|
||||
AdsEntity, STATE_KEY_BRIGHTNESS, STATE_KEY_STATE
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
DEPENDENCIES = ['ads']
|
||||
DEFAULT_NAME = 'ADS Light'
|
||||
CONF_ADSVAR_BRIGHTNESS = 'adsvar_brightness'
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Required(CONF_ADS_VAR): cv.string,
|
||||
vol.Optional(CONF_ADS_VAR_BRIGHTNESS): cv.string,
|
||||
@@ -35,107 +33,54 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
name)])
|
||||
|
||||
|
||||
class AdsLight(Light):
|
||||
class AdsLight(AdsEntity, Light):
|
||||
"""Representation of ADS light."""
|
||||
|
||||
def __init__(self, ads_hub, ads_var_enable, ads_var_brightness, name):
|
||||
"""Initialize AdsLight entity."""
|
||||
self._ads_hub = ads_hub
|
||||
self._on_state = None
|
||||
self._brightness = None
|
||||
self._name = name
|
||||
self._unique_id = ads_var_enable
|
||||
self.ads_var_enable = ads_var_enable
|
||||
self.ads_var_brightness = ads_var_brightness
|
||||
self._event = None
|
||||
super().__init__(ads_hub, name, ads_var_enable)
|
||||
self._state_dict[STATE_KEY_BRIGHTNESS] = None
|
||||
self._ads_var_brightness = ads_var_brightness
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register device notification."""
|
||||
def update_on_state(name, value):
|
||||
"""Handle device notifications for state."""
|
||||
_LOGGER.debug('Variable %s changed its value to %d', name, value)
|
||||
self._on_state = value
|
||||
asyncio.run_coroutine_threadsafe(async_event_set(), self.hass.loop)
|
||||
self.schedule_update_ha_state()
|
||||
await self.async_initialize_device(self._ads_var,
|
||||
self._ads_hub.PLCTYPE_BOOL)
|
||||
|
||||
async def async_event_set():
|
||||
"""Set event in async context."""
|
||||
self._event.set()
|
||||
|
||||
def update_brightness(name, value):
|
||||
"""Handle device notification for brightness."""
|
||||
_LOGGER.debug('Variable %s changed its value to %d', name, value)
|
||||
self._brightness = value
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
self._event = asyncio.Event()
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
self.ads_var_enable, self._ads_hub.PLCTYPE_BOOL, update_on_state
|
||||
)
|
||||
if self.ads_var_brightness is not None:
|
||||
await self.hass.async_add_executor_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
self.ads_var_brightness, self._ads_hub.PLCTYPE_INT,
|
||||
update_brightness
|
||||
)
|
||||
try:
|
||||
with async_timeout.timeout(10):
|
||||
await self._event.wait()
|
||||
except asyncio.TimeoutError:
|
||||
_LOGGER.debug('Variable %s: Timeout during first update',
|
||||
self.ads_var_enable)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the device if any."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
if self._ads_var_brightness is not None:
|
||||
await self.async_initialize_device(self._ads_var_brightness,
|
||||
self._ads_hub.PLCTYPE_UINT,
|
||||
STATE_KEY_BRIGHTNESS)
|
||||
|
||||
@property
|
||||
def brightness(self):
|
||||
"""Return the brightness of the light (0..255)."""
|
||||
return self._brightness
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return if light is on."""
|
||||
return self._on_state
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state to HA."""
|
||||
return False
|
||||
return self._state_dict[STATE_KEY_BRIGHTNESS]
|
||||
|
||||
@property
|
||||
def supported_features(self):
|
||||
"""Flag supported features."""
|
||||
support = 0
|
||||
if self.ads_var_brightness is not None:
|
||||
if self._ads_var_brightness is not None:
|
||||
support = SUPPORT_BRIGHTNESS
|
||||
return support
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
"""Return False if state has not been updated yet."""
|
||||
return self._on_state is not None
|
||||
def is_on(self):
|
||||
"""Return True if the entity is on."""
|
||||
return self._state_dict[STATE_KEY_STATE]
|
||||
|
||||
def turn_on(self, **kwargs):
|
||||
"""Turn the light on or set a specific dimmer value."""
|
||||
brightness = kwargs.get(ATTR_BRIGHTNESS)
|
||||
self._ads_hub.write_by_name(self.ads_var_enable, True,
|
||||
self._ads_hub.write_by_name(self._ads_var, True,
|
||||
self._ads_hub.PLCTYPE_BOOL)
|
||||
|
||||
if self.ads_var_brightness is not None and brightness is not None:
|
||||
self._ads_hub.write_by_name(self.ads_var_brightness, brightness,
|
||||
if self._ads_var_brightness is not None and brightness is not None:
|
||||
self._ads_hub.write_by_name(self._ads_var_brightness, brightness,
|
||||
self._ads_hub.PLCTYPE_UINT)
|
||||
|
||||
def turn_off(self, **kwargs):
|
||||
"""Turn the light off."""
|
||||
self._ads_hub.write_by_name(self.ads_var_enable, False,
|
||||
self._ads_hub.write_by_name(self._ads_var, False,
|
||||
self._ads_hub.PLCTYPE_BOOL)
|
||||
|
10
homeassistant/components/ads/manifest.json
Normal file
10
homeassistant/components/ads/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "ads",
|
||||
"name": "Ads",
|
||||
"documentation": "https://www.home-assistant.io/components/ads",
|
||||
"requirements": [
|
||||
"pyads==3.0.7"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -7,9 +7,9 @@ from homeassistant.components import ads
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
from . import CONF_ADS_FACTOR, CONF_ADS_TYPE, CONF_ADS_VAR
|
||||
from . import CONF_ADS_FACTOR, CONF_ADS_TYPE, CONF_ADS_VAR, \
|
||||
AdsEntity, STATE_KEY_STATE
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -43,60 +43,31 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
add_entities([entity])
|
||||
|
||||
|
||||
class AdsSensor(Entity):
|
||||
class AdsSensor(AdsEntity):
|
||||
"""Representation of an ADS sensor entity."""
|
||||
|
||||
def __init__(self, ads_hub, ads_var, ads_type, name, unit_of_measurement,
|
||||
factor):
|
||||
"""Initialize AdsSensor entity."""
|
||||
self._ads_hub = ads_hub
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self._value = None
|
||||
super().__init__(ads_hub, name, ads_var)
|
||||
self._unit_of_measurement = unit_of_measurement
|
||||
self.ads_var = ads_var
|
||||
self.ads_type = ads_type
|
||||
self.factor = factor
|
||||
self._ads_type = ads_type
|
||||
self._factor = factor
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register device notification."""
|
||||
def update(name, value):
|
||||
"""Handle device notifications."""
|
||||
_LOGGER.debug("Variable %s changed its value to %d", name, value)
|
||||
|
||||
# If factor is set use it otherwise not
|
||||
if self.factor is None:
|
||||
self._value = value
|
||||
else:
|
||||
self._value = value / self.factor
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
self.hass.async_add_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
self.ads_var, self._ads_hub.ADS_TYPEMAP[self.ads_type], update
|
||||
)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the entity."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
await self.async_initialize_device(
|
||||
self._ads_var,
|
||||
self._ads_hub.ADS_TYPEMAP[self._ads_type],
|
||||
STATE_KEY_STATE,
|
||||
self._factor)
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the device."""
|
||||
return self._value
|
||||
return self._state_dict[STATE_KEY_STATE]
|
||||
|
||||
@property
|
||||
def unit_of_measurement(self):
|
||||
"""Return the unit of measurement."""
|
||||
return self._unit_of_measurement
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state."""
|
||||
return False
|
||||
|
@@ -1,16 +1,13 @@
|
||||
"""Support for ADS switch platform."""
|
||||
import logging
|
||||
import asyncio
|
||||
import async_timeout
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.switch import PLATFORM_SCHEMA
|
||||
from homeassistant.components.switch import SwitchDevice, PLATFORM_SCHEMA
|
||||
from homeassistant.const import CONF_NAME
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import ToggleEntity
|
||||
|
||||
from . import CONF_ADS_VAR, DATA_ADS
|
||||
from . import CONF_ADS_VAR, DATA_ADS, AdsEntity, STATE_KEY_STATE
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -34,74 +31,25 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
add_entities([AdsSwitch(ads_hub, name, ads_var)])
|
||||
|
||||
|
||||
class AdsSwitch(ToggleEntity):
|
||||
class AdsSwitch(AdsEntity, SwitchDevice):
|
||||
"""Representation of an ADS switch device."""
|
||||
|
||||
def __init__(self, ads_hub, name, ads_var):
|
||||
"""Initialize the AdsSwitch entity."""
|
||||
self._ads_hub = ads_hub
|
||||
self._on_state = None
|
||||
self._name = name
|
||||
self._unique_id = ads_var
|
||||
self.ads_var = ads_var
|
||||
self._event = None
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Register device notification."""
|
||||
def update(name, value):
|
||||
"""Handle device notification."""
|
||||
_LOGGER.debug("Variable %s changed its value to %d", name, value)
|
||||
self._on_state = value
|
||||
asyncio.run_coroutine_threadsafe(async_event_set(), self.hass.loop)
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
async def async_event_set():
|
||||
"""Set event in async context."""
|
||||
self._event.set()
|
||||
|
||||
self._event = asyncio.Event()
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
self._ads_hub.add_device_notification,
|
||||
self.ads_var, self._ads_hub.PLCTYPE_BOOL, update)
|
||||
try:
|
||||
with async_timeout.timeout(10):
|
||||
await self._event.wait()
|
||||
except asyncio.TimeoutError:
|
||||
_LOGGER.debug('Variable %s: Timeout during first update',
|
||||
self.ads_var)
|
||||
await self.async_initialize_device(self._ads_var,
|
||||
self._ads_hub.PLCTYPE_BOOL)
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return if the switch is turned on."""
|
||||
return self._on_state
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the entity."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def unique_id(self):
|
||||
"""Return an unique identifier for this entity."""
|
||||
return self._unique_id
|
||||
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""Return False because entity pushes its state to HA."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
"""Return False if state has not been updated yet."""
|
||||
return self._on_state is not None
|
||||
"""Return True if the entity is on."""
|
||||
return self._state_dict[STATE_KEY_STATE]
|
||||
|
||||
def turn_on(self, **kwargs):
|
||||
"""Turn the switch on."""
|
||||
self._ads_hub.write_by_name(
|
||||
self.ads_var, True, self._ads_hub.PLCTYPE_BOOL)
|
||||
self._ads_var, True, self._ads_hub.PLCTYPE_BOOL)
|
||||
|
||||
def turn_off(self, **kwargs):
|
||||
"""Turn the switch off."""
|
||||
self._ads_hub.write_by_name(
|
||||
self.ads_var, False, self._ads_hub.PLCTYPE_BOOL)
|
||||
self._ads_var, False, self._ads_hub.PLCTYPE_BOOL)
|
||||
|
10
homeassistant/components/aftership/manifest.json
Normal file
10
homeassistant/components/aftership/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aftership",
|
||||
"name": "Aftership",
|
||||
"documentation": "https://www.home-assistant.io/components/aftership",
|
||||
"requirements": [
|
||||
"pyaftership==0.1.2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for non-delivered packages recorded in AfterShip.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://www.home-assistant.io/components/sensor.aftership/
|
||||
"""
|
||||
"""Support for non-delivered packages recorded in AfterShip."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Component for handling Air Quality data for your location.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/air_quality/
|
||||
"""
|
||||
"""Component for handling Air Quality data for your location."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
|
8
homeassistant/components/air_quality/manifest.json
Normal file
8
homeassistant/components/air_quality/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "air_quality",
|
||||
"name": "Air quality",
|
||||
"documentation": "https://www.home-assistant.io/components/air_quality",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
12
homeassistant/components/airvisual/manifest.json
Normal file
12
homeassistant/components/airvisual/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "airvisual",
|
||||
"name": "Airvisual",
|
||||
"documentation": "https://www.home-assistant.io/components/airvisual",
|
||||
"requirements": [
|
||||
"pyairvisual==3.0.1"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@bachya"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for AirVisual air quality sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.airvisual/
|
||||
"""
|
||||
"""Support for AirVisual air quality sensors."""
|
||||
from logging import getLogger
|
||||
from datetime import timedelta
|
||||
|
||||
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Platform for the Aladdin Connect cover component.
|
||||
|
||||
For more details about this platform, please refer to the documentation
|
||||
https://home-assistant.io/components/cover.aladdin_connect/
|
||||
"""
|
||||
"""Platform for the Aladdin Connect cover component."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
10
homeassistant/components/aladdin_connect/manifest.json
Normal file
10
homeassistant/components/aladdin_connect/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aladdin_connect",
|
||||
"name": "Aladdin connect",
|
||||
"documentation": "https://www.home-assistant.io/components/aladdin_connect",
|
||||
"requirements": [
|
||||
"aladdin_connect==0.3"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Component to interface with an alarm control panel.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarm_control_panel/
|
||||
"""
|
||||
"""Component to interface with an alarm control panel."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
|
10
homeassistant/components/alarm_control_panel/manifest.json
Normal file
10
homeassistant/components/alarm_control_panel/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "alarm_control_panel",
|
||||
"name": "Alarm control panel",
|
||||
"documentation": "https://www.home-assistant.io/components/alarm_control_panel",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@colinodell"
|
||||
]
|
||||
}
|
10
homeassistant/components/alarmdecoder/manifest.json
Normal file
10
homeassistant/components/alarmdecoder/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "alarmdecoder",
|
||||
"name": "Alarmdecoder",
|
||||
"documentation": "https://www.home-assistant.io/components/alarmdecoder",
|
||||
"requirements": [
|
||||
"alarmdecoder==1.13.2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Interfaces with Alarm.com alarm control panels.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/alarm_control_panel.alarmdotcom/
|
||||
"""
|
||||
"""Interfaces with Alarm.com alarm control panels."""
|
||||
import logging
|
||||
import re
|
||||
|
||||
|
10
homeassistant/components/alarmdotcom/manifest.json
Normal file
10
homeassistant/components/alarmdotcom/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "alarmdotcom",
|
||||
"name": "Alarmdotcom",
|
||||
"documentation": "https://www.home-assistant.io/components/alarmdotcom",
|
||||
"requirements": [
|
||||
"pyalarmdotcom==0.3.2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
8
homeassistant/components/alert/manifest.json
Normal file
8
homeassistant/components/alert/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "alert",
|
||||
"name": "Alert",
|
||||
"documentation": "https://www.home-assistant.io/components/alert",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/alexa/manifest.json
Normal file
10
homeassistant/components/alexa/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "alexa",
|
||||
"name": "Alexa",
|
||||
"documentation": "https://www.home-assistant.io/components/alexa",
|
||||
"requirements": [],
|
||||
"dependencies": [
|
||||
"http"
|
||||
],
|
||||
"codeowners": []
|
||||
}
|
12
homeassistant/components/alpha_vantage/manifest.json
Normal file
12
homeassistant/components/alpha_vantage/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "alpha_vantage",
|
||||
"name": "Alpha vantage",
|
||||
"documentation": "https://www.home-assistant.io/components/alpha_vantage",
|
||||
"requirements": [
|
||||
"alpha_vantage==2.1.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@fabaff"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Stock market information from Alpha Vantage.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.alpha_vantage/
|
||||
"""
|
||||
"""Stock market information from Alpha Vantage."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
|
12
homeassistant/components/amazon_polly/manifest.json
Normal file
12
homeassistant/components/amazon_polly/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "amazon_polly",
|
||||
"name": "Amazon polly",
|
||||
"documentation": "https://www.home-assistant.io/components/amazon_polly",
|
||||
"requirements": [
|
||||
"boto3==1.9.16"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@robbiet480"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for the Amazon Polly text to speech service.
|
||||
|
||||
For more details about this component, please refer to the documentation at
|
||||
https://home-assistant.io/components/tts.amazon_polly/
|
||||
"""
|
||||
"""Support for the Amazon Polly text to speech service."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
@@ -20,7 +20,7 @@ from .const import (
|
||||
ATTR_LAST_DATA, CONF_APP_KEY, DATA_CLIENT, DOMAIN, TOPIC_UPDATE,
|
||||
TYPE_BINARY_SENSOR, TYPE_SENSOR)
|
||||
|
||||
REQUIREMENTS = ['aioambient==0.1.3']
|
||||
REQUIREMENTS = ['aioambient==0.3.0']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -417,9 +417,8 @@ class AmbientWeatherEntity(Entity):
|
||||
@property
|
||||
def available(self):
|
||||
"""Return True if entity is available."""
|
||||
return bool(
|
||||
self._ambient.stations[self._mac_address][ATTR_LAST_DATA].get(
|
||||
self._sensor_type))
|
||||
return self._ambient.stations[self._mac_address][ATTR_LAST_DATA].get(
|
||||
self._sensor_type) is not None
|
||||
|
||||
@property
|
||||
def device_info(self):
|
||||
|
12
homeassistant/components/ambient_station/manifest.json
Normal file
12
homeassistant/components/ambient_station/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "ambient_station",
|
||||
"name": "Ambient station",
|
||||
"documentation": "https://www.home-assistant.io/components/ambient_station",
|
||||
"requirements": [
|
||||
"aioambient==0.3.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@bachya"
|
||||
]
|
||||
}
|
@@ -12,7 +12,7 @@ from homeassistant.helpers import discovery
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
|
||||
REQUIREMENTS = ['amcrest==1.2.7']
|
||||
REQUIREMENTS = ['amcrest==1.3.0']
|
||||
DEPENDENCIES = ['ffmpeg']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -26,6 +26,7 @@ DEFAULT_NAME = 'Amcrest Camera'
|
||||
DEFAULT_PORT = 80
|
||||
DEFAULT_RESOLUTION = 'high'
|
||||
DEFAULT_STREAM_SOURCE = 'snapshot'
|
||||
DEFAULT_ARGUMENTS = '-pred 1'
|
||||
TIMEOUT = 10
|
||||
|
||||
DATA_AMCREST = 'amcrest'
|
||||
@@ -77,7 +78,8 @@ CONFIG_SCHEMA = vol.Schema({
|
||||
vol.All(vol.In(RESOLUTION_LIST)),
|
||||
vol.Optional(CONF_STREAM_SOURCE, default=DEFAULT_STREAM_SOURCE):
|
||||
vol.All(vol.In(STREAM_SOURCE_LIST)),
|
||||
vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string,
|
||||
vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS):
|
||||
cv.string,
|
||||
vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL):
|
||||
cv.time_period,
|
||||
vol.Optional(CONF_SENSORS):
|
||||
|
@@ -3,7 +3,7 @@ import asyncio
|
||||
import logging
|
||||
|
||||
from homeassistant.components.camera import (
|
||||
Camera, SUPPORT_STREAM)
|
||||
Camera, SUPPORT_ON_OFF, SUPPORT_STREAM)
|
||||
from homeassistant.components.ffmpeg import DATA_FFMPEG
|
||||
from homeassistant.const import CONF_NAME
|
||||
from homeassistant.helpers.aiohttp_client import (
|
||||
@@ -39,18 +39,23 @@ class AmcrestCam(Camera):
|
||||
super(AmcrestCam, self).__init__()
|
||||
self._name = amcrest.name
|
||||
self._camera = amcrest.device
|
||||
self._base_url = self._camera.get_base_url()
|
||||
self._ffmpeg = hass.data[DATA_FFMPEG]
|
||||
self._ffmpeg_arguments = amcrest.ffmpeg_arguments
|
||||
self._stream_source = amcrest.stream_source
|
||||
self._resolution = amcrest.resolution
|
||||
self._token = self._auth = amcrest.authentication
|
||||
self._is_recording = False
|
||||
self._model = None
|
||||
self._snapshot_lock = asyncio.Lock()
|
||||
|
||||
async def async_camera_image(self):
|
||||
"""Return a still image response from the camera."""
|
||||
from amcrest import AmcrestError
|
||||
|
||||
if not self.is_on:
|
||||
_LOGGER.error(
|
||||
'Attempt to take snaphot when %s camera is off', self.name)
|
||||
return None
|
||||
async with self._snapshot_lock:
|
||||
try:
|
||||
# Send the request to snap a picture and return raw jpg data
|
||||
@@ -59,7 +64,8 @@ class AmcrestCam(Camera):
|
||||
return response.data
|
||||
except AmcrestError as error:
|
||||
_LOGGER.error(
|
||||
'Could not get camera image due to error %s', error)
|
||||
'Could not get image from %s camera due to error: %s',
|
||||
self.name, error)
|
||||
return None
|
||||
|
||||
async def handle_async_mjpeg_stream(self, request):
|
||||
@@ -94,6 +100,8 @@ class AmcrestCam(Camera):
|
||||
finally:
|
||||
await stream.close()
|
||||
|
||||
# Entity property overrides
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of this camera."""
|
||||
@@ -102,9 +110,80 @@ class AmcrestCam(Camera):
|
||||
@property
|
||||
def supported_features(self):
|
||||
"""Return supported features."""
|
||||
return SUPPORT_STREAM
|
||||
return SUPPORT_ON_OFF | SUPPORT_STREAM
|
||||
|
||||
# Camera property overrides
|
||||
|
||||
@property
|
||||
def is_recording(self):
|
||||
"""Return true if the device is recording."""
|
||||
return self._is_recording
|
||||
|
||||
@property
|
||||
def brand(self):
|
||||
"""Return the camera brand."""
|
||||
return 'Amcrest'
|
||||
|
||||
@property
|
||||
def model(self):
|
||||
"""Return the camera model."""
|
||||
return self._model
|
||||
|
||||
@property
|
||||
def stream_source(self):
|
||||
"""Return the source of the stream."""
|
||||
return self._camera.rtsp_url(typeno=self._resolution)
|
||||
|
||||
@property
|
||||
def is_on(self):
|
||||
"""Return true if on."""
|
||||
return self.is_streaming
|
||||
|
||||
# Other Entity method overrides
|
||||
|
||||
def update(self):
|
||||
"""Update entity status."""
|
||||
from amcrest import AmcrestError
|
||||
|
||||
_LOGGER.debug('Pulling data from %s camera', self.name)
|
||||
if self._model is None:
|
||||
try:
|
||||
self._model = self._camera.device_type.split('=')[-1].strip()
|
||||
except AmcrestError as error:
|
||||
_LOGGER.error(
|
||||
'Could not get %s camera model due to error: %s',
|
||||
self.name, error)
|
||||
self._model = ''
|
||||
try:
|
||||
self.is_streaming = self._camera.video_enabled
|
||||
self._is_recording = self._camera.record_mode == 'Manual'
|
||||
except AmcrestError as error:
|
||||
_LOGGER.error(
|
||||
'Could not get %s camera attributes due to error: %s',
|
||||
self.name, error)
|
||||
|
||||
# Other Camera method overrides
|
||||
|
||||
def turn_off(self):
|
||||
"""Turn off camera."""
|
||||
self._enable_video_stream(False)
|
||||
|
||||
def turn_on(self):
|
||||
"""Turn on camera."""
|
||||
self._enable_video_stream(True)
|
||||
|
||||
# Utility methods
|
||||
|
||||
def _enable_video_stream(self, enable):
|
||||
"""Enable or disable camera video stream."""
|
||||
from amcrest import AmcrestError
|
||||
|
||||
try:
|
||||
self._camera.video_enabled = enable
|
||||
except AmcrestError as error:
|
||||
_LOGGER.error(
|
||||
'Could not %s %s camera video stream due to error: %s',
|
||||
'enable' if enable else 'disable', self.name, error)
|
||||
else:
|
||||
self.is_streaming = enable
|
||||
self.schedule_update_ha_state()
|
||||
|
12
homeassistant/components/amcrest/manifest.json
Normal file
12
homeassistant/components/amcrest/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "amcrest",
|
||||
"name": "Amcrest",
|
||||
"documentation": "https://www.home-assistant.io/components/amcrest",
|
||||
"requirements": [
|
||||
"amcrest==1.3.0"
|
||||
],
|
||||
"dependencies": [
|
||||
"ffmpeg"
|
||||
],
|
||||
"codeowners": []
|
||||
}
|
@@ -75,19 +75,6 @@ class AmcrestSensor(Entity):
|
||||
"""Get the latest data and updates the state."""
|
||||
_LOGGER.debug("Pulling data from %s sensor.", self._name)
|
||||
|
||||
try:
|
||||
version, build_date = self._camera.software_information
|
||||
self._attrs['Build Date'] = build_date.split('=')[-1]
|
||||
self._attrs['Version'] = version.split('=')[-1]
|
||||
except ValueError:
|
||||
self._attrs['Build Date'] = 'Not Available'
|
||||
self._attrs['Version'] = 'Not Available'
|
||||
|
||||
try:
|
||||
self._attrs['Serial Number'] = self._camera.serial_number
|
||||
except ValueError:
|
||||
self._attrs['Serial Number'] = 'Not Available'
|
||||
|
||||
if self._sensor_type == 'motion_detector':
|
||||
self._state = self._camera.is_motion_detected
|
||||
self._attrs['Record Mode'] = self._camera.record_mode
|
||||
|
10
homeassistant/components/ampio/manifest.json
Normal file
10
homeassistant/components/ampio/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "ampio",
|
||||
"name": "Ampio",
|
||||
"documentation": "https://www.home-assistant.io/components/ampio",
|
||||
"requirements": [
|
||||
"asmog==0.0.6"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/android_ip_webcam/manifest.json
Normal file
10
homeassistant/components/android_ip_webcam/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "android_ip_webcam",
|
||||
"name": "Android ip webcam",
|
||||
"documentation": "https://www.home-assistant.io/components/android_ip_webcam",
|
||||
"requirements": [
|
||||
"pydroid-ipcam==0.8"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,6 +1 @@
|
||||
"""
|
||||
Support for functionality to interact with Android TV and Fire TV devices.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/media_player.androidtv/
|
||||
"""
|
||||
"""Support for functionality to interact with Android TV/Fire TV devices."""
|
||||
|
10
homeassistant/components/androidtv/manifest.json
Normal file
10
homeassistant/components/androidtv/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "androidtv",
|
||||
"name": "Androidtv",
|
||||
"documentation": "https://www.home-assistant.io/components/androidtv",
|
||||
"requirements": [
|
||||
"androidtv==0.0.15"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for functionality to interact with Android TV and Fire TV devices.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/media_player.androidtv/
|
||||
"""
|
||||
"""Support for functionality to interact with Android TV / Fire TV devices."""
|
||||
import functools
|
||||
import logging
|
||||
import voluptuous as vol
|
||||
@@ -23,7 +18,7 @@ import homeassistant.helpers.config_validation as cv
|
||||
|
||||
ANDROIDTV_DOMAIN = 'androidtv'
|
||||
|
||||
REQUIREMENTS = ['androidtv==0.0.14']
|
||||
REQUIREMENTS = ['androidtv==0.0.15']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -299,12 +294,12 @@ class ADBDevice(MediaPlayerDevice):
|
||||
@adb_decorator()
|
||||
def media_previous_track(self):
|
||||
"""Send previous track command (results in rewind)."""
|
||||
self.aftv.media_previous()
|
||||
self.aftv.media_previous_track()
|
||||
|
||||
@adb_decorator()
|
||||
def media_next_track(self):
|
||||
"""Send next track command (results in fast-forward)."""
|
||||
self.aftv.media_next()
|
||||
self.aftv.media_next_track()
|
||||
|
||||
@adb_decorator()
|
||||
def adb_command(self, cmd):
|
||||
@@ -329,11 +324,11 @@ class AndroidTVDevice(ADBDevice):
|
||||
turn_off_command)
|
||||
|
||||
self._device = None
|
||||
self._muted = None
|
||||
self._device_properties = self.aftv.device_properties
|
||||
self._is_volume_muted = None
|
||||
self._unique_id = 'androidtv-{}-{}'.format(
|
||||
name, self._device_properties['serialno'])
|
||||
self._volume = None
|
||||
self._volume_level = None
|
||||
|
||||
@adb_decorator(override_available=True)
|
||||
def update(self):
|
||||
@@ -350,16 +345,16 @@ class AndroidTVDevice(ADBDevice):
|
||||
if not self._available:
|
||||
return
|
||||
|
||||
# Get the `state`, `current_app`, and `running_apps`.
|
||||
state, self._current_app, self._device, self._muted, self._volume = \
|
||||
self.aftv.update()
|
||||
# Get the updated state and attributes.
|
||||
state, self._current_app, self._device, self._is_volume_muted, \
|
||||
self._volume_level = self.aftv.update()
|
||||
|
||||
self._state = ANDROIDTV_STATES[state]
|
||||
|
||||
@property
|
||||
def is_volume_muted(self):
|
||||
"""Boolean if volume is currently muted."""
|
||||
return self._muted
|
||||
return self._is_volume_muted
|
||||
|
||||
@property
|
||||
def source(self):
|
||||
@@ -379,7 +374,7 @@ class AndroidTVDevice(ADBDevice):
|
||||
@property
|
||||
def volume_level(self):
|
||||
"""Return the volume level."""
|
||||
return self._volume
|
||||
return self._volume_level
|
||||
|
||||
@adb_decorator()
|
||||
def media_stop(self):
|
||||
@@ -394,12 +389,12 @@ class AndroidTVDevice(ADBDevice):
|
||||
@adb_decorator()
|
||||
def volume_down(self):
|
||||
"""Send volume down command."""
|
||||
self.aftv.volume_down()
|
||||
self._volume_level = self.aftv.volume_down(self._volume_level)
|
||||
|
||||
@adb_decorator()
|
||||
def volume_up(self):
|
||||
"""Send volume up command."""
|
||||
self.aftv.volume_up()
|
||||
self._volume_level = self.aftv.volume_up(self._volume_level)
|
||||
|
||||
|
||||
class FireTVDevice(ADBDevice):
|
||||
|
10
homeassistant/components/anel_pwrctrl/manifest.json
Normal file
10
homeassistant/components/anel_pwrctrl/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "anel_pwrctrl",
|
||||
"name": "Anel pwrctrl",
|
||||
"documentation": "https://www.home-assistant.io/components/anel_pwrctrl",
|
||||
"requirements": [
|
||||
"anel_pwrctrl-homeassistant==0.0.1.dev2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ANEL PwrCtrl switches.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.pwrctrl/
|
||||
"""
|
||||
"""Support for ANEL PwrCtrl switches."""
|
||||
import logging
|
||||
import socket
|
||||
from datetime import timedelta
|
||||
|
10
homeassistant/components/anthemav/manifest.json
Normal file
10
homeassistant/components/anthemav/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "anthemav",
|
||||
"name": "Anthemav",
|
||||
"documentation": "https://www.home-assistant.io/components/anthemav",
|
||||
"requirements": [
|
||||
"anthemav==1.1.10"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Anthem Network Receivers and Processors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/media_player.anthemav/
|
||||
"""
|
||||
"""Support for Anthem Network Receivers and Processors."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
10
homeassistant/components/apcupsd/manifest.json
Normal file
10
homeassistant/components/apcupsd/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "apcupsd",
|
||||
"name": "Apcupsd",
|
||||
"documentation": "https://www.home-assistant.io/components/apcupsd",
|
||||
"requirements": [
|
||||
"apcaccess==0.0.13"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
12
homeassistant/components/api/manifest.json
Normal file
12
homeassistant/components/api/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "api",
|
||||
"name": "Home Assistant API",
|
||||
"documentation": "https://www.home-assistant.io/components/api",
|
||||
"requirements": [],
|
||||
"dependencies": [
|
||||
"http"
|
||||
],
|
||||
"codeowners": [
|
||||
"@home-assistant/core"
|
||||
]
|
||||
}
|
@@ -1 +0,0 @@
|
||||
"""The api_streams component."""
|
10
homeassistant/components/apns/manifest.json
Normal file
10
homeassistant/components/apns/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "apns",
|
||||
"name": "Apns",
|
||||
"documentation": "https://www.home-assistant.io/components/apns",
|
||||
"requirements": [
|
||||
"apns2==0.3.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
APNS Notification platform.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/notify.apns/
|
||||
"""
|
||||
"""APNS Notification platform."""
|
||||
import logging
|
||||
import os
|
||||
|
||||
|
10
homeassistant/components/apple_tv/manifest.json
Normal file
10
homeassistant/components/apple_tv/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "apple_tv",
|
||||
"name": "Apple tv",
|
||||
"documentation": "https://www.home-assistant.io/components/apple_tv",
|
||||
"requirements": [
|
||||
"pyatv==0.3.12"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/aqualogic/manifest.json
Normal file
10
homeassistant/components/aqualogic/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aqualogic",
|
||||
"name": "Aqualogic",
|
||||
"documentation": "https://www.home-assistant.io/components/aqualogic",
|
||||
"requirements": [
|
||||
"aqualogic==1.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/aquostv/manifest.json
Normal file
10
homeassistant/components/aquostv/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aquostv",
|
||||
"name": "Aquostv",
|
||||
"documentation": "https://www.home-assistant.io/components/aquostv",
|
||||
"requirements": [
|
||||
"sharp_aquos_rc==0.3.2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for interface with an Aquos TV.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/media_player.aquostv/
|
||||
"""
|
||||
"""Support for interface with an Aquos TV."""
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
12
homeassistant/components/arduino/manifest.json
Normal file
12
homeassistant/components/arduino/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "arduino",
|
||||
"name": "Arduino",
|
||||
"documentation": "https://www.home-assistant.io/components/arduino",
|
||||
"requirements": [
|
||||
"PyMata==2.14"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@fabaff"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for an exposed aREST RESTful API of a device.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.arest/
|
||||
"""
|
||||
"""Support for an exposed aREST RESTful API of a device."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
|
10
homeassistant/components/arest/manifest.json
Normal file
10
homeassistant/components/arest/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "arest",
|
||||
"name": "Arest",
|
||||
"documentation": "https://www.home-assistant.io/components/arest",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@fabaff"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for an exposed aREST RESTful API of a device.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.arest/
|
||||
"""
|
||||
"""Support for an exposed aREST RESTful API of a device."""
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for an exposed aREST RESTful API of a device.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/switch.arest/
|
||||
"""
|
||||
"""Support for an exposed aREST RESTful API of a device."""
|
||||
|
||||
import logging
|
||||
|
||||
|
@@ -13,6 +13,8 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
|
||||
from . import DATA_ARLO, DEFAULT_BRAND, SIGNAL_UPDATE_ARLO
|
||||
|
||||
DEPENDENCIES = ['arlo', 'ffmpeg']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
ARLO_MODE_ARMED = 'armed'
|
||||
@@ -28,8 +30,7 @@ ATTR_UNSEEN_VIDEOS = 'unseen_videos'
|
||||
ATTR_LAST_REFRESH = 'last_refresh'
|
||||
|
||||
CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments'
|
||||
|
||||
DEPENDENCIES = ['arlo', 'ffmpeg']
|
||||
DEFAULT_ARGUMENTS = '-pred 1'
|
||||
|
||||
POWERSAVE_MODE_MAPPING = {
|
||||
1: 'best_battery_life',
|
||||
@@ -38,7 +39,7 @@ POWERSAVE_MODE_MAPPING = {
|
||||
}
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string,
|
||||
vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string,
|
||||
})
|
||||
|
||||
|
||||
|
10
homeassistant/components/arlo/manifest.json
Normal file
10
homeassistant/components/arlo/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "arlo",
|
||||
"name": "Arlo",
|
||||
"documentation": "https://www.home-assistant.io/components/arlo",
|
||||
"requirements": [
|
||||
"pyarlo==0.2.3"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Aruba Access Points.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/device_tracker.aruba/
|
||||
"""
|
||||
"""Support for Aruba Access Points."""
|
||||
import logging
|
||||
import re
|
||||
|
||||
|
10
homeassistant/components/aruba/manifest.json
Normal file
10
homeassistant/components/aruba/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aruba",
|
||||
"name": "Aruba",
|
||||
"documentation": "https://www.home-assistant.io/components/aruba",
|
||||
"requirements": [
|
||||
"pexpect==4.6.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
8
homeassistant/components/arwn/manifest.json
Normal file
8
homeassistant/components/arwn/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "arwn",
|
||||
"name": "Arwn",
|
||||
"documentation": "https://www.home-assistant.io/components/arwn",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for collecting data from the ARWN project.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.arwn/
|
||||
"""
|
||||
"""Support for collecting data from the ARWN project."""
|
||||
import json
|
||||
import logging
|
||||
|
||||
|
8
homeassistant/components/asterisk_cdr/manifest.json
Normal file
8
homeassistant/components/asterisk_cdr/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "asterisk_cdr",
|
||||
"name": "Asterisk cdr",
|
||||
"documentation": "https://www.home-assistant.io/components/asterisk_cdr",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/asterisk_mbox/manifest.json
Normal file
10
homeassistant/components/asterisk_mbox/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "asterisk_mbox",
|
||||
"name": "Asterisk mbox",
|
||||
"documentation": "https://www.home-assistant.io/components/asterisk_mbox",
|
||||
"requirements": [
|
||||
"asterisk_mbox==0.5.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for ASUSWRT routers.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/device_tracker.asuswrt/
|
||||
"""
|
||||
"""Support for ASUSWRT routers."""
|
||||
import logging
|
||||
|
||||
from homeassistant.components.device_tracker import DeviceScanner
|
||||
|
12
homeassistant/components/asuswrt/manifest.json
Normal file
12
homeassistant/components/asuswrt/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "asuswrt",
|
||||
"name": "Asuswrt",
|
||||
"documentation": "https://www.home-assistant.io/components/asuswrt",
|
||||
"requirements": [
|
||||
"aioasuswrt==1.1.21"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@kennedyshead"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Asuswrt status sensors.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.asuswrt/
|
||||
"""
|
||||
"""Asuswrt status sensors."""
|
||||
import logging
|
||||
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
10
homeassistant/components/august/manifest.json
Normal file
10
homeassistant/components/august/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "august",
|
||||
"name": "August",
|
||||
"documentation": "https://www.home-assistant.io/components/august",
|
||||
"requirements": [
|
||||
"py-august==0.7.0"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for aurora forecast data sensor.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/binary_sensor.aurora/
|
||||
"""
|
||||
"""Support for aurora forecast data sensor."""
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
|
8
homeassistant/components/aurora/manifest.json
Normal file
8
homeassistant/components/aurora/manifest.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"domain": "aurora",
|
||||
"name": "Aurora",
|
||||
"documentation": "https://www.home-assistant.io/components/aurora",
|
||||
"requirements": [],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
12
homeassistant/components/auth/manifest.json
Normal file
12
homeassistant/components/auth/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "auth",
|
||||
"name": "Auth",
|
||||
"documentation": "https://www.home-assistant.io/components/auth",
|
||||
"requirements": [],
|
||||
"dependencies": [
|
||||
"http"
|
||||
],
|
||||
"codeowners": [
|
||||
"@home-assistant/core"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for the Automatic platform.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/device_tracker.automatic/
|
||||
"""
|
||||
"""Support for the Automatic platform."""
|
||||
import asyncio
|
||||
from datetime import timedelta
|
||||
import json
|
||||
|
12
homeassistant/components/automatic/manifest.json
Normal file
12
homeassistant/components/automatic/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "automatic",
|
||||
"name": "Automatic",
|
||||
"documentation": "https://www.home-assistant.io/components/automatic",
|
||||
"requirements": [
|
||||
"aioautomatic==0.6.5"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@armills"
|
||||
]
|
||||
}
|
12
homeassistant/components/automation/manifest.json
Normal file
12
homeassistant/components/automation/manifest.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"domain": "automation",
|
||||
"name": "Automation",
|
||||
"documentation": "https://www.home-assistant.io/components/automation",
|
||||
"requirements": [],
|
||||
"dependencies": [
|
||||
"group"
|
||||
],
|
||||
"codeowners": [
|
||||
"@home-assistant/core"
|
||||
]
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for Avion dimmers.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/light.avion/
|
||||
"""
|
||||
"""Support for Avion dimmers."""
|
||||
import importlib
|
||||
import logging
|
||||
import time
|
||||
|
10
homeassistant/components/avion/manifest.json
Normal file
10
homeassistant/components/avion/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "avion",
|
||||
"name": "Avion",
|
||||
"documentation": "https://www.home-assistant.io/components/avion",
|
||||
"requirements": [
|
||||
"avion==0.10"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
10
homeassistant/components/awair/manifest.json
Normal file
10
homeassistant/components/awair/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "awair",
|
||||
"name": "Awair",
|
||||
"documentation": "https://www.home-assistant.io/components/awair",
|
||||
"requirements": [
|
||||
"python_awair==0.0.4"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,9 +1,4 @@
|
||||
"""
|
||||
Support for the Awair indoor air quality monitor.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.awair/
|
||||
"""
|
||||
"""Support for the Awair indoor air quality monitor."""
|
||||
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
@@ -20,7 +15,7 @@ import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.util import Throttle, dt
|
||||
|
||||
REQUIREMENTS = ['python_awair==0.0.3']
|
||||
REQUIREMENTS = ['python_awair==0.0.4']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
13
homeassistant/components/aws/manifest.json
Normal file
13
homeassistant/components/aws/manifest.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"domain": "aws",
|
||||
"name": "Aws",
|
||||
"documentation": "https://www.home-assistant.io/components/aws",
|
||||
"requirements": [
|
||||
"aiobotocore==0.10.2"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": [
|
||||
"@awarecan",
|
||||
"@robbiet480"
|
||||
]
|
||||
}
|
@@ -1 +0,0 @@
|
||||
"""The aws_lambda component."""
|
10
homeassistant/components/aws_lambda/manifest.json
Normal file
10
homeassistant/components/aws_lambda/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aws_lambda",
|
||||
"name": "Aws lambda",
|
||||
"documentation": "https://www.home-assistant.io/components/aws_lambda",
|
||||
"requirements": [
|
||||
"boto3==1.9.16"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,94 +0,0 @@
|
||||
"""
|
||||
AWS Lambda platform for notify component.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/notify.aws_lambda/
|
||||
"""
|
||||
import base64
|
||||
import json
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import CONF_NAME, CONF_PLATFORM
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.json import JSONEncoder
|
||||
|
||||
from homeassistant.components.notify import (ATTR_TARGET, PLATFORM_SCHEMA,
|
||||
BaseNotificationService)
|
||||
|
||||
REQUIREMENTS = ['boto3==1.9.16']
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
CONF_REGION = 'region_name'
|
||||
CONF_ACCESS_KEY_ID = 'aws_access_key_id'
|
||||
CONF_SECRET_ACCESS_KEY = 'aws_secret_access_key'
|
||||
CONF_PROFILE_NAME = 'profile_name'
|
||||
CONF_CONTEXT = 'context'
|
||||
ATTR_CREDENTIALS = 'credentials'
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_REGION, default='us-east-1'): cv.string,
|
||||
vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Optional(CONF_CONTEXT, default=dict()): vol.Coerce(dict)
|
||||
})
|
||||
|
||||
|
||||
def get_service(hass, config, discovery_info=None):
|
||||
"""Get the AWS Lambda notification service."""
|
||||
_LOGGER.warning(
|
||||
"aws_lambda notify platform is deprecated, please replace it"
|
||||
" with aws component. This config will become invalid in version 0.92."
|
||||
" See https://www.home-assistant.io/components/aws/ for details."
|
||||
)
|
||||
|
||||
context_str = json.dumps({'custom': config[CONF_CONTEXT]}, cls=JSONEncoder)
|
||||
context_b64 = base64.b64encode(context_str.encode('utf-8'))
|
||||
context = context_b64.decode('utf-8')
|
||||
|
||||
import boto3
|
||||
|
||||
aws_config = config.copy()
|
||||
|
||||
del aws_config[CONF_PLATFORM]
|
||||
del aws_config[CONF_NAME]
|
||||
del aws_config[CONF_CONTEXT]
|
||||
|
||||
profile = aws_config.get(CONF_PROFILE_NAME)
|
||||
|
||||
if profile is not None:
|
||||
boto3.setup_default_session(profile_name=profile)
|
||||
del aws_config[CONF_PROFILE_NAME]
|
||||
|
||||
lambda_client = boto3.client("lambda", **aws_config)
|
||||
|
||||
return AWSLambda(lambda_client, context)
|
||||
|
||||
|
||||
class AWSLambda(BaseNotificationService):
|
||||
"""Implement the notification service for the AWS Lambda service."""
|
||||
|
||||
def __init__(self, lambda_client, context):
|
||||
"""Initialize the service."""
|
||||
self.client = lambda_client
|
||||
self.context = context
|
||||
|
||||
def send_message(self, message="", **kwargs):
|
||||
"""Send notification to specified LAMBDA ARN."""
|
||||
targets = kwargs.get(ATTR_TARGET)
|
||||
|
||||
if not targets:
|
||||
_LOGGER.info("At least 1 target is required")
|
||||
return
|
||||
|
||||
for target in targets:
|
||||
cleaned_kwargs = dict((k, v) for k, v in kwargs.items() if v)
|
||||
payload = {"message": message}
|
||||
payload.update(cleaned_kwargs)
|
||||
|
||||
self.client.invoke(FunctionName=target,
|
||||
Payload=json.dumps(payload),
|
||||
ClientContext=self.context)
|
@@ -1 +0,0 @@
|
||||
"""The aws_sns component."""
|
10
homeassistant/components/aws_sns/manifest.json
Normal file
10
homeassistant/components/aws_sns/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aws_sns",
|
||||
"name": "Aws sns",
|
||||
"documentation": "https://www.home-assistant.io/components/aws_sns",
|
||||
"requirements": [
|
||||
"boto3==1.9.16"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,84 +0,0 @@
|
||||
"""
|
||||
AWS SNS platform for notify component.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/notify.aws_sns/
|
||||
"""
|
||||
import json
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import CONF_NAME, CONF_PLATFORM
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from homeassistant.components.notify import (
|
||||
ATTR_TARGET, ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA,
|
||||
BaseNotificationService)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
REQUIREMENTS = ["boto3==1.9.16"]
|
||||
|
||||
CONF_REGION = 'region_name'
|
||||
CONF_ACCESS_KEY_ID = 'aws_access_key_id'
|
||||
CONF_SECRET_ACCESS_KEY = 'aws_secret_access_key'
|
||||
CONF_PROFILE_NAME = 'profile_name'
|
||||
ATTR_CREDENTIALS = 'credentials'
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_REGION, default='us-east-1'): cv.string,
|
||||
vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
|
||||
})
|
||||
|
||||
|
||||
def get_service(hass, config, discovery_info=None):
|
||||
"""Get the AWS SNS notification service."""
|
||||
_LOGGER.warning(
|
||||
"aws_sns notify platform is deprecated, please replace it"
|
||||
" with aws component. This config will become invalid in version 0.92."
|
||||
" See https://www.home-assistant.io/components/aws/ for details."
|
||||
)
|
||||
|
||||
import boto3
|
||||
|
||||
aws_config = config.copy()
|
||||
|
||||
del aws_config[CONF_PLATFORM]
|
||||
del aws_config[CONF_NAME]
|
||||
|
||||
profile = aws_config.get(CONF_PROFILE_NAME)
|
||||
|
||||
if profile is not None:
|
||||
boto3.setup_default_session(profile_name=profile)
|
||||
del aws_config[CONF_PROFILE_NAME]
|
||||
|
||||
sns_client = boto3.client("sns", **aws_config)
|
||||
|
||||
return AWSSNS(sns_client)
|
||||
|
||||
|
||||
class AWSSNS(BaseNotificationService):
|
||||
"""Implement the notification service for the AWS SNS service."""
|
||||
|
||||
def __init__(self, sns_client):
|
||||
"""Initialize the service."""
|
||||
self.client = sns_client
|
||||
|
||||
def send_message(self, message="", **kwargs):
|
||||
"""Send notification to specified SNS ARN."""
|
||||
targets = kwargs.get(ATTR_TARGET)
|
||||
|
||||
if not targets:
|
||||
_LOGGER.info("At least 1 target is required")
|
||||
return
|
||||
|
||||
message_attributes = {k: {"StringValue": json.dumps(v),
|
||||
"DataType": "String"}
|
||||
for k, v in kwargs.items() if v}
|
||||
for target in targets:
|
||||
self.client.publish(TargetArn=target, Message=message,
|
||||
Subject=kwargs.get(ATTR_TITLE,
|
||||
ATTR_TITLE_DEFAULT),
|
||||
MessageAttributes=message_attributes)
|
@@ -1 +0,0 @@
|
||||
"""The aws_sqs component."""
|
10
homeassistant/components/aws_sqs/manifest.json
Normal file
10
homeassistant/components/aws_sqs/manifest.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"domain": "aws_sqs",
|
||||
"name": "Aws sqs",
|
||||
"documentation": "https://www.home-assistant.io/components/aws_sqs",
|
||||
"requirements": [
|
||||
"boto3==1.9.16"
|
||||
],
|
||||
"dependencies": [],
|
||||
"codeowners": []
|
||||
}
|
@@ -1,86 +0,0 @@
|
||||
"""
|
||||
AWS SQS platform for notify component.
|
||||
|
||||
For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/notify.aws_sqs/
|
||||
"""
|
||||
import json
|
||||
import logging
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.const import CONF_NAME, CONF_PLATFORM
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
||||
from homeassistant.components.notify import (ATTR_TARGET, PLATFORM_SCHEMA,
|
||||
BaseNotificationService)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
REQUIREMENTS = ["boto3==1.9.16"]
|
||||
|
||||
CONF_REGION = 'region_name'
|
||||
CONF_ACCESS_KEY_ID = 'aws_access_key_id'
|
||||
CONF_SECRET_ACCESS_KEY = 'aws_secret_access_key'
|
||||
CONF_PROFILE_NAME = 'profile_name'
|
||||
ATTR_CREDENTIALS = 'credentials'
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_REGION, default='us-east-1'): cv.string,
|
||||
vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string,
|
||||
vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string,
|
||||
})
|
||||
|
||||
|
||||
def get_service(hass, config, discovery_info=None):
|
||||
"""Get the AWS SQS notification service."""
|
||||
_LOGGER.warning(
|
||||
"aws_sqs notify platform is deprecated, please replace it"
|
||||
" with aws component. This config will become invalid in version 0.92."
|
||||
" See https://www.home-assistant.io/components/aws/ for details."
|
||||
)
|
||||
|
||||
import boto3
|
||||
|
||||
aws_config = config.copy()
|
||||
|
||||
del aws_config[CONF_PLATFORM]
|
||||
del aws_config[CONF_NAME]
|
||||
|
||||
profile = aws_config.get(CONF_PROFILE_NAME)
|
||||
|
||||
if profile is not None:
|
||||
boto3.setup_default_session(profile_name=profile)
|
||||
del aws_config[CONF_PROFILE_NAME]
|
||||
|
||||
sqs_client = boto3.client("sqs", **aws_config)
|
||||
|
||||
return AWSSQS(sqs_client)
|
||||
|
||||
|
||||
class AWSSQS(BaseNotificationService):
|
||||
"""Implement the notification service for the AWS SQS service."""
|
||||
|
||||
def __init__(self, sqs_client):
|
||||
"""Initialize the service."""
|
||||
self.client = sqs_client
|
||||
|
||||
def send_message(self, message="", **kwargs):
|
||||
"""Send notification to specified SQS ARN."""
|
||||
targets = kwargs.get(ATTR_TARGET)
|
||||
|
||||
if not targets:
|
||||
_LOGGER.info("At least 1 target is required")
|
||||
return
|
||||
|
||||
for target in targets:
|
||||
cleaned_kwargs = dict((k, v) for k, v in kwargs.items() if v)
|
||||
message_body = {"message": message}
|
||||
message_body.update(cleaned_kwargs)
|
||||
message_attributes = {}
|
||||
for key, val in cleaned_kwargs.items():
|
||||
message_attributes[key] = {"StringValue": json.dumps(val),
|
||||
"DataType": "String"}
|
||||
self.client.send_message(QueueUrl=target,
|
||||
MessageBody=json.dumps(message_body),
|
||||
MessageAttributes=message_attributes)
|
26
homeassistant/components/axis/.translations/no.json
Normal file
26
homeassistant/components/axis/.translations/no.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"config": {
|
||||
"abort": {
|
||||
"already_configured": "Enheten er allerede konfigurert",
|
||||
"bad_config_file": "D\u00e5rlig data fra konfigurasjonsfilen",
|
||||
"link_local_address": "Linking av lokale adresser st\u00f8ttes ikke"
|
||||
},
|
||||
"error": {
|
||||
"already_configured": "Enheten er allerede konfigurert",
|
||||
"device_unavailable": "Enheten er ikke tilgjengelig",
|
||||
"faulty_credentials": "Ugyldig brukerlegitimasjon"
|
||||
},
|
||||
"step": {
|
||||
"user": {
|
||||
"data": {
|
||||
"host": "Vert",
|
||||
"password": "Passord",
|
||||
"port": "Port",
|
||||
"username": "Brukernavn"
|
||||
},
|
||||
"title": "Sett opp Axis enhet"
|
||||
}
|
||||
},
|
||||
"title": "Axis enhet"
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user