{ "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 \"The Cool\"", "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/the-cool/rss.json", "rel": "self", "type": "application/rss+json" }, "lastBuildDate": "Fri, 22 Mar 2024 18:00:20 +0100", "atom_updated": "2024-03-22T18:00:20+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": "One revolution per minute", "description": "
\nManche Künstler trifft man mehrfach im Leben. Erik Wernquist ist so ein Künstler. „One revolution per minute“ zeigt uns das Leben an Bord eines Kreuzfahrtraumschiffs…
", "content_encoded": "\nManche Künstler trifft man mehrfach im Leben. Erik Wernquist ist so ein Künstler. „One revolution per minute“ zeigt uns das Leben an Bord eines Kreuzfahrtraumschiffs…
", "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": "\nDie Portfolio-Seite von Ivan Tantsiura ist eine wunderbare Fundgrube. Tantsiura arbeitet als Principal Concept Artist bei Crytek, und hat Unmengen an futuristischen Designs geschaffen – unter anderem das RIDON Hoverbike.
\nVerglichen 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 Simon Stålenhag und seine schwebenden Schiffe.
\nMan 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?
", "content_encoded": "\nDie Portfolio-Seite von Ivan Tantsiura ist eine wunderbare Fundgrube. Tantsiura arbeitet als Principal Concept Artist bei Crytek, und hat Unmengen an futuristischen Designs geschaffen – unter anderem das RIDON Hoverbike.
\nVerglichen 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 Simon Stålenhag und seine schwebenden Schiffe.
\nMan 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?
", "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": "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 Home Assistant, um zum Beispiel auf Temperaturdaten oder Wetterprognosen reagieren zu können.
", "content_encoded": "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 Home Assistant, um zum Beispiel auf Temperaturdaten oder Wetterprognosen reagieren zu können.
\n\nDummerweise 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.
\n…ist zweiteilig: In der FRITZ!Box legen wir mittels Vorlagen das ein- und ausschalten des Sommermodus' an – und im Home Assistant lösen wir dann die Vorlagen aus.
\n\n
Den Druck auf einen dieser Knöpfe könnt ihr im Hone Assistant abfangen und zusätzliche Aktionen auslösen.
\nDazu 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:
\nalias: "Heizungen: Sommermodus an"\ndescription: ""\ntrigger:\n - platform: device\n device_id: 5f6c4925f76d4ef27407160a968bb7fd\n domain: button\n entity_id: button.heizungen_sommermodus_an\n type: pressed\ncondition: []\naction:\n - service: notify.notify\n data:\n title: "Sommermodus an"\n message: >-\n Alle Heizungen sind nun abgeschaltet, willkommen im Sommermodus.\n enabled: true\nmode: single\n
\nWir 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 Automatisierungen des Home Assistants für uns auf den Knopf drücken lassen.
\nDabei kann in jeder Automatisierung als Aktion der Druck auf die Knöpfe ausgelöst werden:
\naction:\n - service: button.press\n data: {}\n target:\n entity_id: button.sommermodus_an\n enabled: true\n
\nSomit könnt ihr euch nun beliebige Auslöser im Home Assistant konfigurieren, die eure Heizung in den Sommermodus schicken.
\nDie 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.
\nTheoretisch könnt ihr darüber auch abweichende Zeitpläne oder geänderte Spar-/Komforttemperaturen oder zeitlich begrenzte EInstellungen wie Boost oder Fenster-Modus aktivieren.
", "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": "Pragmatische Heizungssteuerung im Home-Office", "description": "Mein neuestes Abenteuer mit dem Home Assistant in Verbindung mit FRITZ!DECT 301 beschäftigt sich mit einer smarten Heizungssteuerung für das Home-Office.
", "content_encoded": "Mein neuestes Abenteuer mit dem Home Assistant in Verbindung mit FRITZ!DECT 301 beschäftigt sich mit einer smarten Heizungssteuerung für das Home-Office.
\n\nAch, was habe ich alles gebaut und gebastelt. Los ging es mit einem einfachen Zeitplan in der FRITZ!Box, der jeden Montag bis Freitag in der Arbeitszeit die Heizung ein- und danach wieder ausschaltete. Ich war's zufrieden.
\nAber an Feiertagen, die zwischen Montag und Freitag lagen, lief die Heizung immer noch. Höchste Zeit, den Werktags-Sensor ü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.
\nUnd im Urlaub? Urlaube sind ja keine Feiertage. Also noch einen Kalender in den Home Assistant integriert, der an Urlaubstagen die Heizung ebenfalls ausgeschaltet hält.
\nOha, Gleitzeit und Überstunden: 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?
\nWie 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?
\nGanz 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 keiner der Rechner im Netzwerk ist, wird die Heizung entsprechend ausgeschaltet.
\nDazu bauen wir uns einen Zustand, der eingeschaltet ist, wenn irgendeiner der PCs angeschaltet und im Netzwerk ist – und erst ausgeschaltet ist, wenn alle PCs ausgeschaltet sind. Das funktioniert wie folgt:
\narbeitspferd
und daddelkiste
.device_tracker
beginnt. In meinem Beispiel gehen wir von zwei PC-Trackern aus, device_tracker.arbeitspferd
und device_tracker.daddelkiste
.configuration.yaml
nun so erweitert werden, dass die beiden Tracker (oder beliebig viele Tracker) zu einem Sammel-Tracker zusammengefasst werden.- name: "Home-Office PCs"\n unique_id: device_tracker_homeoffice\n state: "{{ is_state('device_tracker.arbeitspferd', 'home') or is_state('device_tracker.daddelkiste', 'home') }}"\n icon: "mdi:lan-connect"\n device_class: presence\n
\nNach einmaligem Neustart sollte unter „Entwicklerwerkzeuge > Zustände“ der neue Tracker sichtbar sein. Er heißt dann wahrscheinlich binary_sensor.device_tracker_homeoffice
.
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.
\nDer 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:
\nUnter „Einstellungen > Automatisierungen & Szenen“ fügen wir dazu ein einfaches Rezept hinzu:
\n# Replace all occurences of `office` with your thermostat's identifier\n# `device_id` has to be assigned via GUI\nalias: "Office: Someone is there"\ndescription: "Be nice, and turn on the heating if someone is using a PC in the office"\ntrigger:\n - platform: state\n entity_id:\n - binary_sensor.device_tracker_homeoffice\n from: "on"\n - platform: state\n entity_id:\n - binary_sensor.device_tracker_homeoffice\n to: "on"\naction:\n - if:\n - condition: state\n entity_id: binary_sensor.device_tracker_homeoffice\n state: "on"\n then:\n - device_id: b46c4851235fb8c90f4a659b6e9a953d\n domain: climate\n entity_id: climate.office\n type: set_preset_mode\n preset_mode: comfort\n else:\n - device_id: b46c4851235fb8c90f4a659b6e9a953d\n domain: climate\n entity_id: climate.office\n type: set_preset_mode\n preset_mode: eco\nmode: single\n
\nErst 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.
\nTatsä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.
\nOder wie wäre es mit einem Sammel-Tracker, der die Smartphones aller Haushaltsteilnehmer als Schalter verwendet?
", "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": "Der Home Assistant 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.
\nEinen kleinen Nachteil hat diese Konstruktion aber: Euer Home Assistant lässt sich nicht außerhalb eures Heimnetzwerks steuern. Oder?
", "content_encoded": "Der Home Assistant 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.
\nEinen kleinen Nachteil hat diese Konstruktion aber: Euer Home Assistant lässt sich nicht außerhalb eures Heimnetzwerks steuern. Oder?
\n\nNatürlich stimmt das nicht: Direkt im Home Assistant wird Werbung für die Home Assistant Cloud 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.
\nTatsä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.
\nDas 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.
\nDie 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.
\nRichtet also auf eurer AVM FRITZ!Box einen VPN-Zugang ein, aber mit einer wichtigen Ä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.
\nAn 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.
\nInteressanterweise 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.
\nHeizungssteuerung ist in aller Munde. Als Besitzer einer FRITZ!Box habe ich mir also ein paar FRITZ!DECT 301 Thermostate der Firma AVM zugelegt, um meine Heizung sparsamer zu machen.
\nUnd dann bin ich dummerweise auf Home Assistant aufmerksam gemacht worden, mit dem man die etwas spartanischen Möglichkeiten der Thermostate gewaltig aufbohren kann.
\nBegleitet mich auf meiner Reise in den Kaninchenbau.
", "content_encoded": "Heizungssteuerung ist in aller Munde. Als Besitzer einer FRITZ!Box habe ich mir also ein paar FRITZ!DECT 301 Thermostate der Firma AVM zugelegt, um meine Heizung sparsamer zu machen.
\nUnd dann bin ich dummerweise auf Home Assistant aufmerksam gemacht worden, mit dem man die etwas spartanischen Möglichkeiten der Thermostate gewaltig aufbohren kann.
\nBegleitet mich auf meiner Reise in den Kaninchenbau.
\n\nBei 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.
\nMeine Philosophie bei der Integration des Home Assistant war wie folgt:
\nNach 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:
\nDas ist tatsächlich schön konfigurativ zu lösen…
\n\n…oder mit dem folgendem YAML als schnelles Rezept für das Dashboard:
\n# Replace all occurences of `wohnzimmer` with your thermostat's identifier\ntype: thermostat\nfeatures:\n - style: icons\n preset_modes:\n - eco\n - comfort\n type: climate-preset-modes\nentity: climate.wohnzimmer\n
\n(Update 2024–02: Die neuen Konfigurationsmöglichkeiten des Home Assistant haben den Einbau weiterer Knöpfe deutlich vereinfacht.)
\nDurch den Home Assistant werden die FRITZ!DECT 301 Thermostate folgerichtig als Thermostate erkannt. Tatsächlich beinhalten sie aber auch einen Temperatur-Sensor, den man mit etwas Bastelei auch im Dashboard anzeigen kann.
\nMit dem Home Assistant Community Add-on: Visual Studio Code kann die configuration.yaml
um die folgenden Zeilen erweitern werden:
# Converting thermostats into thermometers\n# Replace all occurences of `wohnzimmer` with your thermostat's identifier\ntemplate:\n - sensor:\n - name: "Wohnzimmer Heizung Temperatur"\n unique_id: wohnzimmer_heizung_temperatur\n state: "{{ state_attr('climate.wohnzimmer', 'current_temperature') }}"\n unit_of_measurement: "°C"\n device_class: temperature\n
\nDanach können diese Sensoren im Dashboard angezeigt werden:
\n# Replace all occurences of `wohnzimmer` with your thermostat's identifier\ntype: gauge\nentity: sensor.wohnzimmer_heizung_temperatur\nmin: 10\nmax: 32\nseverity:\n green: 21\n yellow: 23\n red: 25\n
\nDie FRITZ!DECT 301 Thermostate 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.
\nMit dem Home Assistant Community Add-on: Visual Studio Code kann die configuration.yaml
um die folgenden Zeilen erweitern werden:
# Replace all occurences of `wohnzimmer` with your thermostat's identifier\ntemplate:\n - binary_sensor:\n - name: "Wohnzimmer Heizung Urlaubsmodus"\n unique_id: wohnzimmer_heizung_urlaubsmodus\n state: "{{ state_attr('climate.wohnzimmer', 'holiday_mode') }}"\n icon: "mdi:bag-checked"\n
\nAnalog lässt sich auch der Sommermodus der Heizung in der configuration.yaml
als eigener Sensor einrichten:
# Replace all occurences of `wohnzimmer` with your thermostat's identifier\ntemplate:\n - binary_sensor:\n - name: "Wohnzimmer Heizung Sommermodus"\n unique_id: wohnzimmer_heizung_sommermodus\n state: "{{ state_attr('climate.wohnzimmer', 'summer_mode') }}"\n icon: "mdi:hvac-off"\n
\nIn 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 Arbeitstag-Sensor.
\nMit dem Home Assistant Community Add-on: Visual Studio Code kann die configuration.yaml
um die folgenden Zeilen erweitern werden:
# Workday sensor\nbinary_sensor:\n - platform: workday\n country: DE\n province: NI # Niedersachsen, Lower Saxony\n
\nDer 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.
\nVorher legen wir uns einen Zeitplan an, den wir in folgende Automatisierung einbinden:
\n# Replace all occurences of `office` with your thermostat's identifier\n# `device_id` has to be assigned via GUI\nalias: "Home Office"\ndescription: Only trigger comfort mode on work days\ntrigger:\n - platform: state\n entity_id:\n - binary_sensor.office_heizung_home_office\ncondition:\n - condition: and\n conditions:\n - condition: state\n entity_id: binary_sensor.workday_sensor\n state: "on"\n - condition: state\n entity_id: binary_sensor.office_heizung_urlaubsmodus\n state: "off"\naction:\n - if:\n - condition: state\n state: "on"\n entity_id: binary_sensor.office_heizung_home_office\n then:\n - device_id: b46c4851235fb8c90f4a659b6e9a953a\n domain: climate\n entity_id: climate.office\n type: set_preset_mode\n preset_mode: comfort\n else:\n - device_id: b46c4851235fb8c90f4a659b6e9a953a\n domain: climate\n entity_id: climate.office\n type: set_preset_mode\n preset_mode: eco\n enabled: true\nmode: single\n
\nHier 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.
", "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": "Retro-Flugsimulation „Tiny Combat Arena“ im Anflug", "description": "MicroProse ist zurück – und macht seinem Erbe alle Ehre:
\n\nMit Tiny Combat Arena ist MicroProse Publisher für ein „low poly“ Kampfflugzeug-Simulator geworden, der richtig spannend klingt.
", "content_encoded": "MicroProse ist zurück – und macht seinem Erbe alle Ehre:
\n\nMit Tiny Combat Arena ist MicroProse Publisher für ein „low poly“ Kampfflugzeug-Simulator geworden, der richtig spannend klingt.
\n\nTiny Combat Arena von Entwickler Brian Hernandez (auch bekannt als Why485 auf Twitter und itch.io) versucht, das beste der Kampfflugzeug-Simulationen der 80er und 90er zu einem neuen Paket zu bündeln: Eine nicht übermäßig komplexe Simulation, bei der man einfach mal ein paar Dinge in die Luft sprengen kann, verbunden mit einer dynamischen Kampagne.
\nDas wichtigste Fluggerät in der Simulation ist der AV-8B Harrier II.
\nWas aufgrund des kleinen Entwicklungsteams erstmal nicht umgesetzt wird, ist Multiplayer und Virtual Reality (siehe auch die FAQ on Tiny Combat Arena). Hier bleibt uns die Hoffnung, dass das Spiel einschlägt wie eine Bombe, und zusätzlicher Aufwand für solche Erweiterungen gerechtfertigt erscheint. Ähnlich wie bei House of the Dying Sun könnte der Umfang des Simulators aber bewusst spartanisch bleiben.
\nAndersherum lehnt sich Tiny Combat Arena an große Vorbilder aus der Goldenen Zeit der Flugsimulatoren an, wie zum Beispiel:
\nTitel | \nHersteller | \nJahr | \n
---|---|---|
Chuck Yeager's Air Combat | \nElectronic Arts | \n1991 | \n
F-117A | \nMicroProse | \n1991 | \n
Falcon 3.0 | \nSpectrum Holobyte | \n1991 | \n
Tornado | \nDigital Integrations | \n1993 | \n
Combat Air Patrol | \nPsygnosis | \n1993 | \n
EF 2000 | \nDigital Image Design | \n1995 | \n
A-10 Cuba | \nActivision | \n1996 | \n
F/A-18 3.0 | \nGraphic Simulations Corporation | \n1997 | \n
Auf itch.io kann man übrigens sehen, wie sehr Hernandez von Low-Poly-Flugsimulationen begeistert ist: Dort findet sich unter anderem ein früher Prototyp von Tiny Combat Arena.
", "link": "https://journal.3960.org/posts/2021-07-14-retro-flugsimulation-tiny-combat-arena-anflug/", "pubDate": "Wed, 14 Jul 2021 18:40:15 +0200", "atom_published": "2021-07-14T18:40:15+02:00", "atom_updated": "2021-07-14T20:49:20+02:00", "guid": "user/posts/2021-07-14-retro-flugsimulation-tiny-combat-arena-anflug/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Simulation", "Fliegerei", "DCS", "Spiel", "The Cool", "Virtual Reality" ] }, { "title": "Wie Microsoft sich Augmented Reality in 2021 vorstellt", "description": "Als Fortsetzung von Microsofts Überlegungen zu Augmented Reality:
\n\nAuch wenn es nicht im Fokus des Videos steht: Interessant ist die Verknüpfung von Headsets für Augmented-Reality (z.B. die Microsoft HoloLens) und Virtual-Reality zu einer gemeinsamen Umgebung.
", "content_encoded": "Als Fortsetzung von Microsofts Überlegungen zu Augmented Reality:
\n\nAuch wenn es nicht im Fokus des Videos steht: Interessant ist die Verknüpfung von Headsets für Augmented-Reality (z.B. die Microsoft HoloLens) und Virtual-Reality zu einer gemeinsamen Umgebung.
", "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": "\nMit wenigen Handgriffen kann man den häuslichen Arbeitsplatzes (aka „Home Office“) deutlich angenehmer und produktiver gestalten.
", "content_encoded": "\nMit wenigen Handgriffen kann man den häuslichen Arbeitsplatzes (aka „Home Office“) deutlich angenehmer und produktiver gestalten.
\n\nIn 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.
\nInspiriert von den Home-Offices von Basecamp-Mitarbeitern folgt hier eine Liste der Dinge, mit der der heimische Arbeitsplatz deutlich angenehmer werden kann.
\nGrundsätzlich muss das Home-Office folgende Eigenschaften erfüllen:
\nHome-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.
\nEin 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.
\nEin 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.
\nSo kann man heimischen PC und Arbeits-Laptop gleichzeitig 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.
\nFalls 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!
\nDie 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.
\nGleiches 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.
\nWenn (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 Logitech MX-Serie), 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.
\nSelbst 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.
\nDafü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.
\nFü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.
\nDie Klinken an dem Kopfhörer unterscheiden sich darin, dass sie statt zwei schwarzer Ringe auf dem blanken Teil des Steckers drei 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.
\nIhr 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.
\nUnd 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.
\nWenn 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:
\nAnstatt 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:
\nFalls 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 (je nach USB-C-Anschluss) Monitore.
\nEtwas 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 über den USB-C-Port geladen werden kann, 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.
\nDie Regelungen für die ergonomische Einrichtung von Arbeitsplätzen 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.
", "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": "Die militärische Senseo-Kaffeemaschine", "description": "\nMeine kleine Senseo-Kaffeemaschine begleitet mich seit über zehn Jahren. Liebevoll oliv lackiert, hat sie auch ein paar passende Knopf-Beschriftungen bekommen. Oder soll ich lieber sagen…
\n\n…Selektoren?
", "content_encoded": "\nMeine kleine Senseo-Kaffeemaschine begleitet mich seit über zehn Jahren. Liebevoll oliv lackiert, hat sie auch ein paar passende Knopf-Beschriftungen bekommen. Oder soll ich lieber sagen…
\n\n…Selektoren?
", "link": "https://journal.3960.org/posts/2020-05-16-militaerische-senseo-kaffeemaschine/", "pubDate": "Sat, 16 May 2020 19:41:52 +0200", "atom_published": "2020-05-16T19:41:52+02:00", "atom_updated": "2020-06-23T17:39:24+02:00", "guid": "user/posts/2020-05-16-militaerische-senseo-kaffeemaschine/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Homeoffice", "Geckobar", "Idee", "Lustiges", "The Cool", "Kaffee" ] }, { "title": "Schiffe abwracken im Weltall: „Hardspace: Shipbreaker“", "description": "Das kleine Studio Blackbird Interactive schickt sich an, mal wieder ein Raumfahrt-Spiel zu bauen.
\n\nIn Hardspace: Shipbreaker steckt ihr in den Schuhen bzw. im Anzug eines einzelnen Astronauten, dessen Aufgabe es ist, Schiffe abzuwracken, indem er sie in handliche Teile sägt – und das ist nach den ersten Blicken eine sehr unterhaltsame Aufgabe.
", "content_encoded": "Das kleine Studio Blackbird Interactive schickt sich an, mal wieder ein Raumfahrt-Spiel zu bauen.
\n\nIn Hardspace: Shipbreaker steckt ihr in den Schuhen bzw. im Anzug eines einzelnen Astronauten, dessen Aufgabe es ist, Schiffe abzuwracken, indem er sie in handliche Teile sägt – und das ist nach den ersten Blicken eine sehr unterhaltsame Aufgabe.
\n\nDer Trailer bringt dabei das Gefühl der Schwerelosigkeit und die Physik des Weltraums gut rüber. Und die mechanischen Designs sehen einfach fantastisch aus – kein Wunder, sind doch viele der Entwickler vom Homeworld-Studio „Relic Entertainment“ herüber gewechselt, und haben auch schon an Homeworld: Deserts of Kharak mitgearbeitet (das zwischenzeitlich auch mal Homeworld: Shipbreakers hieß).
\nDas ganze Setting bringt Erinnerungen an das leider gescheiterte Spiel Blackspace hervor – auch hier gab es Weltraum-Physik und kernige Action in einer optisch gefälligen Packung.
\nBlackbird Interactive hat bereits einige launige Videos für die Einführung neuer Hardspace: Shipbreaker-Abwrack-Astronauten in ihren Job veröffentlicht.
\n\nAktuell konzentriert sich das kleine Studio auf das Kernspiel – ob und wann Unterstützung für Multiplayer oder Virtual Reality hinzukommen, ließen die Entwickler bisher offen.
\nDas Spiel Hardspace: Shipbreaker ist jetzt schon bei Steam gelistet. Alles in allem können sich „Hard Sci-Fi“-Fans mal wieder auf ein Spiel freuen, bei dem sie ihre Kenntnisse aus Kerbal Space Program gut gebrauchen können.
\n…gibt es noch andere Spiele am Horizont, die „echtes“ Weltraum-Feeling versprechen:
\nAktuell sind mit dem bloßen Augen die Starlink-Satelliten von SpaceX gut zu sehen. Das Schauspiel sieht sehr beeindruckend aus:
\n", "content_encoded": "Aktuell sind mit dem bloßen Augen die Starlink-Satelliten von SpaceX gut zu sehen. Das Schauspiel sieht sehr beeindruckend aus:
\n\n\nEinen einzelnen Satelliten oder auch mal die ISS am Himmel zu sehen ist schwierig genug. Mit Starlink-Satelliten hat man da deutlich mehr Glück, denn die Idee ihres Erfinders Elon Musk war, sehr viele von ihnen sehr tief über der Erde kreisen zu lassen. Am Himmel bilden sie dann die sogenannten „Starlink-Trains“, eine gut erkennbare Kette an Leuchtpunkten, die mit hoher Geschwindigkeit hintereinander über den Nachthimmel ziehen.
\nDie schiere Zahl der Satelliten (und ihre jeweilige Position) kann man unter den SatFlare-Seiten für den Starlink3-Zug, den Starlink4-Zug, und den Starlink5-Zug erst richtig begreifen.
\nDie wichtigsten Voraussetzungen, um die Startlink-Satelliten zu finden:
\nNetterweise gibt es bei „Find Starlink“ eine Seite, die anhand der eigenen geografischen Positon auf der Erde errechnet, wann die obigen Voraussetzungen erfüllt sind – mit Ausnahme des Wetters. In Deutschland sind die Satelliten fast ausschließlich im Süden zu bewundern, und ziehen von Westen nach Osten (also genau andersherum als die Sonne wandert).
\nNicht jeder ist dabei so begeistert von diesem Schauspiel, wie unter anderem in dem Wikipedia-Eintrag zu Starlink nachzuschlagen ist: So zeigen sich Astronomen genervt, wenn durch ihre Himmelsbeobachtung diese Truppe von Satelliten rast (im folgenden Video zu bewundern ab Minute 2:10) wie ein Güterzug durch eine Dichterlesung:
\n\nUnd mancherorts führt die Sichtung der Satelliten auch zu Anrufen, ob nicht UFOs über der Erde kreisen.
", "link": "https://journal.3960.org/posts/2020-04-22-starlink-satelliten-beobachten/", "pubDate": "Wed, 22 Apr 2020 19:54:38 +0200", "atom_published": "2020-04-22T19:54:38+02:00", "atom_updated": "2020-04-27T15:41:11+02:00", "guid": "user/posts/2020-04-22-starlink-satelliten-beobachten/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Raumfahrt", "Geografie", "The Cool" ], "georss_point": "53.24877 10.39693" }, { "title": "SVG und Web Components", "description": "Web Components 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.
\nMit einigen kleinen Kniffen kann die Entwicklung solcher Komponenten noch schneller von der Hand gehen.
", "content_encoded": "Web Components 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.
\nMit einigen kleinen Kniffen kann die Entwicklung solcher Komponenten noch schneller von der Hand gehen.
\n\nFür den Einstieg in das Thema Web Components empfiehlt sich die Lektüre der ausgezeichneten Einführung von Google und CSS-Tricks. Andere Anleitungen basieren teilweise auf älteren Ideen, die getrost ignoriert werden können.
\nUpdate 2020–09: Die Vielzahl der Wege, wie man eine Web Component bauen kann, hat webcomponents.dev veranlasst, eine Auflistung aller möglichen Wege zum Erstellen einer Web Component zusammenzustellen.
\nAußerdem lohnt es sich immer, moderne Beispiele anzuschauen. Ich für meinen Teil habe entsprechend versucht, einen Horizontal Situation Indicator als Vanilla-JavaScript Web Component mustergültig zu bauen. Der daraus resultierende Quellcode der „Horizontal Situation Indicator“ Web Component wird im Rahmen dieses Artikels immer wieder als Beispiel herangezogen.
\n\nDie größte Hürde für den angehenden Komponenten-Bauer ist das Verständnis, wie all die schönen Teile zusammenpassen.
\nDa 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.
\nAls Beispiel nehmen wir einfach die fertige Implementation der HSI-Web-Component:
\n<horizontal-situation-indicator id="hsi" heading="45.0" heading-select="0.0"></horizontal-situation-indicator>\n
\nBeim Bau einer Web Component müssen neben dem Namen der Web Component auch die Attribute der Web Component und ihre möglichen Werte definiert werden.
\nDiese Attribute verwandeln sich innerhalb der JavaScript-Repräsentation der Web Component in Properties, die mit den Attributen synchronisiert sind:
\nconst el = document.getElementById('hsi');\nel.getAttribute('heading'); // "45.0"\nel.heading; // "45.0"\n\nel.setAttribute('heading', '60.0');\nel.getAttribute('heading'); // "60.0"\nel.heading; // "60.0"\n\nel.heading = '135.0';\nel.getAttribute('heading'); // "135.0"\nel.heading; // "135.0"\n
\nBei dem Zugriff auf eine Property mit einem -
im Namen funktioniert der Zugriff leicht anders:
el.getAttribute('heading-select');\n//el.heading-select existiert nicht\nel['heading-select']; // korrekte Schreibweise in `[]`\n
\nDie Schreibweise mit []
erlaubt auch den dynamischen Zugriff auf Properties:
let attrName = 'heading-select';\n\nel.getAttribute(attrName);\nel[attrName];\n
\nDarüber hinaus kann der Entwickler einer Web Component noch festlegen, dass die Komponente JavaScript-Methoden anbietet. Diese erlauben zum Beispiel von außen der Komponente zu befehlen, komplexe Prozesse innerhalb der Komponente zu erledigen.
\nel.synchronizeHeading();\n
\nDa JavaScript keine Sichtbarkeiten wie public
und private
für Methoden hat, hat sich als Konvention herausgebildet, private Methoden mit einem _
zu beginnen.
Außerdem kann eine Web Component noch JavaScript-Events erzeugen, die außerhalb der Komponente registriert werden können. So emittiert z.B. das <video>
-Tag Events, wenn ein Video beendet wurde, was ohne dieses Event außerhalb des Tags keiner wissen könnte.
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.
\nAm Einfachsten einzubinden sind die folgenden Dinge:
\nAlle anderen Ressourcen (Bilder, Videos, Töne) können mit einem Trick eingeschmuggelt werden: Mittels Data URLs können Binär-Dateien in Base64-Zeichenketten umgewandelt werden, die dann z.B. im src
-Attribut eines <img>
eingebunden werden können.
Besonders spannend: SVG-Bilder sind nicht nur schön kompakt in Bezug auf ihren Speicherplatz, sondern können auch direkt in das HTML eingebunden werden – benötigen also den Base64-Trick nicht.
\nIn 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 ein kleiner flotter Node.js-Mehrzeiler als Web Component Build Tool, der aus einzelnen Dateien die eigentliche Web Component zusammensetzt. Die Kurzfassung:
\nconst fs = require('fs');\n\nlet source = fs.readFileSync(`horizontal-situation-indicator.js`).toString();\nlet templateCss = fs.readFileSync(`src/horizontal-situation-indicator.css`).toString();\nlet templateSvg = fs.readFileSync(`src/horizontal-situation-indicator.svg`).toString();\n\nsource = source.replace(/(<style>).*(<\\/style>)/ms, templateCss);\nsource = source.replace(/(<\\/style>).*(`)/ms, templateSvg);\nfs.writeFileSync(`horizontal-situation-indicator.js`, source);\n
\nDas 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.
\nget
und set
für jede Property abkürzen?Da jeder Web Component eine Liste der zu synchronisierenden Attribute / Properties mit der Methode observedAttributes
bekannt gemacht werden muss, kann genau diese Liste im constructor
auch zum programmatischen Erzeugern von Gettern / Settern verwendet werden.
this.constructor.observedAttributes.forEach((attrName) => {\n Object.defineProperty(this, attrName, {\n get() {\n return this.getAttribute(attrName);\n },\n set(attrValue) {\n this.setAttribute(attrName, attrValue);\n }\n });\n});\n
\nDiese Methode hat in einigen Web-Components-Frameworks möglicherweise Nachteile – für die Vanilla-Nutzung ist sie aber weitestgehend ungefährlich.
\nDa 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 CSS-Variablen bzw. CSS-Custom-Properties. Innerhalb des CSS' des Komponente definiere ich sie direkt an der DOM-Wurzel der Komponente:
\n:host {\n --background-color: black;\n --foreground-color: white;\n --heading-select-color: cyan;\n --stroke-width: 0.5;\n}\n/*…und verwende diese CSS-Custom-Properties dann später in Variablen - bei mir z.B. als SVG-CSS-Eigenschaften:*/\n\n#background {\n fill: var(--background-color);\n}\n* {\n fill: var(--foreground-color);\n}\n*[stroke] {\n stroke-width: var(--stroke-width);\n}\n\n#heading-select {\n fill: var(--heading-select-color);\n}\n
\nWer nun auch immer diese Komponente verwendet, kann diese CSS-Custom-Properties von außen beeinflussen:
\nhorizontal-situation-indicator {\n --heading-select-color: red;\n --stroke-width: 1;\n}\n
\nBei der Beispiel-Implementation von <horizontal-situation-indicator>
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.
Ganz nebenbei haben wir für die Komponente eine weitere Schnittstelle geschaffen – in diesem Fall eine Styling-Schnittstelle.
\nUpdate: Andererseits können aber auch einzelne DOM-Knoten ohne CSS-Properties zum expliziten Styling freigegeben werden. Eine Anleitung zum Freigeben von DOM-Knoten aus dem Shadow-DOM zum CSS-Styling bei CSS-Tricks zeigt die notwendigen Anpassungen im HTML:
\n<div part="style-me">…</div>\n
\n…und dem CSS im Eltern-Dokument:
\nhorizontal-situation-indicator::part(style-me) {\n font-weight: bold;\n}\n
\nAuch hier hat wieder der Autor der Komponente die Herrschaft über die Elemente, die er nach außen freigibt – wie bei einer Schnittstelle.
\nDer eigentliche Clou der HSI Web Component 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.
\nBei SVG bieten sich die folgenden Operationen an:
\nstroke
und stroke-width
zur Beeinflussung von Linienfill
zur Veränderung der Füllfarbeopacity
zur Veränderung der Durchsichtigkeit eines Elementstransform
<text>
-Knoten mittels .textContent
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.
\nAuch das ist in der Beispiel-Implementation von <horizontal-situation-indicator>
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.
Da eine Web Component im Endeffekt eine Schnittstelle ist, muss es dazu eine Schnittstellen-Dokumentation geben. Ohne diese Dokumentation können andere Entwickler, die die Komponente verwenden möchten, nicht zuverlässig wissen, wie die Komponente zu bedienen ist.
\nAls Minimum muss eine Dokumentation enthalten:
\n## Properties\n\n| Name | Type | Default | Description |\n| -------------- | ------- | ------- | ------------ |\n| `heading` | `float` | `null` | Lorem ipsum… |\n\n## Methods\n\n| Name | Parameters | Description |\n| -------------- | ---------- | ------------------- |\n| `revHeading` | none | Lorem ipsum… |\n\n## Events\n\n| Name | Description |\n| -------------- | -------------------------------- |\n| `synchronized` | Lorem ipsum… |\n\n## Styling\n\n```css\ncomponent-name {\n --background: color; /* Lorem ipsum… */\n}\n\ncomponent-name::part(part-name) {} /* Lorem ipsum… */\n```\n
\nDer fertige Horizontal Situation Indicator als Web Component ist in einem GitHub-Repository gelandet, und einen Blick auf die fertige Implementation der HSI-Web-Component erlaubt einen interaktiven Blick auf die Zusammenhänge in der Komponente.
", "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": "„Tales from the Loop“ kommt als Fernsehserie", "description": "Der von mir hoch verehrte Künstler Simon Stålenhag hat es endlich geschafft: Nachdem sein wunderbarer erster Kunstband „Tales from the Loop“ bereits als Pen-&-Paper-Rollenspiel „Tales from the Loop“ umgesetzt wurde, folgt nun auf Amazon Prime die Fernsehserie „Tales from the Loop“:
\n", "content_encoded": "Der von mir hoch verehrte Künstler Simon Stålenhag hat es endlich geschafft: Nachdem sein wunderbarer erster Kunstband „Tales from the Loop“ bereits als Pen-&-Paper-Rollenspiel „Tales from the Loop“ umgesetzt wurde, folgt nun auf Amazon Prime die Fernsehserie „Tales from the Loop“:
\n\n\nSeine mystischen Welten, sind wunderschöne Orte, die voller Abenteuer stecken. Stålenhag erzählt in seinen ersten beiden Bildbänden „Tales from the Loop“ und „Things from the Flood“ von seiner Jugend im schwedischen Hinterland, die augenscheinlich von Teilchenbeschleunigern, schwebenden Schiffen, Mechs und Dinosauriern nur so gewimmelt hat – verbunden mit dem Schweden der 80er-Jahre.
\nNachdem das Computerspiel „Generation Zero“ nur Teile seiner Ideen und auch nicht vollkommen überzeugend umgesetzt hatte, steigt hoffentlich jetzt auch der Wille, mal ein schönes Adventure-Game für PC und/oder Konsole im Universum von „Tales from the Loop“ umzusetzen (zum Beispiel im Stil von „The Long Dark“).
", "link": "https://journal.3960.org/posts/2020-03-11-tales-from-loop-kommt-als-fernsehserie/", "pubDate": "Wed, 11 Mar 2020 18:21:59 +0100", "atom_published": "2020-03-11T18:21:59+01:00", "atom_updated": "2020-04-29T14:33:49+02:00", "guid": "user/posts/2020-03-11-tales-from-loop-kommt-als-fernsehserie/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Fernsehserie", "Outdoor", "The Cool" ], "georss_point": "59.342031 17.522163" }, { "title": "Migrants", "description": "", "content_encoded": "", "link": "https://journal.3960.org/posts/2020-01-19-migrants/", "pubDate": "Sun, 19 Jan 2020 18:09:37 +0100", "atom_published": "2020-01-19T18:09:37+01:00", "atom_updated": "2020-01-19T18:09:37+01:00", "guid": "user/posts/2020-01-19-migrants/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Geckobar", "Raumfahrt", "The Cool" ] }, { "title": "Der Microsoft Flight Simulator 2020 – und was er bewirken wird", "description": "Microsoft hat vor Kurzem den neuesten Teil ihrer weltberühmten Flight Simulator-Serie angekündigt. Innerhalb kürzester Zeit war der Microsoft Flight Simulator 2020 in aller Munde – nicht zuletzt wegen seines spektakulären Trailers:
\n\nNachdem sich der Staub etwas gelegt hat und immer mehr Informationen über dieses (augenscheinlich seit fünf Jahren im Geheimen produzierte) Projekt an die Öffentlichkeit dringen, gibt es eine erste Ahnung, was MSFS2020 für das Hobby der Flug-Simulation bedeuten kann.
", "content_encoded": "Microsoft hat vor Kurzem den neuesten Teil ihrer weltberühmten Flight Simulator-Serie angekündigt. Innerhalb kürzester Zeit war der Microsoft Flight Simulator 2020 in aller Munde – nicht zuletzt wegen seines spektakulären Trailers:
\n\nNachdem sich der Staub etwas gelegt hat und immer mehr Informationen über dieses (augenscheinlich seit fünf Jahren im Geheimen produzierte) Projekt an die Öffentlichkeit dringen, gibt es eine erste Ahnung, was MSFS2020 für das Hobby der Flug-Simulation bedeuten kann.
\n\nDer aus dem Jahre 2006 stammende letzte Simulator aus dem Hause Microsoft war der Microsoft Flight Simulator X – ein in seiner Zeit bahnbrechendes Stück Software, dass für lange Zeit den Maßstab für private Flug-Simulation gesetzt hatte.
\nDie Jahre gingen ins Land, und der FSX verstaubte mehr und mehr: Die Grafik, das Flugmodell, alleine der Nachschub an Patches – all dies machte FSX trotz einer treuen Fangemeinde langsam überholt. Alle warteten auf einen Nachfolger.
\n2012 erschien das Flugspiel Microsoft Flight. Die Annahme, dass es eine Fortsetzung des FSX sein würde, wurden enttäuscht. Stattdessen handelte es sich um ein vereinfachtes Spiel, dass Simulationsfreunde nicht zufrieden stellen konnte.
\nAls weitere Signale schloss Microsoft 2009 das für den FSX verantwortliche Studio, und lizensierte die Engine an andere Unternehmen, die mehr oder weniger würdige Nachfolger für den Flight Simulator produzierten. Keines dieser Produkte konnte aber bahnbrechende Erfolge feiern.
\nSimulationsfreunden wurde klar, dass von Microsoft nichts mehr zu erwarten sein würde. So zog die Herde weiter, unter anderem zu X-Plane 11, oder schwelgte mit Prepar3d in Nostalgie.
\nDas alles änderte sich schlagartig mit den ersten Trailern für den Microsoft Flight Simulator 2020, die für alle überraschend nicht nur einen bereits sehr fertig wirkenden Simulator zeigte.
\nDie Trailer zeigten ein Flugerlebnis, das vor allen Dingen außerhalb der Simulations-Gemeinde Interesse an MSFS2020 weckte. In persönlichen Gesprächen mit Gamern zeigte sich, dass Microsoft einen Nerv getroffen hatte: Auch Spieler ohne Vorerfahrung mit Flugsimulatoren interessierten sich auf einmal brennend für den MSFS2020. Die ansprechende Grafik und die einsteigerfreundliche Präsentation machten Lust auf mehr.
\nUnd die alten Simulationshasen? Immer, wenn der Hype-Train durch den Ort brauste, saßen sie erstmal gemütlich auf der Veranda und beobachteten das Spektakel skeptisch vom Rand aus. So auch diesmal: Viele hatten Microsoft ihre vorherigen Fehler in Bezug auf Flugsimulatoren nie verziehen.
\nMicrosoft war von vorne herein bewusst, dass ihr Verhalten der Vergangenheit viel Porzellan zerschlagen und bei Simulations-Enthusiasten Skepsis und Misstrauen hinterlassen hatte. Schon früh hatte Microsoft deswegen den Austausch mit der Community gestartet, und ein offenes Ohr für Ideen und Wünsche gezeigt. Doch alleine damit ließen sich nicht alle Zweifel zerstreuen – Fakten mussten her.
\nIn einem PR-Meisterstreich lud Microsoft darauf hin ausgesuchte Simfluencer, Flug-Blogger sowie Fachpresse zu einem Event ein, bei der sie nicht nur das frühe Produkt selber ausprobieren konnten, sondern auch mit den Entwicklern des Microsoft Flight Simulator 2020 direkt ins Gespräch kommen konnten.
\n\nOb es in dem Youtube-Video von FlightChops, dem Youtube-Video von Frooglesim oder dem Artikel auf Helisimmer.com ist: Alle Simfluencer konnten nicht verbergen, dass Microsoft ihre Skepsis in Begeisterung und Vorfreude verwandelt hatte.
\nDa die ersten Erfahrungen mit dem MSFS2020 vorliegen, verdichtet sich ein Bild.
\nAlles in allem scheint der Microsoft Flight Simulator 2020 aller Voraussicht nach einen neuen Standard für den Bereich der Heim-Flugsimulatoren setzen zu können.
\nDer MSFS2020 bedeutet für etablierten Flugsimulatoren eine ernsthafte Konkurrenz. Gerade die Simulatoren, die ebenfalls die hochgradig realistische Zivil-Fliegerei abbilden, müssen sich sehr warm anziehen:
\nEine Chance haben dagegen Simulations-Projekte, die leicht außerhalb des Fokus liegen – wenn sie ihre Karten gut spielen:
\nFür alle Simulatoren kann ein Weg sein, die Power des Internets zu nutzen:
\nWie die einzelnen Simulatoren sich entwickeln hängt aber neben dem Produkt und dem Verhalten des Herstellers nicht zuletzt von der jeweiligen Community ab – ein schwer einzuschätzender Faktor. Schon bei FSX konnte man beobachten, dass ein technisch und funktional schon lange abgehängtes Produkt immer noch erfolgreich sein kann.
\nAlles in allem wird 2020 ein spannendes Jahr für die Flugsimulationsgemeinde – sei es für die Hersteller, sei es für die Schreibtisch-Flieger. Auf jeden Fall wird der MSFS2020 neue Impulse setzen, und das Hobby der virtuellen Fliegerei schlagartig einem vollkommen neuen Kreis von Nutzern eröffnen.
\nAuch Simulationsfreunde, die nicht auf MSFS2020 setzen werden, werden seine Auswirkungen früher oder später auch in ihrem Lieblings-Simulator erleben.
", "link": "https://journal.3960.org/posts/2019-10-12-microsoft-flight-simulator-2020-was-er-bewirken-wird/", "pubDate": "Sat, 12 Oct 2019 18:20:22 +0200", "atom_published": "2019-10-12T18:20:22+02:00", "atom_updated": "2021-01-01T10:28:40+01:00", "guid": "user/posts/2019-10-12-microsoft-flight-simulator-2020-was-er-bewirken-wird/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "MSFS2020", "Fliegerei", "Für Tumblr", "Meinung", "Simulation", "Spiel", "The Cool", "Aerofly FS2", "X-Plane", "DCS" ] }, { "title": "Network communication in Exapunks", "description": "\nSending and receiving messages in Exapunks is a tricky business. Timing problems can ruin the proper execution of your Axiom code.
", "content_encoded": "\nSending and receiving messages in Exapunks is a tricky business. Timing problems can ruin the proper execution of your Axiom code.
\n\nConsider these two Exas trading messages via the M
register. Exa XA
reads from a file and sends them to the network register M
…
NOTE XA - SENDER\nGRAB 199\nMARK READING\n COPY F M\n TEST EOF\n FJMP READING\n
\n…where XB
reads from M
and writes these messages to another file:
NOTE XB - RECEIVER\nMAKE \nMARK WRITING\n COPY M F\n TEST MRD\n TJMP WRITING\n
\nAs you can see, XA
tests for the end of file (EOF
), while XB
tests for receivable messages (MRD
). This seems to be rather well designed, but most often ends up in XB
never finishing its job because there is nothing waiting in M
when TEST MRD
is executed. Why is that?
Transfers via the M
register are not instantaneous. Before writing to M
it needs to be empty, before reading from M
the corresponding write operation has to be finished.
NOOP
for timingOne solution for timing issues is to add additional NOOP
commands in your writing loop, telling your receiver to wait until the sender is back online.
NOTE XB - RECEIVER\nMAKE \nMARK WRITING\n COPY M F\n NOOP \n NOOP \n TEST MRD\n TJMP WRITING\n
\nIf the job of XA
is to just read its file and die afterwards, your programme could be written even more compact:
NOTE XA - SENDER\nGRAB 199\nMARK READING\n COPY F M\n JUMP READING\nNOTE CRASH AND BURN AT END OF FILE\n
\n…with XB
having to wait one operation less than before:
NOTE XB - RECEIVER\nMAKE \nMARK WRITING\n COPY M F\n NOOP \n TEST MRD\n TJMP WRITING\n
\nBy a rule of thumb the number of instructions in your receiver loop after your last read from M
and before doing TEST MRD
has to be as many instructions as it takes the sender to reach its next write to M
after its last write to M
.
If you do not want to think about timing, the receiving XB
can test for a marker which tells it that the end of the message has been reached.
This only works if you know for sure that the file you are reading from never contains the symbol 0
, as XA
will use this as its „End Of Message“ message (EOM
):
NOTE XA - SENDER\nGRAB 199\nMARK READING\n COPY F M\n TEST EOF\n FJMP READING\nNOTE EOF, SEND EOM\nCOPY 0 M\n
\nThe receiver XB
now copies the message to T
, from where it is written into the file and is also executable from TJMP
or FJMP
. Remember: If T
is 0
, it is evaluated to false
– all other values will evaluate to true
.
NOTE XB - RECEIVER\nMAKE \nMARK WRITING\n COPY M T\n COPY T F\n NOTE TEST EOM FROM `T`\n TJMP WRITING\nNOTE DELETE EOM FROM FILE\nSEEK -1\nVOID F\n
\nIf XA
knows the file size it is reading to the network in advance, it is a very clever trick to send the file size to the receiver XB
as well. This way the XB
does not have to test for the message to end, but will know when all message chunks have been delivered.
XA
will send the message size to XB
and use it for its own loop:
NOTE XA - SENDER\nGRAB 199\nNOTE `T` CONTAINS THE NUMBER OF CHUNKS TO READ\nCOPY T M\nMARK READING\n COPY F M\n NOTE COUNT DOWN REMAINING CHUNKS\n SUBI T 1 T\n TJMP READING\n
\nXA
and XB
will have the same loop conditions:
NOTE XB - RECEIVER\nMAKE \nNOTE NOW `T` CONTAINS THE MESSAGE SIZE\nCOPY M T\nMARK WRITING\n COPY M F\n NOTE COUNT DOWN REMAINING CHUNKS\n SUBI T 1 T\n TJMP WRITING\n
\nFor bullet-proof communication your best choice is to have XA
send a „keep alive message“…
NOTE XA - SENDER\nGRAB 199\nMARK READING\n COPY F M\n TEST EOF\n NOTE SEND RESULT OF TEST TO M...\n COPY T M\n NOTE ...AND USE RESULT FOR YOUR OWN LOOP\n FJMP READING\n
\n…to XB
:
NOTE XB - RECEIVER\nMAKE \nMARK WRITING\n COPY M F\n NOTE USE TEST RESULT TO TEST FOR YOURSELF\n TEST M = 1\n FJMP WRITING\n
\nEvery reading cycle XB
reads two messages from M
, where the second message contains 0
if XA
reached the end of its file. In this manner XB
continues to wait for messages as long as XA
explicitly tells it to by sending 1
in the second message.
This lets you skip all timing issues on the expends of more writes to the M
register. It adds just one extra line of Axiom code (but one less than having to NOOP
), but may end up producing more cycles.
If you are facing a multi-sender communication, things may get hairy. In this scenario, multiple senders transmit data to one receiver, which has to combine these messages into a single on.
\nAbove solutions may apply, but if you are forced to deal with different message lengths which need to be combined, if may become very tricky to shut down the other sender as well, so your receiver stops its receiving cycle.
\nImagine a scenario where first sender XA
knows when to quit, but second sender XB
does not; in this case, receiver XC
may go on receiving messages from XB
ad infinitum.
To solve this problem, XA
could literally use the KILL
command to shut down XB
. You may even opt to kill the receiver XC
as well with this method.
Update 2018–09–06: Added section for „End Of Message“ & „Packet Size“.
\nUpdate 2018–09–16: Added section for „Terminator“
", "link": "https://journal.3960.org/posts/2018-08-22-network-communication-exapunks/", "pubDate": "Wed, 22 Aug 2018 19:16:07 +0200", "atom_published": "2018-08-22T19:16:07+02:00", "atom_updated": "2022-06-17T12:12:47+02:00", "guid": "user/posts/2018-08-22-network-communication-exapunks/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Exapunks", "Programmierung", "Spiel", "Anleitung", "The Cool" ] }, { "title": "Code patterns for Exapunks", "description": "\nYou might have noted my new infatuation with the hacking game Exapunks by Zachtronics. Being a programmer myself I could not help but write up some coding standards for Exapunks' programming language „Axiom“. 😎 Oh, and some loop patterns which might get you kickstarted on your next hack.
", "content_encoded": "\nYou might have noted my new infatuation with the hacking game Exapunks by Zachtronics. Being a programmer myself I could not help but write up some coding standards for Exapunks' programming language „Axiom“. 😎 Oh, and some loop patterns which might get you kickstarted on your next hack.
\n\nEven though the Axiom language seems not to be overly complex, it pays to have a proper coding style:
\nNOTE
for comments. This will help you later on to identify the phase your EXA is supposed to be in.READ_FILE
or RECEIVE_DATA
.MARK
and @REP
.TJMP
, FJMP
, JUMP
– and before @END
.So this…
\nGRAB 199\nMARK READING\nTEST F = X\nSEEK 2\nFJMP READING\nSEEK -2\nCOPY F X\n
\n…becomes this:
\nNOTE X IS ENTRY WE ARE SEARCHING FOR\nGRAB 199\nMARK READING\n TEST F = X\n NOTE ADVANCE FILE HEADER TO NEXT LINE\n SEEK 2\n FJMP READING\n\nNOTE GET THE NEXT ENTRY FROM FILE\nSEEK -2\nCOPY F X\n
\nBecause Exapunks' Axiom language is very basic, I found some patterns for me which emulate constructs from other programming languages.
\nAs there are no WHILE
loops, a combination of TEST
and jump labels will do the trick:
COPY 10 X\nMARK WHILE\n NOTE DO STUFF\n SUBI X 1 X\n TEST X > 1\n TJMP WHILE\n
\nRemember: If T
evaluates to 0
, the next TJMP
/ FJMP
instruction will pick this up. Above listing could be written as:
COPY 10 T\nMARK WHILE\n NOTE DO STUFF\n SUBI T 1 T\n TJMP WHILE\n
\nObviously this only makes sense if there are more cycles to perform than lines of code needed for this construct, and/or you do not know in advance how many times the loop will be performed. Otherwise you might want to write out loops:
\nAs „Trash World News“ states in its November 1997 issue: Sometimes it is faster not to use loops. This loop will need almost 10 cycles:
\nMARK LOOP\n COPY X F\n ADDI X 1 X\n TEST X > 2\n FJMP LOOP\n
\nThe same loop could be written as:
\nCOPY 0 F\nCOPY 1 F\nCOPY 2 F\n
\nFor writing bigger blobs of repeating commands consider the @REP
and @END
commands:
@REP 3\n COPY @{0,1} F\n@END\n\nNOTE WILL BE EXPANDED TO\nNOTE COPY 0 F\nNOTE COPY 1 F\nNOTE COPY 2 F\n
\n\nUsing loops you can quickly read files:
\nGRAB 199\nMARK READING\n COPY F M\n TEST EOF\n FJMP READING\n
\nIf you are searching for a specific entry, you can test for the value at the file pointer without having to copy F
to some internal register:
NOTE X IS ENTRY WE ARE SEARCHING FOR\nGRAB 199\nMARK READING\n TEST F = X\n FJMP READING\nNOTE GET THE NEXT ENTRY FROM FILE\nNOTE YOU MIGHT WANT TO USE `SEEK` TO MOVE THE FILE POINTER\nCOPY F X\n
\nYou can speed up searches in files by skipping rows. This needs more instructions, but in long files this will speed up the process:
\nNOTE X IS ENTRY WE ARE SEARCHING FOR\nGRAB 199\nMARK READING\n TEST F = X\n NOTE ADVANCE FILE HEADER TO NEXT LINE, SAVING 2 LOOPS\n SEEK 2\n FJMP READING\nNOTE GET THE NEXT ENTRY FROM FILE\nSEEK -2\nCOPY F X\n
\nIn files you can read and delete at the same time. Well, almost, as you need to set the file pointer back for deleting the chunk you just read:
\nMARK GET_IT_OUT\n NOTE DO STUFF WITH F\n COPY F M\n SEEK -1\n VOID F\n TEST EOF\n FJMP GET_IT_OUT\n
\n\nIf you have to halt your EXA anyway after completing its loop, you may choose to deliberately crash it on exit. Reading a file, this can be easily achieved by reading past the file end. So this…
\nGRAB 200\nMARK READ_FILE\n COPY F M\n TEST EOF\n FJMP READ_FILE\nHALT \nNOTE `HALT` ALSO DOES `DROP`\n
\n..becomes this:
\nGRAB 200\nMARK READ_FILE\n COPY F M\n JUMP READ_FILE\nNOTE CRASH AND BURN ON EOF\nNOTE CRASH ALSO DOES `DROP`\n
\nSadly you cannot crash a network transfer. So have a look on Exapunks' network communication patterns on how to solve these.
\nZachtronics published a guide on how to create new levels for Exapunks. Being a game for programmers, building levels (called „virtual network“) is done by programming… in Javascript.
\nThe community is already at work: You will find new levels in the Exapunk Steam Workshop.
", "link": "https://journal.3960.org/posts/2018-08-18-code-patterns-for-exapunks/", "pubDate": "Sat, 18 Aug 2018 19:42:53 +0200", "atom_published": "2018-08-18T19:42:53+02:00", "atom_updated": "2018-09-03T19:00:09+02:00", "guid": "user/posts/2018-08-18-code-patterns-for-exapunks/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Exapunks", "Programmierung", "Spiel", "Anleitung", "The Cool" ] }, { "title": "Exapunks – Spielen und programmieren", "description": "\nIch fröne gerne etwas merkwürdigen Spielen wie U-Boot-Simulationen, Flug-Simulatoren oder Abenteuern in der kanadischen Wildnis. Dementsprechend habe ich mir wieder ein kleines Nischen-Spiel vorgenommen: „Exapunks“ von Zachtronics.
", "content_encoded": "\nIch fröne gerne etwas merkwürdigen Spielen wie U-Boot-Simulationen, Flug-Simulatoren oder Abenteuern in der kanadischen Wildnis. Dementsprechend habe ich mir wieder ein kleines Nischen-Spiel vorgenommen: „Exapunks“ von Zachtronics.
\n\nIn Exapunks übernehmt ihr die Rolle eines Hackers, der um sein Leben hacken muss: Ihr leidet an einer Krankheit, und die Medikamente dafür sind teuer. Glücklicherweise habt ihr einen mysteriösen Kontakt, der euch mit Jobs versorgt, die eure Rechnungen bezahlen.
\nDie Jobs sind dabei sehr unterschiedlich: Mal hackt ihr einen Erdnussriegel-Fabrik (um das Rezept zu verändern) oder den lokalen Pizza-Laden (um eure Bestellung in der Warteschlange nach vorne zu befördern) – dann brecht ihr aber auch in Buchhaltungssysteme von Copy-Shops oder die Geldautomaten von Banken ein. Das alles wird in einem lässigen Grafik-Stil und passender Musik-Untermalung präsentiert.
\n\nDer eigentliche Clou ist das Hacking. Während andere Spiele (wie z.B. Deus Ex oder Uplink) das Hacken eher abstrakt halten, geht Exapunks in die Tiefe – wie auch schon seine geistigen Vorgänger von Zachtronics, u.a. Shenzhen I/O. Ihr lernt eine einfache Programmiersprache namens Axiom, mit dem ihr eure Execution Agents (EXA) in fremde Systeme schickt. Im Endeffekt programmiert ihr eure EXAs vor jedem Raubzug, und schaut ihnen dann zu, wie sie mit diesem Programm den eigentlichen Hack durchziehen.
\nEin solches Axiom-Programm ist am Anfang trivial…
\nNOTE GRAB FILE 200 ON FIRST HOST\nLINK 800\nGRAB 200\nNOTE DROP FILE ON SECOND HOST\nLINK 800\nDROP \n
\n…kann aber schnell einige Komplexität annehmen:
\nNOTE READ LAST CHUNK OF FILE 200 TO FIND START POSITION\nGRAB 200\nSEEK 9999\nSEEK -1\nCOPY F X\n\nNOTE SET FILE POINTER TO START POSITION\nSEEK -9999\nSEEK X\n\nNOTE READ FILE 200 TO OTHER EXA VIA REGISTER M\nMARK READING\n COPY F M\n TEST EOF\n FJMP READING\n\nDROP \nNOTE DONE\n
\nSo versucht ihr durch euer Programm die beschriebene Aufgabe zu lösen, um danach mit dem selben Programm unzählige Testfälle mit einer leicht veränderte Ausgangslage zu absolvieren. Das Prinzip ist dabei so ähnlich wie bei Code Wars: Ihr schaut euch nicht wirklich jeden der einhundert Testfälle an, sondern baut euer Programm schraubengenau nach Spezifikation, und schon kann euch nichts passieren.
\n\nAls großer Motivator kommt hinzu, dass die eigenen Lösungen in Bezug auf Komplexität und Laufzeit mit Lösungen anderer Exapunks-Spieler verglichen werden. So steigt der Spaß, das Programm weiter zu verfeinern, um jede Optimierungsmöglichkeit erwischt zu haben.
\nDarüber hinaus sind in dem Spiel weitere Minispiele versteckt, die man freiknobeln muss. Diese Minispiele für sich machen ebenfalls einen Heidenspaß – oder sind zumindest eine nette Dreingabe.
\nUnd nicht zuletzt fühlt man sich wie ein König, wenn man nach langer Tüftelei eine funktionsfähige und performante Lösung gebaut hat.
\nEinen guten Einblick in Exapunks zeigt übrigens das „Let's play“ von Scott Manley:
\n\nExapunks ist bestimmt kein Spiel für jedermann. Wenn ihr aber auf Knobelei und Programmierung steht, und Hackingspiele mögt, sollte Exapunks nicht in eurer Sammlung fehlen. Nebenbei ist das Spiel preisgünstig zu haben.
", "link": "https://journal.3960.org/posts/2018-08-17-exapunks-spielen-programmieren/", "pubDate": "Fri, 17 Aug 2018 19:41:52 +0200", "atom_published": "2018-08-17T19:41:52+02:00", "atom_updated": "2018-11-29T12:32:56+01:00", "guid": "user/posts/2018-08-17-exapunks-spielen-programmieren/index.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Exapunks", "Programmierung", "Review", "Spiel", "The Cool" ] }, { "title": "Die ersten Schritte mit dem Windows Mixed Reality Headset", "description": "Neben den Modellen von Oculus/Facebook und HTC/Valve gibt es eine weitere Familie von Virtual-Reality-Brillen: Die Microsoft Mixed Reality Headsets. Ein paar erste Einsteiger-Tipps helfen euch beim Erkunden der virtuellen Realität mit WMR-Brillen.
", "content_encoded": "Neben den Modellen von Oculus/Facebook und HTC/Valve gibt es eine weitere Familie von Virtual-Reality-Brillen: Die Microsoft Mixed Reality Headsets. Ein paar erste Einsteiger-Tipps helfen euch beim Erkunden der virtuellen Realität mit WMR-Brillen.
\n\nWindows Mixed Reality Headsets werden von den unterschiedlichsten Herstellern produziert. HP, Asus, Acer, Samsung, Lenovo und viele andere Hersteller haben nach Vorgaben von Microsoft ihre ganz eigene Variante dieser Brille herausgebracht. Alle Headsets werden von WMR-kompatibler Software gleich behandelt. Die mitgelieferten Controller sind dabei zumeist unabhängig vom Hersteller der Brille immer identisch – nur HP und Samsung haben ihre Controller angepasst.
\nIm Gegensatz zur Oculus Rift und HTC Vive braucht die Brille keine zusätzlichen Sensoren außerhalb der Brille – die Brille orientiert sich über zwei eingebaute Kameras, und findet auch die beiden Controller über die Kameras.
\nEinziger Nachteil dieser Methode: Euer Spielfeld sollte gut ausgeleuchtet sein, denn im Dunkeln sehen die Kameras nichts. Auch zu helles Sonnenlicht bringt die Brille augenscheinlich durcheinander, zumal sie dann die LEDs an den Controllern nicht mehr richtig wahrnimmt. Und die Controller können außerhalbd es Erfassungsbereichs der Kameras ungenauer getrackt werden.
\nEs gibt aber auch klare Vorteile: Das System ist sehr transportabel, und kann schnell in einer neuen Umgebung oder an einem neuen Rechner eingerichtet werden. Man steckt einfach das HDMI/Displayport- und USB-Kabel der Brille an, verbindet die Controller mit dem PC, und nach einem nur Sekunden dauernden Einmessen des virtuellen Spielfeldes ist man bereits einsatzbereit. So kann man auch in der eigenen Wohnung schnell ein neues Spielfeld abstecken (z.B. wenn man statt stehend mal am Schreibtisch spielen möchte), und auch außerhalb des Spielfelds die Brille noch benutzen, solange man sich im selben Raum befindet.
\nBei einigen WMR-Headsets gibt es eine weitere Einschränkung: Der Pupillenabstand kann nicht komplett frei verstellt werden. Ihr könnt nur über einen Software-Regler das Bild in der Brille verschieben, nicht aber die eigentliche Optik. Das bedeutet: Wenn eurer Pupillenabstand zu groß (oder zu klein) ist, könnt ihr kein scharfes Bild erwarten – ein erheblicher Nachteil.
\nVoraussetzungen für den Betrieb einer WMR-Brille sind neben einem leistungsfähigen PC folgende Dinge:
\nDie Controller werden mit handelsüblichen AA/Mignon-Batterien betrieben. Der erste Satz Batterien wird mitgeliefert, langfristig ist ein Austauschset an 1,5V-Akkus eine sinnvolle Anschaffung – handelsübliche Akkus haben in der Regel zu wenig Spannung.
\nAls erstes Programm benötigt man das Microsoft Mixed Reality Portal. Dies wird in der Regel automatisch installiert, sobald man die Brille ansteckt. Die Software erlaubt euch, euren Spielbereich abzustecken, und erläutert danach die Bedienung. Nach dieser kurzen Prozedur findet man sich in Microsofts virtuellem „Cliff House“ wieder, von dem man weitere Microsoft-VR-Apps starten kann.
\nWie K-Win noch herausgefunden hat, sollte man die Grafik-Qualität und den Augenabstand im Windows Mixed Reality Portal anpassen. Beides findet ihr unter Settings > Mixed Reality > Headset display
. Mit den korrekten Einstellungen wird das Bild deutlich klarer.
In dem „Cliff House“ kann man sich Links zu Applikationen als Gegenstände in die Landschaft stellen – zum Beispiel zu Spielen oder auch zu SteamVR, wenn es installiert ist.
\nUm die WMR-Headsets unter Steam nutzen zu können, muss „Steam VR“ und Windows Mixed Reality for Steam VR installiert sein. Die letztere Software sorgt dafür, dass eure Controller für Steam-Spiele wie HTC-Vive-Controller funktionieren. Somit funktionieren die WMR-Brillen generell mit so ziemlich jedes Steam-VR-Spiel.
\nSobald Steam VR installiert ist, reicht ein Anklicken von „Windows Mixed Reality for Steam VR“, um statt Microsofts Cliff House das Steam Home zu starten. Von dem Steam Home aus kann man nun komfortabel alle VR-fähigen Steam-Spiele starten. Interessanterweise braucht man „Steam VR“ auch für einige Spiele, die nicht über Steam heruntergeladen werden, aber VR-Unterstützung haben. So benötigen die Stand-Alone-Versionen von „Elite: Dangerous“, „Digital Combat Simulator“ und „X-Plane 11“ trotzdem „Steam VR“.
\nDarüber hinaus habt ihr nun die Möglichkeit, die Belegung eurer Controller in Steam zu ändern. Dies ist sehr praktisch, da nicht alle für den Vive-Controller optimierten Spiele das Maximum aus euren WMR-Controllern herausholen.
\nSpiele, die eigentlich exklusiv für die Oculus Rift gedacht sind, kann man übrigens über ein Programm namens Revive benutzen. 😉
\nFalls ihr noch keine VR-fähigen Spiele in Steam habt, könnt ihr ein paar kostenlose Applikationen ausprobieren:
\nMöglicherweise habt ihr aber bereits Spiele in eurer Bibliothek, die für VR geeignet sind. Ich persönlich vertreibe mir z.B. die Zeit mit Aerofly FS2, dass in VR ein wirklich imposantes Erlebnis ist – aber auch Elite Dangerous und „Payday 2“ funktioniert ganz sagenhaft in VR.
\nAnsonsten gibt es wunderbare Spiele zum Einstieg in die VR-Welt zu kaufen. So ist zum Beispiel „Beat Saber“ quasi das Tetris unter den VR-Spielen und sollte in keiner Sammlung fehlen.
\nDie Windows Mixed Reality Headsets sind ein guter und vor allen Dingen unkomplizierter Einstieg in die virtuelle Realität. Mit kleinen Tricks sind mit WMR-Headsets auch Spiele für HTC/Valve- oder Oculus-VR-Headsets spielbar.
\nUpdate 2021: Artikel auf den Stand der Technik angepasst.
", "link": "https://journal.3960.org/posts/2018-04-22-ersten-schritte-mit-windows-mixed-reality-headset/", "pubDate": "Sun, 22 Apr 2018 20:06:41 +0200", "atom_published": "2018-04-22T20:06:41+02:00", "atom_updated": "2021-07-13T08:20:54+02:00", "guid": "user/posts/2018-04-22-ersten-schritte-mit-windows-mixed-reality-headset.md", "author": "info@3960.org (Frank Boës)", "categories": [ "Virtual Reality", "Geckobar", "Spiel", "Technologie", "The Cool", "Für Tumblr", "Aerofly FS2" ] } ] } }