home-assistant.github.io/blog/2017/10/15/templating-date-time/index.html
2018-03-09 18:51:31 +00:00

224 lines
15 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>Templates, dates and times - Home Assistant</title>
<meta name="author" content="Fabian Affolter">
<meta name="description" content="Using templates for seconds and years in Home Assistant.">
<meta name="viewport" content="width=device-width">
<link rel="canonical" href="https://home-assistant.io/blog/2017/10/15/templating-date-time/">
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Templates, dates and times">
<meta property="og:site_name" content="Home Assistant">
<meta property="og:url" content="https://home-assistant.io/blog/2017/10/15/templating-date-time/">
<meta property="og:type" content="article">
<meta property="og:description" content="Using templates for seconds and years in Home Assistant.">
<meta property="og:image" content="https://home-assistant.io/images/blog/2017-10-template/social.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@home_assistant">
<meta name="twitter:title" content="Templates, dates and times">
<meta name="twitter:description" content="Using templates for seconds and years in Home Assistant.">
<meta name="twitter:image" content="https://home-assistant.io/images/blog/2017-10-template/social.png">
<link href="/stylesheets/screen.css" media="screen, projection, print" 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 class='site-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="/docs/">Docs</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>
<li><a href='#' class='show-search'><i class="icon-search"></i></a></li>
</ul>
</nav>
<div class='search-container' style='display: none'>
<div class='search'>
<i class="icon-search"></i>
<input id='search' placeholder='Search the docs…'>
<a href='#' class='close'><i class="icon-remove-sign"></i></a>
</div>
</div>
</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="post">
<header>
<h1 class="title indent">Templates, dates and times</h1>
<div class="meta clearfix">
<time datetime="2017-10-15T08:00:00+00:00" pubdate data-updated="true"><i class="icon-calendar"></i> October 15, 2017</time>
<span class="byline author vcard"><i class='icon-user'></i> Fabian Affolter</span>
<span><i class='icon-time'></i> two minutes reading time</span>
<span>
<i class="icon-tags"></i>
<ul class="tags unstyled">
<li>Community</li>
</ul>
</span>
<a class='comments'
href="#post-comments"
>Comments</a>
</div>
</header>
<p>This <a href="https://github.com/home-assistant/home-assistant/pull/9868">Pull Request</a> shows in a clear way what happens if the documentation is not as good as it should be. In short, its about <a href="/docs/configuration/templating/">Templating</a> and how people start to think about creative ways to solve it if its not documented. Lets assume that we want the current year. There are a couple of options available to do that:</p>
<ul>
<li>Query <a href="http://date.jsontest.com/">JSON Test</a> with a <a href="/components/sensor.rest/"><code class="highlighter-rouge">rest</code> sensor</a> and a <code class="highlighter-rouge">value_template:</code>.</li>
<li>Use a <a href="/components/sensor.time_date/"><code class="highlighter-rouge">time_date</code> sensor </a> and a template <code class="highlighter-rouge"><span class="p">{</span><span class="err">{</span><span class="w"> </span><span class="err">strptime(states('sensor.date'),</span><span class="w"> </span><span class="err">'%Y-%m-%d').year</span><span class="w"> </span><span class="p">}</span><span class="err">}</span></code>.</li>
<li>Write a script in language X and use it with the <a href="/components/sensor.command_line/"><code class="highlighter-rouge">command</code> sensor</a> or use <code class="highlighter-rouge">date +"%Y"</code> as a <code class="highlighter-rouge">command:</code>.</li>
</ul>
<a name="read-more"></a>
<p>We want it simpler, right? <a href="/docs/configuration/templating/">Templating</a> offers <code class="highlighter-rouge">now()</code> and <code class="highlighter-rouge">utcnow()</code>. We will stick with <code class="highlighter-rouge">now()</code> in this blog post but it applies to <code class="highlighter-rouge">utcnow()</code> as well. Our documentation said:</p>
<blockquote>
<p><code class="highlighter-rouge">now()</code> will be rendered as current time in your time zone.</p>
</blockquote>
<p>Hmmm, …OK, thats a start. How to get the year? <code class="highlighter-rouge"><span class="p">{</span><span class="err">{</span><span class="w"> </span><span class="err">now()</span><span class="w"> </span><span class="p">}</span><span class="err">}</span></code> gives you <code class="highlighter-rouge">2017-10-14 20:27:23.700401+02:00</code> which is far more than we are looking for. As an user you dont want to dive into the code but there would you find the solution. You will get a <a href="https://docs.python.org/3.6/library/datetime.html#datetime.datetime">Python <code class="highlighter-rouge">datetime</code> object</a> from <code class="highlighter-rouge"><span class="p">{</span><span class="err">{</span><span class="w"> </span><span class="err">now()</span><span class="w"> </span><span class="p">}</span><span class="err">}</span></code>. This means that you can access more than you think in a template:</p>
<ul>
<li>For the time: <code class="highlighter-rouge">now().microsecond</code>, <code class="highlighter-rouge">now().second</code>, <code class="highlighter-rouge">now().minute</code> and <code class="highlighter-rouge">now().hour</code></li>
<li>For the date: <code class="highlighter-rouge">now().day</code>, <code class="highlighter-rouge">now().month</code> and <code class="highlighter-rouge">now().year</code></li>
<li>Misc: <code class="highlighter-rouge">now().weekday()</code> and <code class="highlighter-rouge">now().isoweekday()</code></li>
</ul>
<p>For the year it would be: <code class="highlighter-rouge"><span class="p">{</span><span class="err">{</span><span class="w"> </span><span class="err">now().year</span><span class="w"> </span><span class="p">}</span><span class="err">}</span></code>. I guess that there are rare use cases for <code class="highlighter-rouge">now().resolution</code>, <code class="highlighter-rouge">now().min</code> and <code class="highlighter-rouge">now().max</code> too.</p>
<p><a href="/blog/2017/09/29/hacktoberfest/">Hacktoberfest</a> is still running. Working on the documentation is pretty easy. If you know a nice <a href="/cookbook/">trick</a>, want to help improving the page of a platform or just fix typo then please do. Our <a href="/developers/documentation/">Website/Documentation section</a> contains some requirements which are defined in the <a href="/developers/documentation/standards/">Documentation Standards</a> and the “<a href="/developers/documentation/create_page/">Create a page</a>” documentation for other useful details.</p>
<p>Thanks to <a href="https://github.com/etsinko">Egor Tsinko</a> for bringing this issue to our attention.</p>
</article>
<div id='post-comments'></div>
<div id='discourse-comments'></div>
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: 'https://community.home-assistant.io/',
discourseEmbedUrl: 'https://home-assistant.io/blog/2017/10/15/templating-date-time/' };
(function() {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
})();
</script>
</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">
<h1 class="title delta">About Home Assistant</h1>
<ul class="divided">
<li>
Home Assistant is an open-source home automation platform running on Python 3. Track and control all devices at home and automate control.
</li>
<li><a href='/getting-started/'>Get started with Home Assistant</a></li>
<li><a href='/demo/'>Try the online demo</a></li>
<li><a class="twitter-follow-button" href="https://twitter.com/Home_Assistant">Follow Home Assistant on Twitter</a></li>
<li><div class="fb-like" data-href="https://www.facebook.com/homeassistantio/" data-layout="standard" data-action="like" data-size="small" data-show-faces="true" data-share="false"></div></li>
</ul>
</section>
<div id="fb-root"></div>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.async=true;js.src='//platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
<script>(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id)){return;}js=d.createElement(s);js.id=id;js.async=true;js.src="//connect.facebook.net/en_US/all.js#appId=338291289691179&xfbml=1";fjs.parentNode.insertBefore(js,fjs);}(document,'script','facebook-jssdk'));</script>
<section class="sharing aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">Share this post</h1>
<a href="//twitter.com/share"
class="twitter-share-button"
data-via="home_assistant"
data-related="home_assistant"
data-url="https://home-assistant.io/blog/2017/10/15/templating-date-time/"
data-counturl="https://home-assistant.io/blog/2017/10/15/templating-date-time/" >Tweet</a>
<div class="fb-share-button" style='top: -6px;'
data-href="https://home-assistant.io/blog/2017/10/15/templating-date-time/"
data-layout="button_count">
</div>
<div class="g-plusone" data-size="standard"></div>
</section>
<script src="https://apis.google.com/js/platform.js" async defer></script>
<section id="recent-posts" class="aside-module grid__item one-whole lap-one-half">
<h1 class="title delta">Recent Posts</h1>
<ul class="divided">
<li class="post">
<a href="/blog/2018/03/09/release-65/">0.65: Rename entities, new filter sensor, UpCloud and Channels</a>
</li>
<li class="post">
<a href="/blog/2018/02/26/release-64/">0.64: Over 1000 integrations! New: HomeKit, BMW, August.</a>
</li>
<li class="post">
<a href="/blog/2018/02/19/cloud-update/">Cloud Update</a>
</li>
<li class="post">
<a href="/blog/2018/02/10/release-63/">0.63: Entity Registry, SQL Sensor, Mercedes cars</a>
</li>
<li class="post">
<a href="/blog/2018/02/09/disabling-disqus/">Disabling Disqus comments</a>
</li>
</ul>
</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://plus.google.com/110560654828510104551'><i class="icon-google-plus"></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> (no support!).<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>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">home-assistant.io</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
</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>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.css" />
<script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js"></script>
<script type="text/javascript">
docsearch({
apiKey: 'ae96d94b201c5444c8a443093edf3efb',
indexName: 'home-assistant',
inputSelector: '#search',
debug: false // Set debug to true if you want to inspect the dropdown
});
document.querySelector('.search .close').addEventListener('click', function(ev) {
ev.preventDefault();
document.querySelector('.search-container').style.display = 'none';
});
document.querySelector('.show-search').addEventListener('click', function(ev) {
ev.preventDefault();
document.querySelector('.search-container').style.display = 'block';
document.getElementById('toggle').checked = false;
document.querySelector('.search-container input').focus();
});
</script>
</body>
</html>