{"id":2746,"date":"2024-05-24T21:56:09","date_gmt":"2024-05-24T19:56:09","guid":{"rendered":"https:\/\/www.montybanse.eu\/?p=2746"},"modified":"2024-05-24T22:19:29","modified_gmt":"2024-05-24T20:19:29","slug":"home-assistant-timebutler","status":"publish","type":"post","link":"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/","title":{"rendered":"Home Assistant &amp; Timebutler"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Alles auf einen Blick<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/#Home_Assistant_Timebutler\" >Home Assistant &amp; Timebutler<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/#Welche_Zutaten_benoetigen_wir_dafuer\" >Welche Zutaten ben\u00f6tigen wir daf\u00fcr?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/#Konfiguration_in_Home_Assistant\" >Konfiguration in Home Assistant<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/#Die_Entitaet\" >Die Entit\u00e4t<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/home-assistant-timebutler\/#Die_Automatisierung\" >Die Automatisierung<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2746\" class=\"elementor elementor-2746\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4f4d8ff elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"4f4d8ff\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ed55c29\" data-id=\"ed55c29\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8dc50c8 elementor-widget elementor-widget-heading\" data-id=\"8dc50c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Home_Assistant_Timebutler\"><\/span>Home Assistant &amp; Timebutler<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ca72143 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"ca72143\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-95a3d13\" data-id=\"95a3d13\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7ed9ae8 elementor-drop-cap-yes elementor-drop-cap-view-default elementor-widget elementor-widget-text-editor\" data-id=\"7ed9ae8\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;drop_cap&quot;:&quot;yes&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Es ist mal wieder so weit: Wir machen uns das Leben ein bisschen sch\u00f6ner.<\/p><p>\u00c4h. Fauler.<\/p><p><\/p><p>Wir nutzen bei uns im Unternehmen die Zeiterfassung von Timebutler. \u00a0Timebutler hat eine kleine API, mit der es sich wunderbar spielen und automatisieren l\u00e4sst. So aktiviere ich zum Beispiel meine Pause, wenn ich 3:15 nicht am Rechner bin (bzw. mein MacBook den Bildschirmschoner \/ die Sperre aktiviert) und setze mich wieder auf Anwesend, wenn ich ihn entsperre. Auch beende ich jeden Abend t\u00e4glich meine Zeiterfassung um 23:59 Uhr, da ich andernfalls meinen Zeiteintrag bearbeiten und ein anderer Kollege ihn best\u00e4tigen muss. Das spart doppelt Arbeit: Ich muss nicht dran denken ihn anzupassen und meine Kollegen m\u00fcssen sich nicht mit dem Best\u00e4tigen meiner \u00c4nderung herumplagen (h\u00f6h\u00f6).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-46417cd elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"46417cd\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-78696d1\" data-id=\"78696d1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a7f6d69 elementor-widget elementor-widget-heading\" data-id=\"a7f6d69\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Welche_Zutaten_benoetigen_wir_dafuer\"><\/span>Welche Zutaten ben\u00f6tigen wir daf\u00fcr?<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9687572 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"9687572\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-732fe89\" data-id=\"732fe89\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-27230f2 elementor-drop-cap-yes elementor-drop-cap-view-default elementor-widget elementor-widget-text-editor\" data-id=\"27230f2\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;drop_cap&quot;:&quot;yes&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Wir brauche Zugang zur Timebutler API. Dieser wird \u00fcber einen Bearer Token erlaubt \/ genehmigt \/ erstellt, sodass sich die Timebutler API dann z.B. \u00fcber einen gezielten cURL Aufruf bedienen l\u00e4sst.<\/p><p>Home Assistant. War irgendwie zu erwarten, oder?<\/p><p>Und die einen oder anderen Sensoren, die dann mit der API das machen, was ihr machen m\u00f6chtet. Bei mir ist es die HA Companion App auf dem MacBook, aber es sind nat\u00fcrlich auch andere Sensoren denkbar (Bewegungsmelder unter dem Schreibtisch, Kontaktsensor im Stuhl verbaut, ein Beschleunigungssensor in eurer Kaffeetasse &#8211; okay das w\u00e4re irgendwie cool). Irgendwas, womit ihr festmachen k\u00f6nnt &#8222;Okay, ich arbeite &#8211; oder auch nicht&#8220;.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a1d5142 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"a1d5142\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-033a8cb\" data-id=\"033a8cb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9eea1b8 elementor-widget elementor-widget-heading\" data-id=\"9eea1b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Konfiguration_in_Home_Assistant\"><\/span>Konfiguration in Home Assistant<span class=\"ez-toc-section-end\"><\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5cb6d33 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"5cb6d33\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dcd571a\" data-id=\"dcd571a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8ebd6a3 elementor-widget elementor-widget-text-editor\" data-id=\"8ebd6a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Die Konfiguration in Home Assistant ist fix erledigt. Wir ben\u00f6tigen einen zus\u00e4tzlichen Eintrag in der configuration.yaml (oder in einer eurer Wunsch-Configs, falls ihr sie aufgetrennt habt &#8211; daf\u00fcr war ich bisher zu faul, ich suche stattdessen lieber in der configuration.yaml, lol).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1ad5c4b elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"1ad5c4b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c489a60\" data-id=\"c489a60\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6e23124 elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"6e23124\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-yaml'>command_line:\n  - sensor:\n      name: Timebutler Status\n      unique_id: timebutler_status\n      command: curl -s -X POST -d &#039;auth={BEARER_TOKEN}&#039; -d &#039;userid={USER_ID}&#039; -d &#039;command=status&#039; https:\/\/timebutler.de\/api\/v1\/timeclock | awk -F&quot;;&quot; &#039;{print$2}&#039;\n      scan_interval: 5\n\nshell_command: \n  timebutler_pause: curl -X POST -d &#039;auth={BEARER_TOKEN}&#039; -d &#039;userid={USER_ID}&#039; -d &#039;command=pause&#039; https:\/\/timebutler.de\/api\/v1\/timeclock\n  timebutler_start: curl -X POST -d &#039;auth={BEARER_TOKEN}&#039; -d &#039;userid={USER_ID}&#039; -d &#039;command=start&#039; https:\/\/timebutler.de\/api\/v1\/timeclock\n  timebutler_ende: curl -X POST -d &#039;auth={BEARER_TOKEN}&#039; -d &#039;userid={USER_ID}&#039; -d &#039;command=stop&#039; https:\/\/timebutler.de\/api\/v1\/timeclock<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cfb297a elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"cfb297a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-497c58e\" data-id=\"497c58e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-be53b0e elementor-widget elementor-widget-text-editor\" data-id=\"be53b0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Das ist auch schon alles. Viel zu erkl\u00e4ren gibt es auch gar nicht. Das bisschen configuration macht folgendes:<\/p><p>Es wird ein Sensor mit dem Namen timebutler_status erstellt. Dieser erh\u00e4lt dann den jeweiligen Status der eure Zeiterfassung gerade hat:<\/p><p>RUNNING: Joa, Ihr arbeitet \/ Zeiterfassung l\u00e4uft<br \/><span style=\"font-size: inherit;\">PAUSED: Ihr seid in Pause \/ Zeiterfassung pausiert<br \/><\/span><span style=\"font-size: inherit;\">IDLE: Ihr seid nicht angemeldet \/ Zeiterfassung l\u00e4uft nicht<\/span><\/p><p>Gleichzeitig legen wir uns drei Shell_Commands an (die dann auch nur ein cURL auf die API sind) um Timebutler zu starten, pausieren oder zu beenden.<\/p><p>Die beiden Variablen {BEARER_TOKEN} und {USER_ID} m\u00fcsst ihr oben nat\u00fcrlich jeweils ersetzen. Man h\u00e4tte da auch sicher mit nem Insert oder so arbeiten k\u00f6nnen, aber f\u00fcr normal muss das ja nicht dauernd ge\u00e4ndert werden. Beides findet ihr in Timebutler (ich wei\u00df leider nicht genau wo, da ich es selbst nur angefragt habe) und die User-ID ist eure pers\u00f6nliche ID und sie l\u00e4sst sich ebenfalls \u00fcber die API Abfragen (steht aber bestimmt auch irgendwo in Timebutler selbst).<\/p><p>\u00dcber scan_interval: 5 k\u00f6nnen wir die H\u00e4ufigkeit der Aktualisierung steuern. Hier sind es 5 Sekunden, sprich wenn ihr euch auf Pause schaltet, dauert es maximal 5 Sekunden, bis Home Assistant es mitbekommt. Denkbar w\u00e4re wahrscheinlich auch eine 1 oder ein h\u00f6herer Wert. Aber ich fand 5 Sekunden v\u00f6llig ausreichend.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9454588 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"9454588\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c4f68a\" data-id=\"7c4f68a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ddabfc0 elementor-widget elementor-widget-heading\" data-id=\"ddabfc0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Die_Entitaet\"><\/span>Die Entit\u00e4t<span class=\"ez-toc-section-end\"><\/span><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4ca0d75 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"4ca0d75\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f16f15d\" data-id=\"f16f15d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8ede2a4 elementor-widget elementor-widget-image\" data-id=\"8ede2a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"750\" height=\"365\" src=\"https:\/\/www.montybanse.eu\/wp-content\/uploads\/2024\/05\/CleanShot-2024-05-24-at-21.59.28-1024x498.png\" class=\"attachment-large size-large wp-image-2749\" alt=\"\" srcset=\"https:\/\/www.montybanse.eu\/wp-content\/uploads\/2024\/05\/CleanShot-2024-05-24-at-21.59.28-1024x498.png 1024w, https:\/\/www.montybanse.eu\/wp-content\/uploads\/2024\/05\/CleanShot-2024-05-24-at-21.59.28-300x146.png 300w, https:\/\/www.montybanse.eu\/wp-content\/uploads\/2024\/05\/CleanShot-2024-05-24-at-21.59.28-768x374.png 768w, https:\/\/www.montybanse.eu\/wp-content\/uploads\/2024\/05\/CleanShot-2024-05-24-at-21.59.28.png 1050w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-05a695c elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"05a695c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f07a75a\" data-id=\"f07a75a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a84e6d6 elementor-widget elementor-widget-text-editor\" data-id=\"a84e6d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>So sieht das nun aus. Das obere ist meine Automation, die Timebutler bei mir steuert und darunter haben wir die Entit\u00e4t mit dem Sensor, die uns den aktuellen Status ausgibt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-40d9c75 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"40d9c75\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a5eda8d\" data-id=\"a5eda8d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-53193e8 elementor-widget elementor-widget-heading\" data-id=\"53193e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><span class=\"ez-toc-section\" id=\"Die_Automatisierung\"><\/span>Die Automatisierung<span class=\"ez-toc-section-end\"><\/span><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-57fff31 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"57fff31\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b83e09b\" data-id=\"b83e09b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e3f94ad elementor-widget elementor-widget-code-block-for-elementor\" data-id=\"e3f94ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-block-for-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-yaml'>alias: &quot;Arbeitszimmer: Timebutler&quot;\ndescription: &quot;&quot;\ntrigger:\n  - platform: state\n    entity_id:\n      - binary_sensor.mbp_inwx_active\n    to: true\n    for:\n      hours: 0\n      minutes: 3\n      seconds: 15\n    attribute: Locked\n    id: mbp-inwx-locked\n  - platform: state\n    entity_id:\n      - binary_sensor.mbp_inwx_active\n    to: false\n    for:\n      hours: 0\n      minutes: 0\n      seconds: 0\n    attribute: Locked\n    id: mpb-inwx-unlocked\n  - platform: time\n    at: &quot;23:59:00&quot;\n    alias: &quot;23:59&quot;\n    id: &quot;23:59&quot;\ncondition: []\naction:\n  - alias: Timebutler abmelden\n    if:\n      - condition: trigger\n        id:\n          - &quot;23:59&quot;\n      - condition: or\n        conditions:\n          - condition: state\n            entity_id: sensor.timebutler_status\n            state: RUNNING\n          - condition: state\n            entity_id: sensor.timebutler_status\n            state: PAUSED\n    then:\n      - service: shell_command.timebutler_ende\n        data: {}\n      - service: notify.mobile_app_iphone_monty\n        data:\n          title: Timebutler\n          message: Zeiterfassung automatisch beendet.\n      - service: script.tts_queue\n        metadata: {}\n        data:\n          important: false\n          target:\n            - media_player.alexa_kuche\n            - media_player.alexa_arbeitszimmer\n            - media_player.alexa_schlafzimmer\n            - media_player.alexa_wohnzimmer\n          announce: false\n          message: Zeiterfassung beendet.\n  - alias: Timebutler anmelden\n    if:\n      - condition: trigger\n        id:\n          - mpb-inwx-unlocked\n      - condition: state\n        entity_id: sensor.mbp_inwx_primary_display_name\n        state: LG HDR WQHD\n      - condition: zone\n        entity_id: person.montgomery_banse\n        zone: zone.home\n      - condition: time\n        after: &quot;08:30:00&quot;\n        before: &quot;17:30:00&quot;\n        weekday:\n          - mon\n          - tue\n          - wed\n          - thu\n          - fri\n      - condition: or\n        conditions:\n          - condition: state\n            entity_id: sensor.timebutler_status\n            state: IDLE\n          - condition: state\n            entity_id: sensor.timebutler_status\n            state: PAUSED\n    then:\n      - service: shell_command.timebutler_start\n        data: {}\n      - service: notify.mobile_app_iphone_monty\n        data:\n          title: Timebutler\n          message: Zeiterfassung gestartet.\n      - service: script.tts_queue\n        metadata: {}\n        data:\n          target:\n            - media_player.alexa_arbeitszimmer\n          message: Zeiterfassung gestartet.\n          announce: true\n  - alias: Timebutler pausieren\n    if:\n      - condition: trigger\n        id:\n          - mbp-inwx-locked\n      - condition: zone\n        entity_id: person.montgomery_banse\n        zone: zone.home\n      - condition: state\n        entity_id: sensor.mbp_inwx_primary_display_name\n        state: LG HDR WQHD\n      - condition: time\n        after: &quot;08:30:00&quot;\n        before: &quot;17:30:00&quot;\n        weekday:\n          - mon\n          - tue\n          - wed\n          - thu\n          - fri\n      - condition: state\n        entity_id: sensor.timebutler_status\n        state: RUNNING\n    then:\n      - service: shell_command.timebutler_pause\n        data: {}\n      - service: notify.mobile_app_iphone_monty\n        data:\n          title: Timebutler\n          message: Zeiterfassung pausiert.\n      - service: script.tts_queue\n        metadata: {}\n        data:\n          target:\n            - media_player.alexa_arbeitszimmer\n          message: Zeiterfassung pausiert.\n          announce: true\nmode: single\n<\/code><\/pre>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a24a96b elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no\" data-id=\"a24a96b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-86f5704\" data-id=\"86f5704\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a1cc6d4 elementor-widget elementor-widget-text-editor\" data-id=\"a1cc6d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Hier gebe ich euch einmal meine komplette Automatisierung durch.<\/p><p>Ich reagiere hier auf drei Trigger: Einmal die Zeit 23:59 Uhr, und dann ob mein Macbook gesperrt oder entsperrt wird. Beim letzteren \u00e4ndert sich das Attribut Locked von\u00a0binary_sensor.mbp_inwx_active auf true oder false.<\/p><p>Die einzelnen Aktionen sind dann jeweils wieder WENNs, die auf die Trigger-IDs h\u00f6ren und gleichzeitig noch eine entsprechende Bedingung haben um die Sinnhaftigkeit des Pausieren oder Beenden zu testen.<\/p><p>Also es findet z.B. um 23:59 auch nur der Aufruf von\u00a0<span style=\"font-size: inherit;\">service: shell_command.timebutler_ende statt, wenn der aktuelle Status auch wirklich RUNNING oder PAUSED ist. W\u00e4re ja auch Quatsch sich abzumelden, wenn man nicht angemeldet ist. (Die API w\u00fcrde dann ohnehin einen Fehler ausgeben, der aber nicht st\u00f6ren w\u00fcrde, da wir die R\u00fcckgaben nicht auswerten, hierf\u00fcr habe ich keinen Sinn gesehen, da es au\u00dfer einem Status-Code keine wirklichen Infos gibt die man verwerten k\u00f6nnte)<\/span><\/p><p><span style=\"font-size: inherit;\">Das Einstempeln und Pausieren habe ich \u00fcbrigens nur aktiv, wenn ich mich in der HomeZone befinde und mein MacBook meinen LG Monitor als Prim\u00e4ren Monitor nutzt (er ist immer als Prim\u00e4rer eingestellt, daher ist es egal ob ich das MacBook zugeklappt oder aufgeklappt lasse). Dadurch stelle ich sicher, dass ich auch am Schreibtisch sitze. Gleichzeitig wird noch die Zeit zwischen 8:30 Uhr und 17:30 Uhr \u00fcberpr\u00fcft. Das ist die \u00fcbliche Arbeitszeit in der ich aktiv bin. Davor oder Danach muss ich mich selbst <\/span>Einstempeln<span style=\"font-size: inherit;\">\u00a0(genauso z.B. wenn ich auf dem Balkon sitze oder im B\u00fcro bin).<\/span><\/p><p><span style=\"font-size: inherit;\">Zus\u00e4tzlich als Feedback lasse ich mir eine Notify aufs Handy und MacBook schicken und eine Info via Alexa ausgeben. Hierf\u00fcr nutze ich mein TTS Skript (guckst du hier, wenn du wissen m\u00f6chtest was das feines macht: <a href=\"https:\/\/www.montybanse.eu\/index.php\/server-programmierung-co\/smarthome\/elementor-2351\/\">TTS (-Queue) mit Home Assistant und Alexa als Skript<\/a>).<\/span><\/p><p>Das ist es auch schon gewesen. Somit habe ich mit 3 Minuten ein kleines Puffer, in dem ich mal kurz zur Kaffeemaschine kann ohne das ich pausiert werde, aber falls ich mich auf der Keramik zulange durch Instagram scrollen w\u00fcrde, gehe ich in Pause und schr\u00f6pfe meinen Arbeitgeber nicht ;).\u00a0<\/p><p>(Ja, mir ist bekannt das Toiletteng\u00e4nge arbeitsrechtlich zur Arbeitszeit z\u00e4hlen, aber ich empfinde es unfair dies zuhause unn\u00f6tig auszunutzen. Und manchmal erwische ich mich auch, wie ich nicht nur fix Kaffee nachschenke, sondern auch noch 5 Minuten lang den Sp\u00fcler ausr\u00e4ume &#8211; und das ist nun definitiv keine Arbeitszeit).<\/p><p>Viel Spa\u00df damit, vielleicht kann es ja jemand gebrauchen.\u00a0<\/p><p>\u00dcbrigens: Es gibt f\u00fcr Timebutler noch keine Integration. Eine Integration zu schreiben \u00fcbersteigt aber definitiv mein Wissen. Falls du das hier also liest und eine Integration schreiben kannst oder m\u00f6chtest und ich dich jetzt auf eine Idee gebracht hab:<a href=\"https:\/\/www.montybanse.eu\/index.php\/schreib-mir\/\"> Lass mich doch teilhaben<\/a>! Ich w\u00fcrde es gerne kennenlernen und verstehen.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Home Assistant &#038; Timebutler Es ist mal wieder so weit: Wir machen uns das Leben ein bisschen sch\u00f6ner. \u00c4h. Fauler. Wir nutzen bei uns im Unternehmen die Zeiterfassung von Timebutler. \u00a0Timebutler hat eine kleine API, mit der es sich wunderbar spielen und automatisieren l\u00e4sst. So aktiviere ich zum Beispiel meine<\/p>\n","protected":false},"author":1,"featured_media":2753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[20],"tags":[],"class_list":["post-2746","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-smarthome"],"_links":{"self":[{"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/posts\/2746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2746"}],"version-history":[{"count":4,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/posts\/2746\/revisions"}],"predecessor-version":[{"id":2752,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/posts\/2746\/revisions\/2752"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/media\/2753"}],"wp:attachment":[{"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.montybanse.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}