diff --git a/atom.xml b/atom.xml index 4bcef57ef3..ea75fb25f5 100644 --- a/atom.xml +++ b/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ @@ -13,6 +13,143 @@ Octopress + + <![CDATA[We Have Apps Now]]> + + 2016-08-16T10:00:00+00:00 + https://home-assistant.io/blog/2016/08/16/we-have-apps-now + I have been working on a new subsystem to complement Home Assistant’s Automation and Scripting components. AppDaemon is a python daemon that consumes events from Home Assistant and feeds them to snippets of python code called “Apps”. An App is a Python class that is instantiated possibly multiple times from AppDaemon and registers callbacks for various system events. It is also able to inspect and set state and call services. The API provides a rich environment suited to home automation tasks that can also leverage all the power of Python.

+ + + +

Another Take on Automation

+ +

If you haven’t yet read Paulus’ excellent Blog entry on 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 lightswitch - 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 to 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 it’s 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 appdeamon 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 config 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 it’s 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, 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 additonal 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 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 2 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.

+ +
+
import appapi
+
+class OutsideLights(appapi.AppDaemon):
+
+  def initialize(self):
+    self.run_at_sunrise(self.sunrise_cb, 0)
+    self.run_at_sunset(self.sunset_cb, 0)
+    
+  def sunrise_cb(self, args, kwargs):
+    self.turn_on(self.args["off_scene"])
+
+  def sunset_cb(self, args, 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 callack 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:

+ +
+
import 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.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.

+ +
+
import 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.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 provided 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 yout 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. You can find it, here, including full installation instructions, an API reference, and a number of fully fleshed out examples.

+ +

Happy Automating!

+]]>
+
+ <![CDATA[0.26: Foursquare, Fast.com, FFMPEG and GPSD]]> @@ -1600,21 +1737,6 @@ target_dir /tmp

So there it is, the reason why we use Polymer.

-]]> -
- - - <![CDATA[Video: How To Configure Home Assistant]]> - - 2016-05-12T00:09:00+00:00 - https://home-assistant.io/blog/2016/05/12/video-configuring-home-assistant - Ben from BRUH Automation authors a lot of great video’s about how he is using Home Assistant and how you can get started with it too. The video below will walk you through how to configure Home Assistant. Enjoy!

- -

Make sure to subscribe to his YouTube channel for more Home Assistant video’s.

- -
- -
]]>
diff --git a/blog/2014/12/18/website-launched/index.html b/blog/2014/12/18/website-launched/index.html index d0a478ce51..a8c60bca3f 100644 --- a/blog/2014/12/18/website-launched/index.html +++ b/blog/2014/12/18/website-launched/index.html @@ -169,6 +169,12 @@ diff --git a/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html b/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html index bee8d95171..fd4732e53d 100644 --- a/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html +++ b/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html @@ -224,6 +224,12 @@ This article will try to explain how they all relate.

