diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 6a0df4ab419..00000000000 --- a/.gitpod.yml +++ /dev/null @@ -1,15 +0,0 @@ -tasks: - - init: gem install bundler -v 2.0.1 && bundle install && bundle exec rake generate -ports: - - port: 4000 - onOpen: open-browser -github: - prebuilds: - master: true - branches: true - pullRequests: true - pullRequestsFromForks: true - addCheck: true - addComment: false - addBadge: false - addLabel: false diff --git a/.slugignore b/.slugignore deleted file mode 100644 index 0a41d01373a..00000000000 --- a/.slugignore +++ /dev/null @@ -1,3 +0,0 @@ -plugins -sass -source diff --git a/.theia/tasks.json b/.theia/tasks.json deleted file mode 100644 index fa5f725110c..00000000000 --- a/.theia/tasks.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "tasks": [ - { - "label": "Generate", - "type": "shell", - "command": "bundle", - "args": [ - "exec", - "rake", - "generate" - ], - "options": { - "cwd": "${workspaceFolder}" - } - }, - { - "label": "Preview", - "type": "shell", - "command": "bundle", - "args": [ - "exec", - "rake", - "preview" - ], - "options": { - "cwd": "${workspaceFolder}" - } - } - ] -} \ No newline at end of file diff --git a/Gemfile b/Gemfile index 8de1d420268..39721347d46 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ ruby '> 2.5.0' group :development do gem 'rake', '13.0.1' - gem 'jekyll', '4.0.0' + gem 'jekyll', '4.0.1' gem 'compass', '1.0.3' gem 'sass-globbing', '1.1.5' gem 'stringex', '2.8.5' diff --git a/Gemfile.lock b/Gemfile.lock index 675392f13df..568f7e4d472 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,7 +31,7 @@ GEM http_parser.rb (0.6.0) i18n (1.8.2) concurrent-ruby (~> 1.0) - jekyll (4.0.0) + jekyll (4.0.1) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -121,7 +121,7 @@ PLATFORMS DEPENDENCIES compass (= 1.0.3) - jekyll (= 4.0.0) + jekyll (= 4.0.1) jekyll-commonmark (= 1.3.1) jekyll-paginate (= 1.1.0) jekyll-redirect-from (= 0.16.0) diff --git a/_config.yml b/_config.yml index 1ae1d2ad2bb..f4d63b4680e 100644 --- a/_config.yml +++ b/_config.yml @@ -101,8 +101,8 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 109 -current_patch_version: 4 -date_released: 2020-05-04 +current_patch_version: 5 +date_released: 2020-05-06 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/source/_docs/autostart/systemd.markdown b/source/_docs/autostart/systemd.markdown index 270fd374e70..9d7eeabc4de 100644 --- a/source/_docs/autostart/systemd.markdown +++ b/source/_docs/autostart/systemd.markdown @@ -27,6 +27,7 @@ After=network-online.target [Service] Type=simple User=%i +WorkingDirectory=/home/%i/.homeassistant ExecStart=/usr/bin/hass [Install] @@ -45,6 +46,7 @@ After=network-online.target [Service] Type=simple User=%i +WorkingDirectory=/home/%i/.homeassistant ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant" [Install] diff --git a/source/_docs/ecosystem/appdaemon.markdown b/source/_docs/ecosystem/appdaemon.markdown deleted file mode 100644 index e9b7263cc45..00000000000 --- a/source/_docs/ecosystem/appdaemon.markdown +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: "AppDaemon" -description: "AppDaemon is a loosely coupled, multithreaded, sandboxed Python execution environment for writing automation apps for Home Assistant" -redirect_from: /ecosystem/appdaemon/ ---- - -AppDaemon is a loosely coupled, multithreaded, sandboxed Python execution environment for writing automation apps for Home Assistant. - -# Another Take on Automation - -AppDaemon is not meant to replace Home Assistant Automations and Scripts, rather complement them. For a lot of things, automations work well and can be very succinct. However, there is a class of more complex automations for which they become harder to use, and AppDaemon then comes into its own. It brings quite a few things to the table: - -- New paradigm - Some problems require a procedural and/or iterative approach, and `AppDaemon` Apps are a much more natural fit for this. Recent enhancements to Home Assistant scripts and templates have made huge strides, but for the most complex scenarios, Apps can do things that automations can't. -- Ease of use - AppDaemon's API is full of helper functions that make programming as easy and natural as possible. The functions and their operation are as "Pythonic" as possible; experienced Python programmers should feel right at home. -- Reuse - write a piece of code once and instantiate it as an App as many times as you need with different parameters; e.g., a motion light program that you can use in five different places around your home. The code stays the same, you just dynamically add new instances of it in the configuration file. -- Dynamic - AppDaemon has been designed from the start to enable the user to make changes without requiring a restart of Home Assistant, thanks to its loose coupling. However, it is better than that - the user can make changes to code and AppDaemon will automatically reload the code, figure out which Apps were using it, and restart them to use the new code without the need to restart `AppDaemon` itself. It is also possible to change parameters for an individual or multiple Apps and have them picked up dynamically. For a final trick, removing or adding Apps is also picked up dynamically. Testing cycles become a lot more efficient as a result. -- Complex logic - Python's If/Else constructs are clearer and easier to code for arbitrarily complex nested logic. -- Durable variables and state - Variables can be kept between events to keep track of things like the number of times a motion sensor has been activated, or how long it has been since a door opened. -- All the power of Python - use any of Python's libraries, create your own modules, share variables, refactor and re-use code, create a single App to do everything, or multiple Apps for individual tasks - nothing is off limits! - -It is in fact a testament to Home Assistant's open nature that a component like `AppDaemon` can be integrated so neatly and closely that it acts in all ways like an extension of the system, not a second class citizen. Part of the strength of Home Assistant's underlying design is that it makes no assumptions whatsoever about what it is controlling, reacting to, or reporting state on. This is made achievable in part by the great flexibility of Python as a programming environment for Home Assistant, and carrying that forward has enabled me to use the same philosophy for `AppDaemon` - it took surprisingly little code to be able to respond to basic events and call services in a completely open ended manner. The bulk of the work after that was adding additional functions to make things that were already possible easier. - -# How it Works - -The best way to show what AppDaemon does is through a few simple examples. - -## Sunrise/Sunset Lighting - -Let's start with a simple App to turn a light on every night at sunset and off every morning at sunrise. Every App when first started will have its `initialize()` function called, which gives it a chance to register a callback for AppDaemons's scheduler for a specific time. In this case, we are using `run_at_sunrise()` and `run_at_sunset()` to register two separate callbacks. The argument `0` is the number of seconds offset from sunrise or sunset and can be negative or positive. For complex intervals, it can be convenient to use Python's `datetime.timedelta` class for calculations. When sunrise or sunset occurs, the appropriate callback function, `sunrise_cb()` or `sunset_cb()`, is called, which then makes a call to Home Assistant to turn the porch light on or off by activating a scene. The variables `args["on_scene"]` and `args["off_scene"]` are passed through from the configuration of this particular App, and the same code could be reused to activate completely different scenes in a different version of the App. - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class OutsideLights(hass.Hass): - def initialize(self): - self.run_at_sunrise(self.sunrise_cb) - self.run_at_sunset(self.sunset_cb) - - def sunrise_cb(self, kwargs): - self.turn_on(self.args["off_scene"]) - - def sunset_cb(self, kwargs): - self.turn_on(self.args["on_scene"]) -``` - -This is also fairly easy to achieve with Home Assistant automations, but we are just getting started. - -## Motion Light - -Our next example is to turn on a light when motion is detected and it is dark, and turn it off after a period of time. This time, the `initialize()` function registers a callback on a state change (of the motion sensor) rather than a specific time. We tell AppDaemon that we are only interested in state changes where the motion detector comes on by adding an additional parameter to the callback registration - `new = "on"`. When the motion is detected, the callback function `motion()` is called, and we check whether or not the sun has set using a built-in convenience function: `sun_down()`. Next, we turn the light on with `turn_on()`, then set a timer using `run_in()` to turn the light off after 60 seconds, which is another call to the scheduler to execute in a set time from now, which results in `AppDaemon` calling `light_off()` 60 seconds later using the `turn_off()` call to actually turn the light off. This is still pretty simple in code terms: - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class FlashyMotionLights(hass.Hass): - def initialize(self): - self.listen_state(self.motion, "binary_sensor.drive", new="on") - - def motion(self, entity, attribute, old, new, kwargs): - if self.sun_down(): - self.turn_on("light.drive") - self.run_in(self.light_off, 60) - - def light_off(self, kwargs): - self.turn_off("light.drive") -``` - -This is starting to get a little more complex in Home Assistant automations, requiring an automation rule and two separate scripts. - -Now let's extend this with a somewhat artificial example to show something that is simple in AppDaemon but very difficult if not impossible using automations. Let's warn someone inside the house that there has been motion outside by flashing a lamp on and off ten times. We are reacting to the motion as before by turning on the light and setting a timer to turn it off again, but in addition, we set a 1-second timer to run `flash_warning()`, which, when called, toggles the inside light and sets another timer to call itself a second later. To avoid re-triggering forever, it keeps a count of how many times it has been activated and bails out after ten iterations. - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class MotionLights(hass.Hass): - def initialize(self): - self.listen_state(self.motion, "binary_sensor.drive", new="on") - - def motion(self, entity, attribute, old, new, kwargs): - if self.self.sun_down(): - self.turn_on("light.drive") - self.run_in(self.light_off, 60) - self.flashcount = 0 - self.run_in(self.flash_warning, 1) - - def light_off(self, kwargs): - self.turn_off("light.drive") - - def flash_warning(self, kwargs): - self.toggle("light.living_room") - self.flashcount += 1 - if self.flashcount < 10: - self.run_in(self.flash_warning, 1) -``` - -Of course, if I wanted to make this App or its predecessor reusable, I would have provide parameters for the sensor, the light to activate on motion, the warning light, and even the number of flashes and delay between flashes. - -In addition, Apps can write to `AppDaemon`'s log files, and there is a system of constraints that allows you to control when and under what circumstances Apps and callbacks are active to keep the logic clean and simple. - -For full installation instructions, see the [AppDaemon Project Documentation pages](http://appdaemon.readthedocs.io/en/stable/). diff --git a/source/_docs/ecosystem/appdaemon/api.markdown b/source/_docs/ecosystem/appdaemon/api.markdown deleted file mode 100644 index f3dbef57289..00000000000 --- a/source/_docs/ecosystem/appdaemon/api.markdown +++ /dev/null @@ -1,2133 +0,0 @@ ---- -title: "AppDaemon API Reference" -description: "AppDaemon API Reference" -redirect_from: /ecosystem/appdaemon/api/ ---- - -## Anatomy of an App - -Automations in AppDaemon are performed by creating a piece of code (essentially a Python Class) and then instantiating it as an Object one or more times by configuring it as an App in the configuration file. The App is given a chance to register itself for whatever events it wants to subscribe to, and AppDaemon will then make calls back into the Object's code when those events occur, allowing the App to respond to the event with some kind of action. - -The first step is to create a unique file within the apps directory (as defined in the `[AppDaemon]` section of configuration file). This file is in fact a Python module, and is expected to contain one or more classes derived from the supplied `AppDaemon` class, imported from the supplied `homeassistant.appapi` module. The start of an app might look like this: - -```python -import homeassistant.appapi as appapi - - -class MotionLights(appapi.AppDaemon): - """Motion lights implementation.""" -``` - -When configured as an app in the configuration file (more on that later) the lifecycle of the App begins. It will be instantiated as an object by AppDaemon, and immediately, it will have a call made to its `initialize()` function - this function must appear as part of every app: - -```python - def initialize(self): - """Perform initialization.""" -``` - -The initialize function allows the app to register any callbacks it might need for responding to state changes, and also any setup activities. When the `initialize()` function returns, the App will be dormant until any of its callbacks are activated. - -There are several circumstances under which `initialize()` might be called: - -- Initial start of AppDaemon -- Following a change to the Class code -- Following a change to the module parameters -- Following initial configuration of an app -- Following a change in the status of Daylight Savings Time -- Following a restart of Home Assistant - -In every case, the App is responsible for recreating any state it might need as if it were the first time it was ever started. If `initialize()` is called, the app can safely assume that it is either being loaded for the first time, or that all callbacks and timers have been canceled. In either case, the APP will need to recreate them. Depending upon the application it may be desirable for the App to establish state such as whether or not a particular light is on, within the `initialize()` function to ensure that everything is as expected or to make immediate remedial action (e.g., turn off a light that might have been left on by mistake when the app was restarted). - -After the `initialize()` function is in place, the rest of the app consists of functions that are called by the various callback mechanisms, and any additional functions the user wants to add as part of the program logic. Apps are able to subscribe to 2 main classes of events: - -- Scheduled Events -- State Change Events - -These, along with their various subscription calls and helper functions, will be described in detail in later sections. - -To wrap up this section, here is a complete functioning App (with comments): - -```python -import homeassistant.appapi as appapi -import datetime - -# Declare Class -class NightLight(appapi.AppDaemon): - # initialize() function which will be called at startup and reload - def initialize(self): - # Create a time object for 7pm - time = datetime.time(19, 00, 0) - # Schedule a daily callback that will call run_daily() at 7pm every night - self.run_daily(self.run_daily_callback, time) - - # Our callback function will be called by the scheduler every day at 7pm - def run_daily_callback(self, kwargs): - # Call to Home Assistant to turn the porch light on - self.turn_on("light.porch") -``` - -To summarize - an App's lifecycle consists of being initialized, which allows it to set one or more state and/or schedule callbacks. When those callbacks are activated, the App will typically use one of the Service Calling calls to effect some change to the devices of the system and then wait for the next relevant state change. That's all there is to it! - -## About the API - -The implementation of the API is located in the AppDaemon class that Apps are derived from. The code for the functions is therefore available to the App simply by invoking the name of the function from the object namespace using the `self` keyword, as in the above examples. `self.turn_on()` for example is just a method defined in the parent class and made available to the child. This design decision was made to simplify some of the implementation and hide passing of unnecessary variables during the API invocation. - -## Configuration of Apps -Apps are configured by specifying new sections in the configuration file. `[AppDaemon]` is a reserved section, for configuration of AppDaemon itself. The name of the section is the name the App is referred to within the system in log files etc. and must be unique. - -To configure a new App you need a minimum of two directives: - -- `module` - the name of the module (without the `.py`) that contains the class to be used for this App -- `class` - the name of the class as defined within the module for the APPs code - -Although the section/App name must be unique, it is possible to re-use a class as many times as you want, and conversely to put as many classes in a module as you want. A sample definition for a new App might look as follows: - -```ini -[newapp] -module = new -class = NewApp -``` - -When AppDaemon sees the following configuration it will expect to find a class called `NewApp` defined in a module called `new.py` in the apps subdirectory. Apps can be placed at the root of the Apps directory or within a subdirectory, an arbitrary depth down - wherever the App is, as long as it is in some subdirectory of the Apps dir, or in the Apps dir itself, AppDaemon will find it. There is no need to include information about the path, just the name of the file itself (without the `.py`) is sufficient. If names in the subdirectories overlap, AppDir will pick one of them but the exact choice it will make is undefined. - -When starting the system for the first time or when reloading an App or Module, the system will log the fact in its main log. It is often the case that there is a problem with the class, maybe a syntax error or some other problem. If that is the case, details will be output to the error log allowing the user to remedy the problem and reload. - -## Steps to writing an App - -1. Create the code in a new or shared module by deriving a class from AppDaemon, add required callbacks and code -2. Add the App to the configuration file -3. There is no number 3 - -## Reloading Modules and Classes - -Reloading of modules is automatic. When the system spots a change in a module, it will automatically reload and recompile the module. It will also figure out which Apps were using that Module and restart them, causing all of their existing callbacks to be cleared, and their `initialize()` function to be called. - -The same is true if changes are made to an App's configuration - changing the class, or arguments (see later) will cause that app to be reloaded in the same way. The system is also capable of detecting if a new app has been added, or if one has been removed, and it will act appropriately, starting the new app immediately and removing all callbacks for the removed app. - -The suggested order for creating a new App is to add the module code first and work until it compiles cleanly, and only then add an entry in the configuration file to actually run it. A good workflow is to continuously monitor the error file (using `tail -f` on Linux for instance) to ensure that errors are seen and can be remedied. - -## Passing Arguments to Apps - -There wouldn't be much point in being able to run multiple versions of an App if there wasn't some way to instruct them to do something different. For this reason it is possible to pass any required arguments to an App, which are then made available to the object at runtime. The arguments themselves can be called anything (apart from `module` or `class`) and are simply added into the section after the 2 mandatory directives like so: - -```ini -[MyApp] -module = myapp -class = MyApp -param1 = spam -param2 = eggs -``` - -Within the Apps code, the 2 parameters (as well as the module and class) are available as a dictionary called `args`, and accessed as follows: - -```python -param1 = self.args["param1"] -param2 = self.args["param2"] -``` - -A use case for this might be an App that detects motion and turns on a light. If you have 3 places you want to run this, rather than hardcoding this into 3 separate Apps, you need only code a single app and instantiate it 3 times with different arguments. It might look something like this: - -```ini -[downstairs_motion_light] -module = motion_light -class = MotionLight -sensor = binary_sensor.downstairs_hall -light = light.downstairs_hall -[upstairs_motion_light] -module = motion_light -class = MotionLight -sensor = binary_sensor.upstairs_hall -light = light.upstairs_hall -[garage_motion_light] -module = motion_light -class = MotionLight -sensor = binary_sensor.garage -light = light.garage -``` - -## Callback Constraints - -Callback constraints are a feature of AppDaemon that removes the need for repetition of some common coding checks. Many Apps will wish to process their callbacks only when certain conditions are met, e.g., someone is home, and it's after sunset. These kinds of conditions crop up a lot, and use of callback constraints can significantly simplify the logic required within callbacks. - -Put simply, callback constraints are one or more conditions on callback execution that can be applied to an individual App. An App's callbacks will only be executed if all of the constraints are met. If a constraint is absent it will not be checked for. - -For example, the presence callback constraint can be added to an App by adding a parameter to its configuration like this: - -```ini -[some_app] -module = some_module -class = SomeClass -constrain_presence = noone -``` - -Now, although the `initialize()` function will be called for MyClass, and it will have a chance to register as many callbacks as it desires, none of the callbacks will execute, in this case, until everyone has left. This could be useful for an interior motion detector App for instance. There are several different types of constraints: - -- input_boolean -- input_select -- presence -- time - -An App can have as many or as few as are required. When more than one constraint is present, they must all evaluate to true to allow the callbacks to be called. Constraints becoming true are not an event in their own right, but if they are all true at a point in time, the next callback that would otherwise been blocked due to constraint failure will now be called. Similarly, if one of the constraints becomes false, the next callback that would otherwise have been called will be blocked. - -They are described individually below. - -### input_boolean -By default, the input_boolean constraint prevents callbacks unless the specified input_boolean is set to "on". This is useful to allow certain Apps to be turned on and off from the user interface. For example: - -```ini -[some_app] -module = some_module -class = SomeClass -constrain_input_boolean = input_boolean.enable_motion_detection -``` - -If you want to reverse the logic so the constraint is only called when the input_boolean is off, use the optional state parameter by appending ",off" to the argument, e.g.: - -```ini -[some_app] -module = some_module -class = SomeClass -constrain_input_boolean = input_boolean.enable_motion_detection,off -``` - -### input_select -The input_select constraint prevents callbacks unless the specified input_select is set to one or more of the nominated (comma separated) values. This is useful to allow certain Apps to be turned on and off according to some flag, e.g., a house mode flag. - -```ini -# Single value -constrain_input_select = input_select.house_mode,Day -# or multiple values -constrain_input_select = input_select.house_mode,Day,Evening,Night -``` - -### presence -The presence constraint will constrain based on presence of device trackers. It takes 3 possible values: -- `noone` - only allow callback execution when no one is home -- `anyone` - only allow callback execution when one or more person is home -- `everyone` - only allow callback execution when everyone is home - -```ini -constrain_presence = anyone -# or -constrain_presence = someone -# or -constrain_presence = noone -``` - -### time -The time constraint consists of 2 variables, `constrain_start_time` and `constrain_end_time`. Callbacks will only be executed if the current time is between the start and end times. -- If both are absent no time constraint will exist -- If only start is present, end will default to 1 second before midnight -- If only end is present, start will default to midnight - -The times are specified in a string format with one of the following formats: -- HH:MM:SS - the time in Hours Minutes and Seconds, 24 hour format. -- `sunrise`|`sunset` [+|- HH:MM:SS]- time of the next sunrise or sunset with an optional positive or negative offset in Hours Minutes and seconds - -The time based constraint system correctly interprets start and end times that span midnight. - -```ini -# Run between 8am and 10pm -constrain_start_time = 08:00:00 -constrain_end_time = 22:00:00 -# Run between sunrise and sunset -constrain_start_time = sunrise -constrain_end_time = sunset -# Run between 45 minutes before sunset and 45 minutes after sunrise the next day -constrain_start_time = sunset - 00:45:00 -constrain_end_time = sunrise + 00:45:00 -``` - -### days -The day constraint consists of as list of days for which the callbacks will fire, e.g. - -```ini -constrain_days = mon,tue,wed -``` - -Callback constraints can also be applied to individual callbacks within Apps, see later for more details. - -## A Note on Threading - -AppDaemon is multithreaded. This means that any time code within an App is executed, it is executed by one of many threads. This is generally not a particularly important consideration for this application; in general, the execution time of callbacks is expected to be far quicker than the frequency of events causing them. However, it should be noted for completeness, that it is certainly possible for different pieces of code within the App to be executed concurrently, so some care may be necessary if different callback for instance inspect and change shared variables. This is a fairly standard caveat with concurrent programming, and if you know enough to want to do this, then you should know enough to put appropriate safeguards in place. For the average user however this shouldn't be an issue. If there are sufficient use cases to warrant it, I will consider adding locking to the function invocations to make the entire infrastructure threadsafe, but I am not convinced that it is necessary. - -An additional caveat of a threaded worker pool environment is that it is the expectation that none of the callbacks tie threads up for a significant amount of time. To do so would eventually lead to thread exhaustion, which would make the system run behind events. No events would be lost as they would be queued, but callbacks would be delayed which is a bad thing. - -Given the above, NEVER use Python's `time.sleep()` if you want to perform an operation some time in the future, as this will tie up a thread for the period of the sleep. Instead use the scheduler's `run_in()` function which will allow you to delay without blocking any threads. - -## State Operations - -### A note on Home Assistant State - -State within Home Assistant is stored as a collection of dictionaries, one for each entity. Each entity's dictionary will have some common fields and a number of entity type specific fields The state for an entity will always have the attributes: - -- `last_updated` -- `last_changed` -- `state` - -Any other attributes such as brightness for a lamp will only be present if the entity supports them, and will be stored in a sub-dictionary called `attributes`. When specifying these optional attributes in the `get_state()` call, no special distinction is required between the main attributes and the optional ones - `get_state()` will figure it out for you. - -Also bear in mind that some attributes such as brightness for a light, will not be present when the light is off. - -In most cases, the attribute `state` has the most important value in it, e.g., for a light or switch this will be `on` or `off`, for a sensor it will be the value of that sensor. Many of the AppDaemon API calls and callbacks will implicitly return the value of state unless told to do otherwise. - -### get_state() - -#### Synopsis - -```python -get_state(entity=None, attribute=None) -``` - -`get_state()` is used to query the state of any integration within Home Assistant. State updates are continuously tracked so this call runs locally and does not require AppDaemon to call back to Home Assistant and as such is very efficient. - -#### Returns - -`get_state()` returns a `dictionary` or single value, the structure of which varies according to the parameters used. - -#### Parameters - -All parameters are optional, and if `get_state()` is called with no parameters it will return the entire state of Home Assistant at that given time. This will consist of a dictionary with a key for each entity. Under that key will be the standard entity state information. - -##### entity - -This is the name of an entity or device type. If just a device type is provided, e.g., `light` or `binary_sensor`, `get_state()` will return a dictionary of all devices of that type, indexed by the entity_id, containing all the state for each entity. - -If a fully qualified `entity_id` is provided, `get_state()` will return the state attribute for that entity, e.g., `on` or `off` for a light. - -##### attribute - -Name of an attribute within the entity state object. If this parameter is specified in addition to a fully qualified `entity_id`, a single value representing the attribute will be returned, or `None` if it is not present. - -The value `all` for attribute has special significance and will return the entire state dictionary for the specified entity rather than an individual attribute value. - -#### Examples - -```python -# Return state for the entire system -state = self.get_state() - -# Return state for all switches in the system -state = self.get_state("switch") - -# Return the state attribute for light.office_1 -state = self.get_state("light.office_1") - -# Return the brightness attribute for light.office_1 -state = self.get_state("light.office_1", attribute="brightness") - -# Return the entire state for light.office_1 -state = self.get_state("light.office_1", attribute="all") -``` - -### set_state() - -`set_state()` will make a call back to Home Assistant and make changes to the internal state of Home Assistant. This is not something that you would usually want to do and the applications are limited however the call is included for completeness. Note that for instance, setting the state of a light to `on` won't actually switch the device on, it will merely change the state of the device in Home Assistant so that it no longer reflects reality. In most cases, the state will be corrected the next time Home Assistant polls the device or someone causes a state change manually. To effect actual changes of devices use one of the service call functions. - -One possible use case for `set_state()` is for testing. If for instance you are writing an App to turn on a light when it gets dark according to a luminance sensor, you can use `set_state()` to temporarily change the light level reported by the sensor to test your program. However this is also possible using the developer tools. - -At the time of writing, it appears that no checking is done as to whether or not the entity exists, so it is possible to add entirely new entries to Home Assistant's state with this call. - -#### Synopsis - -```python -set_state(entity_id, **kwargs) -``` - -#### Returns - -`set_state()` returns a dictionary representing the state of the device after the call has completed. - -#### Parameters - -##### entity_id - -Entity id for which the state is to be set, e.g., `light.office_1`. - -##### values - -A list of keyword values to be changed or added to the entities state. e.g., `state = "off"`. Note that any optional attributes such as colors for bulbs etc, need to reside in a dictionary called `attributes`; see the example. - -#### Examples - -```python -status = self.set_state("light.office_1", state="on", attributes={"color_name": "red"}) -``` - -### About Callbacks - -A large proportion of home automation revolves around waiting for something to happen and then reacting to it; a light level drops, the sun rises, a door opens etc. Home Assistant keeps track of every state change that occurs within the system and streams that information to AppDaemon almost immediately. - -An individual App however usually doesn't care about the majority of state changes going on in the system; Apps usually care about something very specific, like a specific sensor or light. Apps need a way to be notified when a state change happens that they care about, and be able to ignore the rest. They do this through registering callbacks. A callback allows the App to describe exactly what it is interested in, and tells AppDaemon to make a call into its code in a specific place to be able to react to it - this is a very familiar concept to anyone familiar with event-based programming. - -There are 3 types of callbacks within AppDaemon: - -- State Callbacks - react to a change in state -- Scheduler Callbacks - react to a specific time or interval -- Event Callbacks - react to specific Home Assistant and AppDaemon events. - -All callbacks allow the user to specify additional parameters to be handed to the callback via the standard Python `**kwargs` mechanism for greater flexibility. - -### About Registering Callbacks - -Each of the various types of callback have their own function or functions for registering the callback: - -- `listen_state()` for state callbacks -- Various scheduler calls such as `run_once()` for scheduler callbacks -- `listen_event()` for event callbacks. - -Each type of callback shares a number of common mechanisms that increase flexibility. - -#### Callback Level Constraints - -When registering a callback, you can add constraints identical to the Application level constraints described earlier. The difference is that a constraint applied to an individual callback only affects that callback and no other. The constraints are applied by adding Python keyword-value style arguments after the positional arguments. The parameters themselves are named identically to the previously described constraints and have identical functionality. For instance, adding: - -`constrain_presence="everyone"` - -to a callback registration will ensure that the callback is only run if the callback conditions are met and in addition everyone is present although any other callbacks might run whenever their event fires if they have no constraints. - -For example: - -`self.listen_state(self.motion, "binary_sensor.drive", constrain_presence="everyone")` - -#### User Arguments - -Any callback has the ability to allow the App creator to pass through arbitrary keyword arguments that will be presented to the callback when it is run. The arguments are added after the positional parameters just like the constraints. The only restriction is that they cannot be the same as any constraint name for obvious reasons. For example, to pass the parameter `arg1 = "home assistant"` through to a callback you would register a callback as follows: - -`self.listen_state(self.motion, "binary_sensor.drive", arg1="home assistant")` - -Then in the callback you could use it as follows: - -```python -def motion(self, entity, attribute, old, new, **kwargs): - self.log("Arg1 is {}".format(kwargs["arg1"])) -``` - -### State Callbacks - -AppDaemons's state callbacks allow an App to listen to a wide variety of events, from every state change in the system, right down to a change of a single attribute of a particular entity. Setting up a callback is done using a single API call `listen_state()` which takes various arguments to allow it to do all of the above. Apps can register as many or as few callbacks as they want. - -### About State Callback Functions - -When calling back into the App, the App must provide a class function with a known signature for AppDaemon to call. The callback will provide various information to the function to enable the function to respond appropriately. For state callbacks, a class defined callback function should look like this: - -```python -def my_callback(self, entity, attribute, old, new, **kwargs): - """Handle state callback.""" - # do some useful work here -``` - -You can call the function whatever you like - you will reference it in the `listen_state()` call, and you can create as many callback functions as you need. - -The parameters have the following meanings: - -#### self - -A standard Python object reference. - -#### entity - -Name of the entity the callback was requested for or `None`. - -#### attribute - -Name of the attribute the callback was requested for or `None`. - -#### old - -The value of the state before the state change. - -#### new - -The value of the state after the state change. - -`old` and `new` will have varying types depending on the type of callback. - -#### \*\*kwargs - -A dictionary containing any constraints and/or additional user specific keyword arguments supplied to the `listen_state()` call. - -### listen_state() - -`listen_state()` allows the user to register a callback for a wide variety of state changes. - -#### Synopsis - -```python -handle = listen_state(callback, entity=None, **kwargs) -``` - -#### Returns - -A unique identifier that can be used to cancel the callback if required. Since variables created within object methods are local to the function they are created in, and in all likelihood the cancellation will be invoked later in a different function, it is recommended that handles are stored in the object namespace, e.g., `self.handle`. - -#### Parameters - -All parameters except `callback` are optional, and if `listen_state()` is called with no additional parameters it will subscribe to any state change within Home Assistant. - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard State Callback format documented above. - -##### entity - -This is the name of an entity or device type. If just a device type is provided, e.g., `light` or `binary_sensor`, `listen_state()` will subscribe to state changes of all devices of that type. If a fully qualified `entity_id` is provided, `listen_state()` will listen for state changes for just that entity. - -When called, AppDaemon will supply the callback function, in old and new, with the state attribute for that entity, e.g., `on` or `off` for a light. - -##### attribute (optional) - -Name of an attribute within the entity state object. If this parameter is specified in addition to a fully qualified `entity_id`, `listen_state()` will subscribe to changes for just that attribute within that specific entity. The new and old parameters in the callback function will be provided with a single value representing the attribute. - -The value `all` for attribute has special significance and will listen for any state change within the specified entity, and supply the callback functions with the entire state dictionary for the specified entity rather than an individual attribute value. - -##### new = (optional) - -If `new` is supplied as a parameter, callbacks will only be made if the state of the selected attribute (usually `state`) in the new state match the value of `new`. - -##### old = (optional) - -If `old` is supplied as a parameter, callbacks will only be made if the state of the selected attribute (usually `state`) in the old state match the value of `old`. - -Note: `old` and `new` can be used singly or together. - -##### duration = (optional) - -If duration is supplied as a parameter, the callback will not fire unless the state listened for is maintained for that number of seconds. This makes the most sense if a specific attribute is specified (or the default os `state` is used), an in conjunction with the `old` or `new` parameters, or both. When the callback is called, it is supplied with the values of `entity`, `attr`, `old` and `new` that were current at the time the actual event occurred, since the assumption is that none of them have changed in the intervening period. - -```python -def my_callback(self, **kwargs): - """Handle state change.""" - # do some useful work here -``` - -(Scheduler callbacks are documented in detail later in this document) - -##### \*\*kwargs - -Zero or more keyword arguments that will be supplied to the callback when it is called. - -#### Examples - -```python -# Listen for any state change and return the state attribute -self.handle = self.listen_state(self.my_callback) - -# Listen for any state change involving a light and return the state attribute -self.handle = self.listen_state(self.my_callback, "light") - -# Listen for a state change involving light.office1 and return the state attribute -self.handle = self.listen_state(self.my_callback, "light.office_1") - -# Listen for a state change involving light.office1 and return the entire state as a dict -self.handle = self.listen_state(self.my_callback, "light.office_1", attribute="all") - -# Listen for a state change involving the brightness attribute of light.office1 -self.handle = self.listen_state( - self.my_callback, "light.office_1", attribute="brightness" -) - -# Listen for a state change involving light.office1 turning on and return the state attribute -self.handle = self.listen_state(self.my_callback, "light.office_1", new="on") - -# Listen for a state change involving light.office1 changing from brightness 100 to 200 and return the state attribute -self.handle = self.listen_state( - self.my_callback, "light.office_1", old="100", new="200" -) - -# Listen for a state change involving light.office1 changing to state on and remaining on for a minute -self.handle = self.listen_state( - self.my_callback, "light.office_1", new="on", duration=60 -) -``` - -### cancel_listen_state() - -Cancel a `listen_state()` callback. This will mean that the App will no longer be notified for the specific state change that has been canceled. Other state changes will continue to be monitored. - -#### Synopsis - -```python -cancel_listen_state(handle) -``` - -#### Returns - -Nothing - -#### Parameters - -##### handle - -The handle returned when the `listen_state()` call was made. - -#### Examples - -```python -self.cancel_listen_state(self.office_light_handle) -``` - -### info_listen_state() - -Get information on state a callback from its handle. - -#### Synopsis - -```python -entity, attribute, kwargs = self.info_listen_state(self.handle) -``` - -#### Returns - -entity, attribute, kwargs - the values supplied when the callback was initially created. - -#### Parameters - -##### handle - -The handle returned when the `listen_state()` call was made. - -#### Examples - -```python -entity, attribute, kwargs = self.info_listen_state(self.handle) -``` - -## Scheduler - -AppDaemon contains a powerful scheduler that is able to run with 1 second resolution to fire off specific events at set times, or after set delays, or even relative to sunrise and sunset. In general, events should be fired less than a second after specified but under certain circumstances there may be short additional delays. - -### About Schedule Callbacks - -As with State Change callbacks, Scheduler Callbacks expect to call into functions with a known and specific signature and a class defined Scheduler callback function should look like this: - -```python -def my_callback(self, **kwargs): - """Handle scheduler callback.""" - # do some useful work here -``` - -You can call the function whatever you like; you will reference it in the Scheduler call, and you can create as many callback functions as you need. - -The parameters have the following meanings: - -#### self -A standard Python object reference - -#### \*\*kwargs - -A dictionary containing Zero or more keyword arguments to be supplied to the callback. - -### Creation of Scheduler Callbacks - -Scheduler callbacks are created through use of a number of convenience functions which can be used to suit the situation. - -#### run_in() - -Run the callback in a defined number of seconds. This is used to add a delay, for instance a 60 second delay before a light is turned off after it has been triggered by a motion detector. This callback should always be used instead of `time.sleep()` as discussed previously. - -#### Synopsis - -```python -self.handle = self.run_in(callback, delay, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### vcallback %} - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### delay - -Delay, in seconds before the callback is invoked. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -self.handle = self.run_in(self.run_in_c) -self.handle = self.run_in(self.run_in_c, title="run_in5") -``` -#### run_once() - -Run the callback once, at the specified time of day. If the time of day is in the past, the callback will occur on the next day. - -#### Synopsis - -```python -self.handle = self.run_once(callback, time, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### time - -A Python `time` object that specifies when the callback will occur. If the time specified is in the past, the callback will occur the next day at the specified time. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run at 4pm today, or 4pm tomorrow if it is already after 4pm -import datetime - -... -runtime = datetime.time(16, 0, 0) -handle = self.run_once(self.run_once_c, runtime) -``` - -#### run_at() - -Run the callback once, at the specified date and time. - -#### Synopsis - -```python -self.handle = self.run_at(callback, datetime, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. `run_at()` will raise an exception if the specified time is in the past. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### datetime - -A Python `datetime` object that specifies when the callback will occur. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run at 4pm today -import datetime - -... -runtime = datetime.time(16, 0, 0) -today = datetime.date.today() -event = datetime.datetime.combine(today, runtime) -handle = self.run_once(self.run_once_c, event) -``` -#### run_daily() - -Execute a callback at the same time every day. If the time has already passed, the function will not be invoked until the following day at the specified time. - -#### Synopsis - -```python -self.handle = self.run_daily(callback, time, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### time - -A Python `time` object that specifies when the callback will occur. If the time specified is in the past, the callback will occur the next day at the specified time. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run daily at 7pm -import datetime - -... -time = datetime.time(19, 0, 0) -self.run_daily(self.run_daily_c, runtime) -``` - -#### run_hourly() - -Execute a callback at the same time every hour. If the time has already passed, the function will not be invoked until the following hour at the specified time. - -#### Synopsis - -```python -self.handle = self.run_hourly(callback, time=None, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### time - -A Python `time` object that specifies when the callback will occur, the hour integration of the time object is ignored. If the time specified is in the past, the callback will occur the next hour at the specified time. If time is not supplied, the callback will start an hour from the time that `run_hourly()` was executed. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run every hour, on the hour -import datetime - -... -time = datetime.time(0, 0, 0) -self.run_daily(self.run_daily_c, runtime) -``` -#### run_minutely() - -Execute a callback at the same time every minute. If the time has already passed, the function will not be invoked until the following minute at the specified time. - -#### Synopsis - -```python -self.handle = self.run_minutely(callback, time=None, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### time - -A Python `time` object that specifies when the callback will occur, the hour and minute components of the time object are ignored. If the time specified is in the past, the callback will occur the next hour at the specified time. If time is not supplied, the callback will start a minute from the time that `run_minutely()` was executed. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run Every Minute on the minute -import datetime - -... -time = datetime.time(0, 0, 0) -self.run_minutely(self.run_minutely_c, time) -``` - -#### run_every() - -Execute a repeating callback with a configurable delay starting at a specific time. - -#### Synopsis - -```python -self.handle = self.run_every(callback, time, repeat, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### time - -A Python `time` object that specifies when the initial callback will occur. - -##### repeat - -After the initial callback has occurred, another will occur every `repeat` seconds. - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Run every 17 minutes starting in 2 hours time -import datetime - -... -self.run_every(self.run_every_c, time, 17 * 60) -``` - -#### cancel_timer() -Cancel a previously created timer - -#### Synopsis - -```python -self.cancel_timer(handle) -``` - -#### Returns - -None - -#### Parameters - -##### handle - -A handle value returned from the original call to create the timer. - -#### Examples - -```python -self.cancel_timer(handle) -``` - -### info_timer() - -Get information on a scheduler event from its handle. - -#### Synopsis - -```python -time, interval, kwargs = self.info_timer(handle) -``` - -#### Returns - -time - datetime object representing the next time the callback will be fired - -interval - repeat interval if applicable, `0` otherwise. - -kwargs - the values supplied when the callback was initially created. - -#### Parameters - -##### handle - -The handle returned when the scheduler call was made. - -#### Examples - -```python -time, interval, kwargs = self.info_timer(handle) -``` - -### Scheduler Randomization - -All of the scheduler calls above support 2 additional optional arguments, `random_start` and `random_end`. Using these arguments it is possible to randomize the firing of callbacks to the degree desired by setting the appropriate number of seconds with the parameters. - -- `random_start` - start of range of the random time -- `random_end` - end of range of the random time - -`random_start` must always be numerically lower than `random_end`, they can be negative to denote a random offset before and event, or positive to denote a random offset after an event. The event would be an absolute or relative time or sunrise/sunset depending on which scheduler call you use and these values affect the base time by the specified amount. If not specified, they will default to `0`. - -For example: - -```python -# Run a callback in 2 minutes minus a random number of seconds between 0 and 60, e.g., run between 60 and 120 seconds from now -self.handle = self.run_in(callback, 120, random_start=-60, **kwargs) -# Run a callback in 2 minutes plus a random number of seconds between 0 and 60, e.g., run between 120 and 180 seconds from now -self.handle = self.run_in(callback, 120, random_end=60, **kwargs) -# Run a callback in 2 minutes plus or minus a random number of seconds between 0 and 60, e.g., run between 60 and 180 seconds from now -self.handle = self.run_in(callback, 120, random_start=-60, random_end=60, **kwargs) -``` - -## Sunrise and Sunset - -AppDaemon has a number of features to allow easy tracking of sunrise and sunset as well as a couple of scheduler functions. Note that the scheduler functions also support the randomization parameters described above, but they cannot be used in conjunction with the `offset` parameter`. - -### run_at_sunrise() - -Run a callback at or around sunrise. - -#### Synopsis - -```python -self.handle = self.run_at_sunrise(callback, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### offset = - -The time in seconds that the callback should be delayed after sunrise. A negative value will result in the callback occurring before sunrise. This parameter cannot be combined with `random_start` or `random_end` - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -import datetime - -# ... - -# Run 45 minutes before sunset -self.run_at_sunrise(self.sun, offset=datetime.timedelta(minutes=-45).total_seconds()) -# or you can just do the math yourself -self.run_at_sunrise(self.sun, offset=30 * 60) # Sunrise +30 mins -# Run at a random time +/- 60 minutes from sunrise -self.run_at_sunrise(self.sun, random_start=-60 * 60, random_end=60 * 60) -# Run at a random time between 30 and 60 minutes before sunrise -self.run_at_sunrise(self.sun, random_start=-60 * 60, random_end=30 * 60) -``` - -### run_at_sunset() - -Run a callback at or around sunset. - -#### Synopsis - -```python -self.handle = self.run_at_sunset(callback, offset, **kwargs) -``` - -#### Returns - -A handle that can be used to cancel the timer. - -#### Parameters - -##### callback - -Function to be invoked when the requested state change occurs. It must conform to the standard Scheduler Callback format documented above. - -##### offset = - -The time in seconds that the callback should be delayed after sunrise. A negative value will result in the callback occurring before sunrise. This parameter cannot be combined with `random_start` or `random_end` - -##### \*\*kwargs - -Arbitrary keyword parameters to be provided to the callback function when it is invoked. - -#### Examples - -```python -# Example using timedelta -import datetime - -# ... - -self.run_at_sunset( - self.sun, datetime.timedelta(minutes=-45).total_seconds() -) # Sunset -45 mins -# or you can just do the math yourself -self.run_at_sunset(self.sun, 30 * 60) # Sunset +30 mins -# Run at a random time +/- 60 minutes from sunset -self.run_at_sunset(self.sun, random_start=-60 * 60, random_end=60 * 60) -# Run at a random time between 30 and 60 minutes before sunset -self.run_at_sunset(self.sun, random_start=-60 * 60, random_end=30 * 60) -``` -### sunrise() - -Return the time that the next Sunrise will occur. - -#### Synopsis - -```python -self.sunrise() -``` - -#### Returns - -A Python datetime that represents the next time Sunrise will occur. - -#### Examples - -```python -rise_time = self.sunrise() -``` -### sunset() - -Return the time that the next Sunset will occur. - -#### Synopsis - -```python -self.sunset() -``` - -#### Returns - -A Python datetime that represents the next time Sunset will occur. - -#### Examples - -```python -set_time = self.sunset() -``` -### sun_up() - -A function that allows you to determine if the sun is currently up. - -#### Synopsis - -```python -result = self.sun_up() -``` - -#### Returns - -`True` if the sun is up, False otherwise. - -#### Examples - -```python -if self.sun_up(): - do_something() -``` - -### sun_down() - -A function that allows you to determine if the sun is currently down. - -#### Synopsis - -```python -result = self.sun_down() -``` - -#### Returns - -`True` if the sun is down, False otherwise. - -#### Examples - -```python -if self.sun_down(): - do_something() -``` - -## Calling Services - -### About Services - -Services within Home Assistant are how changes are made to the system and its devices. Services can be used to turn lights on and off, set thermostats and a whole number of other things. Home Assistant supplies a single interface to all these disparate services that take arbitrary parameters. AppDaemon provides the `call_service()` function to call into Home Assistant and run a service. In addition, it also provides convenience functions for some of the more common services making calling them a little easier. - -### call_service() - -Call service is the basic way of calling a service within AppDaemon. It can call any service and provide any required parameters. Available services can be found using the developer tools in the UI. For listed services, the part before the first period is the domain, and the part after is the service name. For instance, `light.turn_on` has a domain of `light` and a service name of `turn_on`. - -#### Synopsis - -```python -self.call_service(service, **kwargs) -``` - -#### Returns - -None - -#### Parameters - -##### service - -The service name, e.g., `light/turn_on`. - -##### \*\*kwargs - -Each service has different parameter requirements. This argument allows you to specify a comma separated list of keyword value pairs, e.g., `entity_id = light.office_1`. These parameters will be different for every service and can be discovered using the developer tools. Most if not all service calls require an `entity_id` however, so use of the above example is very common with this call. - -#### Examples - -```python -self.call_service("light/turn_on", entity_id="light.office_lamp", color_name="red") -self.call_service("notify/notify", title="Hello", message="Hello World") -``` -### turn_on() - -This is a convenience function for the `homeassistant.turn_on` function. It is able to turn on pretty much anything in Home Assistant that can be turned on or run: - -- Lights -- Switches -- Scenes -- Scripts - -And many more. - -#### Synopsis - -```python -self.turn_on(entity_id, **kwargs) -``` - -#### Returns - -None - -#### Parameters - -##### entity_id - -Fully qualified entity_id of the thing to be turned on, e.g., `light.office_lamp` or ```scene.downstairs_on``` - -##### \*\*kwargs - -A comma separated list of key value pairs to allow specification of parameters over and above `entity_id`. - -#### Examples - -```python -self.turn_on("switch.patio_lights") -self.turn_on("scene.bedroom_on") -self.turn_on("light.office_1", color_name="green") -``` - -### turn_off() - -This is a convenience function for the `homeassistant.turn_off` function. Like `homeassistant.turn_on`, it is able to turn off pretty much anything in Home Assistant that can be turned off. - -#### Synopsis - -```python -self.turn_off(entity_id) -``` - -#### Returns - -None - -#### Parameters - -##### entity_id - -Fully qualified entity_id of the thing to be turned off, e.g., `light.office_lamp` or `scene.downstairs_on`. - -#### Examples - -```python -self.turn_off("switch.patio_lights") -self.turn_off("light.office_1") -``` - -### toggle() - -This is a convenience function for the `homeassistant.toggle` function. It is able to flip the state of pretty much anything in Home Assistant that can be turned on or off. - -#### Synopsis - -```python -self.toggle(entity_id) -``` - -#### Returns - -None - -#### Parameters - -##### entity_id - -Fully qualified entity_id of the thing to be toggled, e.g., `light.office_lamp` or `scene.downstairs_on`. - -#### Examples - -```python -self.toggle("switch.patio_lights") -self.toggle("light.office_1", color_name="green") -``` - -### select_value() - -This is a convenience function for the `input_number.select_value` function. It is able to set the value of an input_number in Home Assistant. - -#### Synopsis - -```python -self.select_value(entity_id, value) -``` - -#### Returns - -None - -#### Parameters - -##### entity_id - -Fully qualified entity_id of the input_number to be changed, e.g., `input_number.alarm_hour`. - -##### value - -The new value to set the input number to. - -#### Examples - -```python -self.select_value("input_number.alarm_hour", 6) -``` - -### select_option() - -This is a convenience function for the `input_select.select_option` function. It is able to set the value of an input_select in Home Assistant. - -#### Synopsis - -```python -self.select_option(entity_id, option) -``` - -#### Returns - -None - -#### Parameters - -##### entity_id - -Fully qualified entity_id of the input_select to be changed, e.g., `input_select.mode`. - -##### value - -The new value to set the input number to. - -#### Examples - -```python -self.select_option("input_select.mode", "Day") -``` - -### notify() - -This is a convenience function for the `notify.notify` service. It will send a notification to your default notification service. If you have more than one, use `call_service()` to call the specific notification service you require instead. - -#### Synopsis - -```python -notify(message, title=None) -``` -#### Returns - -None - -#### Parameters - -##### message - -Message to be sent to the notification service. - -##### title - -Title of the notification - optional. - -#### Examples - -```python -self.notify("", "Switching mode to Evening") -``` - -## Events - -### About Events - -Events are a fundamental part of how Home Assistant works under the covers. HA has an event bus that all integrations can read and write to, enabling integrations to inform other integrations when important events take place. We have already seen how state changes can be propagated to AppDaemon - a state change however is merely an example of an event within Home Assistant. There are several other event types, among them are: - -- `homeassistant_start` -- `homeassistant_stop` -- `state_changed` -- `service_registered` -- `call_service` -- `service_executed` -- `platform_discovered` -- `component_loaded` - -Using AppDaemon, it is possible to subscribe to specific events as well as fire off events. - -In addition to the Home Assistant supplied events, AppDaemon adds 2 more events. These are internal to AppDaemon and are not visible on the Home Assistant bus: - -- `appd_started` - fired once when AppDaemon is first started and after Apps are initialized -- `ha_started` - fired every time AppDaemon detects a Home Assistant restart - -### About Event Callbacks - -As with State Change and Scheduler callbacks, Event Callbacks expect to call into functions with a known and specific signature and a class defined Scheduler callback function should look like this: - -```python -def my_callback(self, event_name, data, kwargs): - """Handle event callback.""" - # do some useful work here -``` - -You can call the function whatever you like - you will reference it in the Scheduler call, and you can create as many callback functions as you need. - -The parameters have the following meanings: - -#### self - -A standard Python object reference. - -#### event_name - -Name of the event that was called, e.g., `call_service`. - -#### data - -Any data that the system supplied with the event as a dict. - -#### kwargs - -A dictionary containing Zero or more user keyword arguments to be supplied to the callback. - -### listen_event() - -Listen event sets up a callback for a specific event, or any event. - -#### Synopsis - -```python -handle = listen_event(function, event=None, **kwargs) -``` -#### Returns - -A handle that can be used to cancel the callback. - -#### Parameters - -##### function - -The function to be called when the event is fired. - -##### event - -Name of the event to subscribe to. Can be a standard Home Assistant event such as `service_registered` or an arbitrary custom event such as `"MODE_CHANGE"`. If no event is specified, `listen_event()` will subscribe to all events. - -##### \*\*kwargs (optional) - -One or more keyword value pairs representing App specific parameters to supply to the callback. If the keywords match values within the event data, they will act as filters, meaning that if they don't match the values, the callback will not fire. - -As an example of this, a Minimote controller when activated will generate an event called `zwave.scene_activated`, along with 2 pieces of data that are specific to the event - `entity_id` and `scene`. If you include keyword values for either of those, the values supplied to the `listen_event()` call must match the values in the event or it will not fire. If the keywords do not match any of the data in the event they are simply ignored. - -Filtering will work with any event type, but it will be necessary to figure out the data associated with the event to understand what values can be filtered on. This can be achieved by examining Home Assistant's logfiles when the event fires. - -#### Examples - -```python -self.listen_event(self.mode_event, "MODE_CHANGE") -# Listen for a minimote event activating scene 3: -self.listen_event(self.generic_event, "zwave.scene_activated", scene_id=3) -# Listen for a minimote event activating scene 3 from a specific minimote: -self.listen_event( - self.generic_event, "zwave.scene_activated", entity_id="minimote_31", scene_id=3 -) -``` - -### cancel_listen_event() - -Cancels callbacks for a specific event. - -#### Synopsis - -```python -cancel_listen_event(handle) -``` -#### Returns - -None. - -#### Parameters - -##### handle - -A handle returned from a previous call to `listen_event()`. - -#### Examples - -```python -self.cancel_listen_event(handle) -``` - -### info_listen_event() - -Get information on an event callback from its handle. - -#### Synopsis - -```python -service, kwargs = self.info_listen_event(handle) -``` - -#### Returns - -service, kwargs - the values supplied when the callback was initially created. - -#### Parameters - -##### handle - -The handle returned when the `listen_event()` call was made. - -#### Examples - -```python -service, kwargs = self.info_listen_event(handle) -``` - - -### fire_event() - -Fire an event on the Home Assistant bus, for other integrations to hear. - -#### Synopsis - -```python -fire_event(event, **kwargs) -``` - -#### Returns - -None. - -#### Parameters - -##### event - -Name of the event. Can be a standard Home Assistant event such as `service_registered` or an arbitrary custom event such as `"MODE_CHANGE"`. - -##### \*\*kwargs - -Zero or more keyword arguments that will be supplied as part of the event. - -#### Examples - -```python -self.fire_event("MY_CUSTOM_EVENT", jam="true") -``` - -### Event Callback Function Signature - -Functions called as an event callback will be supplied with 2 arguments: - -```python -def service(self, event_name, data): - """Handle event.""" -``` - -#### event_name - -The name of the event that caused the callback, e.g., `"MODE_CHANGE"` or `call_service`. - -#### data - -A dictionary containing any additional information associated with the event. - -### Use of Events for Signaling between Home Assistant and AppDaemon - -Home Assistant allows for the creation of custom events and existing integrations can send and receive them. This provides a useful mechanism for signaling back and forth between Home Assistant and AppDaemon. For instance, if you would like to create a UI Element to fire off some code in Home Assistant, all that is necessary is to create a script to fire a custom event, then subscribe to that event in AppDaemon. The script would look something like this: - -```yaml -alias: Day -sequence: -- event: MODE_CHANGE - event_data: - mode: Day -``` - -The custom event `MODE_CHANGE` would be subscribed to with: - -```python -self.listen_event(self.mode_event, "MODE_CHANGE") -``` - -Home Assistant can send these events in a variety of other places - within automations, and also directly from Alexa intents. Home Assistant can also listen for custom events with its automation component. This can be used to signal from AppDaemon code back to Home Assistant. Here is a sample automation: - -```yaml -automation: - trigger: - platform: event - event_type: MODE_CHANGE - ... - ... -``` - -This can be triggered with a call to AppDaemon's fire_event() as follows: - -```python -self.fire_event("MODE_CHANGE", mode="Day") -``` - -## Presence - -Presence in Home Assistant is tracked using Device Trackers. The state of all device trackers can be found using the `get_state()` call, however AppDaemon provides several convenience functions to make this easier. - -### get_trackers() - -Return a list of all device trackers. This is designed to be iterated over. - -#### Synopsis - -```python -tracker_list = get_trackers() -``` -#### Returns - -An iterable list of all device trackers. - -#### Examples - -```python -trackers = self.get_trackers() -for tracker in trackers: - do_something(tracker) -``` - -### get_tracker_state() - -Get the state of a tracker. The values returned depend in part on the configuration and type of device trackers in the system. Simpler tracker types like `Locative` or `Nmap` will return one of 2 states: - -- `home` -- `not_home` - -Some types of device tracker are in addition able to supply locations that have been configured as Geofences, in which case the name of that location can be returned. - -#### Synopsis - -```python -location = self.get_tracker_state(tracker_id) -``` - -#### Returns - -A string representing the location of the tracker. - -#### Parameters - -##### tracker_id - -Fully qualified entity_id of the device tracker to query, e.g., `device_tracker.andrew`. - -#### Examples - -```python -trackers = self.get_trackers() -for tracker in trackers: - self.log("{} is {}".format(tracker, self.get_tracker_state(tracker))) -``` - -### everyone_home() - -A convenience function to determine if everyone is home. - -#### Synopsis - -```python -result = self.everyone_home() -``` -#### Returns - -Returns `True` if everyone is at home, `False` otherwise. - -#### Examples - -```python -if self.everyone_home(): - do_something() -``` -### anyone_home() - -A convenience function to determine if one or more person is home. - -#### Synopsis - -```python -result = self.anyone_home() -``` - -#### Returns - -Returns `True` if anyone is at home, `False` otherwise. - -#### Examples - -```python -if self.anyone_home(): - do_something() -``` -### noone_home() - -A convenience function to determine if no people are at home. - -#### Synopsis - -```python -result = self.noone_home() -``` - -#### Returns - -Returns `True` if no one is home, `False` otherwise. - -#### Examples - -```python -if self.noone_home(): - do_something() -``` - -## Miscellaneous Helper Functions - -### time() - -Returns a Python `time` object representing the current time. Use this in preference to the standard Python ways to discover the current time, especially when using the "Time Travel" feature for testing. - -#### Synopsis - -```python -time() -``` - -#### Returns - -A localized Python time object representing the current AppDaemon time. - -#### Parameters - -None - -#### Example - -```python -now = self.time() -``` - -### date() - -Returns a Python `date` object representing the current date. Use this in preference to the standard Python ways to discover the current date, especially when using the "Time Travel" feature for testing. - -#### Synopsis - -```python -date() -``` - -#### Returns - -A localized Python time object representing the current AppDaemon date. - -#### Parameters - -None - -#### Example - -```python -today = self.date() -``` - -### datetime() - -Returns a Python `datetime` object representing the current date and time. Use this in preference to the standard Python ways to discover the current time, especially when using the "Time Travel" feature for testing. - -#### Synopsis - -```python -datetime() -``` - -#### Returns - -A localized Python datetime object representing the current AppDaemon date and time. - -#### Parameters - -None - -#### Example - -```python -now = self.datetime() -``` - - -### convert_utc() - -Home Assistant provides timestamps of several different sorts that may be used to gain additional insight into state changes. These timestamps are in UTC and are coded as ISO 8601 Combined date and time strings. `convert_utc()` will accept one of these strings and convert it to a localized Python datetime object representing the timestamp - -#### Synopsis - -```python -convert_utc(utc_string) -``` - -#### Returns - -`convert_utc(utc_string)` returns a localized Python datetime object representing the timestamp. - -#### Parameters - -##### utc_string - -An ISO 8601 encoded date and time string in the following format: `2016-07-13T14:24:02.040658-04:00` - -#### Example - -###parse_time() - -Takes a string representation of a time, or sunrise or sunset offset and converts it to a `datetime.time` object. - -#### Synopsis - -```python -parse_time(time_string) -``` - -#### Returns - -A `datetime.time` object, representing the time given in the `time_string` argument. - -#### Parameters - -##### time_string - -A representation of the time in a string format with one of the following formats: - -- HH:MM:SS - the time in Hours Minutes and Seconds, 24 hour format. -- sunrise | sunset [+ | - HH:MM:SS]- time of the next sunrise or sunset with an optional positive or negative offset in Hours Minutes and seconds - -#### Example - -```python -time = self.parse_time("17:30:00") -time = self.parse_time("sunrise") -time = self.parse_time("sunset + 00:30:00") -time = self.parse_time("sunrise + 01:00:00") -``` - -### now_is_between() - -Takes two string representations of a time, or sunrise or sunset offset and returns true if the current time is between those 2 times. `now_is_between()` can correctly handle transitions across midnight. - -#### Synopsis - -```python -now_is_between(start_time_string, end_time_string) -``` - -#### Returns - -`True` if the current time is within the specified start and end times, `False` otherwise. - -#### Parameters - -##### start_time_string, end_time_string - -A representation of the start and end time respectively in a string format with one of the following formats: - -- HH:MM:SS - the time in Hours Minutes and Seconds, 24 hour format. -- sunrise | sunset [+ | - HH:MM:SS]- time of the next sunrise or sunset with an optional positive or negative offset in Hours Minutes and seconds - -#### Example - -```python -if self.now_is_between("17:30:00", "08:00:00"): - do_something() -if self.now_is_between("sunset - 00:45:00", "sunrise + 00:45:00"): - do_something_else() -``` - -### friendly_name() - -`friendly_name()` will return the Friendly Name of an entity if it has one. - -#### Synopsis - -```python -Name = self.friendly_name(entity_id) -``` - -#### Returns - -The friendly name of the entity if it exists or the entity id if not. - -#### Example - -```python -tracker = "device_tracker.andrew" -self.log( - "{} ({}) is {}".format( - tracker, self.friendly_name(tracker), self.get_tracker_state(tracker) - ) -) -``` - -### split_entity() - -`split_entity()` will take a fully qualified entity id of the form `light.hall_light` and split it into 2 values, the device and the entity, e.g., `light` and `hall_light`. - -#### Synopsis - -```python -device, entity = self.split_entity(entity_id) -``` - -#### Parameters - -##### entity_id - -Fully qualified entity id to be split. - -#### Returns - -A list with 2 entries, the device and entity respectively. - -#### Example - -```python -device, entity = self.split_entity(entity_id) -if device == "scene": - do_something_specific_to_scenes() -``` - - -### get_app() - -`get_app()` will return the instantiated object of another app running within the system. This is useful for calling functions or accessing variables that reside in different apps without requiring duplication of code. - -#### Synopsis - -```python -get_app(self, name) -``` -#### Parameters - -##### name - -Name of the app required. This is the name specified in header section of the configuration file, not the module or class. - -#### Returns - -An object reference to the class. - -#### Example -```python -MyApp = self.get_app("MotionLights") -MyApp.turn_light_on() -``` - -### split_device_list() - -`split_device_list()` will take a comma separated list of device types (or anything else for that matter) and return them as an iterable list. This is intended to assist in use cases where the App takes a list of entities from an argument, e.g., a list of sensors to monitor. If only one entry is provided, an iterable list will still be returned to avoid the need for special processing. - -#### Synopsis - -```python -devices = split_device_list(list) -``` - -#### Returns - -A list of split devices with 1 or more entries. - -#### Example - -```python -for sensor in self.split_device_list(self.args["sensors"]): - do_something(sensor) # e.g., make a state subscription -``` - - -### Writing to Logfiles - -AppDaemon uses 2 separate logs - the general log and the error log. An AppDaemon App can write to either of these using the supplied convenience methods `log()` and `error()`, which are provided as part of parent `AppDaemon` class, and the call will automatically pre-pend the name of the App making the call. The `-D` option of AppDaemon can be used to specify what level of logging is required and the logger objects will work as expected. - -### log() - -#### Synopsis - -```python -log(message, level="INFO") -``` - -#### Returns - -Nothing - -#### Parameters - -##### Message - -The message to log. - -##### level - -The log level of the message - takes a string representing the standard logger levels. - -#### Examples - -```python -self.log("Log Test: Parameter is {}".format(some_variable)) -self.log("Log Test: Parameter is {}".format(some_variable), level="ERROR") -``` - -### error() - -#### Synopsis - -```python -error(message, level="WARNING") -``` -#### Returns - -Nothing - -#### Parameters - -##### Message - -The message to log. - -##### level - -The log level of the message - takes a string representing the standard logger levels. - -#### Examples - -```python -self.error("Some Warning string") -self.error("Some Critical string", level="CRITICAL") -``` - -## Sharing information between Apps - -Sharing information between different Apps is very simple if required. Each app gets access to a global dictionary stored in a class attribute called `self.global_vars`. Any App can add or read any key as required. This operation is not however threadsafe so some car is needed. - -In addition, Apps have access to the entire configuration if required, meaning they can access AppDaemon configuration items as well as parameters from other Apps. To use this, there is a class attribute called `self.config`. It contains a `ConfigParser` object, which is similar in operation to a `Dictionary`. To access any apps parameters, simply reference the ConfigParser object using the Apps name (form the configuration file) as the first key, and the parameter required as the second, for instance: - -```python -other_apps_arg = self.config["some_app"]["some_parameter"] -``` - -To get AppDaemon's configuration parameters, use the key "AppDaemon", e.g.: - -```python -app_timezone = self.config["AppDaemon"]["time_zone"] -``` - -And finally, it is also possible to use the AppDaemon as a global area for sharing parameters across Apps. Simply add the required parameters to the AppDaemon section of your configuration: - -```ini -[AppDaemon] -ha_url = -ha_key = -... -global_var = hello world -``` - -Then access it as follows: - -```python -my_global_var = conf.config["AppDaemon"]["global_var"] -``` - -## Development Workflow - -Developing Apps is intended to be fairly simple but is an exercise in programming like any other kind of Python programming. As such, it is expected that apps will contain syntax errors and will generate exceptions during the development process. AppDaemon makes it very easy to iterate through the development process as it will automatically reload code that has changed and also will reload code if any of the parameters in the configuration file change as well. - -The recommended workflow for development is as follows: - -- Open a window and tail the `appdaemon.log` file -- Open a second window and tail the `error.log` file -- Open a third window or the editor of your choice for editing the App - -With this setup, you will see that every time you write the file, AppDaemon will log the fact and let you know it has reloaded the App in the `appdaemon.log` file. - -If there is an error in the compilation or a runtime error, this will be directed to the `error.log` file to enable you to see the error and correct it. When an error occurs, there will also be a warning message in `appdaemon.log` to tell you to check the error log. - -## Time Travel - -OK, time travel sadly isn't really possible but it can be very useful when testing Apps. For instance, imagine you have an App that turns a light on every day at sunset. It might be nice to test it without waiting for Sunset - and with AppDaemon's "Time Travel" features you can. - -### Choosing a Start Time - -Internally, AppDaemon keeps track of its own time relative to when it was started. This make is possible to start AppDaemon with a different start time and date to the current time. For instance to test that sunset App, start AppDaemon at a time just before sunset and see if it works as expected. To do this, simply use the "-s" argument on AppDaemon's command line. e,g,: - -```bash -$ appdaemon -s "2016-06-06 19:16:00" -2016-09-06 17:16:00 INFO AppDaemon Version 1.3.2 starting -2016-09-06 17:16:00 INFO Got initial state -2016-09-06 17:16:00 INFO Loading Module: /export/hass/appdaemon_test/conf/test_apps/sunset.py -... -``` - -Note the timestamps in the log - AppDaemon believes it is now just before sunset and will process any callbacks appropriately. - -### Speeding things up - -Some Apps need to run for periods of a day or two for you to test all aspects. This can be time consuming, but Time Travel can also help here in two ways. The first is by speeding up time. To do this, simply use the `-t` option on the command line. This specifies the amount of time a second lasts while time traveling. The default of course is 1 second, but if you change it to `0.1` for instance, AppDaemon will work 10x faster. If you set it to `0`, AppDaemon will work as fast as possible and, depending in your hardware, may be able to get through an entire day in a matter of minutes. Bear in mind however, due to the threaded nature of AppDaemon, when you are running with `-t 0` you may see actual events firing a little later than expected as the rest of the system tries to keep up with the timer. To set the tick time, start AppDaemon as follows: - -```bash -$ appdaemon -t 0.1 -``` - -AppDaemon also has an interval flag - think of this as a second multiplier. If the flag is set to 3600 for instance, each tick of the scheduler will jump the time forward by an hour. This is good for covering vast amounts of time quickly but event firing accuracy will suffer as a result. For example: - -```bash -$ appdaemon -e 3600 -``` - -### Automatically stopping - -AppDaemon can be set to terminate automatically at a specific time. This can be useful if you want to repeatedly rerun a test, for example to test that random values are behaving as expected. Simply specify the end time with the `-e` flag as follows: - -```bash -$ appdaemon -e "2016-06-06 10:10:00" -2016-09-06 17:16:00 INFO AppDaemon Version 1.3.2 starting -2016-09-06 17:16:00 INFO Got initial state -2016-09-06 17:16:00 INFO Loading Module: /export/hass/appdaemon_test/conf/test_apps/sunset.py -... -``` - -The `-e` flag is most useful when used in conjunction with the -s flag and optionally the `-t` flag. For example, to run from just before sunset, for an hour, as fast as possible: - -```bash -$ appdaemon -s "2016-06-06 19:16:00" -s "2016-06-06 20:16:00" -t 0 -``` - - -### A Note on Times - -Some Apps you write may depend on checking times of events relative to the current time. If you are time traveling this will not work if you use standard Python library calls to get the current time and date etc. For this reason, always use the AppDamon supplied `time()`, `date()` and `datetime()` calls, documented earlier. These calls will consult with AppDaemon's internal time rather than the actual time and give you the correct values. diff --git a/source/_docs/ecosystem/appdaemon/configuration.markdown b/source/_docs/ecosystem/appdaemon/configuration.markdown deleted file mode 100644 index 599a8fa9af4..00000000000 --- a/source/_docs/ecosystem/appdaemon/configuration.markdown +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Configuration" -description: "AppDaemon Configuration" -redirect_from: /ecosystem/appdaemon/configuration/ ---- - -the documentation for configuring AppDaemon can be found in its own documentation. - -https://appdaemon.readthedocs.io/en/latest/CONFIGURE.html diff --git a/source/_docs/ecosystem/appdaemon/example_apps.markdown b/source/_docs/ecosystem/appdaemon/example_apps.markdown deleted file mode 100644 index ca34797c993..00000000000 --- a/source/_docs/ecosystem/appdaemon/example_apps.markdown +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Example Apps" -description: "AppDaemon Example Apps" -redirect_from: /ecosystem/appdaemon/example_apps/ ---- - -There are a number of example apps under conf/examples, and the `conf/examples.cfg` file gives sample parameters for them. diff --git a/source/_docs/ecosystem/appdaemon/installation.markdown b/source/_docs/ecosystem/appdaemon/installation.markdown deleted file mode 100644 index 61361d02a64..00000000000 --- a/source/_docs/ecosystem/appdaemon/installation.markdown +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Installation" -description: "AppDaemon Installation" -redirect_from: /ecosystem/appdaemon/installation/ ---- - -Installation is either by `pip3` or Docker. - -Follow [these instructions](https://github.com/home-assistant/appdaemon/blob/dev/README.rst) for full details. diff --git a/source/_docs/ecosystem/appdaemon/operation.markdown b/source/_docs/ecosystem/appdaemon/operation.markdown deleted file mode 100644 index a80ae58307c..00000000000 --- a/source/_docs/ecosystem/appdaemon/operation.markdown +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Operation" -description: "Operation" -redirect_from: /ecosystem/appdaemon/tutorial/ ---- - -Since `AppDaemon` under the covers uses the exact same APIs as the frontend UI, you typically see it react at about the same time to a given event. Calling back to Home Assistant is also pretty fast especially if they are running on the same machine. In action, observed latency above the built in automation integration is usually sub-second. diff --git a/source/_docs/ecosystem/appdaemon/reboot.markdown b/source/_docs/ecosystem/appdaemon/reboot.markdown deleted file mode 100644 index 386cd39e291..00000000000 --- a/source/_docs/ecosystem/appdaemon/reboot.markdown +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Starting at Reboot" -description: "Starting at Reboot" -redirect_from: /ecosystem/appdaemon/reboot/ ---- - -To run `AppDaemon` at reboot, I have provided a sample init script in the `./scripts` directory. These have been tested on a Raspberry Pi - your mileage may vary on other systems. There is also a sample Systemd script. diff --git a/source/_docs/ecosystem/appdaemon/running.markdown b/source/_docs/ecosystem/appdaemon/running.markdown deleted file mode 100644 index 615ad1d356d..00000000000 --- a/source/_docs/ecosystem/appdaemon/running.markdown +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Running AppDaemon" -description: "Running AppDaemon" -redirect_from: /ecosystem/appdaemon/running/ ---- - -As configured, `AppDaemon` comes with a single HelloWorld App that will send a greeting to the logfile to show that everything is working correctly. - -## Docker - -Assuming you have set the configuration up as described above for Docker, you can run it with the command: - -```bash -$ docker run -d -v /conf:/conf --name appdaemon acockburn/appdaemon:latest -``` - -In the example above you would use: - -```bash -$ docker run -d -v /Users/foo/ha-config:/conf --name appdaemon acockburn/appdaemon:latest -``` - -Where you place the `conf` and `conf/apps` directory is up to you - it can be in downloaded repository, or anywhere else on the host, as long as you use the correct mapping in the `docker run` command. - -You can inspect the logs as follows: - -```bash -$ docker logs appdaemon -2016-08-22 10:08:16,575 INFO Got initial state -2016-08-22 10:08:16,576 INFO Loading Module: /export/hass/appdaemon_test/conf/apps/hello.py -2016-08-22 10:08:16,578 INFO Loading Object hello_world using class HelloWorld from module hello -2016-08-22 10:08:16,580 INFO Hello from AppDaemon -2016-08-22 10:08:16,584 INFO You are now ready to run Apps! -``` - -Note that for Docker, the error and regular logs are combined. - -## `pip3` - -You can then run AppDaemon from the command line as follows: - -```bash -$ appdaemon -c conf/appdaemon.cfg -``` - -If all is well, you should see something like the following: - -```bash -$ appdaemon -c conf/appdaemon.cfg -2016-08-22 10:08:16,575 INFO Got initial state -2016-08-22 10:08:16,576 INFO Loading Module: /export/hass/appdaemon_test/conf/apps/hello.py -2016-08-22 10:08:16,578 INFO Loading Object hello_world using class HelloWorld from module hello -2016-08-22 10:08:16,580 INFO Hello from AppDaemon -2016-08-22 10:08:16,584 INFO You are now ready to run Apps! -``` - -## AppDaemon arguments - -```txt -usage: appdaemon [-h] [-c CONFIG] [-p PIDFILE] [-t TICK] [-s STARTTIME] - [-e ENDTIME] [-i INTERVAL] - [-D {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [-v] [-d] - -optional arguments: - -h, --help show this help message and exit - -c CONFIG, --config CONFIG - full path to config file - -p PIDFILE, --pidfile PIDFILE - full path to PID File - -t TICK, --tick TICK time in seconds that a tick in the schedular lasts - -s STARTTIME, --starttime STARTTIME - start time for scheduler - -e ENDTIME, --endtime ENDTIME - end time for scheduler - -i INTERVAL, --interval INTERVAL - multiplier for scheduler tick - -D {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --debug {DEBUG,INFO,WARNING,ERROR,CRITICAL} - debug level - -v, --version show program's version number and exit - -d, --daemon run as a background process -``` - --c is the path to the configuration file. If not specified, AppDaemon will look for a file named `appdaemon.cfg` first in `~/.homeassistant` then in `/etc/appdaemon`. If the file is not specified and it is not found in either location, AppDaemon will raise an exception. - --d and -p are used by the init file to start the process as a daemon and are not required if running from the command line. - --D can be used to increase the debug level for internal AppDaemon operations as well as apps using the logging function. - -The -s, -i, -t and -s options are for the Time Travel feature and should only be used for testing. They are described in more detail in the API documentation. diff --git a/source/_docs/ecosystem/appdaemon/tutorial.markdown b/source/_docs/ecosystem/appdaemon/tutorial.markdown deleted file mode 100644 index c5a81f7fe6a..00000000000 --- a/source/_docs/ecosystem/appdaemon/tutorial.markdown +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "AppDaemon Tutorial" -description: "AppDaemon Tutorial" -redirect_from: /ecosystem/appdaemon/tutorial/ ---- - -## Another Take on Automation - -If you haven't yet read Paulus' excellent Blog entry on [Perfect Home Automation](/blog/2016/01/19/perfect-home-automation/) I would encourage you to take a look. As a veteran of several Home Automation systems with varying degrees success, it was this article more than anything else that convinced me that Home Assistant had the right philosophy behind it and was on the right track. One of the most important points made is that being able to control your lights from your phone, 9 times out of 10 is harder than using a light switch - where Home Automation really comes into its own is when you start removing the need to use a phone or the switch - the "Automation" in Home Automation. A surprisingly large number of systems out there miss this essential point and have limited abilities to automate anything which is why a robust and open system such as Home Assistant is such an important part of the equation in bring this all together in the vast and chaotic ecosystem that is the "Internet of Things". - -So given the importance of Automation, what should Automation allow us to do? I am a pragmatist at heart so I judge individual systems by the ease of accomplishing a few basic but representative tasks: - -- Can the system respond to presence or absence of people? -- Can I turn a light on at Sunset +/- a certain amount of time? -- Can I arrive home in light or dark and have the lights figure out if they should be on or off? -- As I build my system out, can I get the individual pieces to co-operate and use and re-use (potentially complex) logic to make sure everything works smoothly? -- Is it open and expandable? -- Does it run locally without any reliance on the cloud? - -In my opinion, Home Assistant accomplishes the majority of these very well with a combination of Automations, Scripts and Templates, and its Restful API. - -So why `AppDaemon`? AppDaemon is not meant to replace Home Assistant Automations and Scripts, rather complement them. For a lot of things, automations work well and can be very succinct. However, there is a class of more complex automations for which they become harder to use, and AppDaemon then comes into its own. It brings quite a few things to the table: - -- New paradigm - some problems require a procedural and/or iterative approach, and `AppDaemon` Apps are a much more natural fit for this. Recent enhancements to Home Assistant scripts and templates have made huge strides, but for the most complex scenarios, Apps can do things that Automations can't -- Ease of use - AppDaemon's API is full of helper functions that make programming as easy and natural as possible. The functions and their operation are as "Pythonic" as possible, experienced Python programmers should feel right at home. -- Reuse - write a piece of code once and instantiate it as an app as many times as you need with different parameters e.g., a motion light program that you can use in 5 different places around your home. The code stays the same, you just dynamically add new instances of it in the configuration file -- Dynamic - AppDaemon has been designed from the start to enable the user to make changes without requiring a restart of Home Assistant, thanks to its loose coupling. However, it is better than that - the user can make changes to code and AppDaemon will automatically reload the code, figure out which Apps were using it and restart them to use the new code with out the need to restart `AppDaemon` itself. It is also possible to change parameters for an individual or multiple apps and have them picked up dynamically, and for a final trick, removing or adding apps is also picked up dynamically. Testing cycles become a lot more efficient as a result. -- Complex logic - Python's If/Else constructs are clearer and easier to code for arbitrarily complex nested logic -- Durable variables and state - variables can be kept between events to keep track of things like the number of times a motion sensor has been activated, or how long it has been since a door opened -- All the power of Python - use any of Python's libraries, create your own modules, share variables, refactor and re-use code, create a single app to do everything, or multiple apps for individual tasks - nothing is off limits! - -It is in fact a testament to Home Assistant's open nature that a component like `AppDaemon` can be integrated so neatly and closely that it acts in all ways like an extension of the system, not a second class citizen. Part of the strength of Home Assistant's underlying design is that it makes no assumptions whatever about what it is controlling or reacting to, or reporting state on. This is made achievable in part by the great flexibility of Python as a programming environment for Home Assistant, and carrying that forward has enabled me to use the same philosophy for `AppDaemon` - it took surprisingly little code to be able to respond to basic events and call services in a completely open ended manner - the bulk of the work after that was adding additional functions to make things that were already possible easier. - -## How it Works - -The best way to show what AppDaemon does is through a few simple examples. - -### Sunrise/Sunset Lighting - -Lets start with a simple App to turn a light on every night fifteen -minutes (900 seconds) before sunset and off every morning at sunrise. -Every App when first started will have its ``initialize()`` function -called which gives it a chance to register a callback for AppDaemons's -scheduler for a specific time. In this case we are using -`run_at_sunrise()` and `run_at_sunset()` to register 2 separate -callbacks. The named argument `offset` is the number of seconds offset -from sunrise or sunset and can be negative or positive (it defaults to -zero). For complex intervals it can be convenient to use Python's -`datetime.timedelta` class for calculations. In the example below, -when sunrise or just before sunset occurs, the appropriate callback -function, `sunrise_cb()` or `before_sunset_cb()` is called which -then makes a call to Home Assistant to turn the porch light on or off by -activating a scene. The variables `args["on_scene"]` and -`args["off_scene"]` are passed through from the configuration of this -particular App, and the same code could be reused to activate completely -different scenes in a different version of the App. - -```python - import appdaemon.plugins.hass.hassapi as hass - - - class OutsideLights(hass.Hass): - def initialize(self): - self.run_at_sunrise(self.sunrise_cb) - self.run_at_sunset(self.before_sunset_cb, offset=-900) - - def sunrise_cb(self, kwargs): - self.turn_on(self.args["off_scene"]) - - def before_sunset_cb(self, kwargs): - self.turn_on(self.args["on_scene"]) -``` - -This is also fairly easy to achieve with Home Assistant automations, but we are just getting started. - -### Motion Light - -Our next example is to turn on a light when motion is detected and it is dark, and turn it off after a period of time. This time, the `initialize()` function registers a callback on a state change (of the motion sensor) rather than a specific time. We tell AppDaemon that we are only interested in state changes where the motion detector comes on by adding an additional parameter to the callback registration - `new = "on"`. When the motion is detected, the callback function `motion()` is called, and we check whether or not the sun has set using a built-in convenience function: `sun_down()`. Next, we turn the light on with `turn_on()`, then set a timer using `run_in()` to turn the light off after 60 seconds, which is another call to the scheduler to execute in a set time from now, which results in `AppDaemon` calling `light_off()` 60 seconds later using the `turn_off()` call to actually turn the light off. This is still pretty simple in code terms: - -```python -import appdaemon.appapi as appapi - - -class FlashyMotionLights(appapi.AppDaemon): - def initialize(self): - self.listen_state(self.motion, "binary_sensor.drive", new="on") - - def motion(self, entity, attribute, old, new, kwargs): - if self.sun_down(): - self.turn_on("light.drive") - self.run_in(self.light_off, 60) - - def light_off(self, kwargs): - self.turn_off("light.drive") -``` - -This is starting to get a little more complex in Home Assistant automations requiring an Automation rule and two separate scripts. - -Now lets extend this with a somewhat artificial example to show something that is simple in AppDaemon but very difficult if not impossible using automations. Lets warn someone inside the house that there has been motion outside by flashing a lamp on and off 10 times. We are reacting to the motion as before by turning on the light and setting a timer to turn it off again, but in addition, we set a 1 second timer to run `flash_warning()` which when called, toggles the inside light and sets another timer to call itself a second later. To avoid re-triggering forever, it keeps a count of how many times it has been activated and bales out after 10 iterations. - -```python -import homeassistant.appapi as appapi - - -class MotionLights(appapi.AppDaemon): - def initialize(self): - self.listen_state(self.motion, "binary_sensor.drive", new="on") - - def motion(self, entity, attribute, old, new, kwargs): - if self.self.sun_down(): - self.turn_on("light.drive") - self.run_in(self.light_off, 60) - self.flashcount = 0 - self.run_in(self.flash_warning, 1) - - def light_off(self, kwargs): - self.turn_off("light.drive") - - def flash_warning(self, kwargs): - self.toggle("light.living_room") - self.flashcount += 1 - if self.flashcount < 10: - self.run_in(self.flash_warning, 1) -``` - -Of course if I wanted to make this App or its predecessor reusable I would have provide parameters for the sensor, the light to activate on motion, the warning light and even the number of flashes and delay between flashes. - -In addition, Apps can write to `AppDaemon`'s logfiles, and there is a system of constraints that allows you to control when and under what circumstances Apps and callbacks are active to keep the logic clean and simple. - -I have spent the last few weeks moving all of my (fairly complex) automations over to `AppDaemon` and so far it is working very reliably. - -Some people will maybe look at all of this and say "what use is this, I can already do all of this", and that is fine, as I said this is an alternative not a replacement, but I am hopeful that for some users this will seem a more natural, powerful and nimble way of building potentially very complex automations. - -If this has whet your appetite, feel free to give it a try. - -Happy Automating! - diff --git a/source/_docs/ecosystem/appdaemon/updating.markdown b/source/_docs/ecosystem/appdaemon/updating.markdown deleted file mode 100644 index 9f3b1e3b876..00000000000 --- a/source/_docs/ecosystem/appdaemon/updating.markdown +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Updating AppDaemon" -description: "Updating AppDaemon" -redirect_from: /ecosystem/appdaemon/updating/ ---- - -To update AppDaemon after I have released new code, just run the following command to update your copy: - -```bash -sudo pip3 install --upgrade appdaemon -``` - -If you are using Docker, rerun the steps to grab the latest Docker image. diff --git a/source/_docs/ecosystem/appdaemon/windows.markdown b/source/_docs/ecosystem/appdaemon/windows.markdown deleted file mode 100644 index e886ef1529b..00000000000 --- a/source/_docs/ecosystem/appdaemon/windows.markdown +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Windows Support" -description: "Windows Support" -redirect_from: /ecosystem/appdaemon/windows/ ---- - -AppDaemon runs under windows and has been tested with the official 3.5.2 release of Python. There are a couple of caveats however: - -- The `-d` or `--daemonize` option is not supported owing to limitations in the Windows implementation of Python. -- Some internal diagnostics are disabled. This is not user visible but may hamper troubleshooting of internal issues if any crop up - -AppDaemon can be installed exactly as per the instructions for every other version using pip3. - -## Windows Under the Linux Subsystem - -Windows 10 now supports a full Linux bash environment that is capable of running Python. This is essentially an Ubuntu distribution and works extremely well. It is possible to run AppDaemon in exactly the same way as for Linux distributions, and none of the above Windows Caveats apply to this version. This is the recommended way to run AppDaemon in a Windows 10 and later environment. diff --git a/source/_docs/ecosystem/hadashboard.markdown b/source/_docs/ecosystem/hadashboard.markdown deleted file mode 100644 index d0d28079e71..00000000000 --- a/source/_docs/ecosystem/hadashboard.markdown +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "HADashboard" -description: "HADashboard is a dashboard for Home Assistant that is intended to be wall mounted, and is optimized for distance viewing." -redirect_from: /ecosystem/hadashboard/ ---- - -HADashboard is a modular, skinnable dashboard for [Home Assistant](/) that is intended to be wall mounted, and is optimized for distance viewing. - -

- - Default Theme -

- -

- - Obsidian Theme -

- -

- - Zen Theme -

- -

- - Simply Red Theme -

- -

- - Glassic Theme -

- -For full installation instructions see the HADashboard section in the [AppDaemon Project Documentation](http://appdaemon.readthedocs.io/en/stable/DASHBOARD_INSTALL.html). \ No newline at end of file diff --git a/source/_docs/installation.markdown b/source/_docs/installation.markdown index 94f822f7b73..d1219130041 100644 --- a/source/_docs/installation.markdown +++ b/source/_docs/installation.markdown @@ -47,7 +47,7 @@ These install options are fully supported by Home Assistant's documentation. For
-The only installation methods that allow you to use Home Assistant Add-ons is using the Home Assistant image and [manual Supervised installer](/hassio/installation/#alternative-install-home-assistant-supervised-on-a-generic-linux-host). All other methods only install the base Home Assistant packages, however the software from the add-ons may still usually be installed manually like any other program. +The only installation methods that allow you to use Home Assistant Add-ons is using the Home Assistant image. All other methods only install the base Home Assistant packages, however the software from the add-ons may still usually be installed manually like any other program.
@@ -112,10 +112,4 @@ These guides are provided as-is. Some of these install methods are more limited
FreeNAS
- -
- -
-
Home Assistant Supervised
on generic Linux server
-
diff --git a/source/_docs/installation/docker.markdown b/source/_docs/installation/docker.markdown index c1754bfc98f..4c32c3dfc26 100644 --- a/source/_docs/installation/docker.markdown +++ b/source/_docs/installation/docker.markdown @@ -10,8 +10,6 @@ These below instructions are for an installation of Home Assistant Core running Note that Docker command line option `--net=host` or the compose file equivalent `network_mode: host` must be used to put put Home Assistant on the host's network, otherwise certain functionality - including mDNS and UPnP - will break. The `-p` command line option or the compose file equivalent `ports:` is not compatible with host networking mode and must not be used. -For an installation of Home Assistant Supervised, which includes Home Assistant's add-on ecosystem, see the instructions for installing [Home Assistant Supervised on a generic Linux host](/hassio/installation/#alternative-install-home-assistant-supervised-on-a-generic-linux-host/). - ## Platform Installation diff --git a/source/_docs/installation/raspberry-pi.markdown b/source/_docs/installation/raspberry-pi.markdown index b7796158449..4dcb787a92a 100644 --- a/source/_docs/installation/raspberry-pi.markdown +++ b/source/_docs/installation/raspberry-pi.markdown @@ -41,7 +41,7 @@ sudo apt-get upgrade -y Install the dependencies. ```bash -sudo apt-get install python3 python3-dev python3-venv python3-pip libffi-dev libssl-dev +sudo apt-get install python3 python3-dev python3-venv python3-pip libffi-dev libssl-dev autoconf ``` Add an account for Home Assistant Core called `homeassistant`. diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index a9e7664f548..40fd16e8499 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -267,7 +267,7 @@ Supported abbreviations for device registry configuration: The following software has built-in support for MQTT discovery: -- [Sonoff-Tasmota](https://github.com/arendst/Sonoff-Tasmota) (starting with 5.11.1e) +- [Tasmota](https://github.com/arendst/Tasmota) (starting with 5.11.1e) - [ESPHome](https://esphome.io) - [ESPurna](https://github.com/xoseperez/espurna) - [Arilux AL-LC0X LED controllers](https://github.com/mertenats/Arilux_AL-LC0X) diff --git a/source/_docs/z-wave/device-specific.markdown b/source/_docs/z-wave/device-specific.markdown index e50db11b4d8..531df1bd806 100644 --- a/source/_docs/z-wave/device-specific.markdown +++ b/source/_docs/z-wave/device-specific.markdown @@ -1291,3 +1291,122 @@ Example Event: - service: switch.toggle entity_id: switch.office_fan ``` + +### Zooz S2 MultiRelay (Zen16) + +Contact Zooz to obtain the over the air firmware update instructions and new user manual for the MultiRelay. + +Once the firmware is updated, the the new configuration parameters will have to be added to the `zwcfg` file. Replace the existing `COMMAND_CLASS_CONFIGURATION` with the one of the following options: + +```xml + + + On Off Status After Power Failure. Default: all relays restore to previous state + + + + + + + + Switch Type for Relay 1 (Sw1). Choose the wall switch type you want to connect to the Sw1 terminal. Default: toggle switch (state changes whenever the switch is toggled) + + + + + + + Switch Type for Relay 2 (Sw2). Choose the wall switch type you want to connect to the Sw2 terminal. Default: toggle switch (state changes whenever the switch is toggled) + + + + + + + Switch Type for Relay 3 (Sw3). Choose the wall switch type you want to connect to the Sw3 terminal. Default: toggle switch (state changes whenever the switch is toggled) + + + + + + + LED Indicator Control. Choose if you want the LED indicator to turn on when any of the relays are on or if all of them are off, or if you want it to remain on or off at all times. Default: On when all relays are off + + + + + + + Auto Turn-Off Timer for Relay 1. Sets the time (in minutes) after which you want relay 1 to automatically turn off once it has been turned on. Range: 1-65535. Default: 0 (disabled) + + + Auto Turn-On Timer for Relay 1. Sets the time (in minutes) after which you want relay 1 to automatically turn on once it has been turned off. Range: 1-65535. Default: 0 (disabled) + + + Auto Turn-Off Timer for Relay 2. Sets the time (in minutes) after which you want relay 2 to automatically turn off once it has been turned on. Range: 1-65535. Default: 0 (disabled) + + + Auto Turn-On Timer for Relay 2. Sets the time (in minutes) after which you want relay 2 to automatically turn on once it has been turned off. Range: 1-65535. Default: 0 (disabled) + + + Auto Turn-Off Timer for Relay 3. Sets the time (in minutes) after which you want relay 3 to automatically turn off once it has been turned on. Range: 1-65535. Default: 0 (disabled) + + + Auto Turn-On Timer for Relay 3. Sets the time (in minutes) after which you want relay 3 to automatically turn on once it has been turned off. Range: 1-65535. Default: 0 (disabled) + + + Enable/Disable Manual Control for SW1. Default: enabled + + + + + + Enable/Disable Manual Control for SW2. Default: enabled + + + + + + Enable/Disable Manual Control for SW3. Default: enabled + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-Off time for Relay 1. Default: minutes + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-On time for Relay 1. Default: minutes + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-Off time for Relay 2. Default: minutes + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-On time for Relay 2. Default: minutes + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-Off time for Relay 3. Default: minutes + + + + + + Choose between second, minutes, and hours as the unit for Auto Turn-On time for Relay 3. Default: minutes + + + + + +``` \ No newline at end of file diff --git a/source/_includes/asides/docs_navigation.html b/source/_includes/asides/docs_navigation.html index ae72edaa8de..f3c5b3ba8b5 100644 --- a/source/_includes/asides/docs_navigation.html +++ b/source/_includes/asides/docs_navigation.html @@ -261,12 +261,6 @@
  • {% active_link /docs/autostart/synology/ Synology NAS %}
  • -
  • - {% active_link /docs/ecosystem/appdaemon/ AppDaemon %} -
  • -
  • - {% active_link /docs/ecosystem/hadashboard/ HADashboard %} -
  • Remote access
      diff --git a/source/_integrations/cover.template.markdown b/source/_integrations/cover.template.markdown index e4c01e0e1d4..852fee2690e 100644 --- a/source/_integrations/cover.template.markdown +++ b/source/_integrations/cover.template.markdown @@ -26,6 +26,7 @@ cover: - platform: template covers: garage_door: + device_class: garage friendly_name: "Garage Door" value_template: "{{ states('sensor.garage_door')|float > 0 }}" open_cover: @@ -149,6 +150,7 @@ cover: - platform: template covers: garage_door: + device_class: garage friendly_name: "Garage Door" position_template: "{{ states('sensor.garage_door') }}" open_cover: diff --git a/source/_integrations/deconz.markdown b/source/_integrations/deconz.markdown index e35dcbdd4b2..26e27104d7c 100644 --- a/source/_integrations/deconz.markdown +++ b/source/_integrations/deconz.markdown @@ -230,145 +230,6 @@ automation: {% endraw %} -### AppDaemon - -#### AppDaemon event helper - -Helper app that creates a sensor `sensor.deconz_event` with a state that represents the id from the last event and an attribute to show the event data. - -Put this in `apps.yaml`: -{% raw %} - -```yaml -deconz_helper: - module: deconz_helper - class: DeconzHelper -``` - -Put this in `deconz_helper.py`: - -```python -import appdaemon.plugins.hass.hassapi as hass -import datetime -from datetime import datetime - - -class DeconzHelper(hass.Hass): - def initialize(self) -> None: - self.listen_event(self.event_received, "deconz_event") - - def event_received(self, event_name, data, kwargs): - event_data = data["event"] - event_id = data["id"] - event_received = datetime.now() - - self.log(f"Deconz event received from {event_id}. Event was: {event_data}") - self.set_state( - "sensor.deconz_event", - state=event_id, - attributes={ - "event_data": event_data, - "event_received": str(event_received), - }, - ) -``` - -{% endraw %} - -Note: the event will not be visible before one event gets sent. - -#### AppDaemon remote template - -{% raw %} - -```yaml -remote_control: - module: remote_control - class: RemoteControl - event: deconz_event - id: dimmer_switch_1 -``` - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class RemoteControl(hass.Hass): - def initialize(self): - if "event" in self.args: - self.listen_event(self.handle_event, self.args["event"]) - - def handle_event(self, event_name, data, kwargs): - if data["id"] == self.args["id"]: - self.log(data["event"]) - if data["event"] == 1002: - self.log("Button on") - elif data["event"] == 2002: - self.log("Button dim up") - elif data["event"] == 3002: - self.log("Button dim down") - elif data["event"] == 4002: - self.log("Button off") -``` - -{% endraw %} - -#### AppDaemon IKEA Tradfri remote template - -Community app from [Teachingbirds](https://community.home-assistant.io/u/teachingbirds/summary). This app uses an IKEA Tradfri remote to control Sonos speakers with play/pause, volume up and down, next and previous track. - -{% raw %} - -```yaml -sonos_remote_control: - module: sonos_remote - class: SonosRemote - event: deconz_event - id: sonos_remote - sonos: media_player.sonos -``` - -{% endraw %} - -{% raw %} - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class SonosRemote(hass.Hass): - def initialize(self): - self.sonos = self.args["sonos"] - if "event" in self.args: - self.listen_event(self.handle_event, self.args["event"]) - - def handle_event(self, event_name, data, kwargs): - if data["id"] == self.args["id"]: - if data["event"] == 1002: - self.log("Button toggle") - self.call_service("media_player/media_play_pause", entity_id=self.sonos) - - elif data["event"] == 2002: - self.log("Button volume up") - self.call_service("media_player/volume_up", entity_id=self.sonos) - - elif data["event"] == 3002: - self.log("Button volume down") - self.call_service("media_player/volume_down", entity_id=self.sonos) - - elif data["event"] == 4002: - self.log("Button previous") - self.call_service( - "media_player/media_previous_track", entity_id=self.sonos - ) - - elif data["event"] == 5002: - self.log("Button next") - self.call_service("media_player/media_next_track", entity_id=self.sonos) -``` - -{% endraw %} - ## Binary Sensor The following sensor types are supported: @@ -509,6 +370,8 @@ The sensor also has an attribute called "daylight" that has the value `true` whe These states can be used in automations as a trigger (e.g., trigger when a certain phase of daylight starts or ends) or condition (e.g., trigger only if in a certain phase of daylight). +Please note that the deCONZ daylight sensor is disabled by default in Home Assistant. It can be enabled manually by going to your deCONZ controller device in the Home Assistant UI. + ## Switch Switches are devices like power plugs and sirens. diff --git a/source/_integrations/frontier_silicon.markdown b/source/_integrations/frontier_silicon.markdown index 89b1b30ff66..bef63567654 100644 --- a/source/_integrations/frontier_silicon.markdown +++ b/source/_integrations/frontier_silicon.markdown @@ -14,7 +14,7 @@ This integration provides support for Internet Radios based on the [Frontier Sil * Hama: [IR110], [DIR3110] * Medion: [Medion Radios] * Silvercrest: [SIRD 14 C2] -* Some models from: Auna, Technisat, Revo, Pinell +* Some models from: Auna, Technisat, Revo, Pinell, Como Audio This integration was developed and tested with a Hama [DIR3110] and a Medion [MD 87466]. diff --git a/source/_integrations/homekit.markdown b/source/_integrations/homekit.markdown index dab9f296453..b1bf6012d9e 100644 --- a/source/_integrations/homekit.markdown +++ b/source/_integrations/homekit.markdown @@ -102,7 +102,7 @@ homekit: type: boolean default: false zeroconf_default_interface: - description: By default, zeroconf will attempt to bind to all interfaces. For systems running using network isolation or similar, this may result HomeKit not being seen on the network. Change this option to `true` if HomeKit cannot be discovered. + description: By default, zeroconf will attempt to bind to all interfaces. For systems running using network isolation or similar, this may result in HomeKit not being seen on the network. Change this option to `true` if HomeKit cannot be discovered. required: true type: boolean default: false @@ -237,7 +237,6 @@ homekit: available options: copy, libopus {% endconfiguration %} - ## Setup To enable the HomeKit integration in Home Assistant, add the following to your configuration file: @@ -281,7 +280,7 @@ The HomeKit Accessory Protocol Specification only allow a maximum of 150 unique ### Persistence Storage -Unfortunately `HomeKit` doesn't support any persistent storage - only the configuration for accessories that are added to the `Home Assistant Bridge` are kept. To avoid problems, it is recommended to use an automation to always start `HomeKit` with at least the same entities setup. If for some reason some entities are not set up, their configuration will be deleted. (State unknown or similar will not cause any issues.) +Unfortunately, `HomeKit` doesn't support any persistent storage - only the configuration for accessories that are added to the `Home Assistant Bridge` are kept. To avoid problems, it is recommended to use an automation to always start `HomeKit` with at least the same entities setup. If, for some reason, some entities are not set up, their configuration will be deleted. (State unknown or similar will not cause any issues.) A common situation might be if you decide to disable parts of the configuration for testing. Please make sure to disable `auto start` and `turn off` the `Start HomeKit` automation (if you have one). @@ -298,6 +297,7 @@ Please remember that you can only have a single `automation` entry. Add the auto {% raw %} + ```yaml # Example for Z-Wave homekit: @@ -315,11 +315,13 @@ automation: action: - service: homekit.start ``` + {% endraw %} For a general delay where your integration doesn't generate an event, you can also do: {% raw %} + ```yaml # Example using a delay after the start of Home Assistant homekit: @@ -334,11 +336,13 @@ automation: - delay: 00:05 # Waits 5 minutes - service: homekit.start ``` + {% endraw %} In some cases it might be desirable to check that all entities are available before starting `HomeKit`. This can be accomplished by adding an additional `binary_sensor` as follows: {% raw %} + ```yaml # Example checking specific entities to be available before start homekit: @@ -363,6 +367,7 @@ automation: continue_on_timeout: false - service: homekit.start ``` + {% endraw %} ## Configure Filter @@ -370,6 +375,7 @@ automation: By default, no entity will be excluded. To limit which entities are being exposed to `HomeKit`, you can use the `filter` parameter. Keep in mind only [supported components](#supported-components) can be added. {% raw %} + ```yaml # Example filter to include specified domains and exclude specified entities homekit: @@ -380,6 +386,7 @@ homekit: exclude_entities: - light.kitchen_light ``` + {% endraw %} Filters are applied as follows: @@ -388,14 +395,14 @@ Filters are applied as follows: 2. Includes, no excludes - only include specified entities 3. Excludes, no includes - only exclude specified entities 4. Both includes and excludes: - * Include domain specified + - Include domain specified - if domain is included, and entity not excluded, pass - if domain is not included, and entity not included, fail - * Exclude domain specified + - Exclude domain specified - if domain is excluded, and entity not included, fail - if domain is not excluded, and entity not excluded, pass - if both include and exclude domains specified, the exclude domains are ignored - * Neither include or exclude domain specified + - Neither include or exclude domain specified - if entity is included, pass (as #2 above) - if entity include and exclude, the entity exclude is ignored @@ -438,8 +445,8 @@ Restart your Home Assistant instance. This feature requires running an mDNS forw If you have a firewall configured on your Home Assistant system, make sure you open the following ports: -- UDP: 5353 -- TCP: 51827 +- UDP: 5353 +- TCP: 51827 (or the configured/used `port` in the integration settings). ## Supported Components @@ -519,6 +526,7 @@ You might have paired the `Home Assistant Bridge` already. If not, follow the ab #### `Home Assistant Bridge` doesn't appear in the Home App (for pairing) This is often setup and network related. Make sure to check the other issues below as well, but things that might work include: + - Check your router configuration - Try with Wi-Fi **and** LAN - Change the default [port](#port) diff --git a/source/_integrations/lutron_caseta.markdown b/source/_integrations/lutron_caseta.markdown index 68230f6458a..a109643ca0a 100644 --- a/source/_integrations/lutron_caseta.markdown +++ b/source/_integrations/lutron_caseta.markdown @@ -10,7 +10,7 @@ ha_category: - Fan - Binary Sensor ha_release: 0.41 -ha_iot_class: Local Polling +ha_iot_class: Local Push ha_domain: lutron_caseta ha_codeowners: - '@swails' diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index ddd70ad94a3..5692e4a753f 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -149,7 +149,7 @@ modbus: | Attribute | Description | | --------- | ----------- | | hub | Hub name (defaults to 'default' when omitted) | -| unit | Slave address (set to 255 you talk to Modbus via TCP) | +| unit | Slave address (1-255, mostly 255 if you talk to Modbus via TCP) | | address | Address of the Register (e.g., 138) | | value | A single value or an array of 16-bit values. Single value will call modbus function code 6. Array will call modbus function code 16. Array might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]` | diff --git a/source/_integrations/mycroft.markdown b/source/_integrations/mycroft.markdown index 833a013367b..02e95a70676 100644 --- a/source/_integrations/mycroft.markdown +++ b/source/_integrations/mycroft.markdown @@ -29,4 +29,30 @@ host: description: The IP address of your Mycroft instance. required: true type: string -{% endconfiguration %} +{% endconfiguration %} + +## Using notifications + +To use Mycroft for sending notifications, add the following to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +notify: + - platform: mycroft + name: mycroft +``` + +{% configuration %} +name: + description: Frendly name of your Mycroft instance. + required: true + type: string +{% endconfiguration %} + +## Examples + +Send a mesage to Mycroft by calling `notify.mycroft` service: + +```yaml +message: "hey" +``` diff --git a/source/_integrations/panasonic_viera.markdown b/source/_integrations/panasonic_viera.markdown index 912e9cc6efe..399ab3f8624 100644 --- a/source/_integrations/panasonic_viera.markdown +++ b/source/_integrations/panasonic_viera.markdown @@ -21,6 +21,8 @@ Once the integration is loaded, with your TV turned on and connected to your loc If your TV needs to be paired, you will be prompted to type the PIN code that will be displayed on it. +To allow your TV to be turned on or controlled while off, enable `Powered On By Apps` in the TV Settings: **Network > TV Remote App Settings** + ## Manual configuration If you prefer to use YAML to set up your Panasonic Viera TV, you can still do it. It also allows for some extra settings. @@ -95,16 +97,19 @@ script: ### Currently known supported models - TC-P50ST50 +- TC-P55ST50 - TC-P60S60 - TC-P65VT30 - TX-32AS520E - TX-32DSX609 +- TX-40DX700B - TX-49DX650B - TX-50DX700B - TX-55CX700E - TX-55CX680B - TX-55EXW584 - TX-55EXW604S +- TX-58DX700B - TX-65EXW784 - TX-L42ET50 - TX-P42STW50 diff --git a/source/_integrations/pi4ioe5v9xxxx.markdown b/source/_integrations/pi4ioe5v9xxxx.markdown index 1e1184c9074..2083a0943b6 100644 --- a/source/_integrations/pi4ioe5v9xxxx.markdown +++ b/source/_integrations/pi4ioe5v9xxxx.markdown @@ -13,7 +13,7 @@ ha_codeowners: - '@antonverburg' --- -The `pi4ioe5v9xxxx` integration provides support for the quasi-bidirectional devices PI4IOE5V9570, PI4IOE5V9674, PI4IOE5V9673, PI4IOE5V96224 and PI4IOE5V96248 from digital.com. +The `pi4ioe5v9xxxx` integration provides support for the quasi-bidirectional devices PI4IOE5V9570, PI4IOE5V9674, PI4IOE5V9673, PI4IOE5V96224 and PI4IOE5V96248 from [diodes.com](https://www.diodes.com). For more details about the pi4ioe5v9xxxx I2C I/O port expander you can find the datasheets here: - [PI4IOE5V9570](https://www.diodes.com/assets/Datasheets/PI4IOE5V9570.pdf) diff --git a/source/_integrations/python_script.markdown b/source/_integrations/python_script.markdown index 3e9312a9619..ae7737083de 100644 --- a/source/_integrations/python_script.markdown +++ b/source/_integrations/python_script.markdown @@ -21,15 +21,15 @@ This integration allows you to write Python scripts that are exposed as services
      -It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](/docs/ecosystem/appdaemon/) +It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](https://appdaemon.readthedocs.io/en/latest/)
      ## Writing your first script - - Add to `configuration.yaml`: `python_script:` - - Create folder `/python_scripts` - - Create a file `hello_world.py` in the folder and give it this content: +- Add to `configuration.yaml`: `python_script:` +- Create folder `/python_scripts` +- Create a file `hello_world.py` in the folder and give it this content: ```python name = data.get("name", "world") @@ -37,8 +37,8 @@ logger.info("Hello %s", name) hass.bus.fire(name, {"wow": "from a Python script!"}) ``` - - Start Home Assistant - - Call service `python_script.hello_world` with parameters +- Start Home Assistant +- Call service `python_script.hello_world` with parameters ```yaml name: you @@ -62,6 +62,7 @@ if entity_id is not None: service_data = {"entity_id": entity_id, "rgb_color": rgb_color, "brightness": 255} hass.services.call("light", "turn_on", service_data, False) ``` + The above `python_script` can be called using the following YAML as an input. ```yaml @@ -78,7 +79,7 @@ You can add descriptions for your Python scripts that will be shown in the Call ```yaml # services.yaml turn_on_light: - description: Turn on a light and set its color. + description: Turn on a light and set its color. fields: entity_id: description: The light that will be turned on. diff --git a/source/_integrations/raincloud.markdown b/source/_integrations/raincloud.markdown index dcb6b3b5063..c682c0e2170 100644 --- a/source/_integrations/raincloud.markdown +++ b/source/_integrations/raincloud.markdown @@ -1,7 +1,6 @@ --- title: Melnor RainCloud description: Instructions on how to integrate your Melnor Raincloud sprinkler system within Home Assistant. -logo: raincloud.jpg ha_category: - Irrigation - Binary Sensor diff --git a/source/_integrations/rejseplanen.markdown b/source/_integrations/rejseplanen.markdown index 7c41be042f9..8942066bb08 100644 --- a/source/_integrations/rejseplanen.markdown +++ b/source/_integrations/rejseplanen.markdown @@ -10,31 +10,6 @@ ha_domain: rejseplanen The `rejseplanen` sensor will provide you with travel details for Danish public transport, using timetable data from [Rejseplanen](https://www.rejseplanen.dk/). -## Setup - -The `stop_id` can be obtained through the following steps: - -If you know the exact name of the stop you can search the stop_id with the following URL [http://xmlopen.rejseplanen.dk/bin/rest.exe/location?format=json&input=STOP_NAME](http://xmlopen.rejseplanen.dk/bin/rest.exe/location?format=json&input=STOP_NAME) and put in the name of the stop instead of "STOP_NAME" in the end of the URL. - -If you don't know the name of the stop follow this guide: -- Go to [https://www.openstreetmap.org](https://www.openstreetmap.org) -- Make a search and fill in the location you want to find for. -- The URL will look like this [https://www.openstreetmap.org/#map=18/56.15756/10.20674](https://www.openstreetmap.org/#map=18/56.15756/10.20674) -- Now insert the coordinates for the location in the URL, in this example it will be: [http://xmlopen.rejseplanen.dk/bin/rest.exe/stopsNearby?coordX=56.15756&coordY=10.20674&](http://xmlopen.rejseplanen.dk/bin/rest.exe/stopsNearby?coordX=56.15756&coordY=10.20674&) -- You will now see the 30 stops closest to your location. - -You will see an output like this: - -```text -"StopLocation":[{ - "name":"Engdalsvej/Århusvej (Favrskov Kom)", - "x":"10078598", - "y":"56243456", - "id":"713000702" -``` - -Find the name of your stop in the list and the "id" is the one you are looking for to us as value for `stop_id:`. - ## Configuration Add a sensor to your `configuration.yaml` file as shown in the example: @@ -70,13 +45,46 @@ departure_type: type: [string, list] {% endconfiguration %} +## stop_id + +The `stop_id` can be obtained through the following steps: + +- Go to [https://www.openstreetmap.org](https://www.openstreetmap.org) +- Make a search and fill in the location you want to find for. +- The URL will look like this [https://www.openstreetmap.org/#map=18/56.15756/10.20674](https://www.openstreetmap.org/#map=18/56.15756/10.20674) +- Now insert the coordinates for the location in the URL, in this example it will be: [http://xmlopen.rejseplanen.dk/bin/rest.exe/stopsNearby?coordX=56.15756&coordY=10.20674&](http://xmlopen.rejseplanen.dk/bin/rest.exe/stopsNearby?coordX=56.15756&coordY=10.20674&) +- You will now see the 30 stops closest to your location. + +You will see an output like this: + +```text +"StopLocation":[{ + "name":"Engdalsvej/Århusvej (Favrskov Kom)", + "x":"10078598", + "y":"56243456", + "id":"713000702" +``` + +Find the name of your stop in the list and the "id" is the one you are looking for to us as value for `stop_id:`. + ## Direction If you use the `direction` filter it's important to put correct final destination(s) or else the sensor will not work at all. The `direction` has to be the final destination(s) for the `Departure type` - ***NOT the stop where you want to get off***. -- Check [https://rejseplanen.dk/](https://rejseplanen.dk/) -- Make a search and use **all variations** for the final destination(s) for the needed `Departure type` in your configuration under `direction`. Make sure you use the exact name for final destination(s). +- Replace YOUR_STOP_ID with the id for your stop and go to [http://xmlopen.rejseplanen.dk/bin/rest.exe/departureBoard?id=YOUR_STOP_ID](http://xmlopen.rejseplanen.dk/bin/rest.exe/departureBoard?id=YOUR_STOP_ID) +- The values under `finalStop` is the ones you need to put under `direction`. Make sure you use the exact name and insert all possible finalstops. + +You will see an output like this: + +```text + + + + + + +``` A working example on how to use this sensor with direction: @@ -84,25 +92,30 @@ A working example on how to use this sensor with direction: # Example configuration.yaml entry with the correct use of direction. sensor: - platform: rejseplanen - stop_id: '008600615' + stop_id: '713000702' direction: - - 'CPH Lufthavn' - - 'Helsingør St.' + - 'Bjergegårdsvej/Rylevej (Favrskov Kom)' + - 'Skanderborg Busterminal (Skanderborg Kom)' ``` -A NOT WORKING example use this sensor with direction: +## Route -```yaml -# Example configuration.yaml entry with the correct use of direction. -sensor: - - platform: rejseplanen - stop_id: '008600615' - direction: - - 'København H' +If you use the `route` filter it's important to put correct route name(s) or else the sensor will not work at all. + +- Replace YOUR_STOP_ID with the id for your stop and go to [http://xmlopen.rejseplanen.dk/bin/rest.exe/departureBoard?id=YOUR_STOP_ID](http://xmlopen.rejseplanen.dk/bin/rest.exe/departureBoard?id=YOUR_STOP_ID) +- The values under `Departure name` is the ones you need to put under `route`. Make sure you use the exact name. + +You will see an output like this: + +```text + + + + + + ``` -It fails because the final destination for the train from the departure station is NOT 'københavn H', but 'CPH Lufthavn' and 'Helsingør St.'. - ## Examples A more extensive example on how to use this sensor: diff --git a/source/_integrations/roomba.markdown b/source/_integrations/roomba.markdown index 64fce7992ca..e49507045db 100644 --- a/source/_integrations/roomba.markdown +++ b/source/_integrations/roomba.markdown @@ -21,7 +21,7 @@ The `roomba` integration allows you to control your [iRobot Roomba](https://www.

      -This platform has been tested and is confirmed to be working with the iRobot Roomba s9+, Roomba 980, Roomba 890, and Braava jet m6 models, but should also work fine with any Wi-Fi enabled Roomba or Braava like the 690 or the 960. +This platform has been tested and is confirmed to be working with the iRobot Roomba s9+, Roomba 980, Roomba 960, Roomba 890, and Braava jet m6 models, but should also work fine with any Wi-Fi enabled Roomba or Braava like the 690.
      ## Configuration @@ -51,11 +51,6 @@ password: description: The password for your device. required: true type: string -certificate: - description: "**(Deprecated)** Path to your certificate store." - required: false - type: string - default: /etc/ssl/certs/ca-certificates.crt continuous: description: Whether to operate in continuous mode. required: false diff --git a/source/_integrations/smtp.markdown b/source/_integrations/smtp.markdown index e85b8242cba..9d0e3ee7ac5 100644 --- a/source/_integrations/smtp.markdown +++ b/source/_integrations/smtp.markdown @@ -181,9 +181,7 @@ The optional `html` field makes a custom text/HTML multi-part message, allowing - ``` -Obviously, this kind of complex html email reporting is done much more conveniently using Jinja2 templating from an [AppDaemon app](/docs/ecosystem/appdaemon/tutorial/), for example. This platform is fragile and not able to catch all exceptions in a smart way because of the large number of possible configuration combinations. diff --git a/source/_integrations/synology_dsm.markdown b/source/_integrations/synology_dsm.markdown index d45bd38c218..00511427100 100644 --- a/source/_integrations/synology_dsm.markdown +++ b/source/_integrations/synology_dsm.markdown @@ -12,15 +12,15 @@ ha_codeowners: ha_config_flow: true --- -The `synology_dsm` sensor platform allows getting various statistics from your [Synology NAS](https://www.synology.com). +The `synology_dsm` sensor platform provides access to various statistics from your [Synology NAS](https://www.synology.com). ## Configuration -There are two ways to integrate Synology DSM in Home Assistant. +There are two ways to integrate your Synology DSM into Home Assistant. ### Via the frontend -Menu: *Configuration* -> *Integrations*. Search for "Synology DSM", fill the configuration form, click submit. +Menu: *Configuration* -> *Integrations*. Search for "Synology DSM", fill in the configuration form with your username and password, and then click **Submit**. ### Via the configuration file @@ -29,14 +29,14 @@ Add the following section to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry synology_dsm: - - host: IP_ADDRESS_OR_DNS_OF_SYNOLOGY_NAS + - host: IP_ADDRESS_OR_HOSTNAME_OF_SYNOLOGY_NAS username: YOUR_USERNAME password: YOUR_PASSWORD ``` {% configuration %} host: - description: The IP address or DNS of the Synology NAS to monitor. + description: The IP address or DNS hostname of the Synology NAS to monitor. required: true type: string port: @@ -50,7 +50,7 @@ ssl: default: true type: boolean username: - description: An user to connect to the Synology NAS (a separate account is advised, see the (Separate User Configuration)[#separate-user-configuration] section below for details). + description: The account username to connect to the Synology NAS. Using a separate account is advised, see the [Separate User Configuration](#separate-user-configuration) section below for details. required: true type: string password: @@ -58,11 +58,11 @@ password: required: true type: string volumes: - description: "Array of volumes to monitor. Defaults to all volumes. Replace any spaces in the volume name with underscores, e.g., `volume 1` with `volume_1`." + description: "Array of volumes to monitor. Defaults to all volumes. Replace any spaces in the volume name with underscores. For example, replace `volume 1` with `volume_1`." required: false type: list disks: - description: "Array of disks to monitor. Defaults to all disks. Use only disk names like `sda`, `sdb`, etc." + description: "Array of disks to monitor. Defaults to all disks. Use only disk names like `sda`, `sdb`, and so on." required: false type: list {% endconfiguration %} @@ -82,15 +82,15 @@ When creating the user, it is possible to deny access to all locations and appli
      -Using two-factor authentication is not supported. Please use a strong, randomly generated password. +The Home Assistant integration doesn't support two-factor authentication for Synology DSM accounts. Use a strong, randomly generated password to improve security.
      ## Created sensors -Sensors are : -- `cpu_other_load`: Displays unspecified load in percentage. +Sensors are: +- `cpu_other_load`: Displays unspecified (that is, not user or system) load in percentage. - `cpu_user_load`: Displays user load in percentage. - `cpu_system_load`: Displays system load in percentage. - `cpu_total_load`: Displays combined load in percentage. diff --git a/source/_integrations/telegram_bot.markdown b/source/_integrations/telegram_bot.markdown index d64b52b4d99..9e022820e88 100644 --- a/source/_integrations/telegram_bot.markdown +++ b/source/_integrations/telegram_bot.markdown @@ -275,6 +275,7 @@ action: An example to show the use of event_data in action: {% raw %} + ```yaml - alias: 'Kitchen Telegram Speak' trigger: @@ -288,6 +289,7 @@ An example to show the use of event_data in action: message: > Message from {{ trigger.event.data["from_first"] }}. {% for state in trigger.event.data["args"] %} {{ state }} {% endfor %} ``` + {% endraw %} ### Sample automations with callback queries and inline keyboards @@ -301,6 +303,7 @@ A quick example to show some of the callback capabilities of inline keyboards wi Text repeater: {% raw %} + ```yaml - alias: 'Telegram bot that repeats text' trigger: @@ -317,11 +320,13 @@ Text repeater: - "Edit message:/edit_msg, Don't:/do_nothing" - "Remove this button:/remove button" ``` + {% endraw %} Message editor: {% raw %} + ```yaml - alias: 'Telegram bot that edits the last sent message' trigger: @@ -348,11 +353,13 @@ Message editor: Message id: {{ trigger.event.data.message.message_id }}. Data: {{ trigger.event.data.data }} ``` + {% endraw %} Keyboard editor: {% raw %} + ```yaml - alias: 'Telegram bot that edits the keyboard' trigger: @@ -372,11 +379,13 @@ Keyboard editor: inline_keyboard: - "Edit message:/edit_msg, Don't:/do_nothing" ``` + {% endraw %} Only acknowledges the 'NO' answer: {% raw %} + ```yaml - alias: 'Telegram bot that simply acknowledges' trigger: @@ -390,11 +399,13 @@ Only acknowledges the 'NO' answer: callback_query_id: '{{ trigger.event.data.id }}' message: 'OK, you said no!' ``` + {% endraw %} Telegram callbacks also support arguments and commands the same way as normal messages. {% raw %} + ```yaml - alias: 'Telegram bot repeats arguments on callback query' trigger: @@ -409,102 +420,7 @@ Telegram callbacks also support arguments and commands the same way as normal me callback_query_id: '{{ trigger.event.data.id }}' message: 'I repeat: {{trigger.event.data["args"]}}' ``` + {% endraw %} In this case, having a callback with `/repeat 1 2 3` with pop a notification saying `I repeat: [1, 2, 3]` - - -For a more complex usage of the `telegram_bot` capabilities, using [AppDaemon](/docs/ecosystem/appdaemon/tutorial/) is advised. - -This is how the previous 4 automations would be through a simple AppDaemon app: - -```python -import appdaemon.plugins.hass.hassapi as hass - - -class TelegramBotEventListener(hass.Hass): - """Event listener for Telegram bot events.""" - - def initialize(self): - """Listen to Telegram Bot events of interest.""" - self.listen_event(self.receive_telegram_text, "telegram_text") - self.listen_event(self.receive_telegram_callback, "telegram_callback") - - def receive_telegram_text(self, event_id, payload_event, *args): - """Text repeater.""" - assert event_id == "telegram_text" - user_id = payload_event["user_id"] - msg = "You said: ``` %s ```" % payload_event["text"] - keyboard = [ - [("Edit message", "/edit_msg"), ("Don't", "/do_nothing")], - [("Remove this button", "/remove button")], - ] - self.call_service( - "telegram_bot/send_message", - title="*Dumb automation*", - target=user_id, - message=msg, - disable_notification=True, - inline_keyboard=keyboard, - ) - - def receive_telegram_callback(self, event_id, payload_event, *args): - """Event listener for Telegram callback queries.""" - assert event_id == "telegram_callback" - data_callback = payload_event["data"] - callback_id = payload_event["id"] - chat_id = payload_event["chat_id"] - # keyboard = ["Edit message:/edit_msg, Don't:/do_nothing", - # "Remove this button:/remove button"] - keyboard = [ - [("Edit message", "/edit_msg"), ("Don't", "/do_nothing")], - [("Remove this button", "/remove button")], - ] - - if data_callback == "/edit_msg": # Message editor: - # Answer callback query - self.call_service( - "telegram_bot/answer_callback_query", - message="Editing the message!", - callback_query_id=callback_id, - show_alert=True, - ) - - # Edit the message origin of the callback query - msg_id = payload_event["message"]["message_id"] - user = payload_event["from_first"] - title = "*Message edit*" - msg = "Callback received from %s. Message id: %s. Data: ``` %s ```" - self.call_service( - "telegram_bot/edit_message", - chat_id=chat_id, - message_id=msg_id, - title=title, - message=msg % (user, msg_id, data_callback), - inline_keyboard=keyboard, - ) - - elif data_callback == "/remove button": # Keyboard editor: - # Answer callback query - self.call_service( - "telegram_bot/answer_callback_query", - message="Callback received for editing the " "inline keyboard!", - callback_query_id=callback_id, - ) - - # Edit the keyboard - new_keyboard = keyboard[:1] - self.call_service( - "telegram_bot/edit_replymarkup", - chat_id=chat_id, - message_id="last", - inline_keyboard=new_keyboard, - ) - - elif data_callback == "/do_nothing": # Only Answer to callback query - self.call_service( - "telegram_bot/answer_callback_query", - message="OK, you said no!", - callback_query_id=callback_id, - ) -``` diff --git a/source/_integrations/webostv.markdown b/source/_integrations/webostv.markdown index 58eba00cba2..a2cd1500561 100644 --- a/source/_integrations/webostv.markdown +++ b/source/_integrations/webostv.markdown @@ -211,6 +211,20 @@ script: command: "media.controls/rewind" ``` +## Consecutive volume steps delay + +In the case where a sound output that only supports relative volume stepping is used, the receiving speaker may have issues dealing with several volume step commands arriving at the same time. Therefore it's possible to configure a time delay so that at least the configured amount of time has elapsed between two consecutive volume steps before the second one is fired. The configured value is in milliseconds. + +```yaml +# Example +webostv: + host: 192.168.0.10 + name: Living Room TV + consecutive_volume_steps_delay: 300 + +media_player: +``` + ## Notifications The `webostv` notify platform allows you to send notifications to a LG webOS Smart TV. diff --git a/source/_integrations/yandextts.markdown b/source/_integrations/yandextts.markdown index 7c0f366be21..b92b614eb25 100644 --- a/source/_integrations/yandextts.markdown +++ b/source/_integrations/yandextts.markdown @@ -10,9 +10,7 @@ ha_domain: yandextts The `yandextts` text-to-speech platform uses [Yandex SpeechKit](https://tech.yandex.com/speechkit/) Text-to-Speech engine to read a text with natural sounding voices.
      -This integration is working only with old API keys. - -For the new API keys this intergration is not working. There is a custom component that is working with new API keys [Yandex-tts-speechkit-FIX](https://github.com/tayanov/Yandex-tts-speechkit-FIX). +This integration is working only with old API keys. For the new API keys, this integration cannot be used.
      ## Configuration diff --git a/source/_posts/2020-04-29-release-109.markdown b/source/_posts/2020-04-29-release-109.markdown index c86a1ee8f2f..be8755797ea 100644 --- a/source/_posts/2020-04-29-release-109.markdown +++ b/source/_posts/2020-04-29-release-109.markdown @@ -530,6 +530,50 @@ Pushetta has been offline since September 2019 and the Yahoo Weather API has bee [uvc docs]: /integrations/uvc/ [websocket_api docs]: /integrations/websocket_api/ +## Release 0.109.5 - May 6 + +- Add retry on empty modbus messages for serial protocol ([@janiversen] - [#34678]) ([modbus docs]) +- Change Modbus switch to use verify_register when defined ([@janiversen] - [#34679]) ([modbus docs]) +- Catch samsungtv timeout exception ([@escoand] - [#35205]) ([samsungtv docs]) +- Broader Notion exception handling ([@bachya] - [#35265]) ([notion docs]) +- UniFi - Support SSID filter of SSIDs from access points with extra configuration ([@Kane610] - [#35295]) ([unifi docs]) +- Fix SMS doing I/O in event loop ([@balloob] - [#35313]) ([sms docs]) + +[#34678]: https://github.com/home-assistant/core/pull/34678 +[#34679]: https://github.com/home-assistant/core/pull/34679 +[#35205]: https://github.com/home-assistant/core/pull/35205 +[#35265]: https://github.com/home-assistant/core/pull/35265 +[#35295]: https://github.com/home-assistant/core/pull/35295 +[#35313]: https://github.com/home-assistant/core/pull/35313 +[@Kane610]: https://github.com/Kane610 +[@bachya]: https://github.com/bachya +[@balloob]: https://github.com/balloob +[@escoand]: https://github.com/escoand +[@janiversen]: https://github.com/janiversen +[modbus docs]: /integrations/modbus/ +[notion docs]: /integrations/notion/ +[samsungtv docs]: /integrations/samsungtv/ +[sms docs]: /integrations/sms/ +[unifi docs]: /integrations/unifi/ + +## Release 0.109.6 - May 7 + +- Fix roomba 980 position report ([@shenxn] - [#35316]) ([roomba docs]) +- Update pymyq to 2.0.2 ([@bdraco] - [#35330]) ([myq docs]) +- Fix Synology DSM discovery can't be ignored ([@Quentame] - [#35331]) ([synology_dsm docs]) +- Remove panasonic_viera from legacy discovery (@joogps - #34909) +- Fix Islamic prayer sensor timestamp format (@engrbm87 - #35243) + +[#35316]: https://github.com/home-assistant/core/pull/35316 +[#35330]: https://github.com/home-assistant/core/pull/35330 +[#35331]: https://github.com/home-assistant/core/pull/35331 +[@Quentame]: https://github.com/Quentame +[@bdraco]: https://github.com/bdraco +[@shenxn]: https://github.com/shenxn +[myq docs]: /integrations/myq/ +[roomba docs]: /integrations/roomba/ +[synology_dsm docs]: /integrations/synology_dsm/ + ## All changes
      diff --git a/source/docs/index.markdown b/source/docs/index.markdown index 4ccf6afac68..2695c2a6e34 100644 --- a/source/docs/index.markdown +++ b/source/docs/index.markdown @@ -36,11 +36,11 @@ The documentation covers beginner to advanced topics around the installation, se
      Lovelace user interface
      - +
      - +
      -
      iOS
      +
      Android and iOS
      diff --git a/source/hassio/installation.markdown b/source/hassio/installation.markdown index adaca16c481..17a3b5cfdef 100644 --- a/source/hassio/installation.markdown +++ b/source/hassio/installation.markdown @@ -104,94 +104,6 @@ If you would like to test next release before anyone else, you can install the b 3. Select _System_ tab from the _Supervisor_ menu, then select _Join Beta Channel_ under _Supervisor_, then select _Reload_. 4. Select _Dashboard_ tab from the _Supervisor_ menu, and then select _Update_. -## Alternative: install Home Assistant Supervised on a generic Linux host - -You can also install Home Assistant on a Linux operating system of choice, called Home Assistant Supervised. - -Home Assistant Supervised, will still give you access to most features Home Assistant has to offer, including add-ons. - -
      - -The Supervisord system is designed to provide a full-featured environment that is comparable with Kubernetes, which is also a bad idea to run it by the side of another orchestrator on the same Host. The Supervisor is also not caring for other software they run on your Host, and it can affect things bad on both sides. You also need to know that the Home Assistant OS runs with less overhead on your Proxmox or other Hypervisor as if you install first Debian and Ubuntu. In most cases, it's not the best choice to run the Supervisord on top of a Linux, if you not 100% sure what you do. **It is not just a container inside Docker!** - -
      - -### Supported systems and limitations - -While Home Assistant Supervised can be run on practically any Linux systems, -the Home Assistant project limits support for this installation method. - -Only the use of Debian or Ubuntu is supported. Other Linux-based system may work -but is not part of our testing and thus not supported. - -Furthermore, if you choose to run Home Assistant Supervised, the operating -system of your choosing (including Debian/Ubuntu) is **your** responsibility. -Both in terms of systems upgrade and system configuration. - -Customizations to your custom operating system may interfere with Home Assistant. -For that reason, please be sure you have to knowledge to manage, configure and -maintain the operating system of your choosing. - -When in doubt, we highly recommend using the regular installation of Home -Assistant as provided above. In that case, Home Assistant will manage and update -the Home Assistant Operating System for you. - -### Preparation - -To prepare your machine for the Home Assistant installation, run the following commands: - -If you run Ubuntu, first run this command: - -```bash -sudo add-apt-repository universe -``` - -Next run the following commands (for both Debian and Ubuntu): - -```bash -sudo -i -apt-get update -apt-get install -y software-properties-common apparmor-utils apt-transport-https avahi-daemon ca-certificates curl dbus jq network-manager socat -systemctl disable ModemManager -systemctl stop ModemManager -curl -fsSL get.docker.com | sh -``` - -### Installation of Home Assistant Supervised - -The following script will then install Home Assistant on a variety of operating systems and machine types. - -```bash -curl -sL "https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh" | bash -s -``` - -Some installation types require flags to identify the computer type, for example, when using a Raspberry Pi 4, the flag `-- -m raspberrypi4` is required. The install script would then look like this: - -```bash -curl -sL "https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh" | bash -s -- -m raspberrypi4 -``` - -#### Other machine types - -- `intel-nuc` -- `raspberrypi` -- `raspberrypi2` -- `raspberrypi3` -- `raspberrypi3-64` -- `raspberrypi4` -- `raspberrypi4-64` -- `odroid-c2` -- `odroid-n2` -- `odroid-xu` -- `tinker` -- `qemuarm` -- `qemuarm-64` -- `qemux86` -- `qemux86-64` - -See the [installer](https://github.com/home-assistant/supervised-installer) GitHub page for an up-to-date listing of supported machine types. - -If you can not find your machine type in the list, you should pick the `qemu` release. i.e., `qemux86-64` for a normal 64-bit Linux distribution, or `qemuarm-64` for most modern ARM-based target like Raspberry Pi clones, or TV boxes. [balenaEtcher]: https://www.balena.io/etcher [hassos-network]: https://github.com/home-assistant/operating-system/blob/dev/Documentation/network.md @@ -204,15 +116,14 @@ If you can not find your machine type in the list, you should pick the `qemu` re [pi4-64]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_rpi4-64-3.13.img.gz [tinker]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_tinker-3.13.img.gz [odroid-c2]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_odroid-c2-3.13.img.gz -[odroid-n2]: https://github.com/home-assistant/operating-system/releases/download/4.5/hassos_odroid-n2-4.5.img.gz +[odroid-n2]: https://github.com/home-assistant/operating-system/releases/download/4.6/hassos_odroid-n2-4.6.img.gz [odroid-xu4]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_odroid-xu4-3.13.img.gz [intel-nuc]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_intel-nuc-3.13.img.gz [vmdk]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_ova-3.13.vmdk.gz [vhdx]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_ova-3.13.vhdx.gz [vdi]: https://github.com/home-assistant/operating-system/releases/download/3.13/hassos_ova-3.13.vdi.gz -[qcow2]: https://github.com/home-assistant/operating-system/releases/download/4.5/hassos_ova-4.5.vdi.gz -[Virtual Appliance]: https://github.com/home-assistant/operating-system/releases/download/4.5/hassos_ova-4.5.ova -[linux]: https://github.com/home-assistant/supervised-installer +[qcow2]: https://github.com/home-assistant/operating-system/releases/download/4.6/hassos_ova-4.6.qcow2.gz +[Virtual Appliance]: https://github.com/home-assistant/operating-system/releases/download/4.6/hassos_ova-4.6.ova [local]: http://homeassistant.local:8123 [samba]: /addons/samba/ [ssh]: /addons/ssh/ diff --git a/source/images/architecture/home_automation_landscape.png b/source/images/architecture/home_automation_landscape.png index 335d89ca27c..1e91727745b 100644 Binary files a/source/images/architecture/home_automation_landscape.png and b/source/images/architecture/home_automation_landscape.png differ diff --git a/source/images/blog/2015-09-glances/sensors.png b/source/images/blog/2015-09-glances/sensors.png index 40ecc50995a..ec2e0a91df7 100644 Binary files a/source/images/blog/2015-09-glances/sensors.png and b/source/images/blog/2015-09-glances/sensors.png differ diff --git a/source/images/blog/2015-09-glances/web-glances.png b/source/images/blog/2015-09-glances/web-glances.png index 5b8a4a18c90..5a0b4ce5a38 100644 Binary files a/source/images/blog/2015-09-glances/web-glances.png and b/source/images/blog/2015-09-glances/web-glances.png differ diff --git a/source/images/blog/2015-09-ifttt/og_facebook.png b/source/images/blog/2015-09-ifttt/og_facebook.png index db826604b58..f24d78ccc43 100644 Binary files a/source/images/blog/2015-09-ifttt/og_facebook.png and b/source/images/blog/2015-09-ifttt/og_facebook.png differ diff --git a/source/images/blog/2015-09-ifttt/recipe-do.png b/source/images/blog/2015-09-ifttt/recipe-do.png index cbbc253a42d..efbffc2723b 100644 Binary files a/source/images/blog/2015-09-ifttt/recipe-do.png and b/source/images/blog/2015-09-ifttt/recipe-do.png differ diff --git a/source/images/blog/2015-09-ifttt/recipe-geo.png b/source/images/blog/2015-09-ifttt/recipe-geo.png index 9a67a669e1b..542f6160084 100644 Binary files a/source/images/blog/2015-09-ifttt/recipe-geo.png and b/source/images/blog/2015-09-ifttt/recipe-geo.png differ diff --git a/source/images/blog/2015-09-ifttt/recipe-github.png b/source/images/blog/2015-09-ifttt/recipe-github.png index fd5f1065ada..a50e09fb560 100644 Binary files a/source/images/blog/2015-09-ifttt/recipe-github.png and b/source/images/blog/2015-09-ifttt/recipe-github.png differ diff --git a/source/images/blog/2015-09-ifttt/recipe-twitter.png b/source/images/blog/2015-09-ifttt/recipe-twitter.png index 159ad29ec76..dd5cd75697d 100644 Binary files a/source/images/blog/2015-09-ifttt/recipe-twitter.png and b/source/images/blog/2015-09-ifttt/recipe-twitter.png differ diff --git a/source/images/blog/2015-09-ifttt/recipe-weather.png b/source/images/blog/2015-09-ifttt/recipe-weather.png index 2011bb42de7..9a8da4bd670 100644 Binary files a/source/images/blog/2015-09-ifttt/recipe-weather.png and b/source/images/blog/2015-09-ifttt/recipe-weather.png differ diff --git a/source/images/blog/2015-09-mqtt/arduino-shield.png b/source/images/blog/2015-09-mqtt/arduino-shield.png index ab1821e0d3a..e0173446834 100644 Binary files a/source/images/blog/2015-09-mqtt/arduino-shield.png and b/source/images/blog/2015-09-mqtt/arduino-shield.png differ diff --git a/source/images/blog/2015-09-mqtt/arduino.png b/source/images/blog/2015-09-mqtt/arduino.png index 4c40ba3e024..58c32835a53 100644 Binary files a/source/images/blog/2015-09-mqtt/arduino.png and b/source/images/blog/2015-09-mqtt/arduino.png differ diff --git a/source/images/blog/2015-09-mqtt/lottery.png b/source/images/blog/2015-09-mqtt/lottery.png index fcb5b64565f..52eabba1dfa 100644 Binary files a/source/images/blog/2015-09-mqtt/lottery.png and b/source/images/blog/2015-09-mqtt/lottery.png differ diff --git a/source/images/blog/2015-09-mqtt/mood.png b/source/images/blog/2015-09-mqtt/mood.png index ec5ddb4d53b..58aec8bf66e 100644 Binary files a/source/images/blog/2015-09-mqtt/mood.png and b/source/images/blog/2015-09-mqtt/mood.png differ diff --git a/source/images/blog/2015-10-esp8266-temp/ha-sensor.png b/source/images/blog/2015-10-esp8266-temp/ha-sensor.png index ea0a2797ac2..33b2d2e7f25 100644 Binary files a/source/images/blog/2015-10-esp8266-temp/ha-sensor.png and b/source/images/blog/2015-10-esp8266-temp/ha-sensor.png differ diff --git a/source/images/blog/2015-11-survey/alarm-cameras.png b/source/images/blog/2015-11-survey/alarm-cameras.png index 8360a8533bb..32b30faee94 100644 Binary files a/source/images/blog/2015-11-survey/alarm-cameras.png and b/source/images/blog/2015-11-survey/alarm-cameras.png differ diff --git a/source/images/blog/2015-11-survey/components.png b/source/images/blog/2015-11-survey/components.png index 60aab2955d3..d7dc07ce415 100644 Binary files a/source/images/blog/2015-11-survey/components.png and b/source/images/blog/2015-11-survey/components.png differ diff --git a/source/images/blog/2015-11-survey/lights.png b/source/images/blog/2015-11-survey/lights.png index fa8b0d9b835..8f7ebb7f18a 100644 Binary files a/source/images/blog/2015-11-survey/lights.png and b/source/images/blog/2015-11-survey/lights.png differ diff --git a/source/images/blog/2015-11-survey/notifications.png b/source/images/blog/2015-11-survey/notifications.png index 1f5c706d351..12715da1ddc 100644 Binary files a/source/images/blog/2015-11-survey/notifications.png and b/source/images/blog/2015-11-survey/notifications.png differ diff --git a/source/images/blog/2015-11-survey/os.png b/source/images/blog/2015-11-survey/os.png index cd36342dd2a..0625bb3c026 100644 Binary files a/source/images/blog/2015-11-survey/os.png and b/source/images/blog/2015-11-survey/os.png differ diff --git a/source/images/blog/2015-11-survey/platforms.png b/source/images/blog/2015-11-survey/platforms.png index 5d09811d956..8b47b04a81d 100644 Binary files a/source/images/blog/2015-11-survey/platforms.png and b/source/images/blog/2015-11-survey/platforms.png differ diff --git a/source/images/blog/2015-11-survey/players.png b/source/images/blog/2015-11-survey/players.png index b429aebc237..d5fe2e59dab 100644 Binary files a/source/images/blog/2015-11-survey/players.png and b/source/images/blog/2015-11-survey/players.png differ diff --git a/source/images/blog/2015-11-survey/releases.png b/source/images/blog/2015-11-survey/releases.png index ee5dafea54b..61aa44f4929 100644 Binary files a/source/images/blog/2015-11-survey/releases.png and b/source/images/blog/2015-11-survey/releases.png differ diff --git a/source/images/blog/2015-11-survey/sensors.png b/source/images/blog/2015-11-survey/sensors.png index a5dfb729f3d..b0190afd351 100644 Binary files a/source/images/blog/2015-11-survey/sensors.png and b/source/images/blog/2015-11-survey/sensors.png differ diff --git a/source/images/blog/2015-11-survey/switches.png b/source/images/blog/2015-11-survey/switches.png index 1e1dbf69935..e093c585e3e 100644 Binary files a/source/images/blog/2015-11-survey/switches.png and b/source/images/blog/2015-11-survey/switches.png differ diff --git a/source/images/blog/2015-11-survey/thermostats.png b/source/images/blog/2015-11-survey/thermostats.png index e5d946fe3f8..047ed00fbbe 100644 Binary files a/source/images/blog/2015-11-survey/thermostats.png and b/source/images/blog/2015-11-survey/thermostats.png differ diff --git a/source/images/blog/2015-11-survey/trackers.png b/source/images/blog/2015-11-survey/trackers.png index a6d2aa79f22..8aed00933e1 100644 Binary files a/source/images/blog/2015-11-survey/trackers.png and b/source/images/blog/2015-11-survey/trackers.png differ diff --git a/source/images/blog/2015-12-influxdb/grafana-graph.png b/source/images/blog/2015-12-influxdb/grafana-graph.png index 3ddb7417006..002d1eaa444 100644 Binary files a/source/images/blog/2015-12-influxdb/grafana-graph.png and b/source/images/blog/2015-12-influxdb/grafana-graph.png differ diff --git a/source/images/blog/2015-12-influxdb/grafana-settings.png b/source/images/blog/2015-12-influxdb/grafana-settings.png index 1334362b0b5..c49a7be37bb 100644 Binary files a/source/images/blog/2015-12-influxdb/grafana-settings.png and b/source/images/blog/2015-12-influxdb/grafana-settings.png differ diff --git a/source/images/blog/2015-12-influxdb/influxdb-frontend.png b/source/images/blog/2015-12-influxdb/influxdb-frontend.png index c1badb913e6..2a0ec5f08ba 100644 Binary files a/source/images/blog/2015-12-influxdb/influxdb-frontend.png and b/source/images/blog/2015-12-influxdb/influxdb-frontend.png differ diff --git a/source/images/blog/2015-12-lets-encrypt/letsencrypt-secured-fb.png b/source/images/blog/2015-12-lets-encrypt/letsencrypt-secured-fb.png index 06276e82659..f57c251a8f5 100644 Binary files a/source/images/blog/2015-12-lets-encrypt/letsencrypt-secured-fb.png and b/source/images/blog/2015-12-lets-encrypt/letsencrypt-secured-fb.png differ diff --git a/source/images/blog/2015-12-philips-hue-3rd-party/mirror.png b/source/images/blog/2015-12-philips-hue-3rd-party/mirror.png index 26f4367bcc3..ac6a4c0fcfe 100644 Binary files a/source/images/blog/2015-12-philips-hue-3rd-party/mirror.png and b/source/images/blog/2015-12-philips-hue-3rd-party/mirror.png differ diff --git a/source/images/blog/2015-12-release-09/facebook-09.png b/source/images/blog/2015-12-release-09/facebook-09.png index 268e1e1c8ec..8b9c54693b1 100644 Binary files a/source/images/blog/2015-12-release-09/facebook-09.png and b/source/images/blog/2015-12-release-09/facebook-09.png differ diff --git a/source/images/blog/2015-12-release-10/alexa-fb.png b/source/images/blog/2015-12-release-10/alexa-fb.png index ac9ce98ec1c..85514e8752c 100644 Binary files a/source/images/blog/2015-12-release-10/alexa-fb.png and b/source/images/blog/2015-12-release-10/alexa-fb.png differ diff --git a/source/images/blog/2015-12-tasker/screenshot-1.png b/source/images/blog/2015-12-tasker/screenshot-1.png index 1b9533b79ec..be07561f696 100644 Binary files a/source/images/blog/2015-12-tasker/screenshot-1.png and b/source/images/blog/2015-12-tasker/screenshot-1.png differ diff --git a/source/images/blog/2015-12-tasker/screenshot-3.png b/source/images/blog/2015-12-tasker/screenshot-3.png index 9ec8dc258c4..2a885ae31a8 100644 Binary files a/source/images/blog/2015-12-tasker/screenshot-3.png and b/source/images/blog/2015-12-tasker/screenshot-3.png differ diff --git a/source/images/blog/2015-12-tasker/tasker-logo.png b/source/images/blog/2015-12-tasker/tasker-logo.png index 7dbc07411c9..0c09d7de968 100644 Binary files a/source/images/blog/2015-12-tasker/tasker-logo.png and b/source/images/blog/2015-12-tasker/tasker-logo.png differ diff --git a/source/images/blog/2016-01-release-12/social.png b/source/images/blog/2016-01-release-12/social.png index af3eb9c7cd7..ce37471b8d1 100644 Binary files a/source/images/blog/2016-01-release-12/social.png and b/source/images/blog/2016-01-release-12/social.png differ diff --git a/source/images/blog/2016-01-release-12/views.png b/source/images/blog/2016-01-release-12/views.png index 2791d17cb49..976fdbabdcb 100644 Binary files a/source/images/blog/2016-01-release-12/views.png and b/source/images/blog/2016-01-release-12/views.png differ diff --git a/source/images/blog/2016-02-classifying-internet-of-things/social.png b/source/images/blog/2016-02-classifying-internet-of-things/social.png index 9588c3b8b76..6d47d24a2c4 100644 Binary files a/source/images/blog/2016-02-classifying-internet-of-things/social.png and b/source/images/blog/2016-02-classifying-internet-of-things/social.png differ diff --git a/source/images/blog/2016-02-release-13/input_select__input_boolean__weblink.png b/source/images/blog/2016-02-release-13/input_select__input_boolean__weblink.png index 08f72f7d2c4..e9dcce510e6 100644 Binary files a/source/images/blog/2016-02-release-13/input_select__input_boolean__weblink.png and b/source/images/blog/2016-02-release-13/input_select__input_boolean__weblink.png differ diff --git a/source/images/blog/2016-02-release-13/social-img.png b/source/images/blog/2016-02-release-13/social-img.png index b687038d2ba..67c4f8eb9f5 100644 Binary files a/source/images/blog/2016-02-release-13/social-img.png and b/source/images/blog/2016-02-release-13/social-img.png differ diff --git a/source/images/blog/2016-02-release-14/social.png b/source/images/blog/2016-02-release-14/social.png index c0ff235e0cc..59582b45643 100644 Binary files a/source/images/blog/2016-02-release-14/social.png and b/source/images/blog/2016-02-release-14/social.png differ diff --git a/source/images/blog/2016-02-smartthings/social.png b/source/images/blog/2016-02-smartthings/social.png index fdd5eba7b62..ac217e3cb80 100644 Binary files a/source/images/blog/2016-02-smartthings/social.png and b/source/images/blog/2016-02-smartthings/social.png differ diff --git a/source/images/blog/2016-02-smartthings/splash.png b/source/images/blog/2016-02-smartthings/splash.png index 2d2906e33e9..fc30f1bafcf 100644 Binary files a/source/images/blog/2016-02-smartthings/splash.png and b/source/images/blog/2016-02-smartthings/splash.png differ diff --git a/source/images/blog/2016-02-snapcast/diagram.png b/source/images/blog/2016-02-snapcast/diagram.png index 1749164024f..493eef72c93 100644 Binary files a/source/images/blog/2016-02-snapcast/diagram.png and b/source/images/blog/2016-02-snapcast/diagram.png differ diff --git a/source/images/blog/2016-04-display/ha-display.png b/source/images/blog/2016-04-display/ha-display.png index 542711d73f9..cb0aa2c24c4 100644 Binary files a/source/images/blog/2016-04-display/ha-display.png and b/source/images/blog/2016-04-display/ha-display.png differ diff --git a/source/images/blog/2016-04-ibeacons/owntracks_beacon_setup.png b/source/images/blog/2016-04-ibeacons/owntracks_beacon_setup.png index 73de1403e9d..79ef3d93177 100644 Binary files a/source/images/blog/2016-04-ibeacons/owntracks_beacon_setup.png and b/source/images/blog/2016-04-ibeacons/owntracks_beacon_setup.png differ diff --git a/source/images/blog/2016-04-ibeacons/owntracks_red_beacon.png b/source/images/blog/2016-04-ibeacons/owntracks_red_beacon.png index 45ba33079fe..12d853246b9 100644 Binary files a/source/images/blog/2016-04-ibeacons/owntracks_red_beacon.png and b/source/images/blog/2016-04-ibeacons/owntracks_red_beacon.png differ diff --git a/source/images/blog/2016-04-release-18/social.png b/source/images/blog/2016-04-release-18/social.png index 1548d86ca04..110e447578f 100644 Binary files a/source/images/blog/2016-04-release-18/social.png and b/source/images/blog/2016-04-release-18/social.png differ diff --git a/source/images/blog/2016-05-ibeacons/keys_device.png b/source/images/blog/2016-05-ibeacons/keys_device.png index ff16c0da6d7..fab1fd3a153 100644 Binary files a/source/images/blog/2016-05-ibeacons/keys_device.png and b/source/images/blog/2016-05-ibeacons/keys_device.png differ diff --git a/source/images/blog/2016-05-openiot/preview-video.png b/source/images/blog/2016-05-openiot/preview-video.png index 36fd25928f5..18b6b5f0619 100644 Binary files a/source/images/blog/2016-05-openiot/preview-video.png and b/source/images/blog/2016-05-openiot/preview-video.png differ diff --git a/source/images/blog/2016-05-video-configuring-home-assistant/preview-video.png b/source/images/blog/2016-05-video-configuring-home-assistant/preview-video.png index 4f5c4937ac5..31098e9ecad 100644 Binary files a/source/images/blog/2016-05-video-configuring-home-assistant/preview-video.png and b/source/images/blog/2016-05-video-configuring-home-assistant/preview-video.png differ diff --git a/source/images/blog/2016-06-community-highlights/video_preview.png b/source/images/blog/2016-06-community-highlights/video_preview.png index 8fff354284d..37e6f77cd20 100644 Binary files a/source/images/blog/2016-06-community-highlights/video_preview.png and b/source/images/blog/2016-06-community-highlights/video_preview.png differ diff --git a/source/images/blog/2016-07-data-exploration/graph.png b/source/images/blog/2016-07-data-exploration/graph.png index f5179da1f66..654aa8f4ff0 100644 Binary files a/source/images/blog/2016-07-data-exploration/graph.png and b/source/images/blog/2016-07-data-exploration/graph.png differ diff --git a/source/images/blog/2016-07-laundry-automation/block-diagram.png b/source/images/blog/2016-07-laundry-automation/block-diagram.png index d1d78d48cc0..ca9fbdb35eb 100644 Binary files a/source/images/blog/2016-07-laundry-automation/block-diagram.png and b/source/images/blog/2016-07-laundry-automation/block-diagram.png differ diff --git a/source/images/blog/2016-07-laundry-automation/data-graph.png b/source/images/blog/2016-07-laundry-automation/data-graph.png index c89d940134d..95f65335cba 100644 Binary files a/source/images/blog/2016-07-laundry-automation/data-graph.png and b/source/images/blog/2016-07-laundry-automation/data-graph.png differ diff --git a/source/images/blog/2016-07-laundry-automation/screenshot-ha.png b/source/images/blog/2016-07-laundry-automation/screenshot-ha.png index 39c68f369a0..8be092ac399 100644 Binary files a/source/images/blog/2016-07-laundry-automation/screenshot-ha.png and b/source/images/blog/2016-07-laundry-automation/screenshot-ha.png differ diff --git a/source/images/blog/2016-07-micropython/micropython.png b/source/images/blog/2016-07-micropython/micropython.png index 7bd943f5728..cf02c5f086c 100644 Binary files a/source/images/blog/2016-07-micropython/micropython.png and b/source/images/blog/2016-07-micropython/micropython.png differ diff --git a/source/images/blog/2016-07-micropython/social.png b/source/images/blog/2016-07-micropython/social.png index 23d2b670637..c09831cd80f 100644 Binary files a/source/images/blog/2016-07-micropython/social.png and b/source/images/blog/2016-07-micropython/social.png differ diff --git a/source/images/blog/2016-07-pocketchip/pocketchip-logo.png b/source/images/blog/2016-07-pocketchip/pocketchip-logo.png index 39d3c608bd3..0189a0798cd 100644 Binary files a/source/images/blog/2016-07-pocketchip/pocketchip-logo.png and b/source/images/blog/2016-07-pocketchip/pocketchip-logo.png differ diff --git a/source/images/blog/2016-07-pocketchip/social.png b/source/images/blog/2016-07-pocketchip/social.png index ff1aabe4f1a..054f3f8cc5c 100644 Binary files a/source/images/blog/2016-07-pocketchip/social.png and b/source/images/blog/2016-07-pocketchip/social.png differ diff --git a/source/images/blog/2016-07-reporting/db-browser.png b/source/images/blog/2016-07-reporting/db-browser.png index acf61c26fc3..e25317f70bd 100644 Binary files a/source/images/blog/2016-07-reporting/db-browser.png and b/source/images/blog/2016-07-reporting/db-browser.png differ diff --git a/source/images/blog/2016-07-reporting/libreoffice-graph.png b/source/images/blog/2016-07-reporting/libreoffice-graph.png index 7b366b81813..764d49e7fef 100644 Binary files a/source/images/blog/2016-07-reporting/libreoffice-graph.png and b/source/images/blog/2016-07-reporting/libreoffice-graph.png differ diff --git a/source/images/blog/2016-07-reporting/libreoffice-import.png b/source/images/blog/2016-07-reporting/libreoffice-import.png index f9bc6f321dc..117b4bc26a0 100644 Binary files a/source/images/blog/2016-07-reporting/libreoffice-import.png and b/source/images/blog/2016-07-reporting/libreoffice-import.png differ diff --git a/source/images/blog/2016-07-reporting/mpl-sensor.png b/source/images/blog/2016-07-reporting/mpl-sensor.png index d0996068c0a..d722984713b 100644 Binary files a/source/images/blog/2016-07-reporting/mpl-sensor.png and b/source/images/blog/2016-07-reporting/mpl-sensor.png differ diff --git a/source/images/blog/2016-08-data-exploration/heatmap.png b/source/images/blog/2016-08-data-exploration/heatmap.png index 251813978ae..6ea558d2ac1 100644 Binary files a/source/images/blog/2016-08-data-exploration/heatmap.png and b/source/images/blog/2016-08-data-exploration/heatmap.png differ diff --git a/source/images/blog/2016-08-optimizing-web-app/performance-diagram.png b/source/images/blog/2016-08-optimizing-web-app/performance-diagram.png index cbb68dadb64..182fa6984de 100644 Binary files a/source/images/blog/2016-08-optimizing-web-app/performance-diagram.png and b/source/images/blog/2016-08-optimizing-web-app/performance-diagram.png differ diff --git a/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.18.2.png b/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.18.2.png index 0aa78afa1e6..ff0ee47f283 100644 Binary files a/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.18.2.png and b/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.18.2.png differ diff --git a/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.26.png b/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.26.png index 615dfd210bc..cb71dd7fd13 100644 Binary files a/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.26.png and b/source/images/blog/2016-08-optimizing-web-app/performance-timeline-0.26.png differ diff --git a/source/images/blog/2016-08-optimizing-web-app/timeline-corejs.png b/source/images/blog/2016-08-optimizing-web-app/timeline-corejs.png index 22102d46ed2..989e6701119 100644 Binary files a/source/images/blog/2016-08-optimizing-web-app/timeline-corejs.png and b/source/images/blog/2016-08-optimizing-web-app/timeline-corejs.png differ diff --git a/source/images/blog/2016-08-optimizing-web-app/timeline-no-more-es2015.png b/source/images/blog/2016-08-optimizing-web-app/timeline-no-more-es2015.png index 9c2b4829fba..0e7dc04c1e0 100644 Binary files a/source/images/blog/2016-08-optimizing-web-app/timeline-no-more-es2015.png and b/source/images/blog/2016-08-optimizing-web-app/timeline-no-more-es2015.png differ diff --git a/source/images/blog/2016-10-hacktoberfest/social.png b/source/images/blog/2016-10-hacktoberfest/social.png index 9a6f5ebe3f0..75dde38e74d 100644 Binary files a/source/images/blog/2016-10-hacktoberfest/social.png and b/source/images/blog/2016-10-hacktoberfest/social.png differ diff --git a/source/images/blog/2016-10-hassbian/social.png b/source/images/blog/2016-10-hassbian/social.png index a8b6ad7af4a..aa7e835cf17 100644 Binary files a/source/images/blog/2016-10-hassbian/social.png and b/source/images/blog/2016-10-hassbian/social.png differ diff --git a/source/images/blog/2016-12-0.34/social.png b/source/images/blog/2016-12-0.34/social.png index ddac3276f62..968fc709983 100644 Binary files a/source/images/blog/2016-12-0.34/social.png and b/source/images/blog/2016-12-0.34/social.png differ diff --git a/source/images/blog/2016-12-0.35/social.png b/source/images/blog/2016-12-0.35/social.png index d7aa9840d28..813e5dcba66 100644 Binary files a/source/images/blog/2016-12-0.35/social.png and b/source/images/blog/2016-12-0.35/social.png differ diff --git a/source/images/blog/2017-01-bruh-christmas/stats.png b/source/images/blog/2017-01-bruh-christmas/stats.png index 61a99ad73f1..eafb899730a 100644 Binary files a/source/images/blog/2017-01-bruh-christmas/stats.png and b/source/images/blog/2017-01-bruh-christmas/stats.png differ diff --git a/source/images/blog/2017-02-0.38/social.png b/source/images/blog/2017-02-0.38/social.png index cd43fd703a8..5f5522fa1d7 100644 Binary files a/source/images/blog/2017-02-0.38/social.png and b/source/images/blog/2017-02-0.38/social.png differ diff --git a/source/images/blog/2017-02-0.39/config.png b/source/images/blog/2017-02-0.39/config.png index f0a894715cc..c29eba7e5b1 100644 Binary files a/source/images/blog/2017-02-0.39/config.png and b/source/images/blog/2017-02-0.39/config.png differ diff --git a/source/images/blog/2017-02-babyphone/social.png b/source/images/blog/2017-02-babyphone/social.png index becd14d0f06..61e4db071b0 100644 Binary files a/source/images/blog/2017-02-babyphone/social.png and b/source/images/blog/2017-02-babyphone/social.png differ diff --git a/source/images/blog/2017-02-workshop/social.png b/source/images/blog/2017-02-workshop/social.png index 0cc975d28eb..839278cc936 100644 Binary files a/source/images/blog/2017-02-workshop/social.png and b/source/images/blog/2017-02-workshop/social.png differ diff --git a/source/images/blog/2017-03-0.40/social.png b/source/images/blog/2017-03-0.40/social.png index db176fe759d..b36ca7300fb 100644 Binary files a/source/images/blog/2017-03-0.40/social.png and b/source/images/blog/2017-03-0.40/social.png differ diff --git a/source/images/blog/2017-03-0.41/social.png b/source/images/blog/2017-03-0.41/social.png index b5e31e721f2..c04d4a99dd6 100644 Binary files a/source/images/blog/2017-03-0.41/social.png and b/source/images/blog/2017-03-0.41/social.png differ diff --git a/source/images/blog/2017-03-bridge/social.png b/source/images/blog/2017-03-bridge/social.png index 8a316820073..08734e0a942 100644 Binary files a/source/images/blog/2017-03-bridge/social.png and b/source/images/blog/2017-03-bridge/social.png differ diff --git a/source/images/blog/2017-04-award/social.png b/source/images/blog/2017-04-award/social.png index 04078e22281..ccf0d2a84ae 100644 Binary files a/source/images/blog/2017-04-award/social.png and b/source/images/blog/2017-04-award/social.png differ diff --git a/source/images/blog/2017-04-influxdb-grafana/add_data_source.png b/source/images/blog/2017-04-influxdb-grafana/add_data_source.png index 3cc0a816eff..6f6f131c38d 100644 Binary files a/source/images/blog/2017-04-influxdb-grafana/add_data_source.png and b/source/images/blog/2017-04-influxdb-grafana/add_data_source.png differ diff --git a/source/images/blog/2017-04-influxdb-grafana/create_HA_database.png b/source/images/blog/2017-04-influxdb-grafana/create_HA_database.png index 5a39066fe1f..21d6d9780e8 100644 Binary files a/source/images/blog/2017-04-influxdb-grafana/create_HA_database.png and b/source/images/blog/2017-04-influxdb-grafana/create_HA_database.png differ diff --git a/source/images/blog/2017-04-influxdb-grafana/influxdb-grafana-ha.png b/source/images/blog/2017-04-influxdb-grafana/influxdb-grafana-ha.png index 30605e8b9b8..a93d507cbbe 100644 Binary files a/source/images/blog/2017-04-influxdb-grafana/influxdb-grafana-ha.png and b/source/images/blog/2017-04-influxdb-grafana/influxdb-grafana-ha.png differ diff --git a/source/images/blog/2017-04-influxdb-grafana/share_dashboard.png b/source/images/blog/2017-04-influxdb-grafana/share_dashboard.png index 436dd79d97f..e570514697c 100644 Binary files a/source/images/blog/2017-04-influxdb-grafana/share_dashboard.png and b/source/images/blog/2017-04-influxdb-grafana/share_dashboard.png differ diff --git a/source/images/blog/2017-05-0.45/components.png b/source/images/blog/2017-05-0.45/components.png index bcf90d8878b..c051f1fa527 100644 Binary files a/source/images/blog/2017-05-0.45/components.png and b/source/images/blog/2017-05-0.45/components.png differ diff --git a/source/images/blog/2017-05-0.45/power-meter.png b/source/images/blog/2017-05-0.45/power-meter.png index f9aa2802b49..4ddf7c8ea21 100644 Binary files a/source/images/blog/2017-05-0.45/power-meter.png and b/source/images/blog/2017-05-0.45/power-meter.png differ diff --git a/source/images/blog/2017-05-0.45/trigger.png b/source/images/blog/2017-05-0.45/trigger.png index 56ac6f40639..ae4a4e0bbb2 100644 Binary files a/source/images/blog/2017-05-0.45/trigger.png and b/source/images/blog/2017-05-0.45/trigger.png differ diff --git a/source/images/blog/2017-05-0.45/zwave.png b/source/images/blog/2017-05-0.45/zwave.png index bf5e11ba76c..9d1d69ac290 100644 Binary files a/source/images/blog/2017-05-0.45/zwave.png and b/source/images/blog/2017-05-0.45/zwave.png differ diff --git a/source/images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.png b/source/images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.png index 19f0896b0c2..a51eaf57160 100644 Binary files a/source/images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.png and b/source/images/blog/2017-05-hassbian-pi-zero/home_assistant_plus_rpi_600x315.png differ diff --git a/source/images/blog/2017-05-orangepi/orange-pi-running.png b/source/images/blog/2017-05-orangepi/orange-pi-running.png index ade119e9d3e..9529ff1df46 100644 Binary files a/source/images/blog/2017-05-orangepi/orange-pi-running.png and b/source/images/blog/2017-05-orangepi/orange-pi-running.png differ diff --git a/source/images/blog/2017-05-orangepi/orangie-pi-setup.png b/source/images/blog/2017-05-orangepi/orangie-pi-setup.png index 8d4885857bb..a60ea2664b2 100644 Binary files a/source/images/blog/2017-05-orangepi/orangie-pi-setup.png and b/source/images/blog/2017-05-orangepi/orangie-pi-setup.png differ diff --git a/source/images/blog/2017-05-orangepi/social.png b/source/images/blog/2017-05-orangepi/social.png index 5eae349385b..209affff726 100644 Binary files a/source/images/blog/2017-05-orangepi/social.png and b/source/images/blog/2017-05-orangepi/social.png differ diff --git a/source/images/blog/2017-05-podcast-init/podcast_init.png b/source/images/blog/2017-05-podcast-init/podcast_init.png index d4fb2d3f79a..d3e47c9eca0 100644 Binary files a/source/images/blog/2017-05-podcast-init/podcast_init.png and b/source/images/blog/2017-05-podcast-init/podcast_init.png differ diff --git a/source/images/blog/2017-06-0.46/components.png b/source/images/blog/2017-06-0.46/components.png index 7910933f68e..f1b90586e64 100644 Binary files a/source/images/blog/2017-06-0.46/components.png and b/source/images/blog/2017-06-0.46/components.png differ diff --git a/source/images/blog/2017-07-0.49/green-theme.png b/source/images/blog/2017-07-0.49/green-theme.png index 05079098062..bd0498a463f 100644 Binary files a/source/images/blog/2017-07-0.49/green-theme.png and b/source/images/blog/2017-07-0.49/green-theme.png differ diff --git a/source/images/blog/2017-07-0.50/components.png b/source/images/blog/2017-07-0.50/components.png index 1e09a704c65..8849ae94a5f 100644 Binary files a/source/images/blog/2017-07-0.50/components.png and b/source/images/blog/2017-07-0.50/components.png differ diff --git a/source/images/blog/2017-07-talk-python/logo.png b/source/images/blog/2017-07-talk-python/logo.png index 84323ecf33d..9e6f59bcd78 100644 Binary files a/source/images/blog/2017-07-talk-python/logo.png and b/source/images/blog/2017-07-talk-python/logo.png differ diff --git a/source/images/blog/2017-08-0.51/components.png b/source/images/blog/2017-08-0.51/components.png index d64792117ac..adbca8c51af 100644 Binary files a/source/images/blog/2017-08-0.51/components.png and b/source/images/blog/2017-08-0.51/components.png differ diff --git a/source/images/blog/2017-09-0.53/customize-editor.png b/source/images/blog/2017-09-0.53/customize-editor.png index 54505c7645e..9fa171b8cc9 100644 Binary files a/source/images/blog/2017-09-0.53/customize-editor.png and b/source/images/blog/2017-09-0.53/customize-editor.png differ diff --git a/source/images/blog/2017-09-0.54/components.png b/source/images/blog/2017-09-0.54/components.png index 2e2653aa7d2..415da7bc817 100644 Binary files a/source/images/blog/2017-09-0.54/components.png and b/source/images/blog/2017-09-0.54/components.png differ diff --git a/source/images/blog/2017-09-hacktoberfest/hacktoberfest-2017.png b/source/images/blog/2017-09-hacktoberfest/hacktoberfest-2017.png index 0775597957b..08bf89cb5c8 100644 Binary files a/source/images/blog/2017-09-hacktoberfest/hacktoberfest-2017.png and b/source/images/blog/2017-09-hacktoberfest/hacktoberfest-2017.png differ diff --git a/source/images/blog/2017-10-0.55/components.png b/source/images/blog/2017-10-0.55/components.png index 9bdec76c955..207ebf191c4 100644 Binary files a/source/images/blog/2017-10-0.55/components.png and b/source/images/blog/2017-10-0.55/components.png differ diff --git a/source/images/blog/2017-10-0.56/components.png b/source/images/blog/2017-10-0.56/components.png index 74c25a33c63..37d71e1416a 100644 Binary files a/source/images/blog/2017-10-0.56/components.png and b/source/images/blog/2017-10-0.56/components.png differ diff --git a/source/images/blog/2017-10-interactive-demo/demo-platforms.png b/source/images/blog/2017-10-interactive-demo/demo-platforms.png index b8e6f65c42a..8eaecd113b2 100644 Binary files a/source/images/blog/2017-10-interactive-demo/demo-platforms.png and b/source/images/blog/2017-10-interactive-demo/demo-platforms.png differ diff --git a/source/images/blog/2017-10-interactive-demo/demo-random.png b/source/images/blog/2017-10-interactive-demo/demo-random.png index 4d3221f662b..456c51648ec 100644 Binary files a/source/images/blog/2017-10-interactive-demo/demo-random.png and b/source/images/blog/2017-10-interactive-demo/demo-random.png differ diff --git a/source/images/blog/2017-10-interactive-demo/online-demo.png b/source/images/blog/2017-10-interactive-demo/online-demo.png index 06a6ef41cc1..fd32bebe71f 100644 Binary files a/source/images/blog/2017-10-interactive-demo/online-demo.png and b/source/images/blog/2017-10-interactive-demo/online-demo.png differ diff --git a/source/images/blog/2017-11-0.57/languages.png b/source/images/blog/2017-11-0.57/languages.png index 6e31adbe986..1a42e3ef91c 100644 Binary files a/source/images/blog/2017-11-0.57/languages.png and b/source/images/blog/2017-11-0.57/languages.png differ diff --git a/source/images/blog/2017-11-0.58/system_log.png b/source/images/blog/2017-11-0.58/system_log.png index 614f84a32b6..824b2e6c868 100644 Binary files a/source/images/blog/2017-11-0.58/system_log.png and b/source/images/blog/2017-11-0.58/system_log.png differ diff --git a/source/images/blog/2017-11-hassio-virtual/hassio.png b/source/images/blog/2017-11-hassio-virtual/hassio.png index 5a39c703619..38f0e51e066 100644 Binary files a/source/images/blog/2017-11-hassio-virtual/hassio.png and b/source/images/blog/2017-11-hassio-virtual/hassio.png differ diff --git a/source/images/blog/2017-11-hassio-virtual/social.png b/source/images/blog/2017-11-hassio-virtual/social.png index dec9bb352e0..c9f309ec59b 100644 Binary files a/source/images/blog/2017-11-hassio-virtual/social.png and b/source/images/blog/2017-11-hassio-virtual/social.png differ diff --git a/source/images/blog/2017-11-hassio-virtual/virtual-machine-manager.png b/source/images/blog/2017-11-hassio-virtual/virtual-machine-manager.png index b51ec5be266..7b0a86283d7 100644 Binary files a/source/images/blog/2017-11-hassio-virtual/virtual-machine-manager.png and b/source/images/blog/2017-11-hassio-virtual/virtual-machine-manager.png differ diff --git a/source/images/blog/2017-11-mqtt-ttn/social-ha-ttn.png b/source/images/blog/2017-11-mqtt-ttn/social-ha-ttn.png index fae7302aa0d..329fa386ab4 100644 Binary files a/source/images/blog/2017-11-mqtt-ttn/social-ha-ttn.png and b/source/images/blog/2017-11-mqtt-ttn/social-ha-ttn.png differ diff --git a/source/images/blog/2017-11-tor/social.png b/source/images/blog/2017-11-tor/social.png index 99ca031b082..0fabbfe10d3 100644 Binary files a/source/images/blog/2017-11-tor/social.png and b/source/images/blog/2017-11-tor/social.png differ diff --git a/source/images/blog/2017-12-0.59/color-wheel.png b/source/images/blog/2017-12-0.59/color-wheel.png index 3dc80843412..ca17338613e 100644 Binary files a/source/images/blog/2017-12-0.59/color-wheel.png and b/source/images/blog/2017-12-0.59/color-wheel.png differ diff --git a/source/images/blog/2017-12-0.59/components.png b/source/images/blog/2017-12-0.59/components.png index 14f0ea42de9..b9bf0178ace 100644 Binary files a/source/images/blog/2017-12-0.59/components.png and b/source/images/blog/2017-12-0.59/components.png differ diff --git a/source/images/blog/2017-12-0.59/picker.png b/source/images/blog/2017-12-0.59/picker.png index 89a31d64127..72e945a9d8f 100644 Binary files a/source/images/blog/2017-12-0.59/picker.png and b/source/images/blog/2017-12-0.59/picker.png differ diff --git a/source/images/blog/2017-12-0.60/components.png b/source/images/blog/2017-12-0.60/components.png index e054e1d5780..38224dbe36e 100644 Binary files a/source/images/blog/2017-12-0.60/components.png and b/source/images/blog/2017-12-0.60/components.png differ diff --git a/source/images/blog/2018-01-0.61/components.png b/source/images/blog/2018-01-0.61/components.png index 879d9f6be85..283f22fc61e 100644 Binary files a/source/images/blog/2018-01-0.61/components.png and b/source/images/blog/2018-01-0.61/components.png differ diff --git a/source/images/blog/2018-01-0.62/components.png b/source/images/blog/2018-01-0.62/components.png index 80dd202e284..1f019b4e7d1 100644 Binary files a/source/images/blog/2018-01-0.62/components.png and b/source/images/blog/2018-01-0.62/components.png differ diff --git a/source/images/blog/2018-02-0.64/components.png b/source/images/blog/2018-02-0.64/components.png index 51d2f3285eb..aa33c949e77 100644 Binary files a/source/images/blog/2018-02-0.64/components.png and b/source/images/blog/2018-02-0.64/components.png differ diff --git a/source/images/blog/2018-03-0.65/components.png b/source/images/blog/2018-03-0.65/components.png index 796137cd44f..9467bb60cd6 100644 Binary files a/source/images/blog/2018-03-0.65/components.png and b/source/images/blog/2018-03-0.65/components.png differ diff --git a/source/images/blog/2018-03-0.65/filter-example.png b/source/images/blog/2018-03-0.65/filter-example.png index 88793b97687..f69eb647f5d 100644 Binary files a/source/images/blog/2018-03-0.65/filter-example.png and b/source/images/blog/2018-03-0.65/filter-example.png differ diff --git a/source/images/blog/2018-03-fedora-atomic/social.png b/source/images/blog/2018-03-fedora-atomic/social.png index 901dd678335..a4c8c9c197c 100644 Binary files a/source/images/blog/2018-03-fedora-atomic/social.png and b/source/images/blog/2018-03-fedora-atomic/social.png differ diff --git a/source/images/blog/2018-03-release-schedule/release-schedule-diagram.png b/source/images/blog/2018-03-release-schedule/release-schedule-diagram.png index c886336d906..0585e884bdd 100644 Binary files a/source/images/blog/2018-03-release-schedule/release-schedule-diagram.png and b/source/images/blog/2018-03-release-schedule/release-schedule-diagram.png differ diff --git a/source/images/blog/2018-03-release-schedule/social.png b/source/images/blog/2018-03-release-schedule/social.png index bb96761c561..2d676706167 100644 Binary files a/source/images/blog/2018-03-release-schedule/social.png and b/source/images/blog/2018-03-release-schedule/social.png differ diff --git a/source/images/blog/2018-04-google-assistant/google-assistant-home-assistant.png b/source/images/blog/2018-04-google-assistant/google-assistant-home-assistant.png index 21b75c8b210..c7dad7f812a 100644 Binary files a/source/images/blog/2018-04-google-assistant/google-assistant-home-assistant.png and b/source/images/blog/2018-04-google-assistant/google-assistant-home-assistant.png differ diff --git a/source/images/blog/2018-04-hassio-2018/blogpost.png b/source/images/blog/2018-04-hassio-2018/blogpost.png index 5d2d9ba4a90..c59043c583e 100644 Binary files a/source/images/blog/2018-04-hassio-2018/blogpost.png and b/source/images/blog/2018-04-hassio-2018/blogpost.png differ diff --git a/source/images/blog/2018-06-0.71/components.png b/source/images/blog/2018-06-0.71/components.png index dc1af44197b..363ac1e9de2 100644 Binary files a/source/images/blog/2018-06-0.71/components.png and b/source/images/blog/2018-06-0.71/components.png differ diff --git a/source/images/blog/2018-06-esphomelib/social.png b/source/images/blog/2018-06-esphomelib/social.png index 03a4d55d627..ef5bd9b2af3 100644 Binary files a/source/images/blog/2018-06-esphomelib/social.png and b/source/images/blog/2018-06-esphomelib/social.png differ diff --git a/source/images/blog/2018-06-esphomelib/switch.png b/source/images/blog/2018-06-esphomelib/switch.png index 32e68bef873..7c04a8d285b 100644 Binary files a/source/images/blog/2018-06-esphomelib/switch.png and b/source/images/blog/2018-06-esphomelib/switch.png differ diff --git a/source/images/blog/2018-07-0.73/lovelace-elements.png b/source/images/blog/2018-07-0.73/lovelace-elements.png index 27e67f9f69e..589f07098cd 100644 Binary files a/source/images/blog/2018-07-0.73/lovelace-elements.png and b/source/images/blog/2018-07-0.73/lovelace-elements.png differ diff --git a/source/images/blog/2018-07-hassio-images/blogpost.png b/source/images/blog/2018-07-hassio-images/blogpost.png index 5d2d9ba4a90..c59043c583e 100644 Binary files a/source/images/blog/2018-07-hassio-images/blogpost.png and b/source/images/blog/2018-07-hassio-images/blogpost.png differ diff --git a/source/images/blog/2018-08-0.75/change-entity.png b/source/images/blog/2018-08-0.75/change-entity.png index 752893b0b6c..32b55cb994d 100644 Binary files a/source/images/blog/2018-08-0.75/change-entity.png and b/source/images/blog/2018-08-0.75/change-entity.png differ diff --git a/source/images/blog/2018-08-0.76/components.png b/source/images/blog/2018-08-0.76/components.png index 966732dc02d..a2554482b8e 100644 Binary files a/source/images/blog/2018-08-0.76/components.png and b/source/images/blog/2018-08-0.76/components.png differ diff --git a/source/images/blog/2018-08-0.77/social.png b/source/images/blog/2018-08-0.77/social.png index 693a90dadf1..55e5e5fc847 100644 Binary files a/source/images/blog/2018-08-0.77/social.png and b/source/images/blog/2018-08-0.77/social.png differ diff --git a/source/images/blog/2018-09-hacktoberfest/hacktoberfest-2018.png b/source/images/blog/2018-09-hacktoberfest/hacktoberfest-2018.png index 374fe3a48d5..c2d4370d3f7 100644 Binary files a/source/images/blog/2018-09-hacktoberfest/hacktoberfest-2018.png and b/source/images/blog/2018-09-hacktoberfest/hacktoberfest-2018.png differ diff --git a/source/images/blog/2018-09-release-0.78/components.png b/source/images/blog/2018-09-release-0.78/components.png index 4819c09b676..56596af9303 100644 Binary files a/source/images/blog/2018-09-release-0.78/components.png and b/source/images/blog/2018-09-release-0.78/components.png differ diff --git a/source/images/blog/2018-09-release-0.79/components.png b/source/images/blog/2018-09-release-0.79/components.png index 20b1b0e7b48..c1c382b1ca4 100644 Binary files a/source/images/blog/2018-09-release-0.79/components.png and b/source/images/blog/2018-09-release-0.79/components.png differ diff --git a/source/images/blog/2018-09-release-0.79/config_entry.png b/source/images/blog/2018-09-release-0.79/config_entry.png index d76a17d66b3..d9078a5cc8f 100644 Binary files a/source/images/blog/2018-09-release-0.79/config_entry.png and b/source/images/blog/2018-09-release-0.79/config_entry.png differ diff --git a/source/images/blog/2018-09-release-0.79/integrations.png b/source/images/blog/2018-09-release-0.79/integrations.png index 0edb361c8b8..4add1ca0abd 100644 Binary files a/source/images/blog/2018-09-release-0.79/integrations.png and b/source/images/blog/2018-09-release-0.79/integrations.png differ diff --git a/source/images/blog/2018-09-release-0.79/mqtt.png b/source/images/blog/2018-09-release-0.79/mqtt.png index 4b59bb145c0..955a8efac76 100644 Binary files a/source/images/blog/2018-09-release-0.79/mqtt.png and b/source/images/blog/2018-09-release-0.79/mqtt.png differ diff --git a/source/images/blog/2018-09-thinking-big/social.png b/source/images/blog/2018-09-thinking-big/social.png index 6489843b1b6..bd17c45574e 100644 Binary files a/source/images/blog/2018-09-thinking-big/social.png and b/source/images/blog/2018-09-thinking-big/social.png differ diff --git a/source/images/blog/2018-10-release-80/config-ifttt.png b/source/images/blog/2018-10-release-80/config-ifttt.png index 62e6a089e67..c9143e270ab 100644 Binary files a/source/images/blog/2018-10-release-80/config-ifttt.png and b/source/images/blog/2018-10-release-80/config-ifttt.png differ diff --git a/source/images/blog/2018-10-release-81/social.png b/source/images/blog/2018-10-release-81/social.png index 53c40eb2b1b..e8342afedc4 100644 Binary files a/source/images/blog/2018-10-release-81/social.png and b/source/images/blog/2018-10-release-81/social.png differ diff --git a/source/images/blog/2018-11-release-83/google-unlock.png b/source/images/blog/2018-11-release-83/google-unlock.png index f89d6b755e5..60c6a70d503 100644 Binary files a/source/images/blog/2018-11-release-83/google-unlock.png and b/source/images/blog/2018-11-release-83/google-unlock.png differ diff --git a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-2.png b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-2.png index 0ac0f0815ec..983f7391c7e 100644 Binary files a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-2.png and b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-2.png differ diff --git a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-3.png b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-3.png index d0828e5ebfe..bfad3bbd55e 100644 Binary files a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-3.png and b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-3.png differ diff --git a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-5.png b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-5.png index 064ccc21a2a..df1d489af56 100644 Binary files a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-5.png and b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post-5.png differ diff --git a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post.png b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post.png index e9595e8820e..e75aa1ad56d 100644 Binary files a/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post.png and b/source/images/blog/2018-12-logitech-harmony-removes-local-api/forum-post.png differ diff --git a/source/images/blog/2018-12-logitech-harmony-removes-local-api/pull-request.png b/source/images/blog/2018-12-logitech-harmony-removes-local-api/pull-request.png index 03fc3e2f33a..352e5d5a50a 100644 Binary files a/source/images/blog/2018-12-logitech-harmony-removes-local-api/pull-request.png and b/source/images/blog/2018-12-logitech-harmony-removes-local-api/pull-request.png differ diff --git a/source/images/blog/2018-12-release-84/components.png b/source/images/blog/2018-12-release-84/components.png index e57fde19b66..c3a64a0d2eb 100644 Binary files a/source/images/blog/2018-12-release-84/components.png and b/source/images/blog/2018-12-release-84/components.png differ diff --git a/source/images/blog/2019-04-hassio-ingress/blogpost.png b/source/images/blog/2019-04-hassio-ingress/blogpost.png index 5d2d9ba4a90..c59043c583e 100644 Binary files a/source/images/blog/2019-04-hassio-ingress/blogpost.png and b/source/images/blog/2019-04-hassio-ingress/blogpost.png differ diff --git a/source/images/blog/2019-04-hassio-ingress/ingress_sign.png b/source/images/blog/2019-04-hassio-ingress/ingress_sign.png index 70b45a894b1..157649c6be1 100644 Binary files a/source/images/blog/2019-04-hassio-ingress/ingress_sign.png and b/source/images/blog/2019-04-hassio-ingress/ingress_sign.png differ diff --git a/source/images/blog/2019-04-release-91/social.png b/source/images/blog/2019-04-release-91/social.png index b658867f090..17507a6a1e0 100644 Binary files a/source/images/blog/2019-04-release-91/social.png and b/source/images/blog/2019-04-release-91/social.png differ diff --git a/source/images/blog/2019-06-release-94/google-ui.png b/source/images/blog/2019-06-release-94/google-ui.png index 2e2913a34e6..d36d998322a 100644 Binary files a/source/images/blog/2019-06-release-94/google-ui.png and b/source/images/blog/2019-06-release-94/google-ui.png differ diff --git a/source/images/blog/2019-09-0.99/device-automation-trigger.png b/source/images/blog/2019-09-0.99/device-automation-trigger.png index 0020afd2443..f03d27f6dd7 100644 Binary files a/source/images/blog/2019-09-0.99/device-automation-trigger.png and b/source/images/blog/2019-09-0.99/device-automation-trigger.png differ diff --git a/source/images/blog/2019-09-0.99/devices.png b/source/images/blog/2019-09-0.99/devices.png index c89ad527175..ef7181f57ff 100644 Binary files a/source/images/blog/2019-09-0.99/devices.png and b/source/images/blog/2019-09-0.99/devices.png differ diff --git a/source/images/blog/2019-09-0.99/unused-entities.png b/source/images/blog/2019-09-0.99/unused-entities.png index 5bba379be71..dcc1492f199 100644 Binary files a/source/images/blog/2019-09-0.99/unused-entities.png and b/source/images/blog/2019-09-0.99/unused-entities.png differ diff --git a/source/images/blog/2019-09-birthday/social.png b/source/images/blog/2019-09-birthday/social.png index 5c1bf711ed8..fabe09bd168 100644 Binary files a/source/images/blog/2019-09-birthday/social.png and b/source/images/blog/2019-09-birthday/social.png differ diff --git a/source/images/blog/2019-10-0.100/condition-and.png b/source/images/blog/2019-10-0.100/condition-and.png index 849c58497c7..aec7adc290b 100644 Binary files a/source/images/blog/2019-10-0.100/condition-and.png and b/source/images/blog/2019-10-0.100/condition-and.png differ diff --git a/source/images/blog/2019-10-0.100/device-trigger-sensor.png b/source/images/blog/2019-10-0.100/device-trigger-sensor.png index 2a3248f9744..8ff746db7af 100644 Binary files a/source/images/blog/2019-10-0.100/device-trigger-sensor.png and b/source/images/blog/2019-10-0.100/device-trigger-sensor.png differ diff --git a/source/images/blog/2019-10-0.100/yaml.png b/source/images/blog/2019-10-0.100/yaml.png index cb2f1232ce8..cd318d7b8e7 100644 Binary files a/source/images/blog/2019-10-0.100/yaml.png and b/source/images/blog/2019-10-0.100/yaml.png differ diff --git a/source/images/blog/2019-10-0.101/components.png b/source/images/blog/2019-10-0.101/components.png index 9cf4d6339a1..a8efc3de776 100644 Binary files a/source/images/blog/2019-10-0.101/components.png and b/source/images/blog/2019-10-0.101/components.png differ diff --git a/source/images/blog/2019-10-0.101/confirm_dialog.png b/source/images/blog/2019-10-0.101/confirm_dialog.png index 3843b1db80c..595572e9bf8 100644 Binary files a/source/images/blog/2019-10-0.101/confirm_dialog.png and b/source/images/blog/2019-10-0.101/confirm_dialog.png differ diff --git a/source/images/blog/2019-10-0.101/device_automation_device_picker.png b/source/images/blog/2019-10-0.101/device_automation_device_picker.png index 03290fb4291..e60a31a1c2e 100644 Binary files a/source/images/blog/2019-10-0.101/device_automation_device_picker.png and b/source/images/blog/2019-10-0.101/device_automation_device_picker.png differ diff --git a/source/images/blog/2019-10-0.101/device_automation_duration.png b/source/images/blog/2019-10-0.101/device_automation_duration.png index ce7f6cf4d2d..91d7290a376 100644 Binary files a/source/images/blog/2019-10-0.101/device_automation_duration.png and b/source/images/blog/2019-10-0.101/device_automation_duration.png differ diff --git a/source/images/blog/2019-10-0.101/entity_registry_data_table.png b/source/images/blog/2019-10-0.101/entity_registry_data_table.png index fa6174cce30..deec197eeda 100644 Binary files a/source/images/blog/2019-10-0.101/entity_registry_data_table.png and b/source/images/blog/2019-10-0.101/entity_registry_data_table.png differ diff --git a/source/images/blog/2019-10-0.101/long-lived-access-tokens.png b/source/images/blog/2019-10-0.101/long-lived-access-tokens.png index 4b23c95b60f..8109d4b574c 100644 Binary files a/source/images/blog/2019-10-0.101/long-lived-access-tokens.png and b/source/images/blog/2019-10-0.101/long-lived-access-tokens.png differ diff --git a/source/images/blog/2019-10-0.101/yaml_editor.png b/source/images/blog/2019-10-0.101/yaml_editor.png index a39f7c11362..b4ad83f5ef1 100644 Binary files a/source/images/blog/2019-10-0.101/yaml_editor.png and b/source/images/blog/2019-10-0.101/yaml_editor.png differ diff --git a/source/images/blog/2019-11-0.102/thingtalk-automation.png b/source/images/blog/2019-11-0.102/thingtalk-automation.png index a2b0ee53668..2576b2c8491 100644 Binary files a/source/images/blog/2019-11-0.102/thingtalk-automation.png and b/source/images/blog/2019-11-0.102/thingtalk-automation.png differ diff --git a/source/images/blog/2019-12-home-assistant-for-everyone/social.png b/source/images/blog/2019-12-home-assistant-for-everyone/social.png index d0522f77aa8..55571a09ab7 100644 Binary files a/source/images/blog/2019-12-home-assistant-for-everyone/social.png and b/source/images/blog/2019-12-home-assistant-for-everyone/social.png differ diff --git a/source/images/blog/2019-12-sonos-shutting-down-snips/social.png b/source/images/blog/2019-12-sonos-shutting-down-snips/social.png index 36cb978f11f..f292a96bfe3 100644 Binary files a/source/images/blog/2019-12-sonos-shutting-down-snips/social.png and b/source/images/blog/2019-12-sonos-shutting-down-snips/social.png differ diff --git a/source/images/blog/2020-01-0.104/add-device-lovelace.png b/source/images/blog/2020-01-0.104/add-device-lovelace.png index e6bc5091e32..631c8ca1d04 100644 Binary files a/source/images/blog/2020-01-0.104/add-device-lovelace.png and b/source/images/blog/2020-01-0.104/add-device-lovelace.png differ diff --git a/source/images/blog/2020-01-0.104/entities-multi-select.png b/source/images/blog/2020-01-0.104/entities-multi-select.png index c43b2775409..683d43b1758 100644 Binary files a/source/images/blog/2020-01-0.104/entities-multi-select.png and b/source/images/blog/2020-01-0.104/entities-multi-select.png differ diff --git a/source/images/blog/2020-01-0.104/remove-entity.png b/source/images/blog/2020-01-0.104/remove-entity.png index 338f189c8c6..671afb5685a 100644 Binary files a/source/images/blog/2020-01-0.104/remove-entity.png and b/source/images/blog/2020-01-0.104/remove-entity.png differ diff --git a/source/images/blog/2020-01-0.104/remove-lovelace-config.png b/source/images/blog/2020-01-0.104/remove-lovelace-config.png index 56a5e9ecd76..63328640e2c 100644 Binary files a/source/images/blog/2020-01-0.104/remove-lovelace-config.png and b/source/images/blog/2020-01-0.104/remove-lovelace-config.png differ diff --git a/source/images/blog/2020-01-0.104/zha-config-panel.png b/source/images/blog/2020-01-0.104/zha-config-panel.png index 7ce77f05540..a1aea2da93a 100644 Binary files a/source/images/blog/2020-01-0.104/zha-config-panel.png and b/source/images/blog/2020-01-0.104/zha-config-panel.png differ diff --git a/source/images/blog/2020-01-29-changing-the-home-assistant-brand/social.png b/source/images/blog/2020-01-29-changing-the-home-assistant-brand/social.png index 074d7cb428d..653febd5cc2 100644 Binary files a/source/images/blog/2020-01-29-changing-the-home-assistant-brand/social.png and b/source/images/blog/2020-01-29-changing-the-home-assistant-brand/social.png differ diff --git a/source/images/blog/2020-02-0.105/device-info-page.png b/source/images/blog/2020-02-0.105/device-info-page.png index 6780aaeea96..293886db80e 100644 Binary files a/source/images/blog/2020-02-0.105/device-info-page.png and b/source/images/blog/2020-02-0.105/device-info-page.png differ diff --git a/source/images/blog/2020-02-0.105/entities-card-header-footer.png b/source/images/blog/2020-02-0.105/entities-card-header-footer.png index e4aa3f301a8..fb7b6a4ae65 100644 Binary files a/source/images/blog/2020-02-0.105/entities-card-header-footer.png and b/source/images/blog/2020-02-0.105/entities-card-header-footer.png differ diff --git a/source/images/blog/2020-02-0.106/entities.png b/source/images/blog/2020-02-0.106/entities.png index cbfecbae019..7ae4df7eb2e 100644 Binary files a/source/images/blog/2020-02-0.106/entities.png and b/source/images/blog/2020-02-0.106/entities.png differ diff --git a/source/images/blog/2020-02-0.106/more-info-person.png b/source/images/blog/2020-02-0.106/more-info-person.png index 6e0dd9f2a4a..0ce5cc89b35 100644 Binary files a/source/images/blog/2020-02-0.106/more-info-person.png and b/source/images/blog/2020-02-0.106/more-info-person.png differ diff --git a/source/images/blog/2020-02-0.106/sensor-card.png b/source/images/blog/2020-02-0.106/sensor-card.png index 1a590844ddb..1781267eea4 100644 Binary files a/source/images/blog/2020-02-0.106/sensor-card.png and b/source/images/blog/2020-02-0.106/sensor-card.png differ diff --git a/source/images/blog/2020-02-19-community-highlights/social.png b/source/images/blog/2020-02-19-community-highlights/social.png index 8b637e65b7c..827d588df53 100644 Binary files a/source/images/blog/2020-02-19-community-highlights/social.png and b/source/images/blog/2020-02-19-community-highlights/social.png differ diff --git a/source/images/blog/2020-03-0.106.3/social.png b/source/images/blog/2020-03-0.106.3/social.png index b288f739d17..d880eb16060 100644 Binary files a/source/images/blog/2020-03-0.106.3/social.png and b/source/images/blog/2020-03-0.106.3/social.png differ diff --git a/source/images/blog/2020-03-0.107/lovelace-config-panel.png b/source/images/blog/2020-03-0.107/lovelace-config-panel.png index fc52df43581..d9958d26dc9 100644 Binary files a/source/images/blog/2020-03-0.107/lovelace-config-panel.png and b/source/images/blog/2020-03-0.107/lovelace-config-panel.png differ diff --git a/source/images/blog/2020-03-0.107/new-media-control-card.png b/source/images/blog/2020-03-0.107/new-media-control-card.png index ef66f484c24..c72b8bf19fd 100644 Binary files a/source/images/blog/2020-03-0.107/new-media-control-card.png and b/source/images/blog/2020-03-0.107/new-media-control-card.png differ diff --git a/source/images/blog/2020-04-0.108/area-config-page.png b/source/images/blog/2020-04-0.108/area-config-page.png index 625dccb8ba5..5bc4b37ff22 100644 Binary files a/source/images/blog/2020-04-0.108/area-config-page.png and b/source/images/blog/2020-04-0.108/area-config-page.png differ diff --git a/source/images/blog/2020-04-0.108/entity-card.png b/source/images/blog/2020-04-0.108/entity-card.png index 637194388e9..694ec16e9a7 100644 Binary files a/source/images/blog/2020-04-0.108/entity-card.png and b/source/images/blog/2020-04-0.108/entity-card.png differ diff --git a/source/images/blog/2020-04-0.108/map-history.png b/source/images/blog/2020-04-0.108/map-history.png index 04d4822903f..a1ae31aa7bd 100644 Binary files a/source/images/blog/2020-04-0.108/map-history.png and b/source/images/blog/2020-04-0.108/map-history.png differ diff --git a/source/images/blog/2020-04-0.109/integration-page.png b/source/images/blog/2020-04-0.109/integration-page.png index 21746e5747c..4c4023d09cd 100644 Binary files a/source/images/blog/2020-04-0.109/integration-page.png and b/source/images/blog/2020-04-0.109/integration-page.png differ diff --git a/source/images/code_bg.png b/source/images/code_bg.png deleted file mode 100644 index ebd3acfa9b7..00000000000 Binary files a/source/images/code_bg.png and /dev/null differ diff --git a/source/images/docs/authentication/error-invalid-client-id.png b/source/images/docs/authentication/error-invalid-client-id.png index b310800caba..e5fed6ed76d 100644 Binary files a/source/images/docs/authentication/error-invalid-client-id.png and b/source/images/docs/authentication/error-invalid-client-id.png differ diff --git a/source/images/docs/automation-editor/new-action.png b/source/images/docs/automation-editor/new-action.png index 5e785682116..9dc7679f034 100644 Binary files a/source/images/docs/automation-editor/new-action.png and b/source/images/docs/automation-editor/new-action.png differ diff --git a/source/images/docs/automation-editor/new-automation.png b/source/images/docs/automation-editor/new-automation.png index 03bfac41ccb..9bae39fc709 100644 Binary files a/source/images/docs/automation-editor/new-automation.png and b/source/images/docs/automation-editor/new-automation.png differ diff --git a/source/images/docs/automation-editor/new-trigger.png b/source/images/docs/automation-editor/new-trigger.png index 4f632b34795..d3b2ec5a301 100644 Binary files a/source/images/docs/automation-editor/new-trigger.png and b/source/images/docs/automation-editor/new-trigger.png differ diff --git a/source/images/docs/scenes/editor.png b/source/images/docs/scenes/editor.png index 168f48b012b..258a0eeac22 100644 Binary files a/source/images/docs/scenes/editor.png and b/source/images/docs/scenes/editor.png differ diff --git a/source/images/dotted-border.png b/source/images/dotted-border.png deleted file mode 100644 index d19b60c9f6b..00000000000 Binary files a/source/images/dotted-border.png and /dev/null differ diff --git a/source/images/email.png b/source/images/email.png deleted file mode 100644 index 661a6995b65..00000000000 Binary files a/source/images/email.png and /dev/null differ diff --git a/source/images/favicon-192x192.png b/source/images/favicon-192x192.png index a4acfe87f8d..2a031d86e23 100644 Binary files a/source/images/favicon-192x192.png and b/source/images/favicon-192x192.png differ diff --git a/source/images/frontend/entity_box.png b/source/images/frontend/entity_box.png index 605035a8442..e75689c8863 100644 Binary files a/source/images/frontend/entity_box.png and b/source/images/frontend/entity_box.png differ diff --git a/source/images/frontend/user-language.png b/source/images/frontend/user-language.png index 66db19b99eb..42d4726fc2a 100644 Binary files a/source/images/frontend/user-language.png and b/source/images/frontend/user-language.png differ diff --git a/source/images/frontend/user-theme.png b/source/images/frontend/user-theme.png index 836637c6c93..28673d52fa0 100644 Binary files a/source/images/frontend/user-theme.png and b/source/images/frontend/user-theme.png differ diff --git a/source/images/getting-started/action.png b/source/images/getting-started/action.png index 713984285ec..9dc4b11ddf4 100644 Binary files a/source/images/getting-started/action.png and b/source/images/getting-started/action.png differ diff --git a/source/images/getting-started/automation-editor.png b/source/images/getting-started/automation-editor.png index 75c95333a66..f1317a70cd7 100644 Binary files a/source/images/getting-started/automation-editor.png and b/source/images/getting-started/automation-editor.png differ diff --git a/source/images/getting-started/devices.png b/source/images/getting-started/devices.png index e8221e31f52..4ba559107b8 100644 Binary files a/source/images/getting-started/devices.png and b/source/images/getting-started/devices.png differ diff --git a/source/images/getting-started/integrations.png b/source/images/getting-started/integrations.png index 726ef48d143..3fdf7d0f490 100644 Binary files a/source/images/getting-started/integrations.png and b/source/images/getting-started/integrations.png differ diff --git a/source/images/getting-started/location.png b/source/images/getting-started/location.png index 2ab3f2ea87c..0d8f5996c32 100644 Binary files a/source/images/getting-started/location.png and b/source/images/getting-started/location.png differ diff --git a/source/images/getting-started/lovelace.png b/source/images/getting-started/lovelace.png index 502e224853b..e32d7688e34 100644 Binary files a/source/images/getting-started/lovelace.png and b/source/images/getting-started/lovelace.png differ diff --git a/source/images/getting-started/new-automation.png b/source/images/getting-started/new-automation.png index b2766bdd2b5..4acbb826c8c 100644 Binary files a/source/images/getting-started/new-automation.png and b/source/images/getting-started/new-automation.png differ diff --git a/source/images/getting-started/new-trigger.png b/source/images/getting-started/new-trigger.png index 442e0d6cd32..6ca2801b6ef 100644 Binary files a/source/images/getting-started/new-trigger.png and b/source/images/getting-started/new-trigger.png differ diff --git a/source/images/getting-started/username.png b/source/images/getting-started/username.png index eda8ed37fc6..9d242964bef 100644 Binary files a/source/images/getting-started/username.png and b/source/images/getting-started/username.png differ diff --git a/source/images/hadashboard/dash1.png b/source/images/hadashboard/dash1.png deleted file mode 100644 index e9aa6505654..00000000000 Binary files a/source/images/hadashboard/dash1.png and /dev/null differ diff --git a/source/images/hadashboard/dash2.png b/source/images/hadashboard/dash2.png deleted file mode 100644 index a614f6d7586..00000000000 Binary files a/source/images/hadashboard/dash2.png and /dev/null differ diff --git a/source/images/hadashboard/dash3.png b/source/images/hadashboard/dash3.png deleted file mode 100644 index 206d47deb0c..00000000000 Binary files a/source/images/hadashboard/dash3.png and /dev/null differ diff --git a/source/images/hadashboard/dash4.png b/source/images/hadashboard/dash4.png deleted file mode 100644 index 59a5c5bb626..00000000000 Binary files a/source/images/hadashboard/dash4.png and /dev/null differ diff --git a/source/images/hadashboard/dash5.png b/source/images/hadashboard/dash5.png deleted file mode 100644 index 3af182f5fda..00000000000 Binary files a/source/images/hadashboard/dash5.png and /dev/null differ diff --git a/source/images/hassio/screenshots/adding_repositories.png b/source/images/hassio/screenshots/adding_repositories.png index 1ceb0ac4e8d..793c14a7730 100644 Binary files a/source/images/hassio/screenshots/adding_repositories.png and b/source/images/hassio/screenshots/adding_repositories.png differ diff --git a/source/images/hassio/screenshots/dashboard.png b/source/images/hassio/screenshots/dashboard.png index 89d4d5a60fb..55af1485c5b 100644 Binary files a/source/images/hassio/screenshots/dashboard.png and b/source/images/hassio/screenshots/dashboard.png differ diff --git a/source/images/hassio/screenshots/first-start.png b/source/images/hassio/screenshots/first-start.png index 1172012b8a9..6371a937f81 100644 Binary files a/source/images/hassio/screenshots/first-start.png and b/source/images/hassio/screenshots/first-start.png differ diff --git a/source/images/hassio/screenshots/main_panel_addon_store.png b/source/images/hassio/screenshots/main_panel_addon_store.png index 022688135f3..106d7bceab9 100644 Binary files a/source/images/hassio/screenshots/main_panel_addon_store.png and b/source/images/hassio/screenshots/main_panel_addon_store.png differ diff --git a/source/images/hassio/screenshots/ssh-upgrade.png b/source/images/hassio/screenshots/ssh-upgrade.png index aeb18accdd3..64d80f9943b 100644 Binary files a/source/images/hassio/screenshots/ssh-upgrade.png and b/source/images/hassio/screenshots/ssh-upgrade.png differ diff --git a/source/images/hero_screenshot.png b/source/images/hero_screenshot.png index d5279049250..c6a627cc2e3 100644 Binary files a/source/images/hero_screenshot.png and b/source/images/hero_screenshot.png differ diff --git a/source/images/integrations/alexa/account_linking.png b/source/images/integrations/alexa/account_linking.png index 21de02ca2f3..a49c748dfe1 100644 Binary files a/source/images/integrations/alexa/account_linking.png and b/source/images/integrations/alexa/account_linking.png differ diff --git a/source/images/integrations/alexa/alexa-108x108.png b/source/images/integrations/alexa/alexa-108x108.png index bf366d71eda..a600f57a104 100644 Binary files a/source/images/integrations/alexa/alexa-108x108.png and b/source/images/integrations/alexa/alexa-108x108.png differ diff --git a/source/images/integrations/alexa/alexa-512x512.png b/source/images/integrations/alexa/alexa-512x512.png index 72680dc204a..da2b49c1b9a 100644 Binary files a/source/images/integrations/alexa/alexa-512x512.png and b/source/images/integrations/alexa/alexa-512x512.png differ diff --git a/source/images/integrations/alexa/alexa_app_doorbell_announcement.png b/source/images/integrations/alexa/alexa_app_doorbell_announcement.png index 538dfbef5e3..eb11d27f1fd 100644 Binary files a/source/images/integrations/alexa/alexa_app_doorbell_announcement.png and b/source/images/integrations/alexa/alexa_app_doorbell_announcement.png differ diff --git a/source/images/integrations/alexa/alexa_app_garage_door_pin.png b/source/images/integrations/alexa/alexa_app_garage_door_pin.png index f13dc78de65..fe8d5ff531e 100644 Binary files a/source/images/integrations/alexa/alexa_app_garage_door_pin.png and b/source/images/integrations/alexa/alexa_app_garage_door_pin.png differ diff --git a/source/images/integrations/alexa/alexa_app_person_detection.png b/source/images/integrations/alexa/alexa_app_person_detection.png index 85fd22d720a..ab6f052f6c4 100644 Binary files a/source/images/integrations/alexa/alexa_app_person_detection.png and b/source/images/integrations/alexa/alexa_app_person_detection.png differ diff --git a/source/images/integrations/alexa/alexa_app_security_system_pin.png b/source/images/integrations/alexa/alexa_app_security_system_pin.png index 909cabb7eb2..963262c64b1 100644 Binary files a/source/images/integrations/alexa/alexa_app_security_system_pin.png and b/source/images/integrations/alexa/alexa_app_security_system_pin.png differ diff --git a/source/images/integrations/alexa/create_a_new_skill.png b/source/images/integrations/alexa/create_a_new_skill.png index 104a7317188..ca591daf133 100644 Binary files a/source/images/integrations/alexa/create_a_new_skill.png and b/source/images/integrations/alexa/create_a_new_skill.png differ diff --git a/source/images/integrations/alexa/create_iam_role_attach_permission.png b/source/images/integrations/alexa/create_iam_role_attach_permission.png index f0db3c4b710..b74b3649586 100644 Binary files a/source/images/integrations/alexa/create_iam_role_attach_permission.png and b/source/images/integrations/alexa/create_iam_role_attach_permission.png differ diff --git a/source/images/integrations/alexa/lambda_function_env_var.png b/source/images/integrations/alexa/lambda_function_env_var.png index edb8fbab2f1..54ac9046aa0 100644 Binary files a/source/images/integrations/alexa/lambda_function_env_var.png and b/source/images/integrations/alexa/lambda_function_env_var.png differ diff --git a/source/images/integrations/alexa/scene_slot.png b/source/images/integrations/alexa/scene_slot.png index 523bc067ced..c0288fa2b26 100644 Binary files a/source/images/integrations/alexa/scene_slot.png and b/source/images/integrations/alexa/scene_slot.png differ diff --git a/source/images/integrations/alexa/scene_slot_synonyms.png b/source/images/integrations/alexa/scene_slot_synonyms.png index 1696529fa9d..d447517ae66 100644 Binary files a/source/images/integrations/alexa/scene_slot_synonyms.png and b/source/images/integrations/alexa/scene_slot_synonyms.png differ diff --git a/source/images/integrations/alexa/script_slot.png b/source/images/integrations/alexa/script_slot.png index 7a12efc3972..34d463bbd99 100644 Binary files a/source/images/integrations/alexa/script_slot.png and b/source/images/integrations/alexa/script_slot.png differ diff --git a/source/images/integrations/camera/preload-stream.png b/source/images/integrations/camera/preload-stream.png index fd6d5f8c22f..7d294a5d6fa 100644 Binary files a/source/images/integrations/camera/preload-stream.png and b/source/images/integrations/camera/preload-stream.png differ diff --git a/source/images/integrations/cisco_webex_teams/rich_formatting.png b/source/images/integrations/cisco_webex_teams/rich_formatting.png index f0283718396..2fa5bf49f42 100644 Binary files a/source/images/integrations/cisco_webex_teams/rich_formatting.png and b/source/images/integrations/cisco_webex_teams/rich_formatting.png differ diff --git a/source/images/integrations/flock/flock-webhook.png b/source/images/integrations/flock/flock-webhook.png index 7723080d2ad..69da986ab3a 100644 Binary files a/source/images/integrations/flock/flock-webhook.png and b/source/images/integrations/flock/flock-webhook.png differ diff --git a/source/images/integrations/flock/new-webhook.png b/source/images/integrations/flock/new-webhook.png index 25c23303fb2..80fc29b80ff 100644 Binary files a/source/images/integrations/flock/new-webhook.png and b/source/images/integrations/flock/new-webhook.png differ diff --git a/source/images/integrations/foscam/example-card.png b/source/images/integrations/foscam/example-card.png index 7e65cc3e6f6..389e48edfc3 100644 Binary files a/source/images/integrations/foscam/example-card.png and b/source/images/integrations/foscam/example-card.png differ diff --git a/source/images/integrations/free_mobile/token.png b/source/images/integrations/free_mobile/token.png index 1c4f3a4a5c3..d6602d5d5ab 100644 Binary files a/source/images/integrations/free_mobile/token.png and b/source/images/integrations/free_mobile/token.png differ diff --git a/source/images/integrations/garadget/cover_garadget_details.png b/source/images/integrations/garadget/cover_garadget_details.png index 2337c5be91e..5afaeda6346 100644 Binary files a/source/images/integrations/garadget/cover_garadget_details.png and b/source/images/integrations/garadget/cover_garadget_details.png differ diff --git a/source/images/integrations/geonetnz_volcano/map.png b/source/images/integrations/geonetnz_volcano/map.png index b27733b30b9..beabcb00f7a 100644 Binary files a/source/images/integrations/geonetnz_volcano/map.png and b/source/images/integrations/geonetnz_volcano/map.png differ diff --git a/source/images/integrations/geonetnz_volcano/sensor.png b/source/images/integrations/geonetnz_volcano/sensor.png index 1182a96600a..7f20f861f38 100644 Binary files a/source/images/integrations/geonetnz_volcano/sensor.png and b/source/images/integrations/geonetnz_volcano/sensor.png differ diff --git a/source/images/integrations/google_assistant/accountlinking.png b/source/images/integrations/google_assistant/accountlinking.png index 83e1f3b5f8a..c1e11915ed7 100644 Binary files a/source/images/integrations/google_assistant/accountlinking.png and b/source/images/integrations/google_assistant/accountlinking.png differ diff --git a/source/images/integrations/gpslogger/custom-url.png b/source/images/integrations/gpslogger/custom-url.png index 882387bbec9..bec1fc845a3 100644 Binary files a/source/images/integrations/gpslogger/custom-url.png and b/source/images/integrations/gpslogger/custom-url.png differ diff --git a/source/images/integrations/gpslogger/logging-details.png b/source/images/integrations/gpslogger/logging-details.png index 495a00dae5a..4443d282c9e 100644 Binary files a/source/images/integrations/gpslogger/logging-details.png and b/source/images/integrations/gpslogger/logging-details.png differ diff --git a/source/images/integrations/gpslogger/performance.png b/source/images/integrations/gpslogger/performance.png index 81cd19f1f08..5605fb28e9e 100644 Binary files a/source/images/integrations/gpslogger/performance.png and b/source/images/integrations/gpslogger/performance.png differ diff --git a/source/images/integrations/gpslogger/settings.png b/source/images/integrations/gpslogger/settings.png index 52d2aea8549..63caf6c2687 100644 Binary files a/source/images/integrations/gpslogger/settings.png and b/source/images/integrations/gpslogger/settings.png differ diff --git a/source/images/integrations/haveibeenpwned/sensor.png b/source/images/integrations/haveibeenpwned/sensor.png index a3fab360c0f..6988254e7eb 100644 Binary files a/source/images/integrations/haveibeenpwned/sensor.png and b/source/images/integrations/haveibeenpwned/sensor.png differ diff --git a/source/images/integrations/ifttt/IFTTT_manything_trigger.png b/source/images/integrations/ifttt/IFTTT_manything_trigger.png index 9cabbca1e36..f6cb7545cfa 100644 Binary files a/source/images/integrations/ifttt/IFTTT_manything_trigger.png and b/source/images/integrations/ifttt/IFTTT_manything_trigger.png differ diff --git a/source/images/integrations/ifttt/finding_key.png b/source/images/integrations/ifttt/finding_key.png index ac94e39e222..448dccbc68d 100644 Binary files a/source/images/integrations/ifttt/finding_key.png and b/source/images/integrations/ifttt/finding_key.png differ diff --git a/source/images/integrations/ifttt/setup_service.png b/source/images/integrations/ifttt/setup_service.png index 7ede6c22fa1..62e5b1c1f6a 100644 Binary files a/source/images/integrations/ifttt/setup_service.png and b/source/images/integrations/ifttt/setup_service.png differ diff --git a/source/images/integrations/ifttt/setup_trigger.png b/source/images/integrations/ifttt/setup_trigger.png index 12285ca9746..12b4e42fe03 100644 Binary files a/source/images/integrations/ifttt/setup_trigger.png and b/source/images/integrations/ifttt/setup_trigger.png differ diff --git a/source/images/integrations/ifttt/testing_service.png b/source/images/integrations/ifttt/testing_service.png index 91f8fed0bb8..fb8aa883859 100644 Binary files a/source/images/integrations/ifttt/testing_service.png and b/source/images/integrations/ifttt/testing_service.png differ diff --git a/source/images/integrations/kira/kira_remote_script.png b/source/images/integrations/kira/kira_remote_script.png index 4d59731a053..15f5539cd73 100644 Binary files a/source/images/integrations/kira/kira_remote_script.png and b/source/images/integrations/kira/kira_remote_script.png differ diff --git a/source/images/integrations/kira/kira_sensor_states.png b/source/images/integrations/kira/kira_sensor_states.png index 1856a5008c6..6518dc2ea53 100644 Binary files a/source/images/integrations/kira/kira_sensor_states.png and b/source/images/integrations/kira/kira_sensor_states.png differ diff --git a/source/images/integrations/kira/kira_states.png b/source/images/integrations/kira/kira_states.png index 8d4de16a299..3dc48f19856 100644 Binary files a/source/images/integrations/kira/kira_states.png and b/source/images/integrations/kira/kira_states.png differ diff --git a/source/images/integrations/kira/kira_test_script.png b/source/images/integrations/kira/kira_test_script.png index 02aba485c58..b3c607a9977 100644 Binary files a/source/images/integrations/kira/kira_test_script.png and b/source/images/integrations/kira/kira_test_script.png differ diff --git a/source/images/integrations/light/group.png b/source/images/integrations/light/group.png index 4995a7af876..87b66034099 100644 Binary files a/source/images/integrations/light/group.png and b/source/images/integrations/light/group.png differ diff --git a/source/images/integrations/mystrom/switch-advanced.png b/source/images/integrations/mystrom/switch-advanced.png index 56c97e3af25..55b7ae416f3 100644 Binary files a/source/images/integrations/mystrom/switch-advanced.png and b/source/images/integrations/mystrom/switch-advanced.png differ diff --git a/source/images/integrations/netdata/details.png b/source/images/integrations/netdata/details.png index 7a9881f8cdb..65c243b0b86 100644 Binary files a/source/images/integrations/netdata/details.png and b/source/images/integrations/netdata/details.png differ diff --git a/source/images/integrations/pyload/pyload_speed.png b/source/images/integrations/pyload/pyload_speed.png index 4120f1d77b0..4900c4b574a 100644 Binary files a/source/images/integrations/pyload/pyload_speed.png and b/source/images/integrations/pyload/pyload_speed.png differ diff --git a/source/images/integrations/rfxtrx/sensor.png b/source/images/integrations/rfxtrx/sensor.png index bbfe288faaa..80a7563c31b 100644 Binary files a/source/images/integrations/rfxtrx/sensor.png and b/source/images/integrations/rfxtrx/sensor.png differ diff --git a/source/images/integrations/rfxtrx/switch.png b/source/images/integrations/rfxtrx/switch.png index 4ffb1cc10dd..22076f9b647 100644 Binary files a/source/images/integrations/rfxtrx/switch.png and b/source/images/integrations/rfxtrx/switch.png differ diff --git a/source/images/integrations/surepetcare/spc_ids.png b/source/images/integrations/surepetcare/spc_ids.png index 75a6d473b07..ab543537fbf 100644 Binary files a/source/images/integrations/surepetcare/spc_ids.png and b/source/images/integrations/surepetcare/spc_ids.png differ diff --git a/source/images/integrations/thethingsnetwork/access_key.png b/source/images/integrations/thethingsnetwork/access_key.png index 5685815cad7..3746ece7a7f 100644 Binary files a/source/images/integrations/thethingsnetwork/access_key.png and b/source/images/integrations/thethingsnetwork/access_key.png differ diff --git a/source/images/integrations/thethingsnetwork/add_integration.png b/source/images/integrations/thethingsnetwork/add_integration.png index 25a16ecee50..524791679dc 100644 Binary files a/source/images/integrations/thethingsnetwork/add_integration.png and b/source/images/integrations/thethingsnetwork/add_integration.png differ diff --git a/source/images/integrations/thethingsnetwork/applications.png b/source/images/integrations/thethingsnetwork/applications.png index 4accd1e9319..8aafe071dbb 100644 Binary files a/source/images/integrations/thethingsnetwork/applications.png and b/source/images/integrations/thethingsnetwork/applications.png differ diff --git a/source/images/integrations/thethingsnetwork/choose_integration.png b/source/images/integrations/thethingsnetwork/choose_integration.png index cfeb50e67dd..ad7d2a2802b 100644 Binary files a/source/images/integrations/thethingsnetwork/choose_integration.png and b/source/images/integrations/thethingsnetwork/choose_integration.png differ diff --git a/source/images/integrations/thethingsnetwork/confirm_integration.png b/source/images/integrations/thethingsnetwork/confirm_integration.png index 7eb655bf231..16ebecf21aa 100644 Binary files a/source/images/integrations/thethingsnetwork/confirm_integration.png and b/source/images/integrations/thethingsnetwork/confirm_integration.png differ diff --git a/source/images/integrations/thethingsnetwork/devices.png b/source/images/integrations/thethingsnetwork/devices.png index dbbc94ca26d..1f83f223ef3 100644 Binary files a/source/images/integrations/thethingsnetwork/devices.png and b/source/images/integrations/thethingsnetwork/devices.png differ diff --git a/source/images/integrations/thethingsnetwork/storage_integration.png b/source/images/integrations/thethingsnetwork/storage_integration.png index 31c4f45b502..d8cb74fae5f 100644 Binary files a/source/images/integrations/thethingsnetwork/storage_integration.png and b/source/images/integrations/thethingsnetwork/storage_integration.png differ diff --git a/source/images/integrations/transmission/transmission.png b/source/images/integrations/transmission/transmission.png index 23ff81a0d7e..d4ae23041e4 100644 Binary files a/source/images/integrations/transmission/transmission.png and b/source/images/integrations/transmission/transmission.png differ diff --git a/source/images/integrations/transmission/transmission_perf.png b/source/images/integrations/transmission/transmission_perf.png index af248fb2f57..573eb1a6245 100644 Binary files a/source/images/integrations/transmission/transmission_perf.png and b/source/images/integrations/transmission/transmission_perf.png differ diff --git a/source/images/integrations/zestimate/zestimateexample.png b/source/images/integrations/zestimate/zestimateexample.png index 73d37845f1b..87d3a01a73c 100644 Binary files a/source/images/integrations/zestimate/zestimateexample.png and b/source/images/integrations/zestimate/zestimateexample.png differ diff --git a/source/images/ios/actions.png b/source/images/ios/actions.png index 4c429c55410..7cc747a8268 100644 Binary files a/source/images/ios/actions.png and b/source/images/ios/actions.png differ diff --git a/source/images/ios/example.png b/source/images/ios/example.png index 881c4842716..2e4150399a7 100644 Binary files a/source/images/ios/example.png and b/source/images/ios/example.png differ diff --git a/source/images/isy994/isy994_CoverExample.png b/source/images/isy994/isy994_CoverExample.png index d47a800e09d..1226388f2ed 100644 Binary files a/source/images/isy994/isy994_CoverExample.png and b/source/images/isy994/isy994_CoverExample.png differ diff --git a/source/images/isy994/isy994_SwitchActionsExample.png b/source/images/isy994/isy994_SwitchActionsExample.png index a92f28ed8ac..9ed8148c5ed 100644 Binary files a/source/images/isy994/isy994_SwitchActionsExample.png and b/source/images/isy994/isy994_SwitchActionsExample.png differ diff --git a/source/images/isy994/isy994_SwitchStatusExample.png b/source/images/isy994/isy994_SwitchStatusExample.png index da607474b82..c36691e237e 100644 Binary files a/source/images/isy994/isy994_SwitchStatusExample.png and b/source/images/isy994/isy994_SwitchStatusExample.png differ diff --git a/source/images/line-tile.png b/source/images/line-tile.png deleted file mode 100644 index 9247c3b1f5c..00000000000 Binary files a/source/images/line-tile.png and /dev/null differ diff --git a/source/images/lovelace/lovelace-ui-comparison.png b/source/images/lovelace/lovelace-ui-comparison.png index dd09c1cd3ce..83de4f20fca 100644 Binary files a/source/images/lovelace/lovelace-ui-comparison.png and b/source/images/lovelace/lovelace-ui-comparison.png differ diff --git a/source/images/lovelace/lovelace_entity_button_card.png b/source/images/lovelace/lovelace_entity_button_card.png index 97c73772469..41fd09557f1 100644 Binary files a/source/images/lovelace/lovelace_entity_button_card.png and b/source/images/lovelace/lovelace_entity_button_card.png differ diff --git a/source/images/lovelace/lovelace_entity_button_complex_card.png b/source/images/lovelace/lovelace_entity_button_complex_card.png index 6b8d0353f4b..b6f9f285d3a 100644 Binary files a/source/images/lovelace/lovelace_entity_button_complex_card.png and b/source/images/lovelace/lovelace_entity_button_complex_card.png differ diff --git a/source/images/lovelace/lovelace_entity_card.png b/source/images/lovelace/lovelace_entity_card.png index 3a375d0610a..84ca4b37d21 100644 Binary files a/source/images/lovelace/lovelace_entity_card.png and b/source/images/lovelace/lovelace_entity_card.png differ diff --git a/source/images/lovelace/lovelace_entity_filter.png b/source/images/lovelace/lovelace_entity_filter.png index 855e770d143..fd93bf84581 100644 Binary files a/source/images/lovelace/lovelace_entity_filter.png and b/source/images/lovelace/lovelace_entity_filter.png differ diff --git a/source/images/lovelace/lovelace_entity_filter_glance.png b/source/images/lovelace/lovelace_entity_filter_glance.png index 2de12848935..0994cc4df40 100644 Binary files a/source/images/lovelace/lovelace_entity_filter_glance.png and b/source/images/lovelace/lovelace_entity_filter_glance.png differ diff --git a/source/images/lovelace/lovelace_glance_card.png b/source/images/lovelace/lovelace_glance_card.png index bee20ccc366..7752bf31a15 100644 Binary files a/source/images/lovelace/lovelace_glance_card.png and b/source/images/lovelace/lovelace_glance_card.png differ diff --git a/source/images/lovelace/lovelace_history_graph.png b/source/images/lovelace/lovelace_history_graph.png index 09548127d41..aa97bb9536c 100644 Binary files a/source/images/lovelace/lovelace_history_graph.png and b/source/images/lovelace/lovelace_history_graph.png differ diff --git a/source/images/lovelace/lovelace_history_graph_lines.png b/source/images/lovelace/lovelace_history_graph_lines.png index b1459a4053b..7e0313c4626 100644 Binary files a/source/images/lovelace/lovelace_history_graph_lines.png and b/source/images/lovelace/lovelace_history_graph_lines.png differ diff --git a/source/images/lovelace/lovelace_iframe.png b/source/images/lovelace/lovelace_iframe.png index c3bb91509b9..70d2ce203cb 100644 Binary files a/source/images/lovelace/lovelace_iframe.png and b/source/images/lovelace/lovelace_iframe.png differ diff --git a/source/images/lovelace/lovelace_light_card.png b/source/images/lovelace/lovelace_light_card.png index f0c02fbbf25..d23dda0fa25 100644 Binary files a/source/images/lovelace/lovelace_light_card.png and b/source/images/lovelace/lovelace_light_card.png differ diff --git a/source/images/lovelace/lovelace_light_complex_card.png b/source/images/lovelace/lovelace_light_complex_card.png index 10d9f8a0781..93f2bad1721 100644 Binary files a/source/images/lovelace/lovelace_light_complex_card.png and b/source/images/lovelace/lovelace_light_complex_card.png differ diff --git a/source/images/lovelace/lovelace_map_card.png b/source/images/lovelace/lovelace_map_card.png index 40e24d0b3d6..db160757ded 100644 Binary files a/source/images/lovelace/lovelace_map_card.png and b/source/images/lovelace/lovelace_map_card.png differ diff --git a/source/images/lovelace/lovelace_markdown.png b/source/images/lovelace/lovelace_markdown.png index 1fbb6d5db34..28e8655e081 100644 Binary files a/source/images/lovelace/lovelace_markdown.png and b/source/images/lovelace/lovelace_markdown.png differ diff --git a/source/images/lovelace/lovelace_picture.png b/source/images/lovelace/lovelace_picture.png index 4bb28518fa5..afb8153793a 100644 Binary files a/source/images/lovelace/lovelace_picture.png and b/source/images/lovelace/lovelace_picture.png differ diff --git a/source/images/lovelace/lovelace_plant_card.png b/source/images/lovelace/lovelace_plant_card.png index 4e0af04ecc6..d4a728cc138 100644 Binary files a/source/images/lovelace/lovelace_plant_card.png and b/source/images/lovelace/lovelace_plant_card.png differ diff --git a/source/images/lovelace/lovelace_sensor.png b/source/images/lovelace/lovelace_sensor.png index fc8b83b5c26..eefc402f127 100644 Binary files a/source/images/lovelace/lovelace_sensor.png and b/source/images/lovelace/lovelace_sensor.png differ diff --git a/source/images/lovelace/lovelace_vertical-horizontal-stack.png b/source/images/lovelace/lovelace_vertical-horizontal-stack.png index a61f393f910..2f807c2b7ed 100644 Binary files a/source/images/lovelace/lovelace_vertical-horizontal-stack.png and b/source/images/lovelace/lovelace_vertical-horizontal-stack.png differ diff --git a/source/images/lovelace/lovelace_vertical-stack.png b/source/images/lovelace/lovelace_vertical-stack.png index 40a9a485ace..80234410f5b 100644 Binary files a/source/images/lovelace/lovelace_vertical-stack.png and b/source/images/lovelace/lovelace_vertical-stack.png differ diff --git a/source/images/lovelace/lovelace_views.png b/source/images/lovelace/lovelace_views.png index aa16659b20d..6cfa5c1c0a6 100644 Binary files a/source/images/lovelace/lovelace_views.png and b/source/images/lovelace/lovelace_views.png differ diff --git a/source/images/matrix.png b/source/images/matrix.png deleted file mode 100644 index 9cecbe22098..00000000000 Binary files a/source/images/matrix.png and /dev/null differ diff --git a/source/images/noise.png b/source/images/noise.png deleted file mode 100644 index 1dad041142f..00000000000 Binary files a/source/images/noise.png and /dev/null differ diff --git a/source/images/press/ct.png b/source/images/press/ct.png index cb363b5d081..324e7a0a624 100644 Binary files a/source/images/press/ct.png and b/source/images/press/ct.png differ diff --git a/source/images/press/linux.com.png b/source/images/press/linux.com.png index aaa6bf3671e..84e5ede06f2 100644 Binary files a/source/images/press/linux.com.png and b/source/images/press/linux.com.png differ diff --git a/source/images/press/producthunt.com.png b/source/images/press/producthunt.com.png index 0d48fade592..c126acddfab 100644 Binary files a/source/images/press/producthunt.com.png and b/source/images/press/producthunt.com.png differ diff --git a/source/images/rss.png b/source/images/rss.png deleted file mode 100644 index 512242631b5..00000000000 Binary files a/source/images/rss.png and /dev/null differ diff --git a/source/images/screenshots/config-validation.png b/source/images/screenshots/config-validation.png index a5731fe6dce..7f541952908 100644 Binary files a/source/images/screenshots/config-validation.png and b/source/images/screenshots/config-validation.png differ diff --git a/source/images/screenshots/developer-tool-about-icon.png b/source/images/screenshots/developer-tool-about-icon.png index ff7b8ccf0d6..64cdb63de73 100644 Binary files a/source/images/screenshots/developer-tool-about-icon.png and b/source/images/screenshots/developer-tool-about-icon.png differ diff --git a/source/images/screenshots/developer-tool-services-icon.png b/source/images/screenshots/developer-tool-services-icon.png index 5eabdc251ca..1251cb5e399 100644 Binary files a/source/images/screenshots/developer-tool-services-icon.png and b/source/images/screenshots/developer-tool-services-icon.png differ diff --git a/source/images/screenshots/developer-tool-templates-icon.png b/source/images/screenshots/developer-tool-templates-icon.png index 0356e40593e..f7833aef9d9 100644 Binary files a/source/images/screenshots/developer-tool-templates-icon.png and b/source/images/screenshots/developer-tool-templates-icon.png differ diff --git a/source/images/screenshots/developer-tools.png b/source/images/screenshots/developer-tools.png index 1c94816eeee..0f27fcaa3ac 100644 Binary files a/source/images/screenshots/developer-tools.png and b/source/images/screenshots/developer-tools.png differ diff --git a/source/images/screenshots/discord-api.png b/source/images/screenshots/discord-api.png index 552cb3e811d..689426139e0 100644 Binary files a/source/images/screenshots/discord-api.png and b/source/images/screenshots/discord-api.png differ diff --git a/source/images/screenshots/discord-bot.png b/source/images/screenshots/discord-bot.png index 20a34996650..1597ed2ea00 100644 Binary files a/source/images/screenshots/discord-bot.png and b/source/images/screenshots/discord-bot.png differ diff --git a/source/images/screenshots/ecobee-thermostat-card.png b/source/images/screenshots/ecobee-thermostat-card.png index 4adb754c4fe..10c9c6a0a71 100644 Binary files a/source/images/screenshots/ecobee-thermostat-card.png and b/source/images/screenshots/ecobee-thermostat-card.png differ diff --git a/source/images/screenshots/gdacs-alerts-feed-map.png b/source/images/screenshots/gdacs-alerts-feed-map.png index 906f8b8f515..40c776dbbff 100644 Binary files a/source/images/screenshots/gdacs-alerts-feed-map.png and b/source/images/screenshots/gdacs-alerts-feed-map.png differ diff --git a/source/images/screenshots/gdacs-alerts-sensor.png b/source/images/screenshots/gdacs-alerts-sensor.png index ff00f6e8cba..93487344c40 100644 Binary files a/source/images/screenshots/gdacs-alerts-sensor.png and b/source/images/screenshots/gdacs-alerts-sensor.png differ diff --git a/source/images/screenshots/geo-rss-incidents-group-screenshot.png b/source/images/screenshots/geo-rss-incidents-group-screenshot.png index fe58469db35..0d7c6c02011 100644 Binary files a/source/images/screenshots/geo-rss-incidents-group-screenshot.png and b/source/images/screenshots/geo-rss-incidents-group-screenshot.png differ diff --git a/source/images/screenshots/geonetnz-quakes-feed-map.png b/source/images/screenshots/geonetnz-quakes-feed-map.png index 8f432e511a1..8bf86054f4f 100644 Binary files a/source/images/screenshots/geonetnz-quakes-feed-map.png and b/source/images/screenshots/geonetnz-quakes-feed-map.png differ diff --git a/source/images/screenshots/geonetnz-quakes-sensor.png b/source/images/screenshots/geonetnz-quakes-sensor.png index 267e3290869..6d8f5754e8b 100644 Binary files a/source/images/screenshots/geonetnz-quakes-sensor.png and b/source/images/screenshots/geonetnz-quakes-sensor.png differ diff --git a/source/images/screenshots/get_trafikverket_weather_station_example.png b/source/images/screenshots/get_trafikverket_weather_station_example.png index 4405669339a..69d952589e9 100644 Binary files a/source/images/screenshots/get_trafikverket_weather_station_example.png and b/source/images/screenshots/get_trafikverket_weather_station_example.png differ diff --git a/source/images/screenshots/habitica_new_task.png b/source/images/screenshots/habitica_new_task.png index fcd3c58a62d..f5b7a78467d 100644 Binary files a/source/images/screenshots/habitica_new_task.png and b/source/images/screenshots/habitica_new_task.png differ diff --git a/source/images/screenshots/history_graph.png b/source/images/screenshots/history_graph.png index 6a4e8e77f9e..8c88bbc9bde 100644 Binary files a/source/images/screenshots/history_graph.png and b/source/images/screenshots/history_graph.png differ diff --git a/source/images/screenshots/homekit_pairing_example.png b/source/images/screenshots/homekit_pairing_example.png index 5f83a411a3e..606bbd5ae5f 100644 Binary files a/source/images/screenshots/homekit_pairing_example.png and b/source/images/screenshots/homekit_pairing_example.png differ diff --git a/source/images/screenshots/hp_ilo.png b/source/images/screenshots/hp_ilo.png index d8ff383cdce..2a372fd6249 100644 Binary files a/source/images/screenshots/hp_ilo.png and b/source/images/screenshots/hp_ilo.png differ diff --git a/source/images/screenshots/hp_ilo_sensors.png b/source/images/screenshots/hp_ilo_sensors.png index 26e5dbe2b3c..8ebdb3c1b7c 100644 Binary files a/source/images/screenshots/hp_ilo_sensors.png and b/source/images/screenshots/hp_ilo_sensors.png differ diff --git a/source/images/screenshots/html5-notify.png b/source/images/screenshots/html5-notify.png index 3e308481938..8dde691af06 100644 Binary files a/source/images/screenshots/html5-notify.png and b/source/images/screenshots/html5-notify.png differ diff --git a/source/images/screenshots/ign-sismologia-feed-map.png b/source/images/screenshots/ign-sismologia-feed-map.png index 820d4b9a0be..400ddcd46db 100644 Binary files a/source/images/screenshots/ign-sismologia-feed-map.png and b/source/images/screenshots/ign-sismologia-feed-map.png differ diff --git a/source/images/screenshots/limitlessled_assumed_state.png b/source/images/screenshots/limitlessled_assumed_state.png index ccbdd73a1d4..cf57aa7befd 100644 Binary files a/source/images/screenshots/limitlessled_assumed_state.png and b/source/images/screenshots/limitlessled_assumed_state.png differ diff --git a/source/images/screenshots/locative.png b/source/images/screenshots/locative.png index d927d26c532..8d3367a0090 100644 Binary files a/source/images/screenshots/locative.png and b/source/images/screenshots/locative.png differ diff --git a/source/images/screenshots/logbook.png b/source/images/screenshots/logbook.png index 90f0b388821..0cd6fbeb2d0 100644 Binary files a/source/images/screenshots/logbook.png and b/source/images/screenshots/logbook.png differ diff --git a/source/images/screenshots/more-info-dialog-moon.png b/source/images/screenshots/more-info-dialog-moon.png index 48a2c545816..acc28369586 100644 Binary files a/source/images/screenshots/more-info-dialog-moon.png and b/source/images/screenshots/more-info-dialog-moon.png differ diff --git a/source/images/screenshots/more-info-dialog-roomba.png b/source/images/screenshots/more-info-dialog-roomba.png index 576411957ac..8d08df00f51 100644 Binary files a/source/images/screenshots/more-info-dialog-roomba.png and b/source/images/screenshots/more-info-dialog-roomba.png differ diff --git a/source/images/screenshots/more-info-dialog-sun.png b/source/images/screenshots/more-info-dialog-sun.png index a3e81406672..5d9660e9285 100644 Binary files a/source/images/screenshots/more-info-dialog-sun.png and b/source/images/screenshots/more-info-dialog-sun.png differ diff --git a/source/images/screenshots/mqtt-notify.png b/source/images/screenshots/mqtt-notify.png index e445440363c..62d068f4b40 100644 Binary files a/source/images/screenshots/mqtt-notify.png and b/source/images/screenshots/mqtt-notify.png differ diff --git a/source/images/screenshots/nest-thermostat-card.png b/source/images/screenshots/nest-thermostat-card.png index 2f7d4549041..39fb89d4227 100644 Binary files a/source/images/screenshots/nest-thermostat-card.png and b/source/images/screenshots/nest-thermostat-card.png differ diff --git a/source/images/screenshots/netatmo_api.png b/source/images/screenshots/netatmo_api.png index eb476917f29..7785122496b 100644 Binary files a/source/images/screenshots/netatmo_api.png and b/source/images/screenshots/netatmo_api.png differ diff --git a/source/images/screenshots/netatmo_create.png b/source/images/screenshots/netatmo_create.png index 104da866462..eb8c1b20f15 100644 Binary files a/source/images/screenshots/netatmo_create.png and b/source/images/screenshots/netatmo_create.png differ diff --git a/source/images/screenshots/nextcloud-sample-sensor.png b/source/images/screenshots/nextcloud-sample-sensor.png index dcb30a000a4..2ca9f90fe3d 100644 Binary files a/source/images/screenshots/nextcloud-sample-sensor.png and b/source/images/screenshots/nextcloud-sample-sensor.png differ diff --git a/source/images/screenshots/nexus_7_dashboard.png b/source/images/screenshots/nexus_7_dashboard.png index cfcd8eda96f..8a7e5e338ac 100644 Binary files a/source/images/screenshots/nexus_7_dashboard.png and b/source/images/screenshots/nexus_7_dashboard.png differ diff --git a/source/images/screenshots/nmbs-card-example.png b/source/images/screenshots/nmbs-card-example.png index 807c4af3901..7ba3fbfa0a0 100644 Binary files a/source/images/screenshots/nmbs-card-example.png and b/source/images/screenshots/nmbs-card-example.png differ diff --git a/source/images/screenshots/pandora_player.png b/source/images/screenshots/pandora_player.png index 83d7b28b4b0..09fe2ef7a61 100644 Binary files a/source/images/screenshots/pandora_player.png and b/source/images/screenshots/pandora_player.png differ diff --git a/source/images/screenshots/persistent-notification.png b/source/images/screenshots/persistent-notification.png index e8d3df4aedb..d8c91b5213f 100644 Binary files a/source/images/screenshots/persistent-notification.png and b/source/images/screenshots/persistent-notification.png differ diff --git a/source/images/screenshots/qld-bushfire-feed-map.png b/source/images/screenshots/qld-bushfire-feed-map.png index 620cb9e2b6a..5c265fe900c 100644 Binary files a/source/images/screenshots/qld-bushfire-feed-map.png and b/source/images/screenshots/qld-bushfire-feed-map.png differ diff --git a/source/images/screenshots/sabnzbd-configure.png b/source/images/screenshots/sabnzbd-configure.png index cd75a348403..0a5709ea4bf 100644 Binary files a/source/images/screenshots/sabnzbd-configure.png and b/source/images/screenshots/sabnzbd-configure.png differ diff --git a/source/images/screenshots/sensor_device_classes_icons.png b/source/images/screenshots/sensor_device_classes_icons.png index 28c80992922..afa2107823c 100644 Binary files a/source/images/screenshots/sensor_device_classes_icons.png and b/source/images/screenshots/sensor_device_classes_icons.png differ diff --git a/source/images/screenshots/server-management.png b/source/images/screenshots/server-management.png index 30784611491..de6d7d7c19d 100644 Binary files a/source/images/screenshots/server-management.png and b/source/images/screenshots/server-management.png differ diff --git a/source/images/screenshots/snips_modules.png b/source/images/screenshots/snips_modules.png index fd55b9e2cfc..2300e773d88 100644 Binary files a/source/images/screenshots/snips_modules.png and b/source/images/screenshots/snips_modules.png differ diff --git a/source/images/screenshots/stats-sensor.png b/source/images/screenshots/stats-sensor.png index e588a3a69e9..7d6f4077367 100644 Binary files a/source/images/screenshots/stats-sensor.png and b/source/images/screenshots/stats-sensor.png differ diff --git a/source/images/screenshots/streaming-updates.png b/source/images/screenshots/streaming-updates.png index dbe0a85de6f..ccdc6801eeb 100644 Binary files a/source/images/screenshots/streaming-updates.png and b/source/images/screenshots/streaming-updates.png differ diff --git a/source/images/screenshots/supervisor.png b/source/images/screenshots/supervisor.png index dca92e372a3..fc1c08008cc 100644 Binary files a/source/images/screenshots/supervisor.png and b/source/images/screenshots/supervisor.png differ diff --git a/source/images/screenshots/time_date.png b/source/images/screenshots/time_date.png index 564e5bd0299..5772879f7c1 100644 Binary files a/source/images/screenshots/time_date.png and b/source/images/screenshots/time_date.png differ diff --git a/source/images/screenshots/watson_tts_screen.png b/source/images/screenshots/watson_tts_screen.png index 9f551f633af..d28fcf213af 100644 Binary files a/source/images/screenshots/watson_tts_screen.png and b/source/images/screenshots/watson_tts_screen.png differ diff --git a/source/images/screenshots/wsdot_sensor.png b/source/images/screenshots/wsdot_sensor.png index 36c59069339..135944e59e3 100644 Binary files a/source/images/screenshots/wsdot_sensor.png and b/source/images/screenshots/wsdot_sensor.png differ diff --git a/source/images/screenshots/wwlln-feed-map.png b/source/images/screenshots/wwlln-feed-map.png index a2d4d846690..e3ee7fdddcd 100644 Binary files a/source/images/screenshots/wwlln-feed-map.png and b/source/images/screenshots/wwlln-feed-map.png differ diff --git a/source/images/screenshots/yessssms_brands.png b/source/images/screenshots/yessssms_brands.png index c59ebd98578..1ac0bcdbdea 100644 Binary files a/source/images/screenshots/yessssms_brands.png and b/source/images/screenshots/yessssms_brands.png differ diff --git a/source/images/supported_brands/actiontec.png b/source/images/supported_brands/actiontec.png index 590e5447d32..4afec0a715f 100644 Binary files a/source/images/supported_brands/actiontec.png and b/source/images/supported_brands/actiontec.png differ diff --git a/source/images/supported_brands/amazon-echo.png b/source/images/supported_brands/amazon-echo.png index 81b29c571d3..eb0604919cc 100644 Binary files a/source/images/supported_brands/amazon-echo.png and b/source/images/supported_brands/amazon-echo.png differ diff --git a/source/images/supported_brands/anel.png b/source/images/supported_brands/anel.png index 01a5d078887..5621d745278 100644 Binary files a/source/images/supported_brands/anel.png and b/source/images/supported_brands/anel.png differ diff --git a/source/images/supported_brands/antifurto365-ialarm.png b/source/images/supported_brands/antifurto365-ialarm.png index 3f61f9f8c12..e7ba2290cdc 100644 Binary files a/source/images/supported_brands/antifurto365-ialarm.png and b/source/images/supported_brands/antifurto365-ialarm.png differ diff --git a/source/images/supported_brands/apcupsd.png b/source/images/supported_brands/apcupsd.png index b28049d1be7..c203b53d7d2 100644 Binary files a/source/images/supported_brands/apcupsd.png and b/source/images/supported_brands/apcupsd.png differ diff --git a/source/images/supported_brands/archlinux.png b/source/images/supported_brands/archlinux.png index 5ea78092f63..541a49007e4 100644 Binary files a/source/images/supported_brands/archlinux.png and b/source/images/supported_brands/archlinux.png differ diff --git a/source/images/supported_brands/arduino.png b/source/images/supported_brands/arduino.png index f7febfb64f0..868cc413096 100644 Binary files a/source/images/supported_brands/arduino.png and b/source/images/supported_brands/arduino.png differ diff --git a/source/images/supported_brands/arest.png b/source/images/supported_brands/arest.png index bec529d2f4f..608d599cf68 100644 Binary files a/source/images/supported_brands/arest.png and b/source/images/supported_brands/arest.png differ diff --git a/source/images/supported_brands/armbian.png b/source/images/supported_brands/armbian.png index 9ce3f521d0a..623a4eae0bd 100644 Binary files a/source/images/supported_brands/armbian.png and b/source/images/supported_brands/armbian.png differ diff --git a/source/images/supported_brands/asus.png b/source/images/supported_brands/asus.png index 6b3ee1c2e37..a579350c66d 100644 Binary files a/source/images/supported_brands/asus.png and b/source/images/supported_brands/asus.png differ diff --git a/source/images/supported_brands/automatic.png b/source/images/supported_brands/automatic.png index 63decc04bd8..bf68f3209f5 100644 Binary files a/source/images/supported_brands/automatic.png and b/source/images/supported_brands/automatic.png differ diff --git a/source/images/supported_brands/aws_lambda.png b/source/images/supported_brands/aws_lambda.png index 8ee1affc107..d2b21a5f6da 100644 Binary files a/source/images/supported_brands/aws_lambda.png and b/source/images/supported_brands/aws_lambda.png differ diff --git a/source/images/supported_brands/aws_sns.png b/source/images/supported_brands/aws_sns.png index 54a97f87bfb..d052320b562 100644 Binary files a/source/images/supported_brands/aws_sns.png and b/source/images/supported_brands/aws_sns.png differ diff --git a/source/images/supported_brands/aws_sqs.png b/source/images/supported_brands/aws_sqs.png index 36532473c31..d95dd0874f8 100644 Binary files a/source/images/supported_brands/aws_sqs.png and b/source/images/supported_brands/aws_sqs.png differ diff --git a/source/images/supported_brands/beckhoff.png b/source/images/supported_brands/beckhoff.png index 1fad0a6f036..6dcc3e6a1b6 100644 Binary files a/source/images/supported_brands/beckhoff.png and b/source/images/supported_brands/beckhoff.png differ diff --git a/source/images/supported_brands/belkin_wemo.png b/source/images/supported_brands/belkin_wemo.png index 2c00ecbbf71..8f0c783ffdb 100644 Binary files a/source/images/supported_brands/belkin_wemo.png and b/source/images/supported_brands/belkin_wemo.png differ diff --git a/source/images/supported_brands/bitcoin.png b/source/images/supported_brands/bitcoin.png index bf108056437..800e99d9430 100644 Binary files a/source/images/supported_brands/bitcoin.png and b/source/images/supported_brands/bitcoin.png differ diff --git a/source/images/supported_brands/blink.png b/source/images/supported_brands/blink.png index 04f3d9ca9c9..b75a25035ac 100644 Binary files a/source/images/supported_brands/blink.png and b/source/images/supported_brands/blink.png differ diff --git a/source/images/supported_brands/blinkstick.png b/source/images/supported_brands/blinkstick.png index fa3c18ef408..d9be50add55 100644 Binary files a/source/images/supported_brands/blinkstick.png and b/source/images/supported_brands/blinkstick.png differ diff --git a/source/images/supported_brands/bloomsky.png b/source/images/supported_brands/bloomsky.png index a85de36eed4..cb6f08e2b57 100644 Binary files a/source/images/supported_brands/bloomsky.png and b/source/images/supported_brands/bloomsky.png differ diff --git a/source/images/supported_brands/bluesound.png b/source/images/supported_brands/bluesound.png index f771c126057..1ae9f1e120a 100644 Binary files a/source/images/supported_brands/bluesound.png and b/source/images/supported_brands/bluesound.png differ diff --git a/source/images/supported_brands/bluetooth.png b/source/images/supported_brands/bluetooth.png index b45d245bcb9..3362cf1dca2 100644 Binary files a/source/images/supported_brands/bluetooth.png and b/source/images/supported_brands/bluetooth.png differ diff --git a/source/images/supported_brands/bravia.png b/source/images/supported_brands/bravia.png index 0c7e98c0793..4d597e7efbd 100644 Binary files a/source/images/supported_brands/bravia.png and b/source/images/supported_brands/bravia.png differ diff --git a/source/images/supported_brands/browser.png b/source/images/supported_brands/browser.png index c069929eeaa..446877f4ac0 100644 Binary files a/source/images/supported_brands/browser.png and b/source/images/supported_brands/browser.png differ diff --git a/source/images/supported_brands/brultech.png b/source/images/supported_brands/brultech.png index 4227d3e883b..eb69058b748 100644 Binary files a/source/images/supported_brands/brultech.png and b/source/images/supported_brands/brultech.png differ diff --git a/source/images/supported_brands/bt.png b/source/images/supported_brands/bt.png index aede3c627c2..c78570cac8b 100644 Binary files a/source/images/supported_brands/bt.png and b/source/images/supported_brands/bt.png differ diff --git a/source/images/supported_brands/buienradar.png b/source/images/supported_brands/buienradar.png index 144dd59ab3f..b0c79bc50ac 100644 Binary files a/source/images/supported_brands/buienradar.png and b/source/images/supported_brands/buienradar.png differ diff --git a/source/images/supported_brands/bus_scs.png b/source/images/supported_brands/bus_scs.png index 95ddcfae57e..9522bea2ebc 100644 Binary files a/source/images/supported_brands/bus_scs.png and b/source/images/supported_brands/bus_scs.png differ diff --git a/source/images/supported_brands/centos.png b/source/images/supported_brands/centos.png index 53e287c48ae..933f6379b58 100644 Binary files a/source/images/supported_brands/centos.png and b/source/images/supported_brands/centos.png differ diff --git a/source/images/supported_brands/cpu.png b/source/images/supported_brands/cpu.png index 35fb59d06cf..ba181f080a7 100644 Binary files a/source/images/supported_brands/cpu.png and b/source/images/supported_brands/cpu.png differ diff --git a/source/images/supported_brands/crimereports.png b/source/images/supported_brands/crimereports.png index 9ce1d44088a..6d9008cad00 100644 Binary files a/source/images/supported_brands/crimereports.png and b/source/images/supported_brands/crimereports.png differ diff --git a/source/images/supported_brands/currencylayer.png b/source/images/supported_brands/currencylayer.png index ab94c649f7c..28366a34414 100644 Binary files a/source/images/supported_brands/currencylayer.png and b/source/images/supported_brands/currencylayer.png differ diff --git a/source/images/supported_brands/dark_sky.png b/source/images/supported_brands/dark_sky.png index 8c03ddf4fb6..a82e2342ca5 100644 Binary files a/source/images/supported_brands/dark_sky.png and b/source/images/supported_brands/dark_sky.png differ diff --git a/source/images/supported_brands/db.png b/source/images/supported_brands/db.png index 713ba5ea336..759fba097db 100644 Binary files a/source/images/supported_brands/db.png and b/source/images/supported_brands/db.png differ diff --git a/source/images/supported_brands/derivative.png b/source/images/supported_brands/derivative.png index aecf9f6db0b..c964dc98162 100644 Binary files a/source/images/supported_brands/derivative.png and b/source/images/supported_brands/derivative.png differ diff --git a/source/images/supported_brands/dht.png b/source/images/supported_brands/dht.png index 6f1f4fd3946..c9bd30907f6 100644 Binary files a/source/images/supported_brands/dht.png and b/source/images/supported_brands/dht.png differ diff --git a/source/images/supported_brands/digital_ocean.png b/source/images/supported_brands/digital_ocean.png index 0490a2f0302..71ccbefa282 100644 Binary files a/source/images/supported_brands/digital_ocean.png and b/source/images/supported_brands/digital_ocean.png differ diff --git a/source/images/supported_brands/diodes.png b/source/images/supported_brands/diodes.png index 2608e875de9..fa03b7b8d09 100644 Binary files a/source/images/supported_brands/diodes.png and b/source/images/supported_brands/diodes.png differ diff --git a/source/images/supported_brands/dlink.png b/source/images/supported_brands/dlink.png index 0f429a2a1fc..0711952f1fe 100644 Binary files a/source/images/supported_brands/dlink.png and b/source/images/supported_brands/dlink.png differ diff --git a/source/images/supported_brands/duckdns.png b/source/images/supported_brands/duckdns.png index c5a952a4d00..edba8d43c2b 100644 Binary files a/source/images/supported_brands/duckdns.png and b/source/images/supported_brands/duckdns.png differ diff --git a/source/images/supported_brands/dweet.png b/source/images/supported_brands/dweet.png index 5b6c1de8a18..bbde1af6d2e 100644 Binary files a/source/images/supported_brands/dweet.png and b/source/images/supported_brands/dweet.png differ diff --git a/source/images/supported_brands/ecobee.png b/source/images/supported_brands/ecobee.png index 64564fe04c0..11868607103 100644 Binary files a/source/images/supported_brands/ecobee.png and b/source/images/supported_brands/ecobee.png differ diff --git a/source/images/supported_brands/ecovacs.png b/source/images/supported_brands/ecovacs.png index 5cc27bc1e28..1b65aebfb40 100644 Binary files a/source/images/supported_brands/ecovacs.png and b/source/images/supported_brands/ecovacs.png differ diff --git a/source/images/supported_brands/edimax.png b/source/images/supported_brands/edimax.png index 87814c6866a..c0260c12a85 100644 Binary files a/source/images/supported_brands/edimax.png and b/source/images/supported_brands/edimax.png differ diff --git a/source/images/supported_brands/ee.png b/source/images/supported_brands/ee.png index b4c58d0dbfb..31630a0be3a 100644 Binary files a/source/images/supported_brands/ee.png and b/source/images/supported_brands/ee.png differ diff --git a/source/images/supported_brands/efergy.png b/source/images/supported_brands/efergy.png index 7ee20d233fe..ebec0e0fa2a 100644 Binary files a/source/images/supported_brands/efergy.png and b/source/images/supported_brands/efergy.png differ diff --git a/source/images/supported_brands/eliq.png b/source/images/supported_brands/eliq.png index b5d5b860c83..0019d96246a 100644 Binary files a/source/images/supported_brands/eliq.png and b/source/images/supported_brands/eliq.png differ diff --git a/source/images/supported_brands/emby.png b/source/images/supported_brands/emby.png index eadacf6c53a..923db7b1673 100644 Binary files a/source/images/supported_brands/emby.png and b/source/images/supported_brands/emby.png differ diff --git a/source/images/supported_brands/emoncms.png b/source/images/supported_brands/emoncms.png index c0a44a89499..233ca74fa63 100644 Binary files a/source/images/supported_brands/emoncms.png and b/source/images/supported_brands/emoncms.png differ diff --git a/source/images/supported_brands/enocean.png b/source/images/supported_brands/enocean.png index eb7b1c230f2..6c1f3782ed4 100644 Binary files a/source/images/supported_brands/enocean.png and b/source/images/supported_brands/enocean.png differ diff --git a/source/images/supported_brands/etherscan.png b/source/images/supported_brands/etherscan.png index bc1285a055f..ae06f8b215e 100644 Binary files a/source/images/supported_brands/etherscan.png and b/source/images/supported_brands/etherscan.png differ diff --git a/source/images/supported_brands/everlights.png b/source/images/supported_brands/everlights.png index ed37a52eeb6..c4ab8d6dd77 100644 Binary files a/source/images/supported_brands/everlights.png and b/source/images/supported_brands/everlights.png differ diff --git a/source/images/supported_brands/eyezon.png b/source/images/supported_brands/eyezon.png index 277468cdaf1..30b46112699 100644 Binary files a/source/images/supported_brands/eyezon.png and b/source/images/supported_brands/eyezon.png differ diff --git a/source/images/supported_brands/facebook.png b/source/images/supported_brands/facebook.png index 33d9fa99a69..668aef7f43b 100644 Binary files a/source/images/supported_brands/facebook.png and b/source/images/supported_brands/facebook.png differ diff --git a/source/images/supported_brands/fastdotcom.png b/source/images/supported_brands/fastdotcom.png index a74e5516291..a4e4a453882 100644 Binary files a/source/images/supported_brands/fastdotcom.png and b/source/images/supported_brands/fastdotcom.png differ diff --git a/source/images/supported_brands/fedora.png b/source/images/supported_brands/fedora.png index 82c15d95cf9..54a7547a20d 100644 Binary files a/source/images/supported_brands/fedora.png and b/source/images/supported_brands/fedora.png differ diff --git a/source/images/supported_brands/file.png b/source/images/supported_brands/file.png index 414351190a5..cd1b628da1b 100644 Binary files a/source/images/supported_brands/file.png and b/source/images/supported_brands/file.png differ diff --git a/source/images/supported_brands/firetv.png b/source/images/supported_brands/firetv.png index 5223aaee2bb..c2cc01fd4fd 100644 Binary files a/source/images/supported_brands/firetv.png and b/source/images/supported_brands/firetv.png differ diff --git a/source/images/supported_brands/forecast.png b/source/images/supported_brands/forecast.png index 405f2a07b72..3051a4056a3 100644 Binary files a/source/images/supported_brands/forecast.png and b/source/images/supported_brands/forecast.png differ diff --git a/source/images/supported_brands/foursquare.png b/source/images/supported_brands/foursquare.png index 50fa2173407..5a6c1d55200 100644 Binary files a/source/images/supported_brands/foursquare.png and b/source/images/supported_brands/foursquare.png differ diff --git a/source/images/supported_brands/free_mobile.png b/source/images/supported_brands/free_mobile.png index 4d8f1edc2bf..691a0d80f55 100644 Binary files a/source/images/supported_brands/free_mobile.png and b/source/images/supported_brands/free_mobile.png differ diff --git a/source/images/supported_brands/freenas.png b/source/images/supported_brands/freenas.png index 73c7e0abbf2..96b9d3e3f45 100644 Binary files a/source/images/supported_brands/freenas.png and b/source/images/supported_brands/freenas.png differ diff --git a/source/images/supported_brands/garadget.png b/source/images/supported_brands/garadget.png index f7ebfa8a248..2ea465349f9 100644 Binary files a/source/images/supported_brands/garadget.png and b/source/images/supported_brands/garadget.png differ diff --git a/source/images/supported_brands/geizhals.png b/source/images/supported_brands/geizhals.png index 73acc0437b7..d9f51bd3b8d 100644 Binary files a/source/images/supported_brands/geizhals.png and b/source/images/supported_brands/geizhals.png differ diff --git a/source/images/supported_brands/geo_location.png b/source/images/supported_brands/geo_location.png index f6517b84f9f..fb24dab02fd 100644 Binary files a/source/images/supported_brands/geo_location.png and b/source/images/supported_brands/geo_location.png differ diff --git a/source/images/supported_brands/github.png b/source/images/supported_brands/github.png index f18f109d287..b4cc98a220a 100644 Binary files a/source/images/supported_brands/github.png and b/source/images/supported_brands/github.png differ diff --git a/source/images/supported_brands/glances.png b/source/images/supported_brands/glances.png index 714bc1e10f3..cd9306ee9a4 100644 Binary files a/source/images/supported_brands/glances.png and b/source/images/supported_brands/glances.png differ diff --git a/source/images/supported_brands/goalfeed.png b/source/images/supported_brands/goalfeed.png index e193619fb95..5d19cd9a687 100644 Binary files a/source/images/supported_brands/goalfeed.png and b/source/images/supported_brands/goalfeed.png differ diff --git a/source/images/supported_brands/gogogate2.png b/source/images/supported_brands/gogogate2.png index 19e44741c07..2b6f621ad5b 100644 Binary files a/source/images/supported_brands/gogogate2.png and b/source/images/supported_brands/gogogate2.png differ diff --git a/source/images/supported_brands/grafana.png b/source/images/supported_brands/grafana.png index 6779ca5c00d..5e1035139fc 100644 Binary files a/source/images/supported_brands/grafana.png and b/source/images/supported_brands/grafana.png differ diff --git a/source/images/supported_brands/graphite.png b/source/images/supported_brands/graphite.png index 7a517bff95e..943aa76d4e5 100644 Binary files a/source/images/supported_brands/graphite.png and b/source/images/supported_brands/graphite.png differ diff --git a/source/images/supported_brands/greenwavereality.png b/source/images/supported_brands/greenwavereality.png index 06accc9ccea..8ec7f2f64d3 100644 Binary files a/source/images/supported_brands/greenwavereality.png and b/source/images/supported_brands/greenwavereality.png differ diff --git a/source/images/supported_brands/heatmiser.png b/source/images/supported_brands/heatmiser.png index f4e241bb332..713b7a5b521 100644 Binary files a/source/images/supported_brands/heatmiser.png and b/source/images/supported_brands/heatmiser.png differ diff --git a/source/images/supported_brands/hewlett_packard_enterprise.png b/source/images/supported_brands/hewlett_packard_enterprise.png index d3a4b7f64aa..8b0010f552d 100644 Binary files a/source/images/supported_brands/hewlett_packard_enterprise.png and b/source/images/supported_brands/hewlett_packard_enterprise.png differ diff --git a/source/images/supported_brands/home-assistant.png b/source/images/supported_brands/home-assistant.png index 05968432459..c093ccb5cbe 100644 Binary files a/source/images/supported_brands/home-assistant.png and b/source/images/supported_brands/home-assistant.png differ diff --git a/source/images/supported_brands/homematic.png b/source/images/supported_brands/homematic.png index af7636a85e3..df900b8b19c 100644 Binary files a/source/images/supported_brands/homematic.png and b/source/images/supported_brands/homematic.png differ diff --git a/source/images/supported_brands/honeywell.png b/source/images/supported_brands/honeywell.png index 99431ce9cec..f8ad8ff6f27 100644 Binary files a/source/images/supported_brands/honeywell.png and b/source/images/supported_brands/honeywell.png differ diff --git a/source/images/supported_brands/html5.png b/source/images/supported_brands/html5.png index f2d0610a89f..96382adae1f 100644 Binary files a/source/images/supported_brands/html5.png and b/source/images/supported_brands/html5.png differ diff --git a/source/images/supported_brands/hunter-douglas-powerview.png b/source/images/supported_brands/hunter-douglas-powerview.png index 1c356e8f47e..9208cd4fe20 100644 Binary files a/source/images/supported_brands/hunter-douglas-powerview.png and b/source/images/supported_brands/hunter-douglas-powerview.png differ diff --git a/source/images/supported_brands/icloud.png b/source/images/supported_brands/icloud.png index 240910c2a6f..b761581a3f1 100644 Binary files a/source/images/supported_brands/icloud.png and b/source/images/supported_brands/icloud.png differ diff --git a/source/images/supported_brands/ifttt.png b/source/images/supported_brands/ifttt.png index c4fcce17626..7f4dd9217cd 100644 Binary files a/source/images/supported_brands/ifttt.png and b/source/images/supported_brands/ifttt.png differ diff --git a/source/images/supported_brands/iglo.png b/source/images/supported_brands/iglo.png index 55e851a612e..59c3233fbf2 100644 Binary files a/source/images/supported_brands/iglo.png and b/source/images/supported_brands/iglo.png differ diff --git a/source/images/supported_brands/influxdb.png b/source/images/supported_brands/influxdb.png index 5addabd00b5..8a14f1c907c 100644 Binary files a/source/images/supported_brands/influxdb.png and b/source/images/supported_brands/influxdb.png differ diff --git a/source/images/supported_brands/insteon.png b/source/images/supported_brands/insteon.png index 1e4146f9140..12b10b9e0f6 100644 Binary files a/source/images/supported_brands/insteon.png and b/source/images/supported_brands/insteon.png differ diff --git a/source/images/supported_brands/interlogix.png b/source/images/supported_brands/interlogix.png index bb1cc4fe3e8..158c0361ab8 100644 Binary files a/source/images/supported_brands/interlogix.png and b/source/images/supported_brands/interlogix.png differ diff --git a/source/images/supported_brands/intesishome.png b/source/images/supported_brands/intesishome.png index 88733475338..79c61265409 100644 Binary files a/source/images/supported_brands/intesishome.png and b/source/images/supported_brands/intesishome.png differ diff --git a/source/images/supported_brands/joaoapps_join.png b/source/images/supported_brands/joaoapps_join.png index ec98d253f7c..e27f5e06098 100644 Binary files a/source/images/supported_brands/joaoapps_join.png and b/source/images/supported_brands/joaoapps_join.png differ diff --git a/source/images/supported_brands/jupyter.png b/source/images/supported_brands/jupyter.png index f2848f5ffb2..8cad4d9e225 100644 Binary files a/source/images/supported_brands/jupyter.png and b/source/images/supported_brands/jupyter.png differ diff --git a/source/images/supported_brands/kodi.png b/source/images/supported_brands/kodi.png index 4287f1240ec..54f70783494 100644 Binary files a/source/images/supported_brands/kodi.png and b/source/images/supported_brands/kodi.png differ diff --git a/source/images/supported_brands/lagute.png b/source/images/supported_brands/lagute.png index 86112847428..9669a196361 100644 Binary files a/source/images/supported_brands/lagute.png and b/source/images/supported_brands/lagute.png differ diff --git a/source/images/supported_brands/lametric.png b/source/images/supported_brands/lametric.png index e04d4f60e83..1202a68a378 100644 Binary files a/source/images/supported_brands/lametric.png and b/source/images/supported_brands/lametric.png differ diff --git a/source/images/supported_brands/lannouncer.png b/source/images/supported_brands/lannouncer.png index f06a6fa3213..989d54a4731 100644 Binary files a/source/images/supported_brands/lannouncer.png and b/source/images/supported_brands/lannouncer.png differ diff --git a/source/images/supported_brands/lastfm.png b/source/images/supported_brands/lastfm.png index 97881c81e78..9f584413514 100644 Binary files a/source/images/supported_brands/lastfm.png and b/source/images/supported_brands/lastfm.png differ diff --git a/source/images/supported_brands/letsencrypt.png b/source/images/supported_brands/letsencrypt.png index c4a1d1afc0c..42054709648 100644 Binary files a/source/images/supported_brands/letsencrypt.png and b/source/images/supported_brands/letsencrypt.png differ diff --git a/source/images/supported_brands/lifx.png b/source/images/supported_brands/lifx.png index c4d0347d73c..fa815e7d62d 100644 Binary files a/source/images/supported_brands/lifx.png and b/source/images/supported_brands/lifx.png differ diff --git a/source/images/supported_brands/lightwave.png b/source/images/supported_brands/lightwave.png index 834baffbe8e..7318f5c909a 100644 Binary files a/source/images/supported_brands/lightwave.png and b/source/images/supported_brands/lightwave.png differ diff --git a/source/images/supported_brands/limitlessled_logo.png b/source/images/supported_brands/limitlessled_logo.png index 736a1f8d744..81b1e99acd8 100644 Binary files a/source/images/supported_brands/limitlessled_logo.png and b/source/images/supported_brands/limitlessled_logo.png differ diff --git a/source/images/supported_brands/linksys.png b/source/images/supported_brands/linksys.png deleted file mode 100644 index d7c040169db..00000000000 Binary files a/source/images/supported_brands/linksys.png and /dev/null differ diff --git a/source/images/supported_brands/linux_battery.png b/source/images/supported_brands/linux_battery.png index 63b3ade78ca..935227eeef5 100644 Binary files a/source/images/supported_brands/linux_battery.png and b/source/images/supported_brands/linux_battery.png differ diff --git a/source/images/supported_brands/locative.png b/source/images/supported_brands/locative.png index 7a2ce692213..74003748653 100644 Binary files a/source/images/supported_brands/locative.png and b/source/images/supported_brands/locative.png differ diff --git a/source/images/supported_brands/logbook.png b/source/images/supported_brands/logbook.png index eab2c4b2e9a..7ac99ddeada 100644 Binary files a/source/images/supported_brands/logbook.png and b/source/images/supported_brands/logbook.png differ diff --git a/source/images/supported_brands/logitech.png b/source/images/supported_brands/logitech.png index 3fe51000b7f..57f062b43d6 100644 Binary files a/source/images/supported_brands/logitech.png and b/source/images/supported_brands/logitech.png differ diff --git a/source/images/supported_brands/loop.png b/source/images/supported_brands/loop.png index 3102fc3bea4..1fbfc0b5b82 100644 Binary files a/source/images/supported_brands/loop.png and b/source/images/supported_brands/loop.png differ diff --git a/source/images/supported_brands/magic_light.png b/source/images/supported_brands/magic_light.png index 617043095af..4258883f7ae 100644 Binary files a/source/images/supported_brands/magic_light.png and b/source/images/supported_brands/magic_light.png differ diff --git a/source/images/supported_brands/manything.png b/source/images/supported_brands/manything.png index 4a8fdfc5484..4a08eb1de73 100644 Binary files a/source/images/supported_brands/manything.png and b/source/images/supported_brands/manything.png differ diff --git a/source/images/supported_brands/maxcube.png b/source/images/supported_brands/maxcube.png index adb84e46bb3..e77fc470498 100644 Binary files a/source/images/supported_brands/maxcube.png and b/source/images/supported_brands/maxcube.png differ diff --git a/source/images/supported_brands/message_bird.png b/source/images/supported_brands/message_bird.png index 7c1da4ab635..655168bbda6 100644 Binary files a/source/images/supported_brands/message_bird.png and b/source/images/supported_brands/message_bird.png differ diff --git a/source/images/supported_brands/meteoalarm.png b/source/images/supported_brands/meteoalarm.png index 051e171170b..b48c46ce0a3 100644 Binary files a/source/images/supported_brands/meteoalarm.png and b/source/images/supported_brands/meteoalarm.png differ diff --git a/source/images/supported_brands/mpd.png b/source/images/supported_brands/mpd.png index 1e34f02028d..c286fe31ab9 100644 Binary files a/source/images/supported_brands/mpd.png and b/source/images/supported_brands/mpd.png differ diff --git a/source/images/supported_brands/mqtt.png b/source/images/supported_brands/mqtt.png index fc2ca9f5e00..a613d97241b 100644 Binary files a/source/images/supported_brands/mqtt.png and b/source/images/supported_brands/mqtt.png differ diff --git a/source/images/supported_brands/mythic_beasts.png b/source/images/supported_brands/mythic_beasts.png index cba448237c0..6249811fcdf 100644 Binary files a/source/images/supported_brands/mythic_beasts.png and b/source/images/supported_brands/mythic_beasts.png differ diff --git a/source/images/supported_brands/netatmo.png b/source/images/supported_brands/netatmo.png index d88272271bd..8c51e65377d 100644 Binary files a/source/images/supported_brands/netatmo.png and b/source/images/supported_brands/netatmo.png differ diff --git a/source/images/supported_brands/networx.png b/source/images/supported_brands/networx.png index 586977725f2..08f96629d80 100644 Binary files a/source/images/supported_brands/networx.png and b/source/images/supported_brands/networx.png differ diff --git a/source/images/supported_brands/neurio.png b/source/images/supported_brands/neurio.png index b1f1a5b779a..e64643ce4e2 100644 Binary files a/source/images/supported_brands/neurio.png and b/source/images/supported_brands/neurio.png differ diff --git a/source/images/supported_brands/nma.png b/source/images/supported_brands/nma.png index d0ffe50119e..c1bba0aea81 100644 Binary files a/source/images/supported_brands/nma.png and b/source/images/supported_brands/nma.png differ diff --git a/source/images/supported_brands/nuimo.png b/source/images/supported_brands/nuimo.png index 35d7441f7d9..eaef2d92f06 100644 Binary files a/source/images/supported_brands/nuimo.png and b/source/images/supported_brands/nuimo.png differ diff --git a/source/images/supported_brands/nzbget.png b/source/images/supported_brands/nzbget.png index 78d0ed77c94..30c1bf56df9 100644 Binary files a/source/images/supported_brands/nzbget.png and b/source/images/supported_brands/nzbget.png differ diff --git a/source/images/supported_brands/obitalk.png b/source/images/supported_brands/obitalk.png index 3c8b28cd7dd..51d13fecbaa 100644 Binary files a/source/images/supported_brands/obitalk.png and b/source/images/supported_brands/obitalk.png differ diff --git a/source/images/supported_brands/ohmconnect.png b/source/images/supported_brands/ohmconnect.png index 1b6cb5df1f7..98b6df070b9 100644 Binary files a/source/images/supported_brands/ohmconnect.png and b/source/images/supported_brands/ohmconnect.png differ diff --git a/source/images/supported_brands/onkyo.png b/source/images/supported_brands/onkyo.png index 873873b8d1a..2476c2d2b57 100644 Binary files a/source/images/supported_brands/onkyo.png and b/source/images/supported_brands/onkyo.png differ diff --git a/source/images/supported_brands/openalpr.png b/source/images/supported_brands/openalpr.png index 49e8d063d15..3d0a2bb4beb 100644 Binary files a/source/images/supported_brands/openalpr.png and b/source/images/supported_brands/openalpr.png differ diff --git a/source/images/supported_brands/openexchangerates.png b/source/images/supported_brands/openexchangerates.png index 18c524245c3..32638758638 100644 Binary files a/source/images/supported_brands/openexchangerates.png and b/source/images/supported_brands/openexchangerates.png differ diff --git a/source/images/supported_brands/openweathermap.png b/source/images/supported_brands/openweathermap.png index 88d119ca946..90cdf766ff5 100644 Binary files a/source/images/supported_brands/openweathermap.png and b/source/images/supported_brands/openweathermap.png differ diff --git a/source/images/supported_brands/openwebif.png b/source/images/supported_brands/openwebif.png index dcf13e70de7..c53a60ada11 100644 Binary files a/source/images/supported_brands/openwebif.png and b/source/images/supported_brands/openwebif.png differ diff --git a/source/images/supported_brands/openwrt.png b/source/images/supported_brands/openwrt.png index 6ccb69c4da6..c504c3615d5 100644 Binary files a/source/images/supported_brands/openwrt.png and b/source/images/supported_brands/openwrt.png differ diff --git a/source/images/supported_brands/orvibo.png b/source/images/supported_brands/orvibo.png index 28e80facc8a..dd4b4adce94 100644 Binary files a/source/images/supported_brands/orvibo.png and b/source/images/supported_brands/orvibo.png differ diff --git a/source/images/supported_brands/osramlightify.png b/source/images/supported_brands/osramlightify.png index 56e2a8acef1..7fbdf33a4a0 100644 Binary files a/source/images/supported_brands/osramlightify.png and b/source/images/supported_brands/osramlightify.png differ diff --git a/source/images/supported_brands/p5.png b/source/images/supported_brands/p5.png index 1eeed1e79d3..1b4aefc0aad 100644 Binary files a/source/images/supported_brands/p5.png and b/source/images/supported_brands/p5.png differ diff --git a/source/images/supported_brands/panasonic.png b/source/images/supported_brands/panasonic.png index 14e1a4d54d0..ceabd440aaa 100644 Binary files a/source/images/supported_brands/panasonic.png and b/source/images/supported_brands/panasonic.png differ diff --git a/source/images/supported_brands/pandora.png b/source/images/supported_brands/pandora.png index e620c4215d1..7243dc21977 100644 Binary files a/source/images/supported_brands/pandora.png and b/source/images/supported_brands/pandora.png differ diff --git a/source/images/supported_brands/pencil.png b/source/images/supported_brands/pencil.png index dc081a33647..2687d94e704 100644 Binary files a/source/images/supported_brands/pencil.png and b/source/images/supported_brands/pencil.png differ diff --git a/source/images/supported_brands/pencom.png b/source/images/supported_brands/pencom.png index fcb4f9e3164..0955754efa1 100644 Binary files a/source/images/supported_brands/pencom.png and b/source/images/supported_brands/pencom.png differ diff --git a/source/images/supported_brands/philips.png b/source/images/supported_brands/philips.png index f54a56b2e53..343b551dbf5 100644 Binary files a/source/images/supported_brands/philips.png and b/source/images/supported_brands/philips.png differ diff --git a/source/images/supported_brands/philips_hue.png b/source/images/supported_brands/philips_hue.png index a0520559e64..630233654bd 100644 Binary files a/source/images/supported_brands/philips_hue.png and b/source/images/supported_brands/philips_hue.png differ diff --git a/source/images/supported_brands/pi_hole.png b/source/images/supported_brands/pi_hole.png index f3509b9c3b0..585b171e320 100644 Binary files a/source/images/supported_brands/pi_hole.png and b/source/images/supported_brands/pi_hole.png differ diff --git a/source/images/supported_brands/pjlink.png b/source/images/supported_brands/pjlink.png index e0ed2df748c..2c41c353ae8 100644 Binary files a/source/images/supported_brands/pjlink.png and b/source/images/supported_brands/pjlink.png differ diff --git a/source/images/supported_brands/plex.png b/source/images/supported_brands/plex.png index cb9ea6164e4..1d9518d059b 100644 Binary files a/source/images/supported_brands/plex.png and b/source/images/supported_brands/plex.png differ diff --git a/source/images/supported_brands/proliphix.png b/source/images/supported_brands/proliphix.png index 09a2ca0975f..b6eeb132d69 100644 Binary files a/source/images/supported_brands/proliphix.png and b/source/images/supported_brands/proliphix.png differ diff --git a/source/images/supported_brands/pulseaudio.png b/source/images/supported_brands/pulseaudio.png index 78fd9447797..63429a36626 100644 Binary files a/source/images/supported_brands/pulseaudio.png and b/source/images/supported_brands/pulseaudio.png differ diff --git a/source/images/supported_brands/pushbullet.png b/source/images/supported_brands/pushbullet.png index e1a8e110030..9d61cf383b8 100644 Binary files a/source/images/supported_brands/pushbullet.png and b/source/images/supported_brands/pushbullet.png differ diff --git a/source/images/supported_brands/pushover.png b/source/images/supported_brands/pushover.png index c6357413710..ed0e6d3da8f 100644 Binary files a/source/images/supported_brands/pushover.png and b/source/images/supported_brands/pushover.png differ diff --git a/source/images/supported_brands/pushsafer.png b/source/images/supported_brands/pushsafer.png index a28546036c1..86dc33e01e6 100644 Binary files a/source/images/supported_brands/pushsafer.png and b/source/images/supported_brands/pushsafer.png differ diff --git a/source/images/supported_brands/qvr_pro.png b/source/images/supported_brands/qvr_pro.png index 99e1e73763e..e21ffd96444 100644 Binary files a/source/images/supported_brands/qvr_pro.png and b/source/images/supported_brands/qvr_pro.png differ diff --git a/source/images/supported_brands/radiotherm.png b/source/images/supported_brands/radiotherm.png index 2a25832e141..a30415b7c04 100644 Binary files a/source/images/supported_brands/radiotherm.png and b/source/images/supported_brands/radiotherm.png differ diff --git a/source/images/supported_brands/raincloud.jpg b/source/images/supported_brands/raincloud.jpg deleted file mode 100644 index 3a37fa93826..00000000000 Binary files a/source/images/supported_brands/raincloud.jpg and /dev/null differ diff --git a/source/images/supported_brands/raspberry-pi.png b/source/images/supported_brands/raspberry-pi.png index 6a1ee224e71..c5208526d38 100644 Binary files a/source/images/supported_brands/raspberry-pi.png and b/source/images/supported_brands/raspberry-pi.png differ diff --git a/source/images/supported_brands/rest.png b/source/images/supported_brands/rest.png index a0f6a501ec6..1111957e859 100644 Binary files a/source/images/supported_brands/rest.png and b/source/images/supported_brands/rest.png differ diff --git a/source/images/supported_brands/rflink.png b/source/images/supported_brands/rflink.png index dec8696ae95..736da752d5a 100644 Binary files a/source/images/supported_brands/rflink.png and b/source/images/supported_brands/rflink.png differ diff --git a/source/images/supported_brands/rocket.png b/source/images/supported_brands/rocket.png index e6807e72bd2..15f98dac6e8 100644 Binary files a/source/images/supported_brands/rocket.png and b/source/images/supported_brands/rocket.png differ diff --git a/source/images/supported_brands/russound.png b/source/images/supported_brands/russound.png index 6662c0763b6..220f47ed3b4 100644 Binary files a/source/images/supported_brands/russound.png and b/source/images/supported_brands/russound.png differ diff --git a/source/images/supported_brands/sabnzbd.png b/source/images/supported_brands/sabnzbd.png index 1bd54122331..bfa556987b2 100644 Binary files a/source/images/supported_brands/sabnzbd.png and b/source/images/supported_brands/sabnzbd.png differ diff --git a/source/images/supported_brands/samsung.png b/source/images/supported_brands/samsung.png index 14ff81b07c7..c7496439e1b 100644 Binary files a/source/images/supported_brands/samsung.png and b/source/images/supported_brands/samsung.png differ diff --git a/source/images/supported_brands/seegelsysteme.png b/source/images/supported_brands/seegelsysteme.png index 9d618241bab..11c5efda8a7 100644 Binary files a/source/images/supported_brands/seegelsysteme.png and b/source/images/supported_brands/seegelsysteme.png differ diff --git a/source/images/supported_brands/serial_pm.png b/source/images/supported_brands/serial_pm.png index 64c811e492b..208abc6cd75 100644 Binary files a/source/images/supported_brands/serial_pm.png and b/source/images/supported_brands/serial_pm.png differ diff --git a/source/images/supported_brands/slack.png b/source/images/supported_brands/slack.png index 7399d7a7f6c..8cb09ba8860 100644 Binary files a/source/images/supported_brands/slack.png and b/source/images/supported_brands/slack.png differ diff --git a/source/images/supported_brands/sleepiq.png b/source/images/supported_brands/sleepiq.png index a2f31c9ea42..3320d9f7cb3 100644 Binary files a/source/images/supported_brands/sleepiq.png and b/source/images/supported_brands/sleepiq.png differ diff --git a/source/images/supported_brands/smtp.png b/source/images/supported_brands/smtp.png index 771791f8e0b..03127e604cc 100644 Binary files a/source/images/supported_brands/smtp.png and b/source/images/supported_brands/smtp.png differ diff --git a/source/images/supported_brands/sochain.png b/source/images/supported_brands/sochain.png index e2b3d8831ad..4b9b3d7563f 100644 Binary files a/source/images/supported_brands/sochain.png and b/source/images/supported_brands/sochain.png differ diff --git a/source/images/supported_brands/sonos.png b/source/images/supported_brands/sonos.png index 34da4bf7222..d7f8e983e28 100644 Binary files a/source/images/supported_brands/sonos.png and b/source/images/supported_brands/sonos.png differ diff --git a/source/images/supported_brands/sony.png b/source/images/supported_brands/sony.png index 75f72970ee7..0075cb6efc6 100644 Binary files a/source/images/supported_brands/sony.png and b/source/images/supported_brands/sony.png differ diff --git a/source/images/supported_brands/speedtest.png b/source/images/supported_brands/speedtest.png index 6a4c68fec94..01acef070d0 100644 Binary files a/source/images/supported_brands/speedtest.png and b/source/images/supported_brands/speedtest.png differ diff --git a/source/images/supported_brands/splunk.png b/source/images/supported_brands/splunk.png index 20a7ae6d168..d02c0407bf4 100644 Binary files a/source/images/supported_brands/splunk.png and b/source/images/supported_brands/splunk.png differ diff --git a/source/images/supported_brands/steam.png b/source/images/supported_brands/steam.png index d595e8d3e78..c41100e12d2 100644 Binary files a/source/images/supported_brands/steam.png and b/source/images/supported_brands/steam.png differ diff --git a/source/images/supported_brands/sun.png b/source/images/supported_brands/sun.png index 07352fc4dea..0af1075db4c 100644 Binary files a/source/images/supported_brands/sun.png and b/source/images/supported_brands/sun.png differ diff --git a/source/images/supported_brands/synology.png b/source/images/supported_brands/synology.png index 2058a9a7874..8f77363a304 100644 Binary files a/source/images/supported_brands/synology.png and b/source/images/supported_brands/synology.png differ diff --git a/source/images/supported_brands/ted.png b/source/images/supported_brands/ted.png index e2c5cb37485..64be965b086 100644 Binary files a/source/images/supported_brands/ted.png and b/source/images/supported_brands/ted.png differ diff --git a/source/images/supported_brands/telegram.png b/source/images/supported_brands/telegram.png index 999eb0c17a6..b8d5ad3b299 100644 Binary files a/source/images/supported_brands/telegram.png and b/source/images/supported_brands/telegram.png differ diff --git a/source/images/supported_brands/telldus_tellstick.png b/source/images/supported_brands/telldus_tellstick.png index 2af305d02e2..7732af5b3e1 100644 Binary files a/source/images/supported_brands/telldus_tellstick.png and b/source/images/supported_brands/telldus_tellstick.png differ diff --git a/source/images/supported_brands/thinkingcleaner.png b/source/images/supported_brands/thinkingcleaner.png index e0329573bff..ace8c16c120 100644 Binary files a/source/images/supported_brands/thinkingcleaner.png and b/source/images/supported_brands/thinkingcleaner.png differ diff --git a/source/images/supported_brands/tor.png b/source/images/supported_brands/tor.png index cff8a72d9b8..8a5a6b0962a 100644 Binary files a/source/images/supported_brands/tor.png and b/source/images/supported_brands/tor.png differ diff --git a/source/images/supported_brands/tp-link.png b/source/images/supported_brands/tp-link.png index 4ae87ff3b2d..e8eb4292b3a 100644 Binary files a/source/images/supported_brands/tp-link.png and b/source/images/supported_brands/tp-link.png differ diff --git a/source/images/supported_brands/transmission.png b/source/images/supported_brands/transmission.png index 441030ea46e..4668cda84b9 100644 Binary files a/source/images/supported_brands/transmission.png and b/source/images/supported_brands/transmission.png differ diff --git a/source/images/supported_brands/twilio.png b/source/images/supported_brands/twilio.png index f709b1ddcf4..76545a73fb7 100644 Binary files a/source/images/supported_brands/twilio.png and b/source/images/supported_brands/twilio.png differ diff --git a/source/images/supported_brands/twitter.png b/source/images/supported_brands/twitter.png index ad7cf339a5a..49e6aea9d95 100644 Binary files a/source/images/supported_brands/twitter.png and b/source/images/supported_brands/twitter.png differ diff --git a/source/images/supported_brands/uber.png b/source/images/supported_brands/uber.png index 49fb9ab866a..4b0b696c268 100644 Binary files a/source/images/supported_brands/uber.png and b/source/images/supported_brands/uber.png differ diff --git a/source/images/supported_brands/ubiquiti.png b/source/images/supported_brands/ubiquiti.png index 53ee39abe7b..8dd06e27079 100644 Binary files a/source/images/supported_brands/ubiquiti.png and b/source/images/supported_brands/ubiquiti.png differ diff --git a/source/images/supported_brands/unitymedia.png b/source/images/supported_brands/unitymedia.png index ba1d9b93de4..e76d4e2118c 100644 Binary files a/source/images/supported_brands/unitymedia.png and b/source/images/supported_brands/unitymedia.png differ diff --git a/source/images/supported_brands/universal_devices.png b/source/images/supported_brands/universal_devices.png index b885040837b..c5cb51355eb 100644 Binary files a/source/images/supported_brands/universal_devices.png and b/source/images/supported_brands/universal_devices.png differ diff --git a/source/images/supported_brands/vasttrafik.png b/source/images/supported_brands/vasttrafik.png index fe6c4690b15..7b2b666b03c 100644 Binary files a/source/images/supported_brands/vasttrafik.png and b/source/images/supported_brands/vasttrafik.png differ diff --git a/source/images/supported_brands/vera.png b/source/images/supported_brands/vera.png index e3d6f5f06a2..097b419fed6 100644 Binary files a/source/images/supported_brands/vera.png and b/source/images/supported_brands/vera.png differ diff --git a/source/images/supported_brands/verisure.png b/source/images/supported_brands/verisure.png index 02d930ed042..a8955403085 100644 Binary files a/source/images/supported_brands/verisure.png and b/source/images/supported_brands/verisure.png differ diff --git a/source/images/supported_brands/view-dashboard.png b/source/images/supported_brands/view-dashboard.png index c4741917b79..b58a017861b 100644 Binary files a/source/images/supported_brands/view-dashboard.png and b/source/images/supported_brands/view-dashboard.png differ diff --git a/source/images/supported_brands/volvo.png b/source/images/supported_brands/volvo.png index 92801a3f7e0..a494399a92e 100644 Binary files a/source/images/supported_brands/volvo.png and b/source/images/supported_brands/volvo.png differ diff --git a/source/images/supported_brands/webos.png b/source/images/supported_brands/webos.png index 8e64c85105d..16a19547bb1 100644 Binary files a/source/images/supported_brands/webos.png and b/source/images/supported_brands/webos.png differ diff --git a/source/images/supported_brands/worx.png b/source/images/supported_brands/worx.png index a889f9099da..24c7f22523b 100644 Binary files a/source/images/supported_brands/worx.png and b/source/images/supported_brands/worx.png differ diff --git a/source/images/supported_brands/wunderground.png b/source/images/supported_brands/wunderground.png index a42865e0ddf..67089c81e47 100644 Binary files a/source/images/supported_brands/wunderground.png and b/source/images/supported_brands/wunderground.png differ diff --git a/source/images/supported_brands/xbox-live.png b/source/images/supported_brands/xbox-live.png index c0b4d0be044..414b06ce17c 100644 Binary files a/source/images/supported_brands/xbox-live.png and b/source/images/supported_brands/xbox-live.png differ diff --git a/source/images/supported_brands/xmpp.png b/source/images/supported_brands/xmpp.png index 5c702d976e4..e8f2aa48d34 100644 Binary files a/source/images/supported_brands/xmpp.png and b/source/images/supported_brands/xmpp.png differ diff --git a/source/images/supported_brands/yamaha.png b/source/images/supported_brands/yamaha.png index e2920de7404..9de52b90f56 100644 Binary files a/source/images/supported_brands/yamaha.png and b/source/images/supported_brands/yamaha.png differ diff --git a/source/images/supported_brands/yeelight.png b/source/images/supported_brands/yeelight.png index fb4a5e9a5d1..d1b3b432503 100644 Binary files a/source/images/supported_brands/yeelight.png and b/source/images/supported_brands/yeelight.png differ diff --git a/source/images/supported_brands/yr.png b/source/images/supported_brands/yr.png index 4f6e3dac21f..413c2bf1eae 100644 Binary files a/source/images/supported_brands/yr.png and b/source/images/supported_brands/yr.png differ diff --git a/source/images/supported_brands/zigbee.png b/source/images/supported_brands/zigbee.png index 1ae4dafdb50..c8869b2de50 100644 Binary files a/source/images/supported_brands/zigbee.png and b/source/images/supported_brands/zigbee.png differ