267 lines
No EOL
12 KiB
HTML
267 lines
No EOL
12 KiB
HTML
<!doctype html>
|
|
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
|
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
|
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
|
|
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<title>Components Architecture - Home Assistant</title>
|
|
<meta name="author" content="Home Assistant">
|
|
<meta name="description" content="Overview of components within the Home Assistant architecture.">
|
|
|
|
<meta name="viewport" content="width=device-width">
|
|
<link rel="canonical" href="https://home-assistant.io/developers/architecture_components/">
|
|
|
|
<meta property="fb:app_id" content="338291289691179">
|
|
<meta property="og:title" content="Components Architecture">
|
|
<meta property="og:site_name" content="Home Assistant">
|
|
<meta property="og:url" content="https://home-assistant.io/developers/architecture_components/">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:description" content="Overview of components within the Home Assistant architecture.">
|
|
<meta property="og:image" content="https://home-assistant.io/images/default-social.png">
|
|
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:site" content="@home_assistant">
|
|
|
|
<meta name="twitter:title" content="Components Architecture">
|
|
<meta name="twitter:description" content="Overview of components within the Home Assistant architecture.">
|
|
<meta name="twitter:image" content="https://home-assistant.io/images/default-social.png">
|
|
|
|
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet">
|
|
<link href="/atom.xml" rel="alternate" title="Home Assistant" type="application/atom+xml">
|
|
<link rel='shortcut icon' href='/images/favicon.ico' />
|
|
<link rel='icon' type='image/png' href='/images/favicon-192x192.png' sizes='192x192' />
|
|
</head>
|
|
|
|
<body >
|
|
|
|
<header>
|
|
<div class="grid-wrapper">
|
|
<div class="grid">
|
|
|
|
<div class="grid__item three-tenths lap-two-sixths palm-one-whole ha-title">
|
|
<a href="/" class="site-title">
|
|
<img width='40' src='/demo/favicon-192x192.png'>
|
|
<span>Home Assistant</span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="grid__item seven-tenths lap-four-sixths palm-one-whole">
|
|
<nav>
|
|
<input type="checkbox" id="toggle">
|
|
<label for="toggle" class="toggle" data-open="Main Menu" data-close="Close Menu"></label>
|
|
<ul class="menu pull-right">
|
|
|
|
<li><a href='/getting-started/'>Getting started</a></li>
|
|
<li><a href='/components/'>Components</a></li>
|
|
<li><a href='/cookbook/'>Examples</a></li>
|
|
<li><a href="/developers/">Developers</a></li>
|
|
<li><a href="/blog/">Blog</a></li>
|
|
<li><a href="/help/">Need help?</a></li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
|
|
|
|
<div class="grid-wrapper">
|
|
<div class="grid grid-center">
|
|
|
|
<div class="grid__item two-thirds lap-one-whole palm-one-whole">
|
|
|
|
|
|
<article class="page">
|
|
|
|
|
|
|
|
|
|
<header>
|
|
<h1 class="title indent">
|
|
Components Architecture
|
|
</h1>
|
|
</header>
|
|
<hr class="divider">
|
|
|
|
|
|
<p>Home Assistant can be extended by <strong>components</strong>. Each component is responsible for a specific domain within Home Assistant. Components can listen for or trigger events, offer services and maintain states. Components are written in Python and can do all the goodness that Python has to offer. Out of the box, Home Assistant offers a bunch of <a href="/components/">built-in components</a>.</p>
|
|
|
|
<p class="img">
|
|
<img src="/images/architecture/component_interaction.png" alt="Diagram showing interaction between components and the Home Assistant core." />
|
|
Diagram showing interaction between components and the Home Assistant core.
|
|
</p>
|
|
|
|
<p>We can differentiate between two different types of components within Home Assistant.</p>
|
|
|
|
<h4><a class="title-link" name="components-that-interact-with-an-internet-of-things-domain" href="#components-that-interact-with-an-internet-of-things-domain"></a> Components that interact with an Internet of Things domain</h4>
|
|
|
|
<p>These components will track devices within a specific domain and consist of a core part and platform-specific logic. These components make their information available via the State Machine and the Event Bus. The component will also register services in the Service Registry to expose control of the devices.</p>
|
|
|
|
<p>For example, one of the built-in components is the <code>switch</code> component. This component is responsible for interaction with different types of switches.</p>
|
|
|
|
<p>A platform provides support for a particular kind/brand of device. For example, a switch could use a WeMo or Orvibo platform, and a light component might interact with the Hue or LiFX platform.</p>
|
|
|
|
<p>If you are planning to add support for a new platform, please check out the <a href="/developers/add_new_platform/">add new platform section</a>.</p>
|
|
|
|
<h4><a class="title-link" name="components-that-respond-to-events-that-happen-within-home-assistant" href="#components-that-respond-to-events-that-happen-within-home-assistant"></a> Components that respond to events that happen within Home Assistant</h4>
|
|
|
|
<p>These components provide small pieces of home automation logic or services that do common tasks within your house.</p>
|
|
|
|
<p>For example the <a href="/components/device_sun_light_trigger/"><code>device_sun_light_trigger</code> component</a> tracks the state of devices and the sun to make sure that the lights are turned on when it gets dark and there are people home. The component uses logic along the following lines:</p>
|
|
|
|
<div class="highlighter-coderay"><div class="CodeRay">
|
|
<div class="code"><pre> In the event that device 'Paulus Nexus 5' changes to the 'Home' state:
|
|
If the sun has set and the lights are not on:
|
|
Turn on the lights
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="highlighter-coderay"><div class="CodeRay">
|
|
<div class="code"><pre> In the event that the combined state of all tracked devices changes to 'Not Home':
|
|
If the lights are on:
|
|
Turn off the lights
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="highlighter-coderay"><div class="CodeRay">
|
|
<div class="code"><pre> In the event of the sun setting:
|
|
If the lights are off and the combined state of all tracked device equals 'Home':
|
|
Turn on the lights
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
|
|
<p>An extended example of a home automation component can be found <a href="https://github.com/home-assistant/home-assistant/blob/master/config/custom_components/example.py">here</a>.</p>
|
|
|
|
<h3><a class="title-link" name="the-full-picture" href="#the-full-picture"></a> The full picture</h3>
|
|
|
|
<p>When we put all the different pieces of Home Assistant together we see that we match pretty close to the initial sketched home automation overview. The smart home AI is not implemented yet and therefore omitted from the following picture.</p>
|
|
|
|
<p class="img">
|
|
<a href="/images/architecture/ha_full_architecture.png">
|
|
<img src="/images/architecture/ha_full_architecture.png" />
|
|
</a>
|
|
Overview of the full Home Assistant architecture with a couple of loaded components and platforms.
|
|
</p>
|
|
|
|
<p>The platform logic for components uses 3rd party Python libraries to communicate with the devices. This is done so that we can leverage great device libraries that are out there in the Python community.</p>
|
|
|
|
|
|
</article>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<aside id="sidebar" class="grid__item one-third lap-one-whole palm-one-whole">
|
|
<div class="grid">
|
|
|
|
|
|
<section class="aside-module grid__item one-whole lap-one-half">
|
|
<div class='edit-github'><a href='https://github.com/home-assistant/home-assistant.io/tree/master/source/developers/architecture_components.markdown'>Edit this page on GitHub</a></div>
|
|
<div class='section'>
|
|
<h1 class="title delta">Development Guide</h1>
|
|
<ul class='divided sidebar-menu'>
|
|
<li>
|
|
<a href='/developers/'>Introduction </a>
|
|
<ul>
|
|
<li><a href='/developers/architecture/'>Architecture </a></li>
|
|
<li><a class='active' href='/developers/architecture_components/'>Components </a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href='/developers/development/'>Starting with Development </a>
|
|
<ul>
|
|
<li><a href='/developers/development_environment/'>Setting up Environment </a></li>
|
|
<li><a href='/developers/development_submitting/'>Submit your Work </a></li>
|
|
<li><a href='/developers/development_checklist/'>Checklist </a></li>
|
|
<li><a href='/developers/development_testing/'>Testing </a></li>
|
|
<li><a href='/developers/development_catching_up/'>Catching up with Reality </a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href='/developers/add_new_platform/'>Support a new device (as a platform) </a>
|
|
<ul>
|
|
<li><a href='/developers/platform_example_sensor/'>Example sensor platform </a></li>
|
|
<li><a href='/developers/platform_example_light/'>Example light platform </a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href='/developers/creating_components/'>Adding a new component </a>
|
|
<ul>
|
|
<li><a href='/developers/component_loading/'>Loading components </a></li>
|
|
<li><a href='/developers/component_deps_and_reqs/'>Requirements & Dependencies </a></li>
|
|
<li><a href='/developers/component_initialization/'>Initialization </a></li>
|
|
<li><a href='/developers/component_events/'>Handling events </a></li>
|
|
<li><a href='/developers/component_states/'>States </a></li>
|
|
<li><a href='/developers/component_visibility/'>Visibility </a></li>
|
|
<li><a href='/developers/component_generic_discovery/'>Loading Platforms </a></li>
|
|
<li><a href='/developers/component_discovery/'>Component Discovery </a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
Frontend Development
|
|
<ul>
|
|
<li><a href='/developers/frontend/'>Setup Frontend Environment </a></li>
|
|
<li><a href='/developers/frontend_add_card/'>Add State Card </a></li>
|
|
<li><a href='/developers/frontend_add_more_info/'>Add More Info Dialog </a></li>
|
|
<li><a href='/developers/frontend_creating_custom_panels/'>Add Custom Panels </a></li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
API
|
|
<ul>
|
|
<li><a href='/developers/rest_api/'>RESTful API </a></li>
|
|
<li><a href='/developers/python_api/'>Python API </a></li>
|
|
<li><a href='/developers/server_sent_events/'>Server-sent events </a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href='/developers/helpers/'>Online helpers </a></li>
|
|
<li><a href='/developers/multiple_instances/'>Multiple Instances </a></li>
|
|
<li><a href='/developers/website/'>Home-Assistant.io </a></li>
|
|
<li><a href='/developers/credits/'>Credits </a></li>
|
|
</ul>
|
|
</div>
|
|
</section>
|
|
|
|
</div>
|
|
</aside>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<footer>
|
|
<div class="grid-wrapper">
|
|
<div class="grid">
|
|
<div class="grid__item">
|
|
<div class="copyright">
|
|
<a rel="me" href='https://twitter.com/home_assistant'><i class="icon-twitter"></i></a>
|
|
<a rel="me" href='https://facebook.com/homeassistantio'><i class="icon-facebook"></i></a>
|
|
<a rel="me" href='https://github.com/home-assistant/home-assistant'><i class="icon-github"></i></a>
|
|
|
|
<div class="credit">
|
|
Contact us at <a href='mailto:hello@home-assistant.io'>hello@home-assistant.io</a>.<br>
|
|
Website powered by <a href='http://jekyllrb.com/'>Jekyll</a> and the <a href='https://github.com/coogie/oscailte'>Oscalite theme</a>.<br />
|
|
Hosted by <a href='https://pages.github.com/'>GitHub</a> and served by <a href='https://cloudflare.com'>CloudFlare</a>.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<script>
|
|
var _gaq=[['_setAccount','UA-57927901-1'],['_trackPageview']];
|
|
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
|
|
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
|
|
s.parentNode.insertBefore(g,s)}(document,'script'));
|
|
</script>
|
|
</body>
|
|
</html> |