{
  "version": "2.0",
  "xmlns": {
    "atom": "http://www.w3.org/2005/Atom",
    "content": "http://purl.org/rss/1.0/modules/content/",
    "georss": "http://www.georss.org/georss",
    "gml": "http://www.opengis.net/gml"
  },
  "channel": {
    "title": "fboës - Der Blog | Artikel mit dem Tag \"Technologie\"",
    "link": "https://journal.3960.org/",
    "description": "Programmierung, Luft- & Raumfahrt, Kurioses: Der Blog von und mit Frank Boës.",
    "language": "de-DE",
    "copyright": "© 2008-2023 Creative Commons BY",
    "atom_link": {
      "href": "https://journal.3960.org/tagged/technologie/rss.json",
      "rel": "self",
      "type": "application/rss+json"
    },
    "lastBuildDate": "Tue, 24 Mar 2026 20:00:16 +0100",
    "atom_updated": "2026-03-24T20:00:16+01:00",
    "generator": "blogophon",
    "image": {
      "url": "https://cdn.3960.org/images/tile-128x128.png",
      "title": "fboës - Der Blog",
      "link": "https://journal.3960.org/"
    },
    "items": [
      {
        "title": "I did not know Node.js could do that",
        "description": "<p>Node.js has an astonishing integrated set of utilities which you might never have considered (and turned to NPM packages instead). So here are my favourites:</p>",
        "content_encoded": "<p>Node.js has an astonishing integrated set of utilities which you might never have considered (and turned to NPM packages instead). So here are my favourites:</p>\n<!-- more -->\n<h2 id=\"more\">Utilities</h2>\n<h3 id=\"utilformat\"><a href=\"https://nodejs.org/api/util.html#utilformatformat-args\"><code>util.format</code></a></h3>\n<blockquote><p>The <code>util.format()</code> method returns a formatted string using the first argument as a <code>printf</code>-like format string which can contain zero or more format specifiers. Each specifier is replaced with the converted value from the corresponding argument. </p></blockquote>\n<h3 id=\"utilisdeepstrictequal\"><a href=\"https://nodejs.org/api/util.html#utilisdeepstrictequalval1-val2-options\"><code>util.isDeepStrictEqual</code></a></h3>\n<blockquote><p>Returns <code>true</code> if there is deep strict equality between <code>val1</code> and <code>val2</code>.</p></blockquote>\n<h3 id=\"utilparseenv\"><a href=\"https://nodejs.org/api/util.html#utilparseenvcontent\"><code>util.parseEnv</code></a></h3>\n<blockquote><p>The raw contents of a <code>.env</code> file.</p></blockquote>\n<p>Consider this example:</p>\n<pre><code class=\"language-javascript\"><i>import</i> { parseEnv } from <kbd>'node:util'</kbd>;\n\nparseEnv(<kbd>`\\\nDB_HOST=localhost\nDB_USER=user\n`</kbd>);\n<u>// Returns: { DB_HOST: &quot;localhost&quot;, DB_USER: &quot;user&quot; }</u>\n</code></pre>\n<h3 id=\"utiltypes\"><a href=\"https://nodejs.org/api/util.html#utiltypes\"><code>util.types</code></a></h3>\n<blockquote><p><code>util.types</code> provides type checks for different kinds of built-in objects. Unlike <code>instanceof</code> or <code>Object.prototype.toString.call(value)</code>, these checks do not inspect properties of the object that are accessible from JavaScript (like their prototype), and usually have the overhead of calling into C++.</p></blockquote>\n<h3 id=\"sqlite\"><a href=\"https://nodejs.org/api/sqlite.html\"><code>sqlite</code></a></h3>\n<blockquote><p>The <code>node:sqlite</code> module facilitates working with SQLite databases.</p></blockquote>\n<h3 id=\"utildeprecate\"><a href=\"https://nodejs.org/api/util.html#utildeprecatefn-msg-code-options\"><code>util.deprecate</code></a></h3>\n<blockquote><p>The <code>util.deprecate()</code> method wraps <code>fn</code> (which may be a function or class) in such a way that it is marked as deprecated.</p></blockquote>\n<h2 id=\"terminal\">Terminal</h2>\n<h3 id=\"utilparseargs\"><a href=\"https://nodejs.org/api/util.html#utilparseargsconfig\"><code>util.parseArgs</code></a></h3>\n<blockquote><p>Provides a higher level API for command-line argument parsing than interacting with <code>process.argv</code> directly. Takes a specification for the expected arguments and returns a structured object with the parsed options and positionals.</p></blockquote>\n<p>Consider this example:</p>\n<pre><code class=\"language-javascript\"><i>import</i> { parseArgs } from <kbd>&quot;node:util&quot;</kbd>;\n\n<b>const</b> { values,  positionals } = parseArgs({ \n  options: {\n    force: {\n      type: <kbd>&quot;boolean&quot;</kbd>,\n      <b>short</b>: <kbd>&quot;f&quot;</kbd>,\n    },\n    output: {\n      type: <kbd>&quot;string&quot;</kbd>,\n      <b>short</b>: <kbd>&quot;o&quot;</kbd>,\n      default: <kbd>&quot;.&quot;</kbd>\n    },\n  },\n  allowPositionals: <samp>true</samp>,\n});\n\nconsole.log(values, positionals);\n</code></pre>\n<p>Calling this on the CLI…</p>\n<pre><code class=\"language-bash\">node cli.js generate <em>--force</em> <em>-o</em>=./tmp\n</code></pre>\n<p>…will give you a structured object of all parameters as well as an array positional arguments.</p>\n<h3 id=\"utilstyletext\"><a href=\"https://nodejs.org/api/util.html#utilstyletextformat-text-options\"><code>util.styleText</code></a></h3>\n<blockquote><p>This function returns a formatted text considering the format passed for printing in a terminal. It is aware of the terminal&quot;s capabilities and acts according to the configuration set via <code>NO_COLOR</code>, <code>NODE_DISABLE_COLORS</code> and <code>FORCE_COLOR</code> environment variables.</p></blockquote>\n<p>See also the <a href=\"https://nodejs.org/api/util.html#modifiers\">full list of available styling modifiers</a>, which include foreground colors, bacgkround colors as well as text styles.</p>\n<h2 id=\"testing\">Testing</h2>\n<p>Consider this example:</p>\n<pre><code class=\"language-javascript\"><i>import</i> { describe, it } from <kbd>'node:test'</kbd>;\n\ndescribe(<kbd>&quot;Test suite A&quot;</kbd>, () <samp>=&gt;</samp> {\n  it(<kbd>&quot;should prove 1 is 1&quot;</kbd>, () <samp>=&gt;</samp> {\n    assert.strictEqual(<em>1</em>, <em>1</em>);\n  });\n\n  it(<kbd>&quot;should also prove that 2 is 2&quot;</kbd>, () <samp>=&gt;</samp> {\n    assert.strictEqual(<em>2</em>, <em>2</em>);\n  });\n});\n</code></pre>\n<p>Adhering to a file name convention for your tests, <code>node --test</code> can execute all of these tests with the test runner. See <a href=\"https://betterstack.com/community/guides/testing/nodejs-test-runner/\">Node.js Test Runner: A Beginner&#39;s Guide – Better Stack Community</a> for more information on how to set this up.</p>\n<h3 id=\"nodejs-test-runner\"><a href=\"https://nodejs.org/api/test.html\">Node.js Test runner</a></h3>\n<blockquote><p>The <code>node:test</code> module facilitates the creation of JavaScript tests. </p></blockquote>\n<h3 id=\"assert\"><a href=\"https://nodejs.org/api/assert.html\"><code>assert</code></a></h3>\n<blockquote><p>The <code>node:assert</code> module provides a set of assertion functions for verifying invariants.</p></blockquote><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=I%20did%20not%20know%20Node.js%20could%20do%20that&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2026-03-20-did-not-know-node-js-could-do-that%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2026-03-20-did-not-know-node-js-could-do-that/",
        "pubDate": "Fri, 20 Mar 2026 18:35:59 +0100",
        "atom_published": "2026-03-20T18:35:59+01:00",
        "atom_updated": "2026-03-21T14:22:30+01:00",
        "guid": "user/posts/2026-03-20-did-not-know-node-js-could-do-that/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Javascript",
          "Programmierung",
          "Technologie",
          "Webdevelop"
        ]
      },
      {
        "title": "Marathon – Der Trailer",
        "description": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=fvbEnWLRo1s\" src=\"https://www.youtube-nocookie.com/embed/fvbEnWLRo1s?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/fvbEnWLRo1s?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/fvbEnWLRo1s/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/fvbEnWLRo1s/hqdefault.jpg\" --></div>\n<p>Schnitt, Ästhetik, Voice Acting, Choreographie, Musik, Sound, Story, <em>Atmosphäre</em> – der Trailer zu „Marathon“ ist ein Stück Kunst.</p>\n<p>Von mir aus kann Bungie statt einem Extraction Shooter auch einen Kinofilm aus dem Setting machen.</p>\n<p>Der Stil erinnert nicht von ungefähr an die ebenfalls sehr eindringliche Folge <a href=\"https://www.imdb.com/title/tt20239442/\">„Jibaro“ aus der Serie „Love, Death &amp; Robots“</a>.</p>",
        "content_encoded": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=fvbEnWLRo1s\" src=\"https://www.youtube-nocookie.com/embed/fvbEnWLRo1s?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/fvbEnWLRo1s?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/fvbEnWLRo1s/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/fvbEnWLRo1s/hqdefault.jpg\" --></div>\n<p>Schnitt, Ästhetik, Voice Acting, Choreographie, Musik, Sound, Story, <em>Atmosphäre</em> – der Trailer zu „Marathon“ ist ein Stück Kunst.</p>\n<p>Von mir aus kann Bungie statt einem Extraction Shooter auch einen Kinofilm aus dem Setting machen.</p>\n<p>Der Stil erinnert nicht von ungefähr an die ebenfalls sehr eindringliche Folge <a href=\"https://www.imdb.com/title/tt20239442/\">„Jibaro“ aus der Serie „Love, Death &amp; Robots“</a>.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Marathon%20%E2%80%93%20Der%20Trailer&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2025-04-15-marathon-trailer%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2025-04-15-marathon-trailer/",
        "pubDate": "Tue, 15 Apr 2025 18:03:29 +0200",
        "atom_published": "2025-04-15T18:03:29+02:00",
        "atom_updated": "2025-04-15T19:13:47+02:00",
        "guid": "user/posts/2025-04-15-marathon-trailer/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Raumfahrt",
          "Spiel",
          "Technologie",
          "The Cool"
        ]
      },
      {
        "title": "ChatGPT does flight plans",
        "description": "<p>A brilliant conversation with ChatGPT for proposing a flight plan:</p>",
        "content_encoded": "<p>A brilliant conversation with ChatGPT for proposing a flight plan:</p>\n<!-- more -->\n<p id=\"more\">Please propose a short flight from Martha&#39;s Vineyard airport to a nearby airport with a Cessna 172</p>\n<blockquote><p>A great short flight from Martha&#39;s Vineyard Airport (MVY) in a Cessna 172 would be to Nantucket Memorial Airport (ACK). The flight covers about 30 nautical miles, which takes roughly 20–30 minutes depending on conditions. This route offers stunning views of the Atlantic Ocean and the islands, making it a scenic and enjoyable flight.</p><p>Given the relatively short distance and straightforward navigation over open water, it&#39;s a perfect trip for a short hop in a Cessna 172.</p></blockquote>\n<p>Could you give me a flight plan recommendation?</p>\n<blockquote><p>Certainly! Below is a suggested VFR (Visual Flight Rules) flight plan for a Cessna 172 from Martha&#39;s Vineyard Airport (KMVY) to Nantucket Memorial Airport (KACK).</p><h2 id=\"flight-plan-overview\">Flight Plan Overview:</h2><ul><li><strong>Departure:</strong> Martha&#39;s Vineyard Airport (KMVY)</li><li><strong>Destination:</strong> Nantucket Memorial Airport (KACK)</li><li><strong>Distance:</strong> ~30 NM</li><li><strong>Estimated Flight Time:</strong> 20–30 minutes</li><li><strong>Cruising Altitude:</strong> 3,000 feet (VFR recommended altitude)</li><li><strong>Flight Type:</strong> VFR</li></ul><h2 id=\"flight-plan-details\">Flight Plan Details:</h2><ul><li><p><strong>Pre-Flight:</strong></p><ul><li><strong>Weather:</strong> Check METAR/TAF for both MVY and ACK, as well as en route weather.</li><li><strong>Weight &amp; Balance:</strong> Ensure your Cessna 172 is within weight and balance limits.</li><li><strong>Fuel:</strong> Verify adequate fuel for the flight, including reserves.</li><li><strong>Navigation:</strong> Set up your navigation radios and GPS if available.</li></ul></li><li><p><strong>Departure from KMVY:</strong></p><ul><li><strong>Runway:</strong> Depending on the wind, likely Runway 24 or 06.</li><li><strong>Climb Out:</strong> After takeoff, climb to a cruising altitude of 3,000 feet.</li><li><strong>Heading:</strong> After departure, fly a south-eastern heading towards Nantucket. The initial heading will be approximately 120°.</li></ul></li><li><p><strong>En Route:</strong></p><ul><li><strong>Direct Route:</strong> Fly direct from MVY to ACK.</li><li><strong>Landmarks:</strong> You’ll be over water most of the way, with limited landmarks. However, keep an eye out for the following:<ul><li><strong>Edgartown</strong> on Martha&#39;s Vineyard, off to your left shortly after departure.</li><li><strong>Tuckernuck Island</strong> before reaching Nantucket.</li></ul></li></ul></li><li><p><strong>Arrival at KACK:</strong></p><ul><li><strong>Communication:</strong> Contact Nantucket Tower as you approach the Class D airspace.</li><li><strong>Descent:</strong> Begin your descent to pattern altitude (1,000 feet AGL) as you near the airport.</li><li><strong>Pattern Entry:</strong> Depending on the active runway, enter the appropriate traffic pattern.</li><li><strong>Runway:</strong> Likely Runway 24 or 06, depending on wind conditions.</li></ul></li><li><p><strong>Landing:</strong></p><ul><li>Perform a standard landing, taxi to the ramp, and shut down.</li></ul></li></ul><h2 id=\"communication-frequencies\">Communication Frequencies:</h2><ul><li><strong>MVY ATIS:</strong> 118.12 MHz</li><li><strong>MVY Ground:</strong> 121.90 MHz</li><li><strong>MVY Tower:</strong> 119.70 MHz</li><li><strong>ACK ATIS:</strong> 133.45 MHz</li><li><strong>ACK Tower:</strong> 118.30 MHz</li></ul><h2 id=\"considerations\">Considerations:</h2><ul><li><strong>Wind:</strong> Check the wind direction and adjust your runway choice and headings accordingly.</li><li><strong>Traffic:</strong> Nantucket can be busy, especially in the summer, so stay alert for other traffic.</li><li><strong>Alternate:</strong> If weather deteriorates or there&#39;s an issue, you could divert back to Martha&#39;s Vineyard or head to Cape Cod (Hyannis, KHYA).</li></ul><p>This is a straightforward flight, but it offers stunning views and a good practice opportunity for navigation over water and handling short cross-country flights. Safe flying!</p></blockquote>\n<p>Can you export that flight plan as Garmin fpl file?</p>\n<blockquote><p>Sure! To create a Garmin .fpl file, I&#39;ll generate the flight plan with the necessary waypoints and export it as an .fpl file. I&#39;ll base the file on the flight plan details we discussed.</p><p>I&#39;ll get that ready for you now.</p><p>I&#39;ve created the Garmin .fpl flight plan file for your route from Martha&#39;s Vineyard (KMVY) to Nantucket (KACK). The file is packaged in a .zip archive, which is often required by Garmin devices.</p><p>You can download the file using the link below:</p><p>Download MVY_to_ACK.zip</p><p>Feel free to upload it to your Garmin device, and have a great flight! If you need anything else, just let me know.</p></blockquote>\n<p>This is brilliant. Thank you</p>\n<blockquote><p>You&#39;re very welcome! I&#39;m glad you found the flight plan helpful. Enjoy the flight, and if you have any more questions or need further assistance, feel free to reach out. Safe skies! ✈️</p></blockquote><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=ChatGPT%20does%20flight%20plans&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2024-08-28-chatgpt-does-flight-plans%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2024-08-28-chatgpt-does-flight-plans/",
        "pubDate": "Wed, 28 Aug 2024 18:55:44 +0200",
        "atom_published": "2024-08-28T18:55:44+02:00",
        "atom_updated": "2024-08-28T18:58:54+02:00",
        "guid": "user/posts/2024-08-28-chatgpt-does-flight-plans/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Fliegerei",
          "Programmierung",
          "Simulation",
          "Technologie",
          "The Cool"
        ]
      },
      {
        "title": "The Insane Engineering of the SR-71 Blackbird",
        "description": "<p>The <a href=\"https://en.wikipedia.org/wiki/Lockheed_SR-71_Blackbird\">Lockheed SR-71 Blackbird</a> is a truly unique aircraft. This great video highlights the stranger aspects of hypersonic flight and the engineering obstacles which needed to be overcome to make the SR-71 reach speeds in excess of Mach 3 in 85,000 ft.</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=3hYSnyVLmGE\" src=\"https://www.youtube-nocookie.com/embed/3hYSnyVLmGE?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/3hYSnyVLmGE?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/3hYSnyVLmGE/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/3hYSnyVLmGE/hqdefault.jpg\" --></div>\n<p>As of today, its successor the <a href=\"https://en.wikipedia.org/wiki/Lockheed_Martin_SR-72\">Lockheed Martin SR-72 „Son of Blackbird“</a> has not yet taken flight – even though in cinemas and the Microsoft Flight Simulator the <a href=\"https://www.twz.com/darkstar-mockup-from-top-gun-maverick-looks-wicked-in-new-video\">Lockheed Martin Darkstar</a> has surpassed Mach 10 at least once. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p>",
        "content_encoded": "<p>The <a href=\"https://en.wikipedia.org/wiki/Lockheed_SR-71_Blackbird\">Lockheed SR-71 Blackbird</a> is a truly unique aircraft. This great video highlights the stranger aspects of hypersonic flight and the engineering obstacles which needed to be overcome to make the SR-71 reach speeds in excess of Mach 3 in 85,000 ft.</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=3hYSnyVLmGE\" src=\"https://www.youtube-nocookie.com/embed/3hYSnyVLmGE?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/3hYSnyVLmGE?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/3hYSnyVLmGE/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/3hYSnyVLmGE/hqdefault.jpg\" --></div>\n<p>As of today, its successor the <a href=\"https://en.wikipedia.org/wiki/Lockheed_Martin_SR-72\">Lockheed Martin SR-72 „Son of Blackbird“</a> has not yet taken flight – even though in cinemas and the Microsoft Flight Simulator the <a href=\"https://www.twz.com/darkstar-mockup-from-top-gun-maverick-looks-wicked-in-new-video\">Lockheed Martin Darkstar</a> has surpassed Mach 10 at least once. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=The%20Insane%20Engineering%20of%20the%20SR-71%20Blackbird&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2024-02-05-insane-engineering-the-sr-71-blackbird%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2024-02-05-insane-engineering-the-sr-71-blackbird/",
        "pubDate": "Mon, 05 Feb 2024 18:24:10 +0100",
        "atom_published": "2024-02-05T18:24:10+01:00",
        "atom_updated": "2024-02-05T18:24:10+01:00",
        "guid": "user/posts/2024-02-05-insane-engineering-the-sr-71-blackbird/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Fliegerei",
          "Militär",
          "Raumfahrt",
          "Technologie"
        ]
      },
      {
        "title": "One revolution per minute",
        "description": "<div class=\"video-player video-player--vimeo\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://vimeo.com/869858712\" src=\"https://player.vimeo.com/video/869858712\"></iframe></div>\n<p>Manche Künstler trifft man mehrfach im Leben. <a href=\"https://erikwernquist.com/\">Erik Wernquist</a> ist so ein Künstler. „One revolution per minute“ zeigt uns das Leben an Bord eines Kreuzfahrtraumschiffs…</p>",
        "content_encoded": "<div class=\"video-player video-player--vimeo\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://vimeo.com/869858712\" src=\"https://player.vimeo.com/video/869858712\"></iframe></div>\n<p>Manche Künstler trifft man mehrfach im Leben. <a href=\"https://erikwernquist.com/\">Erik Wernquist</a> ist so ein Künstler. „One revolution per minute“ zeigt uns das Leben an Bord eines Kreuzfahrtraumschiffs…</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=One%20revolution%20per%20minute&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-12-19-one-revolution-per-minute%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-12-19-one-revolution-per-minute/",
        "pubDate": "Tue, 19 Dec 2023 18:43:57 +0100",
        "atom_published": "2023-12-19T18:43:57+01:00",
        "atom_updated": "2023-12-19T18:43:57+01:00",
        "guid": "user/posts/2023-12-19-one-revolution-per-minute/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "The Cool",
          "Raumfahrt",
          "Technologie"
        ]
      },
      {
        "title": "RIDON Hoverbike",
        "description": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=Dm9awXyv2z8\" src=\"https://www.youtube-nocookie.com/embed/Dm9awXyv2z8?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Dm9awXyv2z8?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Dm9awXyv2z8/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Dm9awXyv2z8/hqdefault.jpg\" --></div>\n<p>Die <a href=\"https://www.ivangraphics.com/\">Portfolio-Seite von Ivan Tantsiura</a> ist eine wunderbare Fundgrube. Tantsiura arbeitet als Principal Concept Artist bei Crytek, und hat Unmengen an futuristischen Designs geschaffen – unter anderem das <a href=\"https://www.artstation.com/artwork/RvvOe\">RIDON Hoverbike</a>.</p>\n<p>Verglichen mit dem Speederbike aus Star Wars sieht man beim RIDON Hoverbike, warum das Hoverbike schwebt – und auch, dass diese Art von Schweben schon etwas sehr dynamisches hat. Der Mechanismus (wie auch die Welt des Hoverbikes) erinnern an <a href=\"https://simonstalenhag.se/\">Simon Stålenhag</a> und seine schwebenden Schiffe.</p>\n<p>Man bekommt direkt Lust, selber eine kleine Spritztour mit dem RIDON Hoverbike zu machen. Wo bleibt also der Arcade-Automat beziehungsweise das VR-Spiel zum Thema?</p>",
        "content_encoded": "<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"https://www.youtube.com/watch?v=Dm9awXyv2z8\" src=\"https://www.youtube-nocookie.com/embed/Dm9awXyv2z8?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Dm9awXyv2z8?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Dm9awXyv2z8/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Dm9awXyv2z8/hqdefault.jpg\" --></div>\n<p>Die <a href=\"https://www.ivangraphics.com/\">Portfolio-Seite von Ivan Tantsiura</a> ist eine wunderbare Fundgrube. Tantsiura arbeitet als Principal Concept Artist bei Crytek, und hat Unmengen an futuristischen Designs geschaffen – unter anderem das <a href=\"https://www.artstation.com/artwork/RvvOe\">RIDON Hoverbike</a>.</p>\n<p>Verglichen mit dem Speederbike aus Star Wars sieht man beim RIDON Hoverbike, warum das Hoverbike schwebt – und auch, dass diese Art von Schweben schon etwas sehr dynamisches hat. Der Mechanismus (wie auch die Welt des Hoverbikes) erinnern an <a href=\"https://simonstalenhag.se/\">Simon Stålenhag</a> und seine schwebenden Schiffe.</p>\n<p>Man bekommt direkt Lust, selber eine kleine Spritztour mit dem RIDON Hoverbike zu machen. Wo bleibt also der Arcade-Automat beziehungsweise das VR-Spiel zum Thema?</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=RIDON%20Hoverbike&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-12-13-ridon-hoverbike%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-12-13-ridon-hoverbike/",
        "pubDate": "Wed, 13 Dec 2023 18:38:16 +0100",
        "atom_published": "2023-12-13T18:38:16+01:00",
        "atom_updated": "2023-12-14T12:44:05+01:00",
        "guid": "user/posts/2023-12-13-ridon-hoverbike/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "The Cool",
          "Raumfahrt",
          "Technologie",
          "Geckobar"
        ]
      },
      {
        "title": "Sommermodus mit FRITZ!DECT und Home Assistant",
        "description": "<p><img src=\"https://journal.3960.org/posts/2023-05-26-sommermodus-mit-fritz-dect-home-assistant/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Der Sommermodus für die FRITZ!DECT-Thermostate wird über die FRITZ!Box gesteuert – mit einem festen Zeitplan. Mehr Flexibilität gibt es mit dem <a href=\"https://www.home-assistant.io/\">Home Assistant</a>, um zum Beispiel auf Temperaturdaten oder Wetterprognosen reagieren zu können.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2023-05-26-sommermodus-mit-fritz-dect-home-assistant/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Der Sommermodus für die FRITZ!DECT-Thermostate wird über die FRITZ!Box gesteuert – mit einem festen Zeitplan. Mehr Flexibilität gibt es mit dem <a href=\"https://www.home-assistant.io/\">Home Assistant</a>, um zum Beispiel auf Temperaturdaten oder Wetterprognosen reagieren zu können.</p>\n<!-- more -->\n<p id=\"more\">Dummerweise lässt sich der Sommermodus an den Thermostaten vom Home Assistant aus nicht einfach auslösen. Und selbst die im Home Assistant vorhandene Möglichkeit, den Thermostat einfach auszuschalten, funktioniert nicht wirklich gut – der nächste Schaltbefehl an den Thermostat hebt die Abschaltung wieder auf. Außerdem kann der Sommermodus deutlich mehr als nur die Heizung abzuschalten – unter anderem kümmert er sich um das gelegentliche Bewegen der Ventile, um sie vor dem Steckenbleiben zu bewahren.</p>\n<h2 id=\"die-lösung\">Die Lösung</h2>\n<p>…ist zweiteilig: In der FRITZ!Box legen wir mittels Vorlagen das ein- und ausschalten des Sommermodus&#39; an – und im Home Assistant lösen wir dann die Vorlagen aus.</p>\n<p><span class=\"figure\"><img src=\"https://journal.3960.org/posts/2023-05-26-sommermodus-mit-fritz-dect-home-assistant/fritz-heizen.png\" alt=\"Vorlagen in der FRITZ!Box - nützlicher, als gedacht\" /><span class=\"figcaption\" aria-hidden=\"true\">Vorlagen in der FRITZ!Box - nützlicher, als gedacht<br /></span></span></p>\n<ol>\n<li>In der FRITZ!Box legt ihr unter „Smart Home &gt; Automatisierungen“ eine neue Vorlage an, die ihr zum Beispiel „Sommermodus an“ nennt.<ol>\n<li>Wählt alle Heizungen aus, die ihr zeitgleich in den Sommermodus schicken wollt.</li>\n<li>Hinterlegt nun mit „Automatische Einstellungen &gt; Heizen beendet“ einen Zeitplan für den Sommermodus, der einfach das ganze Jahr umfasst. (Vorsichtige Naturen können dies auch vom 01. Mai bis 01. Oktober wählen.)</li>\n</ol>\n</li>\n<li>In der FRITZ!Box baut ihr nun eine zweite Vorlage, die ihr zum Beispiel „Sommermodus aus“ nennt.<ol>\n<li>Wählt wieder die selben Heizungen wie bei „Sommermodus an“ aus.</li>\n<li>Wählt nun die Option „Automatische Einstellungen &gt; Heizen beendet“ und hinterlegt <em>keinen</em> Zeitplan. Durch Auslösen dieses Vorlage wird nun der Sommermodus in den Heizungen gelöscht.</li>\n</ol>\n</li>\n<li>Nun wechselt in eurem Home Assistant und macht unter „Einstellungen &gt; Geräte und Dienste &gt; AVM FRITZ!SmartHome“ mittels der Option „Neu laden“ die neuen Vorlagen auch im Home Assistant bekannt. Diese hier „Smart Home Templates“ genannten Entitäten erzeugen automatisch ein Gerät, nämlich einen virtuellen Button.</li>\n<li>Diese Buttons könnt ihr nun eurem Dashboard hinzufügen, und so manuell den Sommermodus an- und ausschalten.</li>\n</ol>\n<h2 id=\"reaktion-auf-knöpfe\">Reaktion auf Knöpfe</h2>\n<p>Den Druck auf einen dieser Knöpfe könnt ihr im Hone Assistant abfangen und zusätzliche Aktionen auslösen.</p>\n<p>Dazu müsst ihr eine Automatisierung bauen, die beim Druck auf die Knöpfe neben den Vorlagen in der FRITZ!Box noch zusätzliche Aktionen auslösen:</p>\n<pre><code class=\"language-yaml\"><i>alias</i>: <kbd>&quot;Heizungen: Sommermodus an&quot;</kbd>\n<i>description</i>: <kbd>&quot;&quot;</kbd>\n<i>trigger</i>:\n  - <i>platform</i>: device\n    <i>device_id</i>: 5f6c4925f76d4ef27407160a968bb7fd\n    <i>domain</i>: button\n    <i>entity_id</i>: button.heizungen_sommermodus_an\n    <i>type</i>: pressed\n<i>condition</i>: []\n<i>action</i>:\n  - <i>service</i>: notify.notify\n    <i>data</i>:\n      <i>title</i>: <kbd>&quot;Sommermodus an&quot;</kbd>\n      <i>message</i>: &gt;-\n        Alle Heizungen sind nun abgeschaltet, willkommen im Sommermodus.\n    <i>enabled</i>: <samp>true</samp>\n<i>mode</i>: single\n</code></pre>\n<h2 id=\"automatisierung-des-sommermodus\">Automatisierung des Sommermodus&#39;</h2>\n<p>Wir haben aber ja die ganze Arbeit nicht auf uns genommen, um im Home Assistant selber auf Knöpfe drücken zu müssen. Tatsächlich können wir <strong>Automatisierungen</strong> des Home Assistants für uns auf den Knopf drücken lassen.</p>\n<p>Dabei kann in jeder Automatisierung als Aktion der Druck auf die Knöpfe ausgelöst werden:</p>\n<pre><code class=\"language-yaml\"><i>action</i>:\n  - <i>service</i>: button.press\n    <i>data</i>: {}\n    <i>target</i>:\n    <i>entity_id</i>: button.sommermodus_an\n    <i>enabled</i>: <samp>true</samp>\n</code></pre>\n<p>Somit könnt ihr euch nun beliebige Auslöser im Home Assistant konfigurieren, die eure Heizung in den Sommermodus schicken.</p>\n<h3 id=\"mehr-automatisierungen-mit-der-fritzbox-und-dem-home-assistant\">Mehr Automatisierungen mit der FRITZ!Box und dem Home Assistant</h3>\n<p>Die selbe Methode lässt sich neben dem Sommermodus auch für den Urlaubsmodus und eigentlich jede andere Vorlage in der FRITZ!Box anwenden. Dafür müsst ihr nur jeweils in der FRITZ!Box das gewünschte Verhalten als Vorlage definieren, um danach den zugehörigen Button im Home Assistant drücken zu können – beziehungsweise durch eine Automatisierungen auslösen zu können.</p>\n<p>Theoretisch könnt ihr darüber auch abweichende Zeitpläne oder geänderte Spar-/Komforttemperaturen oder zeitlich begrenzte EInstellungen wie Boost oder Fenster-Modus aktivieren.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Sommermodus%20mit%20FRITZ!DECT%20und%20Home%20Assistant&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-05-26-sommermodus-mit-fritz-dect-home-assistant%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-05-26-sommermodus-mit-fritz-dect-home-assistant/",
        "pubDate": "Fri, 26 May 2023 18:45:26 +0200",
        "atom_published": "2023-05-26T18:45:26+02:00",
        "atom_updated": "2023-05-29T09:48:19+02:00",
        "guid": "user/posts/2023-05-26-sommermodus-mit-fritz-dect-home-assistant/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Home Assistant",
          "Programmierung",
          "Technologie",
          "The Cool",
          "AVM",
          "Homeoffice"
        ]
      },
      {
        "title": "Die 24h-Uhr – als Web Component",
        "description": "<p><img src=\"https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/24h-clock-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Web Components zu bauen ist gar nicht so kompliziert, selbst ohne Framework. Nach meinen vorherigen <a href=\"https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/../2020-04-05-svg-web-components/\">Überlegungen zur Verwendung von SVGs in Web Components</a> war es also höchste Zeit, eine 24-Stunden-Uhr zu bauen.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/24h-clock-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Web Components zu bauen ist gar nicht so kompliziert, selbst ohne Framework. Nach meinen vorherigen <a href=\"https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/../2020-04-05-svg-web-components/\">Überlegungen zur Verwendung von SVGs in Web Components</a> war es also höchste Zeit, eine 24-Stunden-Uhr zu bauen.</p>\n<!-- more -->\n<h2 id=\"more\">Die Idee</h2>\n<p>24h-Uhren sind analoge Uhren, die einen feinen Unterschied zu herkömmlichen Uhren aufweisen. An Stelle von 12 Stunden pro Umdrehung des Stundenzeigers zeigen sie 24 Stunden an. Damit braucht also der Stundenzeiger einen kompletten Tag für einen Vollkreis.</p>\n<p>Damit ist es möglich, die vierundzwanzig Stunden auf dem Ziffernblatt grafisch in Tag, Dämmerung und Nacht einzuteilen. Da diese sich in Bezug auf das Datum und die geografische Position verändern, brauchte die Uhr also auch diese Informationen. In meinem Fall habe ich eine Skala auf dem Stundenring angebracht, die sich für die Nacht dunkelblau, für die Dämmung mittelblau und für den Tag hellblau verfärbt.</p>\n<p><span class=\"figure\"><img src=\"https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/24h-clock-2.png\" alt=\"Im hohen Norden scheint die Sonne heute nur kurz\" /><span class=\"figcaption\" aria-hidden=\"true\">Im hohen Norden scheint die Sonne heute nur kurz<br /></span></span></p>\n<h2 id=\"die-umsetzung\">Die Umsetzung</h2>\n<p>Der Bau als <a href=\"https://journal.3960.org/tagged/web-components/\">Web Component</a> erlaubt es nun, die Uhr mit relativ wenig HTML in eine beliebige Seite einzubauen. Unter <a href=\"https://github.com/fboes/twentyfour-hours-clock\">der Github-Seite zur 24h-Uhr</a> findet sich eine knappe Anleitung, der Einbau einer Web Component muss aber nicht komplizierter sein als:</p>\n<pre><code class=\"language-html\">&lt;<i>twentyfour-hours-clock</i>&gt;&lt;/<i>twentyfour-hours-clock</i>&gt;\n</code></pre>\n<p>Weitere <strong>Attribute</strong> erlauben es, die Component vorher mit Werten zu bestücken – die sich auch im Nachhinein mit JavaScript ändern lassen:</p>\n<pre><code class=\"language-html\">&lt;<i>twentyfour-hours-clock</i> <var>width</var>=&quot;<kbd>128</kbd>&quot; <var>height</var>=&quot;<kbd>128</kbd>&quot; <var>datetime</var>=&quot;<kbd>2011-10-10T14:48:00</kbd>&quot; <var>longitude</var>=&quot;<kbd>auto</kbd>&quot; <var>latitude</var>=&quot;<kbd>auto</kbd>&quot;&gt;&lt;/<i>twentyfour-hours-clock</i>&gt;\n</code></pre>\n<p>Auch das Einfärben, Vergrößern und Verkleinern von Einzelteilen der Web Component sind mit <strong>CSS Custom Properties</strong> möglich:</p>\n<pre><code class=\"language-html\">&lt;<i>style</i>&gt;\ntwentyfour-hours-clock {\n  --color-watchhand: pink;\n  --color-night: #111111;\n}\n&lt;/<i>style</i>&gt;\n&lt;<i>twentyfour-hours-clock</i>&gt;&lt;/<i>twentyfour-hours-clock</i>&gt;\n</code></pre>\n<p>Die Web Component selber wurde mit TypeScript gebaut. Tatsächlich wäre auch der Bau direkt in <i>Vanilla JavaScript</i> möglich gewesen. Meine letzten Abenteuer in <a href=\"https://www.typescriptlang.org/\">TypeScript</a> sind aber so angenehme Erfahrungen gewesen, dass ich die Unterstützung bei der Typisierung in JavaScript nicht mehr missen möchte, und die Web Component in TypeScript gebaut habe. Inzwischen halte ich bei JavaScript die Verwendung von TypeScript für so hilfreich, dass ich auf ESLint zur Überprüfung meiner Programmierung bei Privatprojekten gerne verzichte.</p>\n<h2 id=\"her-mit-der-uhr\">Her mit der Uhr!</h2>\n<p>Ein funktionierendes Beispiel für die fertige Uhr findet sich auf der <a href=\"https://fboes.github.io/twentyfour-hours-clock/dist/\">Demonstrationsseite für die 24h-Uhr</a>.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Die%2024h-Uhr%20%E2%80%93%20als%20Web%20Component&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-03-05-24h-uhr-als-web-component%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-03-05-24h-uhr-als-web-component/",
        "pubDate": "Sun, 05 Mar 2023 18:56:12 +0100",
        "atom_published": "2023-03-05T18:56:12+01:00",
        "atom_updated": "2023-03-05T18:56:12+01:00",
        "guid": "user/posts/2023-03-05-24h-uhr-als-web-component/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Webdevelop",
          "Web-Components",
          "SVG",
          "Javascript",
          "CSS",
          "Geografie",
          "Outdoor",
          "Programmierung",
          "Technologie"
        ]
      },
      {
        "title": "Pragmatische Heizungssteuerung im Home-Office",
        "description": "<p><img src=\"https://journal.3960.org/posts/2023-02-14-pragmatische-heizungssteuerung-home-office/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Mein neuestes Abenteuer mit dem <a href=\"https://www.home-assistant.io/\">Home Assistant</a> in Verbindung mit <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301</a> beschäftigt sich mit einer smarten Heizungssteuerung für das Home-Office.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2023-02-14-pragmatische-heizungssteuerung-home-office/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Mein neuestes Abenteuer mit dem <a href=\"https://www.home-assistant.io/\">Home Assistant</a> in Verbindung mit <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301</a> beschäftigt sich mit einer smarten Heizungssteuerung für das Home-Office.</p>\n<!-- more -->\n<h2 id=\"more\">Wie es lief</h2>\n<p>Ach, was habe ich alles gebaut und gebastelt. Los ging es mit einem einfachen Zeitplan in der FRITZ!Box, der <strong>jeden Montag bis Freitag</strong> in der Arbeitszeit die Heizung ein- und danach wieder ausschaltete. Ich war&#39;s zufrieden.</p>\n<p>Aber an <strong>Feiertagen</strong>, die zwischen Montag und Freitag lagen, lief die Heizung immer noch. Höchste Zeit, den <a href=\"https://www.home-assistant.io/integrations/workday/\">Werktags-Sensor</a> über den Home Assistant zu verbauen und in die Heizungssteuerung mit einzubeziehen. Dafür musste ich dann den Zeitplan aus der FRITZ!Box entfernen und ebenfalls in den Home Assistant übertragen.</p>\n<p>Und im Urlaub? Urlaube sind ja keine Feiertage. Also noch einen Kalender in den Home Assistant integriert, der an <strong>Urlaubstagen</strong> die Heizung ebenfalls ausgeschaltet hält.</p>\n<p>Oha, <strong>Gleitzeit und Überstunden</strong>: Mal starte ich früher, mal höre ich später auf. Also diesen Teil von Hand steuern? Und wie ist es am Wochenende, wenn man im Arbeitszimmer am privaten PC etwas bastelt?</p>\n<p>Wie man es auch dreht und wendet – der Plan hatte inzwischen viel zu viele Variablen bekommen. Eigentlich wollte ich doch nur, dass die Heizung läuft, wenn ich im Raum bin! Aber wie kann ich das dem Home Assistant beibringen?</p>\n<h2 id=\"wie-es-läuft\">Wie es läuft</h2>\n<p>Ganz einfach! Ob im Büro jemand arbeitet kann man daran erkennen, dass einer der PCs im Büro eingeschaltet ist. Ein super-simples Rezept kann also prüfen, ob mindestens einer der Rechner dort an und im Netzwerk sichtbar ist, und schaltet entsprechend die Heizung an. Wenn <em>keiner</em> der Rechner im Netzwerk ist, wird die Heizung entsprechend ausgeschaltet.</p>\n<h3 id=\"teil-1-status-der-pcs-überwachen\">Teil 1: Status der PCs überwachen</h3>\n<p><img src=\"https://journal.3960.org/posts/2023-02-14-pragmatische-heizungssteuerung-home-office/network-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Dazu bauen wir uns einen Zustand, der eingeschaltet ist, wenn irgendeiner der PCs angeschaltet und im Netzwerk ist – und erst ausgeschaltet ist, wenn <em>alle</em> PCs ausgeschaltet sind. Das funktioniert wie folgt:</p>\n<ol>\n<li>Wenn ihr im Home Assistant und „Einstellungen &gt; Geräte &amp; Dienste &gt; FRITZ!Box“ die Liste der Geräte aufmacht, seht ihr die Liste aller von eurer FRITZ!Box erkannten Netzwerkteilnehmer. In meinem Beispiel nennen wir die zwei PCs <code>arbeitspferd</code> und <code>daddelkiste</code>.</li>\n<li>Merkt euch die Namen der Netzwerkteilnehmer, die beim Einschalten eure Heizung einschalten sollen. Unter „Entwicklerwerkzeuge &gt; Zustände“ findet ihr dazu den passenden Zustand, der mit <code>device_tracker</code> beginnt. In meinem Beispiel gehen wir von zwei PC-Trackern aus, <code>device_tracker.arbeitspferd</code> und <code>device_tracker.daddelkiste</code>.</li>\n<li>Mit dem <a href=\"https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863\">Home Assistant Community Add-on: Visual Studio Code</a> kann die <code>configuration.yaml</code> nun so erweitert werden, dass die beiden Tracker (oder beliebig viele Tracker) zu einem Sammel-Tracker zusammengefasst werden.</li>\n</ol>\n<pre><code class=\"language-yaml\">- <i>name</i>: <kbd>&quot;Home-Office PCs&quot;</kbd>\n  <i>unique_id</i>: device_tracker_homeoffice\n  <i>state</i>: <kbd>&quot;{{ is_state('device_tracker.arbeitspferd', 'home') or is_state('device_tracker.daddelkiste', 'home') }}&quot;</kbd>\n  <i>icon</i>: <kbd>&quot;mdi:lan-connect&quot;</kbd>\n  <i>device_class</i>: presence\n</code></pre>\n<p>Nach einmaligem Neustart sollte unter „Entwicklerwerkzeuge &gt; Zustände“ der neue Tracker sichtbar sein. Er heißt dann wahrscheinlich <code>binary_sensor.device_tracker_homeoffice</code>.</p>\n<p>Unser neuer kleiner Device-Tracker „Home-Office PCs“ kann nun zum Beispiel auf dem Dashboard verbaut werden. Sobald eines der Geräte eingeschaltet wird, wird auch der Tracker eingeschaltet – beim Ausschalten gibt es knapp zwei Minuten Verzögerung, bis der Home Assistant das Gerät wirklich als offline annimmt.</p>\n<h3 id=\"teil-2-heizung-steuern\">Teil 2: Heizung steuern</h3>\n<p>Der Home Assistant kann nun die Programmierung der FRITZ!Box verbessern. Dafür wird in der FRITZ!Box die Heizung zu 100% in den Spar-Modus geschickt, weil ab sofort der Home Assistant die Heizung zwischen Spar- und Komfort-Modus hin- und herschaltet. Die Verbindung ist dabei einfach:</p>\n<ol>\n<li>Wenn auch nur einer der PCs an ist, soll die Heizung im Komfort-Modus sein.</li>\n<li>Wenn keiner der PCs an ist, soll die Heizung im Spar-Modus sein.</li>\n</ol>\n<p>Unter „Einstellungen &gt; Automatisierungen &amp; Szenen“ fügen wir dazu ein einfaches Rezept hinzu:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `office` with your thermostat's identifier</u>\n<u># `device_id` has to be assigned via GUI</u>\n<i>alias</i>: <kbd>&quot;Office: Someone is there&quot;</kbd>\n<i>description</i>: <kbd>&quot;Be nice, and turn on the heating if someone is using a PC in the office&quot;</kbd>\n<i>trigger</i>:\n  - <i>platform</i>: state\n    <i>entity_id</i>:\n      - binary_sensor.device_tracker_homeoffice\n    <i>from</i>: <kbd>&quot;on&quot;</kbd>\n  - <i>platform</i>: state\n    <i>entity_id</i>:\n      - binary_sensor.device_tracker_homeoffice\n    <i>to</i>: <kbd>&quot;on&quot;</kbd>\n<i>action</i>:\n  - <i>if</i>:\n      - <i>condition</i>: state\n        <i>entity_id</i>: binary_sensor.device_tracker_homeoffice\n        <i>state</i>: <kbd>&quot;on&quot;</kbd>\n    <i>then</i>:\n      - <i>device_id</i>: b46c4851235fb8c90f4a659b6e9a953d\n        <i>domain</i>: climate\n        <i>entity_id</i>: climate.office\n        <i>type</i>: set_preset_mode\n        <i>preset_mode</i>: comfort\n    <i>else</i>:\n      - <i>device_id</i>: b46c4851235fb8c90f4a659b6e9a953d\n        <i>domain</i>: climate\n        <i>entity_id</i>: climate.office\n        <i>type</i>: set_preset_mode\n        <i>preset_mode</i>: eco\n<i>mode</i>: single\n</code></pre>\n<p>Erst mit der Zusammenfassung der beiden Zustände zu einem Tracker ist es sauber möglich, zwischen Spar- und Komfort-Modus hin- und herzuschalten. Wenn wir die Tracker trennen würden könnte es ansonsten passieren, dass das Ausschalten eines Rechners die Heizung deaktiviert, obwohl der andere Rechner eigentlich noch läuft.</p>\n<h2 id=\"wie-es-laufen-könnte\">Wie es laufen könnte</h2>\n<p>Tatsächlich kann man diese Idee auch auf andere Geräte ausdehnen, wie zum Beispiel Fernseher und Spielekonsolen, die ebenfalls im Internet hängen. Eine kleine Automatisierung könnte also abends die Heizung noch etwas länger an lassen, solange der Fernseher läuft.</p>\n<p>Oder wie wäre es mit einem Sammel-Tracker, der die Smartphones aller Haushaltsteilnehmer als Schalter verwendet?</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Pragmatische%20Heizungssteuerung%20im%20Home-Office&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-02-14-pragmatische-heizungssteuerung-home-office%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-02-14-pragmatische-heizungssteuerung-home-office/",
        "pubDate": "Tue, 14 Feb 2023 19:04:06 +0100",
        "atom_published": "2023-02-14T19:04:06+01:00",
        "atom_updated": "2023-02-21T10:37:45+01:00",
        "guid": "user/posts/2023-02-14-pragmatische-heizungssteuerung-home-office/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Home Assistant",
          "Programmierung",
          "Technologie",
          "The Cool",
          "AVM",
          "Homeoffice"
        ]
      },
      {
        "title": "Remote-Zugriff auf den Home Assistant – mit der AVM FRITZ!Box",
        "description": "<p><img src=\"https://journal.3960.org/posts/2023-01-01-fritz-box-home-assistant-remote/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Der <a href=\"https://www.home-assistant.io/\">Home Assistant</a> hat gegenüber vielen anderen Smart-Home-Lösungen einen Vorteil: Er benötigt keinen Internet-Dienst, um zu funktionieren. Damit ist er von vorne herein sehr sicher, da initial keine Daten aus eurem Smart-Home ins Internet entweichen.</p>\n<p>Einen kleinen Nachteil hat diese Konstruktion aber: Euer Home Assistant lässt sich nicht außerhalb eures Heimnetzwerks steuern. Oder?</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2023-01-01-fritz-box-home-assistant-remote/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Der <a href=\"https://www.home-assistant.io/\">Home Assistant</a> hat gegenüber vielen anderen Smart-Home-Lösungen einen Vorteil: Er benötigt keinen Internet-Dienst, um zu funktionieren. Damit ist er von vorne herein sehr sicher, da initial keine Daten aus eurem Smart-Home ins Internet entweichen.</p>\n<p>Einen kleinen Nachteil hat diese Konstruktion aber: Euer Home Assistant lässt sich nicht außerhalb eures Heimnetzwerks steuern. Oder?</p>\n<!-- more -->\n<p id=\"more\">Natürlich stimmt das nicht: Direkt im Home Assistant wird Werbung für die <a href=\"https://www.home-assistant.io/cloud/\">Home Assistant Cloud</a> gemacht. Mit diesem kleinen Dienst kann eure vormals nicht im Internet erreichbare Lösung auch außerhalb eures Heimnnetzwerks angesprochen werden. Neben der Tatsache, dass ihr damit ein Sicherheitsfeature eures Home Assistants über Bord geworfen habt, kostet dieser Dienst aber auch Geld.</p>\n<h2 id=\"fritzbox-und-vpn\">FRITZ!Box und VPN</h2>\n<p>Tatsächlich ist der entscheidende Satz, dass euer Home Assistant nur aus eurem Heimnetzwerk zugreifbar ist… beziehungsweise, wenn ihr Zugriff auf euer Heimnetzwerk habt. Wenn ihr also mittels eine Virtual Private Networks auch außerhalb eurer WLAN-Reichweite euch in euer Heimnnetz einwählen könnt, könnt ihr natürlich auch auf euren Home Assistant zugreifen.</p>\n<p>Das schöne an dieser Lösung: Der Zugang zu eurem System ist somit nur durch eine VPN-Verbindung möglich; die Daten eures Systems wie auch der Zugang zum Home Assistant sind nicht direkt im Internet verfügbar.</p>\n<p>Die AVM FRITZ!Box bietet netterweise einen eingebauten VPN-Dienst, der euch mit beliebigen Betriebssystemen für PCs, Laptops und Smartphones eine VPN-Verbindung erlaubt. Die Einrichtung ist nicht schwierig, aber voller Fallstricke. </p>\n<p>Richtet also auf eurer <a href=\"https://avm.de/service/vpn/\">AVM FRITZ!Box einen VPN-Zugang</a> ein, aber mit einer <em>wichtigen</em> Änderung: Wenn euer Home Assistant bereits mit der FRITZ!Box eingerichtet wurde, solltet ihr keinesfalls (wie von AVM vorgeschlagen) eure FRITZ!Box (und damit alle anderen Netzwerkteilnehmer) mit neuen IPs versehen. Denn der Home Assistant merkt sich für so ziemlich jedes Gerät explizit die IP, und eine Änderung ist ein größerer Schmerz. Tatsächlich könnt ihr die IP eurer FRITZ!Box so belassen – und verliert nur die Möglichkeit, über einen Router mit der selben IP das VPN zu benutzen. Tatsächlich erhaltet ihr aber bei einer Mobilverbindung immer eine IP außerhalb des Heimbereichs, könnt also problemlos das VPN nutzen.</p>\n<p>An eurem Home Assistant muss keine weitere Änderung vorgenommen werden. Sobald ihr die VPN-Verbindung aufgebaut habt, könnt ihr sowohl im Browser als auch über die App den Home Assistant benutzen, als ob ihr im Heimnetzwerk wärt.</p>\n<p>Interessanterweise kann eure Home Assistant App (zumindest unter Android) auch außerhalb des Heimnetzwerks Benachrichtigungen eures Home Assistants empfangen. Das liegt daran, dass der Home Assistant mit dem Übertragen der Benachrichtigungen einen Android-Dienst außerhalb eures Netzwerks beauftragt, der euch die Nachrichten über das Internet zustellt.</p>\n<h2 id=\"also-kurz-gefasst\">Also kurz gefasst</h2>\n<ol>\n<li>Richtet ein VPN ein…</li>\n<li>…aber ändert um Gottes willen nicht die IP eures Heimnetzwerks, wenn ihr den Home Assistant bereits eingerichtet habt.</li>\n<li>Richtet den VPN-Zugang auf dem Gerät ein, von dem ihr von außerhalb des Heimnetzwerks auf den Home Assistant zugreifen wollt.</li>\n<li>Wenn ihr unterwegs seid, müsst ihr nur noch das VPN aktivieren, und könnt dann den Home Assistant benutzen, als ob ihr im Heimnetzwerk wärt.</li>\n</ol><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Remote-Zugriff%20auf%20den%20Home%20Assistant%20%E2%80%93%20mit%20der%20AVM%20FRITZ!Box&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2023-01-01-fritz-box-home-assistant-remote%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2023-01-01-fritz-box-home-assistant-remote/",
        "pubDate": "Sun, 01 Jan 2023 18:17:24 +0100",
        "atom_published": "2023-01-01T18:17:24+01:00",
        "atom_updated": "2023-01-01T18:17:24+01:00",
        "guid": "user/posts/2023-01-01-fritz-box-home-assistant-remote/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Programmierung",
          "Technologie",
          "The Cool",
          "AVM",
          "Home Assistant"
        ]
      },
      {
        "title": "FRITZ!DECT 301 im Home Assistant",
        "description": "<p><img src=\"https://journal.3960.org/posts/2022-11-08-fritz-dect-301-home-assistant/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Heizungssteuerung ist in aller Munde. Als Besitzer einer FRITZ!Box habe ich mir also ein paar <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301 Thermostate</a> der Firma AVM zugelegt, um meine Heizung sparsamer zu machen.</p>\n<p>Und dann bin ich dummerweise auf <a href=\"https://www.home-assistant.io/\">Home Assistant</a> aufmerksam gemacht worden, mit dem man die etwas spartanischen Möglichkeiten der Thermostate gewaltig aufbohren kann.</p>\n<p>Begleitet mich auf meiner Reise in den Kaninchenbau.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2022-11-08-fritz-dect-301-home-assistant/ha-301-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Heizungssteuerung ist in aller Munde. Als Besitzer einer FRITZ!Box habe ich mir also ein paar <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301 Thermostate</a> der Firma AVM zugelegt, um meine Heizung sparsamer zu machen.</p>\n<p>Und dann bin ich dummerweise auf <a href=\"https://www.home-assistant.io/\">Home Assistant</a> aufmerksam gemacht worden, mit dem man die etwas spartanischen Möglichkeiten der Thermostate gewaltig aufbohren kann.</p>\n<p>Begleitet mich auf meiner Reise in den Kaninchenbau.</p>\n<!-- more -->\n<h2 id=\"more\">FRITZ!DECT verstehen</h2>\n<p>Bei der Steuerung der Thermostate ist wichtig zu wissen, dass der Home Assistant (wie auch die FRITZ!Box selber) nur in festen Intervallen Aufträge an die Thermostate übertragen kann. Im schlimmsten Fall dauert es bis zu 15 Minuten, bis euer Auftrag dort angekommen ist. Wenn ihr also Automatisierungen oder eine Steuerung bastelt, müsst ihr etwas Vorlauf in Kauf nehmen.</p>\n<p>Meine Philosophie bei der Integration des Home Assistant war wie folgt:</p>\n<ol>\n<li>Die Zeitpläne der Thermostate werden primär über die FRITZ!Box gesteuert. Diese Zeitpläne werden punktgenau vom Thermostat ausgeführt.</li>\n<li>Der Home Assistant verbessert diese Zeitpläne um Ausnahmen oder zusätzliche Szenarien. In jedem Szenario müsst ihr aber (neben dem oben erwähnten Vorlauf) bedenken, dass der nächste in der FRITZ!Box hinterlegte Schaltpunkt wieder den Thermostat zurücksetzen wird. Das kann aber auch sehr praktisch sein, zum Beispiel als verlässlicher Reset. Beispiele dafür sind Szenarien wie „Heute ist länger Betrieb im Wohnzimmer“ oder „An Arbeitstagen kann die Heizung in der Küche früher starten“.</li>\n<li>Bei anderen Einsatzideen kann die Koordination zwischen FRITZ!Box und Home Assistant zu kompliziert werden. Hier löscht man einfach die Zeitpläne in der FRITZ!Box und steuert nur noch über den Home Assistant. Beispiel dafür ist die Heizung im Büro, die nur an Arbeitstagen geschaltet werden soll – oder wenn ich außerhalb der Arbeitszeiten meinen Rechner eingeschaltet habe. Hier können aber zumindest die Vorlagen in der FRITZ!Box helfen, die man aus dem Home Assistant dann triggern kann.</li>\n</ol>\n<h2 id=\"regler-verbessern\">Regler verbessern</h2>\n<p>Nach der Installation wird man von den etwas überzüchteten Heizkörperreglern in der Oberfläche des Home Assistant begrüßt. Meine Regler sollen nur aus drei Teilen bestehen:</p>\n<ol>\n<li>Dem eigentlich Temperatur-Regler (verbunden mit der Anzeige des aktuellen Modus und der aktuell gemessenen Temperatur),</li>\n<li>einem Knopf für den Spar-Modus,</li>\n<li>und einem Knopf für den Komfort-Modus.</li>\n</ol>\n<p>Das ist tatsächlich schön konfigurativ zu lösen…</p>\n<p><img src=\"https://journal.3960.org/posts/2022-11-08-fritz-dect-301-home-assistant/ha-301-config-400x225.png\" class=\"default\" width=\"400\" height=\"225\" style=\"--aspect-ratio: 16/9;\" alt=\"\" /></p>\n<p>…oder mit dem folgendem YAML als schnelles Rezept für das <strong>Dashboard</strong>:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `wohnzimmer` with your thermostat's identifier</u>\n<i>type</i>: thermostat\n<i>features</i>:\n  - <i>style</i>: icons\n    <i>preset_modes</i>:\n      - eco\n      - comfort\n    <i>type</i>: climate-preset-modes\n<i>entity</i>: climate.wohnzimmer\n</code></pre>\n<p>(<strong>Update 2024–02</strong>: Die neuen Konfigurationsmöglichkeiten des Home Assistant haben den Einbau weiterer Knöpfe deutlich vereinfacht.)</p>\n<h2 id=\"temperatur-am-thermostat-anzeigen\">Temperatur am Thermostat anzeigen</h2>\n<p>Durch den <a href=\"https://www.home-assistant.io/\">Home Assistant</a> werden die <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301 Thermostate</a> folgerichtig als Thermostate erkannt. Tatsächlich beinhalten sie aber auch einen Temperatur-Sensor, den man mit etwas Bastelei auch im Dashboard anzeigen kann.</p>\n<p>Mit dem <a href=\"https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863\">Home Assistant Community Add-on: Visual Studio Code</a> kann die <code>configuration.yaml</code> um die folgenden Zeilen erweitern werden:</p>\n<pre><code class=\"language-yaml\"><u># Converting thermostats into thermometers</u>\n<u># Replace all occurences of `wohnzimmer` with your thermostat's identifier</u>\n<i>template</i>:\n  - <i>sensor</i>:\n      - <i>name</i>: <kbd>&quot;Wohnzimmer Heizung Temperatur&quot;</kbd>\n        <i>unique_id</i>: wohnzimmer_heizung_temperatur\n        <i>state</i>: <kbd>&quot;{{ state_attr('climate.wohnzimmer', 'current_temperature') }}&quot;</kbd>\n        <i>unit_of_measurement</i>: <kbd>&quot;°C&quot;</kbd>\n        <i>device_class</i>: temperature\n</code></pre>\n<p>Danach können diese Sensoren im <strong>Dashboard</strong> angezeigt werden:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `wohnzimmer` with your thermostat's identifier</u>\n<i>type</i>: gauge\n<i>entity</i>: sensor.wohnzimmer_heizung_temperatur\n<i>min</i>: <em>10</em>\n<i>max</i>: <em>32</em>\n<i>severity</i>:\n  <i>green</i>: <em>21</em>\n  <i>yellow</i>: <em>23</em>\n  <i>red</i>: <em>25</em>\n</code></pre>\n<h2 id=\"urlaubsmodus-sichtbar-machen\">Urlaubsmodus sichtbar machen</h2>\n<p>Die <a href=\"https://avm.de/produkte/fritzdect/fritzdect-301/\">FRITZ!DECT 301 Thermostate</a> können in einen Urlaubsmodus geschickt werden – ein Zustand, der im Home Assistant ebenfalls ausgelesen werden kann. Besonders luxuriös geschieht das mit einem eigenen Binär-Sensor.</p>\n<p>Mit dem <a href=\"https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863\">Home Assistant Community Add-on: Visual Studio Code</a> kann die <code>configuration.yaml</code> um die folgenden Zeilen erweitern werden:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `wohnzimmer` with your thermostat's identifier</u>\n<i>template</i>:\n  - <i>binary_sensor</i>:\n      - <i>name</i>: <kbd>&quot;Wohnzimmer Heizung Urlaubsmodus&quot;</kbd>\n        <i>unique_id</i>: wohnzimmer_heizung_urlaubsmodus\n        <i>state</i>: <kbd>&quot;{{ state_attr('climate.wohnzimmer', 'holiday_mode') }}&quot;</kbd>\n        <i>icon</i>: <kbd>&quot;mdi:bag-checked&quot;</kbd>\n</code></pre>\n<p>Analog lässt sich auch der Sommermodus der Heizung in der <code>configuration.yaml</code> als eigener Sensor einrichten:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `wohnzimmer` with your thermostat's identifier</u>\n<i>template</i>:\n  - <i>binary_sensor</i>:\n      - <i>name</i>: <kbd>&quot;Wohnzimmer Heizung Sommermodus&quot;</kbd>\n        <i>unique_id</i>: wohnzimmer_heizung_sommermodus\n        <i>state</i>: <kbd>&quot;{{ state_attr('climate.wohnzimmer', 'summer_mode') }}&quot;</kbd>\n        <i>icon</i>: <kbd>&quot;mdi:hvac-off&quot;</kbd>\n</code></pre>\n<h2 id=\"regelung-für-das-home-office\">Regelung für das Home Office</h2>\n<p>In der FRITZ!Box hatte ich die Steuerung meiner Büro-Heizung bisher stumpf an die Wochentage Montags bis Freitag gekoppelt. So lief die Heizung auch, wenn ein Feiertag das eigentlich unnötig machte. Höchste Zeit also für den <a href=\"https://www.home-assistant.io/integrations/workday/\">Arbeitstag-Sensor</a>.</p>\n<p>Mit dem <a href=\"https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863\">Home Assistant Community Add-on: Visual Studio Code</a> kann die <code>configuration.yaml</code> um die folgenden Zeilen erweitern werden:</p>\n<pre><code class=\"language-yaml\"><u># Workday sensor</u>\n<i>binary_sensor</i>:\n  - <i>platform</i>: workday\n    <i>country</i>: DE\n    <i>province</i>: NI <u># Niedersachsen, Lower Saxony</u>\n</code></pre>\n<p>Der Home Assistant kann nun die Programmierung der FRITZ!Box verbessern. Dafür wird in der FRITZ!Box die Heizung zu 100% in den Spar-Modus geschickt, weil ab sofort der Home Assistant die Heizung auf den Komfort-Modus schaltet, wenn ein Arbeitstag vorliegt.</p>\n<p>Vorher legen wir uns einen Zeitplan an, den wir in folgende <strong>Automatisierung</strong> einbinden:</p>\n<pre><code class=\"language-yaml\"><u># Replace all occurences of `office` with your thermostat's identifier</u>\n<u># `device_id` has to be assigned via GUI</u>\n<i>alias</i>: <kbd>&quot;Home Office&quot;</kbd>\n<i>description</i>: Only trigger comfort mode on work days\n<i>trigger</i>:\n  - <i>platform</i>: state\n    <i>entity_id</i>:\n      - binary_sensor.office_heizung_home_office\n<i>condition</i>:\n  - <i>condition</i>: and\n    <i>conditions</i>:\n      - <i>condition</i>: state\n        <i>entity_id</i>: binary_sensor.workday_sensor\n        <i>state</i>: <kbd>&quot;on&quot;</kbd>\n      - <i>condition</i>: state\n        <i>entity_id</i>: binary_sensor.office_heizung_urlaubsmodus\n        <i>state</i>: <kbd>&quot;off&quot;</kbd>\n<i>action</i>:\n  - <i>if</i>:\n      - <i>condition</i>: state\n        <i>state</i>: <kbd>&quot;on&quot;</kbd>\n        <i>entity_id</i>: binary_sensor.office_heizung_home_office\n    <i>then</i>:\n      - <i>device_id</i>: b46c4851235fb8c90f4a659b6e9a953a\n        <i>domain</i>: climate\n        <i>entity_id</i>: climate.office\n        <i>type</i>: set_preset_mode\n        <i>preset_mode</i>: comfort\n    <i>else</i>:\n      - <i>device_id</i>: b46c4851235fb8c90f4a659b6e9a953a\n        <i>domain</i>: climate\n        <i>entity_id</i>: climate.office\n        <i>type</i>: set_preset_mode\n        <i>preset_mode</i>: eco\n    <i>enabled</i>: <samp>true</samp>\n<i>mode</i>: single\n</code></pre>\n<p>Hier können aber auch die Vorlagen in der FRITZ!Box hilfreich sein, um aus dem Home Assistant in der FRITZ!Box komplexere Szenarien auslösen zu können.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=FRITZ!DECT%20301%20im%20Home%20Assistant&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2022-11-08-fritz-dect-301-home-assistant%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2022-11-08-fritz-dect-301-home-assistant/",
        "pubDate": "Tue, 08 Nov 2022 18:17:23 +0100",
        "atom_published": "2022-11-08T18:17:23+01:00",
        "atom_updated": "2024-01-05T12:46:57+01:00",
        "guid": "user/posts/2022-11-08-fritz-dect-301-home-assistant/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Home Assistant",
          "Programmierung",
          "Technologie",
          "The Cool",
          "AVM",
          "Homeoffice"
        ]
      },
      {
        "title": "Gnome-Erweiterungen für Ubuntu",
        "description": "<p>Die <a href=\"https://extensions.gnome.org/\">GNOME Shell-Erweiterungen</a> sind für Ubuntu (und andere Linux-Betriebssysteme) ein schöner Weg, um das eine oder andere Verhalten des Betriebssystems aufzubohren.</p>",
        "content_encoded": "<p>Die <a href=\"https://extensions.gnome.org/\">GNOME Shell-Erweiterungen</a> sind für Ubuntu (und andere Linux-Betriebssysteme) ein schöner Weg, um das eine oder andere Verhalten des Betriebssystems aufzubohren.</p>\n<!-- more -->\n<p id=\"more\">Dazu muss „GNOME Shell Extensions“ und „GNOME Tweaks“ zuerst installiert werden:</p>\n<pre><code class=\"language-bash\"><b>sudo</b> add-apt-repository universe\n<b>sudo</b> apt install gnome-tweak-tool\n<b>sudo</b> apt install gnome-shell-extensions\n</code></pre>\n<p>Meine Lieblings-GNOME-Erweiterungen sind diese:</p>\n<dl>\n<dt><a href=\"https://extensions.gnome.org/extension/1160/dash-to-panel/\">Dash to Panel</a></dt><dd> Als alter Windows- / OSX-Nutzer habe ich meine Applikations- und System-Tray-Symbole gerne unten am Monitor angedockt.</dd>\n<dt><a href=\"https://extensions.gnome.org/extension/779/clipboard-indicator/\">Clipboard Indicator</a></dt><dd> Dieses kleine Helferlein erlaubt es, mehrere Einträge in der Zwischenablage zu haben.</dd>\n<dt><a href=\"https://extensions.gnome.org/extension/1462/panel-date-format/\">Panel Date Format</a></dt><dd> Das Datumsformat im System-Tray kann mit dieser Erweiterungen sehr genau angepasst werden.</dd>\n<dt><a href=\"https://extensions.gnome.org/extension/906/sound-output-device-chooser/\">Sound Input &amp; Output Device Chooser</a></dt><dd> Im Home-Office wechsele ich öfter zwischen Boxen und Kopfhörer. Mit dieser kleinen Erweiterungen kann ich schnell zwischen den Kanälen hin- und herschalten, ohne irgendwelche Kabel aus dem Rechner ziehen zu müssen.</dd>\n</dl><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Gnome-Erweiterungen%20f%C3%BCr%20Ubuntu&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2022-03-03-gnome-erweiterungen-fuer-ubuntu%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2022-03-03-gnome-erweiterungen-fuer-ubuntu/",
        "pubDate": "Thu, 03 Mar 2022 18:49:58 +0100",
        "atom_published": "2022-03-03T18:49:58+01:00",
        "atom_updated": "2022-03-03T18:49:58+01:00",
        "guid": "user/posts/2022-03-03-gnome-erweiterungen-fuer-ubuntu/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Technologie",
          "Webdevelop",
          "Linux"
        ]
      },
      {
        "title": "Flugnavigation mittels Rechenscheibe zum Selberbau",
        "description": "<p><a href=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet.jpg\" class=\"gallery__link\" title=\"Eine Rechenscheibe zur Berechnung von Distanzen und Geschwindigkeiten.\"><img src=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet-240x240.jpg\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"Eine Rechenscheibe zur Berechnung von Distanzen und Geschwindigkeiten.\" /></a> Da ich mich in letzter Zeit verstärkt mit der <a href=\"https://journal.3960.org/posts/2021-01-31-einsteiger-tutorial-fuer-il-2-sturmovik/\">Jagd-Fliegerei des Zweiten Weltkriegs</a> beschäftigt habe, musste ich mich wohl oder übel verstärkt mit Flug-Navigation ohne GPS oder sonstige technische Unterstützung auseinandersetzen. Dabei hilft es enorm, den Zusammenhang zwischen Fluggeschwindigkeit und zurückgelegter Strecke zu kennen.</p>\n<p>Mittels eines Taschenrechners oder einer App sind solche Berechnungen trivial. Aber wie wäre es, diese Berechnungen <em>ohne</em> elektronische Hilfsmittel zu lösen? Zum Beispiel mit einer Rechenscheibe?</p>",
        "content_encoded": "<p><a href=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet.jpg\" class=\"gallery__link\" title=\"Eine Rechenscheibe zur Berechnung von Distanzen und Geschwindigkeiten.\"><img src=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet-240x240.jpg\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"Eine Rechenscheibe zur Berechnung von Distanzen und Geschwindigkeiten.\" /></a> Da ich mich in letzter Zeit verstärkt mit der <a href=\"https://journal.3960.org/posts/2021-01-31-einsteiger-tutorial-fuer-il-2-sturmovik/\">Jagd-Fliegerei des Zweiten Weltkriegs</a> beschäftigt habe, musste ich mich wohl oder übel verstärkt mit Flug-Navigation ohne GPS oder sonstige technische Unterstützung auseinandersetzen. Dabei hilft es enorm, den Zusammenhang zwischen Fluggeschwindigkeit und zurückgelegter Strecke zu kennen.</p>\n<p>Mittels eines Taschenrechners oder einer App sind solche Berechnungen trivial. Aber wie wäre es, diese Berechnungen <em>ohne</em> elektronische Hilfsmittel zu lösen? Zum Beispiel mit einer Rechenscheibe?</p>\n<!-- more -->\n<h2 id=\"more\">Berechnungen</h2>\n<p>Schon in meinen Ausführungen zum <a href=\"https://journal.3960.org/posts/2019-09-22-vfr-ohne-technischen-schnickschnack/\">Sichtflug ohne technischen Schnickschnack</a> war eine der entscheidenden Hilfen beim Navigieren ohne elektronische Hilfen (neben der Kenntnis des Geländes und der Ziel-Richtung) vor allen Dingen die Kenntnis der Zeit, die man für eine bestimmten Streckenabschnitt auf dem Flugplan benötigt. Dabei kann bei einer genauen Kenntnis der Streckenlänge und der eigenen Geschwindigkeit über dem Boden relativ exakt berechnet werden, zu welchem Zeitpunkt die Strecke zurückgelegt sein müsste.</p>\n<p>Die eigentlichen Rechnungen für die Navigation sind recht übersichtlich, solange man die Einheiten korrekt mitführt:</p>\n<ul>\n<li>Strecke ÷ Geschwindigkeit = Zeit, also zum Beispiel: 10 km ÷ 100 km/h = 0.1h, also 6 Minuten</li>\n<li>Strecke ÷ Zeit = Geschwindigkeit, also zum Beispiel: 100 km ÷ 0.5h = 200 km/h</li>\n<li>Geschwindigkeit × Zeit = Strecke, also zum Beispiel: 500 km/h × 0.25h = 125 km</li>\n</ul>\n<p>Dabei gibt es die folgenden Herausforderung beim Kopfrechnen:</p>\n<ol>\n<li>Die eigentliche Berechnung der resultierenden Brüche. </li>\n<li>Die korrekten Umformung von Einheiten (Kilometern, nautische Meilen, <i>statute miles</i>, Knoten, Stunden, Minuten)</li>\n</ol>\n<p>Die Einheiten umzurechnen ist wegen der nicht ganzzahligen Multiplikatoren teilweise etwas schwierig im Kopf zu vollziehen:</p>\n<div class=\"table-wrapper\"><table>\n<caption id=\"conversion-imperial-to-metric-units\">Conversion Imperial to Metric Units</caption>\n<colgroup>\n<col />\n<col />\n<col class=\"table-cell--right\" />\n</colgroup>\n<thead>\n<tr>\n<th>Imperial unit</th>\n<th>Symbol</th>\n<th style=\"text-align:right\">Metric unit</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>1 nautical mile</td>\n<td>1 NM</td>\n<td style=\"text-align:right\">1852m</td>\n</tr>\n<tr>\n<td>1 knot</td>\n<td>1 kn</td>\n<td style=\"text-align:right\">1.852 km/h</td>\n</tr>\n<tr>\n<td>1 statute mile</td>\n<td>1 mi</td>\n<td style=\"text-align:right\">1609.344m</td>\n</tr>\n<tr>\n<td>1 mile per hour</td>\n<td>1 mph</td>\n<td style=\"text-align:right\">1.609 km/h</td>\n</tr>\n</tbody></table></div>\n<p>…ganz zu schweigen von der Tatsache, dass eine Stunde aus sechzig Minuten besteht und damit eine Stundenangabe mit Nachkommastellen im Kopf schwierig in eine Angabe in Minuten umzurechnen ist.</p>\n<p>Die Komplikation, dass die gemessene Fluggeschwindigkeit (<i>air speed</i>) nicht zwangsläufig mit der Geschwindigkeit über dem Boden (<i>ground speed</i>) übereinstimmt, ignorieren wir vorerst – können aber bei Kenntnis der Windrichtung und -stärke dies ebenfalls näherungsweise per einfacher Arithmetik mit einbeziehen.</p>\n<p>Im Regelfall kann man sich mit einzelnen Faustformeln behelfen, die man vorher durchgerechnet haben sollte.</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"IL-2 Great Battles: Navigating in VR\" src=\"https://www.youtube-nocookie.com/embed/Ydlv6AD3oHo?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Ydlv6AD3oHo?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Ydlv6AD3oHo/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Ydlv6AD3oHo/hqdefault.jpg\" --></div>\n<p>Bei Variablen Strecken und Geschwindigkeiten wird es aber höchste Zeit, sich mit nicht-elektronischen Rechenhilfen auseinanderzusetzen: Rechenschiebern beziehungsweise Rechenscheiben.</p>\n<h2 id=\"rechenscheiben-für-divisionen-und-lineare-zusammenhänge\">Rechenscheiben für Divisionen und lineare Zusammenhänge</h2>\n<p><a href=\"https://de.wikipedia.org/wiki/Rechenscheibe\">Rechenscheiben</a> sind kompakte, runde Ausführung eines <a href=\"https://de.wikipedia.org/wiki/Rechenschieber\">Rechenschiebers</a>. Je nach Findigkeit ihres Konstrukteurs sind sie in der Lage, eine ganze Menge mathematische Operationen rein grafisch-mechanisch durchzuführen. Gerade lineare Zusammenhänge sind mit Hilfe <a href=\"https://de.wikipedia.org/wiki/Logarithmus\">logarithmischer Skalen</a> gut zu lösen. Dabei werden zwei logarithmische Skalen gegeneinander verschoben, das Ergebnis ist dann auf einer dritte Skala ablesbar.</p>\n<p>So bietet zum Beispiel der klassische <a href=\"https://en.wikipedia.org/wiki/E6B\">mechanische Navigationsrechner E6-B</a> eine ganze Reihe von Möglichkeiten, Umrechnungen zwischen verschiedenen Einheiten durchzuführen, die für die (Flug-)Navigation hilfreich sind. Ich persönlich wollte aber einen nicht ganz so komplexen Rechner. Stattdessen sollte er übersichtlicher sein, und gleichzeitig alle Grundbedürfnisse eines Jagdfliegers abbilden.</p>\n<p>Höchste Zeit also, das Grafikprogramm anzuwerfen und sich mit Logarithmen und Winkelberechnungen zu beschäftigen, um einen eigenen Navigations-Drehrechner zu entwerfen.</p>\n<h2 id=\"das-distanz-gerät-dg21\">Das Distanz-Gerät DG21</h2>\n<p>Ziel meiner Bemühungen war eine Navigations-Rechenscheibe, die man mit heimischen Hilfsmitteln herstellen konnte. Mein Navigationsrechner sollte folgendes beherrschen:</p>\n<ul>\n<li>Umrechnung von Knoten (kn), Meilen pro Stunde (mph) und Kilometern pro Stunde (km/h).</li>\n<li>Umrechnung von <a href=\"https://de.wikipedia.org/wiki/Seemeile\">nautischen Meilen</a> (NM), <i>Statute Miles</i> (mi) und Kilometern (km).</li>\n<li>Berechnung der zurückgelegten Strecke bei einer gegebenen Geschwindigkeit und Zeit.</li>\n<li>Berechnung der benötigten Zeit bei einer gegebenen Geschwindigkeit und Strecke.</li>\n<li>Berechnung der benötigten Geschwindigkeit bei einer gegebenen Zeit und Strecke.</li>\n</ul>\n<p>Die ungewöhnliche Ansammlung von verschiedenen Einheiten hat nicht zuletzt damit zu tun, dass je nach Kartenmaterial und Fluggerät sowohl imperiale als auch metrische Angaben wild miteinander kombiniert werden können. So hatten west-alliierte Jagdflugzeuge Angaben in Meilen pro Stunde, während Flugzeuge der Achsenmächte und der Sowjetunion stattdessen Kilometer pro Stunde verwendeten. Andersherum wird zum Beispiel in <i>IL-2 Great Battles</i> ein 10km-Kartenraster verwendet, während Streckenabschnitte in Meilen <em>oder</em> Kilometern angegeben werden können. Bei modernen Simulatoren wiederum werden Geschwindigkeiten in Knoten angegeben, während Strecken gerne in nautischen Meilen gemessen werden.</p>\n<p><a href=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet-detail.jpg\" class=\"gallery__link\" title=\"Eine Detail-Aufnahme des Distanz-Gerätes.\"><img src=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet-detail-400x225.jpg\" class=\"default\" width=\"400\" height=\"225\" style=\"--aspect-ratio: 16/9;\" alt=\"Eine Detail-Aufnahme des Distanz-Gerätes.\" /></a></p>\n<p>Nach einigen Papierprototypen habe ich mit dem <strong>Distanz-Gerät DG21</strong> eine für mich passable Lösung gefunden, kompakt und übersichtlich alle Anforderungen zu erfüllen. Das Distanz-Gerät besteht aus zwei gegeneinander verdrehbaren Scheiben. In einem Sichtfenster kann dabei die Geschwindigkeit eingestellt beziehungsweise ausgegeben werden, während zwei aufeinander treffende Ringskalen den Zusammenhang zwischen Strecke und Zeit abbilden.</p>\n<p>Die Funktionsweise ist dabei einfach:</p>\n<ol>\n<li>Auf dem äußersten Skalenring befindet sich die Angabe für Strecke (Dividend),</li>\n<li>auf der dagegen verdrehbaren Scheibe die Angabe der Zeit (Divisor),</li>\n<li>und auf als Resultat in einem Sichtfenster die Geschwindigkeit (Wert des Quotienten).</li>\n</ol>\n<p>Solange zwei der Werte bekannt sind, ergibt sich automatisch der dritte Wert. Darüber hinaus werden <em>alle</em> Zusammenhänge zwischen Strecke und Zeit grafisch angezeigt, ohne die Scheibe weiter manipulieren zu müssen.</p>\n<p>Die Umrechnungen für Strecke und Geschwindigkeit sind dabei als nebeneinanderliegende, fest miteinander verbundene Skalenringe ausgeführt.</p>\n<p>Dabei habe ich zwei Varianten gebaut, die hier zum Herunterladen, Ausdrucken und Zusammenbasteln bereitstehen:</p>\n<ol>\n<li>Das <strong><a href=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet_dg21a2.svg\" download>Distanz-Gerät DG21A2</a></strong> (Download als SVG-Datei, circa 300 KB) ist eine sehr kompakte Version, in der Version DG21A2.2 hat es auch eine präzise Skala für geringe Geschwindigkeiten. Diese Scheibe.</li>\n<li>Das <strong><a href=\"https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/distanz-geraet_dg21a3.svg\" download>Distanz-Gerät DG21A3</a></strong> (Download als SVG-Datei, circa 330 KB) bietet gegenüber dem DG21A2 zusätzlich die Umrechnung in Meter pro Sekunde (m/s), ist dafür aber etwas unübersichtlicher und hat auch keine Präzisionsskala für geringe Geschwindigkeiten.</li>\n</ol>\n<p>Beide Do-it-yourself-Navigationsrechner können mit einem Drucker auf Papier oder Pappe in der Größe DIN A4 ausgedruckt und mit einem scharfen Messer ausgeschnitten werden. Die beiden Scheiben werden mit einer Musterklammer verbunden, und können danach für die Berechnung gegeneinander verdreht werden.</p>\n<p>Die Rechner sind außerdem Open Source. Die SVG-Dateien können mit jedem beliebigen Vektor-Programm geöffnet und bearbeitet werden. Und da beide Dateien unter der „Creative Commons“-Lizenz stehen, ist das rechtlich auch ohne Probleme möglich.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Flugnavigation%20mittels%20Rechenscheibe%20zum%20Selberbau&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/",
        "pubDate": "Fri, 05 Mar 2021 19:20:29 +0100",
        "atom_published": "2021-03-05T19:20:29+01:00",
        "atom_updated": "2021-12-03T17:58:37+01:00",
        "guid": "user/posts/2021-03-05-flugnavigation-mittels-rechenscheibe-zum-selberbau/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Fliegerei",
          "Geografie",
          "Idee",
          "Simulation",
          "Aerofly FS2",
          "Technologie",
          "SVG"
        ]
      },
      {
        "title": "Wie Microsoft sich Augmented Reality in 2021 vorstellt",
        "description": "<p>Als Fortsetzung von <a href=\"https://journal.3960.org/posts/wie-fuhlt-sich-augmented-reality-an/\">Microsofts Überlegungen zu Augmented Reality</a>:</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"Introducing Microsoft Mesh\" src=\"https://www.youtube-nocookie.com/embed/Jd2GK0qDtRg?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Jd2GK0qDtRg?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Jd2GK0qDtRg/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Jd2GK0qDtRg/hqdefault.jpg\" --></div>\n<p>Auch wenn es nicht im Fokus des Videos steht: Interessant ist die Verknüpfung von Headsets für Augmented-Reality (z.B. die <a href=\"https://www.microsoft.com/de-de/hololens\"><i>Microsoft HoloLens</i></a>) und Virtual-Reality zu einer gemeinsamen Umgebung.</p>",
        "content_encoded": "<p>Als Fortsetzung von <a href=\"https://journal.3960.org/posts/wie-fuhlt-sich-augmented-reality-an/\">Microsofts Überlegungen zu Augmented Reality</a>:</p>\n<div class=\"video-player video-player--youtube\"><iframe allowfullscreen=\"allowfullscreen\" title=\"Introducing Microsoft Mesh\" src=\"https://www.youtube-nocookie.com/embed/Jd2GK0qDtRg?enablejsapi=1\" srcdoc=\"&lt;style&gt;*{padding:0;margin:0;overflow:hidden}html,body{height:100%}img,span{position:absolute;width:100%;top:0;bottom:0;margin:auto}span{height:1.5em;text-align:center;font:48px/1.5 sans-serif;color:white;text-shadow:0 0 0.5em black}&lt;/style&gt;&lt;a href=&quot;https://www.youtube.com/embed/Jd2GK0qDtRg?autoplay=1&quot;&gt;&lt;img src=&quot;https://img.youtube.com/vi/Jd2GK0qDtRg/hqdefault.jpg&quot; alt=&quot;&quot;&gt;&lt;span&gt;▶&lt;/span&gt;&lt;/a&gt;\"></iframe><!-- img src=\"https://img.youtube.com/vi/Jd2GK0qDtRg/hqdefault.jpg\" --></div>\n<p>Auch wenn es nicht im Fokus des Videos steht: Interessant ist die Verknüpfung von Headsets für Augmented-Reality (z.B. die <a href=\"https://www.microsoft.com/de-de/hololens\"><i>Microsoft HoloLens</i></a>) und Virtual-Reality zu einer gemeinsamen Umgebung.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Wie%20Microsoft%20sich%20Augmented%20Reality%20in%202021%20vorstellt&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2021-03-04-wie-microsoft-sich-augmented-reality-vorstellt%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2021-03-04-wie-microsoft-sich-augmented-reality-vorstellt/",
        "pubDate": "Thu, 04 Mar 2021 18:56:34 +0100",
        "atom_published": "2021-03-04T18:56:34+01:00",
        "atom_updated": "2021-03-17T17:38:48+01:00",
        "guid": "user/posts/2021-03-04-wie-microsoft-sich-augmented-reality-vorstellt/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Virtual Reality",
          "Technologie",
          "The Cool",
          "Geckobar"
        ]
      },
      {
        "title": "Die Ausstattung für das Home-Office",
        "description": "<p><img src=\"https://journal.3960.org/posts/2020-05-17-ausstattung-fuer-home-office/homeoffice-400x225.jpg\" class=\"default\" width=\"400\" height=\"225\" style=\"--aspect-ratio: 16/9;\" alt=\"\" /></p>\n<p>Mit wenigen Handgriffen kann man den häuslichen Arbeitsplatzes (aka „Home Office“) deutlich angenehmer und produktiver gestalten.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2020-05-17-ausstattung-fuer-home-office/homeoffice-400x225.jpg\" class=\"default\" width=\"400\" height=\"225\" style=\"--aspect-ratio: 16/9;\" alt=\"\" /></p>\n<p>Mit wenigen Handgriffen kann man den häuslichen Arbeitsplatzes (aka „Home Office“) deutlich angenehmer und produktiver gestalten.</p>\n<!-- more -->\n<p id=\"more\">In der Regel erhält man von seinem Arbeitgeber einen Laptop nebst Netzteil ausgehändigt – für ein echtes Büro braucht es aber dann doch etwas mehr als einen Tisch, einen Stuhl und eine Lampe. </p>\n<p>Inspiriert von den <a href=\"https://m.signalvnoise.com/remote-working-the-home-office-desks-of-basecamp/\">Home-Offices von <i>Basecamp</i>-Mitarbeitern</a> folgt hier eine Liste der Dinge, mit der der heimische Arbeitsplatz deutlich angenehmer werden kann.</p>\n<p>Grundsätzlich muss das Home-Office folgende Eigenschaften erfüllen:</p>\n<ul>\n<li>Längeres Arbeiten muss mindestens genau so angenehm möglich sein wie in einem regulären Büro.</li>\n<li>Um vom Home-Office ins normale Büro zu wechseln sollten möglichst wenig Handgriffe nötig sein.</li>\n</ul>\n<h2 id=\"ein-vernünftiger-schreibtischstuhl\">Ein <em>vernünftiger</em> Schreibtischstuhl</h2>\n<p>Home-Office-Arbeit ist sitzende Arbeit – mehr noch als normale Büro-Arbeit. Und so sollte für die 35–40 Stunden pro Woche der Arbeitsplatz so ergonomisch wie möglich eingerichtet werden. Dreh- und Angelpunkt ist ein vernünftiger Schreibtischstuhl.</p>\n<p>Ein Küchenstuhl oder billiger Schreibtischstuhl (ohne verstellbare Rücken- und Armlehnen) kann das Arbeiten aber schnell zur Tortur machen. Tatsächlich ist ein guter Schreibtischstuhl in der Regel eine nicht unerhebliche Investition – aber eine kleine dreistellige Summe ist hier langfristig betrachtet eine gute Investition in die eigene Rückengesundheit.</p>\n<h2 id=\"einen-echten-monitor-für-das-notebook\">Einen echten Monitor für das Notebook</h2>\n<p>Ein anständiger Monitor vergrößert nicht nur die Bildschirmfläche, sonder erlaubt ein ergonomischeres Sitzen bei der Arbeit. Monitore ab 23 Zoll aufwärts sind zu erschwinglichen Preisen zu haben. Wenn man sowieso einen heimischen PC besitzt, hat man möglicherweise auch bereits einen Kandidaten für den Zweitmonitor herumstehen. Denn an vielen Monitoren gibt es mehrere Monitor-Eingänge.</p>\n<p>So kann man heimischen PC und Arbeits-Laptop <em>gleichzeitig</em> anschließen, und am Monitor die gerade aktuelle Quelle auswählen – oder der Monitor ist sogar so schlau, auf die zuletzt aktive Quelle zu wechseln.</p>\n<h3 id=\"der-monitor-als-docking-station\">Der Monitor als Docking-Station</h3>\n<p>Falls ihr dagegen einen neuen Monitor anschaffen müsst, lohnt eine kurze Überprüfung, ob euer Laptop nicht DisplayPort via USB-C beherrscht. In diesem Falle kann ein USB-C-Monitor angeschafft werden. Im günstigsten Fall hat der Monitor einen USB-Hub integriert, der gleichzeitig als einfache Docking-Station fungiert – weiteres Zubehör für euren Laptop wird nicht an dem Laptop selber eingestöpselt, sondern am Monitor!</p>\n<h2 id=\"eine-anständige-tastatur--maus\">Eine anständige Tastatur &amp; Maus</h2>\n<p>Die meisten Laptop-Tastaturen und ihre eingebauten Trackpads eignen sich nur bedingt für längere Tipp-Arbeiten. Schon preisgünstige Tastaturen (wie z.B. die Cherry Stream 3.0 ab ~€20,-) machen nicht nur das Tippen einfacher, sondern bieten auch Medienknöpfe, mit denen man z.B. laufende Musik schnell für ein Telefonat pausieren kann.</p>\n<p>Gleiches gilt für preisgünstige Mäuse (wie z.B. die Logitech M500 ab ~€20,-) – zusätzliche Bedienmöglichkeiten wie ein Scrollrad oder die praktische „Zurück“-Taste erleichtern die Bildschirm-Arbeit ungemein.</p>\n<h3 id=\"kabellos-für-mehrere-rechner-gleichzeitig\">Kabellos für mehrere Rechner gleichzeitig</h3>\n<p>Wenn (wie in meinem Fall) noch ein zweiter Rechner auf dem Schreibtisch steht, kann man entweder mehrere Tastaturen und Mäuse anschaffen. Es gibt aber auch Funktastaturen und -mäuse (wie die <a href=\"https://www.logitech.com/de-de/mx/master-series.html\" rel=\"nomention\">Logitech MX-Serie</a>), die problemlos zwischen mehreren Empfängern hin- und herschalten können. Damit liegt nur eine Tastatur und eine Maus auf eurem Schreibtisch, die sich Heim- oder Arbeits-PC verbinden können.</p>\n<h2 id=\"ein-laptop-ständer\">Ein Laptop-Ständer</h2>\n<p>Selbst wenn der Laptop an einen Monitor angeschlossen ist, kann er trotzdem weiterhin als Zweit-Monitor dienen. Da mit angeschlossener Maus und Tastatur die Tastatur des Notebooks nicht mehr benötigt wird, kann das Notebook auch in eine ergonomischere Position gebracht werden.</p>\n<p>Dafür gibt es entweder einen Stapel Bücher – oder einen Laptop-Ständer (wie z.B. der Nulaxy C3 ab ~€35,-). Die meisten Laptop-Ständer erzeugen dabei unterhalb des Laptops einen Freiraum, in dem man zusätzliche Dinge ablegen kann – wie zum Beispiel Maus und Tastatur, wenn sie nicht mehr in Verwendung sind. Und ganz nebenbei verbessert die Luft unter dem Laptop die Belüftung bzw. Kühlung des Laptops.</p>\n<h2 id=\"kopfhörer-mit-mikrofon\">Kopfhörer mit Mikrofon</h2>\n<p>Für Telefonate und Videokonferenzen sind die in Notebook eingebauten Mikrofone meist nur ein Notbehelf. Interessanterweise ist bei so ziemlich jedem modernen Notebook der eingebaute 3,5mm-Klinkenstecker nicht nur für normale Kopfhörer geeignet, sondern vor allen Dingen für die von Smartphones bekannten Kombinationen aus Kopfhörern und Mikrofonen.</p>\n<p>Die Klinken an dem Kopfhörer unterscheiden sich darin, dass sie statt zwei schwarzer Ringe auf dem blanken Teil des Steckers <em>drei</em> Ringe haben. In das Notebook eingesteckt wird dann nicht nur die Audio-Ausgabe in die Kopfhörer gelenkt, sondern die Aufnahme über das Mikrofon des Kopfhörers abgewickelt.</p>\n<p>Ihr könnt also den bei eurem Smartphone mitgelieferten Kopfhörer mit 3,5mm-Klinke einfach in euer Notebook einstecke. Das kostet euch keinen Cent und ist zumeist eine überraschend leistungsfähige Lösung.</p>\n<p>Und falls ihr schon einen Bluetooth-Kopfhörer mit integrierten Mikrofon besitzt: Die meisten Notebooks haben ebenfalls Bluetooth eingebaut, so dass ihr diese Kopfhörer ebenfalls mit all ihren Features am Notebook nutzen könnt.</p>\n<h2 id=\"die-billige-docking-station---ein-usb-hub\">Die billige Docking-Station – ein USB-Hub</h2>\n<p>Wenn ihr mit eurem Notebook öfter zwischen Arbeitsplätzen wechselt, kann die Umstöpselei etwas nerven. Folgende Anschlüsse müssen dann imer wieder angedockt werden:</p>\n<ul>\n<li>Strom</li>\n<li>Monitor(e)</li>\n<li>Netzwerk (wenn nicht WLAN verwendet wird)</li>\n<li>Maus und Tastatur (wenn nicht Funk verwendet wird)</li>\n<li>Kopfhörer und Mikrofon (wenn nicht Bluetooth verwendet wird)</li>\n</ul>\n<p>Anstatt sich eine teure (und meist nur für den aktuellen Laptop geeignete) Docking-Station zuzulegen, kann ein USB-Hub (ab €10,-) schon Wunder wirken, um die Anzahl der benötigten Kabel zu reduzieren. Einen schon vorhandenen USB-Hub kann man übrigens preisgünstig zu einer Dockingstation aufrüsten, indem man folgende USB- beziehungsweise USB-C-Zubehörteile ansteckt:</p>\n<ul>\n<li>USB-Netzwerkadapter</li>\n<li>USB-Soundkarte (oder ein USB-Headset)</li>\n<li>USB-Bluetooth-Adapter (falls an dem angedockten Notebook nicht sowieso ein Bluetooth-Empfänger vorhanden ist)</li>\n</ul>\n<p>Falls euch der Sinn weniger nach Bastelei ist: Auch hier lohnt eine kurze Überprüfung, ob euer Laptop USB-C beherrscht. Schon preisgünstige USB-C-Hubs (ab ~€30,-) bieten nicht nur die Möglichkeit, weitere USB-Geräte anzuschließen, sondern auch Netzwerkkabel, Kopfhörer oder (<a href=\"https://www.heise.de/ct/artikel/USB-C-Der-Alleskoenner-3836662.html\">je nach USB-C-Anschluss</a>) Monitore.</p>\n<h3 id=\"eine-echte-dockingstation-für-maximal-wenig-stöpselei\">EIne echte Dockingstation für maximal wenig Stöpselei</h3>\n<p>Etwas teurer sind dann USB-C-Hubs mit Power Delivery, die euren Laptop mit Strom versorgen können. Hier müsst ihr aber überprüfen, ob euer Laptop auch <a href=\"https://www.heise.de/ct/artikel/USB-C-Der-Alleskoenner-3836662.html\">über den USB-C-Port geladen werden kann</a>, und wieviel Watt er für den Betrieb benötigt. In den meisten Fällen wird man um eine Original-Dockingstation nicht herum kommen, wenn die Stromversorgung gewährleistet sein soll.</p>\n<h2 id=\"fazit\">Fazit</h2>\n<p>Die Regelungen für die <a href=\"https://www.tk.de/techniker/magazin/sport/gesunder-ruecken/ruecken-fit-am-pc-2009246\" rel=\"nomention\">ergonomische Einrichtung von Arbeitsplätzen</a> sollten auch (oder gerade) daheim beherzigt werden. Mit ein paar kleinen Investitionen und Teilen, die man wahrscheinlich sowieso daheim herumliegen hat, ist das schnell bewerkstelligt.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Die%20Ausstattung%20f%C3%BCr%20das%20Home-Office&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-05-17-ausstattung-fuer-home-office%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2020-05-17-ausstattung-fuer-home-office/",
        "pubDate": "Sun, 17 May 2020 19:42:53 +0200",
        "atom_published": "2020-05-17T19:42:53+02:00",
        "atom_updated": "2021-10-12T09:41:03+02:00",
        "guid": "user/posts/2020-05-17-ausstattung-fuer-home-office/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Homeoffice",
          "Geckobar",
          "Idee",
          "Programmierung",
          "Technologie",
          "The Cool",
          "Webdevelop"
        ]
      },
      {
        "title": "Web Components mit Markdown verwenden",
        "description": "<p>Der Artikel <a href=\"https://web.dev/how-we-build-webdev-and-use-web-components/\">„How we build the site and use Web Components“</a> deutet im Nebensatz eine wunderbare Methode an, um in Content-Management-Systemen auf Markdown-Basis redaktionell <i>Web Components</i> zum Einsatz zu bringen.</p>",
        "content_encoded": "<p>Der Artikel <a href=\"https://web.dev/how-we-build-webdev-and-use-web-components/\">„How we build the site and use Web Components“</a> deutet im Nebensatz eine wunderbare Methode an, um in Content-Management-Systemen auf Markdown-Basis redaktionell <i>Web Components</i> zum Einsatz zu bringen.</p>\n<!-- more -->\n<p id=\"more\">Markdown hat eine oft gar nicht benötigte Eigenschaft: <a href=\"https://daringfireball.net/projects/markdown/syntax#html\">Inline-HTML</a>. In Markdown auftretendes HTML wird nach dem Umwandeln von Markdown in HTML vollkommen unverändert wieder ausgegeben. Also wird folgendes Markdown…</p>\n<pre><code class=\"language-markdown\">This <i>**Markdown example**</i> will <var>&lt;i&gt;</var>output HTML tags<var>&lt;/i&gt;</var> as well.\n</code></pre>\n<p>…zu folgendem HTML:</p>\n<pre><code class=\"language-html\">&lt;<i>p</i>&gt;This &lt;<i>strong</i>&gt;Markdown example&lt;/<i>strong</i>&gt; will &lt;<i>i</i>&gt;output HTML tags&lt;/<i>i</i>&gt; as well.&lt;/<i>p</i>&gt;\n</code></pre>\n<p>Wir erinnern uns: <a href=\"https://www.webcomponents.org/\" rel=\"nomention\">Web Components</a> sind durch JavaScript-Bibliotheken definierte HTML-Tags, die mit ihrem eigenen Verhalten und Layout versehen sind. So kann man Web Components wie HTML im Markdown verwenden, z.B. <a href=\"https://www.webcomponents.org/element/@lrnwebcomponents/word-count\" rel=\"nomention\"><code>word-count</code></a>:</p>\n<pre><code class=\"language-markdown\"><var>&lt;word-count&gt;</var>\n  Lorem ipsum <i>_dolor_</i> sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et <i>_dolore magna_</i> aliquyam erat, sed diam voluptua.\n<var>&lt;/word-count&gt;</var>\n</code></pre>\n<p>…wird damit zu…</p>\n<pre><code class=\"language-html\">&lt;<i>word-count</i>&gt;\n  &lt;<i>p</i>&gt;Lorem ipsum &lt;<i>em</i>&gt;dolor&lt;/<i>em</i>&gt; sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et &lt;<i>em</i>&gt;dolore magna&lt;/<i>em</i>&gt; aliquyam erat, sed diam voluptua.&lt;/<i>p</i>&gt;\n&lt;/<i>word-count</i>&gt;\n</code></pre>\n<p>…was wiederum im Browser dann den obigen Absatz mit einem kleinen Wort-Zähler dahinter anzeigt.</p>\n<p>Dieser Weg funktioniert unabhängig von der Art des eingesetzten Content Management Systems, solange das CMS redaktionelles Markdown verwendet. Für den Redakteur ist diese Lösung so einfach oder so kompliziert wie einen <a href=\"https://codex.wordpress.org/Shortcode\" rel=\"nomention\">Wordpress-Shortcode</a> einzusetzen.</p>\n<p>Dazu muss die zu verwendende Web-Component natürlich vorher geladen sein. Dies kann entweder im Template mit einem simplen <code>&lt;script&gt;</code>-Aufruf geschehen – oder (je nach Sicherheitseinstellung des CMS&#39;) auch <em>direkt</em> im Markdown des Artikels:</p>\n<pre><code class=\"language-html\">&lt;<i>script</i> <var>type</var>=&quot;<kbd>module</kbd>&quot; <var>src</var>=&quot;<kbd>https://unpkg.com/@lrnwebcomponents/word-count@2.6.5/word-count.js?module</kbd>&quot;&gt;&lt;/<i>script</i>&gt;\n</code></pre>\n<p>So oder so steht Redakteuren nun eine hinreichend bedienbare Methode zur Verfügung, in ihren Artikel Web Components zu verwenden. Alleine für diesen Zweck <a href=\"https://journal.3960.org/posts/2020-04-07-ideen-fuer-web-components/\">hatte ich schon ein paar Ideen, welche Web Components Redakteuren helfen könnten</a>:</p>\n<ul>\n<li><code>&lt;twitter-tweet&gt;</code> zum Einbetten von Tweets</li>\n<li><code>&lt;video-embed&gt;</code> zum Einbetten von Videos, zum Beispiel YouTube</li>\n<li><code>&lt;map-embed&gt;</code> zum Einbetten von Karten, wie z.B. Google Maps</li>\n<li><code>&lt;pull-quote&gt;</code> zum Anzeigen von aus dem Text herausgezogenen Zitaten</li>\n<li><code>&lt;linkbox-category&gt;</code> oder <code>&lt;linkbox-tag&gt;</code> zum Einbetten einer Linkbox, die verwandte Artikel anzeigt</li>\n<li><code>&lt;chess-board&gt;</code> oder <code>&lt;bar-chart&gt;</code> zum Darstellung von Spezialgrafiken wie einem Schachbrett oder Säulengrafiken (wir erinnern uns: <a href=\"https://journal.3960.org/posts/2020-04-05-svg-web-components/\">Web Components können auch SVG-Grafiken anzeigen</a>)</li>\n</ul>\n<p>Zu berücksichtigen wäre nur, dass einige ältere Browser Web Components nicht darstellen können. Das betrifft zum Beispiel auch einige RSS-Reader und E-Mail-Clients, so dass Artikel in diesem Umfeld nur eingeschränkt dargestellt werden. Das kann aber sogar erwünscht sein – denn dann wird das <em>innerhalb</em> des Web-Component-Tags verwendete Markdown bzw. HTML ausgegeben.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Web%20Components%20mit%20Markdown%20verwenden&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-04-10-web-components-mit-markdown-verwenden%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2020-04-10-web-components-mit-markdown-verwenden/",
        "pubDate": "Fri, 10 Apr 2020 19:32:33 +0200",
        "atom_published": "2020-04-10T19:32:33+02:00",
        "atom_updated": "2020-04-10T20:34:10+02:00",
        "guid": "user/posts/2020-04-10-web-components-mit-markdown-verwenden/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Webdevelop",
          "Web-Components",
          "Blog",
          "Javascript",
          "Programmierung",
          "Technologie"
        ]
      },
      {
        "title": "Ideen für Web Components",
        "description": "<p>Schlaue Beispiele gefällig, was man mit <a href=\"https://www.webcomponents.org/\" rel=\"nomention\">Web Components</a> alles bauen könnte, um HTML zu erweitern?</p>",
        "content_encoded": "<p>Schlaue Beispiele gefällig, was man mit <a href=\"https://www.webcomponents.org/\" rel=\"nomention\">Web Components</a> alles bauen könnte, um HTML zu erweitern?</p>\n<!-- more -->\n<p id=\"more\">Web Components eignen sich ganz hervorragend, um von der Darstellung und/oder Funktionalität her komplexe Aufgaben gekapselt und wiederverwendbar zu lösen. Zudem können Web Components (ähnlich wie <code>&lt;iframe&gt;</code>, <code>&lt;object&gt;</code> und viele andere neue Tags) in ihrem Inneren einen Fallback enthalten, so dass Browser ohne die Fähigkeit zur Darstellung von Web Components trotzdem etwas anzuzeigen haben. </p>\n<p>Außerdem können Web Components dieses Fallback <a href=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots\">gleichzeitig via <code>slot</code>-Mechanismus auswerten</a>, um die Fallback-Inhalte entweder wieder anzuzeigen, oder aber aus dem HTML noch weitere Informationen zu ziehen.</p>\n<figure class=\"blockquote\"><blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots\"><p>An unnamed <code>&lt;slot&gt;</code> will be filled with all of the custom element&#39;s top-level child nodes that do not have the slot attribute.</p></blockquote>\n<figcaption><a href=\"https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots\"><cite>Using templates and slots</cite> – MDN Web Docs</a></figcaption></figure>\n<p>Im Sinne des <i>progressive enhancement</i> könnte man also mit Web Components viele alltägliche Probleme lösen:</p>\n<h2 id=\"tweets\">Tweets</h2>\n<pre><code class=\"language-html\">&lt;<i>twitter-status</i> <var>status</var>=&quot;<kbd>https://twitter.com/Interior/status/463440424141459456</kbd>&quot;&gt;\n  &lt;<i>blockquote</i>&gt;Sunsets don&#39;t get much better than this one over @GrandTetonNPS. #nature #sunset&lt;/<i>blockquote</i>&gt;\n  &lt;<i>cite</i>&gt;US Department of the Interior&lt;/<i>cite</i>&gt;\n&lt;/<i>twitter-status</i>&gt;\n</code></pre>\n<p>Diese Komponente zieht datenschutzzkonform Tweets von Twitter – und als Fallback braucht sie gar keine weiteren Requests, da der Content bereits auf der Seite zu sehen ist. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p>\n<h2 id=\"datenschutzkonformer-videoplayer\">Datenschutzkonformer Videoplayer</h2>\n<pre><code class=\"language-html\">&lt;<i>video-embed</i> <var>url</var>=&quot;<kbd>https://www.youtube.com/embed/G2dGWH90aew?autoplay=1</kbd>&quot;&gt;\n  &lt;<i>a</i> <var>href</var>=&quot;<kbd>https://www.youtube.com/embed/G2dGWH90aew?autoplay=1</kbd>&quot;&gt;Youtube-Video&lt;/<i>a</i>&gt;\n&lt;/<i>video-embed</i>&gt;\n</code></pre>\n<p>Diese Komponente verwandelt mittels einfacher Magie den Link zu einem Video in eine Video-Einbettung. Redakteure werden es lieben, nicht mehr mit Embed-Codes herumzuhantieren, sondern einfach den Link zum Video aus der URL-Leiste ihres Browsers kopieren zu können – und trotzdem im fertigen Artikel ein eingebettetes Video zu sehen. (Ein Trick, den das <a href=\"https://github.com/fboes/blogophon/\" rel=\"nomention\">Blogophon</a> auch beherrscht.)</p>\n<p>Mit <a href=\"https://github.com/paulirish/lite-youtube-embed\" rel=\"nomention\"><code>lite-youtube</code></a> schon ähnlich umgesetzt: Mit dieser Komponente bekommt man eine deutlich datenschutzkonforme Darstellung eines eingebetteten Videos von YouTube, Viemo oder ähnlichem – ähnlich wie in diesem Blog YouTube-Videos in die Seite eingebettet werden.</p>\n<h2 id=\"code-beispiele\">Code-Beispiele</h2>\n<pre><code class=\"language-html\">&lt;<i>code-highlighted</i> <var>lang</var>=&quot;<kbd>javascript</kbd>&quot;&gt;\n  &lt;<i>pre</i>&gt;\n    &lt;<i>code</i>&gt;\n      …\n    &lt;/<i>code</i>&gt;\n  &lt;/<i>pre</i>&gt;\n&lt;/<i>code</i>&gt;\n</code></pre>\n<p>Mit dieser Komponente kann ich Code-Beispiel mit Syntax-Highlighting versehen. In dem <code>lang</code>-Attribut wird dabei die verwendete Programmiersprache vermerkt.</p>\n<h2 id=\"karten\">Karten</h2>\n<pre><code class=\"language-html\">&lt;<i>map-embed</i> <var>provider</var>=&quot;<kbd>google-maps</kbd>&quot; <var>coordinates</var>=&quot;<kbd>53.246, 10.412</kbd>&quot;&gt;\n  &lt;<i>a</i> <var>href</var>=&quot;<kbd>https://www.google.de/maps/place/53°14&#39;45.6<samp>&amp;quot;</samp>N+10°24&#39;43.2<samp>&amp;quot;</samp>E</kbd>&quot;&gt;Die wunderschöne Stadt Lüneburg&lt;/<i>a</i>&gt;\n&lt;/<i>map-embed</i>&gt;\n</code></pre>\n<p>Karten in redaktionellen Kontext sind immer wieder hilfreich, um Orte und ihre Umgebung darzustellen. Als Fallback kann immer noch ein Link zu einer Karten-Plattform angeboten werden.</p>\n<h3 id=\"geografische-eingabefelder\">Geografische Eingabefelder</h3>\n<pre><code class=\"language-html\">&lt;<i>input-coordinates</i> <var>provider</var>=&quot;<kbd>google-maps</kbd>&quot;&gt;\n  &lt;<i>input</i> <var>name</var>=&quot;<kbd>coordinates</kbd>&quot; <var>type</var>=&quot;<kbd>coordinates</kbd>&quot; <var>step</var>=&quot;<kbd>0.001</kbd>&quot; <var>value</var>=&quot;<kbd>53.246, 10.412</kbd>&quot; /&gt;\n&lt;/<i>input-coordinates</i>&gt;\n</code></pre>\n<p>Getreu meiner Idee, ein <a href=\"https://journal.3960.org/posts/2018-02-08-html-input-fuer-koordinaten/\">Eingabefeld für Geo-Koordinaten</a> in HTML anzubieten, könnte diese Komponente eine Geo-Lokalisierung und Kartendarstellung beinhalten, um den Nutzer die Auswahl eines Standorts zu erlauben.</p>\n<h2 id=\"rich-text-editor\">Rich-Text-Editor</h2>\n<pre><code class=\"language-html\">&lt;<i>textarea-special</i> <var>type</var>=&quot;<kbd>text/html</kbd>&quot;&gt;\n  &lt;<i>textarea</i> <var>name</var>=&quot;<kbd>html</kbd>&quot;&gt;\n    …\n  &lt;/<i>textarea</i>&gt;\n&lt;/<i>textarea-special</i>&gt;\n</code></pre>\n<p>Wie lange haben wir schon auf einen einfach im Browser funktionierenden Rich-Text-Editor gewartet. Die Komponente ist sogar so schlau, das generierte HTML wieder in das über ihm liegende Formular zurückzugeben.</p>\n<p>Theoretisch könnte sie ja aber auch ganz andere Dinge zur Bearbeitung anbieten. <code>text/markdown</code>? <code>text/csv</code>? <code>text/yaml</code>? Warum nicht? Das könnte man alles über das <code>type</code>-Attribut lösen.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Ideen%20f%C3%BCr%20Web%20Components&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-04-07-ideen-fuer-web-components%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2020-04-07-ideen-fuer-web-components/",
        "pubDate": "Tue, 07 Apr 2020 19:18:32 +0200",
        "atom_published": "2020-04-07T19:18:32+02:00",
        "atom_updated": "2021-08-30T10:16:09+02:00",
        "guid": "user/posts/2020-04-07-ideen-fuer-web-components/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Webdevelop",
          "Web-Components",
          "Idee",
          "Javascript",
          "Programmierung",
          "Technologie",
          "Für Tumblr"
        ]
      },
      {
        "title": "SVG und Web Components",
        "description": "<p><img src=\"https://journal.3960.org/posts/2020-04-05-svg-web-components/hsi-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> <a href=\"https://www.webcomponents.org/\" rel=\"nomention\">Web Components</a> erlauben in modernen Browsern, eigene Tags mit beliebig komplexen Verhalten zu definieren. Und wie der Name „Komponente“ schon nahelegt, kann man diese kleinen Bibliotheken beliebig oft weiterverwenden, sobald diese einmalig geladen wurden.</p>\n<p>Mit einigen kleinen Kniffen kann die Entwicklung solcher Komponenten noch schneller von der Hand gehen.</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2020-04-05-svg-web-components/hsi-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> <a href=\"https://www.webcomponents.org/\" rel=\"nomention\">Web Components</a> erlauben in modernen Browsern, eigene Tags mit beliebig komplexen Verhalten zu definieren. Und wie der Name „Komponente“ schon nahelegt, kann man diese kleinen Bibliotheken beliebig oft weiterverwenden, sobald diese einmalig geladen wurden.</p>\n<p>Mit einigen kleinen Kniffen kann die Entwicklung solcher Komponenten noch schneller von der Hand gehen.</p>\n<!-- more -->\n<h2 id=\"more\">Wie starte ich mit Web Components?</h2>\n<p>Für den Einstieg in das Thema Web Components empfiehlt sich die Lektüre der ausgezeichneten <a href=\"https://developers.google.com/web/fundamentals/web-components\" rel=\"nomention\">Einführung von Google</a> und <a href=\"https://css-tricks.com/an-introduction-to-web-components/\">CSS-Tricks</a>. Andere Anleitungen basieren teilweise auf älteren Ideen, die getrost ignoriert werden können.</p>\n<p><strong>Update 2020–09</strong>: Die Vielzahl der Wege, wie man eine Web Component bauen kann, <a href=\"https://webcomponents.dev/blog/all-the-ways-to-make-a-web-component/\" rel=\"nomention\">hat webcomponents.dev veranlasst, eine Auflistung aller möglichen Wege zum Erstellen einer Web Component zusammenzustellen</a>.</p>\n<p>Außerdem lohnt es sich immer, moderne Beispiele anzuschauen. Ich für meinen Teil habe entsprechend versucht, einen <a href=\"https://en.wikipedia.org/wiki/Horizontal_situation_indicator\" rel=\"nomention\">Horizontal Situation Indicator</a> als Vanilla-JavaScript Web Component mustergültig zu bauen. Der daraus resultierende <a href=\"https://github.com/fboes/webcomponent-hsi\">Quellcode der „Horizontal Situation Indicator“ Web Component</a> wird im Rahmen dieses Artikels immer wieder als Beispiel herangezogen.</p>\n<div class=\"embed embed--codepen\"><iframe allowfullscreen=\"allowfullscreen\" title=\"Die montierte &quot;Horizontal Situation Indicator&quot; Web Component\" src=\"https://journal.3960.org//codepen.io/fboes/embed/dyoBvzP/?height=265&amp;theme-id=0&amp;default-tab=result&amp;embed-version=2\" height=\"265\"></iframe></div>\n<h2 id=\"wie-denkt-man-eine-web-component\">Wie <em>denkt</em> man eine Web Component?</h2>\n<p>Die größte Hürde für den angehenden Komponenten-Bauer ist das Verständnis, wie all die schönen Teile zusammenpassen.</p>\n<p>Da eine Web Compoment gekapselt ist, kann nur über eine vorher definierte Schnittstelle von außen Zugriff auf ihr Verhalten genommen werden. Es ist also sehr sinnig, die Konzeption und den Bau einer Web Component wie den Bau einer Schnittstelle bzw. eines Interfaces zu verstehen.</p>\n<p>Als Beispiel nehmen wir einfach die <a href=\"https://3960.org/webcomponent-hsi/\">fertige Implementation der HSI-Web-Component</a>:</p>\n<pre><code class=\"language-html\">&lt;<i>horizontal-situation-indicator</i> <var>id</var>=&quot;<kbd>hsi</kbd>&quot; <var>heading</var>=&quot;<kbd>45.0</kbd>&quot; <var>heading-select</var>=&quot;<kbd>0.0</kbd>&quot;&gt;&lt;/<i>horizontal-situation-indicator</i>&gt;\n</code></pre>\n<h3 id=\"attribute-bzw-properties\">Attribute bzw. Properties</h3>\n<p>Beim Bau einer Web Component müssen neben dem <strong>Namen der Web Component</strong> auch die <strong>Attribute der Web Component und ihre möglichen Werte</strong> definiert werden.</p>\n<p>Diese Attribute verwandeln sich innerhalb der JavaScript-Repräsentation der Web Component in <strong>Properties</strong>, die mit den Attributen synchronisiert sind:</p>\n<pre><code class=\"language-javascript\"><b>const</b> el = <b>document</b>.<b>getElementById</b>(<kbd>'hsi'</kbd>);\nel.<b>getAttribute</b>(<kbd>'heading'</kbd>); <u>// &quot;45.0&quot;</u>\nel.heading; <u>// &quot;45.0&quot;</u>\n\nel.<b>setAttribute</b>(<kbd>'heading'</kbd>, <kbd>'60.0'</kbd>);\nel.<b>getAttribute</b>(<kbd>'heading'</kbd>); <u>// &quot;60.0&quot;</u>\nel.heading; <u>// &quot;60.0&quot;</u>\n\nel.heading = <kbd>'135.0'</kbd>;\nel.<b>getAttribute</b>(<kbd>'heading'</kbd>); <u>// &quot;135.0&quot;</u>\nel.heading; <u>// &quot;135.0&quot;</u>\n</code></pre>\n<p>Bei dem Zugriff auf eine Property mit einem <code>-</code> im Namen funktioniert der Zugriff leicht anders:</p>\n<pre><code class=\"language-javascript\">el.<b>getAttribute</b>(<kbd>'heading-select'</kbd>);\n<u>//el.heading-select existiert nicht</u>\nel[<kbd>'heading-select'</kbd>]; <u>// korrekte Schreibweise in `[]`</u>\n</code></pre>\n<p>Die Schreibweise mit <code>[]</code> erlaubt auch den dynamischen Zugriff auf Properties:</p>\n<pre><code class=\"language-javascript\"><b>let</b> attrName = <kbd>'heading-select'</kbd>;\n\nel.<b>getAttribute</b>(attrName);\nel[attrName];\n</code></pre>\n<h3 id=\"methoden\">Methoden</h3>\n<p>Darüber hinaus kann der Entwickler einer Web Component noch festlegen, dass die Komponente <strong>JavaScript-Methoden</strong> anbietet. Diese erlauben zum Beispiel von außen der Komponente zu befehlen, komplexe Prozesse innerhalb der Komponente zu erledigen.</p>\n<pre><code class=\"language-javascript\">el.synchronizeHeading();\n</code></pre>\n<p>Da JavaScript keine Sichtbarkeiten wie <code>public</code> und <code>private</code> für Methoden hat, hat sich als Konvention herausgebildet, private Methoden mit einem <code>_</code> zu beginnen.</p>\n<h3 id=\"events\">Events</h3>\n<p>Außerdem kann eine Web Component noch <strong>JavaScript-Events</strong> erzeugen, die außerhalb der Komponente registriert werden können. So emittiert z.B. das <code>&lt;video&gt;</code>-Tag Events, wenn ein Video beendet wurde, was ohne dieses Event außerhalb des Tags keiner wissen könnte.</p>\n<h2 id=\"was-kann-eine-web-component-alles-darstellen\">Was kann eine Web Component alles darstellen?</h2>\n<p>Web Components können fast alles darstellen, was auch regulär in einem Browser dargestellt werden kann. Besonderes Augenmerk muss aber darauf gelegt werden, dass alle benötigten Bestandteile in der einen JavaScript-Datei enthalten ist, die die Web Component definiert.</p>\n<p>Am Einfachsten einzubinden sind die folgenden Dinge:</p>\n<ul>\n<li>HTML</li>\n<li>CSS für die Web Component</li>\n<li>JavaScript-Interaktion für die Web Component</li>\n</ul>\n<p>Alle anderen Ressourcen (<strong>Bilder, Videos, Töne</strong>) können mit einem Trick eingeschmuggelt werden: Mittels <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\" rel=\"nomention\">Data URLs</a> können Binär-Dateien in Base64-Zeichenketten umgewandelt werden, die dann z.B. im <code>src</code>-Attribut eines <code>&lt;img&gt;</code> eingebunden werden können.</p>\n<p>Besonders spannend: <strong>SVG-Bilder</strong> sind nicht nur schön kompakt in Bezug auf ihren Speicherplatz, sondern <a href=\"https://css-tricks.com/using-svg/#article-header-id-5\" title=\"Inline SVG in HTML\">können auch direkt in das HTML</a> eingebunden werden – benötigen also den Base64-Trick nicht.</p>\n<h2 id=\"gibt-es-build-tools-für-web-components\">Gibt es Build Tools für Web Components?</h2>\n<p>In der Tat gibt es eine ganze Menge Tools, um das Zusammensetzen der einzelnen Teile einer Web Component zu unterstützen. In der Regel reicht aber <a href=\"https://github.com/fboes/webcomponent-hsi/blob/master/dev/build.js\">ein kleiner flotter Node.js-Mehrzeiler als Web Component Build Tool</a>, der aus einzelnen Dateien die eigentliche Web Component zusammensetzt. Die Kurzfassung:</p>\n<pre><code class=\"language-javascript\"><b>const</b> fs = <i>require</i>(<kbd>'fs'</kbd>);\n\n<b>let</b> source      = fs.readFileSync(<kbd>`horizontal-situation-indicator.js`</kbd>).toString();\n<b>let</b> templateCss = fs.readFileSync(<kbd>`src/horizontal-situation-indicator.css`</kbd>).toString();\n<b>let</b> templateSvg = fs.readFileSync(<kbd>`src/horizontal-situation-indicator.svg`</kbd>).toString();\n\nsource = source.<b>replace</b>(/(&lt;style&gt;).*(&lt;<samp>\\/</samp>style&gt;)/ms, templateCss);\nsource = source.<b>replace</b>(/(&lt;<samp>\\/</samp>style&gt;).*(<kbd>`)/ms, templateSvg);\nfs.writeFileSync(`</kbd>horizontal-situation-indicator.js`, source);\n</code></pre>\n<p>Das tatsächliche Skript ist zwar etwas komplexer, das Grundprinzip ist aber ein denkbar einfaches: Die Entwicklung von SVG und CSS (oder jedem anderen Dateitypen) findet in separaten Dateien statt, die mit dem obigen Skript einfach in das JavaScript der Web Component hineinkopiert werden. Unter anderem könnte hier auch die Konvertierung von Binär-Daten in ihre Base64-Entsprechung durchgeführt werden.</p>\n<h2 id=\"kann-man-das-erzeugen-von-get-und-set-für-jede-property-abkürzen\">Kann man das Erzeugen von <code>get</code> und <code>set</code> für jede Property abkürzen?</h2>\n<p>Da jeder Web Component eine Liste der zu synchronisierenden Attribute / Properties mit der Methode <code>observedAttributes</code> bekannt gemacht werden muss, kann genau diese Liste im <code>constructor</code> auch <a href=\"https://css-tricks.com/creating-a-custom-element-from-scratch/\">zum programmatischen Erzeugern von Gettern / Settern</a> verwendet werden.</p>\n<pre><code class=\"language-javascript\"><i>this</i>.constructor.observedAttributes.<i>forEach</i>((attrName) <samp>=&gt;</samp> {\n  Object.defineProperty(<i>this</i>, attrName, {\n    get() {\n      <i>return</i> <i>this</i>.<b>getAttribute</b>(attrName);\n    },\n    set(attrValue) {\n      <i>this</i>.<b>setAttribute</b>(attrName, attrValue);\n    }\n  });\n});\n</code></pre>\n<p>Diese Methode hat in einigen Web-Components-Frameworks möglicherweise Nachteile – für die Vanilla-Nutzung ist sie aber weitestgehend ungefährlich.</p>\n<h2 id=\"wie-löse-ich-styling-in-der-web-component\">Wie löse ich Styling <em>in</em> der Web Component?</h2>\n<p>Da Web Components sowieso nur in aktuellen Browsern zuverlässig funktionieren, kann man sich gleichzeitig auch auf fortgeschrittene CSS-Möglichkeiten verlassen. Um CSS innerhalb der Komponente von außen zu beeinflussen, verwende ich <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/--*\">CSS-Variablen bzw. CSS-Custom-Properties</a>. Innerhalb des CSS&#39; des Komponente definiere ich sie direkt an der DOM-Wurzel der Komponente:</p>\n<pre><code class=\"language-css\"><i>:host</i> {\n  <var>--background-color</var>: black;\n  <var>--foreground-color</var>: white;\n  <var>--heading-select-color</var>: cyan;\n  <var>--stroke-width</var>: 0.5;\n}\n<u>/*…und verwende diese CSS-Custom-Properties dann später in Variablen - bei mir z.B. als SVG-CSS-Eigenschaften:*/</u>\n\n<i>#background</i> {\n  <b>fill</b>: <b>var</b>(<var>--background-color</var>);\n}\n<i>*</i> {\n  <b>fill</b>: <b>var</b>(<var>--foreground-color</var>);\n}\n<i>*[stroke]</i> {\n  <b>stroke-width</b>: <b>var</b>(<var>--stroke-width</var>);\n}\n\n<i>#heading-select</i> {\n  <b>fill</b>: <b>var</b>(<var>--heading-select-color</var>);\n}\n</code></pre>\n<p>Wer nun auch immer diese Komponente verwendet, kann diese CSS-Custom-Properties von außen beeinflussen:</p>\n<pre><code class=\"language-css\"><i>horizontal-situation-indicator</i> {\n  <var>--heading-select-color</var>: red;\n  <var>--stroke-width</var>: 1;\n}\n</code></pre>\n<p>Bei der <a href=\"https://3960.org/webcomponent-hsi/\">Beispiel-Implementation von <code>&lt;horizontal-situation-indicator&gt;</code></a> kann auch bewundert werden, wie durch JavaScript diese CSS-Custom-Properties am lebenden Objekt verändert werden, und in der Komponente sich alles fröhlich verfärbt.</p>\n<p>Ganz nebenbei haben wir für die Komponente eine weitere Schnittstelle geschaffen – in diesem Fall eine Styling-Schnittstelle.</p>\n<p><strong>Update:</strong> Andererseits können aber auch einzelne DOM-Knoten ohne CSS-Properties zum expliziten Styling freigegeben werden. Eine <a href=\"https://css-tricks.com/styling-in-the-shadow-dom-with-css-shadow-parts/\">Anleitung zum Freigeben von DOM-Knoten aus dem Shadow-DOM zum CSS-Styling bei CSS-Tricks</a> zeigt die notwendigen Anpassungen im HTML:</p>\n<pre><code class=\"language-html\">&lt;<i>div</i> <var>part</var>=&quot;<kbd>style-me</kbd>&quot;&gt;…&lt;/<i>div</i>&gt;\n</code></pre>\n<p>…und dem CSS im Eltern-Dokument:</p>\n<pre><code class=\"language-css\"><i>horizontal-situation-indicator::part(style-me)</i> {\n  <b>font-weight</b>: bold;\n}\n</code></pre>\n<p>Auch hier hat wieder der Autor der Komponente die Herrschaft über die Elemente, die er nach außen freigibt – wie bei einer Schnittstelle.</p>\n<h2 id=\"wie-animiere-ich-svgs-in-web-components\">Wie animiere ich SVGs in Web Components?</h2>\n<p>Der eigentliche Clou der <a href=\"https://github.com/fboes/webcomponent-hsi\">HSI Web Component</a> ist die generelle Fähigkeit von JavaScript, DOM-Elemente und ihre Eigenschaften zu verändern. Dies können sowohl CSS-Eigenschaften als auch generelle Attribute von DOM-Elementen sein.</p>\n<p>Bei SVG bieten sich die folgenden Operationen an:</p>\n<ul>\n<li>Änderung von <code>stroke</code> und <code>stroke-width</code> zur Beeinflussung von Linien</li>\n<li>Änderung von <code>fill</code> zur Veränderung der Füllfarbe</li>\n<li>Änderung von <code>opacity</code> zur Veränderung der Durchsichtigkeit eines Elements</li>\n<li>Veränderung von Position, Größe und Rotation mittels <code>transform</code></li>\n<li>Austausch des Text-Inhalts von <code>&lt;text&gt;</code>-Knoten mittels <code>.textContent</code></li>\n</ul>\n<p>Bei SVG gibt es dabei die Möglichkeit, nicht nur via CSS diese Eigenschaften zu beeinflussen, sondern auch durch das Setzen von Attributen innerhalb des SVGs an einzelnen SVG-DOM-Knoten.</p>\n<p>Auch das ist in der <a href=\"https://3960.org/webcomponent-hsi/\">Beispiel-Implementation von <code>&lt;horizontal-situation-indicator&gt;</code></a> zu bestaunen – hier sind die Attribute der Komponente mit Animationsmethoden verknüpft, so dass Änderungen an den Attributen bzw. Properties der Web Component zeitgleich die Darstellung des eingeschlossenen SVGs ändert.</p>\n<h2 id=\"wie-sollte-eine-dokumentation-für-eine-web-compontent-aussehen\">Wie sollte eine Dokumentation für eine Web Compontent aussehen?</h2>\n<p>Da eine Web Component im Endeffekt eine Schnittstelle ist, muss es dazu eine <strong>Schnittstellen-Dokumentation</strong> geben. Ohne diese Dokumentation können andere Entwickler, die die Komponente verwenden möchten, nicht zuverlässig wissen, wie die Komponente zu bedienen ist.</p>\n<p>Als Minimum muss eine Dokumentation enthalten:</p>\n<pre><code class=\"language-markdown\"><em>## Properties</em>\n\n| Name           | Type    | Default | Description  |\n| -------------- | ------- | ------- | ------------ |\n| <samp>`heading`</samp>      | <samp>`float`</samp> | <samp>`null`</samp>  | Lorem ipsum… |\n\n<em>## Methods</em>\n\n| Name           | Parameters | Description         |\n| -------------- | ---------- | ------------------- |\n| <samp>`revHeading`</samp>   | none       | Lorem ipsum…        |\n\n<em>## Events</em>\n\n| Name           | Description                      |\n| -------------- | -------------------------------- |\n| <samp>`synchronized`</samp> | Lorem ipsum…                     |\n\n<em>## Styling</em>\n\n<samp>```css\ncomponent-name {\n  --background: color; /* Lorem ipsum… */\n}\n\ncomponent-name::part(part-name) {} /* Lorem ipsum… */\n```</samp>\n</code></pre>\n<h2 id=\"fazit\">Fazit</h2>\n<p>Der fertige <a href=\"https://github.com/fboes/webcomponent-hsi\">Horizontal Situation Indicator als Web Component ist in einem GitHub-Repository</a> gelandet, und einen Blick auf die <a href=\"https://3960.org/webcomponent-hsi/\">fertige Implementation der HSI-Web-Component</a> erlaubt einen interaktiven Blick auf die Zusammenhänge in der Komponente.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=SVG%20und%20Web%20Components&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-04-05-svg-web-components%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2020-04-05-svg-web-components/",
        "pubDate": "Sun, 05 Apr 2020 18:41:26 +0200",
        "atom_published": "2020-04-05T18:41:26+02:00",
        "atom_updated": "2023-03-05T10:14:07+01:00",
        "guid": "user/posts/2020-04-05-svg-web-components/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Webdevelop",
          "Web-Components",
          "SVG",
          "Javascript",
          "CSS",
          "Programmierung",
          "Technologie",
          "The Cool",
          "Fliegerei"
        ]
      },
      {
        "title": "Wenn die WMR-Brille mal nicht startet…",
        "description": "<p>Seit geraumer Zeit spinnt meine „Windows Mixed Reality“-Brille. Hin und wieder startet sie nicht, sondern beglückt mich mit der folgenden Fehlermeldung:</p>\n<blockquote><p>Check your display cable. Make sure your headset&#39;s display cable is plugged in correctly.</p></blockquote>\n<p>Da ich mir furchtbar sicher war, die Brille eigentlich korrekt angekabelt zu haben, und das Kriechen unter den Schreibtisch lästig wurde, habe ich doch tatsächlich eine <em>halbwegs</em> elegante Lösung für dieses Problem gefunden.</p>",
        "content_encoded": "<p>Seit geraumer Zeit spinnt meine „Windows Mixed Reality“-Brille. Hin und wieder startet sie nicht, sondern beglückt mich mit der folgenden Fehlermeldung:</p>\n<blockquote><p>Check your display cable. Make sure your headset&#39;s display cable is plugged in correctly.</p></blockquote>\n<p>Da ich mir furchtbar sicher war, die Brille eigentlich korrekt angekabelt zu haben, und das Kriechen unter den Schreibtisch lästig wurde, habe ich doch tatsächlich eine <em>halbwegs</em> elegante Lösung für dieses Problem gefunden.</p>\n<!-- more -->\n<p id=\"more\">Nach einer Recherche zum <a href=\"https://forums.hololens.com/discussion/8180/mixed-reality-portal-check-your-display-cable-cannot-complete-initial-setup\">der WMR-Fehlermeldung mit dem angeblich nicht eingesteckten Kabel</a> wurde mir angeraten, den „Windows Perception Service“ neu starten. Der Vorgang dazu sieht wie folgt aus:</p>\n<ol>\n<li>In die Windows-Suche „Services“ bzw. „Dienste“ eingeben und die auftauchende Applikation starten.</li>\n<li>In der ellenlangen Liste den „Windows Perception Service“ suchen. (Dieser Dienst wird intern als <code>spectrum</code> bezeichnet.)</li>\n<li>Mittels Rechtsklick diesen Dienst neustarten.</li>\n</ol>\n<p>Anschließend ertönt das Geräusch, dass für frisch erkannte USB-Geräte reserviert ist, und die WMR-Brille startet ganz normal.</p>\n<p>Da das Problem inzwischen dauerhaft bei mir auftritt, habe ich diesen Prozess noch weiter abgekürzt. Auf dem Desktop habe ich eine Datei namens <code>restart-mixed-reality.bat</code> angelegt, und in diese Datei die folgende Zeile eingefügt:</p>\n<pre><code class=\"language-dos\">net stop spectrum <i>&amp;&amp;</i> net start spectrum\n</code></pre>\n<p>Wenn man diese Datei nun mittels Rechtsklick als Administrator ausführt, wird der ganze obige Prozess am Stück durchgeführt, und das Mixed Reality Portal startet.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Wenn%20die%20WMR-Brille%20mal%20nicht%20startet%E2%80%A6&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2020-04-01-wenn-wmr-brille-mal-nicht-startet%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2020-04-01-wenn-wmr-brille-mal-nicht-startet/",
        "pubDate": "Wed, 01 Apr 2020 19:44:16 +0200",
        "atom_published": "2020-04-01T19:44:16+02:00",
        "atom_updated": "2020-04-02T17:21:44+02:00",
        "guid": "user/posts/2020-04-01-wenn-wmr-brille-mal-nicht-startet/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Virtual Reality",
          "Technologie"
        ]
      },
      {
        "title": "Firefox – Weniger Werbung, mehr Speed unter Android",
        "description": "<p><img src=\"https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Werbung nervt. Tracking nervt. Nerven nervt. Und gerade mobil habe ich eigentlich keine Zeit, meine geringe Download-Rate mit dem Herunterladen von hässlichen Werbemitteln zu verbringen. Aber welche Optionen hat man schon auf einem Smartphone?</p>",
        "content_encoded": "<p><img src=\"https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"\" /> Werbung nervt. Tracking nervt. Nerven nervt. Und gerade mobil habe ich eigentlich keine Zeit, meine geringe Download-Rate mit dem Herunterladen von hässlichen Werbemitteln zu verbringen. Aber welche Optionen hat man schon auf einem Smartphone?</p>\n<!-- more -->\n<p id=\"more\">Schon vor einiger Zeit war ich auf <a href=\"https://journal.3960.org/posts/2017-10-31-mobiles-surfen-ohne-werbung/\">Firefox für Android</a> gestoßen. Da ich schon immer ein Herz für Mozilla hatte und Firefox einer der wenigen Browser unter Android war, in dem ein AdBlocker funktionierte, war ich von Chrome für Android auf Firefox für Android umgestiegen.</p>\n<blockquote><p>Oh, ein Nerd-Telefon! Android, Firefox und DuckDuckGo.</p></blockquote>\n<p>Ein <a href=\"https://www.duden.de/rechtschreibung/Wermutstropfen\">Wermutstropfen</a> hatte damals Firefox für Android aber: Im Vergleich zu Android-Chrome war er nicht wirklich schnell. Das fiel augenscheinlich auch Mozilla auf, so dass sich in der stetig vergrößernden Palette an <a href=\"https://play.google.com/store/apps/dev?id=7083182635971239206\">Mozillas Android-Apps</a> eine neue Version von Firefox für Android fand: <a href=\"https://play.google.com/store/apps/details?id=org.mozilla.fenix\">Mozilla Firefox Preview</a> – und die Früchte dieser Arbeit sind nun im <a href=\"https://play.google.com/store/apps/details?id=org.mozilla.firefox\">regulären Mozilla Firefox</a> integriert worden.</p>\n<p>Von seinem Vorgänger unterscheidet <i>Firefox Preview</i> neben einer etwas kompakteren Oberfläche vor allen Dingen seine rasante Geschwindigkeit. Bei den Plugins für diesen Browser gibt es auch bekannte AdBlocker, der <em>eingebaute</em> AdBlocker (Enhanced Tracking Protection bzw. <i>ETP</i> genannt) funktioniert aber auch bereits ausgezeichnet (so das meine Bastelei für <a href=\"https://journal.3960.org/posts/2015-07-02-fritz-box-als-adblocker/\">den FritzBox-AdBlocker</a> für <em>diesen</em> Browser überflüssig wird).</p>\n<p><span class=\"figure quad\"><img src=\"https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/firefox-blocked-240x240.png\" class=\"quad\" width=\"240\" height=\"240\" style=\"--aspect-ratio: 1/1;\" alt=\"Neulich auf einer ganz normalen Nachrichtenseite.\" /><span class=\"figcaption\" aria-hidden=\"true\">Neulich auf einer ganz normalen Nachrichtenseite.<br /></span></span> Nebenbei kann <i>Firefox</i> auch den Webview auf Android ersetzen. Damit sind <em>alle</em> Apps auf dem Telefon, die Webview verwenden, nicht nur mit der Rendering-Engine sondern auch mit dem AdBlocker von <i>Firefox</i> ausgestattet.</p>\n<p>Nicht zuletzt ist in Firefox der Dienst „Firefox Sync“ eingebaut. Sobald man sich einen kostenlosen <a href=\"https://www.mozilla.org/de/firefox/accounts/\">Firefox Account</a> zugelegt hat, können alle anderen mit diesem Account registrierten Firefox-Browser Historie und Lesezeichen teilen. Damit ist das Erlebnis wie bei Google Chrome mit aktivierten Google Account.</p>\n<p>Übrigens: Mozillas Bemühen um neue Privatsphären-Services hat <a href=\"https://monitor.firefox.com/\">Firefox Monitor</a> hervorgebracht. Mit einem Firefox-Account kann man sich so informieren lassen, ob die eigene E-Mail-Adresse von einem Datenleck betroffen ist. Ein sinnvoller Service, der mich zum Beispiel darauf gebracht hat, dass einige von mir benutzte Dienste meine E-Mail-Adresse nebst Passwort-Hash verloren hatten – und merkwürdigerweise ein <em>nicht</em> von mir benutzter Dienst, womit sich hier möglicherweise der Kreis zum Trackingschutz von Mozilla Firefox schließt. <span class=\"emoji emoji--1f609\" title=\";)\">&#x1F609;</span></p>\n<p><strong>Update 2020–08:</strong> Inzwischen hat sich die Browser-Palette von Mozilla für Android leicht verändert: Der <a href=\"https://play.google.com/store/apps/details?id=org.mozilla.firefox\">reguläre Mozilla Firefox</a> verbindet die Vorteile vom Firefox Preview mit der Stabilität vom regulären Firefox.</p><img src=\"https://stats.3960.org/p.php?idsite=2amp;action_name=Firefox%20%E2%80%93%20Weniger%20Werbung%2C%20mehr%20Speed%20unter%20Android&amp;url=https%3A%2F%2Fjournal.3960.org%2Fposts%2F2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android%2F%3Futm_source%3Dnewsfeed_view\" style=\"border:0;\" alt=\"\" />",
        "link": "https://journal.3960.org/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/",
        "pubDate": "Sun, 22 Dec 2019 18:33:43 +0100",
        "atom_published": "2019-12-22T18:33:43+01:00",
        "atom_updated": "2020-08-25T11:55:12+02:00",
        "guid": "user/posts/2019-12-22-firefox-weniger-werbung-mehr-speed-unter-android/index.md",
        "author": "info@3960.org (Frank Boës)",
        "categories": [
          "Sicherheit",
          "Für Tumblr",
          "Geckobar",
          "Review",
          "Technologie",
          "Webdevelop",
          "Adblocker"
        ]
      }
    ]
  }
}