diff --git a/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html b/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html index 7af55f9103..90f3c30706 100644 --- a/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html +++ b/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html @@ -208,6 +208,12 @@ api_key=ABCDEFGHJKLMNOPQRSTUVXYZ diff --git a/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html b/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html index 4de19b9e7f..f9bc442334 100644 --- a/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html +++ b/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html @@ -183,6 +183,12 @@ diff --git a/blog/2015/01/13/nest-in-da-house/index.html b/blog/2015/01/13/nest-in-da-house/index.html index 4d9f76b2a9..1f953dc26b 100644 --- a/blog/2015/01/13/nest-in-da-house/index.html +++ b/blog/2015/01/13/nest-in-da-house/index.html @@ -186,6 +186,12 @@ password=YOUR_PASSWORD diff --git a/blog/2015/01/24/release-notes/index.html b/blog/2015/01/24/release-notes/index.html index d469e5cd84..a46854b689 100644 --- a/blog/2015/01/24/release-notes/index.html +++ b/blog/2015/01/24/release-notes/index.html @@ -192,6 +192,12 @@ Home Assistant now supports --open-ui and --demo-mode diff --git a/blog/2015/02/08/looking-at-the-past/index.html b/blog/2015/02/08/looking-at-the-past/index.html index e2ac75fe1a..bb159928d6 100644 --- a/blog/2015/02/08/looking-at-the-past/index.html +++ b/blog/2015/02/08/looking-at-the-past/index.html @@ -200,6 +200,12 @@ Events are saved in a local database. Google Graphs is used to draw the graph. D diff --git a/blog/2015/02/24/streaming-updates/index.html b/blog/2015/02/24/streaming-updates/index.html index 19ddf06400..5a5f9fbde2 100644 --- a/blog/2015/02/24/streaming-updates/index.html +++ b/blog/2015/02/24/streaming-updates/index.html @@ -185,6 +185,12 @@ diff --git a/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html b/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html index 1fe88e48de..00e5305052 100644 --- a/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html +++ b/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html @@ -175,6 +175,12 @@ diff --git a/blog/2015/03/08/new-logo/index.html b/blog/2015/03/08/new-logo/index.html index 6800b73540..d436d91996 100644 --- a/blog/2015/03/08/new-logo/index.html +++ b/blog/2015/03/08/new-logo/index.html @@ -176,6 +176,12 @@ The old logo, the new detailed logo and the new simple logo. diff --git a/blog/2015/03/11/release-notes/index.html b/blog/2015/03/11/release-notes/index.html index d229113050..9b93145242 100644 --- a/blog/2015/03/11/release-notes/index.html +++ b/blog/2015/03/11/release-notes/index.html @@ -215,6 +215,12 @@ An initial version of voice control for Home Assistant has landed. The current i diff --git a/blog/2015/03/22/release-notes/index.html b/blog/2015/03/22/release-notes/index.html index 35f9b068f6..f128ccc5c3 100644 --- a/blog/2015/03/22/release-notes/index.html +++ b/blog/2015/03/22/release-notes/index.html @@ -252,6 +252,12 @@ I (Paulus) have contributed a scene component. A user can create scenes that cap diff --git a/blog/2015/04/25/release-notes/index.html b/blog/2015/04/25/release-notes/index.html index 6e560c2092..e63a3b60eb 100644 --- a/blog/2015/04/25/release-notes/index.html +++ b/blog/2015/04/25/release-notes/index.html @@ -263,6 +263,12 @@ diff --git a/blog/2015/05/09/utc-time-zone-awareness/index.html b/blog/2015/05/09/utc-time-zone-awareness/index.html index 1f0926af8c..c763363dd3 100644 --- a/blog/2015/05/09/utc-time-zone-awareness/index.html +++ b/blog/2015/05/09/utc-time-zone-awareness/index.html @@ -198,6 +198,12 @@ diff --git a/blog/2015/05/14/release-notes/index.html b/blog/2015/05/14/release-notes/index.html index a51e17d643..a3f51ce6d2 100644 --- a/blog/2015/05/14/release-notes/index.html +++ b/blog/2015/05/14/release-notes/index.html @@ -290,6 +290,12 @@ Before diving into the newly supported devices and services, I want to highlight diff --git a/blog/2015/06/10/release-notes/index.html b/blog/2015/06/10/release-notes/index.html index 6513be379a..6872772545 100644 --- a/blog/2015/06/10/release-notes/index.html +++ b/blog/2015/06/10/release-notes/index.html @@ -343,6 +343,12 @@ This switch platform allows you to control your motion detection setting on your diff --git a/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html b/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html index ff7b8b5100..e00e35046e 100644 --- a/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html +++ b/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html @@ -295,6 +295,12 @@ Fabian has added support for Forecast.io to g diff --git a/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html b/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html index dd0f979f16..483d25320c 100644 --- a/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html +++ b/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html @@ -284,6 +284,12 @@ Support for Temper temperature sensors has been contributed by +
  • + We Have Apps Now +
  • + + +
  • 0.26: Foursquare, Fast.com, FFMPEG and GPSD
  • @@ -307,12 +313,6 @@ Support for Temper temperature sensors has been contributed by - ESP8266 and MicroPython - Part 1 - - - diff --git a/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html b/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html index a8d7f6302e..08271c5bc4 100644 --- a/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html +++ b/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html @@ -194,6 +194,12 @@ diff --git a/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html b/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html index 2f902f8c0d..93327c7749 100644 --- a/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html +++ b/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html @@ -307,6 +307,12 @@ The automation and script syntax here is using a deprecated and no longer suppor diff --git a/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html b/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html index 113f860002..4943909a6a 100644 --- a/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html +++ b/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html @@ -281,6 +281,12 @@ diff --git a/blog/2015/09/11/different-ways-to-use-mqtt-with-home-assistant/index.html b/blog/2015/09/11/different-ways-to-use-mqtt-with-home-assistant/index.html index 744890f935..7ba1a1641f 100644 --- a/blog/2015/09/11/different-ways-to-use-mqtt-with-home-assistant/index.html +++ b/blog/2015/09/11/different-ways-to-use-mqtt-with-home-assistant/index.html @@ -484,6 +484,12 @@ PubSubClient client(ethClient); diff --git a/blog/2015/09/13/home-assistant-meets-ifttt/index.html b/blog/2015/09/13/home-assistant-meets-ifttt/index.html index 39892aeb3a..3fdeca48b1 100644 --- a/blog/2015/09/13/home-assistant-meets-ifttt/index.html +++ b/blog/2015/09/13/home-assistant-meets-ifttt/index.html @@ -343,6 +343,12 @@ diff --git a/blog/2015/09/18/monitoring-with-glances-and-home-assistant/index.html b/blog/2015/09/18/monitoring-with-glances-and-home-assistant/index.html index f065b211a4..fb2855172a 100644 --- a/blog/2015/09/18/monitoring-with-glances-and-home-assistant/index.html +++ b/blog/2015/09/18/monitoring-with-glances-and-home-assistant/index.html @@ -244,6 +244,12 @@ Glances web server started on http://0.0.0.0:61208/ diff --git a/blog/2015/09/19/alarm-sonos-and-itunes-support/index.html b/blog/2015/09/19/alarm-sonos-and-itunes-support/index.html index 3fc6783ca8..982b6e74ce 100644 --- a/blog/2015/09/19/alarm-sonos-and-itunes-support/index.html +++ b/blog/2015/09/19/alarm-sonos-and-itunes-support/index.html @@ -223,6 +223,12 @@ Automation has gotten a lot of love. It now supports conditions, multiple trigge diff --git a/blog/2015/10/05/home-assistant-goes-geo-with-owntracks/index.html b/blog/2015/10/05/home-assistant-goes-geo-with-owntracks/index.html index 1eecffefd7..1dd2b2ae96 100644 --- a/blog/2015/10/05/home-assistant-goes-geo-with-owntracks/index.html +++ b/blog/2015/10/05/home-assistant-goes-geo-with-owntracks/index.html @@ -199,6 +199,12 @@ Map in Home Assistant showing two people and three zones (home, school, work) diff --git a/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/index.html b/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/index.html index dd429299f9..5f9e3e7e96 100644 --- a/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/index.html +++ b/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/index.html @@ -543,6 +543,12 @@ Adafruit_HDC1000 hdc = Adafruit_HDC1000(); diff --git a/blog/2015/10/11/rfxtrx-blinkstick-and-snmp-support/index.html b/blog/2015/10/11/rfxtrx-blinkstick-and-snmp-support/index.html index c3426b6689..c4cb948885 100644 --- a/blog/2015/10/11/rfxtrx-blinkstick-and-snmp-support/index.html +++ b/blog/2015/10/11/rfxtrx-blinkstick-and-snmp-support/index.html @@ -188,6 +188,12 @@ diff --git a/blog/2015/10/26/firetv-and-radiotherm-now-supported/index.html b/blog/2015/10/26/firetv-and-radiotherm-now-supported/index.html index 64bfb2af5c..f27f82765a 100644 --- a/blog/2015/10/26/firetv-and-radiotherm-now-supported/index.html +++ b/blog/2015/10/26/firetv-and-radiotherm-now-supported/index.html @@ -210,6 +210,12 @@ This makes more sense as most people run Home Assistant as a daemon

    diff --git a/blog/2015/11/16/zwave-switches-lights-and-honeywell-thermostats-now-supported/index.html b/blog/2015/11/16/zwave-switches-lights-and-honeywell-thermostats-now-supported/index.html index f302d3b9d3..7c7f1a1029 100644 --- a/blog/2015/11/16/zwave-switches-lights-and-honeywell-thermostats-now-supported/index.html +++ b/blog/2015/11/16/zwave-switches-lights-and-honeywell-thermostats-now-supported/index.html @@ -206,6 +206,12 @@ diff --git a/blog/2015/11/22/survey-november-2015/index.html b/blog/2015/11/22/survey-november-2015/index.html index c478d15ffa..665a90faa1 100644 --- a/blog/2015/11/22/survey-november-2015/index.html +++ b/blog/2015/11/22/survey-november-2015/index.html @@ -246,6 +246,12 @@ diff --git a/blog/2015/12/05/community-highlights/index.html b/blog/2015/12/05/community-highlights/index.html index 77ee54f6e2..b7b8ce5724 100644 --- a/blog/2015/12/05/community-highlights/index.html +++ b/blog/2015/12/05/community-highlights/index.html @@ -181,6 +181,12 @@ diff --git a/blog/2015/12/06/locks-rollershutters-binary-sensors-and-influxdb-support/index.html b/blog/2015/12/06/locks-rollershutters-binary-sensors-and-influxdb-support/index.html index 4968b14005..efcde5d723 100644 --- a/blog/2015/12/06/locks-rollershutters-binary-sensors-and-influxdb-support/index.html +++ b/blog/2015/12/06/locks-rollershutters-binary-sensors-and-influxdb-support/index.html @@ -188,6 +188,12 @@ diff --git a/blog/2015/12/07/influxdb-and-grafana/index.html b/blog/2015/12/07/influxdb-and-grafana/index.html index 2199eb127a..44b15f5d2e 100644 --- a/blog/2015/12/07/influxdb-and-grafana/index.html +++ b/blog/2015/12/07/influxdb-and-grafana/index.html @@ -279,6 +279,12 @@ $ sudo systemctl status grafana-server diff --git a/blog/2015/12/10/activating-tasker-tasks-from-home-assistant-using-command-line-switches/index.html b/blog/2015/12/10/activating-tasker-tasks-from-home-assistant-using-command-line-switches/index.html index 2493089e2d..2cc68b9205 100644 --- a/blog/2015/12/10/activating-tasker-tasks-from-home-assistant-using-command-line-switches/index.html +++ b/blog/2015/12/10/activating-tasker-tasks-from-home-assistant-using-command-line-switches/index.html @@ -229,6 +229,12 @@ requests.get(' +
  • + We Have Apps Now +
  • + + +
  • 0.26: Foursquare, Fast.com, FFMPEG and GPSD
  • @@ -252,12 +258,6 @@ requests.get(' - ESP8266 and MicroPython - Part 1 - - - diff --git a/blog/2015/12/12/philips-hue-blocks-3rd-party-bulbs/index.html b/blog/2015/12/12/philips-hue-blocks-3rd-party-bulbs/index.html index ee1d5580e9..65e5e3a665 100644 --- a/blog/2015/12/12/philips-hue-blocks-3rd-party-bulbs/index.html +++ b/blog/2015/12/12/philips-hue-blocks-3rd-party-bulbs/index.html @@ -201,6 +201,12 @@ Philips Hue FAQ entries regarding 3rd party light bulbs. diff --git a/blog/2015/12/13/setup-encryption-using-lets-encrypt/index.html b/blog/2015/12/13/setup-encryption-using-lets-encrypt/index.html index 6abce6a4a2..6010358e73 100644 --- a/blog/2015/12/13/setup-encryption-using-lets-encrypt/index.html +++ b/blog/2015/12/13/setup-encryption-using-lets-encrypt/index.html @@ -268,6 +268,12 @@ sudo docker run -it --rm -p 80:80 --name certbot \ diff --git a/blog/2015/12/22/amazon-echo-icloud-and-templates/index.html b/blog/2015/12/22/amazon-echo-icloud-and-templates/index.html index 29a5b8bf29..6d906dad49 100644 --- a/blog/2015/12/22/amazon-echo-icloud-and-templates/index.html +++ b/blog/2015/12/22/amazon-echo-icloud-and-templates/index.html @@ -222,6 +222,12 @@ diff --git a/blog/2016/01/17/extended-support-for-diy-solutions/index.html b/blog/2016/01/17/extended-support-for-diy-solutions/index.html index ef63a032a6..9a7633a966 100644 --- a/blog/2016/01/17/extended-support-for-diy-solutions/index.html +++ b/blog/2016/01/17/extended-support-for-diy-solutions/index.html @@ -202,6 +202,12 @@ diff --git a/blog/2016/01/19/perfect-home-automation/index.html b/blog/2016/01/19/perfect-home-automation/index.html index cf95b72b65..39c6f2bd25 100644 --- a/blog/2016/01/19/perfect-home-automation/index.html +++ b/blog/2016/01/19/perfect-home-automation/index.html @@ -206,6 +206,12 @@ diff --git a/blog/2016/01/30/insteon-lifx-twitter-and-zigbee/index.html b/blog/2016/01/30/insteon-lifx-twitter-and-zigbee/index.html index f1d9d9fa36..d392367c6d 100644 --- a/blog/2016/01/30/insteon-lifx-twitter-and-zigbee/index.html +++ b/blog/2016/01/30/insteon-lifx-twitter-and-zigbee/index.html @@ -208,6 +208,12 @@ Example of the new views in the frontend. Learn mor diff --git a/blog/2016/02/09/smarter-smart-things-with-mqtt-and-home-assistant/index.html b/blog/2016/02/09/smarter-smart-things-with-mqtt-and-home-assistant/index.html index 818b2e4200..c964fb3012 100644 --- a/blog/2016/02/09/smarter-smart-things-with-mqtt-and-home-assistant/index.html +++ b/blog/2016/02/09/smarter-smart-things-with-mqtt-and-home-assistant/index.html @@ -395,6 +395,12 @@ Z-Wave light bulb | diff --git a/blog/2016/02/12/classifying-the-internet-of-things/index.html b/blog/2016/02/12/classifying-the-internet-of-things/index.html index e70c4aa6e6..08ecd88ed0 100644 --- a/blog/2016/02/12/classifying-the-internet-of-things/index.html +++ b/blog/2016/02/12/classifying-the-internet-of-things/index.html @@ -345,6 +345,12 @@ diff --git a/blog/2016/02/13/speedtest-bloomsky-splunk-and-garage-doors/index.html b/blog/2016/02/13/speedtest-bloomsky-splunk-and-garage-doors/index.html index a134420e43..58a74029f8 100644 --- a/blog/2016/02/13/speedtest-bloomsky-splunk-and-garage-doors/index.html +++ b/blog/2016/02/13/speedtest-bloomsky-splunk-and-garage-doors/index.html @@ -211,6 +211,12 @@ diff --git a/blog/2016/02/18/multi-room-audio-with-snapcast/index.html b/blog/2016/02/18/multi-room-audio-with-snapcast/index.html index c0a57519ec..270aea01af 100644 --- a/blog/2016/02/18/multi-room-audio-with-snapcast/index.html +++ b/blog/2016/02/18/multi-room-audio-with-snapcast/index.html @@ -313,6 +313,12 @@ output = audioresample ! audio/x-raw,rate=48000,channels=2,format=S16LE ! audioc diff --git a/blog/2016/02/20/community-highlights/index.html b/blog/2016/02/20/community-highlights/index.html index d31e791070..0b6351a37b 100644 --- a/blog/2016/02/20/community-highlights/index.html +++ b/blog/2016/02/20/community-highlights/index.html @@ -221,6 +221,12 @@ Hold your NFC tag against the belly of Garfield to unlock the alarm. diff --git a/blog/2016/02/27/steam-d-link-smart-plugs-and-neurio-energy-sensors/index.html b/blog/2016/02/27/steam-d-link-smart-plugs-and-neurio-energy-sensors/index.html index 85745f1f31..95148b3fa3 100644 --- a/blog/2016/02/27/steam-d-link-smart-plugs-and-neurio-energy-sensors/index.html +++ b/blog/2016/02/27/steam-d-link-smart-plugs-and-neurio-energy-sensors/index.html @@ -210,6 +210,12 @@ diff --git a/blog/2016/03/12/z-wave-pep257-templated-service-calls/index.html b/blog/2016/03/12/z-wave-pep257-templated-service-calls/index.html index c939af029e..d05bbe653c 100644 --- a/blog/2016/03/12/z-wave-pep257-templated-service-calls/index.html +++ b/blog/2016/03/12/z-wave-pep257-templated-service-calls/index.html @@ -216,6 +216,12 @@ player state attributes. This change affects automations, scripts and scenes. +
  • + We Have Apps Now +
  • + + +
  • 0.26: Foursquare, Fast.com, FFMPEG and GPSD
  • @@ -239,12 +245,6 @@ player state attributes. This change affects automations, scripts and scenes. - -
  • - ESP8266 and MicroPython - Part 1 -
  • - - diff --git a/blog/2016/03/26/embedded-mqtt-broker-uber-yamaha-growl/index.html b/blog/2016/03/26/embedded-mqtt-broker-uber-yamaha-growl/index.html index b52369f464..35ff73f1e0 100644 --- a/blog/2016/03/26/embedded-mqtt-broker-uber-yamaha-growl/index.html +++ b/blog/2016/03/26/embedded-mqtt-broker-uber-yamaha-growl/index.html @@ -227,6 +227,12 @@ diff --git a/blog/2016/04/05/your-hub-should-be-local-and-open/index.html b/blog/2016/04/05/your-hub-should-be-local-and-open/index.html index ac8fa4872b..a27c730d4d 100644 --- a/blog/2016/04/05/your-hub-should-be-local-and-open/index.html +++ b/blog/2016/04/05/your-hub-should-be-local-and-open/index.html @@ -179,6 +179,12 @@ diff --git a/blog/2016/04/07/static-website/index.html b/blog/2016/04/07/static-website/index.html index 839b07fad7..fd1678b5be 100644 --- a/blog/2016/04/07/static-website/index.html +++ b/blog/2016/04/07/static-website/index.html @@ -185,6 +185,12 @@ diff --git a/blog/2016/04/09/onkyo-panasonic-gtfs-and-config-validation/index.html b/blog/2016/04/09/onkyo-panasonic-gtfs-and-config-validation/index.html index ea837fa9fc..0cfa2beb25 100644 --- a/blog/2016/04/09/onkyo-panasonic-gtfs-and-config-validation/index.html +++ b/blog/2016/04/09/onkyo-panasonic-gtfs-and-config-validation/index.html @@ -193,6 +193,12 @@ diff --git a/blog/2016/04/17/updated-documentation/index.html b/blog/2016/04/17/updated-documentation/index.html index 73e8121543..1ac42d230a 100644 --- a/blog/2016/04/17/updated-documentation/index.html +++ b/blog/2016/04/17/updated-documentation/index.html @@ -177,6 +177,12 @@ diff --git a/blog/2016/04/19/to-infinity-and-beyond/index.html b/blog/2016/04/19/to-infinity-and-beyond/index.html index 7242ca8030..c557ed44e4 100644 --- a/blog/2016/04/19/to-infinity-and-beyond/index.html +++ b/blog/2016/04/19/to-infinity-and-beyond/index.html @@ -194,6 +194,12 @@ diff --git a/blog/2016/04/20/bluetooth-lg-webos-tvs-and-roombas/index.html b/blog/2016/04/20/bluetooth-lg-webos-tvs-and-roombas/index.html index 983aa5047e..5e40cb5ffe 100644 --- a/blog/2016/04/20/bluetooth-lg-webos-tvs-and-roombas/index.html +++ b/blog/2016/04/20/bluetooth-lg-webos-tvs-and-roombas/index.html @@ -212,6 +212,12 @@ diff --git a/blog/2016/04/30/ibeacons-part-1-making-presence-detection-work-better/index.html b/blog/2016/04/30/ibeacons-part-1-making-presence-detection-work-better/index.html index 020a1bbc10..03f57a735e 100644 --- a/blog/2016/04/30/ibeacons-part-1-making-presence-detection-work-better/index.html +++ b/blog/2016/04/30/ibeacons-part-1-making-presence-detection-work-better/index.html @@ -303,6 +303,12 @@ For example, my wife works next door - and I couldn’t detect whether she’s a diff --git a/blog/2016/05/06/open-iot-summit-talk/index.html b/blog/2016/05/06/open-iot-summit-talk/index.html index 6b04cb36bd..6dbace3bf5 100644 --- a/blog/2016/05/06/open-iot-summit-talk/index.html +++ b/blog/2016/05/06/open-iot-summit-talk/index.html @@ -175,6 +175,12 @@ diff --git a/blog/2016/05/07/empowering-scripts-and-alexa/index.html b/blog/2016/05/07/empowering-scripts-and-alexa/index.html index 5674ec0f49..e088b27d4a 100644 --- a/blog/2016/05/07/empowering-scripts-and-alexa/index.html +++ b/blog/2016/05/07/empowering-scripts-and-alexa/index.html @@ -265,6 +265,12 @@ diff --git a/blog/2016/05/12/video-configuring-home-assistant/index.html b/blog/2016/05/12/video-configuring-home-assistant/index.html index be88188c7b..757d0a9263 100644 --- a/blog/2016/05/12/video-configuring-home-assistant/index.html +++ b/blog/2016/05/12/video-configuring-home-assistant/index.html @@ -175,6 +175,12 @@ diff --git a/blog/2016/05/18/why-we-use-polymer/index.html b/blog/2016/05/18/why-we-use-polymer/index.html index 3621950fcd..df981cbda8 100644 --- a/blog/2016/05/18/why-we-use-polymer/index.html +++ b/blog/2016/05/18/why-we-use-polymer/index.html @@ -189,6 +189,12 @@ diff --git a/blog/2016/05/21/release-020/index.html b/blog/2016/05/21/release-020/index.html index d8e702dd40..af95f85986 100644 --- a/blog/2016/05/21/release-020/index.html +++ b/blog/2016/05/21/release-020/index.html @@ -210,6 +210,12 @@ diff --git a/blog/2016/05/22/get-started-with-all-in-one-installer/index.html b/blog/2016/05/22/get-started-with-all-in-one-installer/index.html index f5bd25b965..a1ba5b8bbc 100644 --- a/blog/2016/05/22/get-started-with-all-in-one-installer/index.html +++ b/blog/2016/05/22/get-started-with-all-in-one-installer/index.html @@ -181,6 +181,12 @@ diff --git a/blog/2016/05/26/ibeacons-how-to-track-things-that-cant-track-themselves-part-ii/index.html b/blog/2016/05/26/ibeacons-how-to-track-things-that-cant-track-themselves-part-ii/index.html index 4d18dddeeb..b5b624b1a2 100644 --- a/blog/2016/05/26/ibeacons-how-to-track-things-that-cant-track-themselves-part-ii/index.html +++ b/blog/2016/05/26/ibeacons-how-to-track-things-that-cant-track-themselves-part-ii/index.html @@ -319,6 +319,12 @@ diff --git a/blog/2016/06/01/community-highlights/index.html b/blog/2016/06/01/community-highlights/index.html index 3d1ddd43da..71ac43089c 100644 --- a/blog/2016/06/01/community-highlights/index.html +++ b/blog/2016/06/01/community-highlights/index.html @@ -195,6 +195,12 @@ diff --git a/blog/2016/06/08/super-fast-web-enocean-lirc/index.html b/blog/2016/06/08/super-fast-web-enocean-lirc/index.html index 0cd5780d89..b55bb71b76 100644 --- a/blog/2016/06/08/super-fast-web-enocean-lirc/index.html +++ b/blog/2016/06/08/super-fast-web-enocean-lirc/index.html @@ -229,6 +229,12 @@ diff --git a/blog/2016/06/13/home-assistant-at-pycon-2016/index.html b/blog/2016/06/13/home-assistant-at-pycon-2016/index.html index 3c04888894..927fde36a3 100644 --- a/blog/2016/06/13/home-assistant-at-pycon-2016/index.html +++ b/blog/2016/06/13/home-assistant-at-pycon-2016/index.html @@ -200,6 +200,12 @@ diff --git a/blog/2016/06/18/pandora-bt-home-hub-5-and-local-file-camera/index.html b/blog/2016/06/18/pandora-bt-home-hub-5-and-local-file-camera/index.html index 6dcba24a40..ff6c04027f 100644 --- a/blog/2016/06/18/pandora-bt-home-hub-5-and-local-file-camera/index.html +++ b/blog/2016/06/18/pandora-bt-home-hub-5-and-local-file-camera/index.html @@ -224,6 +224,12 @@ diff --git a/blog/2016/06/23/usb-webcams-and-home-assistant/index.html b/blog/2016/06/23/usb-webcams-and-home-assistant/index.html index 019e6f2b14..8badf66399 100644 --- a/blog/2016/06/23/usb-webcams-and-home-assistant/index.html +++ b/blog/2016/06/23/usb-webcams-and-home-assistant/index.html @@ -290,6 +290,12 @@ target_dir /tmp diff --git a/blog/2016/07/01/envisalink-homematic-hdmi-cec-and-sony-bravia-tv/index.html b/blog/2016/07/01/envisalink-homematic-hdmi-cec-and-sony-bravia-tv/index.html index a45c93895c..8a8818cdfe 100644 --- a/blog/2016/07/01/envisalink-homematic-hdmi-cec-and-sony-bravia-tv/index.html +++ b/blog/2016/07/01/envisalink-homematic-hdmi-cec-and-sony-bravia-tv/index.html @@ -223,6 +223,12 @@ diff --git a/blog/2016/07/06/pocketchip-running-home-assistant/index.html b/blog/2016/07/06/pocketchip-running-home-assistant/index.html index e61bdad20a..ace0deec23 100644 --- a/blog/2016/07/06/pocketchip-running-home-assistant/index.html +++ b/blog/2016/07/06/pocketchip-running-home-assistant/index.html @@ -226,6 +226,12 @@ $ hass --open-ui diff --git a/blog/2016/07/16/sqlalchemy-knx-join-simplisafe/index.html b/blog/2016/07/16/sqlalchemy-knx-join-simplisafe/index.html index efafba9af1..8e715d65c7 100644 --- a/blog/2016/07/16/sqlalchemy-knx-join-simplisafe/index.html +++ b/blog/2016/07/16/sqlalchemy-knx-join-simplisafe/index.html @@ -230,6 +230,12 @@ $ hass --script db_migrator --config /path/to/config diff --git a/blog/2016/07/19/visualizing-your-iot-data/index.html b/blog/2016/07/19/visualizing-your-iot-data/index.html index 4fe44117b1..398cafc96b 100644 --- a/blog/2016/07/19/visualizing-your-iot-data/index.html +++ b/blog/2016/07/19/visualizing-your-iot-data/index.html @@ -278,6 +278,12 @@ plt.savefig(' +
  • + We Have Apps Now +
  • + + +
  • 0.26: Foursquare, Fast.com, FFMPEG and GPSD
  • @@ -301,12 +307,6 @@ plt.savefig(' - ESP8266 and MicroPython - Part 1 - - - diff --git a/blog/2016/07/23/internet-of-things-data-exploration-with-jupyter-notebooks/index.html b/blog/2016/07/23/internet-of-things-data-exploration-with-jupyter-notebooks/index.html index 92de70f089..30a4cd2f70 100644 --- a/blog/2016/07/23/internet-of-things-data-exploration-with-jupyter-notebooks/index.html +++ b/blog/2016/07/23/internet-of-things-data-exploration-with-jupyter-notebooks/index.html @@ -235,6 +235,12 @@ One of the graphs created with this tutorial. diff --git a/blog/2016/07/28/esp8266-and-micropython-part1/index.html b/blog/2016/07/28/esp8266-and-micropython-part1/index.html index 3bc3a7aa30..c04e75b071 100644 --- a/blog/2016/07/28/esp8266-and-micropython-part1/index.html +++ b/blog/2016/07/28/esp8266-and-micropython-part1/index.html @@ -336,6 +336,12 @@ PIN = 5 diff --git a/blog/2016/07/30/custom-frontend-panels-jupyter-notebooks-directv/index.html b/blog/2016/07/30/custom-frontend-panels-jupyter-notebooks-directv/index.html index cdab675cb1..b3fdd62229 100644 --- a/blog/2016/07/30/custom-frontend-panels-jupyter-notebooks-directv/index.html +++ b/blog/2016/07/30/custom-frontend-panels-jupyter-notebooks-directv/index.html @@ -237,6 +237,12 @@ diff --git a/blog/2016/08/03/laundry-automation-update/index.html b/blog/2016/08/03/laundry-automation-update/index.html index c05fa28101..6577561b82 100644 --- a/blog/2016/08/03/laundry-automation-update/index.html +++ b/blog/2016/08/03/laundry-automation-update/index.html @@ -276,6 +276,12 @@ diff --git a/blog/2016/08/07/optimizing-the-home-assistant-mobile-web-app/index.html b/blog/2016/08/07/optimizing-the-home-assistant-mobile-web-app/index.html index a357e3109b..57b9fa5c69 100644 --- a/blog/2016/08/07/optimizing-the-home-assistant-mobile-web-app/index.html +++ b/blog/2016/08/07/optimizing-the-home-assistant-mobile-web-app/index.html @@ -312,6 +312,12 @@ document.body.appendChild(spinner); diff --git a/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/index.html b/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/index.html index 3635b5e563..dd9012fedb 100644 --- a/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/index.html +++ b/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/index.html @@ -232,6 +232,12 @@ diff --git a/blog/2016/08/16/we-have-apps-now/index.html b/blog/2016/08/16/we-have-apps-now/index.html new file mode 100644 index 0000000000..b0a99c627c --- /dev/null +++ b/blog/2016/08/16/we-have-apps-now/index.html @@ -0,0 +1,378 @@ + + + + + + + + + + We Have Apps Now - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + +
    +
    + +
    + + +
    + +
    + +

    We Have Apps Now

    + + + +
    + + + 10 minutes reading time + + + + + + Comments + +
    + +
    + + +

    I have been working on a new subsystem to complement Home Assistant’s Automation and Scripting components. AppDaemon is a python daemon that consumes events from Home Assistant and feeds them to snippets of python code called “Apps”. An App is a Python class that is instantiated possibly multiple times from AppDaemon and registers callbacks for various system events. It is also able to inspect and set state and call services. The API provides a rich environment suited to home automation tasks that can also leverage all the power of Python.

    + + + +

    Another Take on Automation

    + +

    If you haven’t yet read Paulus’ excellent Blog entry on 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 lightswitch - 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 to 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 it’s 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 appdeamon 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 config 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 it’s 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, 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 additonal 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 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 2 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.

    + +
    +
    import appapi
    +
    +class OutsideLights(appapi.AppDaemon):
    +
    +  def initialize(self):
    +    self.run_at_sunrise(self.sunrise_cb, 0)
    +    self.run_at_sunset(self.sunset_cb, 0)
    +    
    +  def sunrise_cb(self, args, kwargs):
    +    self.turn_on(self.args["off_scene"])
    +
    +  def sunset_cb(self, args, 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 callack 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:

    + +
    +
    import 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.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.

    + +
    +
    import 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.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 provided 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 yout 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. You can find it, here, including full installation instructions, an API reference, and a number of fully fleshed out examples.

    + +

    Happy Automating!

    +
    + + +
    +

    Comments

    +
    +
    + + +
    + + + + +
    +
    + + + + + + + \ No newline at end of file diff --git a/blog/archives/index.html b/blog/archives/index.html index afd220e63c..1a7aa6d232 100644 --- a/blog/archives/index.html +++ b/blog/archives/index.html @@ -98,6 +98,38 @@

    2016

    + + + +
    @@ -2685,6 +2717,12 @@ diff --git a/blog/categories/community/atom.xml b/blog/categories/community/atom.xml index 0bc94ea9ad..c6acb1ab9b 100644 --- a/blog/categories/community/atom.xml +++ b/blog/categories/community/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Community | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/community/index.html b/blog/categories/community/index.html index ca823a1059..475edcb797 100644 --- a/blog/categories/community/index.html +++ b/blog/categories/community/index.html @@ -258,6 +258,12 @@ diff --git a/blog/categories/device-tracking/atom.xml b/blog/categories/device-tracking/atom.xml index eb6586d123..f198e291fb 100644 --- a/blog/categories/device-tracking/atom.xml +++ b/blog/categories/device-tracking/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Device-Tracking | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/device-tracking/index.html b/blog/categories/device-tracking/index.html index a164919ab0..e9b882bdf2 100644 --- a/blog/categories/device-tracking/index.html +++ b/blog/categories/device-tracking/index.html @@ -189,6 +189,12 @@ diff --git a/blog/categories/esp8266/atom.xml b/blog/categories/esp8266/atom.xml index cf87a5011d..150bebd47a 100644 --- a/blog/categories/esp8266/atom.xml +++ b/blog/categories/esp8266/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: ESP8266 | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/esp8266/index.html b/blog/categories/esp8266/index.html index fcc75fb994..a8f312a07a 100644 --- a/blog/categories/esp8266/index.html +++ b/blog/categories/esp8266/index.html @@ -189,6 +189,12 @@ diff --git a/blog/categories/how-to/atom.xml b/blog/categories/how-to/atom.xml index f64f982054..c5b60242d9 100644 --- a/blog/categories/how-to/atom.xml +++ b/blog/categories/how-to/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: How-To | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ @@ -13,6 +13,143 @@ Octopress + + <![CDATA[We Have Apps Now]]> + + 2016-08-16T10:00:00+00:00 + https://home-assistant.io/blog/2016/08/16/we-have-apps-now + I have been working on a new subsystem to complement Home Assistant’s Automation and Scripting components. AppDaemon is a python daemon that consumes events from Home Assistant and feeds them to snippets of python code called “Apps”. An App is a Python class that is instantiated possibly multiple times from AppDaemon and registers callbacks for various system events. It is also able to inspect and set state and call services. The API provides a rich environment suited to home automation tasks that can also leverage all the power of Python.

    + + + +

    Another Take on Automation

    + +

    If you haven’t yet read Paulus’ excellent Blog entry on 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 lightswitch - 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 to 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 it’s 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 appdeamon 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 config 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 it’s 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, 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 additonal 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 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 2 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.

    + +
    +
    import appapi
    +
    +class OutsideLights(appapi.AppDaemon):
    +
    +  def initialize(self):
    +    self.run_at_sunrise(self.sunrise_cb, 0)
    +    self.run_at_sunset(self.sunset_cb, 0)
    +    
    +  def sunrise_cb(self, args, kwargs):
    +    self.turn_on(self.args["off_scene"])
    +
    +  def sunset_cb(self, args, 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 callack 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:

    + +
    +
    import 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.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.

    + +
    +
    import 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.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 provided 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 yout 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. You can find it, here, including full installation instructions, an API reference, and a number of fully fleshed out examples.

    + +

    Happy Automating!

    +]]>
    +
    + <![CDATA[ESP8266 and MicroPython - Part 1]]> @@ -444,137 +581,6 @@ $ hass --open-ui

    Well, with PocketCHIP and Home Assistant you could run your home automation on a 49 USD device with a touchscreen, an integrated USP, and a keyboard. With the GPIO available on top of the display you could even connect your PocketCHIP directly to sensors and actuators.

    -]]> -
    - - - <![CDATA[Using USB webcams with Home Assistant]]> - - 2016-06-23T06:00:00+00:00 - https://home-assistant.io/blog/2016/06/23/usb-webcams-and-home-assistant -
    -In the past month I was thinking about ways to integrate USB webcams into Home Assistant again. The main reason was that this would give those devices a second life and enable one to benefit from low-cost video surveillance. There are a couple of options available like pygame or SimpleCV but I never finished something. With the Local File camera platform by Landrash and motion you could integrate a local USB webcam with a few very easy steps.

    - -

    In this blog post I am using a Fedora 24 (will most likely work on other distributions too) installation with Home Assistant 0.22.1 on a Foxconn nT-330i with an old Logitech QuickCam Orbit AF and a Logitech HD Webcam C270. As a start only the Quickcam is used. No multi-camera setup for now.

    - - - -

    Check first if the your operating system lists your cameras.

    - -
    -
    $ lsusb
    -[...]
    -Bus 002 Device 016: ID 046d:08cc Logitech, Inc. Mic (PTZ)
    -[...]
    -
    -
    -
    - -

    The camera we are going to use is available at /dev/video1. The C270 is the one on /dev/video0.

    - -
    -
    $ ls -al /dev/video*
    -crw-rw----+ 1 root video 81, 0 Jun 23 08:05 /dev/video0
    -crw-rw----+ 1 root video 81, 1 Jun 23 08:36 /dev/video1
    -
    -
    -
    - -

    We need an additional software part to handle the cameras. motion is capable of monitoring the video signal from USB and network cameras, do motion detection, and other nifty stuff like saving images, add text, or basic image manipulations. Make sure that you have the RPM Fusion respository enabled.

    - -
    -
    $ sudo dnf -y install motion
    -
    -
    -
    - -

    For our setup we need to modify the file /etc/motion/motion.conf. For now the most important parameters are videodevice, snapshot_interval, and target_dir. The other settings can be left to their defaults. We are going to use the device /dev/video1, use a 30 seconds interval, and set the path to /tmp.

    - -
    -
    [...]
    -###########################################################
    -# Capture device options
    -############################################################
    -
    -# Videodevice to be used for capturing  (default /dev/video0)
    -# for FreeBSD default is /dev/bktr0
    -videodevice /dev/video1
    -
    -[..]
    -############################################################
    -# Snapshots (Traditional Periodic Webcam File Output)
    -############################################################
    -
    -# Make automated snapshot every N seconds (default: 0 = disabled)
    -snapshot_interval 30
    -
    -[...]
    -############################################################
    -# Target Directories and filenames For Images And Films
    -# For the options snapshot_, picture_, movie_ and timelapse_filename
    -# you can use conversion specifiers
    -# %Y = year, %m = month, %d = date,
    -# %H = hour, %M = minute, %S = second,
    -# %v = event, %q = frame number, %t = thread (camera) number,
    -# %D = changed pixels, %N = noise level,
    -# %i and %J = width and height of motion area,
    -# %K and %L = X and Y coordinates of motion center
    -# %C = value defined by text_event
    -# Quotation marks round string are allowed.
    -############################################################
    -
    -# Target base directory for pictures and films
    -# Recommended to use absolute path. (Default: current working directory)
    -target_dir /tmp
    -
    -[...]
    -
    -
    -
    - -

    It’s suggested that you adjust at least width and height to get a bigger image from your camera. If you are done, fire up motion.

    - -
    -
    $ sudo motion
    -[0] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf
    -[0] [ALR] [ALL] conf_cmdparse: Unknown config option "sdl_threadnr"
    -[0] [NTC] [ALL] motion_startup: Motion 3.3.0 Started
    -[0] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion.log)
    -
    -
    -
    - -

    Your target_dir will start filling up with images from your camera. motion will create a symlink called lastsnap.jpg which always point to the latest snapshot. We will setup the Local File camera platform to use this file.

    - -
    -
    camera:
    -  - platform: local_file
    -    name: Cranberry cam
    -    file_path: /tmp/lastsnap.jpg
    -
    -
    -
    - -

    - - The “Cranberry cam” in action -

    - -

    The machine with the attached USB camera will become a webcam server as well because motion’s built-in HTTP server is enabled by default. This means that you could connect your USB webcams to a different machine in your network, run motion there, adjust your firewall rules, and use Home Assistant to display the videos. Just check http://[IP of your webcam host]:8081/ to see the stream. This required more powerful hardware than using snapshots, of course.

    - -

    In a scenario like this needs a Generic MJPEG IP Camera in your configuration.yaml file.

    - -
    -
    camera:
    -  - platform: mjpeg
    -    mjpeg_url: http://[IP of your webcam host]:8081
    -    name: Cranberry Live cam
    -
    -
    -
    - -

    motion is a powerful tool and this blog post only showed two very simple use cases. Take a look at the documentation of motion to unleash its potential.

    - ]]>
    diff --git a/blog/categories/how-to/index.html b/blog/categories/how-to/index.html index bb3ef0d468..ec849d114d 100644 --- a/blog/categories/how-to/index.html +++ b/blog/categories/how-to/index.html @@ -98,6 +98,38 @@

    2016

    + + + +
    @@ -650,6 +682,12 @@ diff --git a/blog/categories/ibeacons/atom.xml b/blog/categories/ibeacons/atom.xml index 56f4626d77..6daf7a025d 100644 --- a/blog/categories/ibeacons/atom.xml +++ b/blog/categories/ibeacons/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: iBeacons | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/ibeacons/index.html b/blog/categories/ibeacons/index.html index 3f4970a7b5..2a28f31dae 100644 --- a/blog/categories/ibeacons/index.html +++ b/blog/categories/ibeacons/index.html @@ -225,6 +225,12 @@ diff --git a/blog/categories/internet-of-things/atom.xml b/blog/categories/internet-of-things/atom.xml index 818396270a..025d36ab86 100644 --- a/blog/categories/internet-of-things/atom.xml +++ b/blog/categories/internet-of-things/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Internet-of-Things | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/internet-of-things/index.html b/blog/categories/internet-of-things/index.html index f2913ac466..c2659a2619 100644 --- a/blog/categories/internet-of-things/index.html +++ b/blog/categories/internet-of-things/index.html @@ -284,6 +284,12 @@ diff --git a/blog/categories/iot-data/atom.xml b/blog/categories/iot-data/atom.xml index b888031614..319b8e8fc8 100644 --- a/blog/categories/iot-data/atom.xml +++ b/blog/categories/iot-data/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: IoT-Data | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/iot-data/index.html b/blog/categories/iot-data/index.html index f34a6825bd..2a706cea0e 100644 --- a/blog/categories/iot-data/index.html +++ b/blog/categories/iot-data/index.html @@ -221,6 +221,12 @@ diff --git a/blog/categories/mqtt/atom.xml b/blog/categories/mqtt/atom.xml index efd0e98c6c..1d08f43407 100644 --- a/blog/categories/mqtt/atom.xml +++ b/blog/categories/mqtt/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: MQTT | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/mqtt/index.html b/blog/categories/mqtt/index.html index 6af78351e4..1ee5d4defe 100644 --- a/blog/categories/mqtt/index.html +++ b/blog/categories/mqtt/index.html @@ -260,6 +260,12 @@ diff --git a/blog/categories/organisation/atom.xml b/blog/categories/organisation/atom.xml index 2c1e20af83..64fa50ce71 100644 --- a/blog/categories/organisation/atom.xml +++ b/blog/categories/organisation/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Organisation | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/organisation/index.html b/blog/categories/organisation/index.html index 1879706a76..5bced43279 100644 --- a/blog/categories/organisation/index.html +++ b/blog/categories/organisation/index.html @@ -220,6 +220,12 @@ diff --git a/blog/categories/owntracks/atom.xml b/blog/categories/owntracks/atom.xml index 25dc0c760c..82ded5c6cd 100644 --- a/blog/categories/owntracks/atom.xml +++ b/blog/categories/owntracks/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: OwnTracks | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/owntracks/index.html b/blog/categories/owntracks/index.html index 7164d9a33a..05926c616c 100644 --- a/blog/categories/owntracks/index.html +++ b/blog/categories/owntracks/index.html @@ -225,6 +225,12 @@ diff --git a/blog/categories/presence-detection/atom.xml b/blog/categories/presence-detection/atom.xml index dac857b3da..54901037c4 100644 --- a/blog/categories/presence-detection/atom.xml +++ b/blog/categories/presence-detection/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Presence-Detection | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/presence-detection/index.html b/blog/categories/presence-detection/index.html index 8d7ed3368b..87bda2ed3c 100644 --- a/blog/categories/presence-detection/index.html +++ b/blog/categories/presence-detection/index.html @@ -189,6 +189,12 @@ diff --git a/blog/categories/public-service-announcement/atom.xml b/blog/categories/public-service-announcement/atom.xml index ae48b8c27f..965c3d4068 100644 --- a/blog/categories/public-service-announcement/atom.xml +++ b/blog/categories/public-service-announcement/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Public-Service-Announcement | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/public-service-announcement/index.html b/blog/categories/public-service-announcement/index.html index af65f65f02..441ae8bccb 100644 --- a/blog/categories/public-service-announcement/index.html +++ b/blog/categories/public-service-announcement/index.html @@ -185,6 +185,12 @@ diff --git a/blog/categories/release-notes/atom.xml b/blog/categories/release-notes/atom.xml index aea3a6fb26..23c86ad769 100644 --- a/blog/categories/release-notes/atom.xml +++ b/blog/categories/release-notes/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Release-Notes | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/release-notes/index.html b/blog/categories/release-notes/index.html index 04fbf06f5a..ae05cace00 100644 --- a/blog/categories/release-notes/index.html +++ b/blog/categories/release-notes/index.html @@ -1470,6 +1470,12 @@ diff --git a/blog/categories/survey/atom.xml b/blog/categories/survey/atom.xml index edb3fde115..aa7dbeaf99 100644 --- a/blog/categories/survey/atom.xml +++ b/blog/categories/survey/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Survey | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/survey/index.html b/blog/categories/survey/index.html index 94441fbe03..686f828b89 100644 --- a/blog/categories/survey/index.html +++ b/blog/categories/survey/index.html @@ -185,6 +185,12 @@ diff --git a/blog/categories/talks/atom.xml b/blog/categories/talks/atom.xml index 94ba29dd99..3c64b47b21 100644 --- a/blog/categories/talks/atom.xml +++ b/blog/categories/talks/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Talks | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/talks/index.html b/blog/categories/talks/index.html index e6ed1fa4ed..2a349e1c9e 100644 --- a/blog/categories/talks/index.html +++ b/blog/categories/talks/index.html @@ -187,6 +187,12 @@ diff --git a/blog/categories/technology/atom.xml b/blog/categories/technology/atom.xml index bcd2b8143e..166ba7119c 100644 --- a/blog/categories/technology/atom.xml +++ b/blog/categories/technology/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Technology | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/technology/index.html b/blog/categories/technology/index.html index 486247b68e..e3d4f187e8 100644 --- a/blog/categories/technology/index.html +++ b/blog/categories/technology/index.html @@ -217,6 +217,12 @@ diff --git a/blog/categories/user-stories/atom.xml b/blog/categories/user-stories/atom.xml index e67d16284d..1b9de977ee 100644 --- a/blog/categories/user-stories/atom.xml +++ b/blog/categories/user-stories/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: User-Stories | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/user-stories/index.html b/blog/categories/user-stories/index.html index 4d4d73a802..cd8aa38272 100644 --- a/blog/categories/user-stories/index.html +++ b/blog/categories/user-stories/index.html @@ -220,6 +220,12 @@ diff --git a/blog/categories/video/atom.xml b/blog/categories/video/atom.xml index 85713350ce..554378b1a9 100644 --- a/blog/categories/video/atom.xml +++ b/blog/categories/video/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Video | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/video/index.html b/blog/categories/video/index.html index 13992319a6..ffd5285728 100644 --- a/blog/categories/video/index.html +++ b/blog/categories/video/index.html @@ -388,6 +388,12 @@ diff --git a/blog/categories/website/atom.xml b/blog/categories/website/atom.xml index dd6f478b8c..cf01e364e6 100644 --- a/blog/categories/website/atom.xml +++ b/blog/categories/website/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: Website | Home Assistant]]> - 2016-08-16T09:54:54+00:00 + 2016-08-16T12:17:59+00:00 https://home-assistant.io/ diff --git a/blog/categories/website/index.html b/blog/categories/website/index.html index 40ab7a3a49..a3b4f4e5fc 100644 --- a/blog/categories/website/index.html +++ b/blog/categories/website/index.html @@ -220,6 +220,12 @@ diff --git a/blog/index.html b/blog/index.html index ef3ef298e1..dda5849754 100644 --- a/blog/index.html +++ b/blog/index.html @@ -78,6 +78,50 @@ +
    +
    + +

    + We Have Apps Now +

    + + + +
    + + + 10 minutes reading time + + + + + + Comments + +
    + +
    + + +
    +

    I have been working on a new subsystem to complement Home Assistant’s Automation and Scripting components. AppDaemon is a python daemon that consumes events from Home Assistant and feeds them to snippets of python code called “Apps”. An App is a Python class that is instantiated possibly multiple times from AppDaemon and registers callbacks for various system events. It is also able to inspect and set state and call services. The API provides a rich environment suited to home automation tasks that can also leverage all the power of Python.

    + + + + Read on → + +
    +
    +
    +
    @@ -717,102 +761,6 @@ Over a year ago I participated in the Read on → -
    -
    -
    - -
    -
    - -

    - 0.23: Envisalink, Homematic, HDMI-CEC and Sony Bravia TV -

    - - - -
    - - - three minutes reading time - - - - - - Comments - -
    - -
    - - -
    -

    It’s time for Home Assistant 0.23 and it’s full of goodies. It’s also the release that bumps us over a 1000 tests and to 94% test coverage! Also our install issues on the Raspberry Pi and Synology have been resolved.

    - -

    This release brings support for two new ecosystems: Envisalink and Homematic. We can now also control your TV via HDMI using HDMI-CEC (which works on the Pi!) and another cool feature is the persistent notifications which allow you to add a notification to the frontend till dismissed.

    - -

    Wink support has been dramatically improved by migrating to the PubNub API. This allows Wink to push changes from their system to Home Assistant. This change came just in time as somehow our Wink integration was causing a lot of requests to their servers. Thanks to Wink for letting us know so we could solve it instead of blocking us.

    - -

    On the config side, you can now store your passwords in your OS keyring or just in a standalone file. We also got a new service to reload the core config so no reboots needed anymore after changing customize settings!

    - -

    - - - -

    Breaking changes

    - -
      -
    • Homematic thermostat configuration has changed and now depends on the new Homematic component.
    • -
    - -

    Hotfix 0.23.1 - July 2

    - -
      -
    • Bump PyVera to 0.2.13 to fix traceback and pyvera thread dying related to bug (@rhooper)
    • -
    • HTTP - SSL: Check for OP_NO_COMPRESSION support before trying to use it (@AlucardZero)
    • -
    • Wink: Downgraded pubnub to work around pycryptodome conflicts (@w1ll1am23)
    • -
    - -

    FAQ

    - -
      -
    • elevation: was introduced to the configuration for weather/sunrise data. For existing configurations add the value shown in the warning [homeassistant.config] Incomplete core config. Auto detected elevation: 665 to your configuration.yaml file.
    • -
    - - -

    diff --git a/blog/posts/2/index.html b/blog/posts/2/index.html index 26e42e3fd0..f85f9a0fd7 100644 --- a/blog/posts/2/index.html +++ b/blog/posts/2/index.html @@ -78,6 +78,102 @@ +
    +
    + +

    + 0.23: Envisalink, Homematic, HDMI-CEC and Sony Bravia TV +

    + + + +
    + + + three minutes reading time + + + + + + Comments + +
    + +
    + + +
    +

    It’s time for Home Assistant 0.23 and it’s full of goodies. It’s also the release that bumps us over a 1000 tests and to 94% test coverage! Also our install issues on the Raspberry Pi and Synology have been resolved.

    + +

    This release brings support for two new ecosystems: Envisalink and Homematic. We can now also control your TV via HDMI using HDMI-CEC (which works on the Pi!) and another cool feature is the persistent notifications which allow you to add a notification to the frontend till dismissed.

    + +

    Wink support has been dramatically improved by migrating to the PubNub API. This allows Wink to push changes from their system to Home Assistant. This change came just in time as somehow our Wink integration was causing a lot of requests to their servers. Thanks to Wink for letting us know so we could solve it instead of blocking us.

    + +

    On the config side, you can now store your passwords in your OS keyring or just in a standalone file. We also got a new service to reload the core config so no reboots needed anymore after changing customize settings!

    + +

    + + + +

    Breaking changes

    + +
      +
    • Homematic thermostat configuration has changed and now depends on the new Homematic component.
    • +
    + +

    Hotfix 0.23.1 - July 2

    + +
      +
    • Bump PyVera to 0.2.13 to fix traceback and pyvera thread dying related to bug (@rhooper)
    • +
    • HTTP - SSL: Check for OP_NO_COMPRESSION support before trying to use it (@AlucardZero)
    • +
    • Wink: Downgraded pubnub to work around pycryptodome conflicts (@w1ll1am23)
    • +
    + +

    FAQ

    + +
      +
    • elevation: was introduced to the configuration for weather/sunrise data. For existing configurations add the value shown in the warning [homeassistant.config] Incomplete core config. Auto detected elevation: 665 to your configuration.yaml file.
    • +
    + + + +
    +
    +
    +
    @@ -702,53 +798,6 @@ In the past month I was thinking about ways to integrate USB webcams into Home A

    -
    -
    - -

    - Video: How To Configure Home Assistant -

    - - - -
    - - - less than one minute reading time - - - - - - Comments - -
    - -
    - - -
    -

    Ben from BRUH Automation authors a lot of great video’s about how he is using Home Assistant and how you can get started with it too. The video below will walk you through how to configure Home Assistant. Enjoy!

    - -

    Make sure to subscribe to his YouTube channel for more Home Assistant video’s.

    - -
    - -
    - - -
    -
    -
    - -
    -
    - -
    -
    - -

    - 0.16: Embedded MQTT broker, Uber, Yamaha receivers and Growl -

    - - - -
    - - - two minutes reading time - - - - - - Comments - -
    - -
    - - -
    -

    Party people, 0.16 is here! The big thing with this release is that we have completely removed the barrier to get started by MQTT by being able to launch an embedded MQTT server: hbMQTT. Just add mqtt: to your config and a broker is launched and connected with Home Assistant. See the documentation for more info.

    - -

    Further in this release a bunch of cool new stuff, bug fixes and rewrites for the Vera and Tellstick component (see breaking changes section at bottom for this!).

    - -

    Rock on.

    - -

    - - - -

    Breaking changes

    -
      -
    • -

      Automation: support for old deprecated config has been removed

      -
    • -
    • -

      Tellstick configuration has changed

      -
    • -
    - -
    -
    tellstick:
    -  signal_repetitions: X
    -
    -
    -
    - -
      -
    • Vera configuration has changed
    • -
    - -
    -
    vera:
    -  vera_controller_url: http://192.168.1.161:3480/
    -  # Optional to exclude devices - this is a list of vera device ids
    -  exclude: [ 13, 14, 16, 20, 23, 72, 73, 74, 75, 76, 77, 78, 88, 89, 99]
    -  # Optional to import switches as lights - this is a list of vera device ids
    -  lights: [15, 17, 19, 21, 22, 24, 26, 43, 64, 70, 87]
    -
    -
    -
    - -

    diff --git a/blog/posts/4/index.html b/blog/posts/4/index.html index 760c9919bd..d5a146f8f8 100644 --- a/blog/posts/4/index.html +++ b/blog/posts/4/index.html @@ -78,6 +78,105 @@ +
    +
    + +

    + 0.16: Embedded MQTT broker, Uber, Yamaha receivers and Growl +

    + + + +
    + + + two minutes reading time + + + + + + Comments + +
    + +
    + + +
    +

    Party people, 0.16 is here! The big thing with this release is that we have completely removed the barrier to get started by MQTT by being able to launch an embedded MQTT server: hbMQTT. Just add mqtt: to your config and a broker is launched and connected with Home Assistant. See the documentation for more info.

    + +

    Further in this release a bunch of cool new stuff, bug fixes and rewrites for the Vera and Tellstick component (see breaking changes section at bottom for this!).

    + +

    Rock on.

    + +

    + + + +

    Breaking changes

    +
      +
    • +

      Automation: support for old deprecated config has been removed

      +
    • +
    • +

      Tellstick configuration has changed

      +
    • +
    + +
    +
    tellstick:
    +  signal_repetitions: X
    +
    +
    +
    + +
      +
    • Vera configuration has changed
    • +
    + +
    +
    vera:
    +  vera_controller_url: http://192.168.1.161:3480/
    +  # Optional to exclude devices - this is a list of vera device ids
    +  exclude: [ 13, 14, 16, 20, 23, 72, 73, 74, 75, 76, 77, 78, 88, 89, 99]
    +  # Optional to import switches as lights - this is a list of vera device ids
    +  lights: [15, 17, 19, 21, 22, 24, 26, 43, 64, 70, 87]
    +
    +
    +
    + + +
    +
    +
    + -
    - -
    -
    - -

    - 0.11: Extended support for DIY solutions -

    - - - -
    - - - two minutes reading time - - - - - - Comments - -
    - -
    - - -
    -

    First release of 2016 and we are on 🔥! The main repository has passed 2500 ⭐ on GitHub (2596 ⭐ as of now). This release also has a record number of 20 contributors all working on improving and extending Home Assistant. With the continued growth, I am very excited to see what 2016 will bring us 🤘.

    - -

    - - - -

    Backwards incompatible changes

    - - - -

    diff --git a/blog/posts/5/index.html b/blog/posts/5/index.html index 9e1eb3862d..63af7e4e4a 100644 --- a/blog/posts/5/index.html +++ b/blog/posts/5/index.html @@ -78,6 +78,81 @@ +
    +
    + +

    + 0.11: Extended support for DIY solutions +

    + + + +
    + + + two minutes reading time + + + + + + Comments + +
    + +
    + + +
    +

    First release of 2016 and we are on 🔥! The main repository has passed 2500 ⭐ on GitHub (2596 ⭐ as of now). This release also has a record number of 20 contributors all working on improving and extending Home Assistant. With the continued growth, I am very excited to see what 2016 will bring us 🤘.

    + +

    + + + +

    Backwards incompatible changes

    + + + + +
    +
    +
    +
    @@ -573,73 +648,6 @@ The InfluxDB database is a so-called time se - -
    -
    - -
    -
    - -

    - 0.7.6: Amazon FireTV, Radiotherm thermostats -

    - - - -
    - - - two minutes reading time - - - - - - Comments - -
    - -
    - - -
    -

    After two weeks of hard work I’m proud to announce the release of Home Assistant v0.7.6. For this release the main focus was bugs, test coverage and documentation. And we exceeded expectations on all three fronts. Bugs have been squashed, test coverage increased to 85% and thanks to the hard work by @fabaff and myself the component section on the website has gotten a complete revamp.

    - -

    Changes

    - -

    - - - - - - Read on → -

    diff --git a/blog/posts/6/index.html b/blog/posts/6/index.html index ed55e22d38..57ea89b8ad 100644 --- a/blog/posts/6/index.html +++ b/blog/posts/6/index.html @@ -78,6 +78,73 @@ +
    +
    + +

    + 0.7.6: Amazon FireTV, Radiotherm thermostats +

    + + + +
    + + + two minutes reading time + + + + + + Comments + +
    + +
    + + +
    +

    After two weeks of hard work I’m proud to announce the release of Home Assistant v0.7.6. For this release the main focus was bugs, test coverage and documentation. And we exceeded expectations on all three fronts. Bugs have been squashed, test coverage increased to 85% and thanks to the hard work by @fabaff and myself the component section on the website has gotten a complete revamp.

    + +

    Changes

    + +

    + + + + + + Read on → + +
    +
    +
    +
    @@ -605,72 +672,6 @@ Inspried by a -
    - -

    - Verisure devices and modern TP-Link routers now supported -

    - - - -
    - - - 1 minute reading time - - - - - - Comments - -
    - -
    - - -
    -

    A minor bug fix release to fix some issues that have come up since the last release. Please upgrade as soon as possible by running git pull from the Home Assistant directory.

    - -

    This release is a major milestone in our test coverage as we’ve crossed into the 80s! It has to be noted that this covers mainly the core and automation components. Platforms that communicate with IoT devices have been excluded.

    - -

    As we didn’t want to just push out bug fixes, this release includes a few additions:

    - -
      -
    • Support for modern TP-Link routers like the ArcherC9 line has been contributed by @chrisvis.
    • -
    • Improved support for MQTT topic subscriptions has been contributed by @qrtn
    • -
    - -

    Verisure Support
    - Home Assistant support to integrate your Verisure alarms, hygrometers, sensors and thermometers has been contributed by @persandstrom.

    - -
    -
    # Example configuration.yaml entry
    -verisure:
    -  username: user@example.com
    -  password: password
    -  alarm: 1
    -  hygrometers: 0
    -  smartplugs: 1
    -  thermometers: 0
    -
    -
    -
    - - -
    -
    -
    - - -
    - -
    -
    - -

    - Home Assistant moving to YAML -

    - - - -
    - - - less than one minute reading time - - - - - - Comments - -
    - -
    - - -
    -

    Home Assistant is now using YAML for it’s configuration file. YAML allows the use of lists, which should make the configuration file a bit more flexible and useful. The new configuration file format is backwards compatible with existing components. Because of this, there is no need for component developers to update their components.

    - -

    The new file is named configuration.yaml and if it can’t be found in your config directory, Home Assistant will instead try to find the old configuration file, home-assistant.conf.

    - -

    The home-assistant.conf.example has been replaced with an updated configuration.yaml.example.

    - -

    Users of Home Assistant should migrate as the old configuration format is deprecated.

    - -

    diff --git a/blog/posts/8/index.html b/blog/posts/8/index.html index 6becdccf0d..d5cae02921 100644 --- a/blog/posts/8/index.html +++ b/blog/posts/8/index.html @@ -78,6 +78,53 @@ +
    +
    + +

    + Home Assistant moving to YAML +

    + + + +
    + + + less than one minute reading time + + + + + + Comments + +
    + +
    + + +
    +

    Home Assistant is now using YAML for it’s configuration file. YAML allows the use of lists, which should make the configuration file a bit more flexible and useful. The new configuration file format is backwards compatible with existing components. Because of this, there is no need for component developers to update their components.

    + +

    The new file is named configuration.yaml and if it can’t be found in your config directory, Home Assistant will instead try to find the old configuration file, home-assistant.conf.

    + +

    The home-assistant.conf.example has been replaced with an updated configuration.yaml.example.

    + +

    Users of Home Assistant should migrate as the old configuration format is deprecated.

    + + +
    +
    +
    +
    diff --git a/index.html b/index.html index 399ce61180..d2e5f13fcc 100644 --- a/index.html +++ b/index.html @@ -138,6 +138,11 @@ Home Assistant is an open-source home automation platform running on Python 3. T

    Recent Blog Posts

    +
  • + We Have Apps Now + August 16, 2016 +
  • +
  • 0.26: Foursquare, Fast.com, FFMPEG and GPSD August 13, 2016 @@ -148,11 +153,6 @@ Home Assistant is an open-source home automation platform running on Python 3. T August 7, 2016
  • -
  • - Laundry Sensors with NodeMCU and Home Assistant - August 2, 2016 -
  • - diff --git a/sitemap.xml b/sitemap.xml index 649ef95d37..83e800ac21 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,5 +1,9 @@ + + https://home-assistant.io/blog/2016/08/16/we-have-apps-now/ + 2016-08-16T10:00:00+00:00 + https://home-assistant.io/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/ 2016-08-13T19:00:00+00:00 @@ -2079,64 +2083,67 @@ https://home-assistant.io/blog/2016/08/13/foursquare-fast-com-ffmpeg-gpsd/ + + https://home-assistant.io/blog/2016/08/16/we-have-apps-now/ + https://home-assistant.io/demo/frontend.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/index.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-dev-event.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-dev-info.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-dev-service.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-dev-state.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-dev-template.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-history.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-iframe.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-logbook.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/demo/panels/ha-panel-map.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/googlef4f3693c209fe788.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/static/fonts/roboto/DESCRIPTION.en_us.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/static/fonts/robotomono/DESCRIPTION.en_us.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 https://home-assistant.io/static/mdi-demo.html - 2016-08-16T09:54:12+00:00 + 2016-08-16T12:17:06+00:00 diff --git a/topics/platform_options/index.html b/topics/platform_options/index.html index 0ed719a93a..c7dd336041 100644 --- a/topics/platform_options/index.html +++ b/topics/platform_options/index.html @@ -174,6 +174,12 @@