<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://tippvomtibb.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+T.+Ludwig</id>
	<title>TippvomTibb - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://tippvomtibb.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+T.+Ludwig"/>
	<link rel="alternate" type="text/html" href="https://tippvomtibb.de/mediawiki/Spezial:Beitr%C3%A4ge/Chris_T._Ludwig"/>
	<updated>2026-08-04T12:06:41Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Multifunktionstester_Tooltop_ET616/ET618&amp;diff=5242</id>
		<title>Multifunktionstester Tooltop ET616/ET618</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Multifunktionstester_Tooltop_ET616/ET618&amp;diff=5242"/>
		<updated>2026-08-02T20:33:51Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Deutsche Übersetzung des Originalhandbuchs „Multifunctional Tester User Manual“ (Art.-Nr. 501061802 V2). Technische Zeichnungen wurden als SVG-Vektorgrafiken neu erstellt; Beschriftungen, die tatsächlich auf dem Gehäuse des Geräts aufgedruckt sind (z.&amp;amp;nbsp;B. &#039;&#039;&#039;MAIN&#039;&#039;&#039;, &#039;&#039;&#039;LENGTH&#039;&#039;&#039;, &#039;&#039;&#039;MODE&#039;&#039;&#039;, &#039;&#039;&#039;SCAN&#039;&#039;&#039;, &#039;&#039;&#039;DMM&#039;&#039;&#039;), wurden bewusst nicht übersetzt, damit sie mit dem realen Gerät übereinstimmen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Rechte vorbehalten. Gedruckt in China. Technische Änderungen ohne vorherige Ankündigung vorbehalten. Alle Produktnamen sind Warenzeichen der jeweiligen Unternehmen. Art.-Nr.: 501061802 V2&lt;br /&gt;
&lt;br /&gt;
Ein Review steht noch aus!&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsinformationen ==&lt;br /&gt;
&lt;br /&gt;
Diese Geräteserie erfüllt IEC1010 (International Electrotechnical Commission). Bitte lesen Sie vor der Benutzung die Sicherheitsinformationen.&lt;br /&gt;
&lt;br /&gt;
Lesen Sie die technischen Daten sorgfältig durch. Nur Modelle mit Multimeterfunktion dürfen zur Messung von Gleich-/Wechselspannung und -strom ab 36&amp;amp;nbsp;V eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Messen Sie niemals Spannungen ab 36&amp;amp;nbsp;V (außer PoE), wenn das Modell keine Multimeterfunktion besitzt. Diese Spannungen stellen eine Stromschlaggefahr dar.&lt;br /&gt;
&lt;br /&gt;
# Geben Sie bei der Spannungsmessung niemals mehr als 1000&amp;amp;nbsp;V DC bzw. 400&amp;amp;nbsp;V AC (Effektivwert) ein. Geben Sie bei der Strommessung niemals mehr als 10&amp;amp;nbsp;A ein.&lt;br /&gt;
# Bis 36&amp;amp;nbsp;V ist das Gerät sicher. Prüfen Sie zur Vermeidung eines Stromschlags den Anschluss und die Isolierung der Prüfleitungen, bevor Sie Spannungen ab 36&amp;amp;nbsp;V DC bzw. 25&amp;amp;nbsp;V DC messen.&lt;br /&gt;
# Entfernen Sie die Prüfleitungen vom Messpunkt, bevor Sie Funktion oder Messbereich wechseln.&lt;br /&gt;
# Das Gerät verfügt bereits über einen vollständigen Schutz. Wählen Sie dennoch aus Sicherheitsgründen stets die richtige Funktion und den richtigen Messbereich.&lt;br /&gt;
# Sicherheitssymbole:&lt;br /&gt;
:[[File:icon_warning.svg|24px]] Gefährliche Spannung, bitte Benutzerhandbuch beachten.&lt;br /&gt;
:[[File:icon_earth.svg|24px]] Erde/Masse.&lt;br /&gt;
:[[File:icon_lowbattery.svg|24px]] Batteriespannung niedrig.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;&lt;br /&gt;
# Verwenden Sie das Gerät nicht, wenn es beschädigt aussieht und/oder sich ungewöhnlich verhält. Der Schutz des Geräts kann beeinträchtigt sein, wenn es beschädigt oder auffällig wirkt.&lt;br /&gt;
# Überschreiten Sie den Messbereich nicht. Andernfalls können Anwender verletzt und das Gerät beschädigt werden.&lt;br /&gt;
# Verwenden Sie das Gerät nicht unmittelbar vor, während oder unmittelbar nach einem Gewitter.&lt;br /&gt;
# Entfernen Sie die Batterien, wenn das Gerät längere Zeit gelagert werden soll. Werden die Batterien nicht entfernt, kann auslaufende Batterieflüssigkeit das Gerät beschädigen.&lt;br /&gt;
# Das Gerät darf nicht zum Suchen oder Prüfen spannungsführender Kabel verwendet werden. Der Kontakt mit einem spannungsführenden Kabel kann den Anwender verletzen und das Gerät beschädigen.&lt;br /&gt;
# Bei Verwendung als Multimeter dürfen nur die Prüfleitungen an das Gerät angeschlossen werden. Werden andere Anschlüsse mit spannungsführenden Kabeln verbunden (ausgenommen PoE-Geräte), können Anwender verletzt und/oder das Gerät beschädigt werden.&lt;br /&gt;
# Prüfen Sie die Batterie, wenn die Batterieanzeige im LCD des Hauptgeräts aufleuchtet und/oder die rote LED am Empfänger blinkt.&lt;br /&gt;
# Öffnen Sie das Gehäuse nicht. Lassen Sie das Gerät bei Bedarf von einer Fachkraft reparieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Dieses Messgerät vereint Kabelverfolgung, Kabellängenmessung und Multimeterfunktionen. Die Vorteile dieses Geräts sind die große Reichweite bei der Kabelverfolgung, klare Tonsignale, eine schnelle und präzise Kabellängenmessung sowie ein genaues Multimeter. Das Gerät ist ein nützliches Werkzeug für Labore, Fabriken, Funkamateure, Netzwerkinstallateure und Techniker.&lt;br /&gt;
&lt;br /&gt;
Es kann in Echtzeit die Länge von Netzwerkkabeln sowie Kurzschlüsse und Leitungsunterbrechungen messen.&lt;br /&gt;
&lt;br /&gt;
Die Kabelverfolgungsfunktion findet das gesuchte Kabel schnell und zuverlässig unter einer Vielzahl von Kabeln. Diese Funktion kann bei Telefonanlagen, Computernetzwerken, BNC-Kabeln und anderen metallischen Netzwerkkabeln eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Unsere digitale Verfolgungstechnik nutzt die neueste störungsfreie Digitaltechnologie und bietet dem Anwender damit ein angenehmes Nutzererlebnis.&lt;br /&gt;
&lt;br /&gt;
Das Gerät ist ein unverzichtbares Werkzeug für Computernetzwerke, Telekommunikationsverkabelung, BNC-Verkabelung und andere metallische Verkabelungsprojekte.&lt;br /&gt;
&lt;br /&gt;
=== Arbeitsprinzip ===&lt;br /&gt;
&lt;br /&gt;
Die Kabellängenmessung erfolgt, indem ein Signal auf eine der Adern im Kabel gegeben wird. Durch Empfang und Berechnung des reflektierten Impulses wird die Kabellänge ermittelt.&lt;br /&gt;
&lt;br /&gt;
Durch Aussenden eines Signals vom MAIN-Anschluss zum Zielkabel wird ein analoges Signalfeld erzeugt. Der Empfänger erkennt dieses Signalfeld und findet so das Zielkabel.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
# Netzwerkkabel-Längenmessung, max. 500&amp;amp;nbsp;m&lt;br /&gt;
# Multimeterfunktionen&lt;br /&gt;
# Kabelverfolgung&lt;br /&gt;
# Ansprechendes, professionelles Design&lt;br /&gt;
# Zahlreiche Kabelprüfverfahren und PoE-Spannungsmessung&lt;br /&gt;
# Taschenlampe&lt;br /&gt;
# Automatische Abschaltung&lt;br /&gt;
# Einstellbare Empfindlichkeit/Lautstärke&lt;br /&gt;
# Wiederaufladbarer Lithium-Akku zur Schonung der Umwelt&lt;br /&gt;
&lt;br /&gt;
=== Lieferumfang ===&lt;br /&gt;
&lt;br /&gt;
* Hauptgerät (Sender)&lt;br /&gt;
* Empfänger&lt;br /&gt;
* Benutzerhandbuch&lt;br /&gt;
* 9-V-Batterie&lt;br /&gt;
* 3,7-V-Lithium-Akku&lt;br /&gt;
* USB-Netzteil&lt;br /&gt;
* RJ45-Kabel&lt;br /&gt;
* Krokodilklemme&lt;br /&gt;
* Multimeter-Zubehör (Prüfleitungen und Temperaturfühler Typ K)&lt;br /&gt;
&lt;br /&gt;
=== Funktionsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funktion !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Kabelverfolgung (SCAN) || Findet das gesuchte Kabel unter einer Vielzahl von Kabeln.&lt;br /&gt;
|-&lt;br /&gt;
| Kabelpaarungsprüfung (TEST) || Prüft Unterbrechung, Kurzschluss und Kabelbelegung (Cable Mapping).&lt;br /&gt;
|-&lt;br /&gt;
| V (VOLT) || Prüft Polarität und Spannung von Batterien/Telefonleitungen.&lt;br /&gt;
|-&lt;br /&gt;
| Durchgangsprüfung (OHM) || Prüft Unterbrechung oder Kurzschluss einer Telefonleitung (diese darf dabei nicht an eine Spannungsquelle angeschlossen sein).&lt;br /&gt;
|-&lt;br /&gt;
| ID-Zuordnung || Prüfung von Netzwerk-Switches und Kabeln durch Anschluss eines Endes an die Remote-ID-Einheit.&lt;br /&gt;
|-&lt;br /&gt;
| PoE-Test || Prüft Kabelbelegung, Polarität und Spannung von PoE-Netzwerk-Switches.&lt;br /&gt;
|-&lt;br /&gt;
| Taschenlampe || Weißes Licht.&lt;br /&gt;
|-&lt;br /&gt;
| Einstellbare Empfindlichkeit || Lautstärke des Tonsignals einstellbar.&lt;br /&gt;
|-&lt;br /&gt;
| Längenmessung || Kabellänge, Kurzschluss und Leitungsunterbrechung messbar.&lt;br /&gt;
|-&lt;br /&gt;
| Umschaltbares Verfolgungssignal || Frequenz für die Kabelverfolgung einstellbar.&lt;br /&gt;
|-&lt;br /&gt;
| Multimeter || DCV, ACV, Durchgangsprüfung, Diode, Temperatur, NCV, Widerstand, ACA und DCA.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Produktbeschreibung ==&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p5_product.svg|thumb|center|650px|Hauptgerät (links), Empfänger (rechts) und DMM-Eingangsbuchse (unten links) mit Bedienelementen]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Das Produkt wird beschädigt, wenn der Anschluss für Längenmessung (LENGTH) mit PoE oder anderen spannungsführenden Geräten verbunden wird.|}&lt;br /&gt;
&lt;br /&gt;
=== Bedienelemente im Detail ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. MAIN – Netzwerkkabel-Eingangsbuchse&#039;&#039;&#039;&lt;br /&gt;
:MAIN: Hier werden Netzwerkkabel, Telefonleitung und das Krokodilklemmenkabel zur Belegungsprüfung, Kabelverfolgung, PoE-Polaritätsprüfung, Batteriespannungsmessung oder Durchgangsprüfung angeschlossen.&lt;br /&gt;
:LENGTH: Hier wird das Kabel zur Längenmessung angeschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Ergebnisanzeige&#039;&#039;&#039; – zeigt Gerätestatus, Prüfergebnis, Verbindungsanzeige usw. sowie den Batteriestand an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Drucktasten&#039;&#039;&#039;&lt;br /&gt;
:3.1 &#039;&#039;&#039;EIN/MODE&#039;&#039;&#039;-Taste: 2&amp;amp;nbsp;Sekunden gedrückt halten, um das Gerät einzuschalten. Drücken, um zwischen den Funktionen zu wechseln (Length – Cable Pairing – Cable Tracing – V – Continuity – Switch-Belegungsprüfung – blinkende Switch-Anzeige – Remote-ID-Verfolgung – PoE-Spannung – NCV – Length).&lt;br /&gt;
:3.2 &#039;&#039;&#039;∧&#039;&#039;&#039;-Taste: Bei der Kabelverfolgung Umschalten zwischen analogem und digitalem Signal. Bei der Kabellängenmessung Wechsel des Adernpaars. Bei der Belegungsprüfung Ausführung der normalen Prüfung. Gedrückt halten, um die weiße Beleuchtung ein-/auszuschalten.&lt;br /&gt;
:3.3 &#039;&#039;&#039;∨&#039;&#039;&#039;-Taste: Umschalten zwischen analogem und digitalem Signal. Bei der Kabellängenmessung Auswahl des Kabeltyps. Bei der Belegungsprüfung Auswahl der Schnellprüfung. Gedrückt halten, um die Displaybeleuchtung ein-/auszuschalten.&lt;br /&gt;
:3.4 &#039;&#039;&#039;SCAN&#039;&#039;&#039;-Taste: Auswahl der Kabelverfolgungsfunktion (nur bei Modellen ohne Multimeterfunktion).&lt;br /&gt;
:3.5 &#039;&#039;&#039;DMM&#039;&#039;&#039;-Taste (nur bei Modellen mit Multimeterfunktion): Auswahl der Multimeterfunktion. Im Multimetermodus Auswahl zwischen ACV – DCV – Durchgang – Temperatur – NCV – Widerstand – ACA – DCA.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Tastkopf (Tracing-Sensor)&#039;&#039;&#039; – an das Zielkabel (Netzwerkkabel, Telefonleitung, BNC-Kabel oder anderes metallisches Kabel) heranführen. Anhand der Lautstärke lässt sich das Zielkabel orten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Taschenlampe&#039;&#039;&#039; – lässt sich über einen separaten Schalter ein-/ausschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Lautstärke-/Empfindlichkeitsrad&#039;&#039;&#039; – im Analogmodus zur Einstellung der Lautstärke, im Digitalmodus zur Einstellung der Frequenz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Taschenlampenschalter&#039;&#039;&#039; – schaltet die Taschenlampe ein/aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. SCAN-Taste&#039;&#039;&#039; – schaltet die Kabelverfolgungsfunktion ein/aus. 2&amp;amp;nbsp;Sekunden gedrückt halten zum Einschalten; danach Umschalten zwischen analoger Verfolgung, digitaler Verfolgung und digitaler Vibration. Erneut 2&amp;amp;nbsp;Sekunden gedrückt halten zum Ausschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Anzeigen (LEDs)&#039;&#039;&#039; – bei der Belegungsprüfung zeigt eine leuchtende LED an, dass die zugehörige Ader in gutem Zustand ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. RJ45-Kabelbuchse&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Bedienungsanleitung ==&lt;br /&gt;
&lt;br /&gt;
=== Spannungsmessung (VOLTAGE) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p11_voltage.svg|thumb|center|550px|Spannungsmessung mit Krokodilklemmenkabel an PoE-Switch oder Batterie]]&lt;br /&gt;
&lt;br /&gt;
Das Gerät hilft, bestimmte Probleme in einem Stromkreis zu erkennen, etwa das Vorhandensein und die Polarität einer Spannung. Der Empfänger wird für diese Funktion nicht benötigt. Stecken Sie das mitgelieferte Krokodilklemmenkabel in die MAIN-Buchse am Hauptgerät. Klemmen Sie die Krokodilklemmen an den zu prüfenden Stromkreis. Liegt an der Telefonleitung eine Spannung an, werden die Adern 3 und 4 mit langen Verbindungslinien dargestellt; die positive Ader blinkt zusätzlich. Liegt keine Spannung an, werden die Adern 3 und 4 mit kurzen Verbindungslinien angezeigt. Alternativ kann die Telefonleitung auch direkt in die MAIN-Buchse gesteckt werden, um zu prüfen, ob sie mit einem RJ11-Stecker versehen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis:&#039;&#039; Es dürfen keine Wechselspannungen oder andere Hochspannungskreise gemessen werden. Andernfalls besteht die Gefahr eines Stromschlags.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Es ist gefährlich, PoE oder andere spannungsführende Quellen an die LENGTH-Buchse anzuschließen. Dies kann einen Stromschlag verursachen.|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie nach dem Einschalten die MODE-Taste, bis der Spannungsmessmodus (Voltage Testing Mode) aktiv ist. Verbinden Sie die zu prüfende Batterie oder andere Spannungsquelle mit den mitgelieferten Krokodilklemmenkabeln. Die Polarität wird angezeigt. Drücken Sie alternativ die MODE-Taste, bis POE und V im Display erscheinen. Das Gerät ist nun im Spannungsmessmodus bereit und zeigt Spannung und Polarität an. Die Nummer der positiven Ader blinkt.&lt;br /&gt;
&lt;br /&gt;
=== Kabelverfolgung (SCAN) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p12_cabletracing.svg|thumb|center|550px|Hauptgerät und Empfänger bei der Kabelverfolgung]]&lt;br /&gt;
&lt;br /&gt;
Diese Funktion hilft dem Anwender, das gesuchte Kabel unter vielen Kabeln zu identifizieren. Stecken Sie ein Ende des Zielkabels (z.&amp;amp;nbsp;B. Netzwerkkabel, Telefonleitung oder ein mit der mitgelieferten Krokodilklemme angeschlossenes BNC-Kabel) in die MAIN-Buchse am Hauptgerät. Schalten Sie das Hauptgerät ein. Wählen Sie die Kabelverfolgungsfunktion. Bei Modellen ohne Multimeterfunktion befindet sich die SCAN-Taste an der rechten Seite. Drücken Sie sie, um die Kabelverfolgungsfunktion auszuwählen. Halten Sie die SCAN-Taste am Empfänger 2&amp;amp;nbsp;Sekunden gedrückt: Die blaue Anzeige (digitale Suche) oder die rote Anzeige (analoge Suche) schaltet sich ein. Bewegen Sie den Empfänger entlang der infrage kommenden Kabel (Netzwerkkabel, Telefon-Patchpanel, Steckverbinder, Hub). Hören Sie auf das Tonsignal und vergleichen Sie die Lautstärke. Nähert sich der Empfänger dem Zielkabel, wird das Tonsignal lauter; am lautesten ist es direkt am Zielkabel. In lauter Umgebung drücken Sie die ∧-Taste, um das Signal zur leichteren Identifikation zu wechseln. Das Gerät verfügt über zwei analoge Signale (angezeigt durch 1 und 3) und ein digitales Signal (angezeigt durch 2) auf dem Display. Bei Kabeln mit Modularstecker kann der Empfänger auch direkt eingesteckt werden.&lt;br /&gt;
&lt;br /&gt;
=== Durchgangsprüfung (CONTINUITY) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p13_continuity_device.svg|thumb|center|500px|Durchgangsprüfung: Anschluss und Schaltsymbol]]&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion wird eine nicht an ein Netzwerk angeschlossene Telefonleitung auf Kurzschluss geprüft. Stellen Sie vor der Prüfung sicher, dass die Telefonleitung spannungsfrei ist. Bei unterbrochenem Stromkreis zeigt das Display „OL“ an.&lt;br /&gt;
&lt;br /&gt;
Bei Kabeln mit Modularstecker stecken Sie das Kabel zur Prüfung direkt in die MAIN/RJ45-Buchse. Andernfalls schließen Sie das Prüfkabel mit den mitgelieferten Krokodilklemmen an.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann auch zur Durchgangsprüfung anderer Geräte verwendet werden. Das Gerät zeigt an, ob der Stromkreis unterbrochen ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie nach dem Einschalten die MODE-Taste, bis die Durchgangsprüfung aktiv ist. Das Display zeigt „Ω“; klemmen Sie die Krokodilklemmen an Netzwerkkabel, Elektrokabel bzw. Koaxialkabel. Besteht Durchgang, zeigt das Gerät „0&amp;amp;nbsp;Ω“ an, bei Unterbrechung „OL“.&lt;br /&gt;
&lt;br /&gt;
=== Digitale Kabelverfolgung ===&lt;br /&gt;
&lt;br /&gt;
Das Produkt ist ein störungsfreier digitaler Kabelsucher. Es nutzt fortschrittliche Digitaltechnik für eine präzise, störungsfreie digitale Kabelverfolgung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Die Bedienung des Hauptgeräts ist gleich. Die Bedienung des Empfängers unterscheidet sich: Halten Sie die SCAN-Taste 2&amp;amp;nbsp;Sekunden gedrückt, um ihn einzuschalten. Drücken Sie die Taste, um zwischen digitaler Kabelverfolgung, digitaler Verfolgung mit Vibration (falls beim jeweiligen Modell vorhanden) und analoger Kabelverfolgung zu wechseln. Halten Sie die Taste erneut 2&amp;amp;nbsp;Sekunden gedrückt, um ihn auszuschalten. Ohne Bedienung schaltet sich das Gerät nach 10&amp;amp;nbsp;Minuten automatisch ab.&lt;br /&gt;
&lt;br /&gt;
Nach Auswahl der Empfängerfunktion über die SCAN-Taste ist keine weitere Tastenbetätigung nötig. Drücken Sie die SCAN-Taste am Hauptgerät, um die Suchfunktion auszuwählen. Drücken Sie die Hz-Taste, um in den digitalen Suchmodus (L2) zu wechseln. Im digitalen Suchmodus kann die Suchfrequenz nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
Um den Suchvorgang zu beschleunigen, wird empfohlen, die Empfindlichkeit über das Einstellrad zunächst zu maximieren. Nähert sich das Zielkabel, verringern Sie die Empfindlichkeit, um es genau zu identifizieren. Zur Bestätigung, dass es sich um das richtige Kabel handelt, empfiehlt es sich, das Zielkabel in die RJ45-Buchse am Empfänger zu stecken. Leuchten alle LEDs am Empfänger, ist das angeschlossene Kabel das gesuchte Kabel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Digitale Suche (blaue LED-Anzeige):&#039;&#039;&#039; Es kommt die neueste digitale Suchtechnologie zum Einsatz. Das Hauptgerät sendet ein digitales Signal aus. Empfängt der Empfänger dieses über das Zielkabel laufende Signal, reagiert er mit einem Tonsignal (blaue Anzeige leuchtet) oder Vibration (blaue Anzeige blinkt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analoge Suche (rote LED-Anzeige):&#039;&#039;&#039; Auch hier wird empfohlen, die Empfindlichkeit zunächst zu maximieren und beim Annähern an das Zielkabel zu verringern, um es genau zu identifizieren.&lt;br /&gt;
&lt;br /&gt;
=== Kabellängenmessung (LENGTH) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p8_length.svg|thumb|center|450px|Anschluss zur Kabellängenmessung]]&lt;br /&gt;
&lt;br /&gt;
Nach dem Einschalten ist das Gerät bereit zur Kabellängenmessung. Diese Funktion eignet sich für verschiedene metallische Kabel (mindestens 2&amp;amp;nbsp;m lang), einschließlich Netzwerkkabel, Telefonleitungen und BNC-Kabel.&lt;br /&gt;
&lt;br /&gt;
Stecken Sie zur Längenmessung das Kabel in die LENGTH-Buchse. Lassen Sie das andere Kabelende frei; es darf nicht mit anderen Geräten verbunden werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Die LENGTH-Buchse ist ausschließlich für die Kabellängenmessung vorgesehen. Das Gerät kann beschädigt werden, wenn sie an PoE oder andere spannungsführende Geräte angeschlossen wird.|}&lt;br /&gt;
&lt;br /&gt;
Nach der Messung zeigt das Gerät den Zustand des Kabels an. Der Status jeder Ader (in der Reihenfolge 1,2,3,4,5,6,7,8) wird angezeigt. So kann der Anwender zusammen mit der Kabellänge erkennen, ob das Kabel in gutem Zustand ist.&lt;br /&gt;
&lt;br /&gt;
Drücken Sie die ∧-Taste, um zwischen der Längenmessung der einzelnen Aderpaare umzuschalten (z.&amp;amp;nbsp;B. Paar 1 und 2, 3 und 6, 4 und 5, 7 und 8). Drücken Sie die ∨-Taste, um den Kabeltyp auszuwählen (8P8C-Kabel, 4P4C-Kabel, Telefonleitungen und BNC-Kabel).&lt;br /&gt;
&lt;br /&gt;
Die Messgenauigkeit der Länge beträgt 2&amp;amp;nbsp;% ± 1&amp;amp;nbsp;m. Bei nicht standardisierten Leitungen sollten Anwender vor der Messung eine Kalibrierung durchführen (siehe [[#Längen- und Temperaturkalibrierung|Kalibrierung]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie die Ein/Aus-Taste, um das Gerät einzuschalten. Am unteren Displayrand werden 8P8C-Netzwerkkabel, 4P4C-Netzwerkkabel, Telefonleitungen und BNC-Kabel angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Cable Mapping (TEST) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p10_cablemapping.svg|thumb|center|600px|Cable-Mapping-Prüfung mit Empfänger, HUB und Remote-ID-Einheit]]&lt;br /&gt;
&lt;br /&gt;
Mit der Cable-Mapping-Funktion können Anwender Leitungsunterbrechungen und die physische Verkabelung folgender Kabeltypen prüfen: UTP-Computernetzwerkkabel nach IEEE&amp;amp;nbsp;10Base-T bzw. EIA/TIA&amp;amp;nbsp;568A sowie 2- und 4-adrige Telefonleitungen und andere metallische Netzwerkkabel.&lt;br /&gt;
&lt;br /&gt;
Stecken Sie ein Ende des zu prüfenden Kabels in die MAIN-Buchse am Hauptgerät. Drücken Sie die MODE-Taste, um in den Cable-Mapping-Modus zu wechseln. Stecken Sie das andere Kabelende in die RJ45-Buchse am Empfänger. Stimmt die Anzeige am Empfänger mit der am Hauptgerät angezeigten Nummer überein, ist das geprüfte Kabel in gutem Zustand.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie die MODE-Taste, um zwischen Cable Mapping (TEST), Switch-Belegungsprüfung, Prüfung der LED-Anzeigen an Switch-Ports und der Prüfung mit der Remote-ID-Einheit umzuschalten.&lt;br /&gt;
* Stecken Sie ein Ende des zu prüfenden Kabels in die MAIN-Buchse am Hauptgerät, das andere Ende in die entsprechende Buchse.&lt;br /&gt;
* Zur Kabelprüfung stecken Sie das andere Kabelende in die MAIN-Buchse am Empfänger. Das Hauptgerät zeigt nacheinander den Zustand jeder Ader an. Drücken Sie ∧ für den Schnellmodus, ∨ für den Normalmodus.&lt;br /&gt;
* Zur Switch-Belegungsprüfung schließen Sie das andere Kabelende an den Switch an. Das Hauptgerät zeigt nacheinander den Zustand jeder Ader an.&lt;br /&gt;
* Um die blinkenden Switch-Anzeigen zu prüfen, schließen Sie das andere Kabelende an den zu prüfenden Switch an. Die LED des Ports, der mit dem Hauptgerät verbunden ist, blinkt einmal pro Sekunde.&lt;br /&gt;
* Für die Prüfung mit der Remote-ID-Einheit schließen Sie das andere Kabelende an die Remote-ID-Einheit an. Das Hauptgerät zeigt die Nummer der angeschlossenen Remote-ID an.&lt;br /&gt;
&lt;br /&gt;
=== Multimeter-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Die folgenden Anweisungen gelten nur für Modelle mit Multimeterfunktion.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 1.1 Spannungsmessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie Wechselspannung (ACV) oder Gleichspannung (DCV).&lt;br /&gt;
# Berühren Sie mit den Prüfspitzen den Messpunkt. Das Gerät zeigt die gemessene Spannung an. Bei der Gleichspannungsmessung wird zusätzlich die Polarität der roten Leitung angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Wird „0L“ angezeigt, ist der Messbereich überschritten – Messung sofort abbrechen. Es dürfen keine Spannungen über 1000&amp;amp;nbsp;V DC bzw. 400&amp;amp;nbsp;V AC gemessen werden. Berühren Sie keine Hochspannungskreise; schließen Sie bei Hochspannungsmessungen niemals Netzwerkkabel, spannungsführende Leitungen oder Ladekabel an.&lt;br /&gt;
&lt;br /&gt;
==== 1.2 Strommessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die 10-A-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie Gleich- oder Wechselstrom.&lt;br /&gt;
# Berühren Sie mit den Prüfspitzen den Messpunkt. Das Gerät zeigt den gemessenen Strom an. Bei der Gleichstrommessung wird zusätzlich die Polarität der roten Leitung angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Wird „0L“ angezeigt, ist der Messbereich überschritten – Messung sofort abbrechen. Es dürfen keine Ströme über 10&amp;amp;nbsp;A gemessen werden (Messdauer unter 10&amp;amp;nbsp;Sekunden).&lt;br /&gt;
&lt;br /&gt;
==== 1.3 Widerstandsmessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie die Widerstandsfunktion. Berühren Sie mit den Prüfspitzen das Messobjekt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; „0L“ bedeutet Überschreitung des Messbereichs oder eine Unterbrechung im Messobjekt. Stellen Sie sicher, dass das Messobjekt spannungsfrei und vollständig entladen ist, bevor Sie messen. Legen Sie im Widerstandsmessbereich keine Spannung an. Bei hochohmigen Messungen (&amp;amp;gt;&amp;amp;nbsp;1&amp;amp;nbsp;MΩ) kann es einige Sekunden dauern, bis ein stabiler Messwert angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==== 1.4 Temperaturmessung ====&lt;br /&gt;
Drücken Sie die DMM-Taste und wählen Sie den Temperaturbereich. Stecken Sie das kalte (freie), negative (schwarze) Ende des Thermoelement-Fühlers in die COM-Buchse, das rote Ende in die VHz-Buchse. Bringen Sie die Fühlerspitze am oder auf dem Messobjekt an. Die Temperatur wird angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Verwenden Sie ausschließlich Thermoelemente vom Typ K, sonst kann der Messwert ungenau sein. Legen Sie im Temperaturmessbereich niemals eine Spannung an.&lt;br /&gt;
&lt;br /&gt;
==== 1.5 NCV-Erkennung (berührungslose Spannungsprüfung) ====&lt;br /&gt;
Drücken Sie die DMM-Taste und wählen Sie den NCV-Erkennungsbereich. Führen Sie den Sensor nahe an das Messobjekt heran. Die Spannung wird im analogen Balkendiagramm angezeigt; wird eine Spannung erkannt, ertönt ein Signalton.&lt;br /&gt;
&lt;br /&gt;
==== 1.6 Durchgangsprüfung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse (Hinweis: die rote Leitung hat Polarität „+“).&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie die Durchgangsprüfung. Berühren Sie mit den Prüfspitzen das Messobjekt. Beträgt der Widerstand zwischen den beiden Kontaktpunkten weniger als 50&amp;amp;nbsp;Ω, ertönt ein Signalton.&lt;br /&gt;
&lt;br /&gt;
==== 1.7 Diodentest ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse (Hinweis: die rote Leitung hat Polarität „+“).&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie den Diodenbereich. Verbinden Sie die rote Leitung mit der Anode, die schwarze Leitung mit der Kathode der Diode.&lt;br /&gt;
&lt;br /&gt;
==== 1.8 Automatische Abschaltung ====&lt;br /&gt;
Ohne Funktions- oder Tastenbetätigung wechselt das Gerät nach 20&amp;amp;nbsp;Minuten in den Ruhemodus. Im Ruhemodus stellt ein Druck auf die Ein/Aus-Taste den Normalbetrieb wieder her.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Anschluss der Prüfleitungen ===&lt;br /&gt;
&lt;br /&gt;
Das Gerät verfügt über Anschlussanzeigen an den Eingangsbuchsen, die dem Anwender die korrekte Steckerbelegung anzeigen. Falsches Anschließen der Prüfleitungen kann das Gerät beschädigen und/oder den Anwender verletzen. Stellen Sie vor jeder Messung sicher, dass der Anschluss korrekt ist.&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p16_testleads.svg|thumb|center|550px|Anschluss der Prüfleitungen für Spannungs-/Widerstands-/Dioden-/Temperaturmessung (oben) und für die 10-A-Strommessung (unten)]]&lt;br /&gt;
&lt;br /&gt;
== Längen- und Temperaturkalibrierung ==&lt;br /&gt;
&lt;br /&gt;
=== Längenkalibrierung ===&lt;br /&gt;
&lt;br /&gt;
Da Kabel aus unterschiedlichen Materialien eine unterschiedliche Leitfähigkeit besitzen, kann das Messergebnis ungenau sein. Um dies auszugleichen, kann das Gerät kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kalibrierungsverfahren&#039;&#039;&#039;&lt;br /&gt;
# Schließen Sie bei eingeschaltetem Gerät ein Kabel mit bekannter Länge an die LENGTH-Buchse am Hauptgerät an. Halten Sie im Kabellängenmess-Modus die Tasten ∧ und ∨ gemeinsam 3&amp;amp;nbsp;Sekunden gedrückt. Das Gerät wechselt in den Kalibriermodus; der Messwert blinkt. Passen Sie den angezeigten Wert mit den Tasten ∧/∨ an, bis er der tatsächlichen Kabellänge entspricht. Drücken Sie anschließend ∨ und MODE gleichzeitig, um das Ergebnis zu speichern und den Kalibriermodus zu verlassen. Jede andere Taste verlässt den Kalibriermodus ohne zu speichern.&lt;br /&gt;
# Halten Sie bei eingeschaltetem Gerät ∧ und MODE gemeinsam gedrückt, um das Gerät auf die Werkseinstellung zurückzusetzen.&lt;br /&gt;
# Das zur Kalibrierung verwendete Kabel mit bekannter Länge sollte mindestens 5&amp;amp;nbsp;m lang sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Temperaturkalibrierung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Messergebnis kann durch Temperaturunterschiede zwischen Umgebung und Geräteinnerem beeinflusst werden. Auch hierfür verfügt das Gerät über einen Kalibriermodus.&lt;br /&gt;
# Wählen Sie bei eingeschaltetem Gerät den Messmodus und halten Sie die Tasten ∧ und ∨ gemeinsam 3&amp;amp;nbsp;Sekunden gedrückt. Das Gerät wechselt in den Temperatur-Kalibriermodus; der Messwert blinkt. Passen Sie den angezeigten Wert mit ∧/∨ an, bis er der tatsächlichen Temperatur entspricht. Drücken Sie anschließend ∨ und MODE gleichzeitig, um zu speichern und den Modus zu verlassen. Jede andere Taste verlässt den Modus ohne zu speichern.&lt;br /&gt;
# Halten Sie bei eingeschaltetem Gerät ∧ und MODE gemeinsam gedrückt, um auf Werkseinstellung zurückzusetzen.&lt;br /&gt;
# Verwenden Sie zur Temperaturkalibrierung ein Quecksilberthermometer mit einer Auflösung von 0,1&amp;amp;nbsp;°C als Referenz.&lt;br /&gt;
&lt;br /&gt;
== Batterie- und Sicherungswechsel ==&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p17_battery.svg|thumb|center|600px|Batteriewechsel im Hauptgerät (oben) und im Empfänger (unten)]]&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehebung ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Symptom !! Ursache !! Lösung&lt;br /&gt;
|-&lt;br /&gt;
| Hauptgerät || Display bleibt nach Drücken der Ein/Aus-Taste dunkel oder blinkt || Batterie leer || Hauptgerät aufladen oder Akku ersetzen (geschützter 3,7-V-Lithium-Akku)&lt;br /&gt;
|-&lt;br /&gt;
| Empfänger || Beim Drücken der SCAN-Taste ertönt während der Kabelverfolgung kein Ton || Batterie leer oder nicht eingelegt, oder Empfänger zu weit vom Zielkabel entfernt || Batterie wechseln oder Suchbereich vergrößern&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Produktwartung ==&lt;br /&gt;
&lt;br /&gt;
Dieses Gerät ist ein Präzisionsmessgerät. Achten Sie auf ausreichende Batterieladung. Befolgen Sie die Anweisungen, insbesondere im Hinblick auf den korrekten Anschluss an die Multimeter-Eingangsbuchsen. Der Anwender darf die Anschlussbelegung nicht verändern. Andernfalls kann das Gerät beschädigt und der Anwender verletzt werden.&lt;br /&gt;
&lt;br /&gt;
Pflegehinweise:&lt;br /&gt;
# Halten Sie das Gerät von Wasser und Staub fern. Lassen Sie es nicht fallen.&lt;br /&gt;
# Betreiben Sie das Gerät nicht in brennbarer, explosionsgefährdeter, sehr heißer, feuchter oder stark magnetischer Umgebung.&lt;br /&gt;
# Reinigen Sie das Gehäuse mit einem feuchten Tuch und einem milden Reinigungsmittel. Verwenden Sie keine Scheuer- oder Lösungsmittel.&lt;br /&gt;
# Entfernen Sie die Batterien, wenn das Gerät längere Zeit gelagert werden soll.&lt;br /&gt;
# Laden Sie das Gerät möglichst bald auf, sobald die Batterieanzeige aufleuchtet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlerbehebung und Warnhinweise:&#039;&#039;&#039; Funktioniert das Gerät nicht ordnungsgemäß, prüfen Sie Batterie, Sicherung und Ein-/Ausschalter. Lassen Sie das Gerät reparieren, falls sich das Problem nicht beheben lässt.&lt;br /&gt;
&lt;br /&gt;
Alle Angaben können ohne vorherige Ankündigung geändert werden. Sollten Sie Fehler oder fehlende Informationen feststellen, wenden Sie sich bitte an den Hersteller oder Ihren Händler. Das Unternehmen haftet nicht für Schäden oder Verletzungen, die durch unsachgemäße Bedienung entstehen. Keine der genannten Funktionen darf für sicherheitskritische Sonderzwecke herangezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Elektrische Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Automatische Abschaltung&#039;&#039;&#039;&lt;br /&gt;
* Hauptgerät: Schaltet sich nach 20&amp;amp;nbsp;Minuten ohne Tastenbetätigung automatisch ab.&lt;br /&gt;
* Empfänger: Schaltet sich nach 10&amp;amp;nbsp;Minuten ohne Tastenbetätigung automatisch ab.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stromaufnahme&#039;&#039;&#039;&lt;br /&gt;
* Hauptgerät: 40–130&amp;amp;nbsp;mA (je nach Funktion)&lt;br /&gt;
* Empfänger: ≤&amp;amp;nbsp;100&amp;amp;nbsp;mA&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stromversorgung&#039;&#039;&#039;&lt;br /&gt;
* Empfänger: 9-V-Blockbatterie&lt;br /&gt;
* Hauptgerät: geschützter 3,7-V-Lithium-Akku&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reichweite des Kabelverfolgungssignals:&#039;&#039;&#039; ≥&amp;amp;nbsp;3&amp;amp;nbsp;km&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sicherheit:&#039;&#039;&#039; Gefahrlos – die Prüfspitze kann direkt mit nicht hochspannungsführenden Metallleitern in Kontakt kommen.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grundfunktionen !! 616 !! 618&lt;br /&gt;
|-&lt;br /&gt;
| Analoge Verfolgung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Durchgangsprüfung || √ || über Multimeterfunktion&lt;br /&gt;
|-&lt;br /&gt;
| Switch-Verfolgung (mit PoE) || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Cable Mapping || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Blinkende Switch-Anzeige || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Störungsfreie digitale Verfolgung || Digital || Digital/Vibration&lt;br /&gt;
|-&lt;br /&gt;
| Spannungsprüfung || √ || über Multimeterfunktion&lt;br /&gt;
|-&lt;br /&gt;
| PoE-Spannungsmessung || Spannung/Polarität || Spannung/Polarität&lt;br /&gt;
|-&lt;br /&gt;
| Remote-ID-Zuordnung || optional || optional&lt;br /&gt;
|-&lt;br /&gt;
| Analoges Balkendiagramm || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| NCV-Erkennung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Sonstige Funktionen || colspan=&amp;quot;2&amp;quot; | Taschenlampe am Hauptgerät, Anschlussanzeige für Multimeter-Eingang, LCD-Display, weiße Taschenlampe, einstellbare Lautstärke bei analoger Verfolgung, einstellbare Empfindlichkeit bei digitaler Verfolgung, Anzeige für niedrigen Batteriestand, weiße Displaybeleuchtung, Energiesparfunktion, Verfolgungsreichweite 3&amp;amp;nbsp;km, einstellbares Verfolgungssignal&lt;br /&gt;
|-&lt;br /&gt;
| Sonderfunktionen || – || √&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Multimeterfunktionen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Gleichspannung || – || 400&amp;amp;nbsp;mV–1000&amp;amp;nbsp;V ±(0,8&amp;amp;nbsp;%+3)&lt;br /&gt;
|-&lt;br /&gt;
| Wechselspannung || – || 4&amp;amp;nbsp;V–400&amp;amp;nbsp;V ±(1,5&amp;amp;nbsp;%+5)&lt;br /&gt;
|-&lt;br /&gt;
| Gleichstrom || – || 1,0–10,0&amp;amp;nbsp;A ±(1,2&amp;amp;nbsp;%+4)&lt;br /&gt;
|-&lt;br /&gt;
| Wechselstrom || – || 1,0–10,0&amp;amp;nbsp;A ±(2,0&amp;amp;nbsp;%+5)&lt;br /&gt;
|-&lt;br /&gt;
| Widerstand || – || 200&amp;amp;nbsp;Ω–20&amp;amp;nbsp;MΩ ±(2&amp;amp;nbsp;%+6)&lt;br /&gt;
|-&lt;br /&gt;
| Durchgang || – || &amp;amp;lt;&amp;amp;nbsp;50&amp;amp;nbsp;Ω, Summer ertönt&lt;br /&gt;
|-&lt;br /&gt;
| Diode || – || √&lt;br /&gt;
|-&lt;br /&gt;
| Temperatur (Typ K) || – || −20–1000&amp;amp;nbsp;°C ±(2,0&amp;amp;nbsp;%+15)&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerkkabel-Längenmessung || 400&amp;amp;nbsp;m || 500&amp;amp;nbsp;m&lt;br /&gt;
|-&lt;br /&gt;
| BNC-Kabel-Längenmessung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerkkabel-Kurzschluss-/Unterbrechungstest || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Stromversorgung || colspan=&amp;quot;2&amp;quot; | Hauptgerät: 1250&amp;amp;nbsp;mAh wiederaufladbarer Lithium-Akku; Empfänger: 9-V-Batterie&lt;br /&gt;
|-&lt;br /&gt;
| Lieferumfang || Geschenkbox/Handbuch/Tragetasche/RJ45-Kabel/Krokodilklemmenkabel || Geschenkbox/Handbuch/Tragetasche/RJ45-Kabel/Prüfleitungen/Temperaturfühler Typ K&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Die Remote-ID-Einheit ist optisches Zubehör.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Die oben genannten Angaben stellen jeweils die besten erreichbaren Spezifikationen dar.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Benutzerhandbücher]]&lt;br /&gt;
[[Kategorie:Messgeräte]]&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Multifunktionstester_Tooltop_ET616/ET618&amp;diff=5241</id>
		<title>Multifunktionstester Tooltop ET616/ET618</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Multifunktionstester_Tooltop_ET616/ET618&amp;diff=5241"/>
		<updated>2026-08-02T20:32:37Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Die Seite wurde neu angelegt: „= Multifunktions-Tester (ET616 / ET618) – Benutzerhandbuch =  &amp;#039;&amp;#039;Deutsche Übersetzung des Originalhandbuchs „Multifunctional Tester User Manual“ (Art.-Nr. 501061802 V2). Technische Zeichnungen wurden als SVG-Vektorgrafiken neu erstellt; Beschriftungen, die tatsächlich auf dem Gehäuse des Geräts aufgedruckt sind (z.&amp;amp;nbsp;B. &amp;#039;&amp;#039;&amp;#039;MAIN&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;LENGTH&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;MODE&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;SCAN&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;DMM&amp;#039;&amp;#039;&amp;#039;), wurden bewusst nicht übersetzt, damit sie mit dem realen Gerä…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Multifunktions-Tester (ET616 / ET618) – Benutzerhandbuch =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Deutsche Übersetzung des Originalhandbuchs „Multifunctional Tester User Manual“ (Art.-Nr. 501061802 V2). Technische Zeichnungen wurden als SVG-Vektorgrafiken neu erstellt; Beschriftungen, die tatsächlich auf dem Gehäuse des Geräts aufgedruckt sind (z.&amp;amp;nbsp;B. &#039;&#039;&#039;MAIN&#039;&#039;&#039;, &#039;&#039;&#039;LENGTH&#039;&#039;&#039;, &#039;&#039;&#039;MODE&#039;&#039;&#039;, &#039;&#039;&#039;SCAN&#039;&#039;&#039;, &#039;&#039;&#039;DMM&#039;&#039;&#039;), wurden bewusst nicht übersetzt, damit sie mit dem realen Gerät übereinstimmen.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle Rechte vorbehalten. Gedruckt in China. Technische Änderungen ohne vorherige Ankündigung vorbehalten. Alle Produktnamen sind Warenzeichen der jeweiligen Unternehmen. Art.-Nr.: 501061802 V2&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsinformationen ==&lt;br /&gt;
&lt;br /&gt;
Diese Geräteserie erfüllt IEC1010 (International Electrotechnical Commission). Bitte lesen Sie vor der Benutzung die Sicherheitsinformationen.&lt;br /&gt;
&lt;br /&gt;
Lesen Sie die technischen Daten sorgfältig durch. Nur Modelle mit Multimeterfunktion dürfen zur Messung von Gleich-/Wechselspannung und -strom ab 36&amp;amp;nbsp;V eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Messen Sie niemals Spannungen ab 36&amp;amp;nbsp;V (außer PoE), wenn das Modell keine Multimeterfunktion besitzt. Diese Spannungen stellen eine Stromschlaggefahr dar.&lt;br /&gt;
&lt;br /&gt;
# Geben Sie bei der Spannungsmessung niemals mehr als 1000&amp;amp;nbsp;V DC bzw. 400&amp;amp;nbsp;V AC (Effektivwert) ein. Geben Sie bei der Strommessung niemals mehr als 10&amp;amp;nbsp;A ein.&lt;br /&gt;
# Bis 36&amp;amp;nbsp;V ist das Gerät sicher. Prüfen Sie zur Vermeidung eines Stromschlags den Anschluss und die Isolierung der Prüfleitungen, bevor Sie Spannungen ab 36&amp;amp;nbsp;V DC bzw. 25&amp;amp;nbsp;V DC messen.&lt;br /&gt;
# Entfernen Sie die Prüfleitungen vom Messpunkt, bevor Sie Funktion oder Messbereich wechseln.&lt;br /&gt;
# Das Gerät verfügt bereits über einen vollständigen Schutz. Wählen Sie dennoch aus Sicherheitsgründen stets die richtige Funktion und den richtigen Messbereich.&lt;br /&gt;
# Sicherheitssymbole:&lt;br /&gt;
:[[File:icon_warning.svg|24px]] Gefährliche Spannung, bitte Benutzerhandbuch beachten.&lt;br /&gt;
:[[File:icon_earth.svg|24px]] Erde/Masse.&lt;br /&gt;
:[[File:icon_lowbattery.svg|24px]] Batteriespannung niedrig.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;&lt;br /&gt;
# Verwenden Sie das Gerät nicht, wenn es beschädigt aussieht und/oder sich ungewöhnlich verhält. Der Schutz des Geräts kann beeinträchtigt sein, wenn es beschädigt oder auffällig wirkt.&lt;br /&gt;
# Überschreiten Sie den Messbereich nicht. Andernfalls können Anwender verletzt und das Gerät beschädigt werden.&lt;br /&gt;
# Verwenden Sie das Gerät nicht unmittelbar vor, während oder unmittelbar nach einem Gewitter.&lt;br /&gt;
# Entfernen Sie die Batterien, wenn das Gerät längere Zeit gelagert werden soll. Werden die Batterien nicht entfernt, kann auslaufende Batterieflüssigkeit das Gerät beschädigen.&lt;br /&gt;
# Das Gerät darf nicht zum Suchen oder Prüfen spannungsführender Kabel verwendet werden. Der Kontakt mit einem spannungsführenden Kabel kann den Anwender verletzen und das Gerät beschädigen.&lt;br /&gt;
# Bei Verwendung als Multimeter dürfen nur die Prüfleitungen an das Gerät angeschlossen werden. Werden andere Anschlüsse mit spannungsführenden Kabeln verbunden (ausgenommen PoE-Geräte), können Anwender verletzt und/oder das Gerät beschädigt werden.&lt;br /&gt;
# Prüfen Sie die Batterie, wenn die Batterieanzeige im LCD des Hauptgeräts aufleuchtet und/oder die rote LED am Empfänger blinkt.&lt;br /&gt;
# Öffnen Sie das Gehäuse nicht. Lassen Sie das Gerät bei Bedarf von einer Fachkraft reparieren.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
&lt;br /&gt;
Dieses Messgerät vereint Kabelverfolgung, Kabellängenmessung und Multimeterfunktionen. Die Vorteile dieses Geräts sind die große Reichweite bei der Kabelverfolgung, klare Tonsignale, eine schnelle und präzise Kabellängenmessung sowie ein genaues Multimeter. Das Gerät ist ein nützliches Werkzeug für Labore, Fabriken, Funkamateure, Netzwerkinstallateure und Techniker.&lt;br /&gt;
&lt;br /&gt;
Es kann in Echtzeit die Länge von Netzwerkkabeln sowie Kurzschlüsse und Leitungsunterbrechungen messen.&lt;br /&gt;
&lt;br /&gt;
Die Kabelverfolgungsfunktion findet das gesuchte Kabel schnell und zuverlässig unter einer Vielzahl von Kabeln. Diese Funktion kann bei Telefonanlagen, Computernetzwerken, BNC-Kabeln und anderen metallischen Netzwerkkabeln eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Unsere digitale Verfolgungstechnik nutzt die neueste störungsfreie Digitaltechnologie und bietet dem Anwender damit ein angenehmes Nutzererlebnis.&lt;br /&gt;
&lt;br /&gt;
Das Gerät ist ein unverzichtbares Werkzeug für Computernetzwerke, Telekommunikationsverkabelung, BNC-Verkabelung und andere metallische Verkabelungsprojekte.&lt;br /&gt;
&lt;br /&gt;
=== Arbeitsprinzip ===&lt;br /&gt;
&lt;br /&gt;
Die Kabellängenmessung erfolgt, indem ein Signal auf eine der Adern im Kabel gegeben wird. Durch Empfang und Berechnung des reflektierten Impulses wird die Kabellänge ermittelt.&lt;br /&gt;
&lt;br /&gt;
Durch Aussenden eines Signals vom MAIN-Anschluss zum Zielkabel wird ein analoges Signalfeld erzeugt. Der Empfänger erkennt dieses Signalfeld und findet so das Zielkabel.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
# Netzwerkkabel-Längenmessung, max. 500&amp;amp;nbsp;m&lt;br /&gt;
# Multimeterfunktionen&lt;br /&gt;
# Kabelverfolgung&lt;br /&gt;
# Ansprechendes, professionelles Design&lt;br /&gt;
# Zahlreiche Kabelprüfverfahren und PoE-Spannungsmessung&lt;br /&gt;
# Taschenlampe&lt;br /&gt;
# Automatische Abschaltung&lt;br /&gt;
# Einstellbare Empfindlichkeit/Lautstärke&lt;br /&gt;
# Wiederaufladbarer Lithium-Akku zur Schonung der Umwelt&lt;br /&gt;
&lt;br /&gt;
=== Lieferumfang ===&lt;br /&gt;
&lt;br /&gt;
* Hauptgerät (Sender)&lt;br /&gt;
* Empfänger&lt;br /&gt;
* Benutzerhandbuch&lt;br /&gt;
* 9-V-Batterie&lt;br /&gt;
* 3,7-V-Lithium-Akku&lt;br /&gt;
* USB-Netzteil&lt;br /&gt;
* RJ45-Kabel&lt;br /&gt;
* Krokodilklemme&lt;br /&gt;
* Multimeter-Zubehör (Prüfleitungen und Temperaturfühler Typ K)&lt;br /&gt;
&lt;br /&gt;
=== Funktionsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Funktion !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| Kabelverfolgung (SCAN) || Findet das gesuchte Kabel unter einer Vielzahl von Kabeln.&lt;br /&gt;
|-&lt;br /&gt;
| Kabelpaarungsprüfung (TEST) || Prüft Unterbrechung, Kurzschluss und Kabelbelegung (Cable Mapping).&lt;br /&gt;
|-&lt;br /&gt;
| V (VOLT) || Prüft Polarität und Spannung von Batterien/Telefonleitungen.&lt;br /&gt;
|-&lt;br /&gt;
| Durchgangsprüfung (OHM) || Prüft Unterbrechung oder Kurzschluss einer Telefonleitung (diese darf dabei nicht an eine Spannungsquelle angeschlossen sein).&lt;br /&gt;
|-&lt;br /&gt;
| ID-Zuordnung || Prüfung von Netzwerk-Switches und Kabeln durch Anschluss eines Endes an die Remote-ID-Einheit.&lt;br /&gt;
|-&lt;br /&gt;
| PoE-Test || Prüft Kabelbelegung, Polarität und Spannung von PoE-Netzwerk-Switches.&lt;br /&gt;
|-&lt;br /&gt;
| Taschenlampe || Weißes Licht.&lt;br /&gt;
|-&lt;br /&gt;
| Einstellbare Empfindlichkeit || Lautstärke des Tonsignals einstellbar.&lt;br /&gt;
|-&lt;br /&gt;
| Längenmessung || Kabellänge, Kurzschluss und Leitungsunterbrechung messbar.&lt;br /&gt;
|-&lt;br /&gt;
| Umschaltbares Verfolgungssignal || Frequenz für die Kabelverfolgung einstellbar.&lt;br /&gt;
|-&lt;br /&gt;
| Multimeter || DCV, ACV, Durchgangsprüfung, Diode, Temperatur, NCV, Widerstand, ACA und DCA.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Produktbeschreibung ==&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p5_product.svg|thumb|center|650px|Hauptgerät (links), Empfänger (rechts) und DMM-Eingangsbuchse (unten links) mit Bedienelementen]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Das Produkt wird beschädigt, wenn der Anschluss für Längenmessung (LENGTH) mit PoE oder anderen spannungsführenden Geräten verbunden wird.|}&lt;br /&gt;
&lt;br /&gt;
=== Bedienelemente im Detail ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. MAIN – Netzwerkkabel-Eingangsbuchse&#039;&#039;&#039;&lt;br /&gt;
:MAIN: Hier werden Netzwerkkabel, Telefonleitung und das Krokodilklemmenkabel zur Belegungsprüfung, Kabelverfolgung, PoE-Polaritätsprüfung, Batteriespannungsmessung oder Durchgangsprüfung angeschlossen.&lt;br /&gt;
:LENGTH: Hier wird das Kabel zur Längenmessung angeschlossen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Ergebnisanzeige&#039;&#039;&#039; – zeigt Gerätestatus, Prüfergebnis, Verbindungsanzeige usw. sowie den Batteriestand an.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Drucktasten&#039;&#039;&#039;&lt;br /&gt;
:3.1 &#039;&#039;&#039;EIN/MODE&#039;&#039;&#039;-Taste: 2&amp;amp;nbsp;Sekunden gedrückt halten, um das Gerät einzuschalten. Drücken, um zwischen den Funktionen zu wechseln (Length – Cable Pairing – Cable Tracing – V – Continuity – Switch-Belegungsprüfung – blinkende Switch-Anzeige – Remote-ID-Verfolgung – PoE-Spannung – NCV – Length).&lt;br /&gt;
:3.2 &#039;&#039;&#039;∧&#039;&#039;&#039;-Taste: Bei der Kabelverfolgung Umschalten zwischen analogem und digitalem Signal. Bei der Kabellängenmessung Wechsel des Adernpaars. Bei der Belegungsprüfung Ausführung der normalen Prüfung. Gedrückt halten, um die weiße Beleuchtung ein-/auszuschalten.&lt;br /&gt;
:3.3 &#039;&#039;&#039;∨&#039;&#039;&#039;-Taste: Umschalten zwischen analogem und digitalem Signal. Bei der Kabellängenmessung Auswahl des Kabeltyps. Bei der Belegungsprüfung Auswahl der Schnellprüfung. Gedrückt halten, um die Displaybeleuchtung ein-/auszuschalten.&lt;br /&gt;
:3.4 &#039;&#039;&#039;SCAN&#039;&#039;&#039;-Taste: Auswahl der Kabelverfolgungsfunktion (nur bei Modellen ohne Multimeterfunktion).&lt;br /&gt;
:3.5 &#039;&#039;&#039;DMM&#039;&#039;&#039;-Taste (nur bei Modellen mit Multimeterfunktion): Auswahl der Multimeterfunktion. Im Multimetermodus Auswahl zwischen ACV – DCV – Durchgang – Temperatur – NCV – Widerstand – ACA – DCA.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Tastkopf (Tracing-Sensor)&#039;&#039;&#039; – an das Zielkabel (Netzwerkkabel, Telefonleitung, BNC-Kabel oder anderes metallisches Kabel) heranführen. Anhand der Lautstärke lässt sich das Zielkabel orten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Taschenlampe&#039;&#039;&#039; – lässt sich über einen separaten Schalter ein-/ausschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Lautstärke-/Empfindlichkeitsrad&#039;&#039;&#039; – im Analogmodus zur Einstellung der Lautstärke, im Digitalmodus zur Einstellung der Frequenz.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7. Taschenlampenschalter&#039;&#039;&#039; – schaltet die Taschenlampe ein/aus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8. SCAN-Taste&#039;&#039;&#039; – schaltet die Kabelverfolgungsfunktion ein/aus. 2&amp;amp;nbsp;Sekunden gedrückt halten zum Einschalten; danach Umschalten zwischen analoger Verfolgung, digitaler Verfolgung und digitaler Vibration. Erneut 2&amp;amp;nbsp;Sekunden gedrückt halten zum Ausschalten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9. Anzeigen (LEDs)&#039;&#039;&#039; – bei der Belegungsprüfung zeigt eine leuchtende LED an, dass die zugehörige Ader in gutem Zustand ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10. RJ45-Kabelbuchse&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Bedienungsanleitung ==&lt;br /&gt;
&lt;br /&gt;
=== Spannungsmessung (VOLTAGE) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p11_voltage.svg|thumb|center|550px|Spannungsmessung mit Krokodilklemmenkabel an PoE-Switch oder Batterie]]&lt;br /&gt;
&lt;br /&gt;
Das Gerät hilft, bestimmte Probleme in einem Stromkreis zu erkennen, etwa das Vorhandensein und die Polarität einer Spannung. Der Empfänger wird für diese Funktion nicht benötigt. Stecken Sie das mitgelieferte Krokodilklemmenkabel in die MAIN-Buchse am Hauptgerät. Klemmen Sie die Krokodilklemmen an den zu prüfenden Stromkreis. Liegt an der Telefonleitung eine Spannung an, werden die Adern 3 und 4 mit langen Verbindungslinien dargestellt; die positive Ader blinkt zusätzlich. Liegt keine Spannung an, werden die Adern 3 und 4 mit kurzen Verbindungslinien angezeigt. Alternativ kann die Telefonleitung auch direkt in die MAIN-Buchse gesteckt werden, um zu prüfen, ob sie mit einem RJ11-Stecker versehen ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Hinweis:&#039;&#039; Es dürfen keine Wechselspannungen oder andere Hochspannungskreise gemessen werden. Andernfalls besteht die Gefahr eines Stromschlags.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Es ist gefährlich, PoE oder andere spannungsführende Quellen an die LENGTH-Buchse anzuschließen. Dies kann einen Stromschlag verursachen.|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie nach dem Einschalten die MODE-Taste, bis der Spannungsmessmodus (Voltage Testing Mode) aktiv ist. Verbinden Sie die zu prüfende Batterie oder andere Spannungsquelle mit den mitgelieferten Krokodilklemmenkabeln. Die Polarität wird angezeigt. Drücken Sie alternativ die MODE-Taste, bis POE und V im Display erscheinen. Das Gerät ist nun im Spannungsmessmodus bereit und zeigt Spannung und Polarität an. Die Nummer der positiven Ader blinkt.&lt;br /&gt;
&lt;br /&gt;
=== Kabelverfolgung (SCAN) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p12_cabletracing.svg|thumb|center|550px|Hauptgerät und Empfänger bei der Kabelverfolgung]]&lt;br /&gt;
&lt;br /&gt;
Diese Funktion hilft dem Anwender, das gesuchte Kabel unter vielen Kabeln zu identifizieren. Stecken Sie ein Ende des Zielkabels (z.&amp;amp;nbsp;B. Netzwerkkabel, Telefonleitung oder ein mit der mitgelieferten Krokodilklemme angeschlossenes BNC-Kabel) in die MAIN-Buchse am Hauptgerät. Schalten Sie das Hauptgerät ein. Wählen Sie die Kabelverfolgungsfunktion. Bei Modellen ohne Multimeterfunktion befindet sich die SCAN-Taste an der rechten Seite. Drücken Sie sie, um die Kabelverfolgungsfunktion auszuwählen. Halten Sie die SCAN-Taste am Empfänger 2&amp;amp;nbsp;Sekunden gedrückt: Die blaue Anzeige (digitale Suche) oder die rote Anzeige (analoge Suche) schaltet sich ein. Bewegen Sie den Empfänger entlang der infrage kommenden Kabel (Netzwerkkabel, Telefon-Patchpanel, Steckverbinder, Hub). Hören Sie auf das Tonsignal und vergleichen Sie die Lautstärke. Nähert sich der Empfänger dem Zielkabel, wird das Tonsignal lauter; am lautesten ist es direkt am Zielkabel. In lauter Umgebung drücken Sie die ∧-Taste, um das Signal zur leichteren Identifikation zu wechseln. Das Gerät verfügt über zwei analoge Signale (angezeigt durch 1 und 3) und ein digitales Signal (angezeigt durch 2) auf dem Display. Bei Kabeln mit Modularstecker kann der Empfänger auch direkt eingesteckt werden.&lt;br /&gt;
&lt;br /&gt;
=== Durchgangsprüfung (CONTINUITY) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p13_continuity_device.svg|thumb|center|500px|Durchgangsprüfung: Anschluss und Schaltsymbol]]&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion wird eine nicht an ein Netzwerk angeschlossene Telefonleitung auf Kurzschluss geprüft. Stellen Sie vor der Prüfung sicher, dass die Telefonleitung spannungsfrei ist. Bei unterbrochenem Stromkreis zeigt das Display „OL“ an.&lt;br /&gt;
&lt;br /&gt;
Bei Kabeln mit Modularstecker stecken Sie das Kabel zur Prüfung direkt in die MAIN/RJ45-Buchse. Andernfalls schließen Sie das Prüfkabel mit den mitgelieferten Krokodilklemmen an.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann auch zur Durchgangsprüfung anderer Geräte verwendet werden. Das Gerät zeigt an, ob der Stromkreis unterbrochen ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie nach dem Einschalten die MODE-Taste, bis die Durchgangsprüfung aktiv ist. Das Display zeigt „Ω“; klemmen Sie die Krokodilklemmen an Netzwerkkabel, Elektrokabel bzw. Koaxialkabel. Besteht Durchgang, zeigt das Gerät „0&amp;amp;nbsp;Ω“ an, bei Unterbrechung „OL“.&lt;br /&gt;
&lt;br /&gt;
=== Digitale Kabelverfolgung ===&lt;br /&gt;
&lt;br /&gt;
Das Produkt ist ein störungsfreier digitaler Kabelsucher. Es nutzt fortschrittliche Digitaltechnik für eine präzise, störungsfreie digitale Kabelverfolgung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Die Bedienung des Hauptgeräts ist gleich. Die Bedienung des Empfängers unterscheidet sich: Halten Sie die SCAN-Taste 2&amp;amp;nbsp;Sekunden gedrückt, um ihn einzuschalten. Drücken Sie die Taste, um zwischen digitaler Kabelverfolgung, digitaler Verfolgung mit Vibration (falls beim jeweiligen Modell vorhanden) und analoger Kabelverfolgung zu wechseln. Halten Sie die Taste erneut 2&amp;amp;nbsp;Sekunden gedrückt, um ihn auszuschalten. Ohne Bedienung schaltet sich das Gerät nach 10&amp;amp;nbsp;Minuten automatisch ab.&lt;br /&gt;
&lt;br /&gt;
Nach Auswahl der Empfängerfunktion über die SCAN-Taste ist keine weitere Tastenbetätigung nötig. Drücken Sie die SCAN-Taste am Hauptgerät, um die Suchfunktion auszuwählen. Drücken Sie die Hz-Taste, um in den digitalen Suchmodus (L2) zu wechseln. Im digitalen Suchmodus kann die Suchfrequenz nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
Um den Suchvorgang zu beschleunigen, wird empfohlen, die Empfindlichkeit über das Einstellrad zunächst zu maximieren. Nähert sich das Zielkabel, verringern Sie die Empfindlichkeit, um es genau zu identifizieren. Zur Bestätigung, dass es sich um das richtige Kabel handelt, empfiehlt es sich, das Zielkabel in die RJ45-Buchse am Empfänger zu stecken. Leuchten alle LEDs am Empfänger, ist das angeschlossene Kabel das gesuchte Kabel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Digitale Suche (blaue LED-Anzeige):&#039;&#039;&#039; Es kommt die neueste digitale Suchtechnologie zum Einsatz. Das Hauptgerät sendet ein digitales Signal aus. Empfängt der Empfänger dieses über das Zielkabel laufende Signal, reagiert er mit einem Tonsignal (blaue Anzeige leuchtet) oder Vibration (blaue Anzeige blinkt).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Analoge Suche (rote LED-Anzeige):&#039;&#039;&#039; Auch hier wird empfohlen, die Empfindlichkeit zunächst zu maximieren und beim Annähern an das Zielkabel zu verringern, um es genau zu identifizieren.&lt;br /&gt;
&lt;br /&gt;
=== Kabellängenmessung (LENGTH) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p8_length.svg|thumb|center|450px|Anschluss zur Kabellängenmessung]]&lt;br /&gt;
&lt;br /&gt;
Nach dem Einschalten ist das Gerät bereit zur Kabellängenmessung. Diese Funktion eignet sich für verschiedene metallische Kabel (mindestens 2&amp;amp;nbsp;m lang), einschließlich Netzwerkkabel, Telefonleitungen und BNC-Kabel.&lt;br /&gt;
&lt;br /&gt;
Stecken Sie zur Längenmessung das Kabel in die LENGTH-Buchse. Lassen Sie das andere Kabelende frei; es darf nicht mit anderen Geräten verbunden werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background:#fff3cd; border:2px solid #d9822b;&amp;quot; | &#039;&#039;&#039;⚠ Warnung:&#039;&#039;&#039;Die LENGTH-Buchse ist ausschließlich für die Kabellängenmessung vorgesehen. Das Gerät kann beschädigt werden, wenn sie an PoE oder andere spannungsführende Geräte angeschlossen wird.|}&lt;br /&gt;
&lt;br /&gt;
Nach der Messung zeigt das Gerät den Zustand des Kabels an. Der Status jeder Ader (in der Reihenfolge 1,2,3,4,5,6,7,8) wird angezeigt. So kann der Anwender zusammen mit der Kabellänge erkennen, ob das Kabel in gutem Zustand ist.&lt;br /&gt;
&lt;br /&gt;
Drücken Sie die ∧-Taste, um zwischen der Längenmessung der einzelnen Aderpaare umzuschalten (z.&amp;amp;nbsp;B. Paar 1 und 2, 3 und 6, 4 und 5, 7 und 8). Drücken Sie die ∨-Taste, um den Kabeltyp auszuwählen (8P8C-Kabel, 4P4C-Kabel, Telefonleitungen und BNC-Kabel).&lt;br /&gt;
&lt;br /&gt;
Die Messgenauigkeit der Länge beträgt 2&amp;amp;nbsp;% ± 1&amp;amp;nbsp;m. Bei nicht standardisierten Leitungen sollten Anwender vor der Messung eine Kalibrierung durchführen (siehe [[#Längen- und Temperaturkalibrierung|Kalibrierung]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie die Ein/Aus-Taste, um das Gerät einzuschalten. Am unteren Displayrand werden 8P8C-Netzwerkkabel, 4P4C-Netzwerkkabel, Telefonleitungen und BNC-Kabel angezeigt.&lt;br /&gt;
&lt;br /&gt;
=== Cable Mapping (TEST) ===&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p10_cablemapping.svg|thumb|center|600px|Cable-Mapping-Prüfung mit Empfänger, HUB und Remote-ID-Einheit]]&lt;br /&gt;
&lt;br /&gt;
Mit der Cable-Mapping-Funktion können Anwender Leitungsunterbrechungen und die physische Verkabelung folgender Kabeltypen prüfen: UTP-Computernetzwerkkabel nach IEEE&amp;amp;nbsp;10Base-T bzw. EIA/TIA&amp;amp;nbsp;568A sowie 2- und 4-adrige Telefonleitungen und andere metallische Netzwerkkabel.&lt;br /&gt;
&lt;br /&gt;
Stecken Sie ein Ende des zu prüfenden Kabels in die MAIN-Buchse am Hauptgerät. Drücken Sie die MODE-Taste, um in den Cable-Mapping-Modus zu wechseln. Stecken Sie das andere Kabelende in die RJ45-Buchse am Empfänger. Stimmt die Anzeige am Empfänger mit der am Hauptgerät angezeigten Nummer überein, ist das geprüfte Kabel in gutem Zustand.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bedienung:&#039;&#039;&#039; Drücken Sie die MODE-Taste, um zwischen Cable Mapping (TEST), Switch-Belegungsprüfung, Prüfung der LED-Anzeigen an Switch-Ports und der Prüfung mit der Remote-ID-Einheit umzuschalten.&lt;br /&gt;
* Stecken Sie ein Ende des zu prüfenden Kabels in die MAIN-Buchse am Hauptgerät, das andere Ende in die entsprechende Buchse.&lt;br /&gt;
* Zur Kabelprüfung stecken Sie das andere Kabelende in die MAIN-Buchse am Empfänger. Das Hauptgerät zeigt nacheinander den Zustand jeder Ader an. Drücken Sie ∧ für den Schnellmodus, ∨ für den Normalmodus.&lt;br /&gt;
* Zur Switch-Belegungsprüfung schließen Sie das andere Kabelende an den Switch an. Das Hauptgerät zeigt nacheinander den Zustand jeder Ader an.&lt;br /&gt;
* Um die blinkenden Switch-Anzeigen zu prüfen, schließen Sie das andere Kabelende an den zu prüfenden Switch an. Die LED des Ports, der mit dem Hauptgerät verbunden ist, blinkt einmal pro Sekunde.&lt;br /&gt;
* Für die Prüfung mit der Remote-ID-Einheit schließen Sie das andere Kabelende an die Remote-ID-Einheit an. Das Hauptgerät zeigt die Nummer der angeschlossenen Remote-ID an.&lt;br /&gt;
&lt;br /&gt;
=== Multimeter-Funktionen ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Die folgenden Anweisungen gelten nur für Modelle mit Multimeterfunktion.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 1.1 Spannungsmessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie Wechselspannung (ACV) oder Gleichspannung (DCV).&lt;br /&gt;
# Berühren Sie mit den Prüfspitzen den Messpunkt. Das Gerät zeigt die gemessene Spannung an. Bei der Gleichspannungsmessung wird zusätzlich die Polarität der roten Leitung angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Wird „0L“ angezeigt, ist der Messbereich überschritten – Messung sofort abbrechen. Es dürfen keine Spannungen über 1000&amp;amp;nbsp;V DC bzw. 400&amp;amp;nbsp;V AC gemessen werden. Berühren Sie keine Hochspannungskreise; schließen Sie bei Hochspannungsmessungen niemals Netzwerkkabel, spannungsführende Leitungen oder Ladekabel an.&lt;br /&gt;
&lt;br /&gt;
==== 1.2 Strommessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die 10-A-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie Gleich- oder Wechselstrom.&lt;br /&gt;
# Berühren Sie mit den Prüfspitzen den Messpunkt. Das Gerät zeigt den gemessenen Strom an. Bei der Gleichstrommessung wird zusätzlich die Polarität der roten Leitung angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Wird „0L“ angezeigt, ist der Messbereich überschritten – Messung sofort abbrechen. Es dürfen keine Ströme über 10&amp;amp;nbsp;A gemessen werden (Messdauer unter 10&amp;amp;nbsp;Sekunden).&lt;br /&gt;
&lt;br /&gt;
==== 1.3 Widerstandsmessung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse.&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie die Widerstandsfunktion. Berühren Sie mit den Prüfspitzen das Messobjekt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; „0L“ bedeutet Überschreitung des Messbereichs oder eine Unterbrechung im Messobjekt. Stellen Sie sicher, dass das Messobjekt spannungsfrei und vollständig entladen ist, bevor Sie messen. Legen Sie im Widerstandsmessbereich keine Spannung an. Bei hochohmigen Messungen (&amp;amp;gt;&amp;amp;nbsp;1&amp;amp;nbsp;MΩ) kann es einige Sekunden dauern, bis ein stabiler Messwert angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==== 1.4 Temperaturmessung ====&lt;br /&gt;
Drücken Sie die DMM-Taste und wählen Sie den Temperaturbereich. Stecken Sie das kalte (freie), negative (schwarze) Ende des Thermoelement-Fühlers in die COM-Buchse, das rote Ende in die VHz-Buchse. Bringen Sie die Fühlerspitze am oder auf dem Messobjekt an. Die Temperatur wird angezeigt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung:&#039;&#039; Verwenden Sie ausschließlich Thermoelemente vom Typ K, sonst kann der Messwert ungenau sein. Legen Sie im Temperaturmessbereich niemals eine Spannung an.&lt;br /&gt;
&lt;br /&gt;
==== 1.5 NCV-Erkennung (berührungslose Spannungsprüfung) ====&lt;br /&gt;
Drücken Sie die DMM-Taste und wählen Sie den NCV-Erkennungsbereich. Führen Sie den Sensor nahe an das Messobjekt heran. Die Spannung wird im analogen Balkendiagramm angezeigt; wird eine Spannung erkannt, ertönt ein Signalton.&lt;br /&gt;
&lt;br /&gt;
==== 1.6 Durchgangsprüfung ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse (Hinweis: die rote Leitung hat Polarität „+“).&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie die Durchgangsprüfung. Berühren Sie mit den Prüfspitzen das Messobjekt. Beträgt der Widerstand zwischen den beiden Kontaktpunkten weniger als 50&amp;amp;nbsp;Ω, ertönt ein Signalton.&lt;br /&gt;
&lt;br /&gt;
==== 1.7 Diodentest ====&lt;br /&gt;
# Stecken Sie die schwarze Leitung in die COM-Buchse, die rote Leitung in die VΩHz-Buchse (Hinweis: die rote Leitung hat Polarität „+“).&lt;br /&gt;
# Drücken Sie die DMM-Taste und wählen Sie den Diodenbereich. Verbinden Sie die rote Leitung mit der Anode, die schwarze Leitung mit der Kathode der Diode.&lt;br /&gt;
&lt;br /&gt;
==== 1.8 Automatische Abschaltung ====&lt;br /&gt;
Ohne Funktions- oder Tastenbetätigung wechselt das Gerät nach 20&amp;amp;nbsp;Minuten in den Ruhemodus. Im Ruhemodus stellt ein Druck auf die Ein/Aus-Taste den Normalbetrieb wieder her.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Anschluss der Prüfleitungen ===&lt;br /&gt;
&lt;br /&gt;
Das Gerät verfügt über Anschlussanzeigen an den Eingangsbuchsen, die dem Anwender die korrekte Steckerbelegung anzeigen. Falsches Anschließen der Prüfleitungen kann das Gerät beschädigen und/oder den Anwender verletzen. Stellen Sie vor jeder Messung sicher, dass der Anschluss korrekt ist.&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p16_testleads.svg|thumb|center|550px|Anschluss der Prüfleitungen für Spannungs-/Widerstands-/Dioden-/Temperaturmessung (oben) und für die 10-A-Strommessung (unten)]]&lt;br /&gt;
&lt;br /&gt;
== Längen- und Temperaturkalibrierung ==&lt;br /&gt;
&lt;br /&gt;
=== Längenkalibrierung ===&lt;br /&gt;
&lt;br /&gt;
Da Kabel aus unterschiedlichen Materialien eine unterschiedliche Leitfähigkeit besitzen, kann das Messergebnis ungenau sein. Um dies auszugleichen, kann das Gerät kalibriert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kalibrierungsverfahren&#039;&#039;&#039;&lt;br /&gt;
# Schließen Sie bei eingeschaltetem Gerät ein Kabel mit bekannter Länge an die LENGTH-Buchse am Hauptgerät an. Halten Sie im Kabellängenmess-Modus die Tasten ∧ und ∨ gemeinsam 3&amp;amp;nbsp;Sekunden gedrückt. Das Gerät wechselt in den Kalibriermodus; der Messwert blinkt. Passen Sie den angezeigten Wert mit den Tasten ∧/∨ an, bis er der tatsächlichen Kabellänge entspricht. Drücken Sie anschließend ∨ und MODE gleichzeitig, um das Ergebnis zu speichern und den Kalibriermodus zu verlassen. Jede andere Taste verlässt den Kalibriermodus ohne zu speichern.&lt;br /&gt;
# Halten Sie bei eingeschaltetem Gerät ∧ und MODE gemeinsam gedrückt, um das Gerät auf die Werkseinstellung zurückzusetzen.&lt;br /&gt;
# Das zur Kalibrierung verwendete Kabel mit bekannter Länge sollte mindestens 5&amp;amp;nbsp;m lang sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Temperaturkalibrierung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Messergebnis kann durch Temperaturunterschiede zwischen Umgebung und Geräteinnerem beeinflusst werden. Auch hierfür verfügt das Gerät über einen Kalibriermodus.&lt;br /&gt;
# Wählen Sie bei eingeschaltetem Gerät den Messmodus und halten Sie die Tasten ∧ und ∨ gemeinsam 3&amp;amp;nbsp;Sekunden gedrückt. Das Gerät wechselt in den Temperatur-Kalibriermodus; der Messwert blinkt. Passen Sie den angezeigten Wert mit ∧/∨ an, bis er der tatsächlichen Temperatur entspricht. Drücken Sie anschließend ∨ und MODE gleichzeitig, um zu speichern und den Modus zu verlassen. Jede andere Taste verlässt den Modus ohne zu speichern.&lt;br /&gt;
# Halten Sie bei eingeschaltetem Gerät ∧ und MODE gemeinsam gedrückt, um auf Werkseinstellung zurückzusetzen.&lt;br /&gt;
# Verwenden Sie zur Temperaturkalibrierung ein Quecksilberthermometer mit einer Auflösung von 0,1&amp;amp;nbsp;°C als Referenz.&lt;br /&gt;
&lt;br /&gt;
== Batterie- und Sicherungswechsel ==&lt;br /&gt;
&lt;br /&gt;
[[File:fig_p17_battery.svg|thumb|center|600px|Batteriewechsel im Hauptgerät (oben) und im Empfänger (unten)]]&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehebung ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Symptom !! Ursache !! Lösung&lt;br /&gt;
|-&lt;br /&gt;
| Hauptgerät || Display bleibt nach Drücken der Ein/Aus-Taste dunkel oder blinkt || Batterie leer || Hauptgerät aufladen oder Akku ersetzen (geschützter 3,7-V-Lithium-Akku)&lt;br /&gt;
|-&lt;br /&gt;
| Empfänger || Beim Drücken der SCAN-Taste ertönt während der Kabelverfolgung kein Ton || Batterie leer oder nicht eingelegt, oder Empfänger zu weit vom Zielkabel entfernt || Batterie wechseln oder Suchbereich vergrößern&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Produktwartung ==&lt;br /&gt;
&lt;br /&gt;
Dieses Gerät ist ein Präzisionsmessgerät. Achten Sie auf ausreichende Batterieladung. Befolgen Sie die Anweisungen, insbesondere im Hinblick auf den korrekten Anschluss an die Multimeter-Eingangsbuchsen. Der Anwender darf die Anschlussbelegung nicht verändern. Andernfalls kann das Gerät beschädigt und der Anwender verletzt werden.&lt;br /&gt;
&lt;br /&gt;
Pflegehinweise:&lt;br /&gt;
# Halten Sie das Gerät von Wasser und Staub fern. Lassen Sie es nicht fallen.&lt;br /&gt;
# Betreiben Sie das Gerät nicht in brennbarer, explosionsgefährdeter, sehr heißer, feuchter oder stark magnetischer Umgebung.&lt;br /&gt;
# Reinigen Sie das Gehäuse mit einem feuchten Tuch und einem milden Reinigungsmittel. Verwenden Sie keine Scheuer- oder Lösungsmittel.&lt;br /&gt;
# Entfernen Sie die Batterien, wenn das Gerät längere Zeit gelagert werden soll.&lt;br /&gt;
# Laden Sie das Gerät möglichst bald auf, sobald die Batterieanzeige aufleuchtet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fehlerbehebung und Warnhinweise:&#039;&#039;&#039; Funktioniert das Gerät nicht ordnungsgemäß, prüfen Sie Batterie, Sicherung und Ein-/Ausschalter. Lassen Sie das Gerät reparieren, falls sich das Problem nicht beheben lässt.&lt;br /&gt;
&lt;br /&gt;
Alle Angaben können ohne vorherige Ankündigung geändert werden. Sollten Sie Fehler oder fehlende Informationen feststellen, wenden Sie sich bitte an den Hersteller oder Ihren Händler. Das Unternehmen haftet nicht für Schäden oder Verletzungen, die durch unsachgemäße Bedienung entstehen. Keine der genannten Funktionen darf für sicherheitskritische Sonderzwecke herangezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Elektrische Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Automatische Abschaltung&#039;&#039;&#039;&lt;br /&gt;
* Hauptgerät: Schaltet sich nach 20&amp;amp;nbsp;Minuten ohne Tastenbetätigung automatisch ab.&lt;br /&gt;
* Empfänger: Schaltet sich nach 10&amp;amp;nbsp;Minuten ohne Tastenbetätigung automatisch ab.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stromaufnahme&#039;&#039;&#039;&lt;br /&gt;
* Hauptgerät: 40–130&amp;amp;nbsp;mA (je nach Funktion)&lt;br /&gt;
* Empfänger: ≤&amp;amp;nbsp;100&amp;amp;nbsp;mA&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stromversorgung&#039;&#039;&#039;&lt;br /&gt;
* Empfänger: 9-V-Blockbatterie&lt;br /&gt;
* Hauptgerät: geschützter 3,7-V-Lithium-Akku&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reichweite des Kabelverfolgungssignals:&#039;&#039;&#039; ≥&amp;amp;nbsp;3&amp;amp;nbsp;km&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sicherheit:&#039;&#039;&#039; Gefahrlos – die Prüfspitze kann direkt mit nicht hochspannungsführenden Metallleitern in Kontakt kommen.&lt;br /&gt;
&lt;br /&gt;
== Technische Daten ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grundfunktionen !! 616 !! 618&lt;br /&gt;
|-&lt;br /&gt;
| Analoge Verfolgung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Durchgangsprüfung || √ || über Multimeterfunktion&lt;br /&gt;
|-&lt;br /&gt;
| Switch-Verfolgung (mit PoE) || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Cable Mapping || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Blinkende Switch-Anzeige || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Störungsfreie digitale Verfolgung || Digital || Digital/Vibration&lt;br /&gt;
|-&lt;br /&gt;
| Spannungsprüfung || √ || über Multimeterfunktion&lt;br /&gt;
|-&lt;br /&gt;
| PoE-Spannungsmessung || Spannung/Polarität || Spannung/Polarität&lt;br /&gt;
|-&lt;br /&gt;
| Remote-ID-Zuordnung || optional || optional&lt;br /&gt;
|-&lt;br /&gt;
| Analoges Balkendiagramm || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| NCV-Erkennung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Sonstige Funktionen || colspan=&amp;quot;2&amp;quot; | Taschenlampe am Hauptgerät, Anschlussanzeige für Multimeter-Eingang, LCD-Display, weiße Taschenlampe, einstellbare Lautstärke bei analoger Verfolgung, einstellbare Empfindlichkeit bei digitaler Verfolgung, Anzeige für niedrigen Batteriestand, weiße Displaybeleuchtung, Energiesparfunktion, Verfolgungsreichweite 3&amp;amp;nbsp;km, einstellbares Verfolgungssignal&lt;br /&gt;
|-&lt;br /&gt;
| Sonderfunktionen || – || √&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Multimeterfunktionen&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Gleichspannung || – || 400&amp;amp;nbsp;mV–1000&amp;amp;nbsp;V ±(0,8&amp;amp;nbsp;%+3)&lt;br /&gt;
|-&lt;br /&gt;
| Wechselspannung || – || 4&amp;amp;nbsp;V–400&amp;amp;nbsp;V ±(1,5&amp;amp;nbsp;%+5)&lt;br /&gt;
|-&lt;br /&gt;
| Gleichstrom || – || 1,0–10,0&amp;amp;nbsp;A ±(1,2&amp;amp;nbsp;%+4)&lt;br /&gt;
|-&lt;br /&gt;
| Wechselstrom || – || 1,0–10,0&amp;amp;nbsp;A ±(2,0&amp;amp;nbsp;%+5)&lt;br /&gt;
|-&lt;br /&gt;
| Widerstand || – || 200&amp;amp;nbsp;Ω–20&amp;amp;nbsp;MΩ ±(2&amp;amp;nbsp;%+6)&lt;br /&gt;
|-&lt;br /&gt;
| Durchgang || – || &amp;amp;lt;&amp;amp;nbsp;50&amp;amp;nbsp;Ω, Summer ertönt&lt;br /&gt;
|-&lt;br /&gt;
| Diode || – || √&lt;br /&gt;
|-&lt;br /&gt;
| Temperatur (Typ K) || – || −20–1000&amp;amp;nbsp;°C ±(2,0&amp;amp;nbsp;%+15)&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerkkabel-Längenmessung || 400&amp;amp;nbsp;m || 500&amp;amp;nbsp;m&lt;br /&gt;
|-&lt;br /&gt;
| BNC-Kabel-Längenmessung || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerkkabel-Kurzschluss-/Unterbrechungstest || √ || √&lt;br /&gt;
|-&lt;br /&gt;
| Stromversorgung || colspan=&amp;quot;2&amp;quot; | Hauptgerät: 1250&amp;amp;nbsp;mAh wiederaufladbarer Lithium-Akku; Empfänger: 9-V-Batterie&lt;br /&gt;
|-&lt;br /&gt;
| Lieferumfang || Geschenkbox/Handbuch/Tragetasche/RJ45-Kabel/Krokodilklemmenkabel || Geschenkbox/Handbuch/Tragetasche/RJ45-Kabel/Prüfleitungen/Temperaturfühler Typ K&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Die Remote-ID-Einheit ist optisches Zubehör.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Die oben genannten Angaben stellen jeweils die besten erreichbaren Spezifikationen dar.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Benutzerhandbücher]]&lt;br /&gt;
[[Kategorie:Messgeräte]]&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_warning.svg&amp;diff=5240</id>
		<title>Datei:Icon warning.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_warning.svg&amp;diff=5240"/>
		<updated>2026-08-02T20:27:22Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_earth.svg&amp;diff=5239</id>
		<title>Datei:Icon earth.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_earth.svg&amp;diff=5239"/>
		<updated>2026-08-02T20:27:21Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_lowbattery.svg&amp;diff=5238</id>
		<title>Datei:Icon lowbattery.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Icon_lowbattery.svg&amp;diff=5238"/>
		<updated>2026-08-02T20:27:21Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p13_continuity_device.svg&amp;diff=5237</id>
		<title>Datei:Fig p13 continuity device.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p13_continuity_device.svg&amp;diff=5237"/>
		<updated>2026-08-02T20:27:20Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p12_cabletracing.svg&amp;diff=5236</id>
		<title>Datei:Fig p12 cabletracing.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p12_cabletracing.svg&amp;diff=5236"/>
		<updated>2026-08-02T20:27:17Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p11_voltage.svg&amp;diff=5235</id>
		<title>Datei:Fig p11 voltage.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p11_voltage.svg&amp;diff=5235"/>
		<updated>2026-08-02T20:27:07Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p8_length.svg&amp;diff=5234</id>
		<title>Datei:Fig p8 length.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p8_length.svg&amp;diff=5234"/>
		<updated>2026-08-02T20:27:03Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p17_battery.svg&amp;diff=5233</id>
		<title>Datei:Fig p17 battery.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p17_battery.svg&amp;diff=5233"/>
		<updated>2026-08-02T20:27:00Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p10_cablemapping.svg&amp;diff=5232</id>
		<title>Datei:Fig p10 cablemapping.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p10_cablemapping.svg&amp;diff=5232"/>
		<updated>2026-08-02T20:26:50Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p5_product.svg&amp;diff=5231</id>
		<title>Datei:Fig p5 product.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p5_product.svg&amp;diff=5231"/>
		<updated>2026-08-02T20:26:38Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p16_testleads.svg&amp;diff=5230</id>
		<title>Datei:Fig p16 testleads.svg</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Datei:Fig_p16_testleads.svg&amp;diff=5230"/>
		<updated>2026-08-02T20:26:23Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Datei hochgeladen mit MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Datei hochgeladen mit MsUpload&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(AVR)_Interrupts&amp;diff=5229</id>
		<title>(AVR) Interrupts</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(AVR)_Interrupts&amp;diff=5229"/>
		<updated>2026-07-31T16:05:35Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Externe Interrupts können im Prinzip über/von jedem I/O-Pin ausgelöst werden.&lt;br /&gt;
Wenn nicht ausdrücklich erwähnt beziehe ich mich bei meinen Aussagen auf den ATmega328P. Wenn jemand eine Info bezüglich eines anderen Prozessors benötigt, einfach unten in die Kommentare schreiben.&lt;br /&gt;
&lt;br /&gt;
Zu beachten:&lt;br /&gt;
* Ein Interrupt ist erst nach 4 Taktzyklen durch PCIF erkennbar. Bei 20 MHZ Taktfrequenz sind das immerhin 200ns (4x50ns) oder 0,2us. Es wird aber kein Interrupt &amp;quot;verschluckt&amp;quot; wenn der Auslöser länger als einen Taktzyklus dauert. Kürzere Impulse lösen nicht garantiert einen Interrupt aus. Bei 0-Pegel-Interrupts muss zuerst der aktuelle Befehl abgearbeitet werden.&lt;br /&gt;
* Nur INT0 (PD2) und INT1 (PD3) sind &amp;quot;vollwertige&amp;quot; Interrupts&lt;br /&gt;
* Die 3 PCIx sind jeweils für eine Gruppe von I/O-Pins zuständig (PCI0 für PCINT7..0, PCI1 für PCINT14..8 , PCI2 für PCINT23..16).  &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
During interrupts and subroutine calls, the return address program counter (PC) is stored on the stack. The stack is&lt;br /&gt;
effectively allocated in the general data SRAM, and consequently the stack size is only limited by the total SRAM size and&lt;br /&gt;
the usage of the SRAM. All user programs must initialize the SP in the reset routine (before subroutines or interrupts are&lt;br /&gt;
executed). The stack pointer (SP) is read/write accessible in the I/O space. The data SRAM can easily be accessed through&lt;br /&gt;
the five different addressing modes supported in the AVR architecture.&lt;br /&gt;
The memory spaces in the AVR architecture are all linear and regular memory maps.&lt;br /&gt;
A flexible interrupt module has its control registers in the I/O space with an additional global interrupt enable bit in the status&lt;br /&gt;
register. All interrupts have a separate interrupt vector in the interrupt vector table. The interrupts have priority in accordance&lt;br /&gt;
with their interrupt vector position. The lower the interrupt vector address, the higher the priority.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Die meisten Mikrocontroller besitzen einen oder mehrere I/O-Pins an denen abhaengig vom Zustandswechsel durch eine Programmunterroutine (Funktion) reagiert werden kann. Das ist natuerlich viel cleverer als in einer Schleife dauert nach einem Zustandswechsel zu &amp;quot;fragen&amp;quot; (Polling). Bei einem kleinen Mikrocontrollerprogramm, das nur das tut, mag das noch eine Ueberlegung wert sein. Sobald aber ein Programm ein wenig komplexer wird ist interrupten angesagt.&lt;br /&gt;
&lt;br /&gt;
Zum konfigurieren des Verhaltens bei einem Interrupt besitzen die Controller ein Reihe von Registern.&lt;br /&gt;
&lt;br /&gt;
Beim ATmega328P als erstes, das SREG (AVR Status Register) und darin das Global Interrupt Enable (Bit 7)&lt;br /&gt;
&lt;br /&gt;
 The global interrupt enable bit must be set for the interrupts to be enabled. The individual interrupt enable control is then&lt;br /&gt;
performed in separate control registers. If the global interrupt enable register is cleared, none of the interrupts are enabled&lt;br /&gt;
independent of the individual interrupt enable settings. The I-bit is cleared by hardware after an interrupt has occurred, and is&lt;br /&gt;
set by the RETI instruction to enable subsequent interrupts. The I-bit can also be set and cleared by the application with the&lt;br /&gt;
SEI and CLI instructions, as described in the instruction set reference.&lt;br /&gt;
&lt;br /&gt;
Abhaengig von den Bits BOOTRST, IVSEL, IVCE stehen die Interruptvektoren (siehe weiter unten) an einer anderen Position im Programmspeicher.&lt;br /&gt;
&lt;br /&gt;
Fuer die Interruptkontrolle sind folgende Register von Bedeutung: &lt;br /&gt;
* &#039;&#039;&#039;EICRA&#039;&#039;&#039; External Interrupt Control Register A (0x69) -&amp;gt; Interrupt Sense Control INT0/INT1 (siehe folgende Tabelle)&lt;br /&gt;
* &#039;&#039;&#039;EIMSK&#039;&#039;&#039; – External Interrupt Mask Register (0x1D/0x3D) -&amp;gt; External Interrupt Request INT0/INT1 Enable&lt;br /&gt;
* &#039;&#039;&#039;EIFR&#039;&#039;&#039; – External Interrupt Flag Register (0x1C/0x3C) -&amp;gt;  INTF0/INTF1: External Interrupt Flag 0/1&lt;br /&gt;
* &#039;&#039;&#039;PCICR&#039;&#039;&#039; – Pin Change Interrupt Control Register (0x68) -&amp;gt; PCIE0/1/2: Pin Change Interrupt Enable 0/1/2&lt;br /&gt;
* &#039;&#039;&#039;PCIFR&#039;&#039;&#039; – Pin Change Interrupt Flag Register (0x1B/0x3B) -&amp;gt; PCIF0/1/2: Pin Change Interrupt Flag 0/1/2&lt;br /&gt;
* &#039;&#039;&#039;PCMSK2&#039;&#039;&#039; – Pin Change Mask Register 2 (0x6D) -&amp;gt; PCINT23-PCINT16&lt;br /&gt;
* &#039;&#039;&#039;PCMSK1&#039;&#039;&#039; – Pin Change Mask Register 1 (0x6C) -&amp;gt; PCINT14-PCINT8 (kein PCINT15!)&lt;br /&gt;
* &#039;&#039;&#039;PCMSK0&#039;&#039;&#039; – Pin Change Mask Register 0 (0x6B) -&amp;gt; PCINT7-PCINT0&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu den PC-Interrupts, die nur auf einen Wechsel des Zustandes reagieren, koennen INT0/1 auch auch auf fallende und steigende Flanken und Zustaende reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==INT1 INT0==&lt;br /&gt;
Dies sind die &amp;quot;vollwertigen&amp;quot; Interrupts. &lt;br /&gt;
* Können auf fallende und steigende Flanke und 0-Pegel triggern (-&amp;gt; EICRA)&lt;br /&gt;
* Bei der 0-Pegel wird der Trigger solange ausgelöst bis wieder 1-Pegel anliegt.&lt;br /&gt;
&lt;br /&gt;
An- und Ausschalten kann man die beiden Interrupts im EIMSK – External Interrupt Mask Register. Mask sollte vielleicht besser Enable heißen.&lt;br /&gt;
&lt;br /&gt;
Das EICRA – External Interrupt Control Register A (0x69) dient ausschließlich (Interrupt Sense Control Bit0-3) der Triggereinstellung von INT0 und INT1&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Interrupt 0/1 Sense Control&lt;br /&gt;
|-&lt;br /&gt;
!ISCx1!!ISCx0!!Verhalten&lt;br /&gt;
|-&lt;br /&gt;
|0||0|| Ein &#039;&#039;&#039;LOW-Pegel&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|0||1|| Ein &#039;&#039;&#039;Logik-Wechsel&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|1||0|| Eine &#039;&#039;&#039;fallende Flanke&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|1||1|| Ein &#039;&#039;&#039;steigende Flanke&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
oder kurz&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!ISCx1!!ISCx0!! INTx reagiert auf ...&lt;br /&gt;
|-&lt;br /&gt;
|0||0|| 0-Pegel&lt;br /&gt;
|-&lt;br /&gt;
|0||1|| Pegelwechsel&lt;br /&gt;
|-&lt;br /&gt;
|1||0|| fallende Flanke&lt;br /&gt;
|-&lt;br /&gt;
|1||1|| steigende Flanke&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
===Anwendungsbeispiel===&lt;br /&gt;
Immer mal wieder habe ich gelesen, dass ein Taster am Interrupt eine schlechte Idee sei. Wegen Tastenprellen und so. Manche behaupten sogar es ginge gar nicht. Hier der Gegenbeweis. Funktioniert bei mir völlig zufriedenstellend. Hier benutze ich die ISR-Variante. Später werde ich weiter unten auch mal eine Gegenüberstellung mit der attachInterrupt-Variante ergänzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt; // fuer ISR Makro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const byte ledPin = 5;&lt;br /&gt;
volatile byte ledState = LOW;&lt;br /&gt;
byte lastledState;&lt;br /&gt;
&lt;br /&gt;
const byte interruptPin = 3;&lt;br /&gt;
&lt;br /&gt;
ISR (INT1_vect){&lt;br /&gt;
  EIFR|=(1&amp;lt;&amp;lt;INTF1); // Interrupt Flag zu Sicherheit schon mal loeschen&lt;br /&gt;
  EIMSK&amp;amp;=~(1&amp;lt;&amp;lt;INT1); // Interrupt abschalten&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup(){&lt;br /&gt;
  Serial.begin(115200); // vielleicht brauche ich es &lt;br /&gt;
&lt;br /&gt;
  pinMode(ledPin, OUTPUT);  // LED-Anschluss auf Ausgang&lt;br /&gt;
  digitalWrite(ledPin, LOW); // LED ausschalten&lt;br /&gt;
&lt;br /&gt;
  pinMode(interruptPin, INPUT); // dies ist nicht zwingend notwendig, der Interrupt funktioniert auch im Output-Mode&lt;br /&gt;
&lt;br /&gt;
  EICRA |= (1&amp;lt;&amp;lt;ISC11); // auf fallende Flanke reagieren (Der Taster tastet nach GND über einen Pullup-Widerstand.)&lt;br /&gt;
  EIMSK |= (1&amp;lt;&amp;lt;INT1); // INT1-Interrupt einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){ &lt;br /&gt;
  if (lastledState!=ledState){&lt;br /&gt;
    digitalWrite(ledPin, ledState);&lt;br /&gt;
    delay(200);  // entprellen&lt;br /&gt;
    EIFR|=(1&amp;lt;&amp;lt;INTF1); // Interruptflag (nochmal) loeschen&lt;br /&gt;
    EIMSK|=(1&amp;lt;&amp;lt;INT1);  // Interrupt wieder einschalten&lt;br /&gt;
    lastledState=ledState; // Veraenderung merken&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sei hier bemerkt, dass innerhalb einer Interruptroutine (ISR) z.B. kein delay() und millis() funktioniert. Sobald man etwas nutzt was auch Interrupts benutzt ist der Ärger mit einprogrammiert. Am besten programmiert man nach dem Motto: &lt;br /&gt;
&lt;br /&gt;
 Nur das Notwendigste erledigen und direkt wieder raus, d.h. am besten nur Variablen setzen und keine Unterroutinen. &lt;br /&gt;
&lt;br /&gt;
Wenn ich zeitkritische Routinen geschrieben habe, bin ich auch schon mal auf Inline-Assembler ausgewichen, habe Taktzyklen der Opcodes gezählt und die Gesamtlaufzeit durch I/O-Pin-Trigger auf einem Oszi nachgemessen:-)&lt;br /&gt;
&lt;br /&gt;
==PCINT0-23==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Grafikkarte_mehrere_Monitore&amp;diff=5228</id>
		<title>Grafikkarte mehrere Monitore</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Grafikkarte_mehrere_Monitore&amp;diff=5228"/>
		<updated>2026-07-31T16:04:30Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Problem=&lt;br /&gt;
Meine ASUStek STRIX-GTX1050TI-O4G-GAMING Grafikkarte hat 4(!) Anschluesse 2 x DVI-D, 1 x HDMI 2.0b und 1 x DisplayPort 1.4.&lt;br /&gt;
&lt;br /&gt;
Einmal ist es mir tatsaechlich gelungen vier Monitore gleichzeitig mit einem Bild zu versorgen. Sobald aber ein Monitor ausgeschaltet wurde, war eine Reaktivierung nicht mehr moeglich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Da zwei Monitore TV-Geraete/Beamer sind, wollte ich nicht ein riesiges Display, bei dem alle Screens nebeneinander liegen, sondern einzelne Screens (3) um Programme leichter direkt auf einem Screen platzieren zu koennen. &lt;br /&gt;
&lt;br /&gt;
Das schlimme ist, durch die vielen Versuche ging alles irgendwie immer weniger, bis ich zum Schluss, egal welche Kombination ich waehlte, nur noch einen Monitor und einen TV ans laufen bekam.&lt;br /&gt;
&lt;br /&gt;
=Loesungshinweise=&lt;br /&gt;
&lt;br /&gt;
Leider steht im Datenblatt kein Hinweis auf die maximale Anzahl gleichzeitiger Nutzung von angeschlossenen Monitoren. Also gehe ich mal davon aus, dass solange die maximale Displaygroesze von 7680x4320 nicht ueberschritten wird, bis zu vier unterschiedliche Bilder ausgegeben werden koennen. &lt;br /&gt;
Bei vier FullHD Screens sollte also, die maximale Displaygroesze weder horizontal noch vertikal ueberschritten sein.&lt;br /&gt;
&lt;br /&gt;
==xrandr, inxi, nvidia-setting, ...==&lt;br /&gt;
&lt;br /&gt;
Starten wir mal mit xrandr.&lt;br /&gt;
&lt;br /&gt;
 chris@server:&amp;gt; xrandr -d :0.0 -q&lt;br /&gt;
 Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767&lt;br /&gt;
 DP-0 disconnected (normal left inverted right x axis y axis)&lt;br /&gt;
 DP-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm&lt;br /&gt;
   1920x1080     60.00*+&lt;br /&gt;
   1680x1050     59.95  &lt;br /&gt;
   1600x1200     60.00  &lt;br /&gt;
   1440x900      59.89  &lt;br /&gt;
   1400x1050     59.98  &lt;br /&gt;
   1280x1024     75.02    60.02  &lt;br /&gt;
   1280x960      60.00  &lt;br /&gt;
   1152x864      75.00  &lt;br /&gt;
   1024x768      75.03    70.07    60.00  &lt;br /&gt;
   800x600       75.00    72.19    60.32    56.25  &lt;br /&gt;
   640x480       75.00    72.81    59.94  &lt;br /&gt;
 DVI-D-1 connected (normal left inverted right x axis y axis)&lt;br /&gt;
   1920x1080     60.00 +  59.94    50.00    23.98    60.05    60.00    50.04  &lt;br /&gt;
   1360x768      60.02  &lt;br /&gt;
   1280x720      60.00    59.94    50.00  &lt;br /&gt;
   1024x768      60.00  &lt;br /&gt;
   800x600       60.32  &lt;br /&gt;
   720x576       50.00  &lt;br /&gt;
   720x480       59.94  &lt;br /&gt;
   640x480       59.94    59.93  &lt;br /&gt;
 chris@server:&amp;gt; xrandr -d :0.1 -q&lt;br /&gt;
 Screen 1: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767&lt;br /&gt;
 HDMI-0 disconnected primary (normal left inverted right x axis y axis)&lt;br /&gt;
 chris@server:&amp;gt; xrandr -d :0.2 -q&lt;br /&gt;
 Screen 2: minimum 8 x 8, current 640 x 480, maximum 32767 x 32767&lt;br /&gt;
 DVI-D-0 disconnected primary (normal left inverted right x axis y axis)&lt;br /&gt;
&lt;br /&gt;
 i2cdetect -l&lt;br /&gt;
 i2c-3   i2c             NVIDIA i2c adapter 8 at f:00.0          I2C adapter&lt;br /&gt;
 i2c-1   i2c             NVIDIA i2c adapter 6 at f:00.0          I2C adapter&lt;br /&gt;
 i2c-2   i2c             NVIDIA i2c adapter 7 at f:00.0          I2C adapter&lt;br /&gt;
 i2c-0   i2c             NVIDIA i2c adapter 1 at f:00.0          I2C adapter&lt;br /&gt;
&lt;br /&gt;
Also ddc sollte in der Lage sein alle vier angschlossenen Monitore zu kontaktieren.&lt;br /&gt;
&lt;br /&gt;
 ddcutil detect&lt;br /&gt;
 Display 1&lt;br /&gt;
    I2C bus:  /dev/i2c-1&lt;br /&gt;
    EDID synopsis:&lt;br /&gt;
       Mfg id:               HPN - UNK&lt;br /&gt;
       Model:                HP E24t G5&lt;br /&gt;
       Product code:         14602  (0x390a)&lt;br /&gt;
       Serial number:        CNC4191B0T&lt;br /&gt;
       Binary serial number: 1684XXXX (0xXXXXXXXX)&lt;br /&gt;
       Manufacture year:     2024,  Week: 19&lt;br /&gt;
    VCP version:         2.2 &lt;br /&gt;
 &lt;br /&gt;
 Display 2&lt;br /&gt;
    I2C bus:  /dev/i2c-2&lt;br /&gt;
    DRM connector:           card0-DP-1&lt;br /&gt;
    EDID synopsis:&lt;br /&gt;
       Mfg id:               HSD - HannStar Display Corp&lt;br /&gt;
       Model:                HE247DPB&lt;br /&gt;
       Product code:         18871  (0x49b7)&lt;br /&gt;
       Serial number:        123456789XXXX&lt;br /&gt;
       Binary serial number: 0 (0x00000000)&lt;br /&gt;
       Manufacture year:     2012,  Week: 26&lt;br /&gt;
    VCP version:         2.1&lt;br /&gt;
 &lt;br /&gt;
 Invalid display&lt;br /&gt;
    I2C bus:  /dev/i2c-3&lt;br /&gt;
    DRM connector:           card0-HDMI-A-1&lt;br /&gt;
    EDID synopsis:&lt;br /&gt;
       Mfg id:               SNY - Sony&lt;br /&gt;
       Model:                SONY TV&lt;br /&gt;
       Product code:         10241  (0x2801)&lt;br /&gt;
       Serial number:        &lt;br /&gt;
       Binary serial number: XXXXXXXX (0xXXXXXXX)&lt;br /&gt;
       Manufacture year:     2007,  Week: 1&lt;br /&gt;
    DDC communication failed &lt;br /&gt;
&lt;br /&gt;
I2C/-0 wird nicht erkannt, der HP hat kein DRM und der Sony hat ein Kommunikationproblem. Na toll.&lt;br /&gt;
&lt;br /&gt;
Hier ist der Grund: Der Sony am i2c-3 hat keinen DDC-Chip (Adresse 37), sondern nur einen EDID-Chip (0x50). Der Samsung am i2c-0 hat weder noch und wird somit erst gar nicht erkannt.&lt;br /&gt;
&lt;br /&gt;
 server:~ # i2cdetect -y 0&lt;br /&gt;
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
 00:          -- -- -- -- -- 08 -- -- -- -- -- -- -- &lt;br /&gt;
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- -- &lt;br /&gt;
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- &lt;br /&gt;
 70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
 server:~ # i2cdetect -y 1&lt;br /&gt;
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 30: -- -- -- -- -- -- -- 37 -- -- 3a -- -- -- -- -- &lt;br /&gt;
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
 server:~ # i2cdetect -y 2&lt;br /&gt;
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 30: 30 -- -- -- -- -- -- 37 -- -- -- -- -- -- -- -- &lt;br /&gt;
 40: 40 -- -- -- -- -- -- -- -- -- 4a 4b -- -- -- -- &lt;br /&gt;
 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
 server:~ # i2cdetect -y 3&lt;br /&gt;
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
 00:          -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 30: -- -- -- -- -- -- -- -- -- -- 3a 3b -- -- -- -- &lt;br /&gt;
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
 70: -- -- -- -- -- -- -- --  &lt;br /&gt;
&lt;br /&gt;
Slave addresses x50 (EDID) and x37 (DDC). xrandr has ways other than I2C to access the EDID, e.g. by BIOS calls&lt;br /&gt;
Daraus koennte man jetzt schlieszen ,dass i2c-0 DVI-D-0, i2c-1 DVI-D-1, i2c-2 DP1 und i2c-3 HDMI ist.&lt;br /&gt;
&lt;br /&gt;
=Anzahl Anschluesse/Displays/Screens=&lt;br /&gt;
==Hinweise aus dem Netz==&lt;br /&gt;
&lt;br /&gt;
 Also ich glaub die ganze gtx 1000 Serie unterstützt 4 Displays. Sonst kannst du einfach an die onboard was anschließen oder ne 2. Grafikkarte nehmen &lt;br /&gt;
&lt;br /&gt;
 Das ist schon korrekt, viele Grafikkarten können nicht mit 3 Bildschirmen umgehen, auch wenn mehr Anschlüsse vorhanden sind. Dies ist auch vom Hersteller abhängig. An meiner GTX 1050 TI Asus ROG Strix kann ich z.B. problemlos 3 Bildschirme betreiben.&lt;br /&gt;
&lt;br /&gt;
Wenig hilfreiche Hinweise gibt es auch. Gut find ich das mit dem VGA-Tipp;-))&lt;br /&gt;
&lt;br /&gt;
[[Datei:GuteFrage Screenshot GTX1050 3Monitore.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Viele Foreneintraege koennte man sich sparen, wenn man einfach mal die Dokumentation liest.&lt;br /&gt;
&lt;br /&gt;
 Most NVIDIA GPUs based on the Kepler¹ architecture, or newer, support driving up to four display devices simultaneously. Most NVIDIA GPUs older than Kepler¹ support driving up to two display devices simultaneously.&lt;br /&gt;
&lt;br /&gt;
¹Kepler-Architektur (GeForce 600/700 Serien, 2012)&lt;br /&gt;
&lt;br /&gt;
=Ueberpruefung=&lt;br /&gt;
Dabei kann es doch so einfach sein Klarheit herzustellen.&lt;br /&gt;
&lt;br /&gt;
==Beispiel #1 NVIDIA Quadro M2000==&lt;br /&gt;
&lt;br /&gt;
 nvidia-settings -q dpys&lt;br /&gt;
 &lt;br /&gt;
 8 Display Devices on worker:0&lt;br /&gt;
 &lt;br /&gt;
    [0] worker:0[dpy:0] (DP-0) (connected, enabled)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-0&lt;br /&gt;
        DPY-EDID-87977d39-dc91-e2a7-5b42-4bf2d8422cd8&lt;br /&gt;
        DPY-0&lt;br /&gt;
        DP-0&lt;br /&gt;
        Connector-2&lt;br /&gt;
 &lt;br /&gt;
    [1] worker:0[dpy:1] (DP-1)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-1&lt;br /&gt;
        DPY-1&lt;br /&gt;
        DP-1&lt;br /&gt;
        Connector-2&lt;br /&gt;
 &lt;br /&gt;
    [2] worker:0[dpy:2] (DP-2)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-2&lt;br /&gt;
        DPY-2&lt;br /&gt;
        DP-2&lt;br /&gt;
        Connector-3&lt;br /&gt;
 &lt;br /&gt;
    [3] worker:0[dpy:3] (DP-3)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-3&lt;br /&gt;
        DPY-3&lt;br /&gt;
        DP-3&lt;br /&gt;
        Connector-3&lt;br /&gt;
 &lt;br /&gt;
    [4] worker:0[dpy:4] (DP-4) (connected, enabled)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-4&lt;br /&gt;
        DPY-EDID-ed2ec75d-f371-e005-c6ea-73642b39d8a8&lt;br /&gt;
        DPY-4&lt;br /&gt;
        DP-4&lt;br /&gt;
        Connector-1&lt;br /&gt;
 &lt;br /&gt;
    [5] worker:0[dpy:5] (DP-5)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-5&lt;br /&gt;
        DPY-5&lt;br /&gt;
        DP-5&lt;br /&gt;
        Connector-1&lt;br /&gt;
 &lt;br /&gt;
    [6] worker:0[dpy:6] (DP-6)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-6&lt;br /&gt;
        DPY-6&lt;br /&gt;
        DP-6&lt;br /&gt;
        Connector-0&lt;br /&gt;
 &lt;br /&gt;
    [7] worker:0[dpy:7] (DP-7)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-7&lt;br /&gt;
        DPY-7&lt;br /&gt;
        DP-7&lt;br /&gt;
        Connector-0&lt;br /&gt;
&lt;br /&gt;
Diese Karte hat tatsaechlich 4 DP Anschluesse und koennte an jedem der 4 Konnektoren je 2 Monitor betreiben (MST?).&lt;br /&gt;
&lt;br /&gt;
 chris@worker:~&amp;gt; ddcutil detect&lt;br /&gt;
 Display 1&lt;br /&gt;
   I2C bus:  /dev/i2c-2&lt;br /&gt;
   DRM connector:           card0-DP-1&lt;br /&gt;
   EDID synopsis:&lt;br /&gt;
      Mfg id:               SAM - Samsung Electric Company&lt;br /&gt;
      Model:                U28E590&lt;br /&gt;
      Product code:         3149  (0x0c4d)&lt;br /&gt;
      Serial number:        H4LN609169&lt;br /&gt;
      Binary serial number: 1113216074 (0x425a544a)&lt;br /&gt;
      Manufacture year:     2020,  Week: 26&lt;br /&gt;
   VCP version:         2.0&lt;br /&gt;
 &lt;br /&gt;
 Display 2&lt;br /&gt;
   I2C bus:  /dev/i2c-4&lt;br /&gt;
   DRM connector:           card0-DP-3&lt;br /&gt;
   EDID synopsis:&lt;br /&gt;
      Mfg id:               SAM - Samsung Electric Company&lt;br /&gt;
      Model:                U28E590&lt;br /&gt;
      Product code:         3149  (0x0c4d)&lt;br /&gt;
      Serial number:        HTPKC14310&lt;br /&gt;
      Binary serial number: 810375238 (0x304d5846)&lt;br /&gt;
      Manufacture year:     2018,  Week: 51&lt;br /&gt;
   VCP version:         2.0&lt;br /&gt;
&lt;br /&gt;
Und hier hat wieder 5-jaehrige Schimpanse zugeschlagen. Laut nvidia-setting sind die 4 Konnektoren &lt;br /&gt;
* 0: DP-6 und DP-7 &lt;br /&gt;
* 1: DP-4 und DP-5 Monitor (links an card0-DP-3) 0MX......4310J&lt;br /&gt;
* 2: DP-0 und DP-1 Monitor (rechts an card0-DP-1) BZT......9169J&lt;br /&gt;
* 3: DP-2 und DP-3&lt;br /&gt;
&lt;br /&gt;
Die Karte besitzt 5 (!) I2C-Bus Adapter.&lt;br /&gt;
 &lt;br /&gt;
 i2cdetect -l&lt;br /&gt;
 i2c-3   i2c             NVIDIA i2c adapter 7 at 4:00.0          I2C adapter&lt;br /&gt;
 i2c-1   i2c             NVIDIA i2c adapter 2 at 4:00.0          I2C adapter&lt;br /&gt;
 i2c-4   i2c             NVIDIA i2c adapter 8 at 4:00.0          I2C adapter&lt;br /&gt;
 i2c-2   i2c             NVIDIA i2c adapter 6 at 4:00.0          I2C adapter&lt;br /&gt;
 i2c-0   smbus           SMBus I801 adapter at 0780              SMBus adapter&lt;br /&gt;
 i2c-5   i2c             NVIDIA i2c adapter 9 at 4:00.0          I2C adapter&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung zu den Konnektoren wirft Fragen auf. Connector 1 -&amp;gt; i2c-2 und Connector 2 -&amp;gt; i2c-4.&lt;br /&gt;
&lt;br /&gt;
==Beispiel #2 NVIDIA GeForce GTX 1050 Ti== &lt;br /&gt;
&lt;br /&gt;
(per ssh) &lt;br /&gt;
server:~ # DISPLAY=:0 nvidia-settings -q dpys&lt;br /&gt;
&lt;br /&gt;
 5 Display Devices on server:0&lt;br /&gt;
 &lt;br /&gt;
    [0] server:0[dpy:0] (DVI-D-0) (connected)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-0&lt;br /&gt;
        DPY-EDID-aab368ea-d801-739e-62ca-6109e2567e6d&lt;br /&gt;
        DPY-0&lt;br /&gt;
        DVI-D-0&lt;br /&gt;
        Connector-0&lt;br /&gt;
 &lt;br /&gt;
    [1] server:0[dpy:1] (HDMI-0)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-1&lt;br /&gt;
        DPY-1&lt;br /&gt;
        HDMI-0&lt;br /&gt;
        Connector-1&lt;br /&gt;
 &lt;br /&gt;
    [2] server:0[dpy:2] (DP-0)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-2&lt;br /&gt;
        DPY-2&lt;br /&gt;
        DP-0&lt;br /&gt;
        Connector-2&lt;br /&gt;
 &lt;br /&gt;
    [3] server:0[dpy:3] (DP-1) (connected, enabled)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-3&lt;br /&gt;
        DPY-EDID-05c8daf9-506c-f4bb-5bf1-0a886a401315&lt;br /&gt;
        DPY-3&lt;br /&gt;
        DP-1&lt;br /&gt;
        Connector-2&lt;br /&gt;
 &lt;br /&gt;
    [4] server:0[dpy:4] (DVI-D-1)&lt;br /&gt;
 &lt;br /&gt;
      Has the following names:&lt;br /&gt;
        DFP&lt;br /&gt;
        DFP-4&lt;br /&gt;
        DPY-4&lt;br /&gt;
        DVI-D-1&lt;br /&gt;
        Connector-3&lt;br /&gt;
&lt;br /&gt;
Diese Karte hat 4 Anschluesse: 2 DVI-D (nebeneinander 2 Slots Connector-0 und Connector-3), HDMI (Connector-1) und ein DP (Connector-2)&lt;br /&gt;
&lt;br /&gt;
Was mir auffaellt. &lt;br /&gt;
*DVI-D-0 ist connected, aber nicht enabled&lt;br /&gt;
*HDMI-0: Der angschlossene Sony TV ist nicht connected&lt;br /&gt;
*DVI-D-1: Der angschlossene Samsung TV ist nicht connected&lt;br /&gt;
&lt;br /&gt;
Vielleicht hilft die Option &amp;quot;ConnectedMonitor&amp;quot;.&lt;br /&gt;
 Option &amp;quot;ConnectedMonitor&amp;quot; &amp;quot;DVI-D-0, DVI-D-1, HDMI-0, DP-1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Vergleich Xorg.conf=&lt;br /&gt;
Wie ist also die Hardware in Xorg.conf hinterlegt?&lt;br /&gt;
&lt;br /&gt;
==Quadro M2000==&lt;br /&gt;
&lt;br /&gt;
Die Input-Devices habe ich rausgenommen.&lt;br /&gt;
&lt;br /&gt;
 more /etc/X11/xorg.conf&lt;br /&gt;
 # nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;
 # nvidia-settings:  version 550.127.05 &lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;ServerLayout&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Layout0&amp;quot;&lt;br /&gt;
    Screen      0  &amp;quot;Screen0&amp;quot; 0 0&lt;br /&gt;
    InputDevice    &amp;quot;Keyboard0&amp;quot; &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
    InputDevice    &amp;quot;Mouse0&amp;quot; &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Xinerama&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
    # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
    Identifier     &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;Unknown&amp;quot;&lt;br /&gt;
    ModelName      &amp;quot;Samsung U28E590&amp;quot;&lt;br /&gt;
    HorizSync       30.0 - 135.0&lt;br /&gt;
    VertRefresh     56.0 - 75.0&lt;br /&gt;
    Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Device&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Device0&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
    BoardName      &amp;quot;Quadro M2000&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Screen0&amp;quot;&lt;br /&gt;
    Device         &amp;quot;Device0&amp;quot;&lt;br /&gt;
    Monitor        &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
    DefaultDepth    24&lt;br /&gt;
    Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;DP-4&amp;quot;&lt;br /&gt;
    Option         &amp;quot;metamodes&amp;quot; &amp;quot;DP-4: nvidia-auto-select +0+0, DP-0: nvidia-auto-select +3840+0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
    SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
        Depth       24&lt;br /&gt;
    EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
&lt;br /&gt;
Was schon mal auffaellt, obwohl 2 Monitore an 2 unterschiedlichen Displayports angeschlossen sind taucht nur ein Monitor0 auf. (NB: VendorName &amp;quot;Unkown&amp;quot; Wer hat denn da wieder geschlafen?)&lt;br /&gt;
&lt;br /&gt;
*ServerLayout [https://www.x.org/archive/X11R7.6/doc/man/man5/xorg.conf.5.xhtml#heading16]&lt;br /&gt;
*Monitor [https://www.x.org/archive/X11R7.6/doc/man/man5/xorg.conf.5.xhtml#heading12]&lt;br /&gt;
*Device [https://www.x.org/archive/X11R7.6/doc/man/man5/xorg.conf.5.xhtml#heading10]&lt;br /&gt;
*Screen [https://www.x.org/archive/X11R7.6/doc/man/man5/xorg.conf.5.xhtml#heading14]&lt;br /&gt;
&lt;br /&gt;
NVidia xorgconfoptions [https://http.download.nvidia.com/XFree86/Linux-x86/325.15/README/xconfigoptions.html] nur fuer den Treiber 325.15 verfuegbar(???).&lt;br /&gt;
&lt;br /&gt;
Die beiden Options von Interesse sind:&lt;br /&gt;
* nvidiaXineramaInfoOrder&lt;br /&gt;
 The option string is a comma-separated list of display device names. The display device names can either be general (e.g, &amp;quot;CRT&amp;quot;, which identifies all CRTs), or specific (e.g., &amp;quot;CRT-1&amp;quot;, which identifies a particular CRT). Not all display devices need to be identified in the option string; display devices that are not listed will be implicitly appended to the end of the list, in their default order.&lt;br /&gt;
 &lt;br /&gt;
 Note that nvidiaXineramaInfoOrder tracks all display devices that could possibly be connected to the GPU, not just the ones that are currently enabled. When reporting the Xinerama information, the NVIDIA X driver walks through the display devices in the order specified, only reporting enabled display devices.&lt;br /&gt;
&lt;br /&gt;
*MetaModes (GroszKleinSchreibung?²)&lt;br /&gt;
 This option describes the combination of modes to use on each monitor when using TwinView or SLI Mosaic Mode. See Chapter 12, Configuring Multiple Display Devices on One X Screen and Chapter 29, Configuring SLI and Multi-GPU FrameRendering for details. Default: string is NULL.&lt;br /&gt;
&lt;br /&gt;
²Just as in all X config entries, spaces are ignored and all entries are case insensitive.&lt;br /&gt;
&lt;br /&gt;
Diese [https://http.download.nvidia.com/XFree86/Linux-x86/325.15/README/configtwinview.html  Seite] bringt hoffentlich Klarheit.&lt;br /&gt;
&lt;br /&gt;
 Wenn auf der GPU mehrere X-Bildschirme konfiguriert sind, versucht der NVIDIA X-Treiber, Anzeigegeräte und GPU-Ressourcen für diese anderen X-Bildschirme zu reservieren (unter Berücksichtigung der X-Konfigurationsoptionen „UseDisplayDevice“ und „MetaModes“ jedes X-Bildschirms) und weist dann alle verbleibenden Ressourcen dem ersten auf der GPU konfigurierten X-Bildschirm zu.&lt;br /&gt;
&lt;br /&gt;
Was bei meiner QuadroM2000Config weiterhin irritiert, ist dass der 2. Monitor keine eigene Section besitzt und nur ueber DP-0 in den MetaModes auftaucht.&lt;br /&gt;
&lt;br /&gt;
 The details of how this works are documented in the nv-control-dpy.c sample NV-CONTROL client in the nvidia-settings source tarball.&lt;br /&gt;
&lt;br /&gt;
==GTX 1050 Ti 4 Monitore/TVs==&lt;br /&gt;
Anmerkung:&lt;br /&gt;
*Alle vier Monitore/TVs haben FullHD.&lt;br /&gt;
*Die beiden Monitore zeigen das gleiche Bild (Desktop). Sind also geklont.&lt;br /&gt;
*Die beiden TVs haben jeweils einen eigenen Screen.&lt;br /&gt;
&lt;br /&gt;
[https://http.download.nvidia.com/XFree86/Linux-x86/325.15/README/configmultxscreens.html Hier] zum Nachvollziehen.&lt;br /&gt;
&lt;br /&gt;
Die xorg.conf die nach viel Probiererei auf einmal nicht mehr ging.&lt;br /&gt;
&lt;br /&gt;
 # nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;
 # nvidia-settings:  version 550.135&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;ServerLayout&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Layout0&amp;quot;&lt;br /&gt;
    Screen      0  &amp;quot;Screen0&amp;quot; 0 0&lt;br /&gt;
    Screen      1  &amp;quot;Screen1&amp;quot; 1920 0&lt;br /&gt;
    Screen      2  &amp;quot;Screen2&amp;quot; 3840 0&lt;br /&gt;
    InputDevice    &amp;quot;Keyboard0&amp;quot; &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
    InputDevice    &amp;quot;Mouse0&amp;quot; &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Xinerama&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
 EndSection &lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Files&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
    # generated from data in &amp;quot;/etc/sysconfig/mouse&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Mouse0&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;mouse&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Protocol&amp;quot; &amp;quot;IMPS/2&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Device&amp;quot; &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Emulate3Buttons&amp;quot; &amp;quot;yes&amp;quot;&lt;br /&gt;
    Option         &amp;quot;ZAxisMapping&amp;quot; &amp;quot;4 5&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
  &lt;br /&gt;
 Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    # generated from default&lt;br /&gt;
    Identifier     &amp;quot;Keyboard0&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;kbd&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
  &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
    Identifier     &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;HP&amp;quot;&lt;br /&gt;
    ModelName      &amp;quot;HP Inc. HP E24t G5&amp;quot;&lt;br /&gt;
    HorizSync       30.0 - 85.0&lt;br /&gt;
    VertRefresh     50.0 - 75.0&lt;br /&gt;
    Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Enable&amp;quot;  &amp;quot;True&amp;quot;&lt;br /&gt;
    Option         &amp;quot;Primary&amp;quot; &amp;quot;True&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
    Identifier     &amp;quot;Monitor1&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;Sony&amp;quot;&lt;br /&gt;
    ModelName      &amp;quot;SONY TV&amp;quot;&lt;br /&gt;
    HorizSync       14.0 - 68.0&lt;br /&gt;
    VertRefresh     48.0 - 62.0&lt;br /&gt;
    Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
    # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
    Identifier     &amp;quot;Monitor2&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;SAMSUNG&amp;quot;&lt;br /&gt;
    ModelName      &amp;quot;SAMSUNG TV&amp;quot;&lt;br /&gt;
    HorizSync       26.0 - 81.0&lt;br /&gt;
    VertRefresh     24.0 - 75.0&lt;br /&gt;
    Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Device&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Device0&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
    BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
    BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
    Screen          0&lt;br /&gt;
    Option          &amp;quot;UseHotplugEvents&amp;quot; &amp;quot;false&amp;quot;&lt;br /&gt;
    Option          &amp;quot;AllowEmptyInitialConfiguration&amp;quot; &amp;quot;true&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Device&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Device1&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
    BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
    BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
    Screen          1&lt;br /&gt;
    Option          &amp;quot;UseHotplugEvents&amp;quot; &amp;quot;false&amp;quot;&lt;br /&gt;
    Option          &amp;quot;AllowEmptyInitialConfiguration&amp;quot; &amp;quot;true&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Device&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Device2&amp;quot;&lt;br /&gt;
    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
    BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
    BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
    Screen          2&lt;br /&gt;
    Option          &amp;quot;UseHotplugEvents&amp;quot; &amp;quot;false&amp;quot;&lt;br /&gt;
    Option          &amp;quot;AllowEmptyInitialConfiguration&amp;quot; &amp;quot;true&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Removed Option &amp;quot;metamodes&amp;quot; &amp;quot;DP-1: nvidia-auto-select +0+0, DVI-D-0: 1920x1080 +0+0&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Screen0&amp;quot;&lt;br /&gt;
    Device         &amp;quot;Device0&amp;quot;&lt;br /&gt;
    Monitor        &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
    DefaultDepth    24&lt;br /&gt;
    Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;DVI-D-0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;metamodes&amp;quot; &amp;quot;DVI-D-0: nvidia-auto-select +0+0 {AllowGSYNC=Off}&amp;quot;&lt;br /&gt;
    Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
    SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
        Depth       24&lt;br /&gt;
    EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Screen1&amp;quot;&lt;br /&gt;
    Device         &amp;quot;Device1&amp;quot;&lt;br /&gt;
    Monitor        &amp;quot;Monitor1&amp;quot;&lt;br /&gt;
    DefaultDepth    24&lt;br /&gt;
    Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;HDMI-0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;metamodes&amp;quot; &amp;quot;HDMI-0: nvidia-auto-select +0+0 {AllowGSYNC=Off}&amp;quot;&lt;br /&gt;
    Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
    SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
        Depth       24&lt;br /&gt;
    EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
    Identifier     &amp;quot;Screen2&amp;quot;&lt;br /&gt;
    Device         &amp;quot;Device2&amp;quot;&lt;br /&gt;
    Monitor        &amp;quot;Monitor2&amp;quot;&lt;br /&gt;
    DefaultDepth    24&lt;br /&gt;
    Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
    Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;DVI-D-1&amp;quot;&lt;br /&gt;
    Option         &amp;quot;metamodes&amp;quot; &amp;quot;DVI-D-1: nvidia-auto-select +0+0 {AllowGSYNC=Off}&amp;quot;&lt;br /&gt;
    Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
    Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
    SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
        Depth       24&lt;br /&gt;
    EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
&lt;br /&gt;
Was auffaellt.&lt;br /&gt;
*# Removed Option &amp;quot;metamodes&amp;quot; &amp;quot;DP-1: nvidia-auto-select +0+0, DVI-D-0: 1920x1080 +0+0&amp;quot; Warum? Das muss doch rein!&lt;br /&gt;
*Option &amp;quot;DPMS&amp;quot; bei den TVs muss/sollte raus!&lt;br /&gt;
*Option &amp;quot;Enable&amp;quot;  &amp;quot;True&amp;quot; kann eigentlich bei allen Monitor-Sections rein.&lt;br /&gt;
&lt;br /&gt;
Darueber hinaus kann vielleicht&lt;br /&gt;
 Option &amp;quot;ConnectedMonitor&amp;quot; &amp;quot;DVI-D-0, DVI-D-1, HDMI-0, DP-1&amp;quot;&lt;br /&gt;
auch nichts schaden?&lt;br /&gt;
&lt;br /&gt;
Reboot oder systemctl restart display-manager. Erfolg gleich Null.&lt;br /&gt;
Nvidia erkennt die ausgeschalteten (Stand-by) TVs nicht.&lt;br /&gt;
&lt;br /&gt;
hw-probe ergibt folgenden Eintrag bei devices.&lt;br /&gt;
&lt;br /&gt;
 eisa:sony-sny2801;;detected;monitor;;Sony;TV SNY2801 1920x1080 &lt;br /&gt;
&lt;br /&gt;
Und unter [https://github.com/linuxhw/EDID/tree/master] findet man unter SNY2801&lt;br /&gt;
&lt;br /&gt;
 | Sony             | SNY2801 | TV               | 1920x1080 |      | 2007 | [2E85613CDBF0](&amp;lt;Digital/Sony/SNY2801/2E85613CDBF0&amp;gt;) |&lt;br /&gt;
&lt;br /&gt;
edid-decode (hex):&lt;br /&gt;
&lt;br /&gt;
00 ff ff ff ff ff ff 00 4d d9 01 28 01 01 01 01&lt;br /&gt;
01 11 01 03 80 a0 5a 78 0a 0d c9 a0 57 47 98 27&lt;br /&gt;
12 48 4c 21 08 00 01 01 01 01 01 01 01 01 01 01&lt;br /&gt;
01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c&lt;br /&gt;
45 00 40 84 63 00 00 1e 66 21 50 b0 51 00 1b 30&lt;br /&gt;
40 70 36 00 40 84 63 00 00 1e 00 00 00 fd 00 30&lt;br /&gt;
3e 0e 44 0f 00 0a 20 20 20 20 20 20 00 00 00 fc&lt;br /&gt;
00 53 4f 4e 59 20 54 56 0a 20 20 20 20 20 01 59&lt;br /&gt;
&lt;br /&gt;
02 03 24 70 50 1f 14 13 12 11 16 15 10 05 04 03&lt;br /&gt;
02 07 06 01 20 23 09 07 07 83 01 00 00 66 03 0c&lt;br /&gt;
00 30 00 80 01 1d 80 d0 72 1c 16 20 10 2c 25 80&lt;br /&gt;
40 84 63 00 00 9e 01 1d 80 18 71 1c 16 20 58 2c&lt;br /&gt;
25 00 40 84 63 00 00 9e 01 1d 00 bc 52 d0 1e 20&lt;br /&gt;
b8 28 55 40 40 84 63 00 00 1e 02 3a 80 d0 72 38&lt;br /&gt;
2d 40 10 2c 45 80 40 84 63 00 00 1e 01 1d 00 72&lt;br /&gt;
51 d0 1e 20 6e 28 55 00 40 84 63 00 00 1e 00 99&lt;br /&gt;
&lt;br /&gt;
----------------&lt;br /&gt;
&lt;br /&gt;
Block 0, Base EDID:&lt;br /&gt;
  EDID Structure Version &amp;amp; Revision: 1.3&lt;br /&gt;
  Vendor &amp;amp; Product Identification:&lt;br /&gt;
    Manufacturer: SNY&lt;br /&gt;
    Model: 10241&lt;br /&gt;
    Serial Number: ...&lt;br /&gt;
    Made in: week 1 of 2007&lt;br /&gt;
  Basic Display Parameters &amp;amp; Features:&lt;br /&gt;
    Digital display&lt;br /&gt;
    Maximum image size: 160 cm x 90 cm&lt;br /&gt;
    Gamma: 2.20&lt;br /&gt;
    RGB color display&lt;br /&gt;
    First detailed timing is the preferred timing&lt;br /&gt;
  Color Characteristics:&lt;br /&gt;
    Red  : 0.6250, 0.3398&lt;br /&gt;
    Green: 0.2802, 0.5947&lt;br /&gt;
    Blue : 0.1552, 0.0703&lt;br /&gt;
    White: 0.2832, 0.2978&lt;br /&gt;
  Established Timings I &amp;amp; II:&lt;br /&gt;
    DMT 0x04:   640x480    59.940476 Hz   4:3     31.469 kHz     25.175000 MHz&lt;br /&gt;
    DMT 0x09:   800x600    60.316541 Hz   4:3     37.879 kHz     40.000000 MHz&lt;br /&gt;
    DMT 0x10:  1024x768    60.003840 Hz   4:3     48.363 kHz     65.000000 MHz&lt;br /&gt;
  Standard Timings: none&lt;br /&gt;
  Detailed Timing Descriptors:&lt;br /&gt;
    DTD 1:  1920x1080   60.000000 Hz  16:9     67.500 kHz    148.500000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront   88 Hsync  44 Hback  148 Hpol P&lt;br /&gt;
                 Vfront    4 Vsync   5 Vback   36 Vpol P&lt;br /&gt;
    DTD 2:  1360x768    60.015162 Hz  85:48    47.712 kHz     85.500000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront   64 Hsync 112 Hback  256 Hpol P&lt;br /&gt;
                 Vfront    3 Vsync   6 Vback   18 Vpol P&lt;br /&gt;
    Display Range Limits:&lt;br /&gt;
      Monitor ranges (GTF): 48-62 Hz V, 14-68 kHz H, max dotclock 150 MHz&lt;br /&gt;
    Display Product Name: &#039;SONY TV&#039;&lt;br /&gt;
  Extension blocks: 1&lt;br /&gt;
Checksum: 0x59&lt;br /&gt;
&lt;br /&gt;
----------------&lt;br /&gt;
&lt;br /&gt;
Block 1, CTA-861 Extension Block:&lt;br /&gt;
  Revision: 3&lt;br /&gt;
  Basic audio support&lt;br /&gt;
  Supports YCbCr 4:4:4&lt;br /&gt;
  Supports YCbCr 4:2:2&lt;br /&gt;
  Native detailed modes: 0&lt;br /&gt;
  Video Data Block:&lt;br /&gt;
    VIC  31:  1920x1080   50.000000 Hz  16:9     56.250 kHz    148.500000 MHz&lt;br /&gt;
    VIC  20:  1920x1080i  50.000000 Hz  16:9     28.125 kHz     74.250000 MHz&lt;br /&gt;
    VIC  19:  1280x720    50.000000 Hz  16:9     37.500 kHz     74.250000 MHz&lt;br /&gt;
    VIC  18:   720x576    50.000000 Hz  16:9     31.250 kHz     27.000000 MHz&lt;br /&gt;
    VIC  17:   720x576    50.000000 Hz   4:3     31.250 kHz     27.000000 MHz&lt;br /&gt;
    VIC  22:  1440x576i   50.000000 Hz  16:9     15.625 kHz     27.000000 MHz&lt;br /&gt;
    VIC  21:  1440x576i   50.000000 Hz   4:3     15.625 kHz     27.000000 MHz&lt;br /&gt;
    VIC  16:  1920x1080   60.000000 Hz  16:9     67.500 kHz    148.500000 MHz&lt;br /&gt;
    VIC   5:  1920x1080i  60.000000 Hz  16:9     33.750 kHz     74.250000 MHz&lt;br /&gt;
    VIC   4:  1280x720    60.000000 Hz  16:9     45.000 kHz     74.250000 MHz&lt;br /&gt;
    VIC   3:   720x480    59.940060 Hz  16:9     31.469 kHz     27.000000 MHz&lt;br /&gt;
    VIC   2:   720x480    59.940060 Hz   4:3     31.469 kHz     27.000000 MHz&lt;br /&gt;
    VIC   7:  1440x480i   59.940060 Hz  16:9     15.734 kHz     27.000000 MHz&lt;br /&gt;
    VIC   6:  1440x480i   59.940060 Hz   4:3     15.734 kHz     27.000000 MHz&lt;br /&gt;
    VIC   1:   640x480    59.940476 Hz   4:3     31.469 kHz     25.175000 MHz&lt;br /&gt;
    VIC  32:  1920x1080   24.000000 Hz  16:9     27.000 kHz     74.250000 MHz&lt;br /&gt;
  Audio Data Block:&lt;br /&gt;
    Linear PCM:&lt;br /&gt;
      Max channels: 2&lt;br /&gt;
      Supported sample rates (kHz): 48 44.1 32&lt;br /&gt;
      Supported sample sizes (bits): 24 20 16&lt;br /&gt;
  Speaker Allocation Data Block:&lt;br /&gt;
    FL/FR - Front Left/Right&lt;br /&gt;
  Vendor-Specific Data Block (HDMI), OUI 00-0C-03:&lt;br /&gt;
    Source physical address: 3.0.0.0&lt;br /&gt;
    Supports_AI&lt;br /&gt;
  Detailed Timing Descriptors:&lt;br /&gt;
    DTD 3:  1920x1080i  50.000000 Hz  16:9     28.125 kHz     74.250000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront  528 Hsync  44 Hback  148 Hpol P&lt;br /&gt;
                 Vfront    2 Vsync   5 Vback   15 Vpol P Vfront +0.5 Odd Field&lt;br /&gt;
                 Vfront    2 Vsync   5 Vback   15 Vpol P Vback  +0.5 Even Field&lt;br /&gt;
    DTD 4:  1920x1080i  60.000000 Hz  16:9     33.750 kHz     74.250000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront   88 Hsync  44 Hback  148 Hpol P&lt;br /&gt;
                 Vfront    2 Vsync   5 Vback   15 Vpol P Vfront +0.5 Odd Field&lt;br /&gt;
                 Vfront    2 Vsync   5 Vback   15 Vpol P Vback  +0.5 Even Field&lt;br /&gt;
    DTD 5:  1280x720    50.000000 Hz  16:9     37.500 kHz     74.250000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront  440 Hsync  40 Hback  220 Hpol P&lt;br /&gt;
                 Vfront    5 Vsync   5 Vback   20 Vpol P&lt;br /&gt;
    DTD 6:  1920x1080   50.000000 Hz  16:9     56.250 kHz    148.500000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront  528 Hsync  44 Hback  148 Hpol P&lt;br /&gt;
                 Vfront    4 Vsync   5 Vback   36 Vpol P&lt;br /&gt;
    DTD 7:  1280x720    60.000000 Hz  16:9     45.000 kHz     74.250000 MHz (1600 mm x 900 mm)&lt;br /&gt;
                 Hfront  110 Hsync  40 Hback  220 Hpol P&lt;br /&gt;
                 Vfront    5 Vsync   5 Vback   20 Vpol P&lt;br /&gt;
Checksum: 0x99  Unused space in Extension Block: 1 byte&lt;br /&gt;
&lt;br /&gt;
----------------&lt;br /&gt;
&lt;br /&gt;
Warnings:&lt;br /&gt;
&lt;br /&gt;
Block 1, CTA-861 Extension Block:&lt;br /&gt;
  IT Video Formats are overscanned by default, but normally this should be underscanned.&lt;br /&gt;
  Video Data Block: VIC 31 is the preferred timing, overriding the first detailed timings. Is this intended?&lt;br /&gt;
  Add a Colorimetry Data Block with the sRGB colorimetry bit set to avoid interop issues.&lt;br /&gt;
&lt;br /&gt;
Failures:&lt;br /&gt;
&lt;br /&gt;
Block 1, CTA-861 Extension Block:&lt;br /&gt;
  Missing VCDB, needed for Set Selectable RGB Quantization to avoid interop issues.&lt;br /&gt;
EDID:&lt;br /&gt;
  Base EDID: Some timings are out of range of the Monitor Ranges:&lt;br /&gt;
    Vertical Freq: 24.000 - 60.317 Hz (Monitor: 48.000 - 62.000 Hz)&lt;br /&gt;
&lt;br /&gt;
EDID conformity: FAIL&lt;br /&gt;
&lt;br /&gt;
Damit koennte man wenigstens einen EDID Emulator fuettern, oder ein Custom EDID.bin in der xorg.conf hinterlegen.&lt;br /&gt;
Mit &lt;br /&gt;
 cat EDID.txt | grep -E &#039;^([a-f0-9]{32}|[a-f0-9 ]{47})$&#039; | tr -d &#039;[:space:]&#039; | xxd -r -p &amp;gt; EDID.bin&lt;br /&gt;
&lt;br /&gt;
kann man den Hexcode-Block in eine EDID.bin schreiben.&lt;br /&gt;
&lt;br /&gt;
=Teilerfolg=&lt;br /&gt;
Mit der von Hand korrigierten xorg.conf (s.u.) und nach einem&lt;br /&gt;
 systemctl restart display-manager&lt;br /&gt;
war auf einmal alle Screens vorhanden. Sogar der Samsung der gar nicht angeschlossen war. Beim Samsung stimmt nur die Aufloesung nicht.&lt;br /&gt;
&lt;br /&gt;
Lediglich die Reihenfolge, bzw. Zuordnung der Screens zu den Bildschirmen war vertauscht.&lt;br /&gt;
&lt;br /&gt;
Gute Dienste leistet da der Remote Desktop Viewer, der zeigt ALLE Screens in einem Fenster!&lt;br /&gt;
&lt;br /&gt;
 # nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;
 # nvidia-settings:  version 550.135&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;ServerLayout&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Layout0&amp;quot;&lt;br /&gt;
     Screen      0  &amp;quot;Screen0&amp;quot; 0 0&lt;br /&gt;
     Screen      1  &amp;quot;Screen1&amp;quot; 1920 0&lt;br /&gt;
     Screen      2  &amp;quot;Screen2&amp;quot; 3840 0&lt;br /&gt;
     InputDevice    &amp;quot;Keyboard0&amp;quot; &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
     InputDevice    &amp;quot;Mouse0&amp;quot; &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Xinerama&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Files&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # generated from data in &amp;quot;/etc/sysconfig/mouse&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Mouse0&amp;quot;&lt;br /&gt;
     Driver         &amp;quot;mouse&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Protocol&amp;quot; &amp;quot;IMPS/2&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Device&amp;quot; &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Emulate3Buttons&amp;quot; &amp;quot;yes&amp;quot;&lt;br /&gt;
     Option         &amp;quot;ZAxisMapping&amp;quot; &amp;quot;4 5&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # generated from default&lt;br /&gt;
     Identifier     &amp;quot;Keyboard0&amp;quot;&lt;br /&gt;
     Driver         &amp;quot;kbd&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
     Identifier     &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
     VendorName     &amp;quot;Unknown&amp;quot;&lt;br /&gt;
     ModelName      &amp;quot;HP Inc. HP E24t G5&amp;quot;&lt;br /&gt;
     HorizSync       30.0 - 85.0&lt;br /&gt;
     VertRefresh     50.0 - 75.0&lt;br /&gt;
     Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
     Identifier     &amp;quot;Monitor1&amp;quot;&lt;br /&gt;
     VendorName     &amp;quot;Unknown&amp;quot;&lt;br /&gt;
     ModelName      &amp;quot;SONY TV&amp;quot;&lt;br /&gt;
     HorizSync       14.0 - 68.0&lt;br /&gt;
     VertRefresh     48.0 - 62.0&lt;br /&gt;
     #Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Enable&amp;quot;  &amp;quot;True&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;
     Identifier     &amp;quot;Monitor2&amp;quot;&lt;br /&gt;
     VendorName     &amp;quot;Unknown&amp;quot;&lt;br /&gt;
     ModelName      &amp;quot;SAMSUNG&amp;quot;&lt;br /&gt;
     HorizSync       26.0 - 81.0&lt;br /&gt;
     VertRefresh     24.0 - 75.0&lt;br /&gt;
     #Option         &amp;quot;DPMS&amp;quot;&lt;br /&gt;
     Option         &amp;quot;Enable&amp;quot;  &amp;quot;True&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Device&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Device0&amp;quot;&lt;br /&gt;
     Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
     VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
     BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
     BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;ConnectedMonitor&amp;quot; &amp;quot;DVI-D-0, DP-1, HDMI-0, DVI-D-1&amp;quot;&lt;br /&gt;
     Option         &amp;quot;CustomEDID&amp;quot; &amp;quot;HDMI-0:/etc/X11/Sony_KDL-40D3550_EDID.bin&amp;quot;&lt;br /&gt;
     Option         &amp;quot;IgnoreEDID&amp;quot; &amp;quot;false&amp;quot;&lt;br /&gt;
     Option         &amp;quot;UseEDID&amp;quot; &amp;quot;true&amp;quot;&lt;br /&gt;
 #    Screen          0&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 #Section &amp;quot;Device&amp;quot;&lt;br /&gt;
 #    Identifier     &amp;quot;Device1&amp;quot;&lt;br /&gt;
 #    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
 #    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
 #    BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
 #    BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
 #    Option         &amp;quot;ConnectedMonitor&amp;quot; &amp;quot;HDMI-0&amp;quot;&lt;br /&gt;
 #    Screen          1&lt;br /&gt;
 #EndSection&lt;br /&gt;
 #&lt;br /&gt;
 #Section &amp;quot;Device&amp;quot;&lt;br /&gt;
 #    Identifier     &amp;quot;Device2&amp;quot;&lt;br /&gt;
 #    Driver         &amp;quot;nvidia&amp;quot;&lt;br /&gt;
 #    VendorName     &amp;quot;NVIDIA Corporation&amp;quot;&lt;br /&gt;
 #    BoardName      &amp;quot;NVIDIA GeForce GTX 1050 Ti&amp;quot;&lt;br /&gt;
 #    BusID          &amp;quot;PCI:15:0:0&amp;quot;&lt;br /&gt;
 #    Option         &amp;quot;ConnectedMonitor&amp;quot; &amp;quot;DVI-D-1&amp;quot;&lt;br /&gt;
 #    Screen          2&lt;br /&gt;
 #EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Removed Option &amp;quot;metamodes&amp;quot; &amp;quot;DP-1: nvidia-auto-select +0+0, DVI-D-0: 1920x1080 +0+0&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Screen0&amp;quot;&lt;br /&gt;
     Device         &amp;quot;Device0&amp;quot;&lt;br /&gt;
     Monitor        &amp;quot;Monitor0&amp;quot;&lt;br /&gt;
     DefaultDepth    24&lt;br /&gt;
     Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;DVI-D-0&amp;quot;&lt;br /&gt;
     #Option         &amp;quot;metamodes&amp;quot; &amp;quot;DVI-D-0: 1920x1080 +0+0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;metamodes&amp;quot; &amp;quot;DP-1: nvidia-auto-select +0+0, DVI-D-0: 1920x1080 +0+0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
     SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
         Depth       24&lt;br /&gt;
     EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Screen1&amp;quot;&lt;br /&gt;
     Device         &amp;quot;Device0&amp;quot;&lt;br /&gt;
     Monitor        &amp;quot;Monitor1&amp;quot;&lt;br /&gt;
     DefaultDepth    24&lt;br /&gt;
     Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;HDMI-0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;metamodes&amp;quot; &amp;quot;HDMI-0: nvidia-auto-select +0+0 {AllowGSYNC=Off}&amp;quot;&lt;br /&gt;
     Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
     SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
         Depth       24&lt;br /&gt;
     EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
 &lt;br /&gt;
 Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
     Identifier     &amp;quot;Screen2&amp;quot;&lt;br /&gt;
     Device         &amp;quot;Device0&amp;quot;&lt;br /&gt;
     Monitor        &amp;quot;Monitor2&amp;quot;&lt;br /&gt;
     DefaultDepth    24&lt;br /&gt;
     Option         &amp;quot;Stereo&amp;quot; &amp;quot;0&amp;quot;&lt;br /&gt;
     Option         &amp;quot;nvidiaXineramaInfoOrder&amp;quot; &amp;quot;DVI-D-1&amp;quot;&lt;br /&gt;
     Option         &amp;quot;metamodes&amp;quot; &amp;quot;DVI-D-1: nvidia-auto-select +0+0 {AllowGSYNC=Off}&amp;quot;&lt;br /&gt;
     Option         &amp;quot;SLI&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;MultiGPU&amp;quot; &amp;quot;Off&amp;quot;&lt;br /&gt;
     Option         &amp;quot;BaseMosaic&amp;quot; &amp;quot;off&amp;quot;&lt;br /&gt;
     SubSection     &amp;quot;Display&amp;quot;&lt;br /&gt;
         Depth       24&lt;br /&gt;
     EndSubSection&lt;br /&gt;
 EndSection&lt;br /&gt;
&lt;br /&gt;
=Beifang=&lt;br /&gt;
Nvidia (Texture) Tools:&lt;br /&gt;
*nvtop: interactive GPU process viewer (Wie top, aber halt fuer die Grafikkarte. Einfach ausprobieren.)&lt;br /&gt;
*nvzoom - Scales the given image.&lt;br /&gt;
*nvtestsuite TODO&lt;br /&gt;
*nvidia-sleep.sh: Bash-Script Interessant ist die das Ansprechen des NVIDIA-Treiber ueber echo &amp;quot;$1&amp;quot; &amp;gt; /proc/driver/nvidia/suspend&lt;br /&gt;
*nvhdrtest HDR High Dynamic Range Image Image Viewer&lt;br /&gt;
*nvassemble&lt;br /&gt;
*nvcompress&lt;br /&gt;
*nvdecompress: --help&lt;br /&gt;
*nv-gnome-thumbnailer&lt;br /&gt;
*nvddsinfo&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Zigbee_Dongles&amp;diff=5227</id>
		<title>Zigbee Dongles</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Zigbee_Dongles&amp;diff=5227"/>
		<updated>2026-07-31T16:04:29Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Auf dieser Seite sammele ich Infos zu meine Zigbee Koordinatoren.&lt;br /&gt;
&lt;br /&gt;
=JIOTTY CC2652P=&lt;br /&gt;
Der USB-Adapter traegt weiterhin die Bezeichnungen &#039;zigbee2mqtt Stick&#039;, &#039;Smart Home Stick&#039;, &#039;zigbee2mqtt Dongle Plus&#039; und &#039;CH9102X&#039;.&lt;br /&gt;
Der Adapter meldet sich mit der Vendor ID und Product ID 1a86:55d4 QinHeng Electronics USB Single Serial.&lt;br /&gt;
Der Treiber unter Linux ist cdc_acm.&lt;br /&gt;
&lt;br /&gt;
modinfo enthaelt u.a. folgende Informationen zum Treiber.&lt;br /&gt;
 description:    USB Abstract Control Model driver for USB modems and ISDN adapters&lt;br /&gt;
 author:         Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik, David Kubicek, Johan Hovold &lt;br /&gt;
&lt;br /&gt;
Eine [https://linux-hardware.org/?id=usb:1a86-55d4 Suche] nach 1a86:55d4 ergab u.a. folgendes:&lt;br /&gt;
&lt;br /&gt;
 ID	USB 1a86:55d4&lt;br /&gt;
 Class	02-02-01 »&lt;br /&gt;
 Type	modem »&lt;br /&gt;
 Vendor 	QinHeng Electronics »&lt;br /&gt;
 Name	SONOFF Zigbee 3.0 USB Dongle Plus V2&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Victron_Energy)_VE.Bus_Quick_Configure_/_System_Configurator&amp;diff=5226</id>
		<title>(Victron Energy) VE.Bus Quick Configure / System Configurator</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Victron_Energy)_VE.Bus_Quick_Configure_/_System_Configurator&amp;diff=5226"/>
		<updated>2026-07-31T16:04:28Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Ich habe hier den beiden Programmen &lt;br /&gt;
* VE.Bus Quick Configure und&lt;br /&gt;
* VE.Bus System Konfigurator&lt;br /&gt;
eine eigene Seite gewidmet. Da sie beide nur gebraucht werden um u.U. nur einmal ein System aus mehr als einem MultiPlus/Quattro eingestellt zu werden. Hat man nur einen MultiPlus/Quattro benoetigt man diese Programme nicht.&lt;br /&gt;
&lt;br /&gt;
=VE.Bus Quick Configure=&lt;br /&gt;
Das Programm VE.Bus Quick Configure (V90.10.153 Stand 04/2023) kann/sollte man nutzen, wenn man nur maximal 3 Geraete zusammenschalten moechte.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Victron_Energy)_MultiPlus-II&amp;diff=5225</id>
		<title>(Victron Energy) MultiPlus-II</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Victron_Energy)_MultiPlus-II&amp;diff=5225"/>
		<updated>2026-07-31T16:04:27Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Victron Energy wird im Folgenden VE abgekuerzt.&lt;br /&gt;
&lt;br /&gt;
Der VE.MultiPlus-II (im Folgenden VE.MPII genannt) ist ein Laderegler (Charger) fuer eine Vielzahl von Batterietypen und ein Wechselrichter (Inverter) zur (Not-)Stromversorgung von angeschlossenen Lasten.&lt;br /&gt;
&lt;br /&gt;
=Inbetriebnahme=&lt;br /&gt;
Im ersten Schritt habe ich den VE.MPII nur ueber AC-IN an das 230V-Hausnetz angeschlossen. Der Anschluss der Batterie sollte erst nach Ueberpruefung der Konfiguration des VE.MPII folgen.&lt;br /&gt;
Um die Konfiguration vorzunehmen habe ich das Victron Energy MK3-USB-Interface (zukuenftig VE.MK3USB genannt) an eine der beiden mit VE.Bus gekennzeichneten RJ-45-Buchsen des VE.MPII angschlossen.&lt;br /&gt;
Als Verbindung diente ein RJ45-Netzwerkkabel (UTP).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Batterieanschlusskabel==&lt;br /&gt;
&lt;br /&gt;
Zuerst wird der Anschluss aufgesetzt, dann die Unterlegscheibe, die Federscheibe und die Mutter. Alle Muttern mit dem empfohlenen Drehmoment von 12 Nm (M8-Mutter)) anziehen, um den Kontaktwiderstand weitestgehend zu reduzieren.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Anschlusskabelstaerke MP Batterie.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Hier werden 70 qmm (120 qmm) und eine 200 A Sicherung im Plus-Pfad fuer meine 48/5000/70 empfohlen.&lt;br /&gt;
&lt;br /&gt;
Dann schauen wir mal in die VDE 0100-430.&lt;br /&gt;
&lt;br /&gt;
 I&amp;lt;sub&amp;gt;B&amp;lt;/sub&amp;gt;&amp;lt;=I&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;&amp;lt;=I&amp;lt;sub&amp;gt;Z&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Panel=&lt;br /&gt;
[[Datei:VE.MPII Panel.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|LED-Panel&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#ffffcc;&amp;quot; |Batterielader&lt;br /&gt;
|style=&amp;quot;background-color:#ffffcc;&amp;quot; |Wechselrichter&lt;br /&gt;
|-&lt;br /&gt;
|Stromversorgung (AC-IN) an&lt;br /&gt;
|Wechselrichter (AC-OUT) an&lt;br /&gt;
|-&lt;br /&gt;
|Hauptladephase&lt;br /&gt;
|Ueberlast&lt;br /&gt;
|-&lt;br /&gt;
|Nachladephase&lt;br /&gt;
|Batteriekapazitaet schwach&lt;br /&gt;
|-&lt;br /&gt;
|Erhaltungsladungsphase&lt;br /&gt;
|Batterietemperatur kritisch&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Konfiguration ueber das MK3-USB-Interface=&lt;br /&gt;
Als erstes stand ein Firmware-Update (v481 auf v494) an. Eigentlich ist die Software version: 2623494. Es werden hier also nur die letzten 3 Ziffern angegeben.&lt;br /&gt;
Das Video dazu findet ihr auf [https://youtu.be/LXORvxUl2Fc Youtube].&lt;br /&gt;
&lt;br /&gt;
 Once your CerboGX is connected to Internet (using WiFi or Ethernet) you can use Victron VRM (vrm.victronenergy.com) to connect to your CerboGX over the Internet. From there you can also use Remote VE.Configure, which eliminates the need of the MK3-USB dongle. However, Remote VE.Configure has it&#039;s limits. &lt;br /&gt;
&lt;br /&gt;
Das MK3 wird oefter von Victron-Mitarbeitern &#039;Mark-Three&#039; ausgesprochen.&lt;br /&gt;
&lt;br /&gt;
==Country/Grid code standard==&lt;br /&gt;
&lt;br /&gt;
===Na toll!===&lt;br /&gt;
[[Datei:VEConnect GridCountryNotSupported.png|800px|VEConnect GridCountryNotSupported]]&lt;br /&gt;
&lt;br /&gt;
Also dann doch auf den Windows-PC wechseln, da es die [https://www.victronenergy.com/Executables/VEConfig/VECSetup_A.exe VEConfigure] offenbar nur fuer Windows gibt. &lt;br /&gt;
&lt;br /&gt;
===VDE-AR-N 4105===&lt;br /&gt;
Erzeugungsanlagen am Niederspannungsnetz&lt;br /&gt;
&lt;br /&gt;
[https://www.vde.com/de/fnn/arbeitsgebiete/tar/tar-niederspannung/erzeugungsanlagen-am-niederspannungsnetz-vde-ar-n-4105-2018 Hier] zum genauen Nachlesen.&lt;br /&gt;
&lt;br /&gt;
In der Einstellung der &#039;VE Configure 3&#039; Grid-&amp;gt;Country / grid code standard gibt es fuer Deutschland 2 Einstellungen zur Auswahl.&lt;br /&gt;
 Germany: VDE-AR-N 4105:2018-11, internal NS protection&lt;br /&gt;
 Germany: VDE-AR-N 4105:2018-11, external NS protection&lt;br /&gt;
&lt;br /&gt;
 Schließlich müssen Erzeugungsanlagen künftig einem Absinken der Netzfrequenz durch Erhöhen ihrer Einspeiseleistung entgegenwirken. Das gilt insbesondere auch für Speicher. Unterfrequenz bedeutet, dass es im Netz zu wenig Erzeugungsleistung bei gleichzeitig zu hohem Verbrauch gibt.&lt;br /&gt;
&lt;br /&gt;
 Network and System Protection (NS Protection) according to the grid code VDE-AR-N 4105&lt;br /&gt;
 Netz- und Anlagenschutz (NA-Schutz) gemäß Netzanschlussregel VDE-AR-N 4105&lt;br /&gt;
 &lt;br /&gt;
Netz- und Anlagenschutz bei PV-Anlagen [https://www.bulletin.ch/de/news-detail/netz-und-anlagenschutz-bei-pv-anlagen.html Zitat]:&lt;br /&gt;
 Früher war die Situation einfach: Die Grosskraftwerke waren für die Netzstabilität verantwortlich, dezentrale Erzeuger (im Folgenden Energieerzeugungsanlage EEA genannt) waren u. a. aufgrund des politischen Drucks geduldet, hatten sich aber unterzuordnen. Konkret: Sollte die Netzfrequenz über 50,2 Hz steigen oder unter 49,5 Hz fallen, hatten sich die EEA automatisch vom Netz zu trennen (VDE V 0126-1-1). Als in den Jahren 2006/2007 alleine die Leistung der PV-Anlagen im europäischen Stromnetz die Primärregelreserve in Europa überschritt und bereits 2010 rund das Zehnfache dieser betrug, wurde deutlich, dass eine kollektive Abschaltung der EEA nicht nur eine schlechte Lösung, sondern ein Pulverfass in der Netzstabilität war.&lt;br /&gt;
&lt;br /&gt;
LOM Loss of mains detection&lt;br /&gt;
[https://www.victronenergy.com/live/ve.bus:grid-codes-and-loss-of-mains-detection?utm_source=offline&amp;amp;utm_medium=qr&amp;amp;utm_campaign=qr%20code%20products#] Zitat:&lt;br /&gt;
 For other countries, Germany for example, only the MultiPlus-II is certified to be installed without requiring additional external anti-islanding safety devices (ENS).&lt;br /&gt;
Das Zertikat des Multiplus-II fuer Deutschland findet man [https://www.victronenergy.com/upload/documents/Vict_MultiPlusII_GCC_AR4105_2018_NAS_de_19-118-01.pdf hier].&lt;br /&gt;
&lt;br /&gt;
===Batterietyp===&lt;br /&gt;
Der verwendete Batterietypen Pylontech US2000/US3000/US5000(C) sind Lithium-Eisenphosphat Batterien (LiFePo) in einem BMS-Gehäuse.&lt;br /&gt;
Jede &amp;quot;Bank&amp;quot; hat ihr eigenes Battery-Management-System (BMS).&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Einschub:&lt;br /&gt;
Wenn es um Batterie und Ladung geht, werden haeufig diese Begriffe benutzt.&lt;br /&gt;
*Bulk (1.Ladephase 0%-80%): Hauptladephase&lt;br /&gt;
*Absorption (2.Ladephase 80%-100%): Nachladephase&lt;br /&gt;
*Float (3.Ladephase): Erhaltungsladung &lt;br /&gt;
Dieses 3-stufige Laden ist nur bei Nicht-Lithium-Akkumulatoren von Bedeutung. &lt;br /&gt;
&lt;br /&gt;
Elektrischer Steckbrief (siehe auch Wiki Pylontech)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !!US2000C!!US3000C!!US5000&lt;br /&gt;
|-&lt;br /&gt;
|Nennkapazitaet (kWh)||2,4||3,552(*)||4,8&lt;br /&gt;
|-&lt;br /&gt;
|Nennkapazitaet (Ah)||50||75||100&lt;br /&gt;
|-&lt;br /&gt;
|Nutzbare Kapazitaet 95% (kWh)||2280||3374||4560&lt;br /&gt;
|-&lt;br /&gt;
|Entladungstiefe (DoD)&lt;br /&gt;
|-&lt;br /&gt;
|Nennspannung||colspan=&amp;quot;3&amp;quot;|48 V (15 * 3,2 V)&lt;br /&gt;
|-&lt;br /&gt;
|Betriebsspannungsbereich||colspan=&amp;quot;3&amp;quot;|44,5 V - 53,5 V (2,966 V - 3,566 V) &lt;br /&gt;
|-&lt;br /&gt;
|Ladespannung||colspan=&amp;quot;3&amp;quot;|52,5 V - 53,5 V (3,5 V - 3,566 V)&lt;br /&gt;
|-&lt;br /&gt;
|Maximaler Dauerlade-Entladestrom (empfohlen)||25 A (50 A - 89 A @ 60 s; 90 A - 200 A @ 15 s)||37 A (74 A - 89 A @ 60 s; 90 A - 200 A @ 15 s)||80 A (100 A max.) (101 A - 120 A @ 15 min; 121 A - 200 A @ 15 s)&lt;br /&gt;
|-&lt;br /&gt;
|Innenwiderstand&lt;br /&gt;
|-&lt;br /&gt;
|Kurzschlussstrom||colspan=&amp;quot;3&amp;quot;|&amp;lt; 4000 A @ 2 ms &lt;br /&gt;
|-&lt;br /&gt;
|Eigenverbrauch&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) steht tatsächlich so im Datenblatt&lt;br /&gt;
&lt;br /&gt;
Empfohlene Betriebstemperatur 10°C-40°C. &lt;br /&gt;
* Ladung möglich 0°C-50°C. &lt;br /&gt;
* Entladung möglich -10°C-50°C&lt;br /&gt;
* Lagertemperatur -20°C-60°C&lt;br /&gt;
* Ladezyklen &amp;gt;6000 bei 25°C&lt;br /&gt;
&lt;br /&gt;
LiFePO4 allgemein:&lt;br /&gt;
* Zellenspannung 3,2 V - 3,3 V&lt;br /&gt;
* Ladeschlussspannung 3,6 V - 3,65 V (Schutz ab 3,8 V)&lt;br /&gt;
* Ladeschlussspannung empfohlen 3,4 V - 3,5 V (positive Wirkung auf Zyklenzahl)&lt;br /&gt;
* Entladeschlussspannung 2,5 V (nach Typ bis 2,0 V)&lt;br /&gt;
* Ladestrom 1C zwischen 20°C - 40°C (0-80%)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 WIKI: LiFePO4-Zellen können jederzeit zwischengelagert, entladen und geladen werden. Nur im vollständig geladenen und nahezu entladenen Zustand sind längere Lagerzeiten der Lebenserwartung abträglich.&lt;br /&gt;
&lt;br /&gt;
 [https://www.microcharge.de/forum/forum/index.php?thread/917-wichtiges-zur-ladung-von-lfp-lifepo4-akkus/ FORUM]: So lange die Spannung bei LiFePO4 im zulässigen Bereich liegt, ist alles in Ordnung. Und: Der Ladestrom sinkt bei vollständig aufgeladenen LiFePO4-Akkus im Gegensatz zu Bleiakkus praktisch komplett bis auf Null ab. Anders als bei Bleiakkus braucht man bei LiFePO4-Akkus keine besondere Ladekennlinie für die Erhaltungsladung, sondern man kann einfach dauerhaft die maximal zulässige Ladespannung anliegen lassen. Wirklich!&lt;br /&gt;
&lt;br /&gt;
==VE Configuration Windows==&lt;br /&gt;
&lt;br /&gt;
[[Datei:VE Configure Win.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
===VEConfig===&lt;br /&gt;
&lt;br /&gt;
Das Programm heiszt VEConfig.exe. Die aktuelle Version (Stand 04/2023) ist 90.04.234. Das Programm bezeichnet sich selbst mit &#039;VEConfigure 3&#039;, manchmal auch &#039;VE Configure&#039;.&lt;br /&gt;
Das Programm ist nicht zu verwechseln mit der VictronConnect App (Version 5.83).&lt;br /&gt;
&lt;br /&gt;
 VictronConnect ersetzt VEConfigure und VEFlash. Es ist einfacher zu benutzen und funktioniert auf mehr Geräten, nicht nur unter Windows.&lt;br /&gt;
&lt;br /&gt;
Das mit Windows verstehe ich nicht. Also bei mir laeuft ein Programm mit dem Namen VictronConnect unter Windows 10. [https://www.victronenergy.com/media/pg/VE.Bus_Configuration_Guide/de/limitations.html Siehe]&lt;br /&gt;
&lt;br /&gt;
Mit ihm kann man &lt;br /&gt;
*    MultiPlus (einschließlich Compact)&lt;br /&gt;
*    MultiPlus-II&lt;br /&gt;
*    MultiPlus-II GX&lt;br /&gt;
*    MultiGrid&lt;br /&gt;
*    Quattros&lt;br /&gt;
*    EasySolar&lt;br /&gt;
*    EasySolar-II&lt;br /&gt;
*    EasySolar-II GX&lt;br /&gt;
*    Phoenix-Wechselrichter mit einem VE.Bus-Anschluss&lt;br /&gt;
konfigurieren, also die grundlegenden Einstellungen des Geraetes vornehmen.&lt;br /&gt;
Ich wuerde mal behaupten , dass alle Geraete (Victron Wechselrichter/Ladegeraete) die einen VE.Bus Port (Rj45 &#039;normales&#039; Netzwerkkabel U/UTP (Cat 5e)) besitzen angesprochen werden koennen.&lt;br /&gt;
&lt;br /&gt;
Eine ausfuehrliche Erklaerung der Einstellungen findet man [https://www.victronenergy.com/media/pg/VE.Bus_Configuration_Guide/de/description-of-settings.html hier]&lt;br /&gt;
&lt;br /&gt;
Hier ein Schnelldurchlauf mit Anmerkungen.&lt;br /&gt;
&lt;br /&gt;
VEConfigure 3 kann man grob in 4 Bereiche einteilen.&lt;br /&gt;
* Menue (File, Port selection, Target, Defaults, Options, Special, Help)&lt;br /&gt;
* Statusdisplay (eine Auswahl aktueller Werte)&lt;br /&gt;
* Schnellzugriffsknoepfe (Get/Send-Settings, Virtual Panel)&lt;br /&gt;
* Konfigurationsreiter (Tabs)&lt;br /&gt;
&lt;br /&gt;
====Menue====&lt;br /&gt;
====Statusdisplay====&lt;br /&gt;
====Schnellzugriffsknoepfe====&lt;br /&gt;
Virtual-Panel-Knopf Wichtiger Hinweis: Sie sollten das virtuelle Panel nicht nutzen, wenn Sie einen PMV oder VVC angeschlossen haben!&lt;br /&gt;
&lt;br /&gt;
 [https://www.victronenergy.com/upload/documents/Connection-Diagram-Remote-Panels_Pn17022016.pdf PMV]: Phoenix Multi Control gehoert zu den Remote Panels&lt;br /&gt;
 Ist aber [https://www.victronenergy.de/panel-systems-remote-monitoring  hier] nicht mit aufgefuehrt.&lt;br /&gt;
 [https://www.victronenergy.com/upload/documents/VVC-manual-EN.pdf VVC]: VE.Net to VE.Bus protocol Converter&lt;br /&gt;
&lt;br /&gt;
====Konfigurationsreiter====&lt;br /&gt;
&#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
*System frequency: Hier ist die Frequenz des Wechselrichters gemeint, also das AC-Out Netz.&lt;br /&gt;
&lt;br /&gt;
*Shore Limit: (Ufergrenze:-)) Hier ist der maximale Strom (ueber AC1-IN) einzustellen, der von Land, z.B. in der Marina oder einfach aus dem Versorgernetz (Grid) bezogen werden darf/soll. Ein AC2-IN gibt&#039;s nicht bei den Multis. Er dient  bei den Quattros als z.B. Generatoreingang. &lt;br /&gt;
&lt;br /&gt;
*Overruled by Remote: Ist eigentlich nur für mobile Installationen (Wohnmobil, Yacht, ...) von Bedeutung. Bei einer stationaeren Anlage kenne ich noch keinen Einsatznutzen.&lt;br /&gt;
&lt;br /&gt;
*Dynamic Current Limiter: Bezieht sich auf den AC2-IN(?) Hier geht es darum einem externen Generator, Zeit zu geben, sich an einen sprunghaften Anstieg der AC-OUT-Lasten durch Unterstuetzung des Multis, anzupassen. Ein gutes Beispiel ist in der Hilfe von VEConfigure3 erlaeutert.&lt;br /&gt;
&lt;br /&gt;
*External current sensor connected: (CTR11xxxx jack connector CTR12xxxx wire end) Wird fuer PowerControl und PowerAssist und zum Optimieren des Eigenverbrauchs benoetigt.&lt;br /&gt;
&lt;br /&gt;
*Enable battery Monitor: &amp;quot;Die Aktivierung des VE.Bus-Batteriewächters ermöglicht auch viele Funktionen, die einen Ladezustand (SoC) verwenden können.&amp;quot; Was ist denn das fuer ein Satz:-( Ich verstehe ihn nicht. Also von Anfang. Der Ladezustand (SoC) wird wohl im Multi, Quattro, ... berechnet. Das macht der auf Grundlage der angegebenen Batteriekapazitaet (in Ah, also Wh durch Spannung V dividieren). Die Angaben von “State of charge when bulk finished” and “Charge efficiency” werden bei einer Pylontech-Installation ignoriert.[https://www.victronenergy.com/live/battery_compatibility:pylontech_phantom] &lt;br /&gt;
&lt;br /&gt;
*State of charge when Bulk finished: Gibt die Grenze des Ladezustandes in Prozent an, ab der in die Nachladephase geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
*Charge efficiency: Aus dem Datenblatt der Batterie und/oder des Ladereglers zu entnehmen, evtl. auch durch einen Erfahrungswert zu korrigieren.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Netz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen muessen vorgenommen werden, damit es moeglich sein soll (ueberschuessige) Leistung in das oeffentliche Netz einzuspeisen.  &lt;br /&gt;
&lt;br /&gt;
https://www.victronenergy.com/live/ve.bus:grid-codes-and-loss-of-mains-detection&lt;br /&gt;
&lt;br /&gt;
 For other countries, Germany for example, only the MultiPlus-II is certified to be installed without requiring additional external anti-islanding safety devices (ENS)&lt;br /&gt;
&lt;br /&gt;
[https://community.victronenergy.com/questions/177859/missing-grid-code-germany-vde-ar-n-41052018-11-int.html Internal NS-Protection only MultiPlus II]&lt;br /&gt;
&lt;br /&gt;
[https://www.giga.de/artikel/na-schutz-was-ist-das-und-warum-gibt-es-ihn/ NA Schutz allgemein]&lt;br /&gt;
&lt;br /&gt;
 In certain situations, the inverter/charger built-in Loss of Mains detection (LOM) causes issues.&lt;br /&gt;
&lt;br /&gt;
Auch die 4,6 kW Schieflast Grenze sei hier zu nennen.&lt;br /&gt;
&lt;br /&gt;
Nach einem LOM wird das Back-Feed-Relay geoeffnet, um auszuschlieszen, dass der AC-IN-Anschluss spannungsfrei ist.&lt;br /&gt;
&lt;br /&gt;
Den Unter-Reiter VDE grid code settings werde ich in einem eigenen Beitrag (TODO) eroertern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inverter&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Wechselrichter-Ausgangsspannung ist normalerweise 230 V.&lt;br /&gt;
&lt;br /&gt;
*Erdungsrelais&lt;br /&gt;
&lt;br /&gt;
Wenn der TransferSwitch offen ist, also z.B. bei Stromausfall und der MultiPlus sich im Inverter-Mode befindet ist der N-Anschluss des Inverters mit PE verbunden. Wenn der TransferSwitch schlieszt, also Strom vom AC in zu den AC out flieszt wird vorher der N-Leiter vom PE-Anschluss getrennt. &lt;br /&gt;
&lt;br /&gt;
[https://www.schutztechnik.com/posts/erdschlussschutz-richtig-prufen Erdschlusssicherung]&lt;br /&gt;
&lt;br /&gt;
 Hinweis: Mit Split-Phase-Installation (120V/240V) ist keine 2-Phasen-Anlage L1 und L2 mit freiem L3 gemeint!&lt;br /&gt;
&lt;br /&gt;
Zum Thema [https://community.victronenergy.com/questions/149662/2-phasen-split-system-zulassig-in-deutschland.html Schieflast] muss ich glaube ich auch noch einen Beitrag machen.&lt;br /&gt;
[https://elektro.tools/neutralleiter/dist/index1.html] [https://www.sw-netz.de/wp-content/uploads/TAB_2019.pdf] [https://www.e-netzeallgaeu.de/media/2019-07-01_E3_Datenblatt_Speicher.pdf] [https://tuprints.ulb.tu-darmstadt.de/14265/1/2020-11-03_Holbein_Markus.pdf]&lt;br /&gt;
&lt;br /&gt;
*Die 3 Einstellungen (&#039;&#039;&#039;DC input low&#039;&#039;&#039;) wirken bei unterschreiten der eingetragenen Spannungsuntergrenzen.&lt;br /&gt;
&lt;br /&gt;
Herunterfahren: Spannung (Vshut-down) die nicht unterschritten werden darf/sollte um die Batterie zu schützen/schonen.&lt;br /&gt;
&lt;br /&gt;
Neustart: Spannung (Vrestart), die wieder erreicht werden muss bevor der Inverter wieder aktiviert wird. (Vrestart &amp;gt; Vshut-down + 1V) Hysterese! &lt;br /&gt;
&lt;br /&gt;
Voralarm: Spannung (Vprealarm) ab der die Voralarmanzeige aktiviert wird. &lt;br /&gt;
&lt;br /&gt;
Der Begriff &#039;relativ&#039; ist [https://www.victronenergy.com/media/pg/VE.Bus_Configuration_Guide/de/description-of-settings.html hier] im Originaldokument meiner Meinung nach falsch benutzt. Es handelt sich um absolute Spannungsangaben und meint nur Vpre-alrm &amp;gt;= Vrestart &amp;gt; Vshut-down + 1V.&lt;br /&gt;
&lt;br /&gt;
Zusaetzlich zu den Spannungswerten kann auch der Ladezustand (SoC) zum Abschalten, bzw. Neustart dienen.&lt;br /&gt;
&lt;br /&gt;
*AES (Automatic Economy Switch) AES funktioniert nur im Stand-Alone-Betrieb und sollte nicht verwendet werden, wenn hohe Lasten zu geschaltet werden koennen/sollen.&lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen geht es hier um das Energiesparen des Inverters, in dem man 3 Betriebsmodi bei kleiner oder keiner Last waehlt.&lt;br /&gt;
*Zero-load power (Null-Last Leistung) (Normalmodus)&lt;br /&gt;
*Zero-load power in AES mode (Energiesparmodus Normalmodus-20%)&lt;br /&gt;
*Zero-load power in search mode (Energiesparmodus Normalmodus-70%)&lt;br /&gt;
&lt;br /&gt;
Im Datenblatt des MultiPlus-II sind das die drei letzten Zeilen der Angaben zum eingebauten Wechselrichter. Beim MultiPlus-II 48/5000/70-50 sind das 18 W, 12 W und 2 W.&lt;br /&gt;
Was hier verwirrend ist, dass der Suchmodus nur ein anderer Typ des AES-Modus ist. Es muesste also korrekt heiszen:&lt;br /&gt;
*Zero-load power (Null-Last Leistung)&lt;br /&gt;
*Zero-load power in AES mode Type1 modified sine mode (Energiesparmodus -20%)&lt;br /&gt;
*Zero-load power in AES mode Type2 search mode (Energiesparmodus -70%)&lt;br /&gt;
&lt;br /&gt;
Mit aktiviertem AES kann die Start-/Stop-Hysterese angegeben werden. &lt;br /&gt;
Beim Typ unterscheidet man dann zwischen einem modifizierten Sinus und einer Art Wellenpaketsteuerung, bei der alle Sekunde (In einer Anleitung steht &#039;every two seconds&#039; Ich glaub ich muss das mal nachmessen.)&lt;br /&gt;
ein Sinus (oder Wellenpaket) erzeugt wird und der Strom dabei gemessen wird um ggf. wieder in den Normalmodus zurueckzukehren. Rein ohmsche Lasten duerften damit zurecht kommen. Bei z.B. Schaltnetzteilen habe ich da so meine Zweifel. AES kann fuer mein Dafuerhalten bei einer &#039;echten&#039; Nulllast schon etwas bringen, aber das setzt voraus dass die Nullast bei kleiner Lasthuerde (Shut-down-power ???) auch richtig erkannt wird.&lt;br /&gt;
&lt;br /&gt;
====Charger====&lt;br /&gt;
*Ladegeraet aktivieren ist selbsterklaerend.&lt;br /&gt;
&lt;br /&gt;
Das Abschalten des eingebauten Ladegeraetes ist natuerlich nur sinnvoll, wenn es mindestens ein anderes externes gibt (MPPT). Im Falle von PV-Wechselrichtern an &#039;AC out&#039; gibt es fuer das Abschalten kaum einen Grund.&lt;br /&gt;
Das unerwuenschte Laden mit Netzstrom laesst sich auch anders unterbinden.&lt;br /&gt;
&lt;br /&gt;
*Schwacher AC Eingang&lt;br /&gt;
Wenn der MultiPlus-II ein &#039;schwaches&#039; Versorgungsnetz erkennt (Wellenform, cos(phi)) reduziert er die Leistung des Ladegeraetes. Diese Drosselung kann mit dem Aktivieren dieser Funktion (= Deaktivieren der Schutzfunktion) ausgeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
*Stopp nach uebermaeszigem Konstantstrom&lt;br /&gt;
Im Englischen steht hier &#039;excessive bulk&#039; also intensive Hauptladephase. Hier ist &#039;zeitlich intensiv&#039; (= 10 Stunden) gemeint. Wenn also die Konstantstrom-Phase (bei Lithium und Blei die Bulk-Phase) zu lange dauert, geht der Lader von einem Defekt aus und schaltet das Ladegeraet ab und aktiviert ggf. weitere Moeglichkeiten (Assistent fuer Lithiumbatterien). Die 10-Stunden-Grenze wirkt fuer mich eher willkuerlich. Bei kleinem Ladestrom und/oder kleinen DC-Lasten direkt an der Batterie sind die 80% Ladezustand nach 10 Stunden auch unter normalen Bedingungen nicht zu erreichen. Ich wuerde diese Funktion deaktivieren und einen anderen &#039;besseren&#039; Schutz implementieren.&lt;br /&gt;
&lt;br /&gt;
*Lithium Batterie&lt;br /&gt;
Diese Aktivierungsmoeglichkeit ist alleine fuer sich nicht ausreichend. Nach der Wahl des Batterietyps wird die Aktivierung ggf. automatisch vorgenommen.&lt;br /&gt;
&lt;br /&gt;
 Ob Sie das Kästchen ankreuzen oder nicht, spielt keine Rolle; es hat keine Wirkung. In Systemen mit einer solchen Batterie (Lynx BMS, BYD, Pylontech, MG Electronics, Freedomwon, Redflow und andere) werden alle Ladegeräteeinstellungen durch Parameter, die vom CAN-bus kommen, außer Kraft gesetzt.&lt;br /&gt;
&lt;br /&gt;
* Configured for VE.Bus BMS&lt;br /&gt;
Die Aktivierung weist auf die &#039;Victron Smart Lithium Batteries in conjunction with VE.Bus BMS&#039; hin und darueber hinaus wohl keine Bedeutung. &lt;br /&gt;
[https://www.victronenergy.de/upload/documents/Datasheet-BMS-overview-DE.pdf]&lt;br /&gt;
&lt;br /&gt;
*Storage Mode (Lagermodus)&lt;br /&gt;
Dieser Modus ist eine weiterer &#039;Ladephase&#039; (nach bulk, absorption, float, storage) und hat gegenueber der Float-Phase eine leicht abgesenkte Spannung von 13.2V (Ruhespannung) und eine zyklisch wiederkehrende (Repeated absorption interval in days) kurze Absorptionsspannung (Repeated absorption time). Nach einer 24 Stunden Floating-Phase wird bei aktiviertem Storage-Mode in die Storage-Phase gewechselt.&lt;br /&gt;
&lt;br /&gt;
*Verwenden Sie Ausgleich (Tubular Plate Traction Battery Mode)&lt;br /&gt;
Dieser spezielle Modus, am Ende der Absorptions-Phase. Sobald der Ladestrom unter 10% des (Start-)Bulk-Stromes faellt, wird der Ladestrom solange gehalten bis die Spannung auf 17 V gestiegen ist.   &lt;br /&gt;
&lt;br /&gt;
*Ladeerhaltungsspannung (Float Voltage)&lt;br /&gt;
Die Float Voltage duerfte fuer Lithium Batterien eigentlich keine Bedeutung haben, es wird aber darauf hingewiesen, dass bei den Pylontech eine Spannung von 51 V eingetragen sein soll.&lt;br /&gt;
&lt;br /&gt;
*Ladekurven&lt;br /&gt;
**Fixed (Die Absorptionsphase ist zeitlich begrenzt und wird aus der Eintragung (maximum) Absorption Time ermittelt.)&lt;br /&gt;
**Adaptive (Die Zeit fuer Absorptionphase wird aus der Zeit der Bulk-Phase abgeleitet, aber maximal Absorption Time)&lt;br /&gt;
**Adaptive+BatterySafe (Die Zeit fuer Absorptionphase wird aus der Zeit der Bulk-Phase abgeleitet, aber maximal Absorption Time.) (nicht bei Lithium) &lt;br /&gt;
Es wird empfohlen unter normalen Umstaenden immer den adaptiven Modus auszuwaehlen. Die Uebersetzung ist im Dokument von Victron hier wieder suboptimal. Was soll uns der Satz &amp;quot;Wenn der Ausgleich zwischen Ladegerät und Batterie nicht ideal ist ...&amp;quot; sagen? Die Empfehlung die Fixed-Ladekurve zu waehlen, so dass eine Ueber- oder Unterladung vermieden werden kann. Was eine Unterladung hier bedeuten soll ist mir nicht klar.&lt;br /&gt;
&lt;br /&gt;
*Stop charger below&lt;br /&gt;
Eine Ladung von unter 5°C sollte bei Lithium unterbleiben.&lt;br /&gt;
&lt;br /&gt;
====AC-Eingangssteuerung (Virtual Switch)====&lt;br /&gt;
Der Mechanismus hinter der AC-Eingangssteuerung ist das Öffnen oder Schließen des internen AC-Eingangsrelais des MultiPlus. Diese Funktion ist standardmäßig nicht aktiviert.&lt;br /&gt;
&lt;br /&gt;
Ich glaube da war der Google-Uebersetzter oder ein ChatBot am Werk:-))&lt;br /&gt;
&lt;br /&gt;
 Die AC-Eingangssteuerung kann auf zahlreiche Arten eingerichtet werden, z.B. trennt sich der Multi vom Netz, wenn die Batterien voll genug sind bzw. die AC-Last nicht zu groß ist. Der Multi wird sich die meiste Zeit vom Netz trennen. Er lässt das Netz nur rein, wenn die Batterien leer sind oder wenn Sie eine große AC-Last betreiben. Sie können das Gitter jetzt wie einen Backup-Generator verwenden.&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen sind nicht von Bedeutung, bzw. muss auch abgeschaltet sein, wenn man Assistenten benutzt.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
====Assistenten====&lt;br /&gt;
[https://www.victronenergy.com/live/assistants:overview_of_available_assistants Ueberblick]&lt;br /&gt;
&lt;br /&gt;
===VE.Bus System Konfigurator===&lt;br /&gt;
&lt;br /&gt;
===VE.Bus Quick Configure===&lt;br /&gt;
&lt;br /&gt;
===VEFlash===&lt;br /&gt;
&lt;br /&gt;
==Menuefuehrung CE Configure 3==&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=WRT54G_(Revival)&amp;diff=5224</id>
		<title>WRT54G (Revival)</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=WRT54G_(Revival)&amp;diff=5224"/>
		<updated>2026-07-31T16:04:26Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Wie so oft kann ich mich von alter ausgedienter Hardware nicht trennen und ueberlege was man mit so einem Schaetzchen wie dem WRT54G(L V1.1) noch so tun kann. Die Nutzung als AP ist nicht mehr zeitgemaesz, aber als Client kann ich mir einen Einsatz noch gut vorstellen. Abgesehen von der Tatsache dass ein Raspi doch etwas flinker ist, braucht man sich bei einem WRT54G keine Sorgen um sterbende SD-Karten zu machen. Und um ein paar kleine Routinen und Sensoren im Netzwerk einzubinden reicht die Performance der WRT54G in vielen Faellen.&lt;br /&gt;
&lt;br /&gt;
Durch ein paar kleine Hardwareeingriffe kann man den WRT54G mit einem SD-Kartenleser, mit 2 seriellen Schnittstellen und mit zwei USB-Ports (V1.1) ausstatten. Ein Variante, die ich im Netz gefunden habe, integriert noch einen Arduino-ProMicro in das Gehäuse und eroeffnet so ein riesiges Feld an Moeglichkeiten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HINWEIS:&#039;&#039;&#039; Das hier beschriebene Vorgehen der systematischen Analyse einer (Embedded-)Hardware laesst sich natuerlich vorgangsgleich auf andere Hardware anwenden. Es ist fuer mich oft der einzige (richtige) Weg, um ein tieferes Verstaendnis von Zusammenhaengen zu erkennen. Das immer wieder erstaunliche an der Sache ist, dass ab einem bestimmten Grad des Eintauchens sich viele Forenfragen in Luft aufloesen. Oder anders ausgedrueckt, macht man sich einmal diese Arbeit weisz man auf einmal was man tut und probiert nicht einfach nur rum.&lt;br /&gt;
&lt;br /&gt;
=DD-WRT vs. OpenWRT=&lt;br /&gt;
Ich bin hin- und hergerissen. Mit OpenWRT waren die Erfahrungen (Kamikaze, White Russian) aber eher schlecht. Danach habe ich lange Zeit DD-WRT (v3.0-r36247 std (06/29/18) KERNEL 2.4.37) benutzt und es ging so. Aber die 6 APs (mittlerweile durch Ubiquiti-APs ersetzt) im Haus haben immer irgendwie gezickt. &lt;br /&gt;
&lt;br /&gt;
Jetzt wo der AP-Modus keine Rolle mehr spielt und MMC, JFFS, CIFS, USB, TTYSXX und das Aufspielen neuer Software eine groeszere Rolle spielen, war ich mit DD-WRT irgendwie in einer gefuehlten Sackgasse. DD-WRT bietet zum Beispiel Unterstützung von ip (a und r aber nicht n) parallel zu ifconfig, route und arp, aber gibt z.B. keine Fehlermeldungen bei Befehlen wie mount, mkdir. Auch eine Hilfe sucht man vergebens. Da hilft oft nur ein Blick in den SourceCode was die Software tut, oder halt nicht wie gewohnt funktioniert. &lt;br /&gt;
&lt;br /&gt;
Der Support (DD-WRT) fuer CIFS, MMC und JFFS wird zwar in der WebGUI angeboten, laesst sich auch konfigurieren, aber CIFS und MMC lieszen sich nicht mounten und die Unterstuetzung von JFFS war auf der Konsole nicht auffindbar. &lt;br /&gt;
&lt;br /&gt;
Bei OpenWRT Backfire war es mir bisher nicht moeglich den WLAN-Treiber fuer den BCM4306 zum Laufen zu bringen. Das Backfire-Image 10.03.1  brcm-2.4 wird als stabil fuer WRT54G(V4/L) angegeben, meldet aber (dmesg) &amp;quot;No Broadcom Chipset&amp;quot; osae beim Laden des Treibers (:-(). Das Image brcm47xx wird dagegen als &amp;quot;works (somewhat unstable)&amp;quot; bewertet, laeuft bei mir bisher sauber. Ich weiß nicht auf was sich [https://openwrt.org/toh/linksys/wrt54g hier] das &#039;unstable&#039; bezieht. &lt;br /&gt;
&lt;br /&gt;
Um da einen Schritt vorwaerts zu machen, muss ich erst eine paar zurueck machen. &lt;br /&gt;
&lt;br /&gt;
Um schneller vergleichen zu koennen, habe ich einen Router mit Backfire 10.03.1 und den anderen mit DD-WRT v3.0 36247 laufen.   &lt;br /&gt;
&lt;br /&gt;
Aber der Reihe nach.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Um sich eine besser Bild von den Zusammenhaengen zu machen hier nochmal die Hardware im Ueberblick.&lt;br /&gt;
&lt;br /&gt;
==CPU==&lt;br /&gt;
Label: Broadcom BCM5352EKPBG &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# cat /proc/cpuinfo &lt;br /&gt;
system type             : Broadcom BCM5352 chip rev 0&lt;br /&gt;
processor               : 0&lt;br /&gt;
cpu model               : BCM3302 V0.8&lt;br /&gt;
BogoMIPS                : 199.47&lt;br /&gt;
wait instruction        : no&lt;br /&gt;
microsecond timers      : yes&lt;br /&gt;
tlb_entries             : 32&lt;br /&gt;
extra interrupt vector  : no&lt;br /&gt;
hardware watchpoint     : no&lt;br /&gt;
ASEs implemented        :&lt;br /&gt;
VCED exceptions         : not available&lt;br /&gt;
VCEI exceptions         : not available&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise: &lt;br /&gt;
&lt;br /&gt;
Die 199.47 BogoMIPS lassen auf 200 MHz und ein Verhältnis von 1 schlieszen. &lt;br /&gt;
&lt;br /&gt;
Der CPU-Kern BCM3302 findet auch in den SoC BCM4712, BCM53xx und BCM5836 Verwendung (siehe dazu http://oleg.wl500g.info/sdram.html)&lt;br /&gt;
&lt;br /&gt;
==SDRAM==&lt;br /&gt;
&lt;br /&gt;
Label: Winbond W9412G6JH-5&lt;br /&gt;
&lt;br /&gt;
Size: 2M x 4 BANKS * 16 BITS DDR SDRAM =&amp;gt; 16 MebiByte&lt;br /&gt;
&lt;br /&gt;
CELL-Array (Bank) Konfiguration: 4096 * 512 * 16 = 33.554.432 Bit mal 4 Baenke = 134.217.728 Bit = 16.777.216 Byte&lt;br /&gt;
&lt;br /&gt;
Adressraum: 0x000000 - 0xFFFFFF &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD_WRT:~# nvram show|grep sdram&lt;br /&gt;
sdram_config=0x0062&lt;br /&gt;
sdram_refresh=0x0000&lt;br /&gt;
sdram_ncdl=0xfe0008&lt;br /&gt;
sdram_init=0x010b&lt;br /&gt;
&lt;br /&gt;
DD-WRT:~# free&lt;br /&gt;
             total       used       free     shared    buffers     cached&lt;br /&gt;
Mem:         13004      11808       1196          0       1452       5180&lt;br /&gt;
-/+ buffers/cache:       5176       7828&lt;br /&gt;
Swap:            0          0          0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nuetzlicher Link:&lt;br /&gt;
&lt;br /&gt;
[http://oleg.wl500g.info/sdram.html]&lt;br /&gt;
&lt;br /&gt;
==Flash==&lt;br /&gt;
&lt;br /&gt;
Label: MXIC (Macronix) MX29LV320EBTI-70G&lt;br /&gt;
&lt;br /&gt;
Size: 4 MebiByte of 8 Bits each or 2 MebiBytes of 16&lt;br /&gt;
&lt;br /&gt;
Irgendwo habe ich gelesen, dass der WRT54G den 16 Bit-Zugriff nutzt.&lt;br /&gt;
&lt;br /&gt;
Adressierung: 0x000000 bis 0x3FFFFF&lt;br /&gt;
&lt;br /&gt;
Sector Structure  - 8K-Byte x 8 and 64K-Byte x 63•  Extra 256-Byte sector for securit&lt;br /&gt;
&lt;br /&gt;
DD-WRT:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Flash device: 0x400000 at 0x1c000000&lt;br /&gt;
bootloader size: 262144&lt;br /&gt;
Physically mapped flash: Filesystem type: squashfs, size=0x2c8102&lt;br /&gt;
partition size = 2930688&lt;br /&gt;
Creating 4 MTD partitions on &amp;quot;Physically mapped flash&amp;quot;:&lt;br /&gt;
0x00000000-0x00040000 : &amp;quot;cfe&amp;quot;&lt;br /&gt;
0x00040000-0x003f0000 : &amp;quot;linux&amp;quot;&lt;br /&gt;
0x00124800-0x003f0000 : &amp;quot;rootfs&amp;quot;&lt;br /&gt;
mtd: partition &amp;quot;rootfs&amp;quot; doesn&#039;t start on an erase block boundary -- force read-only&lt;br /&gt;
0x003f0000-0x00400000 : &amp;quot;nvram&amp;quot;&lt;br /&gt;
sflash not supported on this router&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Label cfe: 256 MebiByte (262.144 Byte) Bootloader&lt;br /&gt;
 Label linux:  3.776 MebiByte (3.866.624) darin enthalten (am Ende)  2.862 MebiByte (2.930.688) rootfs&lt;br /&gt;
 Label nvram: 64 KibiByte (65536) Configvariablen&lt;br /&gt;
&lt;br /&gt;
Was man hier jetzt erkennen kann, dass das eigentliche Image (.bin,.trx) sich im MTD-Device mit dem Label linux (inkl. dem Device rootfs) befindet. Fuer das Image bleiben 4 MebiByte minus 256 MebiByte (CFE Bootloader) minus 64 KibiByte (nvram) uebrig. Die Squashfs-Size (s.o.) 0x2c8102 (2.916.610 Byte) ist vermutlich die belegte Groesze in der linux-Partition.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Mit dem Programm mtd (http://www.linux-mtd.infradead.org/archive/tech/faq.html memory technology device) werden die Partitionen gemountet/administriert/...&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtd/&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   0 Jan  1 01:00 0&lt;br /&gt;
cr--r--r--    1 root     root       90,   1 Jan  1 01:00 0ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   2 Jan  1 01:00 1&lt;br /&gt;
cr--r--r--    1 root     root       90,   3 Jan  1 01:00 1ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   4 Jan  1 01:00 2&lt;br /&gt;
cr--r--r--    1 root     root       90,   5 Jan  1 01:00 2ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   6 Jan  1 01:00 3&lt;br /&gt;
cr--r--r--    1 root     root       90,   7 Jan  1 01:00 3ro&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtdblock/&lt;br /&gt;
0  1  2  3&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtdblock/&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   0 Jan  1 01:00 0&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   1 Jan  1 01:00 1&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   2 Jan  1 01:00 2&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   3 Jan  1 01:00 3&lt;br /&gt;
&lt;br /&gt;
DD-WRT:~# mtd&lt;br /&gt;
Usage: mtd [&amp;lt;options&amp;gt; ...] &amp;lt;command&amp;gt; [&amp;lt;arguments&amp;gt; ...] &amp;lt;device&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The device is in the format of mtdX (eg: mtd4) or its label.&lt;br /&gt;
mtd recognizes these commands:&lt;br /&gt;
        unlock                  unlock the device&lt;br /&gt;
        resetbc                 reset bootcounter for WRT1900AC/WRT1200AC/WRT1900ACv2&lt;br /&gt;
        erase                   erase all data on device&lt;br /&gt;
        write &amp;lt;imagefile&amp;gt;|-     write &amp;lt;imagefile&amp;gt; (use - for stdin) to device&lt;br /&gt;
Following options are available:&lt;br /&gt;
        -q                      quiet mode (once: no [w] on writing,&lt;br /&gt;
                                           twice: no status messages)&lt;br /&gt;
        -r                      reboot after successful command&lt;br /&gt;
        -f                      force write without trx checks&lt;br /&gt;
        -e &amp;lt;device&amp;gt;             erase &amp;lt;device&amp;gt; before executing the command&lt;br /&gt;
&lt;br /&gt;
Example: To write linux.trx to mtd4 labeled as linux and reboot afterwards&lt;br /&gt;
         mtd -r write linux.trx linux&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CFE (Common Firmware Environment) Bootloader===&lt;br /&gt;
&lt;br /&gt;
CFE ist nicht nur der Bootloader (fuer Broadcom), sondern auch ein Interface fuer die Hardware.&lt;br /&gt;
&lt;br /&gt;
Auf Github befindet sich der [https://github.com/kevbroch/cfe Sourcecode].&lt;br /&gt;
&lt;br /&gt;
 Definition [https://academic.microsoft.com/topic/203009010/publication/search?q=Common%20Firmware%20Environment&amp;amp;qe=And(Composite(F.FId%253D203009010)%252CTy%253D%270%27)&amp;amp;f=&amp;amp;orderBy=0]&lt;br /&gt;
 Common Firmware Environment (CFE), pronounced as &#039;cafe&#039;, is a firmware interface and bootloader developed by Broadcom for 32-bit and 64-bit system- on-a-chip systems. It is intended to be a flexible toolkit of CPU initialization and bootstrap code for use on embedded processors (typically running on MIPS32/64 instruction set CPUs found in Broadcom SoCs). It is roughly analogous to the BIOS on the IBM PC platform. Its source-code is available on Open source license from Broadcom. Common embedded system alternatives include Das U-Boot.&lt;br /&gt;
&lt;br /&gt;
Da das CFE mit dem BIOS bei einem PC vergleichbar ist, kann man sich vorstellen, dass sollte da ein &amp;quot;Defekt&amp;quot; vorliegen, die einfachen Mechanismen zum wiederherstellen der Embedded Hardware schwieriger werden. Manchmal wird in diesem Zusammenhang auch schon von &amp;quot;bricked&amp;quot; gesprochen. Dies ist aber nicht ganz richtig. Es bleiben in diesem Fall noch mindestens 2 Moeglichkeiten der Rettung: Erstens JTAG und zweitens Flash ausloeten und extern behandeln! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Mit der zweiten Moeglichkeit habe ich mal ein Panasonic-Notebook mit verlorenem BIOS-Passwort wiederbelebt, obwohl selbst Panasonic behauptet hat, dass es da keine Rettung gaebe, da ihre BIOSe sicher seien und keine (SW-)Moeglichkeit des Passwortruecksetzens besteht. Also wer so einen &amp;quot;hoffnungslosen&amp;quot; Fall hat, dem kann ich gerne weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
Interessant ist auch der Hinweis im [https://en.wikipedia.org/wiki/Common_Firmware_Environment Wiki], dass CFE auch in SmartTVs von LG und Samsung Einsatz findet. Sogar Amiga (meinen hab ich noch:-))) NG nutzt ihn.&lt;br /&gt;
&lt;br /&gt;
===Linux (Image/Squashfs)===&lt;br /&gt;
&lt;br /&gt;
Am Beispiel eines (alten) Images sei die Konvertierung von bin nach trx (und ggf. zuerueck) gezeigt.&lt;br /&gt;
&lt;br /&gt;
 dd if=lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin of=lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx bs=32 skip=1&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl werden die ersten 32 Byte des Bin-Images entfernt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads # ll lede*&lt;br /&gt;
-rw-r--r-- 1 chris users &#039;&#039;&#039;4001824&#039;&#039;&#039; Jul 27 21:22 lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin&lt;br /&gt;
-rw-r--r-- 1 root  root  &#039;&#039;&#039;4001792&#039;&#039;&#039; Jul 29 22:59 lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin|more&lt;br /&gt;
00000000  57 35 34 47 00 00 00 00  13 06 16 04 47 01 55 32  |W54G........G.U2|&lt;br /&gt;
00000010  4e 44 00 06 1f 00 00 00  00 00 00 00 00 00 00 00  |ND..............|&lt;br /&gt;
00000020  48 44 52 30 00 10 3d 00  3d a6 e1 7b 00 00 01 00  |HDR0..=.=..{....|&lt;br /&gt;
00000030  1c 00 00 00 24 09 00 00  00 54 12 00 1f 8b 08 00  |....$....T......|&lt;br /&gt;
00000040  00 00 00 00 02 03 8d 57  5d 68 1c d7 15 fe e6 ee  |.......W]h......|&lt;br /&gt;
00000050  ac b4 fa 4b 47 ab 95 b3  8e 55 32 d7 ba 5a 6d bd  |...KG....U2..Zm.|&lt;br /&gt;
00000060  2e dd b8 ae ab 87 2d 9d  ae 64 23 8a 1f d6 3f 69  |......-..d#...?i|&lt;br /&gt;
00000070  4d 29 61 51 44 f1 43 a0  72 d3 80 1f fa 30 28 4a  |M)aQD.C.r....0(J|&lt;br /&gt;
00000080  11 45 78 36 60 83 1e 4c  59 d6 92 a3 94 45 2b 3b  |.Ex6`..LY....E+;|&lt;br /&gt;
00000090  4a ea 42 9d 2c c2 6d 5a  68 a1 50 43 fd d2 22 42  |J.B.,.mZh.PC..&amp;quot;B|&lt;br /&gt;
000000a0  1e f2 54 f2 d0 36 6e 42  3b fd ce ec 6c ad 3a 36  |..T..6nB;...l.:6|&lt;br /&gt;
000000b0  cd c2 72 67 ee cf 39 df  fd ce 39 df bd b3 e0 7f  |..rg..9...9.....|&lt;br /&gt;
000000c0  be f4 87 f0 f6 b8 83 b5  56 06 eb ad 2c ae b7 c6  |........V...,...|&lt;br /&gt;
000000d0  f0 5a ab ea f7 97 80 19  0d 3f 59 3a 3f bc 6e e0  |.Z.......?Y:?.n.|&lt;br /&gt;
000000e0  f7 94 b2 4f ff da 00 1b  2b c0 72 d3 c6 ba 6b 63  |...O....+.r...kc|&lt;br /&gt;
000000f0  c9 3d 94 ba 8e 8f 43 37  03 fe 2c df f1 30 36 6c  |.=....C7..,..06l|&lt;br /&gt;
00000100  cc 72 51 65 e1 a6 a5 6f  f1 27 c3 50 48 19 7b 39  |.rQe...o.&#039;.PH.{9|&lt;br /&gt;
00000110  af fc 44 da 98 5a 45 ed  bc 9a 86 85 d3 39 ec a6  |..D..ZE......9..|&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx|more&lt;br /&gt;
00000000  48 44 52 30 00 10 3d 00  3d a6 e1 7b 00 00 01 00  |HDR0..=.=..{....|&lt;br /&gt;
00000010  1c 00 00 00 24 09 00 00  00 54 12 00 1f 8b 08 00  |....$....T......|&lt;br /&gt;
00000020  00 00 00 00 02 03 8d 57  5d 68 1c d7 15 fe e6 ee  |.......W]h......|&lt;br /&gt;
00000030  ac b4 fa 4b 47 ab 95 b3  8e 55 32 d7 ba 5a 6d bd  |...KG....U2..Zm.|&lt;br /&gt;
00000040  2e dd b8 ae ab 87 2d 9d  ae 64 23 8a 1f d6 3f 69  |......-..d#...?i|&lt;br /&gt;
00000050  4d 29 61 51 44 f1 43 a0  72 d3 80 1f fa 30 28 4a  |M)aQD.C.r....0(J|&lt;br /&gt;
00000060  11 45 78 36 60 83 1e 4c  59 d6 92 a3 94 45 2b 3b  |.Ex6`..LY....E+;|&lt;br /&gt;
00000070  4a ea 42 9d 2c c2 6d 5a  68 a1 50 43 fd d2 22 42  |J.B.,.mZh.PC..&amp;quot;B|&lt;br /&gt;
00000080  1e f2 54 f2 d0 36 6e 42  3b fd ce ec 6c ad 3a 36  |..T..6nB;...l.:6|&lt;br /&gt;
00000090  cd c2 72 67 ee cf 39 df  fd ce 39 df bd b3 e0 7f  |..rg..9...9.....|&lt;br /&gt;
000000a0  be f4 87 f0 f6 b8 83 b5  56 06 eb ad 2c ae b7 c6  |........V...,...|&lt;br /&gt;
000000b0  f0 5a ab ea f7 97 80 19  0d 3f 59 3a 3f bc 6e e0  |.Z.......?Y:?.n.|&lt;br /&gt;
000000c0  f7 94 b2 4f ff da 00 1b  2b c0 72 d3 c6 ba 6b 63  |...O....+.r...kc|&lt;br /&gt;
000000d0  c9 3d 94 ba 8e 8f 43 37  03 fe 2c df f1 30 36 6c  |.=....C7..,..06l|&lt;br /&gt;
000000e0  cc 72 51 65 e1 a6 a5 6f  f1 27 c3 50 48 19 7b 39  |.rQe...o.&#039;.PH.{9|&lt;br /&gt;
000000f0  af fc 44 da 98 5a 45 ed  bc 9a 86 85 d3 39 ec a6  |..D..ZE......9..|&lt;br /&gt;
00000100  8e 1a cf b1 ca d3 29 78  18 31 f6 ea 88 b5 1f 67  |......)x.1.....g|&lt;br /&gt;
00000110  54 da 03 f6 23 af d2 35  1a d8 f5 3d 7c c0 bf 9f  |T...#..5...=|...|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Header des Bin-Images (57 35 34 47 00 00 00 00  13 06 16 04 47 01 55 32 4e 44 00 06 1f 00 00 00  00 00 00 00 00 00 00 00) muss ich mir bei Gelegenheit mal noch genauer anschauen.&lt;br /&gt;
&lt;br /&gt;
Fuer die kleine Image-Analyse ist das Programm &#039;binwalk&#039; recht nuetzlich.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads # binwalk dd-wrt.v24_std_generic_36247.bin &lt;br /&gt;
&lt;br /&gt;
DECIMAL       HEXADECIMAL     DESCRIPTION&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
0             0x0             TRX firmware header, little endian, image size: 3858432 bytes, CRC32: 0xA663F3EF, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x9D0, rootfs offset: 0xE4800&lt;br /&gt;
28            0x1C            gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)&lt;br /&gt;
2512          0x9D0           LZMA compressed data, properties: 0x6E, dictionary size: 33554432 bytes, uncompressed size: 2985984 bytes&lt;br /&gt;
935936        0xE4800         Squashfs filesystem, little endian, DD-WRT signature, version 3.0, size: 2916610 bytes, 690 inodes, blocksize: 131072 bytes, created: 2018-06-29 09:09:45&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # binwalk dd-wrt.v24_mini_generic_44715.bin&lt;br /&gt;
&lt;br /&gt;
DECIMAL       HEXADECIMAL     DESCRIPTION&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
0             0x0             TRX firmware header, little endian, image size: 3375104 bytes, CRC32: 0x9886060E, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0xA34, rootfs offset: 0xCF400&lt;br /&gt;
28            0x1C            gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)&lt;br /&gt;
2612          0xA34           LZMA compressed data, properties: 0x6E, dictionary size: 33554432 bytes, uncompressed size: 2756608 bytes&lt;br /&gt;
848896        0xCF400         Squashfs filesystem, little endian, DD-WRT signature, version 3.0, size: 2521285 bytes, 650 inodes, blocksize: 131072 bytes, created: 2020-11-03 04:01:08&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C  dd-wrt.v24_mini_generic_44715.bin |more&lt;br /&gt;
00000000  48 44 52 30 00 80 33 00  0e 06 86 98 00 00 01 00  |HDR0..3.........|&lt;br /&gt;
00000010  1c 00 00 00 34 0a 00 00  00 f4 0c 00 1f 8b 08 00  |....4...........|&lt;br /&gt;
00000020  00 00 00 00 02 03 95 58  5d 6c 14 d7 15 3e 33 b3  |.......X]l...&amp;gt;3.|&lt;br /&gt;
00000030  eb dd b5 dd 74 d6 ec 3a  a6 71 61 27 7b 67 3d b1  |....t..:.qa&#039;{g=.|&lt;br /&gt;
00000040  f3 b0 20 8b 6e ab 7d 18  d6 b6 ba a5 a9 e4 90 54  |.. .n.}........T|&lt;br /&gt;
00000050  72 db 3c 58 04 28 aa 2a  95 a4 50 f1 40 db 09 01  |r.&amp;lt;X.(.*..P.@...|&lt;br /&gt;
00000060  e2 46 0e b3 a8 04 f9 a1  55 b6 36 6b d6 68 61 96  |.F......U.6k.ha.|&lt;br /&gt;
00000070  14 42 2b 85 c6 b5 b0 01  a9 aa 48 db a4 95 da 07  |.B+.......H.....|&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also haben wir nach dem BIN-Header (s.o.) auch noch einen TRX-Header (28 Bytes: 48 44 52 30 00 80 33 00  0e 06 86 98 00 00 01 00 1c 00 00 00 34 0a 00 00  00 f4 0c 00)&lt;br /&gt;
&lt;br /&gt;
Ab 0x1C steht der gzip-header beginnend mit der Magic Number (1f 8b). Siehe dazu [https://en.wikipedia.org/wiki/Gzip weiter]&lt;br /&gt;
&lt;br /&gt;
Um die Analyse weiter zu treiben habe ich noch ein paar Zusatzpakete unter OpenSuSE (15.3) installiert.&lt;br /&gt;
&lt;br /&gt;
 zypper in openocd&lt;br /&gt;
 zypper in sasquatch&lt;br /&gt;
 zypper in bcm43xx-firmware&lt;br /&gt;
 zypper in pullin-bcm43xx-firmware&lt;br /&gt;
&lt;br /&gt;
Um sasquatch zu installieren war bei mir noch ein Repo hinzuzufuegen.&lt;br /&gt;
&lt;br /&gt;
 zypper ar &amp;quot;https://download.opensuse.org/repositories/devel:/tools/openSUSE_Leap_15.3/&amp;quot; DEVEL&lt;br /&gt;
&lt;br /&gt;
Mit sasqautch war nun auch binwalk mit dem extrahieren der SquachFS-Partition erfolgreich.  &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
binwalk --extract dd-wrt.v24_std_generic_44715.bin&lt;br /&gt;
worker:/home/chris/Downloads # ll _dd-wrt.v24_std_generic_44715.bin.extracted/&lt;br /&gt;
total 8944&lt;br /&gt;
-rw-r--r--  1 root root    4816 Jul 31 09:19 1C&lt;br /&gt;
-rw-r--r--  1 root root 2748416 Jul 31 09:19 A34&lt;br /&gt;
-rw-r--r--  1 root root 3622348 Jul 31 09:19 A34.7z&lt;br /&gt;
-rw-r--r--  1 root root 2772622 Jul 31 09:19 CF400.squashfs&lt;br /&gt;
drwxr-xr-x 15 root root    4096 Nov  3  2020 squashfs-root&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Namen der extrahierten Dateien ist die hexadezimale Position im bin-File. Zusaetzlich zu sind die Inhalte bei A34 und CF400 noch dekomprimiert angelegt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads/_dd-wrt.v24_std_generic_44715.bin.extracted # 7z l A34.7z &lt;br /&gt;
&lt;br /&gt;
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21&lt;br /&gt;
p7zip Version 16.02 (locale=de_DE.UTF-8,Utf16=on,HugeFiles=on,64 bits,16 CPUs Intel(R) Xeon(R) CPU           X5570  @ 2.93GHz (106A5),ASM)&lt;br /&gt;
&lt;br /&gt;
Scanning the drive for archives:&lt;br /&gt;
1 file, 3622348 bytes (3538 KiB)&lt;br /&gt;
&lt;br /&gt;
Listing archive: A34.7z&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Path = A34.7z&lt;br /&gt;
Open WARNING: Can not open the file as [7z] archive&lt;br /&gt;
Type = lzma&lt;br /&gt;
&lt;br /&gt;
   Date      Time    Attr         Size   Compressed  Name&lt;br /&gt;
------------------- ----- ------------ ------------  ------------------------&lt;br /&gt;
                    .....      2748416               A34&lt;br /&gt;
------------------- ----- ------------ ------------  ------------------------&lt;br /&gt;
                               2748416      3622348  1 files&lt;br /&gt;
&lt;br /&gt;
Warnings: 1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsquashfs fuehrte hier nicht zum Erfolg. Da die Magic Number von 0x73717368 auf 0x74717368 (Grrrr!) geaendert wurde.&lt;br /&gt;
Siehe hierzu [https://github.com/jtreml/firmware-mod-kit]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads/_dd-wrt.v24_std_generic_44715.bin.extracted # sasquatch -i CF400.squashfs &lt;br /&gt;
SquashFS version [3.0] / inode count [700] suggests a SquashFS image of the same endianess&lt;br /&gt;
Non-standard SquashFS Magic: hsqt&lt;br /&gt;
Parallel unsquashfs: Using 1 processor&lt;br /&gt;
Trying to decompress using default gzip decompressor...&lt;br /&gt;
Trying to decompress with lzma...&lt;br /&gt;
Trying to decompress with lzma-adaptive...&lt;br /&gt;
Detected lzma-adaptive compression&lt;br /&gt;
654 inodes (693 blocks) to write&lt;br /&gt;
&lt;br /&gt;
squashfs-root&lt;br /&gt;
dir_scan: failed to make directory squashfs-root, because File exists&lt;br /&gt;
&lt;br /&gt;
created 0 files&lt;br /&gt;
created 0 directories&lt;br /&gt;
created 0 symlinks&lt;br /&gt;
created 0 devices&lt;br /&gt;
created 0 fifos&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
https://reverseengineering.stackexchange.com/questions/15508/how-to-convert-the-dumped-firmware-from-linksys-wrt54gl-via-jtag-port-in-an-un&lt;br /&gt;
&lt;br /&gt;
===NVRAM===&lt;br /&gt;
&lt;br /&gt;
NonVolatileRAM. Die (Config-)Variablen zur Einstellung der Linux-Umgebung auf der (Embedded-)Hardware werden zur Laufzeit im RAM abgelegt und beim Booten aus der Partition mit dem Label nvram geladen. Das erklaert auch warum man nach einer Aenderung einer Variablen mit &#039;nvram commit&#039; die Aenderungen in die Flash-Partitiion uebertraegt und somit &#039;nichtfluechtig&#039; macht. Vergisst man nach einer Variablenaenderung das Committen (sich bekennen, verpflichten: Sinn?) geht die Aenderung bei einem  Reboot verloren.&lt;br /&gt;
&lt;br /&gt;
==Weitere WRT54G Hardware==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# cat /proc/pci &lt;br /&gt;
PCI devices found:&lt;br /&gt;
  Bus  0, device   0, function  0:&lt;br /&gt;
    Class 0501: PCI device 14e4:0800 (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18000000 [0x18000fff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1fc00000 [0x1fffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1c000000 [0x1dffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1a000000 [0x1bffffff].&lt;br /&gt;
  Bus  0, device   1, function  0:&lt;br /&gt;
    Class 0200: PCI device 14e4:4713 (rev 0).&lt;br /&gt;
      IRQ 4.&lt;br /&gt;
      Master Capable.  Latency=64.  &lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18001000 [0x18001fff].&lt;br /&gt;
  Bus  0, device   2, function  0:&lt;br /&gt;
    Class 0b30: PCI device 14e4:0816 (rev 0).&lt;br /&gt;
      IRQ 5.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18002000 [0x18002fff].&lt;br /&gt;
  Bus  0, device   3, function  0:&lt;br /&gt;
    Class 0c03: PCI device 14e4:4716 (rev 0).&lt;br /&gt;
      IRQ 6.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18003000 [0x18003fff].&lt;br /&gt;
  Bus  0, device   4, function  0:&lt;br /&gt;
    Class 0500: PCI device 14e4:080f (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18004000 [0x18004fff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x0 [0x7ffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x10000000 [0x17ffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x80000000 [0x9fffffff].&lt;br /&gt;
  Bus  0, device   5, function  0:&lt;br /&gt;
    Class 0280: PCI device 14e4:4320 (rev 0).&lt;br /&gt;
      IRQ 2.&lt;br /&gt;
      Master Capable.  Latency=64.  &lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18005000 [0x18005fff].&lt;br /&gt;
  Bus  0, device   6, function  0:&lt;br /&gt;
    Class 0280: PCI device 14e4:4719 (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18006000 [0x18006fff].&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://devicehunt.com/view/type/pci/vendor/14E4&lt;br /&gt;
&lt;br /&gt;
* BUS 0/DEVICE 0 14e4:0800 Sentry5 Chipcommon I/O Controller&lt;br /&gt;
* BUS 0/DEVICE 1 14e4:4713 Sentry5 Ethernet Controller&lt;br /&gt;
* BUS 0/DEVICE 2 14e4:0816 BCM3302 Sentry5 MIPS32 CPU&lt;br /&gt;
* BUS 0/DEVICE 3 14e4:4716 BCM47xx Sentry5 USB Host Controller&lt;br /&gt;
* BUS 0/DEVICE 4 14e4:080f Sentry5 DDR/SDR RAM Controller&lt;br /&gt;
* BUS 0/DEVICE 5 14e4:4320 BCM4306 802.11b/g Wireless LAN Controller&lt;br /&gt;
* BUS 0/DEVICE 6 14e4:4719 BCM47xx/53xx RoboSwitch Core&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Passende Treiber:&lt;br /&gt;
 BCM4306 	PCI 	14e4:4320 	Broadcom 	WEP WPA WPA2 	b/g 	b43, b43legacy - Firmware muss installiert werden. Die Benötigte Firmwaredatei ucode4/5.fw ist nur in dem weiter unten im Forum verlinkten älteren Installationspaket enthalten!&lt;br /&gt;
&lt;br /&gt;
https://linux-club.de/wiki/opensuse/Broadcom_Wireless&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# firmware for b43&lt;br /&gt;
URL1=http://www.lwfinger.com/b43-firmware&lt;br /&gt;
FILE1=broadcom-wl-6.30.163.46.tar.bz2&lt;br /&gt;
FIRMWARE1=broadcom-wl-6.30.163.46.wl_apsta.o&lt;br /&gt;
&lt;br /&gt;
# firmware for b43legacy&lt;br /&gt;
URL2=http://downloads.openwrt.org/sources&lt;br /&gt;
FILE2=wl_apsta-3.130.20.0.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Pimpups=&lt;br /&gt;
==SDCard==&lt;br /&gt;
Um es vorweg zu nehmen: Lasst es! &lt;br /&gt;
&lt;br /&gt;
Es funktioniert zwar, aber es ist so langsam, dass es in der Praxis keinen Vorteil bringt.&lt;br /&gt;
&lt;br /&gt;
Ich habe als SDCard-Adapter diesen hier verwendet.&lt;br /&gt;
[[Datei:WRT54 SDCARD PCB top.jpg|mini]]&lt;br /&gt;
[[Datei:WRT54 SDCARD PCB bottom.jpg|mini]]&lt;br /&gt;
Auf der Karte ist ein 5C-&amp;gt;3.3V Stabi, so dass ich die Karte an 5V anschliessen konnte.&lt;br /&gt;
&lt;br /&gt;
Vom Insert bis Mount kann schon mal ne Minute dauern.&lt;br /&gt;
&lt;br /&gt;
==SERCON==&lt;br /&gt;
&lt;br /&gt;
Da der WRT54G 2 serielle Schnittstellen an JP2 anbietet kann im einfachsten Fall eine als Konsole und er zweite zur Kommunikation mit z. B. einem  Mikrocontroller verwendet werden. Aber auch eine virtuelle Anbindung über Sercon wäre eine schöne Sache.&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Serial Interface==&lt;br /&gt;
&lt;br /&gt;
[https://store.curiousinventor.com/product/spk-wrt-serial-port-kit-for-wrt54g-router/]&lt;br /&gt;
&lt;br /&gt;
==OneWire==&lt;br /&gt;
&lt;br /&gt;
[https://owfs.org/index_php_page_wireless-router.html]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
&lt;br /&gt;
=WIKI Hinweise=&lt;br /&gt;
&lt;br /&gt;
To support third-party firmware, Linksys has re-released the WRT54G v4, under the new model name WRT54GL (the &#039;L&#039; in this name allegedly stands for &#039;Linux&#039;). It is also possible to replace the 2 MB flash chip in the WRT54G with a 4 MB flash chip. The Macronix International 29LV320BTC-90 is a suitable part although others may work as well. The user must first install a JTAG header and use a JTAG cable to back up the firmware, then replace the chip and restore the firmware with the JTAG cable. After testing for proper functionality of the modified unit, third-party firmware can be flashed using the JTAG cable and a suitable image file.&lt;br /&gt;
&lt;br /&gt;
With the Attitude Adjustment (12.09)[46] release of OpenWrt, all WRT54G hardware versions with 16 MB of RAM are no longer supported, and older Backfire (10.03)[47] is recommended instead. Issues came from dropping support for the legacy Broadcom target brcm-2.4, making lower end devices run out of memory easily. Support for Attitude Adjustment is limited to WRT54G hardware versions with 32 MB of RAM, which includes WRT54GS and (apart from performing RAM upgrades through hardware modifications) some of the WRT54G and WRT54GL versions having the capability for unlocking their additional 16 MB of RAM.[48][49][50][51][52][53]&lt;br /&gt;
&lt;br /&gt;
=JTAG=&lt;br /&gt;
Nur der Vollstaendigkeit wegen hier noch ein paar Worte zu JTAG.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;T&#039;&#039;&#039;est &#039;&#039;&#039;A&#039;&#039;&#039;ction &#039;&#039;&#039;G&#039;&#039;&#039;roup (kurz JTAG) ist ein häufig verwendetes Synonym für den IEEE-Standard 1149.1, der eine Methodik für das Testen und Debuggen integrierter Schaltungen, also Hardware auf Leiterplatten, beschreibt.&lt;br /&gt;
&lt;br /&gt;
[https://www.linux-magazin.de/ausgaben/2010/06/diagnosewerkzeug/ Einstieg]&lt;br /&gt;
&lt;br /&gt;
JTAG besteht aus nur 4+2 Pins TCK, TMS, TDI und TDO. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|JTAG-Interface&lt;br /&gt;
|-&lt;br /&gt;
|PIN&lt;br /&gt;
|Name&lt;br /&gt;
|Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|TCK&lt;br /&gt;
|Test Clock&lt;br /&gt;
|Takt der Datenuebertragung&lt;br /&gt;
|-&lt;br /&gt;
|TMS&lt;br /&gt;
|Test Mode Select&lt;br /&gt;
|Navigation im Zustandsautomaten&lt;br /&gt;
|-&lt;br /&gt;
|TDI&lt;br /&gt;
|Test Data In&lt;br /&gt;
|Daten Adapter-&amp;gt;Geraet&lt;br /&gt;
|-&lt;br /&gt;
|TDO&lt;br /&gt;
|Test Data Out&lt;br /&gt;
|Daten Adapter&amp;lt;-Geraet&lt;br /&gt;
|-&lt;br /&gt;
|/TRST&lt;br /&gt;
|Test Reset&lt;br /&gt;
|Zustandsautomat in Ausgangszustand&lt;br /&gt;
|-&lt;br /&gt;
|/SRST&lt;br /&gt;
|System Reset&lt;br /&gt;
|Hardwarereset&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt keine einheitliche Steckerbelegung für JTAG-Anschluesse.&lt;br /&gt;
&lt;br /&gt;
==Debrick==&lt;br /&gt;
&lt;br /&gt;
[https://zedt.eu/tech/hardware/recovering-a-bricked-linksys-wrt54gl-v1-1-using-jtag-part-1-the-hardware/]&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Weiterfuehrende Links/Analysen/Techniken=&lt;br /&gt;
&lt;br /&gt;
https://www.heise.de/ct/ausgabe/2013-21-Hinter-den-Kulissen-eines-Router-Botnets-2313886.html&lt;br /&gt;
&lt;br /&gt;
https://www.heise.de/newsticker/meldung/Funkregulierung-als-Angriff-auf-alternative-Software-Open-Source-Projekte-gefaehrdet-2805855.html&lt;br /&gt;
&lt;br /&gt;
https://forum.ubuntuusers.de/topic/netzwerkkarte-nach-deaktivierung-im-autostart/#post-2480236&lt;br /&gt;
&lt;br /&gt;
https://www.broadcom.com/support/802.11&lt;br /&gt;
&lt;br /&gt;
https://t3n.de/news/sicherheitsluecke-milliarde-1257306/&lt;br /&gt;
&lt;br /&gt;
https://www.agner.org/optimize/ objconv&lt;br /&gt;
&lt;br /&gt;
https://rjmendez.github.io/posts/2019/02/Indeed_CTF_Embedded_2/&lt;br /&gt;
&lt;br /&gt;
https://berlioux.com/electronique/wrt-sim/wrt-sim-en.html&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=PCF8574&amp;diff=5223</id>
		<title>PCF8574</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=PCF8574&amp;diff=5223"/>
		<updated>2026-07-31T16:04:23Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Als Porterweiterung für Mikrocontroller ist der PCF8574 mir seiner Anbindung ueber I2C schon ein betagter Geselle (80er).&lt;br /&gt;
Fuer Arduino&amp;amp;Co aber nach wie vor sehr nuetzlich.&lt;br /&gt;
Diese Seite dient mir dazu, mir nochmal ueber die Anbindung von Tastaturen, Displays oder auch Relais Klarheit zu verschaffen.&lt;br /&gt;
Der nachfolgende Artikel aus den 8zigern von ELV diente mir damals dazu mich genauer mit dem I2C-Busprotokoll auseinanderzusetzen.&lt;br /&gt;
Heute liegt mein Schwerpunkt eher auf der Sondierung der ueber 48 gezaehlten Libraries mit PCF8574-Unterstuetzung des Arduino-Frameworks.&lt;br /&gt;
Bevor man jedoch die Software beurteilen kann, sollte man sich ueber die Hardwaremoeglichkeiten im Klaren sein. Was bei dem PCF8574 noch recht einfach ist.&lt;br /&gt;
Ein entscheidendes Kriterium zur Auswahl einer Library ist neben der Groesze, der Kompatibilitaet vor allem die Unterstuetzung der &#039;&#039;&#039;Interrupt-Faehigkeit&#039;&#039;&#039; (/INT).&lt;br /&gt;
[[Datei:ELV PCF8574P.jpg|thumb]]&lt;br /&gt;
&lt;br /&gt;
Das Modul war ein Teil dieses [https://de.elv.com/i2c-pc-interface-iic-2-202540 Bausatzes]&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
&lt;br /&gt;
Den Einstieg mache ich mit der Portimplementierung, die sich ein wenig von der von Mikrocontrollernbekannten unterscheidet.&lt;br /&gt;
&lt;br /&gt;
Laut Datenblatt betraegt die maximale I²C Taktrate 100kHz fuer den PCF und 400 kHz fuer den PCA, was dem Standard entspricht.&lt;br /&gt;
&lt;br /&gt;
Die Spannungsversorgung kann zwischen 2,5 V und 6 V liegen, was den Betrieb z. B. am Raspi mit seinen 3,3V direkt ohne Level-Shifter moeglich macht. &lt;br /&gt;
&lt;br /&gt;
Was mir auch aufgefallen ist betrifft den Umstand, dass die wenigstens Implementationen den /INT-Pin (active LOW open-drain interrupt output) benutzen/auswerten.&lt;br /&gt;
Ein Interrupt wird ausgeloest sobald der Status am Eingangspin sich vom Inputport Register Status unterscheidet.&lt;br /&gt;
&lt;br /&gt;
Die Port-Pins sind zustandsgesteuerte Flipflops (Latches) und man kann an sie eine LED z.B. direkt anschlieszen. Die Gesamtstrom-&amp;quot;Belastung&amp;quot; darf dabei aber 80 mA nicht ueberschreiten.&lt;br /&gt;
&lt;br /&gt;
Kapitel 8 des Datenblattes gibt folgendes an:&lt;br /&gt;
&lt;br /&gt;
8 I/O programming&lt;br /&gt;
&lt;br /&gt;
8.1 Quasi-bidirectional I/Os &lt;br /&gt;
&lt;br /&gt;
Quasi weist auf den Umstand hin, dass die Ports zwar als Eingang und Ausgang dienen können , es aber Einschränkungen/Besonderheiten zu beachten gilt.&lt;br /&gt;
&lt;br /&gt;
Es gibt z.B. nicht wie von Mikrocontrollern gewohnt, ein Direction Control Register (DCR).&lt;br /&gt;
Bei einem Lesezugriff auf einen Port (Anm.: Mit Port ist zwar hier ein Port-Pin gemeint, eigentlich liest oder schreibt man aber immer alle 8 Port-Pins zusammen.) erhaelt man den Status des Eingangs-FlipFlops.  &lt;br /&gt;
&lt;br /&gt;
Eine weitere wichtige Information betrifft das Einschaltverhalten. Sobald der IS mit Spannung versorgt wird gehen alle Ports auf HIGH und als INPUTS und die 100uA Stromquelle ist eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
[[Datei:PCF8574 Port intern.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Das obere FLipFlop uebernimmt und speichert den Zustand im SHift-Register bei einem Schreibzugriff.&lt;br /&gt;
&lt;br /&gt;
Das untere FlipFlop uebernimmt und speicher den Zustand des Port-Pins bei einem Schreib- oder Lesezugriff!&lt;br /&gt;
&lt;br /&gt;
Nach einem Reset (Power on) sind beide FlipFlops im Zustand Q = 1.&lt;br /&gt;
&lt;br /&gt;
Die Anreicherungstypen (MOSFETs) sind bei UGS = 0 V gesperrt (selbstsperrend) ID = 0 A.&lt;br /&gt;
&lt;br /&gt;
Das heiszt der obere pMOSFET (Itrt(pu)) ist bei einem Schreibimpuls und 1-Zustand des Output-FF gesperrt. In allen anderen Faellen ist er leitend.&lt;br /&gt;
&lt;br /&gt;
Ist das Ausgangs-FF im 1-Zustand sind die Ausgangs-MOSFET gesperrt.&lt;br /&gt;
&lt;br /&gt;
Ist das Ausgangs-FF im 0-Zustand sind die Ausgangs-MOSFET beide leitend.&lt;br /&gt;
Ein (/INT) Interrupt wird ausgeloest wenn wenn sich der Zusatnd am Port-Pin vom Zusatnd des Eingangs-FF unterscheidet, d.h. der Zustand wurde noch nicht per Lesezugriff ins Eingangs-FF uebernommen. Der Interrupt wird also durch einen Lese- oder Schreibzugriff zurueckgesetzt. Kehrt der Zustand des Port-Pins zum &amp;quot;alten&amp;quot; bekannten Zustand zurueck bevor der Mikrocontroller reagiert, geht der Interrupt auch wieder in den unausgeloesten Zustand zurueck.&lt;br /&gt;
&lt;br /&gt;
An einem Port-Pin kann man 4 verschiedene Zustaende unterscheiden:&lt;br /&gt;
 INPUT HIGH/LOW: Man muss eine 1 an den Port-Pin uebertragen. Das ist der &amp;quot;Normalzustand&amp;quot; nach einem PowerOn (Reset). MOSFETs gesperrt.&lt;br /&gt;
 Durch einen Lesezugriff wird der Zustand (VDD oder VSS) des Port-Pins gelesen.&lt;br /&gt;
 Ensure a logic 1 is written for any port that is being used as an input to ensure the strong external pull-down is turned off.&lt;br /&gt;
&lt;br /&gt;
 Die Zuordnung von LOW und HIGH geschieht LOW &amp;lt; 0,3 * VDD und HIGH &amp;gt; 0,7 * VDD.&lt;br /&gt;
&lt;br /&gt;
 VDD = 5 V    LOW &amp;lt; 1,5 V HIGH &amp;gt; 3,5 V&lt;br /&gt;
&lt;br /&gt;
 VDD = 3,3 V  LOW &amp;lt; 0,99 V HIGH &amp;gt; 2,31 V&lt;br /&gt;
&lt;br /&gt;
 OUTPUT HIGH: Man muss eine 1 an den Port-Pin uebertragen.&lt;br /&gt;
&lt;br /&gt;
 OUTPUT LOW: Man muss eine 0 an den Port-Pin uebertragen. Hierbei ist zu beachten, dass nicht gleichzeitig der PIN auf VDD als INPUT gelegt wird.&lt;br /&gt;
&lt;br /&gt;
 If a LOW is written, the strong pull-down turns on and stays on. If a &lt;br /&gt;
 HIGH is written, the strong pull-up turns on for 1⁄2 of the clock cycle, then the line is held &lt;br /&gt;
 HIGH by the weak current source.&lt;br /&gt;
&lt;br /&gt;
=Programmierung=&lt;br /&gt;
==C==&lt;br /&gt;
An der Stelle nutze ich die Gelegenheit mir nochmal die geliebten Zeiger(-Operationen) zu vergegenwaertigen. &lt;br /&gt;
Eigentlich will ich mir nur noch mal im Klaren werden, ob in main() char *argv[] oder char **argv &#039;besser&#039; ist.&lt;br /&gt;
&lt;br /&gt;
 Ein Zeiger ist eine Variable, in der sich die Adresse eines Datenobjektes oder &#039;&#039;&#039;einer Funktion&#039;&#039;&#039; befindet.&lt;br /&gt;
&lt;br /&gt;
Um die Adresslaenge (8, 16, 32, 64, 96) herauszubekommen dient z. B. folgendes kleine Programm.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   int array[5];&lt;br /&gt;
  &lt;br /&gt;
   /* If %p is new to you, you can use %d as well */&lt;br /&gt;
   printf(&amp;quot;array=%p : &amp;amp;array=%p\n&amp;quot;, array, &amp;amp;array); &lt;br /&gt;
  &lt;br /&gt;
   printf(&amp;quot;array+1 = %p : &amp;amp;array + 1 = %p\n&amp;quot;, array+1, &amp;amp;array+1);&lt;br /&gt;
  &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Pointer array zeigt auf das erste Element des Integer-Arrays.&lt;br /&gt;
Somit haben &amp;amp;array[0] und array den gleichen Inhalt.&lt;br /&gt;
&lt;br /&gt;
 Auf dem Raspi ergibt sich eine Integerlaenge zu 4 Byte.&lt;br /&gt;
&lt;br /&gt;
Die Adresse von array (&amp;amp;array) zeigt auf das ganze Array (5 x 4 Byte).&lt;br /&gt;
&lt;br /&gt;
 Die Notation Datentyp* zeiger finde ich eingaengiger als Datentyp *zeiger. Da beides zulaessig ist bevorzuge ich das Sternchen beim Datentyp.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel zeigt warum:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
int x, *px = &amp;amp;x;&lt;br /&gt;
int *py; py = px;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier funktioniert * als &amp;quot;Inhalt von&amp;quot; und &amp;amp; als &amp;quot;Adresse von&amp;quot; zu lesen irgendwie nicht mehr so richtig.&lt;br /&gt;
Die weiteren Dereferenzierungsoperatoren (. und -&amp;gt;) lasse ich hier mal auszer Acht.&lt;br /&gt;
&lt;br /&gt;
Wenn ich es wie foglt schreibe dagegen schon:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
int x&lt;br /&gt;
int* px = &amp;amp;x;&lt;br /&gt;
int* py; &lt;br /&gt;
py = px;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Programmcode ist identisch, die zweite Variante halte ich allerdings fuer besser fassbar.&lt;br /&gt;
&lt;br /&gt;
 Zeiger sind vom gleichen Datentyp wie der Datentyp auf den sie zeigen.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
const int* pointertoconst  // Zeiger auf const int; der Zeiger kann veraendert werden seine Objekte nicht&lt;br /&gt;
int* const constpointer // const Zeiger auf int; *constpointer=10; erlaubt, aber constpointer = &amp;amp;intvariable nicht&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weil ich gerade so am Probieren war hab ich das Testprogramm noch ein wenig erweitert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
#include &amp;quot;stdint.h&amp;quot; // wird fuer die Extended Variable Types gebraucht&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
//   int array[5] = {0};                        // alle Werte werden zu 0 initialisiert&lt;br /&gt;
   int array[5]={0,1,2};                        // erlaubt; der Rest der Elemente wird mit 0 initialisiert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   uint8_t i;                                   // Extended Variable Type; liest sich logischer als unsigend char i&lt;br /&gt;
&lt;br /&gt;
   int len = sizeof(array) / sizeof(array[0]);  // Anzahl der Elemente eines Array ermittlen&lt;br /&gt;
&lt;br /&gt;
   #define NUM(a) (sizeof(a) / sizeof(*a))      // eleganter Weg die Anzahl der Elemente eines Array zu ermittlen&lt;br /&gt;
                                                // damit koennte man in der for-Schleife anstelle von len schoener NUM(array) schreiben&lt;br /&gt;
&lt;br /&gt;
   /* If %p is new to you, you can use %d as well */&lt;br /&gt;
   printf(&amp;quot;array=%p : &amp;amp;array=%p\n&amp;quot;, array, &amp;amp;array);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;array=%x : &amp;amp;array=%x\n&amp;quot;, array, &amp;amp;array);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;array+1 = %p : &amp;amp;array + 1 = %p\n&amp;quot;, array+1, &amp;amp;array+1);&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;array+1 = %x : &amp;amp;array + 1 = %x\n&amp;quot;, array+1, &amp;amp;array+1);&lt;br /&gt;
&lt;br /&gt;
   // index bei 5 Elementen von 0 bis 4&lt;br /&gt;
&lt;br /&gt;
   for (i=0;i&amp;lt;len;i++) {&lt;br /&gt;
        printf(&amp;quot;%x : %p\n&amp;quot;,array[i],&amp;amp;array[i]);&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nun zur eigentlichen Herausforderung, die Bedeutung der doppelten Dereferenzierung:&lt;br /&gt;
 &lt;br /&gt;
 char** array;&lt;br /&gt;
&lt;br /&gt;
Eine haeufig angewendete Naeherung geschieht ueber ein String array D‑&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
char* myStrings[] = {&lt;br /&gt;
    &amp;quot;Hello&amp;quot;,&lt;br /&gt;
    &amp;quot;World&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Grund ist naheliegend. Es gibt keinen Datentyp String in C. Stattdessen arbeitet man mit NULL-terminierten Character-Ketten. &lt;br /&gt;
&lt;br /&gt;
Den gleichen Effekt wie das voran gegangene Beispiel erhaelt man auch mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
char hello[]={&#039;H&#039;,&#039;e&#039;,&#039;l&#039;,&#039;l&#039;,&#039;o&#039;,&#039;\0&#039;};&lt;br /&gt;
char world[]={&#039;W&#039;,&#039;o&#039;,&#039;r&#039;,&#039;l&#039;,&#039;d&#039;,&#039;\0&#039;};&lt;br /&gt;
&lt;br /&gt;
char* myStrings[]={hello,world};&lt;br /&gt;
&lt;br /&gt;
// oder !!!&lt;br /&gt;
&lt;br /&gt;
char* myStrings[2];&lt;br /&gt;
&lt;br /&gt;
myStrings[0] = &amp;amp;hello[0]; // hier koente man auch hello schreiben&lt;br /&gt;
myStrings[1] = &amp;amp;world[0];&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%s %s\n&amp;quot;,myStrings[0],myStrings[1]);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vielleicht ist das ein Grund warum recht viele bei C den Riemen runterwerfen.&lt;br /&gt;
Ich halte C allerdings, abgesehen von Assembler, fuer einen Informatiker mit physikalisch-elektrischen Wurzeln ;-) und Anwendungsfaellen, nach wie vor fuer die beste Wahl.&lt;br /&gt;
&lt;br /&gt;
Die main Funktion erhaelt vom Betriebssystem zwei Parameter uebergeben.&lt;br /&gt;
Der erste (argc) enthaelt die Anzahl der Argumente, die immer groeszer gleich 1 ist. Bei der Ueberbgabe befinden sich alle Eintrage der Kommandozeile   im zweiten Parameter (argv). Da der Programmname zu Beginn der Zeichenfolge steht, bildet er auch das erste Element (argc=1).&lt;br /&gt;
Die weiteren Aufrufoptionen sind durch Leerzeichen getrennte Zeichenketten, die als Strings an main() uebergeben werden.&lt;br /&gt;
Wie in den Beispielen voran zu sehen, ist argv ein array von Strings also ein array von character-Ketten, die wiederum arrays sind.&lt;br /&gt;
Wenn man also die String, bzs. Character-Ketten, als char-arrays begreift ist also argv ein array von Zeigern auf diese char-arrays.&lt;br /&gt;
Also&lt;br /&gt;
 argv: char* argv[]&lt;br /&gt;
&lt;br /&gt;
Jetzt wird&#039;s richtig uebel.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[]){&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d : %s : %c %c %c %c %c %c %c %c ...\n&amp;quot;, argc, argv[0],*argv[0],*(argv[0]+1),*(argv[0]+2),*(argv[0]+3),*(argv+4),*(argv+5),*(argv+6),*(argv+7));&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%x %x %x %x\n&amp;quot;,argv,argv[0],argv+1,argv[0]+1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Reihe nach. In argv steht ein Zeiger, der auf den ersten Zeiger auf das erste Element (Character-Kette).&lt;br /&gt;
Somit sind argv und &amp;amp;argv[0] identisch. Wenn ich den String bearbeiten moechte benoetige ich den zweiten (besser vielleicht untergeordneten) Zeiger.&lt;br /&gt;
Will ich an die einzelnen Buchstaben eines jeden String benoetige ich den Inhalt (*) des zweiten Zeigers, also *(argv[0]) usw.&lt;br /&gt;
oder den InhaltInhalt von argv, also **argv.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[]){&lt;br /&gt;
&lt;br /&gt;
char hello[]={&#039;H&#039;,&#039;e&#039;,&#039;l&#039;,&#039;l&#039;,&#039;o&#039;,&#039;\0&#039;};&lt;br /&gt;
char world[]={&#039;W&#039;,&#039;o&#039;,&#039;r&#039;,&#039;l&#039;,&#039;d&#039;,&#039;\0&#039;};&lt;br /&gt;
&lt;br /&gt;
//char* myStrings[]={hello,world};&lt;br /&gt;
&lt;br /&gt;
// oder !!!&lt;br /&gt;
&lt;br /&gt;
char* myStrings[2];&lt;br /&gt;
&lt;br /&gt;
myStrings[0] = &amp;amp;hello[0];&lt;br /&gt;
myStrings[1] = &amp;amp;world[0];&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%s %s\n&amp;quot;,myStrings[0],myStrings[1]);&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d : %s : %c %c %c %c %c %c %c %c %c...\n&amp;quot;, argc, argv[0],*argv[0],**argv,*(argv[0]+1),*(argv[0]+2),*(argv[0]+3),*(*argv+4),*(*argv+5),**argv+6,**argv+7);&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%x %x %x %x\n&amp;quot;,argv,argv[0],argv+1,argv[0]+1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klammern um die Additionen (Character-Ketten-Zeiger-Manipulation :-)) sind notwendig um die richtige Reihenfolge der Operationen zu gewaehrleisten. +6 und +7 ergeben nicht das richtig Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Eine Array-Defintion ohne Dimensionsangabe oder gleichzeitige Initialisierung funktioniert nicht. Deshalb ist die Schreibweise char* argv[] durchaus irrefuehrend. Hier klappt es nur wegen der byreference-Parameteruebergabe. Deshalb ist eine Defintion char** argv u.U. besser fassbar.&lt;br /&gt;
&lt;br /&gt;
Beide main-Defintionen liefern das gleich Ergebnis, die Lesart der ersten Variante ist etwas eingaengiger, naemlich dass argv ein Zeiger auf ein array ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//int main(int argc, char* argv[]){&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d : %s : %c %c %c %c %c %c %c %c %c...\n&amp;quot;, argc, argv[0],*argv[0],**argv,*(argv[0]+1),*(argv[0]+2),*(argv[0]+3),*(*argv+4),*(*argv+5),**argv+6,**argv+7);&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%x %x %x %x\n&amp;quot;,argv,argv[0],argv+1,argv[0]+1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Schreibweise **argv+i fuehrt nicht zum Ziel.&lt;br /&gt;
* Die Schreibweise *(*argv+i) fuehrt zum Ziel aber funktioniert so nur fuer das erste Element (Programmname)&lt;br /&gt;
* Die Schreibweise *(argv[x]+i) ist am flexibelsten, da man so auch jeden einzelnen Buchstaben der uebergebenen Optionen zugreifen kann&lt;br /&gt;
&lt;br /&gt;
An der Stelle soll&#039;s mit einem Abschlussbeispiel mal reichen. Fuer den Anwendungsfall der i2c-Programmierung bleiebn die Kommandozeilen-Optionen ueberschaubar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;quot;stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//int main(int argc, char* argv[]){&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
&lt;br /&gt;
 int i;&lt;br /&gt;
&lt;br /&gt;
 for (i=1;i&amp;lt;argc;i++){&lt;br /&gt;
        if (*argv[i]==&#039;-&#039;){&lt;br /&gt;
                switch(*(argv[i]+1)){&lt;br /&gt;
                        case &#039;h&#039;: printf(&amp;quot;Help\n&amp;quot;);&lt;br /&gt;
                                  return 1;&lt;br /&gt;
                                  break;&lt;br /&gt;
                        default: break;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 for(i=0;i&amp;lt;argc;i++){&lt;br /&gt;
        printf(&amp;quot;%d: %s\n&amp;quot;,i,argv[i]);&lt;br /&gt;
 }&lt;br /&gt;
 return 0;&lt;br /&gt;
}                &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(AVR)_Interrupts&amp;diff=5222</id>
		<title>(AVR) Interrupts</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(AVR)_Interrupts&amp;diff=5222"/>
		<updated>2026-07-31T16:04:22Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Externe Interrupts können im Prinzip über/von jedem I/O-Pin ausgelöst werden.&lt;br /&gt;
Wenn nicht ausdrücklich erwähnt beziehe ich mich bei meinen Aussagen auf den ATmega328P. Wenn jemand eine Info bezüglich eines anderen Prozessors benötigt, einfach unten in die Kommentare schreiben.&lt;br /&gt;
&lt;br /&gt;
Zu beachten:&lt;br /&gt;
* Ein Interrupt ist erst nach 4 Taktzyklen durch PCIF erkennbar. Bei 20 MHZ Taktfrequenz sind das immerhin 200ns (4x50ns) oder 0,2us. Es wird aber kein Interrupt &amp;quot;verschluckt&amp;quot; wenn der Auslöser länger als einen Taktzyklus dauert. Kürzere Impulse lösen nicht garantiert einen Interrupt aus. Bei 0-Pegel-Interrupts muss zuerst der aktuelle Befehl abgearbeitet werden.&lt;br /&gt;
* Nur INT0 (PD2) und INT1 (PD3) sind &amp;quot;vollwertige&amp;quot; Interrupts&lt;br /&gt;
* Die 3 PCIx sind jeweils für eine Gruppe von I/O-Pins zuständig (PCI0 für PCINT7..0, PCI1 für PCINT14..8 , PCI2 für PCINT23..16).  &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
During interrupts and subroutine calls, the return address program counter (PC) is stored on the stack. The stack is&lt;br /&gt;
effectively allocated in the general data SRAM, and consequently the stack size is only limited by the total SRAM size and&lt;br /&gt;
the usage of the SRAM. All user programs must initialize the SP in the reset routine (before subroutines or interrupts are&lt;br /&gt;
executed). The stack pointer (SP) is read/write accessible in the I/O space. The data SRAM can easily be accessed through&lt;br /&gt;
the five different addressing modes supported in the AVR architecture.&lt;br /&gt;
The memory spaces in the AVR architecture are all linear and regular memory maps.&lt;br /&gt;
A flexible interrupt module has its control registers in the I/O space with an additional global interrupt enable bit in the status&lt;br /&gt;
register. All interrupts have a separate interrupt vector in the interrupt vector table. The interrupts have priority in accordance&lt;br /&gt;
with their interrupt vector position. The lower the interrupt vector address, the higher the priority.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Allgemein=&lt;br /&gt;
Die meisten Mikrocontroller besitzen einen oder mehrere I/O-Pins an denen abhaengig vom Zustandswechsel durch eine Programmunterroutine (Funktion) reagiert werden kann. Das ist natuerlich viel cleverer als in einer Schleife dauert nach einem Zustandswechsel zu &amp;quot;fragen&amp;quot; (Polling). Bei einem kleinen Microcontrollerprogramm, das nur das tut, mag das noch eine Ueberlegung wert sein. Sobald aber ein Programm ein wenig komplexer wird ist interrupten angesagt.&lt;br /&gt;
&lt;br /&gt;
Zum konfigurieren des Verhaltens bei einem Interrupt besitzen die Controller ein Reihe von Registern.&lt;br /&gt;
&lt;br /&gt;
Beim ATmega328P als erstes, das SREG (AVR Status Register) und darin das Global Interrupt Enable (Bit 7)&lt;br /&gt;
&lt;br /&gt;
 The global interrupt enable bit must be set for the interrupts to be enabled. The individual interrupt enable control is then&lt;br /&gt;
performed in separate control registers. If the global interrupt enable register is cleared, none of the interrupts are enabled&lt;br /&gt;
independent of the individual interrupt enable settings. The I-bit is cleared by hardware after an interrupt has occurred, and is&lt;br /&gt;
set by the RETI instruction to enable subsequent interrupts. The I-bit can also be set and cleared by the application with the&lt;br /&gt;
SEI and CLI instructions, as described in the instruction set reference.&lt;br /&gt;
&lt;br /&gt;
Abhaengig von den Bits BOOTRST, IVSEL, IVCE stehen die Interruptvektoren (siehe weiter unten) an einer anderen Position im Programmspeicher.&lt;br /&gt;
&lt;br /&gt;
Fuer die Interruptkontrolle sind folgende Register von Bedeutung: &lt;br /&gt;
* &#039;&#039;&#039;EICRA&#039;&#039;&#039; External Interrupt Control Register A (0x69) -&amp;gt; Interrupt Sense Control INT0/INT1 (siehe folgende Tabelle)&lt;br /&gt;
* &#039;&#039;&#039;EIMSK&#039;&#039;&#039; – External Interrupt Mask Register (0x1D/0x3D) -&amp;gt; External Interrupt Request INT0/INT1 Enable&lt;br /&gt;
* &#039;&#039;&#039;EIFR&#039;&#039;&#039; – External Interrupt Flag Register (0x1C/0x3C) -&amp;gt;  INTF0/INTF1: External Interrupt Flag 0/1&lt;br /&gt;
* &#039;&#039;&#039;PCICR&#039;&#039;&#039; – Pin Change Interrupt Control Register (0x68) -&amp;gt; PCIE0/1/2: Pin Change Interrupt Enable 0/1/2&lt;br /&gt;
* &#039;&#039;&#039;PCIFR&#039;&#039;&#039; – Pin Change Interrupt Flag Register (0x1B/0x3B) -&amp;gt; PCIF0/1/2: Pin Change Interrupt Flag 0/1/2&lt;br /&gt;
* &#039;&#039;&#039;PCMSK2&#039;&#039;&#039; – Pin Change Mask Register 2 (0x6D) -&amp;gt; PCINT23-PCINT16&lt;br /&gt;
* &#039;&#039;&#039;PCMSK1&#039;&#039;&#039; – Pin Change Mask Register 1 (0x6C) -&amp;gt; PCINT14-PCINT8 (kein PCINT15!)&lt;br /&gt;
* &#039;&#039;&#039;PCMSK0&#039;&#039;&#039; – Pin Change Mask Register 0 (0x6B) -&amp;gt; PCINT7-PCINT0&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu den PC-Interrupts, die nur auf einen Wechsel des Zustandes reagieren, koennen INT0/1 auch auch auf fallende und steigende Flanken und Zustaende reagieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==INT1 INT0==&lt;br /&gt;
Dies sind die &amp;quot;vollwertigen&amp;quot; Interrupts. &lt;br /&gt;
* Können auf fallende und steigende Flanke und 0-Pegel triggern (-&amp;gt; EICRA)&lt;br /&gt;
* Bei der 0-Pegel wird der Trigger solange ausgelöst bis wieder 1-Pegel anliegt.&lt;br /&gt;
&lt;br /&gt;
An- und Ausschalten kann man die beiden Interrupts im EIMSK – External Interrupt Mask Register. Mask sollte vielleicht besser Enable heißen.&lt;br /&gt;
&lt;br /&gt;
Das EICRA – External Interrupt Control Register A (0x69) dient ausschließlich (Interrupt Sense Control Bit0-3) der Triggereinstellung von INT0 und INT1&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Interrupt 0/1 Sense Control&lt;br /&gt;
|-&lt;br /&gt;
!ISCx1!!ISCx0!!Verhalten&lt;br /&gt;
|-&lt;br /&gt;
|0||0|| Ein &#039;&#039;&#039;LOW-Pegel&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|0||1|| Ein &#039;&#039;&#039;Logik-Wechsel&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|1||0|| Eine &#039;&#039;&#039;fallende Flanke&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|1||1|| Ein &#039;&#039;&#039;steigende Flanke&#039;&#039;&#039; loest einen Interrupt aus.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
oder kurz&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!ISCx1!!ISCx0!! INTx reagiert auf ...&lt;br /&gt;
|-&lt;br /&gt;
|0||0|| 0-Pegel&lt;br /&gt;
|-&lt;br /&gt;
|0||1|| Pegelwechsel&lt;br /&gt;
|-&lt;br /&gt;
|1||0|| fallende Flanke&lt;br /&gt;
|-&lt;br /&gt;
|1||1|| steigende Flanke&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
===Anwendungsbeispiel===&lt;br /&gt;
Immer mal wieder habe ich gelesen, dass ein Taster am Interrupt eine schlechte Idee sei. Wegen Tastenprellen und so. Manche behaupten sogar es ginge gar nicht. Hier der Gegenbeweis. Funktioniert bei mir völlig zufriedenstellend. Hier benutze ich die ISR-Variante. Später werde ich weiter unten auch mal eine Gegenüberstellung mit der attachInterrupt-Variante ergänzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt; // fuer ISR Makro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const byte ledPin = 5;&lt;br /&gt;
volatile byte ledState = LOW;&lt;br /&gt;
byte lastledState;&lt;br /&gt;
&lt;br /&gt;
const byte interruptPin = 3;&lt;br /&gt;
&lt;br /&gt;
ISR (INT1_vect){&lt;br /&gt;
  EIFR|=(1&amp;lt;&amp;lt;INTF1); // Interrupt Flag zu Sicherheit schon mal loeschen&lt;br /&gt;
  EIMSK&amp;amp;=~(1&amp;lt;&amp;lt;INT1); // Interrupt abschalten&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup(){&lt;br /&gt;
  Serial.begin(115200); // vielleicht brauche ich es &lt;br /&gt;
&lt;br /&gt;
  pinMode(ledPin, OUTPUT);  // LED-Anschluss auf Ausgang&lt;br /&gt;
  digitalWrite(ledPin, LOW); // LED ausschalten&lt;br /&gt;
&lt;br /&gt;
  pinMode(interruptPin, INPUT); // dies ist nicht zwingend notwendig, der Interrupt funktioniert auch im Output-Mode&lt;br /&gt;
&lt;br /&gt;
  EICRA |= (1&amp;lt;&amp;lt;ISC11); // auf fallende Flanke reagieren (Der Taster tastet nach GND über einen Pullup-Widerstand.)&lt;br /&gt;
  EIMSK |= (1&amp;lt;&amp;lt;INT1); // INT1-Interrupt einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){ &lt;br /&gt;
  if (lastledState!=ledState){&lt;br /&gt;
    digitalWrite(ledPin, ledState);&lt;br /&gt;
    delay(200);  // entprellen&lt;br /&gt;
    EIFR|=(1&amp;lt;&amp;lt;INTF1); // Interruptflag (nochmal) loeschen&lt;br /&gt;
    EIMSK|=(1&amp;lt;&amp;lt;INT1);  // Interrupt wieder einschalten&lt;br /&gt;
    lastledState=ledState; // Veraenderung merken&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es sei hier bemerkt, dass innerhalb einer Interruptroutine (ISR) z.B. kein delay() und millis() funktioniert. Sobald man etwas nutzt was auch Interrupts benutzt ist der Ärger mit einprogrammiert. Am besten programmiert man nach dem Motto: &lt;br /&gt;
&lt;br /&gt;
 Nur das Notwendigste erledigen und direkt wieder raus, d.h. am besten nur Variablen setzen und keine Unterroutinen. &lt;br /&gt;
&lt;br /&gt;
Wenn ich zeitkritische Routinen geschrieben habe, bin ich auch schon mal auf Inline-Assembler ausgewichen, habe Taktzyklen der Opcodes gezählt und die Gesamtlaufzeit durch I/O-Pin-Trigger auf einem Oszi nachgemessen:-)&lt;br /&gt;
&lt;br /&gt;
==PCINT0-23==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Kernel_Panic&amp;diff=5221</id>
		<title>Kernel Panic</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Kernel_Panic&amp;diff=5221"/>
		<updated>2026-07-31T15:53:58Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Kernel Panic Failed to execute /init (error -2)==&lt;br /&gt;
Heute war es mal wieder soweit. Nach einem Kernelupdate (openSUSE Leap 15.2 12/2020) ist der Rechner nicht mehr hochgefahren und zeigte, folgte Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Kernel Panic Fehler.jpg |400px]]&lt;br /&gt;
&lt;br /&gt;
Da es ja Kernel Panic und nicht User Panic heißt, hier die Auflösung:&lt;br /&gt;
&lt;br /&gt;
===Schritt 1: CD/DVD Boot in das rescue System===&lt;br /&gt;
Geht natürlich auch mit jedem anderen Livesystem. Hauptsache man kann irgendwie auf die Boot-Festplatte zugreifen.&lt;br /&gt;
&lt;br /&gt;
===Schritt 2: root einloggen===&lt;br /&gt;
Bei openSUSE gibt es für &#039;root&#039; kein Passwort. Erst mal umschauen und die (Boot-)Partition der Boot-Festplatte finden. Das ist die Partition in der sich das Verzeichnis /boot befindet. In der Regel befindet sich dieses Verzeichnis im &#039;normalen&#039; root-Verzeichnis. Es besteht aber auch die Möglichkeit, dass /boot sich in einer eigenen Partition befindet. Der Grund soll hier einmal außen vor bleiben.&lt;br /&gt;
&lt;br /&gt;
===Schritt 3: mount Partition===&lt;br /&gt;
 lsblk&lt;br /&gt;
Als Ergebnis erhält man eine Übersicht aller Laufwerke, die z.Z. am System angeschlossen sind. Es empfiehlt sich zumindest alle USB-Laufwerke für die nachfolgenden Schritte abzuziehen. Wer ganz auf Nummer sicher gehen will sollte auch an alle internen Festplatten außer der Bootplatte den Stromstecker ziehen. Damit braucht man sich erst mal keine Gedanken darüber zu machen wie die Bootreihenfolge im BIOS oder Grub hinterlegt ist. Nicht dass man aus lauter Panic auf der falschen Festplatte arbeitet. &lt;br /&gt;
Bei meinen System liegt /boot im root-Verzeichnis der Hauptpartition (/dev/sda2). Für das Mounten kann man sich ein eigenes Verzeichnis (z.B. /hauptplatte ) anlegen oder einfach /mnt nehmen.&lt;br /&gt;
&lt;br /&gt;
 mount /dev/sda2 /mnt&lt;br /&gt;
&lt;br /&gt;
Nach dem Mount mit &lt;br /&gt;
&lt;br /&gt;
 cd /mnt&lt;br /&gt;
&lt;br /&gt;
ins Verzeichnis wechsel und sich  mit ll (ls -l) den Inhalt anzeigen lassen. Wenn der Mount erfolgreich war sieht man jetzt den Inhalt der Hauptpartition, also etwa sowas&lt;br /&gt;
&lt;br /&gt;
===Schritt 4: chroot===&lt;br /&gt;
Jetzt muss man das System &#039;austricksen&#039; und so tun als wäre das Verzeichnis unter /mnt das Hauptverzeichnis. Dies kann man mit dem Befehl &#039;chroot&#039; erreichen. Bevor man aber aber loslegt noch ein paar Orientierungshilfen. Mit dem Befehl &#039;cd /&#039; gelangt man ins Root-Verzeichnis. Nicht zu verwechseln  mit dem Heimatverzeichnis des Users &#039;root&#039; unter /root. Zur Kontrolle kann man mit&lt;br /&gt;
 cd /&lt;br /&gt;
 ll&lt;br /&gt;
sich nochmal das Hauptverzeichnis des Rescue/Live-System anschauen. Jetzt kommen noch ein paar Befehle der Vorbereitung von chroot.&lt;br /&gt;
 mount -t proc --bind /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
Manchmal findet man in anderen Anleitungen auch die mount-Option --bind anstatt --rbind. rbind hat aber den Vorteil das auch alle eventuellen Submounts gleich mit neu verbunden werden.&lt;br /&gt;
Archlinux spricht [https://wiki.archlinux.org/index.php/chroot#Using_arch-chroot hierzu] eine Warnung aus.&lt;br /&gt;
Die Angabe des Filesystem-Typs -t proc wird normal automatisch richtig erkannt und kann entfallen. Wenn man ein anderes Verzeichnis zum Mount der Bootplatte erstellt hat muss natürlich /mnt entsprechend angepasst werden.&lt;br /&gt;
Allgemein also&lt;br /&gt;
&lt;br /&gt;
 mount -t proc --bind /proc /&amp;lt;verzeichnis&amp;gt;/proc/&lt;br /&gt;
 mount --rbind /sys /&amp;lt;verzeichnis&amp;gt;/sys/&lt;br /&gt;
 mount --rbind /dev /&amp;lt;verzeichnis&amp;gt;/dev/&lt;br /&gt;
&lt;br /&gt;
Bei proc ist --bind scheinbar ausreichend. Die &#039;normale&#039; mount-Situation sieht so aus.&lt;br /&gt;
Jetzt sind die für den Kernel die wichtigen Arbeits-Verzeichnisse umgebogen und jetzt können wir mit &lt;br /&gt;
 chroot /mnt/&lt;br /&gt;
das ganze System so umstellen (&#039;&#039;&#039;ch&#039;&#039;&#039;ange &#039;&#039;&#039;root&#039;&#039;&#039; Verzeichnis), dass das neue Root-Verzeichnis bei /mnt/sda2 beginnt. Das kann man auch leicht überprüfen wenn man jetzt ein &#039;cd / &amp;amp;&amp;amp; ll&#039; macht sind man den Inhalt der Root-Verzeichnisses der Boot-Partition.&lt;br /&gt;
Das Rescuesystem ist jetzt &#039;unsichtbar&#039;.&lt;br /&gt;
===Schritt 5: mkinitrd===&lt;br /&gt;
Jetzt wechseln wir in das /boot-Verzeichnis. Dort findet man alle derzeit verfügbaren Kernels und deren Begleitdateien. Bei mir sieht man derzeit 4 verschiedene Kernels&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;ll /boot&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
worker:/boot # ll&lt;br /&gt;
total 183308&lt;br /&gt;
-rw-r--r-- 1 root root       65 Nov 11 18:46 .vmlinuz-5.3.18-lp152.50-default.hmac&lt;br /&gt;
-rw-r--r-- 1 root root       65 Nov 11 18:34 .vmlinuz-5.3.18-lp152.50-preempt.hmac&lt;br /&gt;
-rw-r--r-- 1 root root       65 Dec  5 09:58 .vmlinuz-5.3.18-lp152.57-default.hmac&lt;br /&gt;
-rw-r--r-- 1 root root       65 Dec  5 10:41 .vmlinuz-5.3.18-lp152.57-preempt.hmac&lt;br /&gt;
-rw-r--r-- 1 root root  4610647 Nov 11 17:53 System.map-5.3.18-lp152.50-default&lt;br /&gt;
-rw-r--r-- 1 root root  4612190 Nov 11 17:50 System.map-5.3.18-lp152.50-preempt&lt;br /&gt;
-rw-r--r-- 1 root root  4605295 Dec  5 09:12 System.map-5.3.18-lp152.57-default&lt;br /&gt;
-rw-r--r-- 1 root root  4606747 Dec  5 09:40 System.map-5.3.18-lp152.57-preempt&lt;br /&gt;
-rw-r--r-- 1 root root     1725 Aug 26 22:47 boot.readme&lt;br /&gt;
-rw-r--r-- 1 root root   228385 Nov 11 17:30 config-5.3.18-lp152.50-default&lt;br /&gt;
-rw-r--r-- 1 root root   228416 Nov 11 17:29 config-5.3.18-lp152.50-preempt&lt;br /&gt;
-rw-r--r-- 1 root root   228385 Dec  5 08:59 config-5.3.18-lp152.57-default&lt;br /&gt;
-rw-r--r-- 1 root root   228416 Dec  5 09:00 config-5.3.18-lp152.57-preempt&lt;br /&gt;
drwxr-xr-x 2 root root     4096 Nov 24 23:36 dracut&lt;br /&gt;
drwxr-xr-x 5 root root     4096 Jan  4 15:04 grub2&lt;br /&gt;
lrwxrwxrwx 1 root root       30 Dec 31 10:13 initrd -&amp;gt; initrd-5.3.18-lp152.57-default&lt;br /&gt;
-rw------- 1 root root  8767144 Nov 15 13:20 initrd-5.3.18-lp152.19-default&lt;br /&gt;
-rw------- 1 root root 12011868 Jul 16 22:11 initrd-5.3.18-lp152.26-default.bak&lt;br /&gt;
-rw------- 1 root root 12166716 Jan  4 14:55 initrd-5.3.18-lp152.50-default&lt;br /&gt;
-rw------- 1 root root 12165192 Jan  4 14:55 initrd-5.3.18-lp152.50-preempt&lt;br /&gt;
-rw------- 1 root root 12166528 Jan  4 14:55 initrd-5.3.18-lp152.57-default&lt;br /&gt;
-rw------- 1 root root 12165256 Jan  4 14:56 initrd-5.3.18-lp152.57-preempt&lt;br /&gt;
-rw-r--r-- 1 root root  1255444 Nov 11 17:56 symtypes-5.3.18-lp152.50-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root  1256334 Nov 11 17:53 symtypes-5.3.18-lp152.50-preempt.gz&lt;br /&gt;
-rw-r--r-- 1 root root  1255444 Dec  5 09:15 symtypes-5.3.18-lp152.57-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root  1256334 Dec  5 09:46 symtypes-5.3.18-lp152.57-preempt.gz&lt;br /&gt;
-rw-r--r-- 1 root root   432816 Nov 11 17:56 symvers-5.3.18-lp152.50-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root   433040 Nov 11 17:53 symvers-5.3.18-lp152.50-preempt.gz&lt;br /&gt;
-rw-r--r-- 1 root root   432948 Dec  5 09:14 symvers-5.3.18-lp152.57-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root   433173 Dec  5 09:45 symvers-5.3.18-lp152.57-preempt.gz&lt;br /&gt;
-rw-r--r-- 1 root root      484 Nov 11 17:56 sysctl.conf-5.3.18-lp152.50-default&lt;br /&gt;
-rw-r--r-- 1 root root      377 Nov 11 17:53 sysctl.conf-5.3.18-lp152.50-preempt&lt;br /&gt;
-rw-r--r-- 1 root root      484 Dec  5 09:14 sysctl.conf-5.3.18-lp152.57-default&lt;br /&gt;
-rw-r--r-- 1 root root      377 Dec  5 09:45 sysctl.conf-5.3.18-lp152.57-preempt&lt;br /&gt;
-rw-r--r-- 1 root root 13903220 Nov 11 18:00 vmlinux-5.3.18-lp152.50-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root 13997555 Nov 11 17:56 vmlinux-5.3.18-lp152.50-preempt.gz&lt;br /&gt;
-rw-r--r-- 1 root root 13883322 Dec  5 09:19 vmlinux-5.3.18-lp152.57-default.gz&lt;br /&gt;
-rw-r--r-- 1 root root 13977866 Dec  5 09:51 vmlinux-5.3.18-lp152.57-preempt.gz&lt;br /&gt;
lrwxrwxrwx 1 root root       31 Dec 31 10:13 vmlinuz -&amp;gt; vmlinuz-5.3.18-lp152.57-default&lt;br /&gt;
-rw-r--r-- 1 root root  9048240 Nov 11 18:46 vmlinuz-5.3.18-lp152.50-default&lt;br /&gt;
-rw-r--r-- 1 root root  9109680 Nov 11 18:34 vmlinuz-5.3.18-lp152.50-preempt&lt;br /&gt;
-rw-r--r-- 1 root root  9035952 Dec  5 09:58 vmlinuz-5.3.18-lp152.57-default&lt;br /&gt;
-rw-r--r-- 1 root root  9093296 Dec  5 10:41 vmlinuz-5.3.18-lp152.57-preempt&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich sind es nur 2 Kernels 5.3.18-lp152.50 vom 11. November und der neuere vom 5. Dezember, der jetzt die Probleme verursacht.&lt;br /&gt;
Die default und Preemp Variante unterscheiden sich nur in einer &#039;Kleinigkeit&#039;:&lt;br /&gt;
 The kernel for arm64 and x86_64 architectures that supports CONFIG_PREEMPT. Its main purpose is to serve workloads with a higher demand on smaller latencies than the default kernel in average.&lt;br /&gt;
&lt;br /&gt;
Jetzt kann man &#039;&#039;&#039;mkinitrd&#039;&#039;&#039; ausführen und damit die &#039;&#039;&#039;init&#039;&#039;&#039;iale &#039;&#039;&#039;R&#039;&#039;&#039;am&#039;&#039;&#039;D&#039;&#039;&#039;isk (initrd) neu anlegen (make). Allerdings kamen hier eine Unmenge an Fehlermeldungen.&lt;br /&gt;
Für das Erstellen der initrd greift mkinitrd auf das Programm dracut zurück. Die Fehlermeldungen hatten alle das gleiche Muster:&lt;br /&gt;
&lt;br /&gt;
 dracut-install: ERROR: failed to install &#039;/usr/bin/ldd:&#039; for &#039;/bin/sh&#039; for &#039;/usr/bin/udevadm&#039; &lt;br /&gt;
&lt;br /&gt;
Die Lösung lag in einer nicht vorhanden Verbindung zu bash. Der folgende Screenshot zeigt neben dem  Fehler auch gleich die Lösung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Kernel Panic Loesungsschritt ldd bash.jpg | 400px]]&lt;br /&gt;
&lt;br /&gt;
 bash liegt in /bin und lld sucht in /usr/bin&lt;br /&gt;
&lt;br /&gt;
Ein Softlink bringt die Lösung.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/bin &amp;amp;&amp;amp; ln -s /bin/bash bash&lt;br /&gt;
&lt;br /&gt;
mkinitrd lief danach ohne Fehlermeldung durch.&lt;br /&gt;
&lt;br /&gt;
===Schritt 6: reboot===&lt;br /&gt;
&lt;br /&gt;
Noch eine Kleinigkeit: Ein &#039;schutdown -r now&#039; in der chroot-Umgebung gelingt nicht, als erst chroot mit &#039;exit&#039; verlassen.&lt;br /&gt;
&lt;br /&gt;
Mission accomplished!&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
Ähnliches Problem, allerdings etwas komplexer da die Platte verschlüsselt war.[https://forums.opensuse.org/showthread.php/547270-SOLVED-kernel-panic-Failed-to-execute-init-no-working-init-found-after-update-encrypted-luks-lvm]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.archlinux.de/title/Chroot chroot]&lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Initrd initrd]&lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Dracut_(initramfs) dracut]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Ricoh_Aficio_SG2100N_CUPS&amp;diff=5220</id>
		<title>Ricoh Aficio SG2100N CUPS</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Ricoh_Aficio_SG2100N_CUPS&amp;diff=5220"/>
		<updated>2026-07-31T15:53:57Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeins=&lt;br /&gt;
Der Drucker ist ein Gel-Drucker. Das Schwarz das er druckt, scheint &amp;quot;blickdichter&amp;quot; als das Druckergebnis meines Laserdruckers oder Tintenspritzer.&lt;br /&gt;
Daher gebe ich im eine Chance als Drucker fuer meine &amp;quot;PCB-Folien&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=Treiberinstallation=&lt;br /&gt;
Unter [http://support.ricoh.com/bb/html/dr_ut_e/re1/model/sg2100n/sg2100n.htm?lang=de Windows 10 (64 bit)] war das Installieren problemlos. &lt;br /&gt;
&lt;br /&gt;
Fuer Cups war es schon etwas aufwendiger. Auf der Suche nach einem passenden Treiber wurde auf mehreren Seite darauf hingewiesen, dass der Drucker in Japan unter dem Namen SG2010L verkauft wird. Der Treiber sollte also auch laufen. Eine Version fuer Ubuntu 20.04LTS habe ich [http://support.ricoh.com/bbv2/html/dr_ut_d/ipsio/model/sg_2010l/sg_2010l.htm hier] gefunden. Die Datei mit dem Namen ipsiosg_4.5.1-0_amd64.deb habe ich heruntergeladen. Einige Seiten beschreiben einen Weg über die Installation des deb-Pakets und einem &amp;quot;Patch-Build&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Mein Weg war im Nachhinein recht simpel. Erst das .deb-File mit Ark entpacken. Das darin File data.tar.xz ebenfalls entpacken. Die Pfade /usr/share und /usr/lib/ stimmen (erstaunlicherweise) bei meiner OpenSuse 15.3 ueberein. Also einfach den Inhalt von data.tar.xz nach /usr/share bzw. lib kopieren.&lt;br /&gt;
&lt;br /&gt;
Die fuer die Installation des Drucker unter Cups notwendige .ppd-Datei befindet sich unter /usr/share/ppd/ricoh und ist für den SG2100N die Datei ri6162d3.ppd.gz.&lt;br /&gt;
&lt;br /&gt;
That&#039;s all. Happy Printing.  &lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=DJI_Osmo_Pocket&amp;diff=5219</id>
		<title>DJI Osmo Pocket</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=DJI_Osmo_Pocket&amp;diff=5219"/>
		<updated>2026-07-31T15:53:56Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier sammele ich alles was die Arbeit mit dem DJI Osmo Pocket für (mich) erleichtert.&lt;br /&gt;
&lt;br /&gt;
*[https://www.youtube.com/watch?v=APAQX-ZBE4o Grundlagen Einführung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheet==&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Schnittstellen==&lt;br /&gt;
===USB-C (Unterseite)===&lt;br /&gt;
&lt;br /&gt;
Die Kommunikationsmöglichkeiten des Ports sind vielfältig. Siehe dazu die [https://www.usb.org/sites/default/files/USB%20Type-C%20Spec%20R2.0%20-%20August%202019.pdf Spezifikation]. Ein weiteres sehr hilfreiches Dokument ist eine [https://cdn.sparkfun.com/assets/e/b/4/f/7/USB-C_Datasheet.pdf Annotation Note (AN 1953) von Microchip]. Danke dafür. Und wie so oft sind [https://www.heise.de/ct/artikel/USB-C-Der-Alleskoenner-3836662.html Artikel von heise] fuer mich ein Gewinn.&lt;br /&gt;
&lt;br /&gt;
Beim Verbinden mit einem PC wird die eingelegte Speicherkarte als Laufwerk (nach Bestätigung) durchgereicht.&lt;br /&gt;
Ein Zugriff mit dazwischengeschaltetem WLAN-Modul ist/scheint nicht moeglich.&lt;br /&gt;
&lt;br /&gt;
 lsusb -&amp;gt; ID 070a:4026 Oki Electric Industry Co., Ltd &lt;br /&gt;
&lt;br /&gt;
 lsscsi -&amp;gt; disk    DJI      Osmo Pocket      1000  /dev/sdg&lt;br /&gt;
&lt;br /&gt;
Ein Aergernis was einem in den Foren oft begegnet ist, dass ein externes Micro nicht gemeinsam mit dem WLAN-Modul betrieben werden kann.&lt;br /&gt;
&lt;br /&gt;
Sobald man eine WLAN-Verbindung mit dem OSMO herstellt, schaltet er sich aus und die LED blinkt (4kurz-Pause-Loop).&lt;br /&gt;
Beim zweiten mal hat der WLAN-Client eine Adresse (192.168.2.128/24) bezogen.&lt;br /&gt;
Der OSMO selbst hat die Adresse 192.168.12.1&lt;br /&gt;
&lt;br /&gt;
 Nmap scan report for 192.168.2.1&lt;br /&gt;
 Host is up (0.0029s latency).&lt;br /&gt;
 MAC Address: 60:60:1F:XX:XX:XX (SZ DJI Technology)&lt;br /&gt;
&lt;br /&gt;
==Reverse Engineering==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/fvantienen/dji_rev RevEngine-Linkliste]&lt;br /&gt;
&lt;br /&gt;
==Cosmostreamer==&lt;br /&gt;
&lt;br /&gt;
[https://cosmostreamer.com/products/pocketosmo/ Cosmostreamer Homepage]&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(FHEM)_KNX_Siemens_LOGO&amp;diff=5218</id>
		<title>(FHEM) KNX Siemens LOGO</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(FHEM)_KNX_Siemens_LOGO&amp;diff=5218"/>
		<updated>2026-07-31T15:53:55Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ausgangslage==&lt;br /&gt;
Im Heizungskeller habe ich u.a. eine (alte) nur von der Heizungssteuerung angesteuerte (an/aus) Heizungspumpe und eine neue Pumpengruppe für die Fußbodenheizung in 2 Räumen.&lt;br /&gt;
Ich konzentriere mich in diesem Artikel auf die Nutzung der Siemens LOGO (0BA5) zur Ansteuerung der beiden Pumpen. Die Integration in FHEM, die Aktor- und Sensor-Hardware und die Beschreibung der Gesamtheizungsanlage folgen in eigenen Artikeln.&lt;br /&gt;
&lt;br /&gt;
==Siemens LOGO!==&lt;br /&gt;
Die LOGO! ist eine Hassliebe. Ich hatte sie mir mal vor Jahren (daher noch eine 0BA5) für das Selbststudium angeschafft und jetzt sollte sie nutzbringend als Pumpenansteuerung Einsatz finden.&lt;br /&gt;
===Fakten LOGO!===&lt;br /&gt;
Sie hat am Basismodul (24V-Variante) 8 digitale, davon 2 analog nutzbare, Eingänge und 4 Relaisausgänge. Das Programmierkabel ist noch mit einer seriellen Schnittstelle (RS232) ausgestattet. Die zur Programmierung notwendige Software LOGO!Soft Comfort V5 ist noch aus der WinXP-Ära. &lt;br /&gt;
Um meine Anbindung sinnvoll zu realisieren habe ich noch eine EIB/KNX-Modul und ein analoges Ausgangsmodul aufgesteckt.&lt;br /&gt;
&lt;br /&gt;
===Fakten Heizung===&lt;br /&gt;
&lt;br /&gt;
Sensorik&lt;br /&gt;
&lt;br /&gt;
* Hin-/Rücklauf Hauptheizkreis (2 Temperaturmessungen) &lt;br /&gt;
* Hin-/Rücklauf Fußbodenheizung (2 Temperaturmessungen)&lt;br /&gt;
* Option &amp;quot;physikalischer&amp;quot; Sollwertsteller (Auf/Ab 2 Eingänge) für Vorlauf-Temperatur der Fußbodenheizung&lt;br /&gt;
* Option &amp;quot;physikalische&amp;quot; Anbindung der Pumpenanforderung (1 Eingang) der Heizungssteuerung &lt;br /&gt;
 &lt;br /&gt;
Aktorik &lt;br /&gt;
&lt;br /&gt;
* Pumpe Hauptheizkreis (1 Ausgang)&lt;br /&gt;
* Pumpe Fußbodenheizung (1 Ausgang)&lt;br /&gt;
* 3-Wegenventil (Temperatureinstellung Vorlauf Fußbodenheizung über Rücklauf-Bypass) (2 Ausgänge)&lt;br /&gt;
* Spannungsversorgung EIB/KNX-Ventile der Fußbodenheizung (1 Ausgang)&lt;br /&gt;
&lt;br /&gt;
Wenn man das jetzt zusammenzählt, benötige ich:&lt;br /&gt;
&lt;br /&gt;
* 4 Temperaturmesseingänge (Zonk!)&lt;br /&gt;
* 3 Digitale Eingänge&lt;br /&gt;
* 5 Schaltausgänge 230V (Zonk! zum Zweiten)&lt;br /&gt;
&lt;br /&gt;
===Workaround 1===&lt;br /&gt;
&lt;br /&gt;
Die alte Heizungspumpe versehe ich dann gerade auch mal mit einer Leistungsansteuerung. Die Leistungsansteuerung (Selbstbau) verfügt am Eingang über eine 0-10V (entspricht 0-100%) Schnittstelle und am Ausgang über ein Wellenpaketsteuerung. Somit kann ich die Hauptheizkreispumpe analog ansteuern und die restelichen 4 Schaltausgänge reichen dann für die Ansteuerung der Pumpengruppe (Fußbodenheizung)&lt;br /&gt;
&lt;br /&gt;
===Workaround 2===&lt;br /&gt;
&lt;br /&gt;
Die LOGO! hat in der 0BA5-Ausführung nur zwei analoge Eingänge (I7 und I8). Und jetzt!&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
Noch ein analoges Eingangsmodul kaufen. Abgesehen von Tatsache, dass dann die Hutschiene nicht mehr breit (Spannungsversorgung, LOGO, KNX, ANALOG OUT + ANALOG IN) genug ist, habe ich das Problemchen durch Verlegung der Spannungsversorgung in die zweite Reihe gelöst, aber auch die damit verbunden Kosten, knapp 100 Euro für 2 PT100/1000, sind mir dann doch zu viel. Gebraucht zu suchen hatte ich keine Lust, also habe ich diesen Weg erst mal aufgegeben.&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
Ein Mikrocontroller (ATMEL/PIC) für die Temperaturmessung einsetzen und die Daten &amp;quot;aufbereitet&amp;quot; an die LOGO! übergeben. Ab wie bekommt an die Daten in die Steuerung. Ein Weg wäre die Analogwerte über mehrere EIB-Objekte bereitzustellen. Der andere Weg wäre eine Art Multiplexing für die beiden analogen Eingänge. Das setzt aber voraus, dass ich die beiden analogen Eingangswerte von I7 und I8 auf 4 (oder mehr) speicherbare Analogwerte in der LOGO übertragen kann. Ich habe beiden Wege realisiert und setze sie kombiniert ein. &lt;br /&gt;
Siehe dazu den Artikel mehrere analoge Werte mit der LOGO! verarbeiten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===LOGO Programm V0.9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf  width=&amp;quot;1000&amp;quot; &amp;gt;File:LOGO!Soft_Comfort_-_Heizung.pdf&amp;lt;/pdf&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_Consolenanschlusskabel&amp;diff=5217</id>
		<title>(Pylontech) Consolenanschlusskabel</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(Pylontech)_Consolenanschlusskabel&amp;diff=5217"/>
		<updated>2026-07-31T15:53:54Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Um die Batterie-Informationen direkt, ohne Umweg auslesen zu koennen, nutze ich den Consolen-Port der US[2,3,5]000(C).&lt;br /&gt;
&lt;br /&gt;
Dummerweise wurde der Anschluss vom US2000 zum US3000 von RJ-14 (oft falsch RJ-11) auf RJ-45 gewechselt. &lt;br /&gt;
Haengt die US2000 im Verbund mit einem US3000/US5000 kann man auf das RJ-14-Kabel verzichten, da die Konsolen-Kommunkation ueber den Master laeuft.&lt;br /&gt;
Nur wenn man eine US2000 alleine direkt auslesen will, benoetigt man ein weiteres Kabel.&lt;br /&gt;
&lt;br /&gt;
Oft werden bei einem RS232-Verbindungskabel, die Kabel mit TXD und RXD beschriftet. Das ist irrefuehrend, da die Anschluesse bei DDE und DÜE ueber Kreuz angeschlossen werden.&lt;br /&gt;
Aus RXD/TXD-DDE wird dan TXD/RXD-DÜE.&lt;br /&gt;
&lt;br /&gt;
Es wird auch oft so getan, als koennte man die Anschluesse von DÜE und DDE einfach so miteinander verbinden. Dem ist nicht so! Die Spannungspegel der RS232-Schnittstelle liegen bei bis zu +-15V!!!&lt;br /&gt;
&lt;br /&gt;
Folgende Zuordnung erklaert warum, es doch funktionieren kann.  &lt;br /&gt;
&lt;br /&gt;
*Logisch 0 -&amp;gt; Space -&amp;gt; zwischen +3 V und +15 V&lt;br /&gt;
*Logisch 1 -&amp;gt; Mark -&amp;gt; zwischen -3 V und -15 V&lt;br /&gt;
&lt;br /&gt;
Solange, die Pegel von DDE und DÜE auf einander abgestimmt und/oder tolerant sind funktioniert es in der Regel.&lt;br /&gt;
Bei 3,3 V kann aber ein zu langes Kabel schon fuer Probleme sorgen.&lt;br /&gt;
&lt;br /&gt;
=Pinout RJ-14 (US2000, ... alle nicht C-Varianten)=&lt;br /&gt;
&lt;br /&gt;
Der ConsolePort ist eine RJ-14 (6P4C) (oft falsch als RJ-11 (6P2C) angegeben)  Port mit RS232-Protokoll. Der ConsolePort des US3000C ist eine R-J45 (8P8C) Port.&lt;br /&gt;
Zu achten ist bei den Bezeichnungen RXD und TXD auf die Seite des Anschlusses. Beim Anschluss der RS232-Kommunikation-Partner werden RXD und TXD ueber Kreuz angeschlossen, was zu einem Verstauchen der Anschlussbezeichnungen fuehrt. RXD und TXD bei einem Kabel nur einmal anzugeben ist mehr als irrefuehrend. Vielmehr muss es auf jeder Stecker-/Buchsenseite angegeben werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Pinbelegung RJ-14 (RJ-11)&lt;br /&gt;
|-&lt;br /&gt;
|Pin RJ-14||Pin RJ-11||RS232 Protokoll||Belegung&lt;br /&gt;
|-&lt;br /&gt;
|1||NC||-||rowspan=&amp;quot;5&amp;quot;|[[Datei:RJ12 6P6C.png|150px]]&lt;br /&gt;
|-&lt;br /&gt;
|2||1||GND&lt;br /&gt;
|-&lt;br /&gt;
|3||2||RXD&lt;br /&gt;
|-&lt;br /&gt;
|4||3||TXD&lt;br /&gt;
|-&lt;br /&gt;
|5||4||GND&lt;br /&gt;
|-&lt;br /&gt;
|6||NC||-||Stecker von vorne&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Pinout RJ-45 (US3000C, ... alle C-Varianten)=&lt;br /&gt;
&lt;br /&gt;
Der ConsolePort ist eine RJ-14 (6P4C) (oft falsch als RJ-11 (6P2C) angegeben)  Port mit RS232-Protokoll. Der ConsolePort des US3000C ist eine R-J45 (8P8C) Port.&lt;br /&gt;
Zu achten ist bei den Bezeichnungen RXD und TXD auf die Seite des Anschlusses. Beim Anschluss der RS232-Kommunikation-Partner werden RXD und TXD ueber Kreuz angeschlossen, was zu einem Verstauchen der Anschlussbezeichnungen fuehrt. RXD und TXD bei einem Kabel nur einmal anzugeben ist mehr als irrefuehrend. Vielmehr muss es auf jeder Stecker-/Buchsenseite angegeben werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Pinbelegung RJ-14 (RJ-11)&lt;br /&gt;
|-&lt;br /&gt;
|Pin RJ-45||RS232 Protokoll||Belegung&lt;br /&gt;
|-&lt;br /&gt;
|1||-||rowspan=&amp;quot;7&amp;quot;|[[Datei:RJ45 8P8C.png|200px]]&lt;br /&gt;
|-&lt;br /&gt;
|2||-&lt;br /&gt;
|-&lt;br /&gt;
|3||TXD&lt;br /&gt;
|-&lt;br /&gt;
|4||+5 V bis +12 V fuer WakeUp&lt;br /&gt;
|-&lt;br /&gt;
|5||GND fuer WakeUp&lt;br /&gt;
|-&lt;br /&gt;
|6||RXD&lt;br /&gt;
|-&lt;br /&gt;
|7||-&lt;br /&gt;
|-&lt;br /&gt;
|8||GND||Stecker von vorne&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Das WakeUpSignal (Spannungspegel) soll &amp;gt;= 0,5 Sekunden anliegen und nach dem Starten dauerhaft &amp;quot;Aus&amp;quot; sein. Der (notwendige) Strom liegt szwischen 5 und 15 mA.&lt;br /&gt;
&lt;br /&gt;
=Pinout RS232=&lt;br /&gt;
&lt;br /&gt;
[[Datei:RS232 Pinout PC.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In der Regel werden nur RXD,TXD und GND benutzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Verbindungskabel=&lt;br /&gt;
&lt;br /&gt;
Aus einem alten Cisco-Kabel.&lt;br /&gt;
&lt;br /&gt;
[[Datei:CiscoConsolenKabelRJ45.jpg|200px|CiscoConsolenKabelRJ45]]&lt;br /&gt;
&lt;br /&gt;
Verdrahtung&lt;br /&gt;
&lt;br /&gt;
[[Datei:Pylontech US3000C DSUB RJ45.png|210px|Pylontech US3000C DSUB RJ45]] [[Datei:Pylontech US2000BPL DSUB RJ14.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Und nachdem die Verkabelung klappt, geht&#039;s mit der [[(Pylontech) Consolen-Kommunikation]]Kontaktaufnahme weiter.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=(FHEM)_00_MQTT.pm&amp;diff=5216</id>
		<title>(FHEM) 00 MQTT.pm</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=(FHEM)_00_MQTT.pm&amp;diff=5216"/>
		<updated>2026-07-31T15:53:53Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=00_MQTT.pm=&lt;br /&gt;
[[(FHEM) MQTT#Module im Detail| Zurueck Uebersicht]]&lt;br /&gt;
&lt;br /&gt;
 Ein einzelnes MQTT-Gerät kann mehrere MQTT_DEVICE, MQTT_GENERIC_BRIDGE Clients und (veraltete) MQTT_BRIDGE Clients bedienen.  Jedes MQTT_DEVICE fungiert als Brücke zwischen einem Fhem-Gerät und mqtt. &lt;br /&gt;
 Hinweis: Dieses Modul basiert auf Net::MQTT, das zuerst von CPAN installiert werden muss.&lt;br /&gt;
&lt;br /&gt;
 Das Modul MQTT fungiert als Verbindung zwischen FHEM und einem MQTT Broker (Server) und repräsentiert ein MQTT Gateway. Die durch die Module MQTT_DEVICE oder (veraltet!) MQTT_BRIDGE (In neuen Installationen soll das Modul MQTT_GENERIC_BRIDGE bevorzugt werden.) repräsentierten Client-Geräte sind gesondert anzulegen. &lt;br /&gt;
&lt;br /&gt;
Nebenbemerkung: Genau wie in der Netzwerktechnik gehen scheinbar hier die Begriffe Gateway und Bridge munter durcheinander. Ein Gateway liegt im ISO/OSI und im TCP/IP auf verschiedenen Schichten!&lt;br /&gt;
Weiterhin scheint es mit diesem Modul Probleme zu geben wenn der Broker nicht auf dem gleichen Server liegt, also die ip nicht localhost oder 127.0.0.1 ist. Aber selbst da gibt es Probleme.&lt;br /&gt;
Solange ich keine triftigen Grund kenne werde ich auf den Einsatz dieses Moduls verzichten.&lt;br /&gt;
&lt;br /&gt;
 Es muss für jedes MQTT-Gateway ein Server (Broker) eingerichtet und erreichbar sein. &lt;br /&gt;
&lt;br /&gt;
Wenn also von einem MQTT-Gateway die Rede ist, ist damit ein FHEM-Device vom Typ MQTT (Modul 00_MQTT.pm)gemeint. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Define&#039;&#039;&#039;&lt;br /&gt;
 define &amp;lt;name&amp;gt; MQTT &amp;lt;ip:port&amp;gt; [&amp;lt;username&amp;gt;] [&amp;lt;password&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set&#039;&#039;&#039;&lt;br /&gt;
 set &amp;lt;name&amp;gt; connect&lt;br /&gt;
 set &amp;lt;name&amp;gt; disconnect&lt;br /&gt;
 set &amp;lt;name&amp;gt; publish [qos:?] [retain:?] &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Get&#039;&#039;&#039;&lt;br /&gt;
 version (steht nur im Programmcode, tauscht sonst nirgends auf)&lt;br /&gt;
&#039;&#039;&#039;Readings&#039;&#039;&#039;&lt;br /&gt;
  &amp;amp;nbsp;&lt;br /&gt;
&#039;&#039;&#039;Attributes&#039;&#039;&#039;&lt;br /&gt;
 keep-alive&lt;br /&gt;
 attr &amp;lt;name&amp;gt; last-will [qos:?] [retain:?] &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt;&lt;br /&gt;
 attr &amp;lt;name&amp;gt; client-id client id&lt;br /&gt;
 on-connect&lt;br /&gt;
 on-disconnect&lt;br /&gt;
 on-timeout&lt;br /&gt;
 privacy 0|1&lt;br /&gt;
&lt;br /&gt;
=Erlaeuterungen=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Hindernisse/Hinweise==&lt;br /&gt;
==#1==&lt;br /&gt;
 Clients: MQTT_DEVICE und MQTT_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
 Abhaengigkeiten: DevIo.pm&lt;br /&gt;
&lt;br /&gt;
Wenn eine &#039;Cannot load module MQTT&#039; erscheint fhelt wohl das &#039;Net::MQTT&#039;&lt;br /&gt;
&lt;br /&gt;
 cpan install Net::MQTT &lt;br /&gt;
 &lt;br /&gt;
 FHEM#&amp;gt;restart&lt;br /&gt;
&lt;br /&gt;
Fehlermeldung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2022.08.07 20:02:53.913 1: reload: Error:Modul 00_MQTT deactivated:&lt;br /&gt;
 Can&#039;t locate Net/MQTT/Constants.pm in @INC (you may need to install the Net::MQTT::Constants module) (@INC contains: ./lib ./FHEM . /usr/lib/perl5/site_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.26.1 /usr/lib/perl5/vendor_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.26.1 /usr/lib/perl5/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/5.26.1 /usr/lib/perl5/site_perl ./FHEM/lib) at ./FHEM/00_MQTT.pm line 42.&lt;br /&gt;
BEGIN failed--compilation aborted at ./FHEM/00_MQTT.pm line 42.&lt;br /&gt;
&lt;br /&gt;
2022.08.07 20:02:53.913 0: Can&#039;t locate Net/MQTT/Constants.pm in @INC (you may need to install the Net::MQTT::Constants module) (@INC contains: ./lib ./FHEM . /usr/lib/perl5/site_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.26.1 /usr/lib/perl5/vendor_perl/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.26.1 /usr/lib/perl5/5.26.1/x86_64-linux-thread-multi /usr/lib/perl5/5.26.1 /usr/lib/perl5/site_perl ./FHEM/lib) at ./FHEM/00_MQTT.pm line 42.&lt;br /&gt;
BEGIN failed--compilation aborted at ./FHEM/00_MQTT.pm line 42.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loesung:&lt;br /&gt;
Leider habe ich noch keinen Hinweis dazu erhalten welche der 3 Net::MQTT Libraries die richtige ist.&lt;br /&gt;
&lt;br /&gt;
 cpan[5]&amp;gt; i /Net-MQTT/&lt;br /&gt;
 Distribution    BEANZ/Net-MQTT-1.163170.tar.gz&lt;br /&gt;
 Distribution    JUERD/Net-MQTT-Simple-1.26.tar.gz&lt;br /&gt;
 Distribution    KRENZKE/Net-MQTT-Simple-Auth-0.002.tar.gz&lt;br /&gt;
 3 items found&lt;br /&gt;
&lt;br /&gt;
 cpan[6]&amp;gt; install BEANZ/Net-MQTT-1.163170.tar.gz&lt;br /&gt;
&lt;br /&gt;
Nach dem Installieren war die Definition des Beispiels (s. u.) erfolgreich.&lt;br /&gt;
&lt;br /&gt;
 Das MQTT-modul macht nach einem Reconnect einen Retransmit aller noch nicht bestätigten (acknowledged bzw. completet) Messages.&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
&lt;br /&gt;
[[Datei:Define MQTT.png|mini]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Define MQTT Attribute.png|mini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 define 00_MQTT_Test MQTT&lt;br /&gt;
&lt;br /&gt;
Erstmal kam eine Fehlermeldung. Loesung siehe oben. &lt;br /&gt;
&lt;br /&gt;
Beim zweiten Anlauf war die Definition erfolgreich, obwohl hier der notwendige Parameter der IP des MQTT-Server (Broker) weggelassen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die &#039;Raw definition&#039; sieht so aus:&lt;br /&gt;
&lt;br /&gt;
 defmod 00_MQTT_Test MQTT&lt;br /&gt;
&lt;br /&gt;
 setstate 00_MQTT_Test disconnected&lt;br /&gt;
 setstate 00_MQTT_Test 2022-08-07 21:08:16 state disconnected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Etwas deutlicher im FHEM-Wiki:&lt;br /&gt;
&lt;br /&gt;
 define meinMQTTGW MQTT &amp;lt;Broker-IP&amp;gt;[:&amp;lt;Broker-Port&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Allerdings fehlt hier der Hinweis auf die optionalen Parameter &amp;lt;username&amp;gt; und &amp;lt;password&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warum man bei der Broker-IP 127.0.0.1 den Vorzug vor localhost geben soll, wenn der MQTT-Server auf dem gleichen Rechner laeuft, erschlieszt sich mir nicht.&lt;br /&gt;
&lt;br /&gt;
 define 00_MQTT_test MQTT 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2022.08.07 22:54:15.008 3: Opening 00_MQTT_Test device 127.0.0.1&lt;br /&gt;
2022.08.07 22:54:15.008 1: 00_MQTT_Test: Can&#039;t open 127.0.0.1: No such file or directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 defmod 00_MQTT_Test MQTT localhost:1883&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2022.08.07 23:02:18.153 3: Opening 00_MQTT_Test device localhost:1883&lt;br /&gt;
2022.08.07 23:02:18.157 3: 00_MQTT_Test device opened&lt;br /&gt;
2022.08.07 23:03:18.633 3: Opening 00_MQTT_Test device 127.0.0.1:1883&lt;br /&gt;
2022.08.07 23:03:18.637 3: 00_MQTT_Test device opened&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Warnung von oben hat sich bestaetigt. Wenn man in DEF zwischen localhost und 127.0.0.1 wechselt und mit &#039;set disconnect&#039; und &#039;set connect&#039; den STATE beobachtet, ergibt sich folgende Meldung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2022.08.07 23:05:42.513 1: 127.0.0.1:1883 disconnected, waiting to reappear (00_MQTT_Test)&lt;br /&gt;
2022.08.07 23:05:45.503 1: 127.0.0.1:1883 reappeared (00_MQTT_Test)&lt;br /&gt;
2022.08.07 23:05:45.516 1: 127.0.0.1:1883 disconnected, waiting to reappear (00_MQTT_Test)&lt;br /&gt;
2022.08.07 23:05:46.003 1: localhost:1883 reappeared (00_MQTT_Test)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit &#039;set &amp;lt;name&amp;gt; publish [qos:?] [retain:?] &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt;&#039; kann man Messages absetzen.&lt;br /&gt;
qos meint Quality of Service und retain meint das die Nachricht aufbewahrt werden soll.&lt;br /&gt;
qos kann die Werte [0,1,2] annehmen. QOS ist im Publish Fixed Header in 2 Bit codiert. Eine vierte Stufe (3) ist denkbar aber im MQTT-Standard nicht implementiert. Das Retain ist ein 1-Bit Flag im Header.&lt;br /&gt;
Um eine Nachricht die mit retain:1 verschickt wurde wieder zu loeschen ist eine Nachricht wieder mit retain:1, dem gleiche Topic und dem NULL_String zu senden.&lt;br /&gt;
&lt;br /&gt;
 set &amp;lt;MQTT&amp;gt; publish retain:1 &amp;lt;topic&amp;gt; &amp;lt;&amp;quot;&amp;quot; oder &#039;&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
Die Attribute kann man in 3 Gruppen teilen.&lt;br /&gt;
&lt;br /&gt;
===Gruppe 1: MQTT spezifisch===&lt;br /&gt;
 keep-alive [[MQTT#Ping Request/Response|siehe meine Erlaeuterung dazu]]&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; last-will [qos:?] [retain:?] &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt; [[MQTT#Last Will|siehe meine Erlaeuterung dazu]]&lt;br /&gt;
&lt;br /&gt;
Ich habe grosze Zweifel, dass hier die beiden Attribute richtig implementiert sind. Stellt man zum Beispiel keep-alive auf 1 (Sekunde) dann wird der Client auf dem Server nicht nach 1 Sekunde disconnectet, sondern der das connection-reading laeuft im Sekundentakt. ???&lt;br /&gt;
&lt;br /&gt;
===Gruppe 2: Verhalten des FHEM-DEVICES===&lt;br /&gt;
 attr &amp;lt;name&amp;gt; &#039;&#039;&#039;client-id&#039;&#039;&#039; client id&lt;br /&gt;
&lt;br /&gt;
Mit diesem Attribut kan die Client ID mit der sich das FHEM-DEVICE am MQTT-Server anmeldet geaendert werden. Wenn das Attribut nicht gesetzt ist, wird die FUUID als Client ID genommen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1659906662: New connection from 127.0.0.1:39670 on port 1883.&lt;br /&gt;
1659906662: New client connected from 127.0.0.1:39670 as 62f02811-f33f-7372-6a3f-c658ba3431097541 (p1, c1, k60).&lt;br /&gt;
1659906854: Client 62f02811-f33f-7372-6a3f-c658ba3431097541 disconnected.&lt;br /&gt;
1659906854: New connection from 127.0.0.1:39722 on port 1883.&lt;br /&gt;
1659906854: New client connected from 127.0.0.1:39722 as clientid (p1, c1, k60).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; &#039;&#039;&#039;on-connect&#039;&#039;&#039; {Perl-expression} &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; &#039;&#039;&#039;on-disconnect&#039;&#039;&#039; {Perl-expression} &amp;lt;topic&amp;gt; &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 attr &amp;lt;name&amp;gt; &#039;&#039;&#039;on-timeout&#039;&#039;&#039; {Perl-expression} &lt;br /&gt;
&lt;br /&gt;
Im Prinzip sind alle drei Attribute gleich. Bei &#039;on-connect&#039; und &#039;on-disconnect&#039; wird eine Nachricht (&amp;lt;message&amp;gt;) an den angegebenen Topic gesendet. Die Perl-expression darf hier weggelassen werden. Bei diesen beiden Attributen ist dieser Publish sozusagen das &amp;quot;Gegenteil&amp;quot; des [[#Last Will|Last Will]] Wird die Perl-expression uebergeben wird diese nach einem connect oder disconnect zuerst ausgewertet und die Nachricht erst im Falle eines (Rueckgabe-)wertes von true, 1 oder undef, gesendet. Die folgenden Variablen werden bei der Auswertung an den Ausdruck übergeben: $hash, $name, $qos, $retain, $topic, $message.&lt;br /&gt;
&lt;br /&gt;
Bei &#039;on-timeout&#039; die Perl-expression wegzulassen ist dagegen sinnlos. Welcher timeout hier gemeint sein koennte muss ich noch herausfinden.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
attr mqtt on-connect /topic/status connected&lt;br /&gt;
attr mqtt on-connect {Log3(&amp;quot;abc&amp;quot;,1,&amp;quot;on-connect&amp;quot;)} /fhem/status connected&lt;br /&gt;
&lt;br /&gt;
Ein sinnvoller Einsatz der Perl-Expression ist mir noch nicht eingefallen.&lt;br /&gt;
&lt;br /&gt;
===Gruppe 3: Bedeutung TODO===&lt;br /&gt;
 privacy 0|1&lt;br /&gt;
&lt;br /&gt;
=Anwendungen=&lt;br /&gt;
Eine sinnvolle Anwendung habe ich noch keine. Nach dem Anlegen des Devices kann man Nachrichten mit set verschicken. Ich habe bisher diesen Devicetyp nur zum Testen benutzt.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Ubiquiti_UniFi_Security_Gateway_(USG-3P)_WLAN_Isolate_VLAN&amp;diff=5215</id>
		<title>Ubiquiti UniFi Security Gateway (USG-3P) WLAN Isolate VLAN</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Ubiquiti_UniFi_Security_Gateway_(USG-3P)_WLAN_Isolate_VLAN&amp;diff=5215"/>
		<updated>2026-07-31T15:53:52Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Eigentlich war ich davon ausgegangen, dass durch dieses Haekchen WLAN-Clients in verschiedenen Subnetzen nur untereinander im eigenen Subnetz kommunizieren koennen. Dem ist aber nicht so, da der USG-3P mittlerweile als veraltet gilt. Er wird zwar noch fast komplett im Unifi Network 10.1.85 (Dazu muss ich auch noch einen neuen Beitrag machen.) aber die Firewallregel im Network werden nicht im System hinterlegt. Dadurch ist das Haekchen &amp;quot;Isolate&amp;quot; zeigt KEINE Wirkung.&lt;br /&gt;
&lt;br /&gt;
[[File:UnifiNetwork_Isolate.png|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Isolate Network&amp;quot; verhaelt sich beim USG-3P leider nicht (immer) so, wie der Name vermuten laesst.&lt;br /&gt;
&lt;br /&gt;
Je nach Controller-Version (insbesondere die neueren 9.x/10.x mit einem aelteren USG) gilt:&lt;br /&gt;
&lt;br /&gt;
 Network Isolation verhindert primaer den Zugriff von anderen Netzwerken auf dieses Netzwerk bzw. setzt passende Firewall-Regeln.&lt;br /&gt;
Es ersetzt keine vollstaendige Inter-VLAN-Firewall in jeder Konstellation.&lt;br /&gt;
Da der USG ein aelteres Produkt ist und die aktuelle UniFi-Oberflaeche auf neuere Gateways (UXG, UDM, UCG) ausgelegt ist, werden manche Optionen nicht identisch umgesetzt.&lt;br /&gt;
&lt;br /&gt;
==Vermutung==&lt;br /&gt;
Ich vermute, dass die GUI zwar &amp;quot;Isolate Network&amp;quot; anzeigt, der Controller diese Einstellung aber auf dem USG nicht oder nicht vollstaendig in Firewall-Regeln umsetzt. Das ist bei aelteren USG-Modellen ein bekanntes Verhalten, da neue Controllerfunktionen nicht immer vollstaendig von der alten USG-Firmware unterstuetzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Option &amp;quot;Isolate Network&amp;quot; ist in Network 10.x zwar vorhanden, die vollstaendige automatische Umsetzung ist aber in erster Linie fuer die neueren UniFi-Gateways (UXG, UCG, UDM usw.) vorgesehen. Auf aelteren USG-Geraeten werden neue Funktionen teilweise nicht oder nicht vollstaendig unterstuetzt. Das wird auch von Anwendern mit USG-3P berichtet. [https://www.reddit.com/r/Ubiquiti/comments/1qz51mt/how_to_check_if_usg3p_is_still_supported_in]&lt;br /&gt;
&lt;br /&gt;
=Firewall-Status=&lt;br /&gt;
Um die aktuellen Firewallregel im USG-3P zu sehen muss man sich mit ssh auf dem Geraet anmelden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Welcome to EdgeOS&lt;br /&gt;
&lt;br /&gt;
By logging in, accessing, or using the Ubiquiti product, you&lt;br /&gt;
acknowledge that you have read and understood the Ubiquiti&lt;br /&gt;
License Agreement (available in the Web UI at, by default,&lt;br /&gt;
http://192.168.1.1) and agree to be bound by its terms.&lt;br /&gt;
&lt;br /&gt;
Tibb@192.168.178.1&#039;s password: &lt;br /&gt;
Linux USG-3P 3.10.107-UBNT #1 SMP Thu Jan 12 08:28:15 UTC 2023 mips64&lt;br /&gt;
&lt;br /&gt;
  ___ ___      .__________.__&lt;br /&gt;
 |   |   |____ |__\_  ____/__|&lt;br /&gt;
 |   |   /    \|  ||  __) |  |   (c) 2010-2023&lt;br /&gt;
 |   |  |   |  \  ||  \   |  |   Ubiquiti, Inc.&lt;br /&gt;
 |______|___|  /__||__/   |__|&lt;br /&gt;
            |_/                  https://www.ui.com&lt;br /&gt;
&lt;br /&gt;
      Welcome to EdgeOS on UniFi Security Gateway!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ********************************* NOTICE **********************************&lt;br /&gt;
 * By logging in to, accessing, or using any Ubiquiti product, you are     *&lt;br /&gt;
 * signifying that you have read our Terms of Service (ToS) and End User   *&lt;br /&gt;
 * License Agreement (EULA), understand their terms, and agree to be       *&lt;br /&gt;
 * fully bound to them. The use of CLI (Command Line Interface) can        *&lt;br /&gt;
 * potentially harm Ubiquiti devices and result in lost access to them and *&lt;br /&gt;
 * their data. By proceeding, you acknowledge that the use of CLI to       *&lt;br /&gt;
 * modify device(s) outside of their normal operational scope, or in any   *&lt;br /&gt;
 * manner inconsistent with the ToS or EULA, will permanently and          *&lt;br /&gt;
 * irrevocably void any applicable warranty.                               *&lt;br /&gt;
 ***************************************************************************&lt;br /&gt;
&lt;br /&gt;
      **********************  WARNING!  ******************************&lt;br /&gt;
      *      Configuration changes made here are not persistent.     *&lt;br /&gt;
      *  They will be overwritten by the UniFi Network Application   *&lt;br /&gt;
      *       instance managing this device on next provision.       *&lt;br /&gt;
      *                                                              *&lt;br /&gt;
      *   Configuration MUST BE DONE in UniFi Network Application.   *&lt;br /&gt;
      ****************************************************************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Firewallregeln sieht man dann mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Tibb@USG-3P:~$ show firewall&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;AUTHORIZED_GUESTS&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Inactive - Not applied to any interfaces, zones or for content-inspection.&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 drop     all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;GUEST_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   tcp_udp   0        0                                       &lt;br /&gt;
  condition - tcp dpt:domain                                                    &lt;br /&gt;
&lt;br /&gt;
3002  accept   tcp       0        0                                       &lt;br /&gt;
  condition - tcp dpt:https match-set captive_portal_subnets dst                &lt;br /&gt;
&lt;br /&gt;
3003  accept   all       0        0                                       &lt;br /&gt;
  condition - match-set guest_pre_allow dst                                     &lt;br /&gt;
&lt;br /&gt;
3004  drop     all       81       4932                                    &lt;br /&gt;
  condition - match-set guest_restricted dst                                    &lt;br /&gt;
&lt;br /&gt;
3005  drop     all       0        0                                       &lt;br /&gt;
  condition - match-set corporate_network dst                                   &lt;br /&gt;
&lt;br /&gt;
3006  drop     all       0        0                                       &lt;br /&gt;
  condition - match-set remote_user_vpn_network dst                             &lt;br /&gt;
&lt;br /&gt;
3007  drop     all       0        0                                       &lt;br /&gt;
  condition - match-set authorized_guests dst                                   &lt;br /&gt;
&lt;br /&gt;
6001  accept   all       46480    26747790                                &lt;br /&gt;
  condition - saddr 192.168.2.0/24                                              &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;GUEST_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   tcp_udp   9101     596868                                  &lt;br /&gt;
  condition - tcp dpt:domain                                                    &lt;br /&gt;
&lt;br /&gt;
3002  accept   icmp      20       3410                                    &lt;br /&gt;
&lt;br /&gt;
3003  accept   udp       64       21742                                   &lt;br /&gt;
  condition - udp spt:bootpc dpt:bootps                                         &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       33747    4123084                                 &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;GUEST_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
6001  accept   all       49527    7851741                                 &lt;br /&gt;
  condition - daddr 192.168.2.0/24                                              &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;LAN_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,IN) (eth1.3,IN) (eth1.4,IN) (eth1.5,IN) (eth1.148,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
6001  accept   all       2201405  287372547                               &lt;br /&gt;
  condition - saddr 192.168.178.0/24                                            &lt;br /&gt;
&lt;br /&gt;
6002  accept   all       23593    1446864                                 &lt;br /&gt;
  condition - saddr 192.168.148.0/24                                            &lt;br /&gt;
&lt;br /&gt;
6003  accept   all       259330   34563208                                &lt;br /&gt;
  condition - saddr 192.168.46.0/24                                             &lt;br /&gt;
&lt;br /&gt;
6004  accept   all       709735   128420752                               &lt;br /&gt;
  condition - saddr 192.168.47.0/24                                             &lt;br /&gt;
&lt;br /&gt;
6005  accept   all       0        0                                       &lt;br /&gt;
  condition - saddr 192.168.48.0/24                                             &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       12       520                                     &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;LAN_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,LOCAL) (eth1.3,LOCAL) (eth1.4,LOCAL) (eth1.5,LOCAL) (eth1.148,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       1286556  97820849                                &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;LAN_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,OUT) (eth1.3,OUT) (eth1.4,OUT) (eth1.5,OUT) (eth1.148,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
6001  accept   all       2060177  194197463                               &lt;br /&gt;
  condition - daddr 192.168.178.0/24                                            &lt;br /&gt;
&lt;br /&gt;
6002  accept   all       23468    1438338                                 &lt;br /&gt;
  condition - daddr 192.168.148.0/24                                            &lt;br /&gt;
&lt;br /&gt;
6003  accept   all       236238   55342991                                &lt;br /&gt;
  condition - daddr 192.168.46.0/24                                             &lt;br /&gt;
&lt;br /&gt;
6004  accept   all       571907   98234067                                &lt;br /&gt;
  condition - daddr 192.168.47.0/24                                             &lt;br /&gt;
&lt;br /&gt;
6005  accept   all       0        0                                       &lt;br /&gt;
  condition - daddr 192.168.48.0/24                                             &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;WAN_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,IN) (eth2,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
2000  accept   tcp       0        0                                       &lt;br /&gt;
  condition - match-set 65c891680444a9310b5e20e4 dst                            &lt;br /&gt;
&lt;br /&gt;
3001  accept   all       2926181  356194625                               &lt;br /&gt;
  condition - state RELATED,ESTABLISHED                                         &lt;br /&gt;
&lt;br /&gt;
3002  drop     all       0        0                                       &lt;br /&gt;
  condition - state INVALID                                                     &lt;br /&gt;
&lt;br /&gt;
3003  accept   tcp       2150     127100                                  &lt;br /&gt;
  condition - daddr unifi tcp dpt:4443 LOG enabled                              &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;WAN_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,LOCAL) (eth2,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   all       1008284  155244003                               &lt;br /&gt;
  condition - state RELATED,ESTABLISHED                                         &lt;br /&gt;
&lt;br /&gt;
3002  drop     all       14099    733072                                  &lt;br /&gt;
  condition - state INVALID                                                     &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       274916   22257204                                &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Firewall &amp;quot;WAN_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,OUT) (eth2,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       3227650  477820843                               &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv4 Modify Firewall &amp;quot;LOAD_BALANCE&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,IN) (eth1.2,IN) (eth1.3,IN) (eth1.4,IN) (eth1.5,IN) (eth1.148,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   all       1904     99161                                   &lt;br /&gt;
  condition - match-set NETv4_eth0 dst                                          &lt;br /&gt;
&lt;br /&gt;
3002  accept   all       1872     142272                                  &lt;br /&gt;
  condition - match-set NETv4_eth2 dst                                          &lt;br /&gt;
&lt;br /&gt;
3003  accept   all       1168561  83886222                                &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP corporate_network match-set corporate_networ&lt;br /&gt;
              k dst                                                             &lt;br /&gt;
&lt;br /&gt;
3004  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP corporate_network match-set remote_user_vpn_&lt;br /&gt;
              network dst                                                       &lt;br /&gt;
&lt;br /&gt;
3005  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP corporate_network match-set remote_site_vpn_&lt;br /&gt;
              network dst                                                       &lt;br /&gt;
&lt;br /&gt;
3006  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP corporate_network match-set remote_client_vp&lt;br /&gt;
              n_network dst                                                     &lt;br /&gt;
&lt;br /&gt;
3007  accept   all       1757     93454                                   &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP corporate_network match-set guest_network ds&lt;br /&gt;
              t                                                                 &lt;br /&gt;
&lt;br /&gt;
3008  accept   all       70       4140                                    &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP guest_network match-set corporate_network ds&lt;br /&gt;
              t                                                                 &lt;br /&gt;
&lt;br /&gt;
3009  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP guest_network match-set remote_user_vpn_netw&lt;br /&gt;
              ork dst                                                           &lt;br /&gt;
&lt;br /&gt;
3010  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP guest_network match-set remote_site_vpn_netw&lt;br /&gt;
              ork dst                                                           &lt;br /&gt;
&lt;br /&gt;
3011  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP guest_network match-set remote_client_vpn_ne&lt;br /&gt;
              twork dst                                                         &lt;br /&gt;
&lt;br /&gt;
3012  accept   all       9414     628636                                  &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP guest_network match-set guest_network dst   &lt;br /&gt;
&lt;br /&gt;
3013  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP remote_user_vpn_network match-set corporate_&lt;br /&gt;
              network dst                                                       &lt;br /&gt;
&lt;br /&gt;
3014  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP remote_user_vpn_network match-set remote_sit&lt;br /&gt;
              e_vpn_network dst                                                 &lt;br /&gt;
&lt;br /&gt;
3015  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP remote_user_vpn_network match-set remote_use&lt;br /&gt;
              r_vpn_network dst                                                 &lt;br /&gt;
&lt;br /&gt;
3016  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP remote_user_vpn_network match-set remote_cli&lt;br /&gt;
              ent_vpn_network dst                                               &lt;br /&gt;
&lt;br /&gt;
3017  accept   all       0        0                                       &lt;br /&gt;
  condition - match-SRC-NTWRK-GROUP remote_user_vpn_network match-set guest_netw&lt;br /&gt;
              ork dst                                                           &lt;br /&gt;
&lt;br /&gt;
3018  modify   all       4098811  633462135                               &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       4098812  633462197                               &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;AUTHORIZED_GUESTSv6&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Inactive - Not applied to any interfaces, zones or for content-inspection.&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 drop     all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;GUESTv6_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  drop     all       0        0                                       &lt;br /&gt;
  condition - match-set corporate_networkv6 dst                                 &lt;br /&gt;
&lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;GUESTv6_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   udp       0        0                                       &lt;br /&gt;
  condition - udp dpt:domain                                                    &lt;br /&gt;
&lt;br /&gt;
3002  accept   icmp      0        0                                       &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       155      8936                                    &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;GUESTv6_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1.2,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;LANv6_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,IN) (eth1.3,IN) (eth1.4,IN) (eth1.5,IN) (eth1.148,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;LANv6_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,LOCAL) (eth1.3,LOCAL) (eth1.4,LOCAL) (eth1.5,LOCAL) (eth1.148,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       16989    1006856                                 &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;LANv6_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth1,OUT) (eth1.3,OUT) (eth1.4,OUT) (eth1.5,OUT) (eth1.148,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;WANv6_IN&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,IN) (eth2,IN)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   all       0        0                                       &lt;br /&gt;
  condition - state RELATED,ESTABLISHED                                         &lt;br /&gt;
&lt;br /&gt;
3002  drop     all       0        0                                       &lt;br /&gt;
  condition - state INVALID                                                     &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       0        0                                       &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;WANv6_LOCAL&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,LOCAL) (eth2,LOCAL)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
3001  accept   ipv6-icmp 10       720                                     &lt;br /&gt;
  condition - ipv6-icmp neighbour-advertisement                                 &lt;br /&gt;
&lt;br /&gt;
3002  accept   ipv6-icmp 0        0                                       &lt;br /&gt;
  condition - ipv6-icmp neighbour-solicitation                                  &lt;br /&gt;
&lt;br /&gt;
3003  accept   all       0        0                                       &lt;br /&gt;
  condition - state RELATED,ESTABLISHED                                         &lt;br /&gt;
&lt;br /&gt;
3004  drop     all       0        0                                       &lt;br /&gt;
  condition - state INVALID                                                     &lt;br /&gt;
&lt;br /&gt;
10000 drop     all       35373    7011052                                 &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
IPv6 Firewall &amp;quot;WANv6_OUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 Active on (eth0,OUT) (eth2,OUT)&lt;br /&gt;
&lt;br /&gt;
rule  action   proto     packets  bytes                                   &lt;br /&gt;
----  ------   -----     -------  -----                                   &lt;br /&gt;
10000 accept   all       0        0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ChatGPT ist bei der Analyse eine grosze Hilfe.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos, die zum Setzen der Regeln ausgefuehrt werden, sieht man mit folgendem Kommando.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ibb@USG-3P:~$ show configuration commands | match firewall name LAN_IN&lt;br /&gt;
set firewall all-ping enable&lt;br /&gt;
set firewall broadcast-ping disable&lt;br /&gt;
set firewall group address-group authorized_guests description &#039;authorized guests MAC addresses&#039;&lt;br /&gt;
set firewall group address-group guest_allow_dns_servers description &#039;allow dns servers for guests&#039;&lt;br /&gt;
set firewall group address-group guest_portal_address description &#039;guest portal address&#039;&lt;br /&gt;
set firewall group address-group guest_pre_allow description &#039;allow addresses for guests&#039;&lt;br /&gt;
set firewall group address-group guest_restricted address 192.168.0.0/16&lt;br /&gt;
set firewall group address-group guest_restricted address 10.0.0.0/8&lt;br /&gt;
set firewall group address-group guest_restricted address 172.16.0.0/12&lt;br /&gt;
set firewall group address-group guest_restricted description &#039;restricted addresses for guests&#039;&lt;br /&gt;
set firewall group address-group unifi_controller_addresses address 192.168.178.12&lt;br /&gt;
set firewall group address-group unifi_controller_addresses description &#039;UniFi addresses&#039;&lt;br /&gt;
set firewall group ipv6-network-group corporate_networkv6 description &#039;IPv6 corporate subnets&#039;&lt;br /&gt;
set firewall group ipv6-network-group guest_networkv6 description &#039;IPv6 guest subnets&#039;&lt;br /&gt;
set firewall group network-group captive_portal_subnets description &#039;captive portal subnets&#039;&lt;br /&gt;
set firewall group network-group corporate_network description &#039;corporate subnets&#039;&lt;br /&gt;
set firewall group network-group corporate_network network 192.168.178.0/24&lt;br /&gt;
set firewall group network-group corporate_network network 192.168.148.0/24&lt;br /&gt;
set firewall group network-group corporate_network network 192.168.46.0/24&lt;br /&gt;
set firewall group network-group corporate_network network 192.168.47.0/24&lt;br /&gt;
set firewall group network-group corporate_network network 192.168.48.0/24&lt;br /&gt;
set firewall group network-group guest_network description &#039;guest subnets&#039;&lt;br /&gt;
set firewall group network-group guest_network network 192.168.2.0/24&lt;br /&gt;
set firewall group network-group remote_client_vpn_network description &#039;remote client VPN subnets&#039;&lt;br /&gt;
set firewall group network-group remote_site_vpn_network description &#039;remote site VPN subnets&#039;&lt;br /&gt;
set firewall group network-group remote_user_vpn_network description &#039;Remote User VPN subnets&#039;&lt;br /&gt;
set firewall group port-group 65c891680444a9310b5e20e4 description customized-SSH&lt;br /&gt;
set firewall group port-group 65c891680444a9310b5e20e4 port 22&lt;br /&gt;
set firewall group port-group guest_portal_ports description &#039;guest portal ports&#039;&lt;br /&gt;
set firewall group port-group guest_portal_redirector_ports description &#039;guest portal redirector ports&#039;&lt;br /&gt;
set firewall group port-group guest_portal_redirector_ports port 39080&lt;br /&gt;
set firewall group port-group guest_portal_redirector_ports port 39443&lt;br /&gt;
set firewall group port-group unifi_controller_ports-tcp description &#039;unifi tcp ports&#039;&lt;br /&gt;
set firewall group port-group unifi_controller_ports-tcp port 8080&lt;br /&gt;
set firewall group port-group unifi_controller_ports-udp description &#039;unifi udp ports&#039;&lt;br /&gt;
set firewall group port-group unifi_controller_ports-udp port 3478&lt;br /&gt;
set firewall ipv6-name AUTHORIZED_GUESTSv6 default-action drop&lt;br /&gt;
set firewall ipv6-name AUTHORIZED_GUESTSv6 description &#039;authorization check packets from guest network&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_IN default-action accept&lt;br /&gt;
set firewall ipv6-name GUESTv6_IN description &#039;packets from guest network&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_IN rule 3001 action drop&lt;br /&gt;
set firewall ipv6-name GUESTv6_IN rule 3001 description &#039;Block Virtual Network Traffic&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_IN rule 3001 destination group ipv6-network-group corporate_networkv6&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL default-action drop&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL description &#039;packets from guest network to gateway&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3001 action accept&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3001 description &#039;allow DNS&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3001 destination port 53&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3001 protocol udp&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3002 action accept&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3002 description &#039;allow ICMP&#039;&lt;br /&gt;
set firewall ipv6-name GUESTv6_LOCAL rule 3002 protocol icmp&lt;br /&gt;
set firewall ipv6-name GUESTv6_OUT default-action accept&lt;br /&gt;
set firewall ipv6-name GUESTv6_OUT description &#039;packets forward to guest network&#039;&lt;br /&gt;
set firewall ipv6-name LANv6_IN default-action accept&lt;br /&gt;
set firewall ipv6-name LANv6_IN description &#039;packets from intranet&#039;&lt;br /&gt;
set firewall ipv6-name LANv6_LOCAL default-action accept&lt;br /&gt;
set firewall ipv6-name LANv6_LOCAL description &#039;packets from intranet to gateway&#039;&lt;br /&gt;
set firewall ipv6-name LANv6_OUT default-action accept&lt;br /&gt;
set firewall ipv6-name LANv6_OUT description &#039;packets forward to intranet&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_IN default-action drop&lt;br /&gt;
set firewall ipv6-name WANv6_IN description &#039;packets from internet to intranet&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 action accept&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 description &#039;allow established/related sessions&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 state established enable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 state invalid disable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 state new disable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3001 state related enable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 action drop&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 description &#039;drop invalid state&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 state established disable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 state invalid enable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 state new disable&lt;br /&gt;
set firewall ipv6-name WANv6_IN rule 3002 state related disable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL default-action drop&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL description &#039;packets from internet to gateway&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3001 action accept&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3001 description &#039;Allow neighbor advertisements&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3001 icmpv6 type neighbor-advertisement&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3001 protocol ipv6-icmp&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3002 action accept&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3002 description &#039;Allow Neighbor Solicitations&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3002 icmpv6 type neighbor-solicitation&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3002 protocol ipv6-icmp&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 action accept&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 description &#039;allow established/related sessions&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 state established enable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 state invalid disable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 state new disable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3003 state related enable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 action drop&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 description &#039;drop invalid state&#039;&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 state established disable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 state invalid enable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 state new disable&lt;br /&gt;
set firewall ipv6-name WANv6_LOCAL rule 3004 state related disable&lt;br /&gt;
set firewall ipv6-name WANv6_OUT default-action accept&lt;br /&gt;
set firewall ipv6-name WANv6_OUT description &#039;packets to internet&#039;&lt;br /&gt;
set firewall ipv6-receive-redirects disable&lt;br /&gt;
set firewall ipv6-src-route disable&lt;br /&gt;
set firewall ip-src-route disable&lt;br /&gt;
set firewall log-martians enable&lt;br /&gt;
set firewall modify LOAD_BALANCE description LOAD_BALANCE&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3001 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3001 destination group address-group NETv4_eth0&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3002 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3002 destination group address-group NETv4_eth2&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3003 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3003 destination group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3003 source group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3004 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3004 destination group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3004 source group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3005 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3005 destination group network-group remote_site_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3005 source group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3006 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3006 destination group network-group remote_client_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3006 source group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3007 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3007 destination group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3007 source group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3008 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3008 destination group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3008 source group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3009 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3009 destination group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3009 source group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3010 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3010 destination group network-group remote_site_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3010 source group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3011 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3011 destination group network-group remote_client_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3011 source group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3012 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3012 destination group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3012 source group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3013 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3013 destination group network-group corporate_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3013 source group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3014 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3014 destination group network-group remote_site_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3014 source group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3015 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3015 destination group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3015 source group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3016 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3016 destination group network-group remote_client_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3016 source group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3017 action accept&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3017 destination group network-group guest_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3017 source group network-group remote_user_vpn_network&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3018 action modify&lt;br /&gt;
set firewall modify LOAD_BALANCE rule 3018 modify lb-group wan_failover&lt;br /&gt;
set firewall name AUTHORIZED_GUESTS default-action drop&lt;br /&gt;
set firewall name AUTHORIZED_GUESTS description &#039;authorization check packets from guest network&#039;&lt;br /&gt;
set firewall name GUEST_IN default-action accept&lt;br /&gt;
set firewall name GUEST_IN description &#039;packets from guest network&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3001 action accept&lt;br /&gt;
set firewall name GUEST_IN rule 3001 description &#039;Allow Public DNS&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3001 destination port 53&lt;br /&gt;
set firewall name GUEST_IN rule 3001 protocol tcp_udp&lt;br /&gt;
set firewall name GUEST_IN rule 3002 action accept&lt;br /&gt;
set firewall name GUEST_IN rule 3002 description &#039;Allow Hotspot Portal&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3002 destination group network-group captive_portal_subnets&lt;br /&gt;
set firewall name GUEST_IN rule 3002 destination port 443&lt;br /&gt;
set firewall name GUEST_IN rule 3002 protocol tcp&lt;br /&gt;
set firewall name GUEST_IN rule 3003 action accept&lt;br /&gt;
set firewall name GUEST_IN rule 3003 description &#039;allow packets to allow subnets&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3003 destination group address-group guest_pre_allow&lt;br /&gt;
set firewall name GUEST_IN rule 3004 action drop&lt;br /&gt;
set firewall name GUEST_IN rule 3004 description &#039;Block Restricted Traffic&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3004 destination group address-group guest_restricted&lt;br /&gt;
set firewall name GUEST_IN rule 3005 action drop&lt;br /&gt;
set firewall name GUEST_IN rule 3005 description &#039;Block Virtual Network Traffic&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3005 destination group network-group corporate_network&lt;br /&gt;
set firewall name GUEST_IN rule 3006 action drop&lt;br /&gt;
set firewall name GUEST_IN rule 3006 description &#039;Block Traffic To VPN Servers&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3006 destination group network-group remote_user_vpn_network&lt;br /&gt;
set firewall name GUEST_IN rule 3007 action drop&lt;br /&gt;
set firewall name GUEST_IN rule 3007 description &#039;Block Unauthorized Traffic&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 3007 destination group address-group authorized_guests&lt;br /&gt;
set firewall name GUEST_IN rule 6001 action accept&lt;br /&gt;
set firewall name GUEST_IN rule 6001 description &#039;Allow Network 192.168.2.0/24 Traffic&#039;&lt;br /&gt;
set firewall name GUEST_IN rule 6001 source address 192.168.2.0/24&lt;br /&gt;
set firewall name GUEST_LOCAL default-action drop&lt;br /&gt;
set firewall name GUEST_LOCAL description &#039;packets from guest network to gateway&#039;&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3001 action accept&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3001 description &#039;allow DNS&#039;&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3001 destination port 53&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3001 protocol tcp_udp&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3002 action accept&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3002 description &#039;allow ICMP&#039;&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3002 protocol icmp&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3003 action accept&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3003 description &#039;Allow DHCP&#039;&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3003 destination port 67&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3003 protocol udp&lt;br /&gt;
set firewall name GUEST_LOCAL rule 3003 source port 68&lt;br /&gt;
set firewall name GUEST_OUT default-action accept&lt;br /&gt;
set firewall name GUEST_OUT description &#039;packets forward to guest network&#039;&lt;br /&gt;
set firewall name GUEST_OUT rule 6001 action accept&lt;br /&gt;
set firewall name GUEST_OUT rule 6001 description &#039;Allow Network 192.168.2.0/24 Traffic&#039;&lt;br /&gt;
set firewall name GUEST_OUT rule 6001 destination address 192.168.2.0/24&lt;br /&gt;
set firewall name LAN_IN default-action accept&lt;br /&gt;
set firewall name LAN_IN description &#039;packets from intranet&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6001 action accept&lt;br /&gt;
set firewall name LAN_IN rule 6001 description &#039;Allow Network 192.168.178.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6001 source address 192.168.178.0/24&lt;br /&gt;
set firewall name LAN_IN rule 6002 action accept&lt;br /&gt;
set firewall name LAN_IN rule 6002 description &#039;Allow Network 192.168.148.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6002 source address 192.168.148.0/24&lt;br /&gt;
set firewall name LAN_IN rule 6003 action accept&lt;br /&gt;
set firewall name LAN_IN rule 6003 description &#039;Allow Network 192.168.46.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6003 source address 192.168.46.0/24&lt;br /&gt;
set firewall name LAN_IN rule 6004 action accept&lt;br /&gt;
set firewall name LAN_IN rule 6004 description &#039;Allow Network 192.168.47.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6004 source address 192.168.47.0/24&lt;br /&gt;
set firewall name LAN_IN rule 6005 action accept&lt;br /&gt;
set firewall name LAN_IN rule 6005 description &#039;Allow Network 192.168.48.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_IN rule 6005 source address 192.168.48.0/24&lt;br /&gt;
set firewall name LAN_LOCAL default-action accept&lt;br /&gt;
set firewall name LAN_LOCAL description &#039;packets from intranet to gateway&#039;&lt;br /&gt;
set firewall name LAN_OUT default-action accept&lt;br /&gt;
set firewall name LAN_OUT description &#039;packets forward to intranet&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6001 action accept&lt;br /&gt;
set firewall name LAN_OUT rule 6001 description &#039;Allow Network 192.168.178.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6001 destination address 192.168.178.0/24&lt;br /&gt;
set firewall name LAN_OUT rule 6002 action accept&lt;br /&gt;
set firewall name LAN_OUT rule 6002 description &#039;Allow Network 192.168.148.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6002 destination address 192.168.148.0/24&lt;br /&gt;
set firewall name LAN_OUT rule 6003 action accept&lt;br /&gt;
set firewall name LAN_OUT rule 6003 description &#039;Allow Network 192.168.46.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6003 destination address 192.168.46.0/24&lt;br /&gt;
set firewall name LAN_OUT rule 6004 action accept&lt;br /&gt;
set firewall name LAN_OUT rule 6004 description &#039;Allow Network 192.168.47.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6004 destination address 192.168.47.0/24&lt;br /&gt;
set firewall name LAN_OUT rule 6005 action accept&lt;br /&gt;
set firewall name LAN_OUT rule 6005 description &#039;Allow Network 192.168.48.0/24 Traffic&#039;&lt;br /&gt;
set firewall name LAN_OUT rule 6005 destination address 192.168.48.0/24&lt;br /&gt;
set firewall name WAN_IN default-action drop&lt;br /&gt;
set firewall name WAN_IN description &#039;packets from internet to intranet&#039;&lt;br /&gt;
set firewall name WAN_IN rule 2000 action accept&lt;br /&gt;
set firewall name WAN_IN rule 2000 description SSH&lt;br /&gt;
set firewall name WAN_IN rule 2000 destination group port-group 65c891680444a9310b5e20e4&lt;br /&gt;
set firewall name WAN_IN rule 2000 protocol tcp&lt;br /&gt;
set firewall name WAN_IN rule 3001 action accept&lt;br /&gt;
set firewall name WAN_IN rule 3001 description &#039;allow established/related sessions&#039;&lt;br /&gt;
set firewall name WAN_IN rule 3001 state established enable&lt;br /&gt;
set firewall name WAN_IN rule 3001 state invalid disable&lt;br /&gt;
set firewall name WAN_IN rule 3001 state new disable&lt;br /&gt;
set firewall name WAN_IN rule 3001 state related enable&lt;br /&gt;
set firewall name WAN_IN rule 3002 action drop&lt;br /&gt;
set firewall name WAN_IN rule 3002 description &#039;drop invalid state&#039;&lt;br /&gt;
set firewall name WAN_IN rule 3002 state established disable&lt;br /&gt;
set firewall name WAN_IN rule 3002 state invalid enable&lt;br /&gt;
set firewall name WAN_IN rule 3002 state new disable&lt;br /&gt;
set firewall name WAN_IN rule 3002 state related disable&lt;br /&gt;
set firewall name WAN_IN rule 3003 action accept&lt;br /&gt;
set firewall name WAN_IN rule 3003 description &#039;PortForward [Smarthome]&#039;&lt;br /&gt;
set firewall name WAN_IN rule 3003 destination address 192.168.178.12&lt;br /&gt;
set firewall name WAN_IN rule 3003 destination port 4443&lt;br /&gt;
set firewall name WAN_IN rule 3003 log enable&lt;br /&gt;
set firewall name WAN_IN rule 3003 protocol tcp&lt;br /&gt;
set firewall name WAN_LOCAL default-action drop&lt;br /&gt;
set firewall name WAN_LOCAL description &#039;packets from internet to gateway&#039;&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 action accept&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 description &#039;allow established/related sessions&#039;&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 state established enable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 state invalid disable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 state new disable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3001 state related enable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 action drop&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 description &#039;drop invalid state&#039;&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 state established disable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 state invalid enable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 state new disable&lt;br /&gt;
set firewall name WAN_LOCAL rule 3002 state related disable&lt;br /&gt;
set firewall name WAN_OUT default-action accept&lt;br /&gt;
set firewall name WAN_OUT description &#039;packets to internet&#039;&lt;br /&gt;
set firewall options mss-clamp interface-type pppoe&lt;br /&gt;
set firewall options mss-clamp interface-type pptp&lt;br /&gt;
set firewall options mss-clamp interface-type vti&lt;br /&gt;
set firewall options mss-clamp mss 1452&lt;br /&gt;
set firewall options mss-clamp6 interface-type pppoe&lt;br /&gt;
set firewall options mss-clamp6 interface-type pptp&lt;br /&gt;
set firewall options mss-clamp6 mss 1432&lt;br /&gt;
set firewall receive-redirects disable&lt;br /&gt;
set firewall send-redirects enable&lt;br /&gt;
set firewall source-validation disable&lt;br /&gt;
set firewall syn-cookies enable&lt;br /&gt;
set interfaces ethernet eth0 firewall in ipv6-name WANv6_IN&lt;br /&gt;
set interfaces ethernet eth0 firewall in name WAN_IN&lt;br /&gt;
set interfaces ethernet eth0 firewall local ipv6-name WANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth0 firewall local name WAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth0 firewall out ipv6-name WANv6_OUT&lt;br /&gt;
set interfaces ethernet eth0 firewall out name WAN_OUT&lt;br /&gt;
set interfaces ethernet eth1 firewall in ipv6-name LANv6_IN&lt;br /&gt;
set interfaces ethernet eth1 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 firewall in name LAN_IN&lt;br /&gt;
set interfaces ethernet eth1 firewall local ipv6-name LANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 firewall local name LAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 firewall out ipv6-name LANv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 firewall out name LAN_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall in ipv6-name GUESTv6_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall in name GUEST_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall local ipv6-name GUESTv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall local name GUEST_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall out ipv6-name GUESTv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 2 firewall out name GUEST_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall in ipv6-name LANv6_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall in name LAN_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall local ipv6-name LANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall local name LAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall out ipv6-name LANv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 3 firewall out name LAN_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall in ipv6-name LANv6_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall in name LAN_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall local ipv6-name LANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall local name LAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall out ipv6-name LANv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 4 firewall out name LAN_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall in ipv6-name LANv6_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall in name LAN_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall local ipv6-name LANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall local name LAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall out ipv6-name LANv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 5 firewall out name LAN_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall in ipv6-name LANv6_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall in modify LOAD_BALANCE&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall in name LAN_IN&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall local ipv6-name LANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall local name LAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall out ipv6-name LANv6_OUT&lt;br /&gt;
set interfaces ethernet eth1 vif 148 firewall out name LAN_OUT&lt;br /&gt;
set interfaces ethernet eth2 firewall in ipv6-name WANv6_IN&lt;br /&gt;
set interfaces ethernet eth2 firewall in name WAN_IN&lt;br /&gt;
set interfaces ethernet eth2 firewall local ipv6-name WANv6_LOCAL&lt;br /&gt;
set interfaces ethernet eth2 firewall local name WAN_LOCAL&lt;br /&gt;
set interfaces ethernet eth2 firewall out ipv6-name WANv6_OUT&lt;br /&gt;
set interfaces ethernet eth2 firewall out name WAN_OUT&lt;br /&gt;
set port-forward auto-firewall disable&lt;br /&gt;
Tibb@USG-3P:~$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beim Gast-WLAN funktioniert die Isolierung, siehe &amp;quot;set firewall name GUEST_LOCAL default-action drop&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Workaround=&lt;br /&gt;
&lt;br /&gt;
Als erstes legt man Netzwerklisten an von allen Subnetzen die ein Subnetz nicht erreichen darf. Leider habe ich kein NOT gefunden. Grrrr! Das haette die Sache deutlich vereinfacht. Das zu isolierende Subnetz ausgewaehlt, NOT davor und fertig. So muss man tatsaechlich alle nicht vom Subnetz zu erreichenden Subnetze auflisten.&lt;br /&gt;
&lt;br /&gt;
[[File:UnifiNetwork_Networks.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Im Anschluss kann man dann die Drop-Regeln fuer jedes Subnetz anlegen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Regel&lt;br /&gt;
&lt;br /&gt;
Name: Block VLANXXX&lt;br /&gt;
&lt;br /&gt;
Einstellung	Wert&lt;br /&gt;
Type	LAN IN&lt;br /&gt;
Action	Drop&lt;br /&gt;
Protocol	All&lt;br /&gt;
Source	Network 192.168.xxx.0/24&lt;br /&gt;
Destination	Network Group &amp;lt;NameausNetwerkliste&amp;gt;&lt;br /&gt;
Logging	optional&lt;br /&gt;
Reihenfolge	vor den Accept-Regeln&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:UnifiNetwork_TrafficandFirewallRuls.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Dadurch konnte ich mir (vorerst) die Anschaffung eines neuen und kompatiblen Produktes, wie UXG, UDM, UCG, ersparen.&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Ubiquiti_Nanostation_AC_loco_Bridge&amp;diff=5214</id>
		<title>Ubiquiti Nanostation AC loco Bridge</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Ubiquiti_Nanostation_AC_loco_Bridge&amp;diff=5214"/>
		<updated>2026-07-31T15:53:51Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Um einen Internetanschluss an der anderen Grundstuecksseite (ca. 100 m) zu realisieren hatte ich zuerst an ein Kabel gedacht. Das ist zwar noch nicht ganz vom Tisch, bis ich aber eine vernuenftige Leitungsfuehrung hinbekomme, brauche ich allerdings noch etwas Zeit. Der Aufbau einer Netzwerk-Bruecke [https://www.ip-insider.de/was-ist-eine-netzwerk-bridge-a-902076/] laesst sich, so die Hoffnung, schnell und einfach realisieren. Die Wahl fiel auf zwei NanoStation AC loco (5 GHZ airMAX AC Radio) von Ubiquiti, nachfolgend nur noch NanoStation genannt. Da ich im Haus bereits Ubiquiti-Kompnenten einsaetze, ist mir deren Konfiguration bereits vertraut.&lt;br /&gt;
&lt;br /&gt;
=Faktencheck=&lt;br /&gt;
Eine Netzwerkbridge arbeitet auf der ISO/OSI-Schicht 2. Es findet also in einem TCP/IP-Netz (MAC, LLC,...) alles in der Netzzugangsschicht statt. Das bedeutet man braucht sich keine Gedanken beim Einrichten des TCP/IP-Netzes zu machen. &lt;br /&gt;
[https://de.wikipedia.org/wiki/Logical_Link_Control]&lt;br /&gt;
&lt;br /&gt;
Die NanoStation ist Outdoor geeignet. Dies bezieht sich erst einmal nur auf die Gehaeuse-Kapsel. Fuer den Betrieb Outdoor im 5-GHz-Band ergeben sich allerdings Einschraenkungen bei der Wahl der Kanaele. [https://en.wikipedia.org/wiki/List_of_WLAN_channels][https://community.ui.com/questions/Usage-of-5Ghz-SRD-channels-in-Europe-Germany-wrong-allowed-power-settings/efda8b93-d52b-456a-8722-5dd0e616dafc][https://efis.cept.org/sitecontent.jsp?sitecontent=srd_regulations]&lt;br /&gt;
&lt;br /&gt;
Eine Angabe zur IP-Schutzart konnte ich bisher nicht finden.&lt;br /&gt;
&lt;br /&gt;
 Die NanoStation besitzt einen (dedizierten) AccessPoint, mit dem man sich zu Konfiguration-Zwecken verbinden kann. Die SSID ist &amp;quot;Loco5AC-&amp;lt;MAC&amp;gt;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Zum Betrieb benoetigt man noch eine passives PoE-Netzteil (Empfohlener PoE-Adapter: POE-24-12W-G). &lt;br /&gt;
 Passiver PoE-2-Paar (Paar 4/5 +24 V, 7/8 Rückfluss (-)) &lt;br /&gt;
Vollstaendig also: Pin 1: TX+ Pin 2: TX- Pin 3: RX+ Pin 4: 24V Pin 5: 24V Pin 6: RX- Pin 7: GND Pin 8: GND (Tabelle folgt)&lt;br /&gt;
&lt;br /&gt;
Geht man mal von einem Dauerbetrieb mit maximaler Leistung (7 W) aus, sind das pro Station 60 kWh im Jahr.&lt;br /&gt;
&lt;br /&gt;
Der Vorgaenger der NanoStation AC 5 und loco (&#039;&#039;&#039;lo&#039;&#039;&#039;w&#039;&#039;&#039;co&#039;&#039;&#039;st?) sind (vermutlich) die NanoStation M und locoM (High-Power 2x2 MIMO airMAX® TDMA Station Models: NSM2/NSM3/NSM365/NSM5/locoM2/locoM5). Da diese nur einen 10/100-MBit/s-Port besitzen, ist hier auch die maximale Bandbreite auf 100 MBit/s begrenzt. Die Web-Oberflaeche hat sich sich vom M zum AC doch um einiges geaendert. [https://www.makes-it-work.de/2014/07/29/tutorial-ubnt-punkt-zu-punkt-verbindung/] &lt;br /&gt;
Bei den loco-Varianten fehlt der zweite Ethernetport an den man z. B. eine Netzwerk-Kamera anschliessen koennte. &lt;br /&gt;
&lt;br /&gt;
Es stehen (mindestens) 2 Verbindungsmoeglichkeiten zur Verfuegung.&lt;br /&gt;
 Überprüfen Sie die Konnektivität in der airOS®-Konfigurationsschnittstelle mit der UISP™-App oder dem Webportal. Beide sind sofort nach dem Einschalten des Geräts &#039;&#039;&#039;15 Minuten&#039;&#039;&#039; lang verfügbar. Falls erforderlich, können Sie das Gerät aus- und wieder einschalten, um das WLAN zu aktivieren.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
&lt;br /&gt;
Downloads zu allen Airmax-AC Komponenten [https://www.ui.com/download/airmax-ac].&lt;br /&gt;
&lt;br /&gt;
Datenblatt [https://dl.ubnt.com/datasheets/NanoStation_AC/NanoStation_AC_DS.pdf]&lt;br /&gt;
&lt;br /&gt;
=Erstkontakt=&lt;br /&gt;
&lt;br /&gt;
UISP-App oder Webportal&lt;br /&gt;
&lt;br /&gt;
So ganz stellt sich die Frage nicht, da man bequem vom Startbildschirm der App durch anklicken der beiden zugewiesen IP in den Browser wechseln kann. So hat man sich zumindest das Tippen der IP gespart. &lt;br /&gt;
&lt;br /&gt;
 Die UISP-App hat bei mir (10/2023) ein anderes Icon.&lt;br /&gt;
&lt;br /&gt;
Android (Samsung, Android Version 12, One UI-Version 4.1)&lt;br /&gt;
&lt;br /&gt;
 Die Sicherheitsrichtlinie verhindert das benutzen unsicherer WLAN-Netzwerke. (Einstellungen -&amp;gt; Biometrische Daten und Sicherheit -&amp;gt; Andere Sicherheitseinstellungen -&amp;gt; Sicherheitsrichtlinien-Updates -&amp;gt; ausschalten)&lt;br /&gt;
&lt;br /&gt;
Im Vorfeld sollte man sich schon mal Gedanken ueber Username und Password fuer den zukuenftigen Zugriff und eine SSID fuer die Bridge machen.&lt;br /&gt;
&lt;br /&gt;
Standard-Benutzername und Passwort sind &#039;&#039;&#039;ubnt&#039;&#039;&#039; und &#039;&#039;&#039;ubnt&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Grundkonfiguration mache ich mit dem der App. Das Dashboard sieht auf dem kleinen Mobilbildschirm nicht so dolle aus.&lt;br /&gt;
Neben dem Hauptbildschirm und den weiteren Menuepunkten des 3-Punkte-Menues gibt es 3 Hauptkonfigurations-Reiter:&lt;br /&gt;
*DRAHTLOS&lt;br /&gt;
*NETZWERK&lt;br /&gt;
*SYSTEM&lt;br /&gt;
&lt;br /&gt;
=Konfiguration=&lt;br /&gt;
&lt;br /&gt;
Eine NanoStation wird zur StationPtP und die andere zur AccessPtP. Die Einstellungen sind alle bis auf die Aktivierung des AccessPoints identisch.&lt;br /&gt;
Bei der zweiten NanoStation bin ich irgendwie in einem &amp;quot;Auto-AP-Config-Modus&amp;quot; gelandet. Dabei nimmt die Routine alle unten beschriebenen Einstellungen vor. Wenn ich die Config-Datei nicht abgespeichert haette, haette ich mich fast ausgesperrt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Config Datei Client&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
### PART ###&lt;br /&gt;
## 1648587044&lt;br /&gt;
##WA.v8.7.9&lt;br /&gt;
#board.sysid=0xe7fa&lt;br /&gt;
#board.cpurevision=0x00001123&lt;br /&gt;
#board.arch=0&lt;br /&gt;
#board.fcc_id=SWX-NS5ACLW&lt;br /&gt;
#board.name=NanoStation 5AC loco&lt;br /&gt;
#board.shortname=N5L&lt;br /&gt;
#board.model=Loco5AC&lt;br /&gt;
#board.timestamp=1684984461&lt;br /&gt;
#board.bom=13-00552-22&lt;br /&gt;
#board.netmodes=3&lt;br /&gt;
#board.hwaddr=E43883XXYYZZ&lt;br /&gt;
#board.device_id=705ff379f2b3bbb4efc2b5bfcdee03d3&lt;br /&gt;
#board.reboot=40&lt;br /&gt;
#board.upgrade=150&lt;br /&gt;
#board.phycount=1&lt;br /&gt;
#board.phy.1.maxmtu=2024&lt;br /&gt;
#board.fcc_unii_activated=1&lt;br /&gt;
#board.fcc_unii_switchable=0&lt;br /&gt;
#board.required_fw_version=526084&lt;br /&gt;
#radio.1.name=&lt;br /&gt;
#radio.1.shortname=&lt;br /&gt;
#radio.1.bus=pci&lt;br /&gt;
#radio.1.devdomain=5000&lt;br /&gt;
#radio.1.ccode=840&lt;br /&gt;
#radio.1.ccode_fixed=0&lt;br /&gt;
#radio.1.ccode_locked=0&lt;br /&gt;
#radio.1.subsystemid=0xe7fa&lt;br /&gt;
#radio.1.subvendorid=0x0777&lt;br /&gt;
#radio.1.txpower.max=25&lt;br /&gt;
#radio.1.txpower.min=-4&lt;br /&gt;
#radio.1.txpower.offset=2&lt;br /&gt;
#radio.1.ieee_modes=21&lt;br /&gt;
#radio.1.powerBackoff=6&lt;br /&gt;
#radio.1.antennas=1&lt;br /&gt;
#radio.1.def_antenna=1&lt;br /&gt;
#radio.1.antenna.1.id=1&lt;br /&gt;
#radio.1.antenna.1.name=NANO-G2&lt;br /&gt;
#radio.1.antenna.1.gain=13&lt;br /&gt;
#radio.1.antenna.1.builtin=1&lt;br /&gt;
#radio.1.antenna.1.chains=2&lt;br /&gt;
#radio.1.antenna.1.chain.1.id=0&lt;br /&gt;
#radio.1.antenna.1.chain.1.name=Vertical&lt;br /&gt;
#radio.1.antenna.1.chain.2.id=1&lt;br /&gt;
#radio.1.antenna.1.chain.2.name=Horizontal&lt;br /&gt;
#radio.1.caps=2900361236&lt;br /&gt;
#radio.1.caps2=2&lt;br /&gt;
#radio.1.eirp.limit=1&lt;br /&gt;
#radio.1.regdomain_flags=fcc_new_grant,ts=0x646ed28d&lt;br /&gt;
#radio.1.chains=2&lt;br /&gt;
#radio.1.ieee_mode_a=1&lt;br /&gt;
#radio.1.ptp_only=1&lt;br /&gt;
#radio.1.ptp_sta=1&lt;br /&gt;
#radio.1.ptmp_only=1&lt;br /&gt;
#radio.1.ptmp_sta=1&lt;br /&gt;
#radio.1.distance_limit=0&lt;br /&gt;
#radio.1.chanbw=10,20,30,40,50,60,80&lt;br /&gt;
#radio.2.name=&lt;br /&gt;
#radio.2.shortname=&lt;br /&gt;
#radio.2.bus=ahb&lt;br /&gt;
#radio.2.devdomain=5000&lt;br /&gt;
#radio.2.ccode=840&lt;br /&gt;
#radio.2.ccode_fixed=0&lt;br /&gt;
#radio.2.ccode_locked=0&lt;br /&gt;
#radio.2.subsystemid=0xe7fa&lt;br /&gt;
#radio.2.subvendorid=0x0777&lt;br /&gt;
#radio.2.txpower.max=19&lt;br /&gt;
#radio.2.txpower.min=0&lt;br /&gt;
#radio.2.txpower.offset=0&lt;br /&gt;
#radio.2.ieee_modes=10&lt;br /&gt;
#radio.2.powerBackoff=6&lt;br /&gt;
#radio.2.antennas=0&lt;br /&gt;
#radio.2.def_antenna=0&lt;br /&gt;
#radio.2.caps=12&lt;br /&gt;
#radio.2.caps2=0&lt;br /&gt;
#radio.2.eirp.limit=0&lt;br /&gt;
#radio.2.regdomain_flags=ts=0x646ed28d&lt;br /&gt;
#radio.2.chains=1&lt;br /&gt;
#radio.2.ieee_mode_bg=1&lt;br /&gt;
#radio.2.web_exclude=1&lt;br /&gt;
#radio.2.distance_limit=0&lt;br /&gt;
#radio.2.chanbw=5,10,20,40,80&lt;br /&gt;
#feature.rssi.leds=0&lt;br /&gt;
#feature.g2=1&lt;br /&gt;
#feature.g3=0&lt;br /&gt;
#feature.ext_reset=0&lt;br /&gt;
#feature.poe_passthrough=0&lt;br /&gt;
#78c4f0e363d947eed2e0aed0c453ffbc&lt;br /&gt;
### PART ###&lt;br /&gt;
aaa.status=disabled&lt;br /&gt;
bridge.status=enabled&lt;br /&gt;
bridge.1.devname=br0&lt;br /&gt;
bridge.1.port.1.devname=eth0&lt;br /&gt;
bridge.1.port.1.status=enabled&lt;br /&gt;
bridge.1.port.2.devname=ath0&lt;br /&gt;
bridge.1.port.2.status=enabled&lt;br /&gt;
bridge.1.status=enabled&lt;br /&gt;
bridge.1.stp.status=disabled&lt;br /&gt;
dhcpc.status=enabled&lt;br /&gt;
dhcpc.1.devname=br0&lt;br /&gt;
dhcpc.1.fallback=192.168.1.20&lt;br /&gt;
dhcpc.1.fallback_netmask=255.255.255.0&lt;br /&gt;
dhcpc.1.status=enabled&lt;br /&gt;
discovery.beacon.status=enabled&lt;br /&gt;
discovery.cdp.status=disabled&lt;br /&gt;
discovery.lldp.status=enabled&lt;br /&gt;
discovery.status=enabled&lt;br /&gt;
ebtables.status=enabled&lt;br /&gt;
ebtables.sys.arpnat.status=enabled&lt;br /&gt;
ebtables.sys.arpnat.1.devname=ath0&lt;br /&gt;
ebtables.sys.arpnat.1.status=enabled&lt;br /&gt;
ebtables.sys.eap.status=enabled&lt;br /&gt;
ebtables.sys.eap.1.devname=ath0&lt;br /&gt;
ebtables.sys.eap.1.status=enabled&lt;br /&gt;
ebtables.sys.status=enabled&lt;br /&gt;
gui.language=en_US&lt;br /&gt;
httpd.https.port=443&lt;br /&gt;
httpd.https.status=enabled&lt;br /&gt;
httpd.status=enabled&lt;br /&gt;
netconf.status=enabled&lt;br /&gt;
netconf.1.autoip.status=disabled&lt;br /&gt;
netconf.1.devname=ath0&lt;br /&gt;
netconf.1.mtu=1500&lt;br /&gt;
netconf.1.status=enabled&lt;br /&gt;
netconf.1.up=enabled&lt;br /&gt;
netconf.2.autoip.status=disabled&lt;br /&gt;
netconf.2.autoneg=enabled&lt;br /&gt;
netconf.2.devname=eth0&lt;br /&gt;
netconf.2.flowcontrol.rx.status=enabled&lt;br /&gt;
netconf.2.flowcontrol.tx.status=enabled&lt;br /&gt;
netconf.2.mtu=1500&lt;br /&gt;
netconf.2.status=enabled&lt;br /&gt;
netconf.2.up=enabled&lt;br /&gt;
netconf.3.autoip.status=disabled&lt;br /&gt;
netconf.3.devname=br0&lt;br /&gt;
netconf.3.ip6.status=enabled&lt;br /&gt;
netconf.3.mtu=1500&lt;br /&gt;
netconf.3.role=mlan&lt;br /&gt;
netconf.3.status=enabled&lt;br /&gt;
netmode=bridge&lt;br /&gt;
radio.countrycode=276&lt;br /&gt;
radio.status=enabled&lt;br /&gt;
radio.1.ack.auto=enabled&lt;br /&gt;
radio.1.ackdistance=600&lt;br /&gt;
radio.1.acktimeout=31&lt;br /&gt;
radio.1.antenna.gain=13&lt;br /&gt;
radio.1.antenna.id=1&lt;br /&gt;
radio.1.atpc.sta.status=enabled&lt;br /&gt;
radio.1.atpc.threshold=36&lt;br /&gt;
radio.1.cable.loss=2&lt;br /&gt;
radio.1.center.1.freq=0&lt;br /&gt;
radio.1.chanbw=0&lt;br /&gt;
radio.1.countrycode=276&lt;br /&gt;
radio.1.cwm.enable=0&lt;br /&gt;
radio.1.cwm.mode=1&lt;br /&gt;
radio.1.devname=ath0&lt;br /&gt;
radio.1.dfs.status=enabled&lt;br /&gt;
radio.1.freq=0&lt;br /&gt;
radio.1.ieee_mode=auto&lt;br /&gt;
radio.1.low_txpower_mode=disabled&lt;br /&gt;
radio.1.mode=managed&lt;br /&gt;
radio.1.obey=enabled&lt;br /&gt;
radio.1.polling=enabled&lt;br /&gt;
radio.1.pollingnoack=0&lt;br /&gt;
radio.1.pollingpri=&lt;br /&gt;
radio.1.ptpmode=enabled&lt;br /&gt;
radio.1.reg_obey=enabled&lt;br /&gt;
radio.1.scanbw.status=enabled&lt;br /&gt;
radio.1.status=enabled&lt;br /&gt;
radio.1.txpower=25&lt;br /&gt;
resolv.nameserver.status=enabled&lt;br /&gt;
resolv.nameserver.1.status=disabled&lt;br /&gt;
resolv.nameserver.2.status=disabled&lt;br /&gt;
resolv.nameserver.3.status=disabled&lt;br /&gt;
resolv.nameserver.4.status=disabled&lt;br /&gt;
sshd.port=22&lt;br /&gt;
sshd.status=enabled&lt;br /&gt;
syslog.status=enabled&lt;br /&gt;
system.cfg.version=65547&lt;br /&gt;
users.status=enabled&lt;br /&gt;
users.1.name=Admin&lt;br /&gt;
users.1.password=$1$ufsU.X9B$hz....................&lt;br /&gt;
users.1.status=enabled&lt;br /&gt;
wireless.status=enabled&lt;br /&gt;
wireless.1.devname=ath0&lt;br /&gt;
wireless.1.hide_ssid=disabled&lt;br /&gt;
wireless.1.security.type=none&lt;br /&gt;
wireless.1.ssid=UbiBridge&lt;br /&gt;
wireless.1.status=enabled&lt;br /&gt;
wpasupplicant.device.1.devname=ath0&lt;br /&gt;
wpasupplicant.device.1.profile=AUTO&lt;br /&gt;
wpasupplicant.device.1.status=enabled&lt;br /&gt;
wpasupplicant.profile.1.name=AUTO&lt;br /&gt;
wpasupplicant.profile.1.network.1.eap.1.status=disabled&lt;br /&gt;
wpasupplicant.profile.1.network.1.key_mgmt.1.name=WPA-PSK&lt;br /&gt;
wpasupplicant.profile.1.network.1.pairwise.1.name=CCMP&lt;br /&gt;
wpasupplicant.profile.1.network.1.priority=100&lt;br /&gt;
wpasupplicant.profile.1.network.1.proto.1.name=RSN&lt;br /&gt;
wpasupplicant.profile.1.network.1.psk=&amp;lt;SSIDPW&amp;gt;!SSID&lt;br /&gt;
wpasupplicant.profile.1.network.1.ssid=UbiBridge&lt;br /&gt;
wpasupplicant.profile.1.network.1.status=enabled&lt;br /&gt;
wpasupplicant.profile.1.network.2.key_mgmt.1.name=NONE&lt;br /&gt;
wpasupplicant.profile.1.network.2.priority=2&lt;br /&gt;
wpasupplicant.profile.1.network.2.status=disabled&lt;br /&gt;
wpasupplicant.status=enabled&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Da ich die Bridge mit einer festen (statischen) IP betreiben moechte, musste ich sowieso wieder in die Konfiguration. Alles entsprechend abgeaendert. Nur den (Standard-)Benutzernamen ubnt konnte ich an dieser Stelle (noch) nicht aendern.   &lt;br /&gt;
&lt;br /&gt;
Dann mal alle drei Hauptmenues nach passenden Eintragungen absuchen.&lt;br /&gt;
&lt;br /&gt;
==DRAHTLOS==&lt;br /&gt;
*AccessPoint: Erst mal etwas verwirrend; damit legt man aber wohl fest, ob es sich bei dem Geraet um den AccessPoint oder um die Station handelt.&lt;br /&gt;
*PtP-Modus: Ja, ich will eine reine Point-to-Point-Verbindung&lt;br /&gt;
*SSID und Passwort vergeben&lt;br /&gt;
*Ausgangsleistung lasse ich erst mal auf Auto&lt;br /&gt;
*Erweitert -&amp;gt; EIRP-Limit (Germany) berechnen (Sagen wir mal besser aus Liste ermitteln; Da gibt es aber scheinbar noch Klaerungsbedarf [https://community.ui.com/questions/Usage-of-5Ghz-SRD-channels-in-Europe-Germany-wrong-allowed-power-settings/efda8b93-d52b-456a-8722-5dd0e616dafc])&lt;br /&gt;
&lt;br /&gt;
==NETZWERK==&lt;br /&gt;
*Netzwerk-Modus: Bridge (nicht Router)&lt;br /&gt;
*Management IP: DHCP (ware natuerlich auch statisch moeglich)&lt;br /&gt;
*VLAN: konfiguriere ich erst wenn die Bruecke steht&lt;br /&gt;
&lt;br /&gt;
==SYSTEM==&lt;br /&gt;
*Geraetenamen: NanoStation 5AC loco ergaenze ich durch ST (Station) oder AP (AccessPoint)&lt;br /&gt;
*Benutzername/Passswort&lt;br /&gt;
*Standort: lasse ich erst mal weg&lt;br /&gt;
&lt;br /&gt;
=FirstTest=&lt;br /&gt;
&lt;br /&gt;
[[Datei:NanoStationACloco Dashboard 1.png|mini]]&lt;br /&gt;
[[Datei:NanoStationACloco System Client 1.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Den AccessPoint habe ich statisch mit meinem 178er-Subnetz verbunden. Nach der Kontaktaufnahme mit der statisch zugewiesenen IP, ganz normal mit einem Browser aus dem Hausnetz, konnte ich mich mit dem AP verbinden und bin auf das Dashboard von airOS8 (Betriebssystem der NanoStation) gelandet.&lt;br /&gt;
&lt;br /&gt;
Bevor ich jetzt die Einstellungen ueber airOS8 weiter verfeinere, erst mal eine einfacher Netzwerktest &amp;quot;Client ueber Bruecke&amp;quot; ans &amp;quot;Hausnetz&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Topologie (Grafik folgt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Switch (Hausnetz) &amp;lt;-&amp;gt; Bridge AP (feste IP) &amp;lt;-&amp;gt; Bridge ST (DHCP) &amp;lt;-&amp;gt; Notebook (ueber LAN an Bridge ST)&lt;br /&gt;
&lt;br /&gt;
Bei bestehender Bridge erhaelt das Notebook eine IP aus dem Hausnetz. Auch die Bridge Station hat eine eigene IP (Management IP).&lt;br /&gt;
&lt;br /&gt;
Erst mal Firmware (airOS8) auf diese neueste Version updaten.&lt;br /&gt;
Nach dem Update von WA V8.7.9 Build 46843 nach WA V8.7.11 Build  46972 hat die Station keine Verbindung mehr mit der AP aufgenommen. Eine Verbindung mit der UISP-App ist fehlgeschlagen.&lt;br /&gt;
&lt;br /&gt;
=Second Test (Feldversuch)=&lt;br /&gt;
&lt;br /&gt;
Ich war mir an dieser Stelle kurz uneins, ob ich die AP-Seite oder die ST-Seite ans Hausnetz anschliesse. Ich habe jetzt die AP-Seite an der FritzBox und die ST-Seite am Hausnetz.&lt;br /&gt;
Beide haben zur Konfiguration eine eigene IP. Der AP statisch und die ST erst mal DHCP (spaeter auch statisch). Der AP haengt jetzt an einem Baum in Reichweite der FritzBox. Der HAK steht hinten im Grundstueck im Freien und stellt die Versorgung der Tiny-House-Siedlung sicher. Die ST haengt im Haus erst einmal unterm Dach. Die Verbindung klappte auf anhieb, auch durch die Betonziegel.&lt;br /&gt;
&lt;br /&gt;
Jetzt war die Anbindung der FritzBox an der Reihe. Hierzu habe ich den Weg ueber ssh auf den AP gewaehlt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
BridgeAdmin@192.168.178.200&#039;s password: &lt;br /&gt;
 ___  ___&lt;br /&gt;
|\  \|\  \      Welcome to airOS&lt;br /&gt;
\ \  \\\  \&lt;br /&gt;
 \ \  \\\  \    PRODUCT: NanoStation 5AC loco&lt;br /&gt;
  \ \  \\\  \   MAC: E43883CE6ED3&lt;br /&gt;
   \ \_______\&lt;br /&gt;
    \|_______|  VERSION: WA.v8.7.11&lt;br /&gt;
&lt;br /&gt;
********************************* NOTICE **********************************&lt;br /&gt;
* By logging in to, accessing, or using any Ubiquiti product, you are     *&lt;br /&gt;
* signifying that you have read our Terms of Service (ToS) and End User   *&lt;br /&gt;
* License Agreement (EULA), understand their terms, and agree to be       *&lt;br /&gt;
* fully bound to them. The use of CLI (Command Line Interface) can        *&lt;br /&gt;
* potentially harm Ubiquiti devices and result in lost access to them and *&lt;br /&gt;
* their data. By proceeding, you acknowledge that the use of CLI to       *&lt;br /&gt;
* modify device(s) outside of their normal operational scope, or in any   *&lt;br /&gt;
* manner inconsistent with the ToS or EULA, will permanently and          *&lt;br /&gt;
* irrevocably void any applicable warranty.                               *&lt;br /&gt;
***************************************************************************&lt;br /&gt;
&lt;br /&gt;
WA# uname -a&lt;br /&gt;
Linux NanoStation 5AC loco AP 2.6.32.68 #1 Tue Jun 14 04:26:27 EEST 2022 mips GNU/Linux&lt;br /&gt;
WA# ip a&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 16436 qdisc noqueue state UNKNOWN &lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000&lt;br /&gt;
    link/ether e4:38:83:cf:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
3: gre0: &amp;lt;NOARP&amp;gt; mtu 1476 qdisc noop state DOWN &lt;br /&gt;
    link/gre 0.0.0.0 brd 0.0.0.0&lt;br /&gt;
5: wifi1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN &lt;br /&gt;
    link/ieee802.11 e6:38:83:ce:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
6: teql0: &amp;lt;NOARP&amp;gt; mtu 1500 qdisc noop state DOWN qlen 100&lt;br /&gt;
    link/void &lt;br /&gt;
7: wifi0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 2286 qdisc noqueue state UNKNOWN &lt;br /&gt;
    link/ieee802.11 e4:38:83:ce:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
8: ath0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UNKNOWN qlen 1000&lt;br /&gt;
    link/ether e4:38:83:ce:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
9: ath1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN &lt;br /&gt;
    link/ether e6:38:83:ce:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 192.168.172.1/24 brd 192.168.172.255 scope global ath1&lt;br /&gt;
10: br0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN &lt;br /&gt;
    link/ether e4:38:83:ce:6e:d3 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 192.168.178.200/24 brd 192.168.178.255 scope global br0&lt;br /&gt;
    inet6 fe80::e638:83ff:fece:6ed3/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
WA# ip r&lt;br /&gt;
192.168.178.0/24 dev br0  proto kernel  scope link  src 192.168.178.200 &lt;br /&gt;
192.168.172.0/24 dev ath1  proto kernel  scope link  src 192.168.172.1 &lt;br /&gt;
default via 192.168.178.1 dev br0 &lt;br /&gt;
WA# &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Unifi&amp;diff=5213</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Unifi&amp;diff=5213"/>
		<updated>2026-07-31T15:53:50Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Unifi Controller=&lt;br /&gt;
&lt;br /&gt;
Zum Installieren unter openSuSE 15.3 habe ich folgenden Forumsschnippsel gefunden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
RPM&#039;s for UniFi Controller&lt;br /&gt;
&lt;br /&gt;
Hello&lt;br /&gt;
&lt;br /&gt;
I&#039;ve built RPM packages for UniFi 3.x&lt;br /&gt;
&lt;br /&gt;
Currently It&#039;s compatible with systemd-aware distros like:&lt;br /&gt;
&lt;br /&gt;
    OpenSuse 12.2 and newer&lt;br /&gt;
    Fedora 15 and newer&lt;br /&gt;
    RHEL 7&lt;br /&gt;
    CentOS 7&lt;br /&gt;
&lt;br /&gt;
A bit later I&#039;ll add support for systemv/upstart distros too (i.e. Centos/RHEL 6.x)&lt;br /&gt;
&lt;br /&gt;
rpm spec + systemd source files attached&lt;br /&gt;
&lt;br /&gt;
Short build howto for newbies:&lt;br /&gt;
&lt;br /&gt;
    Install rpm-build package Fedora/RHEL: yum install rpm-buildOpenSuse: zypper install rpm-build&lt;br /&gt;
    decompress and copy unifi.spec to ~/rpmbuild/SPECS/&lt;br /&gt;
    copy unifi.service to ~/rpmbuild/SOURCES/&lt;br /&gt;
    download UniFi.unix.zip and copy to ~/rpmbuild/SOURCES/&lt;br /&gt;
    change version string in unifi.spec to match the version of file downloaded&lt;br /&gt;
    run rpmbuild -bb ~/rpmbuild/unifi.spec&lt;br /&gt;
    built rpm package will be listed after process&lt;br /&gt;
&lt;br /&gt;
I will push updates to [https://github.com/GioMac/SPEC] My GitHub Account&lt;br /&gt;
&lt;br /&gt;
Feedback is appreciated&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quelle: https://community.ui.com/questions/RPMs-for-UniFi-Controller/fa7617f5-e534-42c5-a8c8-b295d4a47d4f&lt;br /&gt;
&lt;br /&gt;
https://github.com/GioMac/SPEC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/GioMac/SPEC/blob/master/unifi.spec&lt;br /&gt;
&lt;br /&gt;
https://github.com/GioMac/SPEC/blob/master/sources/unifi.service&lt;br /&gt;
&lt;br /&gt;
Die selbstgebauten RPMs waren mir aber noch nie so geheuer. Man weiß nie was drin steckt und bleibt oft auch bei Updates auf der Strecke.&lt;br /&gt;
Da der Unifi-Controller ein JAVA-Programm (ace.jar) ist sollte es mit dem Teufel zugehen wenn man das nicht zum Laufen bekommt.&lt;br /&gt;
&lt;br /&gt;
Selbst wenn ich mich entscheiden sollte, den Controller auf einem Debian-Winzling zu betreiben sind die beim steinigen Installationsweg gewonnen Erkenntnisse mit Sicherheit hilfreich.&lt;br /&gt;
&lt;br /&gt;
==Schritt 1==&lt;br /&gt;
Das Debian-Package von https://community.ui.com/releases/UniFi-Network-Controller-6-2-17/7f6d58bc-ce9f-43f2-8bc8-0c0dd935ebce herunterladen.&lt;br /&gt;
&lt;br /&gt;
==Schritt 2==&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
 alien -r unifi_sysvinit_all_6.2.17.deb&lt;br /&gt;
ein RPM daraus machen und mit&lt;br /&gt;
 rpm -i unifi-6.2.17_15282-2.noarch.rpm&lt;br /&gt;
installieren.&lt;br /&gt;
 Missing Depencies &lt;br /&gt;
&lt;br /&gt;
Grrrrrrrrrrrr, waere ja auch zu schoen gewesen.&lt;br /&gt;
Einige lieszen sich durch installieren der devel-Pakete aufloesen, aber die Fehlermeldung bezueglich libc ergibt keinen Sinn, also&lt;br /&gt;
 rpm -i --nodeps unifi-6.2.17_15282-2.noarch.rpm&lt;br /&gt;
&lt;br /&gt;
==Schritt3==&lt;br /&gt;
Java installieren. Der Unifi-Controller benötigt Java 8. Unter Opensuse 15.2/15.3:&lt;br /&gt;
 zypper in java-1_8_0-openjdk&lt;br /&gt;
==Schritt 4==&lt;br /&gt;
Der Unifi-Controller benötigt eine Insatllation der MongoDB. Da die MongoDB nicht in den Repos von SuSE enthalten ist, das Repo mit&lt;br /&gt;
 zypper ar https://repo.mongodb.org/zypper/suse/15/mongodb-org/4.4/x86_64/ MongoDB&lt;br /&gt;
einbinden und DB installieren&lt;br /&gt;
 zypper -n in monogodb-org&lt;br /&gt;
Und dann mal ganz waghalsig mit &lt;br /&gt;
 systemctl start mongod&lt;br /&gt;
starten und mit &lt;br /&gt;
 systemctl status mongod&lt;br /&gt;
kontrollieren. Er forked zwar bricht dann aber mit einer Fehlermeldung ab.&lt;br /&gt;
&lt;br /&gt;
Da der Unifi-Controller eh (nur) die MongoDB in der Version 3.6 unterstützt (Nachtraegliche Anmerkung: Ich weisz nicht woher ich diese Information hatte. Es wird natuerlich 3.6 bis 4.4 unterstuetzt. In meiner Docker-Variante habe ich Mongo 4.4 erfolgreich am Start.) habe ich die Version 4.4 wieder deinstalliert und mit diesem Repo&lt;br /&gt;
 zypper addrepo https://download.opensuse.org/repositories/openSUSE:infrastructure:monitoring/openSUSE_Leap_15.2/openSUSE:infrastructure:monitoring.repo&lt;br /&gt;
die Version 3.6 installiert.&lt;br /&gt;
 zypper refresh&lt;br /&gt;
 zypper in monogdb&lt;br /&gt;
 systemctl status mongodb&lt;br /&gt;
 systemctl enable mongodb&lt;br /&gt;
 systemctl start mongodb&lt;br /&gt;
Fehlermeldung!&lt;br /&gt;
 journalctl -xe&lt;br /&gt;
 tail -100 /var/log/mongodb/mongod.log&lt;br /&gt;
War aber leicht zu beheben. Der mongodb-user benötigt die Rechte auf sein Storage.&lt;br /&gt;
 chown -R mongodb.mongodb /var/run/mongodb/&lt;br /&gt;
&lt;br /&gt;
Aus irgendeinem Grund ist es mir allerdings zu diesem Zeitpunkt nicht gelungen, die Unifi-Network-Application (Unifi Controller) nativ aus meinem openSuse 15.3 zu installieren. Ich habe dann kurzer Hand die Docker-Variante gewaehlt und zum laufen gebracht. So richtig gefaellt mir diese Loesung aber auch nicht (siehe docker-firewalld-Problem). &lt;br /&gt;
&lt;br /&gt;
Hier kommt demnaechst noch die reine Inbetriebnahme der Unifi-Network-Application mit MongoDB4.4 rein. Jetzt geht&#039;s erst einmal im Beitrag [https://tippvomtibb.de/wiki/index.php?title=Ubiquiti_Unifi_Network_Application Ubiquiti Unifi Network Application] in der Docker-Variante weiter.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5212</id>
		<title>Insect Detect</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Insect_Detect&amp;diff=5212"/>
		<updated>2026-07-31T15:53:49Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Hier beschreibe ich die Umsetzung (erstmal nur Nachbau) des Projektes Insect Detect, zu finden auf [https://maxsitt.github.io/insect-detect-docs/ Github]&lt;br /&gt;
&lt;br /&gt;
Initiiert durch einen Kollegen, der im Rahmen seiner Taetigkeit beim [https://www.biosphaere-bliesgau.eu/ Biosphärenreservat Bliesgau] ein Projekt zur Erfassung von Insekten (Voegel, Fledermaeuse, ...) angestoszen hat, habe ich im ersten Schritt eine eigene (Hardware-)Variante des Projektes auf Github umgesetzt und werde dieses als Basis für zukünftige Adaptionen nutzen.&lt;br /&gt;
&lt;br /&gt;
=Stueckliste=&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2023&lt;br /&gt;
!colspan=&amp;quot;4&amp;quot;|Version 2024&lt;br /&gt;
|-&lt;br /&gt;
! Komponente&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
! Kosten (ca.)&lt;br /&gt;
! Full Setup&lt;br /&gt;
! Minimal Setup&lt;br /&gt;
! Test Setup&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| OAK-1 Auto-Focus (&#039;&#039;&#039;O&#039;&#039;&#039;penCV &#039;&#039;&#039;A&#039;&#039;&#039;I &#039;&#039;&#039;K&#039;&#039;&#039;it)&lt;br /&gt;
| 145,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 141,55 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Raspberry Pi Zero 2 W(H)&amp;lt;br&amp;gt; H=Header bereits aufgeloetet&lt;br /&gt;
| ~22,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| 21,90 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDXC card 256 GB&lt;br /&gt;
| 28,99 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24,95 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| Micro SDHC Card 32 GB&lt;br /&gt;
| 8,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter, angled&lt;br /&gt;
| 5,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Micro USB to USB A adapter&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| 1,85 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| USB A to micro USB cable, 20 cm, angled&lt;br /&gt;
| 5,60 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| RPi Power Supply&lt;br /&gt;
| 7,99 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi CPU Heatsink&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 1,20 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Header&lt;br /&gt;
| 0,95 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff9966&amp;quot;| RPi Stacking Header&lt;br /&gt;
| 1,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
| 2,12 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 10 mm&lt;br /&gt;
| 3,50 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| RPi Spacer Bolts 20 mm&lt;br /&gt;
| 2,60 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female-male (5 mm)&lt;br /&gt;
| 1,12 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Standoff M2.5, female*2 (11-12 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Screw M2.5 (5 mm)&lt;br /&gt;
| 1,92 €&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Thermal Pad (1 mm) 50x50 mm (optional)&lt;br /&gt;
| 4,79 €&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice Zero UPS pHAT&lt;br /&gt;
| 54,23 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| PiJuice 12,000mAh LiPo Battery&lt;br /&gt;
| 39,40 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Witty Pi 4 L3V7&lt;br /&gt;
| 28,56 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Li-Ion Battery Pack 3.7V (4400mAh)&lt;br /&gt;
| 14,24 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic V75 USB Battery Pack&lt;br /&gt;
| 101,14 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox PC 162513 Enclosure&lt;br /&gt;
| 89,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#66ff33&amp;quot;| Fibox TM 1625 Mounting Plate&lt;br /&gt;
| 7,49 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Gland PG 13.5 Locknut&lt;br /&gt;
| 0,27 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Stainless Steel Cable Tie&lt;br /&gt;
| 3,90 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Cable Tie Mount&lt;br /&gt;
| 0,99 €&lt;br /&gt;
| *&lt;br /&gt;
| 8&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Acrylic Glas (2 mm) 40x40 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| EPDM Sealing Strip 20x5 mm&lt;br /&gt;
| 6,25 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| Silica Gel Pack 50 g&lt;br /&gt;
| 15,99 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff3300&amp;quot;| Solar Panel 6V 9W&lt;br /&gt;
| 98,30 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Solar Panel Bracket, Medium (optional)&lt;br /&gt;
| 11,75 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Extension Cable, 1 ft&lt;br /&gt;
| ~7,00 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ff99cc&amp;quot;| Solar Panel Micro USB Adapter&lt;br /&gt;
| 3,88 €&lt;br /&gt;
| *&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#ffff66&amp;quot;| Voltaic 12,800mAh Li-Ion Battery&lt;br /&gt;
| 83,55 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#999966&amp;quot;| 2x Heatsink 40x30 mm (optional)&lt;br /&gt;
| 2,35 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| HPL Sheet (4 mm) 350x250 mm&lt;br /&gt;
| ~5,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Aluminium Square Tube (23.5x23.5 mm), 1.5 m&lt;br /&gt;
| ~16,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 4x M4 20 mm Screws (internal hexagon)&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 7x M4 40 mm Screws&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 2x M4 60 mm Screws&lt;br /&gt;
| ~2,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 21x M4 Hex Nuts&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| 18x Flat Washer (e.g. M4 15 mm)&lt;br /&gt;
| ~3,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 70 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 5,09 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#6699ff&amp;quot;| Pipe Clamp (60.3 mm) 350 mm + screws &amp;amp;amp; nuts&lt;br /&gt;
| 7,81 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor = &amp;quot;#339933&amp;quot;| Flower Platform (e.g. 350x200 mm)&lt;br /&gt;
| ~17,00 €&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Total cost&lt;br /&gt;
|&lt;br /&gt;
| ~704 €&lt;br /&gt;
| 531 €&lt;br /&gt;
| 187 €&lt;br /&gt;
|-&lt;br /&gt;
| Total cost with optional components&lt;br /&gt;
|&lt;br /&gt;
| ~730 €&lt;br /&gt;
| 547 €&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Legende&lt;br /&gt;
|colspan=&amp;quot;9&amp;quot;|&amp;lt;span style=&amp;quot;color: #ff9966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Hardware &amp;lt;span style=&amp;quot;color: #ff99cc;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Kabel/Adapter &amp;lt;span style=&amp;quot;color: #ffff66;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Akku &amp;lt;span style=&amp;quot;color: #66ff33;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Gehaeuse  &amp;lt;span style=&amp;quot;color: #6699ff;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Befestigungsmaterial &amp;lt;span style=&amp;quot;color: #ff3300;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Solar &amp;lt;span style=&amp;quot;color: #339933;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Platform &amp;lt;span style=&amp;quot;color: #999966;&amp;quot;&amp;gt;■&amp;lt;/span&amp;gt; Sonstiges/Zubehoer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Der Arbeitsablauf ist grob gesagt: Kamera (Luxonis) -&amp;gt; MicroPC (SBC Raspi (Zero)) -&amp;gt; PC (Linux, Win, Mac).&lt;br /&gt;
  &lt;br /&gt;
==Kamera==&lt;br /&gt;
&lt;br /&gt;
Der Kamera (OAK-1 von Luxonis) hat eine besondere Bedeutung, da sie als eine der wenigen (?) Kameras durch die eingebaute VPU (Vision/Visual/Video Processing Unit) Myriad X [https://www.intel.de/content/www/de/de/products/sku/125926/intel-movidius-myriad-x-vision-processing-unit-4gb/specifications.html] eine Vorverarbeitung (Object Detection) des Videomaterials durchfuehrt und der nachgeschalteten Einheit bereits fertige Trackingdaten zur Verfuegung stellt.&lt;br /&gt;
&lt;br /&gt;
==RasPi==&lt;br /&gt;
Zum Raspi Zero gibt es eigentlich nicht viel Neues zu sagen. &lt;br /&gt;
Bei der Wahl des USV-Moduls sollte man berueckichtigen, dass das PiJuice Zero UPS pHAT schwer oder gar nicht mehr zu beziehen ist.&lt;br /&gt;
&lt;br /&gt;
Da ich eines davon noch besitze hier eine kleine [https://www.makerspace-online.com/pijuice-hat/ Anleitung] zur Inbetriebnahme.&lt;br /&gt;
&lt;br /&gt;
Die IP-Adresse des Pi wird im LoginScreen (HDMI) angezeigt.&lt;br /&gt;
&lt;br /&gt;
Im Wesentlichen laufen hier 2 Programme.&lt;br /&gt;
&lt;br /&gt;
* Das Python Programm webapp.py, welches eine Webschnittstelle zum Pi herstellt. &lt;br /&gt;
&lt;br /&gt;
* Das Python Programm trigger_capture.py, welches die &amp;quot;Detections&amp;quot; als Dateien in einem Ordner ablegt.&lt;br /&gt;
&lt;br /&gt;
==Spannungsversorgung==&lt;br /&gt;
Im Dauerbetrieb wird auf der Insect Detect GithubSeite fuer den PiZero und die Kamera ein Energieverbrauch von ~88Wh pro 20 Stunden angegeben.&lt;br /&gt;
&lt;br /&gt;
Eine eigene Messung steht noch aus.&lt;br /&gt;
 &lt;br /&gt;
Das Ein- und Aus-Schalten funktioniert ueber einen LED-Button.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===PiJuice===&lt;br /&gt;
[https://www.makerspace-online.com/pijuice-hat/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Witty Pi 4 L3V7===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Akku===&lt;br /&gt;
&lt;br /&gt;
Voltaic V75 [https://voltaicsystems.com/v75/]&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Notebook==&lt;br /&gt;
&lt;br /&gt;
Zur Auswertung der gespeicherten Daten (jpg-captures und metadata.csv) von der SDCard des Raspi.&lt;br /&gt;
&lt;br /&gt;
Die Anforderungen an die Hardware:&lt;br /&gt;
* USB 3 &lt;br /&gt;
* Outdoor-Modell&lt;br /&gt;
* lange Akkulaufzeit&lt;br /&gt;
* LTE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
[[File:insect_detect_active_learning_loop.png|600px]][https://maxsitt.github.io/insect-detect-docs/#overview]&lt;br /&gt;
&lt;br /&gt;
Hier eine noch unsortierte Ansammlung der benutzten Befehle der ersten Gehversuche.&lt;br /&gt;
&lt;br /&gt;
chris@worker:~/YOLOv5-cls&amp;gt; python3.12 -m virtualenv env_yolov5&lt;br /&gt;
created virtual environment CPython3.12.11.final.0-64 in 207ms&lt;br /&gt;
  creator CPython3Posix(dest=/home/chris/YOLOv5-cls/env_yolov5, clear=False, no_vcs_ignore=False, global=False)&lt;br /&gt;
  seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/chris/.local/share/virtualenv)&lt;br /&gt;
    added seed packages: pip==25.2&lt;br /&gt;
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 python insect-detect-ml-main/process_images.py -source &amp;quot;InsectDetectFirstShot/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 yolov5-master/utils/dataloaders.py &lt;br /&gt;
&lt;br /&gt;
 python3.11 yolov5-master/classify/predict.py --name FirstShot --source &amp;quot;./InsectDetectFirstShot/2025-08-26_19-37-56-028066_TID2_crop_Schmetterling.jpg&amp;quot; --weights &amp;quot;insect-detect-ml-main/models/efficientnet-b0_imgsz128.onnx&amp;quot; --img 128 --sort-top1 --sort-prob --concat-csv --device cpu&lt;br /&gt;
&lt;br /&gt;
 python pytorchCUDAtest.py&lt;br /&gt;
&lt;br /&gt;
 jupyter notebook&lt;br /&gt;
&lt;br /&gt;
 python3.12 -m virtualenv env_yolov5&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
[https://community.hiveeyes.org/t/insect-detect-von-max-sittinger/4906]&lt;br /&gt;
&lt;br /&gt;
[https://insectactivitydetectionsystem.de/]&lt;br /&gt;
&lt;br /&gt;
=Comments=&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Zigbee&amp;diff=5211</id>
		<title>Zigbee</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Zigbee&amp;diff=5211"/>
		<updated>2026-07-31T15:53:43Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Erst war ich skeptisch, ob Zigbee das Richtige als Ergaenzung fuer mein EIB/KNX ist. Es gab tatsaechlich in meinem Haus einen Fall, bei dem die vorhandene Elektroinstallation es nicht erlaubte eine Leuchte direkt (ohne Kernbohrungdurch die Stahlbetondecke) an den KNX anzuschlieszen. WLAN fuer 230V-Schalter war fuer mich OK. &lt;br /&gt;
Die Datenerfassung von Temperatur, Praesenz, usw. per KNX war an vielen Stellen aber schlecht oder gar nicht moeglich. Neben WLAN habe ich jetzt noch ein Zigbee-Netz installiert.&lt;br /&gt;
&lt;br /&gt;
=Vorabueberlegungen=&lt;br /&gt;
* Matter ist keine Alternative. Es ist einfach noch nicht soweit.&lt;br /&gt;
* Ich brauche keine App-Unterstuetzung.&lt;br /&gt;
* Die Integration in Home Assistant soll nur ueber MQTT laufen.&lt;br /&gt;
&lt;br /&gt;
NB: HA zu einer Eierlegendenwollmilchsau zu machen halte ich fuer keine gute Idee. Das heiszt fuer mich so viel als geht in MQTT zentieren und in HA (oder FHEM) die Automation hinterlegen. ZHA ist ueberfluessig. Zigbee2MQTT im docker auf meinem Homeserver war die beste Wahl.&lt;br /&gt;
&lt;br /&gt;
=Startschwierigkeiten=&lt;br /&gt;
Nach der Installation von Zigbee2MQTT auf dem Homeserver habe ich auch eine Zigbee-Coordinator Anbindung über LAN probiert. Ich habe aber der USB-Stick Anbindung den Vorzug gegeben.&lt;br /&gt;
&lt;br /&gt;
Erst hatte ich den default Kanal 11 belassen, aber schnell festgestellt, dass die Zigbees gegen mein WLAN (6 APs im Haus verteilt) nicht angekommen (Verbindungsabbrueche).&lt;br /&gt;
&lt;br /&gt;
 Zigbee unbedingt Kanal 25 einstellen.&lt;br /&gt;
&lt;br /&gt;
Die zweite Huerde war, dass ich die notwendige Anzahl der Router unterschaetzt habe.&lt;br /&gt;
&lt;br /&gt;
 Nur steckerbetriebene Devices besitzen Routerfunktionalitaet. &lt;br /&gt;
&lt;br /&gt;
Das fuehrte dazu, dass ich 10 weitere Smartplugs installiert habe, einfach nur um das Netz zu stabilisieren.&lt;br /&gt;
&lt;br /&gt;
 Der durchschnittliche Abstand fuer ein stabiles Netz ist beim mir etwa 5 Meter.&lt;br /&gt;
&lt;br /&gt;
Was ich nervig finde ist, dass auf den Devices die IEEE-Address nicht abgedruckt ist. Ich habe schon nach den ersten 10 Devices (mittlerweile ueber 50) den Ueberblick verloren. Also alles auf Anfang und nach jedem Join direkt die IEEE-Address auf das Device geschrieben und gleich in Zigbee2MQTT den Installationsort in der Device-Beschreibung vermerkt.&lt;br /&gt;
&lt;br /&gt;
=HA Automation=&lt;br /&gt;
&lt;br /&gt;
HA ist zwar ganz nett, aber das unendliche Geklicke nur um einen Schalter mit einem Socket (Geraet) zu verbinden finde ich nervig.&lt;br /&gt;
&lt;br /&gt;
Was ich brauche ist schnell und einfach eine Verknuepfung Zigbee -&amp;gt; MQTT -&amp;gt; Zigbee/KNX  oder KNX -&amp;gt; MQTT -&amp;gt; Zigbee&lt;br /&gt;
&lt;br /&gt;
Um die Zigbee/MQTT Entitaeten anzusprechen benoetige ich zun Eintragen in die &#039;automation.yaml&#039; nur den entsprechenden Topic. Bei KNX habe ich noch keine einfachere Loesung gefunden als den &amp;quot;Umweg&amp;quot; ueber eine entity_id zur gehen. Hier mein erstes Testbeispiel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- id: &#039;1774891422778&#039;&lt;br /&gt;
  alias: Licht_indirekt&lt;br /&gt;
  description: &#039;&#039;&lt;br /&gt;
  triggers:&lt;br /&gt;
  - trigger: mqtt&lt;br /&gt;
    options:&lt;br /&gt;
      topic: zigbee2mqtt/0x00124b002919efa7&lt;br /&gt;
  conditions:&lt;br /&gt;
  - condition: template&lt;br /&gt;
    value_template: &#039;{{ trigger.payload_json.action == &#039;&#039;single&#039;&#039; }}&#039;&lt;br /&gt;
  actions:&lt;br /&gt;
  - action: light.toggle&lt;br /&gt;
    metadata: {}&lt;br /&gt;
    data: {}&lt;br /&gt;
    target:&lt;br /&gt;
      entity_id: light.ug_r8_hobby_licht_indirekt&lt;br /&gt;
  mode: single&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In dem Automationen-GUI wird der Eintrag in 3 Portionen angeboten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sobald&#039;&#039;&#039; (triggers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trigger: mqtt&lt;br /&gt;
options:&lt;br /&gt;
  topic: zigbee2mqtt/0x00124b002919efa7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Und wenn&#039;&#039;&#039; (conditions)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
condition: template&lt;br /&gt;
value_template: &amp;quot;{{ trigger.payload_json.action == &#039;single&#039; }}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dann&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
action: light.toggle&lt;br /&gt;
metadata: {}&lt;br /&gt;
data: {}&lt;br /&gt;
target:&lt;br /&gt;
  entity_id: light.ug_r8_hobby_licht_indirekt &amp;lt;- KNX.Entity&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eine Unique_ID kann man nicht selbst vergeben! [https://www.home-assistant.io/faq/unique_id]&lt;br /&gt;
&lt;br /&gt;
Um eine KNX-Gruppenadresse anzusprechen muss/sollte eine Entitaet (in der KNX YAML) angelegt sein.&lt;br /&gt;
Dann kann sie ueber die entity_id angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel Licht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;knx:&lt;br /&gt;
  light:&lt;br /&gt;
    - name: Wohnzimmer Licht&lt;br /&gt;
      address: &amp;quot;1/2/3&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
danach existiert die Entity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;light.wohnzimmer_licht&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.h. der Entity-Name ergibt sich aus dem Namen in LowerCase und Unterstrichen.&lt;br /&gt;
&lt;br /&gt;
Eine schnelle Loesung zum Testen geht auch mit:&lt;br /&gt;
&lt;br /&gt;
= Alternative: KNX direkt per Service ansprechen =&lt;br /&gt;
&lt;br /&gt;
ohne vorher eine Entity anzulegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;action:&lt;br /&gt;
  - service: knx.send&lt;br /&gt;
    data:&lt;br /&gt;
      address: &amp;quot;1/2/3&amp;quot;&lt;br /&gt;
      payload: true&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
oder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;action:&lt;br /&gt;
  - service: knx.send&lt;br /&gt;
    data:&lt;br /&gt;
      address: &amp;quot;1/2/3&amp;quot;&lt;br /&gt;
      payload: 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-dimmwert-senden&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel Dimmwert senden =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;action:&lt;br /&gt;
  - service: knx.send&lt;br /&gt;
    data:&lt;br /&gt;
      address: &amp;quot;1/2/5&amp;quot;&lt;br /&gt;
      payload: 50&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=HA &amp;quot;Programmierung&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
Bei **Home Assistant** kannst du die `configuration.yaml` **nicht komplett per CLI neu laden**, aber du kannst:&lt;br /&gt;
&lt;br /&gt;
* die Konfiguration prüfen&lt;br /&gt;
* Home Assistant neu starten&lt;br /&gt;
* einzelne YAML-Bereiche neu laden&lt;br /&gt;
&lt;br /&gt;
Hier sind die relevanten Befehle.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 1. Konfiguration prüfen (ohne Neustart)&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha core check&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
prüft die `configuration.yaml` auf Fehler.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 2. komplette Konfiguration neu laden (Neustart)&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha core restart&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
lädt die gesamte YAML neu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 3. nur YAML neu laden (ohne Neustart)&lt;br /&gt;
&lt;br /&gt;
nicht alles kann hot-reload, aber viele Bereiche schon:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha core reload&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
lädt unterstützte YAML-Komponenten neu.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 4. nur MQTT neu laden&lt;br /&gt;
&lt;br /&gt;
wenn du MQTT Entities geändert hast:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha mqtt reload&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 5. Alternative über Service Call&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha service call homeassistant.reload_core_config&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
oder z. B.:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha service call mqtt.reload&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 6. wenn du Home Assistant Container nutzt&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
docker restart homeassistant&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# typische Nutzung&lt;br /&gt;
&lt;br /&gt;
nach Änderung:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ha core check&lt;br /&gt;
ha core restart&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# Übersicht&lt;br /&gt;
&lt;br /&gt;
| Zweck             | Befehl          |&lt;br /&gt;
| ----------------- | --------------- |&lt;br /&gt;
| config prüfen     | ha core check   |&lt;br /&gt;
| alles neu laden   | ha core restart |&lt;br /&gt;
| teilweises reload | ha core reload  |&lt;br /&gt;
| mqtt reload       | ha mqtt reload  |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
wenn du möchtest, kann ich dir auch zeigen:&lt;br /&gt;
&lt;br /&gt;
* welche YAML Teile ohne Neustart reloadbar sind&lt;br /&gt;
* wie man YAML Fehler schneller findet&lt;br /&gt;
* wie man config automatisch prüfen lässt&lt;br /&gt;
&lt;br /&gt;
=KNX Geraete Verwirrung=&lt;br /&gt;
&lt;br /&gt;
In Home Assistant bilden &#039;&#039;&#039;Integration, Geraet und Entitaet&#039;&#039;&#039; eine Hierarchie. Der Unterschied ist wichtig, weil viele Einstellungen davon abhaengen.&lt;br /&gt;
&lt;br /&gt;
Kurz gesagt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Integration → Gerät → Entität&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=1 Integration =&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Integration&#039;&#039;&#039; ist die Schnittstelle zu einem System oder Protokoll.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* MQTT&lt;br /&gt;
* KNX&lt;br /&gt;
* Zigbee&lt;br /&gt;
* Zigbee2MQTT&lt;br /&gt;
* ZHA&lt;br /&gt;
* Philips Hue&lt;br /&gt;
&lt;br /&gt;
Eine Integration:&lt;br /&gt;
&lt;br /&gt;
* stellt Verbindung her&lt;br /&gt;
* organisiert Kommunikation&lt;br /&gt;
* erzeugt Geräte und Entitäten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gerät-device&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=2 Geraet (Device) =&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Gerät&#039;&#039;&#039; ist ein physisches oder logisches Gerät im System.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Zigbee Temperatursensor&lt;br /&gt;
* KNX Aktor&lt;br /&gt;
* WLAN Steckdose&lt;br /&gt;
* Kamera&lt;br /&gt;
&lt;br /&gt;
Ein Gerät kann mehrere Funktionen haben.&lt;br /&gt;
&lt;br /&gt;
Beispiel Zigbee Sensor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Gerät:&lt;br /&gt;
Temperatursensor Wohnzimmer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eigenschaften:&lt;br /&gt;
&lt;br /&gt;
* Hersteller&lt;br /&gt;
* Modell&lt;br /&gt;
* Firmware&lt;br /&gt;
* Verbindung (z. B. Zigbee Router)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entität-entity&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=3 Entität (Entity) =&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;Entität&#039;&#039;&#039; ist der einzelne messbare oder steuerbare Wert.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;sensor.wohnzimmer_temperatur&lt;br /&gt;
sensor.wohnzimmer_luftfeuchte&lt;br /&gt;
sensor.wohnzimmer_batterie&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alle gehören zum selben Gerät.&lt;br /&gt;
&lt;br /&gt;
Eine Entität hat:&lt;br /&gt;
&lt;br /&gt;
* Zustand (state)&lt;br /&gt;
* Attribute&lt;br /&gt;
* Einheit&lt;br /&gt;
* device_class&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-komplett&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel komplett =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zigbee-multisensor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zigbee Multisensor ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Integration ===&lt;br /&gt;
&lt;br /&gt;
Zigbee2MQTT&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gerät&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Gerät ===&lt;br /&gt;
&lt;br /&gt;
Multisensor Wohnzimmer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entitäten&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Entitäten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;sensor.wohnzimmer_temperatur&lt;br /&gt;
sensor.wohnzimmer_luftfeuchte&lt;br /&gt;
sensor.wohnzimmer_batterie&lt;br /&gt;
binary_sensor.wohnzimmer_bewegung&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-knx-aktor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel KNX Aktor =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Integration ===&lt;br /&gt;
&lt;br /&gt;
KNX&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gerät-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Gerät ===&lt;br /&gt;
&lt;br /&gt;
Schaltaktor Flur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entitäten-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Entitäten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;switch.flur_licht&lt;br /&gt;
sensor.flur_strom&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;darstellung-im-home-assistant-ui&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Darstellung im Home Assistant UI =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;integration-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Integration ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Einstellungen → Geräte &amp;amp; Dienste&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;geräte&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Geräte ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Geräteseite mit Eigenschaften&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;entitäten-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Entitäten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;einzelne steuerbare Objekte&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merksatz&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Merksatz =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Integration&#039;&#039;&#039; = Verbindung zum System&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gerät&#039;&#039;&#039; = physisches Objekt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entität&#039;&#039;&#039; = einzelne Funktion oder Messwert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;typische-verwechslung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Typische Verwechselung =&lt;br /&gt;
&lt;br /&gt;
Viele denken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Gerät = Entität&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das stimmt nicht.&lt;br /&gt;
&lt;br /&gt;
Ein Geraet enthält meist mehrere Entitaeten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
= Beispiel aus der Praxis =&lt;br /&gt;
&lt;br /&gt;
Steckdose mit Messfunktion:&lt;br /&gt;
&lt;br /&gt;
Gerät:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Zigbee Steckdose Küche&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Entitäten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;switch.steckdose_kueche&lt;br /&gt;
sensor.stromverbrauch_kueche&lt;br /&gt;
sensor.spannung_kueche&lt;br /&gt;
sensor.energie_kueche&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;warum-das-wichtig-ist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Warum das wichtig ist =&lt;br /&gt;
&lt;br /&gt;
Unterschied relevant für:&lt;br /&gt;
&lt;br /&gt;
* Automationen&lt;br /&gt;
* Dashboard&lt;br /&gt;
* Geräteverwaltung&lt;br /&gt;
* Diagnose&lt;br /&gt;
* Gruppierung&lt;br /&gt;
&lt;br /&gt;
Automationen arbeiten meist mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Entitäten&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Wenn du möchtest, kann ich dir auch zeigen:&lt;br /&gt;
&lt;br /&gt;
* wie Entitäten intern aufgebaut sind&lt;br /&gt;
* wie entity_id entsteht&lt;br /&gt;
* wann Home Assistant kein Gerät erzeugt&lt;br /&gt;
* warum MQTT oft nur Entitäten ohne Gerät erzeugt&lt;br /&gt;
&lt;br /&gt;
Bei &#039;&#039;&#039;KNX&#039;&#039;&#039; und &#039;&#039;&#039;Home Assistant&#039;&#039;&#039; treffen zwei unterschiedliche Konzepte aufeinander:&lt;br /&gt;
&lt;br /&gt;
* KNX ist &#039;&#039;&#039;telegramm- und funktionsorientiert&#039;&#039;&#039;&lt;br /&gt;
* Home Assistant ist &#039;&#039;&#039;geräte- und entitätsorientiert&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dadurch entsteht oft Verwirrung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gesamtübersicht&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Gesamtübersicht =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;KNX Welt                         Home Assistant Welt&lt;br /&gt;
------------------------------------------------------------&lt;br /&gt;
physikalische Adresse  →        Gerät (Device)&lt;br /&gt;
Gruppenadresse         →        Entität (Entity)&lt;br /&gt;
Funktion im Aktor      →        Entität (Entity)&lt;br /&gt;
KNX Busgerät           →        Gerät (Device)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;physikalische-adresse-knx&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Physikalische Adresse (KNX) =&lt;br /&gt;
&lt;br /&gt;
Die physikalische Adresse identifiziert ein &#039;&#039;&#039;konkretes KNX-Gerät im Bus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Bereich.Linie.Teilnehmer&lt;br /&gt;
z. B.&lt;br /&gt;
1.1.15&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eigenschaften:&lt;br /&gt;
&lt;br /&gt;
* eindeutig im KNX Bus&lt;br /&gt;
* gehört zu einem realen Gerät&lt;br /&gt;
* wird für Programmierung und Diagnose verwendet&lt;br /&gt;
* wird normalerweise &#039;&#039;&#039;nicht direkt in Home Assistant genutzt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1.1.20 = KNX Schaltaktor im Schaltschrank&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gruppenadresse-knx&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Gruppenadresse (KNX) =&lt;br /&gt;
&lt;br /&gt;
Die Gruppenadresse ist die wichtigste Adresse für die Funktion.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Hauptgruppe/Mittelgruppe/Untergruppe&lt;br /&gt;
z. B.&lt;br /&gt;
1/2/10&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sie beschreibt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Funktion&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;26&amp;quot; style=&amp;quot;list-style-type: lower-alpha;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;B.:&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1/2/10 = Licht Wohnzimmer EIN/AUS&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
KNX arbeitet primär über Gruppenadressen.&lt;br /&gt;
&lt;br /&gt;
Mehrere Geräte können dieselbe Gruppenadresse verwenden:&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
* Taster sendet&lt;br /&gt;
* Aktor empfängt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gerät-home-assistant&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Geraet (Home Assistant) =&lt;br /&gt;
&lt;br /&gt;
Ein Geraet ist die Zusammenfassung von Funktionen eines realen Geräts.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;KNX Schaltaktor 8-fach&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
enthält mehrere Kanäle:&lt;br /&gt;
&lt;br /&gt;
* Kanal A&lt;br /&gt;
* Kanal B&lt;br /&gt;
* Kanal C&lt;br /&gt;
&lt;br /&gt;
In HA:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Gerät = KNX Aktor&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entität-home-assistant&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= 4️⃣ Entitaet (Home Assistant) =&lt;br /&gt;
&lt;br /&gt;
Jede Funktion eines KNX-Geräts wird eine Entität.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;switch.licht_wohnzimmer&lt;br /&gt;
light.kueche&lt;br /&gt;
cover.rollladen_buero&lt;br /&gt;
sensor.temperatur_bad&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Jede Entität verwendet eine oder mehrere Gruppenadressen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-knx-schaltaktor-4-fach&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel KNX Schaltaktor 4-fach =&lt;br /&gt;
&lt;br /&gt;
KNX:&lt;br /&gt;
&lt;br /&gt;
physikalische Adresse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1.1.20&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Gruppenadressen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1/1/1  Licht Küche&lt;br /&gt;
1/1/2  Licht Flur&lt;br /&gt;
1/1/3  Licht Bad&lt;br /&gt;
1/1/4  Licht Büro&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Home Assistant:&lt;br /&gt;
&lt;br /&gt;
Gerät:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;KNX Aktor 4fach&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Entitäten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;switch.licht_kueche&lt;br /&gt;
switch.licht_flur&lt;br /&gt;
switch.licht_bad&lt;br /&gt;
switch.licht_buero&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-configuration.yaml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel configuration.yaml =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;knx:&lt;br /&gt;
  switch:&lt;br /&gt;
    - name: licht_kueche&lt;br /&gt;
      address: &amp;quot;1/1/1&amp;quot;&lt;br /&gt;
      state_address: &amp;quot;1/1/101&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    - name: licht_flur&lt;br /&gt;
      address: &amp;quot;1/1/2&amp;quot;&lt;br /&gt;
      state_address: &amp;quot;1/1/102&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beziehung-im-detail&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beziehung im Detail =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;physikalische-adresse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== physikalische Adresse ==&lt;br /&gt;
&lt;br /&gt;
identifiziert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Hardware-Gerät im KNX Bus&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird hauptsächlich genutzt für:&lt;br /&gt;
&lt;br /&gt;
* ETS Programmierung&lt;br /&gt;
* Diagnose&lt;br /&gt;
* Busmanagement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gruppenadresse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Gruppenadresse ==&lt;br /&gt;
&lt;br /&gt;
definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Funktion im Gebäude&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;26&amp;quot; style=&amp;quot;list-style-type: lower-alpha;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;B.:&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Licht schalten&lt;br /&gt;
* Dimmen&lt;br /&gt;
* Temperatur messen&lt;br /&gt;
* Jalousie fahren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;entität&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Entität ==&lt;br /&gt;
&lt;br /&gt;
repräsentiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;eine Funktion als Objekt in Home Assistant&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wichtig-zu-verstehen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Wichtig zu verstehen =&lt;br /&gt;
&lt;br /&gt;
Home Assistant kennt normalerweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;Gruppenadresse&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aber nicht zwingend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;physikalische Adresse&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
HA arbeitet funktionsorientiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-taster&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Beispiel Taster =&lt;br /&gt;
&lt;br /&gt;
KNX:&lt;br /&gt;
&lt;br /&gt;
physikalische Adresse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1.1.10&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sendet Gruppenadresse:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;1/1/1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Home Assistant:&lt;br /&gt;
&lt;br /&gt;
keine eigene Entität notwendig, da der Aktor reagiert.&lt;br /&gt;
&lt;br /&gt;
Optional:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;binary_sensor.taster_wohnzimmer&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wenn Status gewünscht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sonderfall-mehrere-gruppenadressen-pro-entität&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Sonderfall: mehrere Gruppenadressen pro Entität =&lt;br /&gt;
&lt;br /&gt;
Dimmer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;knx:&lt;br /&gt;
  light:&lt;br /&gt;
    - name: wohnzimmer&lt;br /&gt;
      address: &amp;quot;1/2/1&amp;quot;&lt;br /&gt;
      state_address: &amp;quot;1/2/2&amp;quot;&lt;br /&gt;
      brightness_address: &amp;quot;1/2/3&amp;quot;&lt;br /&gt;
      brightness_state_address: &amp;quot;1/2/4&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Eine Entität nutzt mehrere Gruppenadressen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;merkschema&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Merkschema =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;physikalische Adresse&lt;br /&gt;
= KNX Hardware Adresse&lt;br /&gt;
&lt;br /&gt;
Gruppenadresse&lt;br /&gt;
= KNX Funktion&lt;br /&gt;
&lt;br /&gt;
Gerät&lt;br /&gt;
= KNX Gerät logisch zusammengefasst&lt;br /&gt;
&lt;br /&gt;
Entität&lt;br /&gt;
= einzelne Funktion eines Geräts&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;praxisregel&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Praxisregel =&lt;br /&gt;
&lt;br /&gt;
Wenn du in Home Assistant arbeitest:&lt;br /&gt;
&lt;br /&gt;
→ du brauchst meist nur die Gruppenadresse&lt;br /&gt;
&lt;br /&gt;
die physikalische Adresse ist nur relevant für:&lt;br /&gt;
&lt;br /&gt;
* ETS&lt;br /&gt;
* Diagnose&lt;br /&gt;
* Busstruktur&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=X_Server&amp;diff=5210</id>
		<title>X Server</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=X_Server&amp;diff=5210"/>
		<updated>2026-07-31T15:53:42Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Problem=&lt;br /&gt;
&lt;br /&gt;
Habe gerade das Problem, dass ein Rechner mit einer NVIDIA GTX1050Ti (2 DVI, 1 HDMI, 1 DP) an der nur an HDMI ein Monitor angeschlossen ist, nach einem Bildschirm-TimeOut die Ausgabe nicht auf HDMI aktiviert. Ein Ausstecken und wieder Einstecken aktiviert den Motor wieder. Auf Dauer ist da aber keine Loesung.&lt;br /&gt;
Wenn ich mich mit SSH auf den Rechner einlogge, quittiert xrandr zum Umschalten/Einschalten des Displays allerdings die Eingabe mit einem &amp;quot;Can&#039;t open DISPLAY&amp;quot;. Das gleiche Problem hatte ich vor Jahren schon mal mit ferngesteuerten Schwarzen Brettern (Signature Displays). &lt;br /&gt;
Ich kann mich nur noch dunkel an die Loesung erinnern, deshalb hier ein paar Gedankenstuetzen.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Problem, beim Betrieb von mehreren Monitoren, habe ich [https://tippvomtibb.de/wiki/index.php?title=Grafikkarte_mehrere_Monitore hier] beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Loesungshinweise=&lt;br /&gt;
&lt;br /&gt;
* Der Login ueber SSH muss/sollte mit dem gleichen Benutzer erfolgen unter dem der X-Server laeuft.&lt;br /&gt;
* Den Befehlen wird/kann ein DISPLAY=:0.0 vorangestellt/werden. Dazu unten mehr.&lt;br /&gt;
&lt;br /&gt;
Erst mal herausfinden welche Screens oder Display gibt es denn ueberhaupt.&lt;br /&gt;
&lt;br /&gt;
 worker:/home/chris # export |grep DISP&lt;br /&gt;
 declare -x DISPLAY=&amp;quot;:0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 worker:/home/chris # export |grep XAUTH&lt;br /&gt;
 declare -x XAUTHLOCALHOSTNAME=&amp;quot;worker&amp;quot;&lt;br /&gt;
 declare -x XAUTHORITY=&amp;quot;/root/.xauthzQiHUM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 chris@worker:~&amp;gt; ps axu |grep X&lt;br /&gt;
 root      2471  0.0  0.2 6886860 279712 tty2   Ssl+ Nov27   2:58 /usr/bin/X -nolisten tcp -background none -seat seat0 vt2 -auth /run/sddm/xauth_qnDYsZ -noreset -displayfd 16&lt;br /&gt;
&lt;br /&gt;
 chris@server:/root&amp;gt; ps axu |grep X&lt;br /&gt;
 root      9204  0.3  0.4 25577276 225592 tty7  Ssl+ Nov26  12:46 /usr/bin/X -nolisten tcp -auth /run/sddm/{e639dd90-50a8-4714-847c-c0f83977379d} -background none -noreset -displayfd 17 -seat seat0 vt7&lt;br /&gt;
&lt;br /&gt;
Interessanterweise laeuft bei meinem Arbeitsplatzrechner (openSUSE 15.6) das virtuelle Terminal unter tty2, bisher war es standardmaeszig tty7.&lt;br /&gt;
&lt;br /&gt;
Programme, die etwas mit X(Xorg) zu tun haben.&lt;br /&gt;
 X(7), Xserver(1), xdm(1), xinit(1), xorg.conf(5), xvidtune(1), xkeyboard-config (7), apm(4), ati(4), chips(4), cirrus(4), cyrix(4), fbdev(4), glide(4), glint(4), i128(4), i740(4), imstt(4), intel(4),  mga(4),  neo-magic(4),  nsc(4),  nv(4),  openchrome  (4),  r128(4),  rendition(4), s3virge(4), siliconmotion(4), sis(4), sunbw2(4), suncg14(4), suncg3(4), suncg6(4), sunffb(4), sunleo(4), suntcx(4), tdfx(4), tga(4), trident(4), tseng(4), v4l(4), vesa(4), vmware(4)&lt;br /&gt;
&lt;br /&gt;
Die DISPLAY-Variable hat die Form H:D.S&lt;br /&gt;
&lt;br /&gt;
* Hostname default localhost, bzw. Socket&lt;br /&gt;
* Display&lt;br /&gt;
* Screen&lt;br /&gt;
&lt;br /&gt;
 Ein Display bezeichnet die gesamte Anzeigeumgebung, die durch einen X11-Server verwaltet wird. Ein X11-Server kann mehrere Displays unterstützen, die auf verschiedenen physikalischen Geräten oder auf verschiedenen Monitoren eines Systems laufen.&lt;br /&gt;
Ein Display besteht in der Regel aus einer Kombination von Hardware (Monitoren, Grafikkarten) und Software (dem X11-Server), die zusammen eine grafische Oberfläche bieten.&lt;br /&gt;
&lt;br /&gt;
 Ein Screen ist ein einzelner virtueller Monitor innerhalb eines Displays, der auf mehrere physikalische Monitore aufgeteilt sein kann.  &lt;br /&gt;
&lt;br /&gt;
Da es in der Regel nur ein Display und einen Screen gibt, wird die DISPLAY-Variable verkuerzt mit :0 angegeben.&lt;br /&gt;
&lt;br /&gt;
 declare -x DISPLAY=&amp;quot;:0&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Folgender Befehl listet die aktiven Screens, Displays auf.&lt;br /&gt;
&lt;br /&gt;
 cd /tmp/.X11-unix &amp;amp;&amp;amp; for x in X*; do echo &amp;quot;:${x#X}&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
Das echo platziert noch einen Doppelpunkt davor und #X formatiert noch. [https://www.gnu.org/software/bash/manual/bash.html#Special-Parameters]&lt;br /&gt;
&lt;br /&gt;
Dieses kleine Bash-Script listet alle Screen-Sockets im Verzeichnis /tmp/.x11-unix auf. &lt;br /&gt;
&lt;br /&gt;
 chris@server:/tmp/.X11-unix&amp;gt; ll X*&lt;br /&gt;
 srwxrwxrwx 1 root root 0 Nov 26 20:40 X0&lt;br /&gt;
&lt;br /&gt;
xdpyinfo scheint der richtige Weg zu sein.&lt;br /&gt;
&lt;br /&gt;
 chris@worker:/tmp/.X11-unix&amp;gt; xdpyinfo | grep -A4 &#039;^screen&#039;&lt;br /&gt;
 screen #0:&lt;br /&gt;
  dimensions:    7680x2160 pixels (1227x352 millimeters)&lt;br /&gt;
  resolution:    159x156 dots per inch&lt;br /&gt;
  depths (7):    24, 1, 4, 8, 15, 16, 32&lt;br /&gt;
  root window id:    0x23f&lt;br /&gt;
&lt;br /&gt;
Mit inxi -Ga erhaelt man noch mehr Klarheit, obwohl das ssh-Terminal im Gegensatz zum lokalen Terminal, die Screens nicht anzeigt.&lt;br /&gt;
&lt;br /&gt;
server:/etc/X11 # inxi -Ga&lt;br /&gt;
&lt;br /&gt;
 Graphics:&lt;br /&gt;
  Device-1: NVIDIA GP107 [GeForce GTX 1050 Ti] vendor: ASUSTeK driver: nvidia&lt;br /&gt;
    v: 550.135 alternate: nouveau,nvidia_drm non-free: 530.xx+&lt;br /&gt;
    status: current (as of 2023-05) arch: Pascal code: GP10x&lt;br /&gt;
    process: TSMC 16nm built: 2016-21 pcie: gen: 1 speed: 2.5 GT/s lanes: 16&lt;br /&gt;
    link-max: gen: 2 speed: 5 GT/s ports: active: none off: DP-1,HDMI-A-1&lt;br /&gt;
    empty: DVI-D-1,DVI-D-2 bus-ID: 0f:00.0 chip-ID: 10de:1c82 class-ID: 0300&lt;br /&gt;
  Display: server: X.Org v: 1.21.1.11 with: Xwayland v: 24.1.1&lt;br /&gt;
    compositor: kwin_x11 driver: X: loaded: nvidia gpu: nvidia,nvidia-nvswitch&lt;br /&gt;
    display-ID: :0 screens: 3 default screen: 0&lt;br /&gt;
  Screen-1: 0 s-res: 1920x1080 s-dpi: 93 s-size: 524x292mm (20.63x11.50&amp;quot;)&lt;br /&gt;
    s-diag: 600mm (23.62&amp;quot;)&lt;br /&gt;
  Monitor-1: DP-1 note: disabled pos: primary&lt;br /&gt;
    model: HannSpree/HannStar HE247DPB serial: 123456789XXXX built: 2012&lt;br /&gt;
    res: 1920x1080 hz: 60 dpi: 94 gamma: 1.2 size: 521x293mm (20.51x11.54&amp;quot;)&lt;br /&gt;
    diag: 598mm (23.5&amp;quot;) ratio: 16:9 modes: max: 1920x1080 min: 640x480&lt;br /&gt;
  Monitor-2: HDMI-A-1 mapped: DVI-D-1 note: disabled model: Sony TV&lt;br /&gt;
    serial: 168XXXXX built: 2007 res: 1920x1080 dpi: 30 gamma: 1.2&lt;br /&gt;
    size: 1600x900mm (62.99x35.43&amp;quot;) diag: 1836mm (72.3&amp;quot;) ratio: 16:9 modes:&lt;br /&gt;
    max: 1920x1080 min: 640x480&lt;br /&gt;
  Screen-2: 1 s-res: 1920x1080 s-dpi: 30 s-size: 1626x914mm (64.02x35.98&amp;quot;)&lt;br /&gt;
    s-diag: 1865mm (73.44&amp;quot;)&lt;br /&gt;
  Screen-3: 2 s-res: 640x480 s-dpi: 75 s-size: 217x163mm (8.54x6.42&amp;quot;)&lt;br /&gt;
    s-diag: 271mm (10.69&amp;quot;)&lt;br /&gt;
  API: OpenGL v: 4.6.0 NVIDIA 550.135 renderer: NVIDIA GeForce GTX 1050&lt;br /&gt;
    Ti/PCIe/SSE2 direct-render: Yes  &lt;br /&gt;
&lt;br /&gt;
Die Kernelmodul-Parameter sind bei mir z.B. auf dem Server (GTX1050Ti) und dem Worker (Quadro M2000)identisch.&lt;br /&gt;
&lt;br /&gt;
 chris@server:~&amp;gt; cat /proc/driver/nvidia/params&lt;br /&gt;
 ResmanDebugLevel: 4294967295&lt;br /&gt;
 RmLogonRC: 1&lt;br /&gt;
 ModifyDeviceFiles: 1&lt;br /&gt;
 DeviceFileUID: 0&lt;br /&gt;
 DeviceFileGID: 483&lt;br /&gt;
 DeviceFileMode: 432&lt;br /&gt;
 InitializeSystemMemoryAllocations: 1&lt;br /&gt;
 UsePageAttributeTable: 4294967295&lt;br /&gt;
 EnableMSI: 1&lt;br /&gt;
 EnablePCIeGen3: 0&lt;br /&gt;
 MemoryPoolSize: 0&lt;br /&gt;
 KMallocHeapMaxSize: 0&lt;br /&gt;
 VMallocHeapMaxSize: 0&lt;br /&gt;
 IgnoreMMIOCheck: 0&lt;br /&gt;
 TCEBypassMode: 0&lt;br /&gt;
 EnableStreamMemOPs: 0&lt;br /&gt;
 EnableUserNUMAManagement: 1&lt;br /&gt;
 NvLinkDisable: 0&lt;br /&gt;
 RmProfilingAdminOnly: 1&lt;br /&gt;
 PreserveVideoMemoryAllocations: 1&lt;br /&gt;
 EnableS0ixPowerManagement: 0&lt;br /&gt;
 S0ixPowerManagementVideoMemoryThreshold: 256&lt;br /&gt;
 DynamicPowerManagement: 3&lt;br /&gt;
 DynamicPowerManagementVideoMemoryThreshold: 200&lt;br /&gt;
 RegisterPCIDriver: 1&lt;br /&gt;
 EnablePCIERelaxedOrderingMode: 0&lt;br /&gt;
 EnableResizableBar: 0&lt;br /&gt;
 EnableGpuFirmware: 18&lt;br /&gt;
 EnableGpuFirmwareLogs: 2&lt;br /&gt;
 EnableDbgBreakpoint: 0&lt;br /&gt;
 OpenRmEnableUnsupportedGpus: 1&lt;br /&gt;
 DmaRemapPeerMmio: 1&lt;br /&gt;
 ImexChannelCount: 2048&lt;br /&gt;
 RegistryDwords: &amp;quot;&amp;quot;&lt;br /&gt;
 RegistryDwordsPerDevice: &amp;quot;&amp;quot;&lt;br /&gt;
 RmMsg: &amp;quot;&amp;quot;&lt;br /&gt;
 GpuBlacklist: &amp;quot;&amp;quot;&lt;br /&gt;
 TemporaryFilePath: &amp;quot;&amp;quot;&lt;br /&gt;
 ExcludedGpus: &amp;quot;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Einstellen kann man die Parameter unter /etc/modprobe.d mit einem conf-File.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==xauth==&lt;br /&gt;
&lt;br /&gt;
Gleicher Rechner einmal als Hauptbenutzer und einmal als root.&lt;br /&gt;
&lt;br /&gt;
 chris@worker:~&amp;gt; xauth&lt;br /&gt;
 Using authority file /home/chris/.xauthFAgo86&lt;br /&gt;
 xauth&amp;gt; list&lt;br /&gt;
 worker/unix:0  MIT-MAGIC-COOKIE-1  4608d1c4cf9a0d32e9b31fe3a04e768d&lt;br /&gt;
 #ffff##:0  MIT-MAGIC-COOKIE-1  4608d1c4cf9a0d32e9b31fe3a04e768d&lt;br /&gt;
 xauth&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 worker:/home/chris # xauth&lt;br /&gt;
 Using authority file /root/.xauthzQiHUM&lt;br /&gt;
 xauth&amp;gt; list&lt;br /&gt;
 worker/unix:0  MIT-MAGIC-COOKIE-1  4608d1c4cf9a0d32e9b31fe3a04e768d&lt;br /&gt;
 #ffff##:0  MIT-MAGIC-COOKIE-1  4608d1c4cf9a0d32e9b31fe3a04e768d&lt;br /&gt;
 xauth&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was auffaellt:&lt;br /&gt;
* Das Authority-File liegt unter home.&lt;br /&gt;
* Der Name des Authority-Files wird gebildet, beginnend mit Punkt gefolgt von xauth und einem 6-stelligen Zufallsstring.&lt;br /&gt;
&lt;br /&gt;
Das ist deswegen bemerkenswert, da auf meinem Server, beim root-Nutzer, dies nach den gleichen Regeln erkennbar ist.&lt;br /&gt;
Beim Hauptnutzer aber nicht!&lt;br /&gt;
&lt;br /&gt;
Dort lag das Auhority-File unter /run/user/1000 und begann, ohne Punkt, mit xauth, Unterstrich und einem 6-stelligen Zufallsstring.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;quot;Mitbenutzen&amp;quot; des Xauth-Files fuehrt zum Fehler.&lt;br /&gt;
&lt;br /&gt;
 xauth: error in locking auhority file ...&lt;br /&gt;
&lt;br /&gt;
Das MAGIC-COOKIE ist fuer beide Nutzer gleich.&lt;br /&gt;
&lt;br /&gt;
=Loesung=&lt;br /&gt;
&lt;br /&gt;
Das Vorgehen, welches bei mir den gewuenschten Erfolg erbracht hat, war im ersten Schritt, zum Testen, den Zugriff fuer jeden freizuschalten.&lt;br /&gt;
Dazu benutze ich das Programm xhost (Das musste ich noch nachinstallieren: zypper in xhost)&lt;br /&gt;
&lt;br /&gt;
 worker:/home/chris # xhost +&lt;br /&gt;
 access control disabled, clients can connect from any host&lt;br /&gt;
&lt;br /&gt;
Dies muss allerdings in einem Terminal in der X-Umgebung stattfinden. Erst dann hat man den Zugriff, z.B. mit xrandr von der Konsole, oder per SSH.Besser ist es natuerlich nur einem Nutzer dieses Recht einzuraeumen.&lt;br /&gt;
&lt;br /&gt;
 xhost +SI:localuser:username&lt;br /&gt;
&lt;br /&gt;
Durch Fernbedienbarkeit kann ich nun den Monitor wieder aufwecken, ohne das HDMI-Kabel aus-/einzustecken.&lt;br /&gt;
&lt;br /&gt;
Xrandr zeigte den Monitor als &#039;active&#039; und &#039;connected&#039;.&lt;br /&gt;
&lt;br /&gt;
Wenn ich die Aufloesung mit mode kurz umschalte ist das Bild wieder da. Also stimmt irgendwas mit dem Timing nicht, oder vielleicht ist sogar das Kabel daran schuld.&lt;br /&gt;
&lt;br /&gt;
 chris@server:~&amp;gt; DISPLAY=:0 xrandr --output HDMI-0 --mode 1920x1080&lt;br /&gt;
 chris@server:~&amp;gt; DISPLAY=:0 xrandr --output HDMI-0 --mode 3840x2160&lt;br /&gt;
&lt;br /&gt;
=Loesung dauerhaft=&lt;br /&gt;
&lt;br /&gt;
Das Dumme an der o.g. Loesung ist, dass die Freigabe durch xhost ein reboot nicht ueberlebt.&lt;br /&gt;
&lt;br /&gt;
Ein Hinweis im Internet meint den entsprechenden Eintrag in /etc/X0.hosts vorzunehmen. Eine solche Datei existiert bei meiner Distri (openSuSE 15.6) nicht.&lt;br /&gt;
&lt;br /&gt;
Ein Mitstreiter meint dazu:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 X0.hosts ignored and also ssh login problem with X apps&lt;br /&gt;
 &lt;br /&gt;
     I have just downloaded and installed the 32 bit server version on a couple of machines.&lt;br /&gt;
 &lt;br /&gt;
     These machines are remote displays, no keyboards or mice, requiring a kick of from ssh to start the app. Its just bare sever install with TWM, X, and XDM.&lt;br /&gt;
 &lt;br /&gt;
     Problem is they don&#039;t seem to read my /etc/X0.hosts file until theres been a keyboard login. After that locally xhost returns the names from the file.&lt;br /&gt;
 &lt;br /&gt;
     I removed the exec /usr/bin/X -nolisten tcp &amp;quot;$@&amp;quot; line&lt;br /&gt;
     from /etc/X11/xinit/xserverrc but this also is no help. &lt;br /&gt;
 &lt;br /&gt;
     In the user .profile I have these 2 lines,&lt;br /&gt;
 &lt;br /&gt;
     DISPLAY=&#039;0.0&#039;&lt;br /&gt;
     xhost +&lt;br /&gt;
&lt;br /&gt;
     This is a real chicken and egg thing, no auto login, no keyboard for login and no ssh X access before a local login. And no easy way to make it auto login with out installing GWM.&lt;br /&gt;
 &lt;br /&gt;
     Is there something else to be done with this new Xorg release to enable starting an app on X by ssh?&lt;br /&gt;
&lt;br /&gt;
    Harry &lt;br /&gt;
 &lt;br /&gt;
     fixed silly typo&lt;br /&gt;
&lt;br /&gt;
     DISPLAY=:0.0;&lt;br /&gt;
     export DISPLAY&lt;br /&gt;
&lt;br /&gt;
Die Freigabe mit xhost wird durchweg aus Sicheheitsgruenden nicht empfohlen. In der Regel wird ein ssh-X-Tunnel (ssh -XY) vorgeschlagen.&lt;br /&gt;
&lt;br /&gt;
=Beifang=&lt;br /&gt;
&lt;br /&gt;
Bei der Recherche habe ich gerade noch ein netten kleines Tool gefunden. &lt;br /&gt;
&lt;br /&gt;
 worker:/home/chris # hostnamectl &lt;br /&gt;
 Static hostname: worker&lt;br /&gt;
       Icon name: computer-desktop&lt;br /&gt;
         Chassis: desktop 🖥&lt;br /&gt;
      Machine ID: 3423XXXXXXXXXXXXXXXXXXXXXXXe0fea&lt;br /&gt;
         Boot ID: 722dXXXXXXXXXXXXXXXXXXXXXXX77dd5&lt;br /&gt;
 Operating System: openSUSE Leap 15.6              &lt;br /&gt;
     CPE OS Name: cpe:/o:opensuse:leap:15.6&lt;br /&gt;
          Kernel: Linux 6.4.0-150600.23.25-default&lt;br /&gt;
    Architecture: x86-64&lt;br /&gt;
 Hardware Vendor: Hewlett-Packard&lt;br /&gt;
  Hardware Model: HP Z840 Workstation&lt;br /&gt;
 Firmware Version: M60 v02.62&lt;br /&gt;
   Firmware Date: Thu 2024-01-04&lt;br /&gt;
    Firmware Age: 10month 3w 5d&lt;br /&gt;
&lt;br /&gt;
Noch ein nettes Tool.&lt;br /&gt;
&lt;br /&gt;
 chris@server:~&amp;gt; loginctl session-status&lt;br /&gt;
 11 - root (0)&lt;br /&gt;
           Since: Fri 2024-11-29 17:49:35 CET; 2h 32min ago&lt;br /&gt;
          Leader: 9216 (sshd)&lt;br /&gt;
             TTY: pts/3&lt;br /&gt;
          Remote: 192.168.178.218&lt;br /&gt;
         Service: sshd; type tty; class user&lt;br /&gt;
           State: active&lt;br /&gt;
            Unit: session-11.scope&lt;br /&gt;
                  ├─  1807 loginctl session-status&lt;br /&gt;
                  ├─  1808 less&lt;br /&gt;
                  ├─  9216 &amp;quot;sshd: root [priv]&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot;&lt;br /&gt;
                  ├─  9234 &amp;quot;sshd: root@pts/3&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot; &amp;quot;&amp;quot;&lt;br /&gt;
                  ├─  9238 -bash&lt;br /&gt;
                  ├─ 32710 su chris&lt;br /&gt;
                  └─ 32711 bash&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Websocket_(Programmierung)&amp;diff=5209</id>
		<title>Websocket (Programmierung)</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Websocket_(Programmierung)&amp;diff=5209"/>
		<updated>2026-07-31T15:53:40Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Wie programmiert man eine Websocket-Kommunikation in Javascript, Python, PHP, ...?&lt;br /&gt;
&lt;br /&gt;
=Javascript=&lt;br /&gt;
Als erstes benoetigt man eine Instanz eines Websocket-Objektes (Javascript-API des W3C (/ˈdʌbəl.juː ˈkjuːbd/ C)).&lt;br /&gt;
&lt;br /&gt;
 var meinWebSocket = new WebSocket(&#039;&amp;lt;URL&amp;gt;&#039;,[&#039;&amp;lt;Subprotokoll&amp;gt;&#039;,...]);&lt;br /&gt;
&lt;br /&gt;
Die Angabe des Subprotokolls ist optional.&lt;br /&gt;
&lt;br /&gt;
Das fuehrt zu einem WebSocket Opening-Handshake-Request ueber HTTP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
GET /chat HTTP/1.1&lt;br /&gt;
Host: server.example.com&lt;br /&gt;
Upgrade: websocket&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Key: dGhlICLhbXBsZSBub14jXY==&lt;br /&gt;
Origin: http://example.com&lt;br /&gt;
Sec-WebSocket-Protocol: chat, superchat, soap, wamp, ....&lt;br /&gt;
Sec-WebSocket-Version: 13&lt;br /&gt;
Sec-WebSocket-Extensions: .......&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WebSocket Opening-Handshake-Response&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
HTTP/1.1 101 Switching Protocols&lt;br /&gt;
Upgrade: websocket&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Accept: s3pPCLBiTxaQ9kYGzzhZRbK+OMG= (key nicht valide)&lt;br /&gt;
Sec-WebSocket-Protocol: chat&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sec-WebSocket-Accept benutzt den Sec-WebSocket-Key und haengt eine [https://de.wikipedia.org/wiki/Universally_Unique_Identifier GUID] an. Diese Zeichenkette wird dann mittels der Hashfunktion SHA-1 verschlüsselt und dann noch  Base64 kodiert, um sie als Textstring uebertragen zu koennen.&lt;br /&gt;
&lt;br /&gt;
TODO Algorithmus&lt;br /&gt;
&lt;br /&gt;
Nachdem Instanzieren und der Verbindungsaufnahme kann sich die Verbindung in 4 moeglichen Zustaenden (readyState) befinden.   &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Zustand!!readyState!!Beschrebung&lt;br /&gt;
|-&lt;br /&gt;
|CONECTING||0||Objekt instanziert; Vebindung zum Server wird aufgebaut&lt;br /&gt;
|-&lt;br /&gt;
|OPEN||1||Verbindung erfolgreich aufgebaut; Kanal kommunikationsbereit&lt;br /&gt;
|-&lt;br /&gt;
|CLOSING||2||Verbindung wird geschlossen (Closing-Handshake)&lt;br /&gt;
|-&lt;br /&gt;
|CLOSED||3||Verbindung geschlossen, oder Verbindungsaufbau gescheitert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beim Wechsel des readyStates wird ein Event ausgeloest.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Eventhandler!!Event!!Beschrebung&lt;br /&gt;
|-&lt;br /&gt;
|onopen||open||State geht in OPEN&lt;br /&gt;
|-&lt;br /&gt;
|onerror||error||Fehler beim Verbindungsaufbau oder bei der Kommunkiation&lt;br /&gt;
|-&lt;br /&gt;
|onmessage||message||Nachricht trifft ein&lt;br /&gt;
|-&lt;br /&gt;
|onclose||close||Verbindung geschlossen, oder Verbindungsaufbau gescheitert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Eventhandler sind Attribute des WebSocket-Objektes.&lt;br /&gt;
&lt;br /&gt;
==Codeschnipsel==&lt;br /&gt;
===onopen===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
meinWebSocket.onopen = function() {&lt;br /&gt;
 console.log(&#039;WebSocket-Verbindung aufgebaut!&#039;);&lt;br /&gt;
 meinWebSocket.send(&#039;...&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===onerror===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
meinWebSocket.onerror = function(event) {&lt;br /&gt;
 let reason = event.reason;&lt;br /&gt;
 let code = event.code;&lt;br /&gt;
 console.log(&#039;WebSocket-Verbindung Error: &#039; +  reason + &#039;(&#039; + code + &#039;)&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===onmessage===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
meinWebSocket.onmessage = function(message) {&lt;br /&gt;
 let data = message.data;&lt;br /&gt;
 console.log(&#039;WebSocket-Nachricht: &#039; +  data);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===onclose===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
meinWebSocket.onclose = function(event) {&lt;br /&gt;
 let state = event.readyState;&lt;br /&gt;
 console.log(&#039;WebSocket-ReadyState: &#039; +  state);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist auch moeglich die Eventhandler-Funktionen imt der Methode addEventListener() bekannt zu machen.&lt;br /&gt;
&lt;br /&gt;
 meinWWebSocket.addEventListener(&amp;quot;&amp;quot;,Funktion()){...};&lt;br /&gt;
&lt;br /&gt;
Hiermit sind dann auch mehrere Handler-Funktionen pro Event moeglich.&lt;br /&gt;
&lt;br /&gt;
=First Contact=&lt;br /&gt;
&lt;br /&gt;
Achtung [https://piehost.com/blog/echo-websocket-org-alternative][https://github.com/websocket-client/websocket-client/issues/779]&lt;br /&gt;
Es gibt irgendwie keinen oeffentlichen EchoServer mehr.&lt;br /&gt;
&lt;br /&gt;
Das Angebot der [https://www.postman.com/product/what-is-postman/ Website von postman.com] lohnt einen tieferen Blick. Das [https://learning.postman.com/docs/introduction/overview/ &amp;quot;Learning Center&amp;quot;] sieht sehr interessant aus. Mal [https://learning.postman.com/docs/developer/echo-api/ den] Echoservice ausprobieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinWebSocket = new WebSocket(&#039;wss://ws.postman-echo.com/raw&#039;);&lt;br /&gt;
&lt;br /&gt;
meinWebSocket.onopen = function() {&lt;br /&gt;
 console.log(&#039;WebSocket-Verbindung aufgebaut.&#039;);&lt;br /&gt;
 meinWebSocket.send(&#039;Hallo Welt!&#039;);&lt;br /&gt;
 console.log(&#039;WebSocket-Nachricht verschickt.&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
meinWebSocket.onerror = function(event) {&lt;br /&gt;
 let reason = event.reason;&lt;br /&gt;
 let code = event.code;&lt;br /&gt;
 console.log(&#039;WebSocket-Verbindung Error: &#039; +  reason + &#039;(&#039; + code + &#039;)&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
meinWebSocket.onmessage = function(message) {&lt;br /&gt;
 let data = message.data;&lt;br /&gt;
 console.log(&#039;WebSocket-Nachricht vom Server: &#039; +  data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
meinWebSocket.onclose = function(event) {&lt;br /&gt;
 let state = event.readyState;&lt;br /&gt;
 console.log(&#039;WebSocket-ReadyState: &#039; +  state);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Console zeigt nach der Ausfuehrung folgende Eintraege.&lt;br /&gt;
 WebSocket-ReadyState: undefined websocketechojs.html:25:10&lt;br /&gt;
 WebSocket-Verbindung aufgebaut. websocketechojs.html:8:10&lt;br /&gt;
 WebSocket-Nachricht verschickt. websocketechojs.html:10:10&lt;br /&gt;
 WebSocket-Nachricht vom Server: Hallo Welt! websocketechojs.html:21:10&lt;br /&gt;
&lt;br /&gt;
​&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Weiterer Quellcode [https://socketsbay.com/test-websockets]&lt;br /&gt;
&lt;br /&gt;
Und [http://websocketstest.com/ hier] ein WebsocketTester.&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
[https://web-development.github.io/applied-js-and-css/websocket/]&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=W%C3%A4rmepumpe&amp;diff=5208</id>
		<title>Wärmepumpe</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=W%C3%A4rmepumpe&amp;diff=5208"/>
		<updated>2026-07-31T15:53:39Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Auf der Suche nach einer nachvollziehbaren Einscheidungshilfe zur Anschaffung einer (Pool-)Wärmepumpe bin ich auf viele Seite gestoszen, die zwar durchaus brauchbare Informationen bereit gehalten haben, aber trotzdem blieb eine Unsicherheit zur genauen Beurteilung einer Anlage eines bestimmten Herstellers.&lt;br /&gt;
&lt;br /&gt;
Ein Auslöser für diese Unsicherheit war z.B. folgende Textpassage von [https://www.upoolia.com/poolheizungen/pool-waermepumpe upoolia.de]&lt;br /&gt;
&lt;br /&gt;
Zitat:&lt;br /&gt;
 Wie werden Leistungsdaten geschönt?&lt;br /&gt;
 Bei den Leistungsangaben zu Wärmepumpen wird möglicherweise noch mehr gelogen wie bei den Verbrauchszahlen im Automobilbau. Dies gilt auch oder vielleicht sogar besonders für die Anbieter die sich im Internet rühmen der größte Hersteller zu sein.&lt;br /&gt;
 Geht man zum Beispiel bei der Wertermittlung davon aus, dass das Eingangswasser nur 10°C ist und die Umgebungstemperatur 26°C ist kommen natürlich bessere COP Werte und damit  Wirkungsgrade heraus als bei 15°C  Eingangs-Wassertemperatur und 10°C Außentemperatur. Wie der Idealwert ermittelt wurde wird leider verschwiegen. (Siehe Diagramm zum  Wirkungsgrad in Abhängigkeit von den Temperaturen)&lt;br /&gt;
 Pumpensysteme besitzen wie Autos eine ideale Betriebsgeschwindigkeit. Geht man an die obere Leistungsgrenze (maximale Heizleistung) verschlechtern sich die Werte erheblich (Ihr Auto braucht bei Vollgas auch mehr Benzin für 100 gefahrene km.) Ist man zu weit unten entsteht der gleiche Effekt. Inverter-Pumpen sind Drehzahlgeregelt. Die Angaben beziehen sich auf einen sehr geringen Drehzahlbereich, der nur beim Halten der Pool-Temperatur mit optimalen Außentemperaturen und geringen Wassereingangstemperaturen erreicht wird.&lt;br /&gt;
&lt;br /&gt;
=Einstieg=&lt;br /&gt;
Um eine genauere Basis zur Abschaetzung zu erhalten, lohnt sich wie so oft eine Blick nach Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Eine solche Wärmepumpe gehoert zu den &#039;&#039;&#039;thermischen Maschinen&#039;&#039;&#039;. Diese werden in &#039;&#039;&#039;Waermekraftmaschinen&#039;&#039;&#039;, &#039;&#039;&#039;Kaeltemaschinen&#039;&#039;&#039; und &#039;&#039;&#039;Waermepumpen&#039;&#039;&#039; eingeteilt.&lt;br /&gt;
Es gibt Literatur, die die Kaeltemaschinen und Waermepumpen zu Kraftwaermemaschinen zusammenfassen. Dies ist durchaus sinnvoll, da dann die Aufteilung in &#039;&#039;&#039;rechts&#039;&#039;&#039;drehender Kreisprozess (Uhrzeigersinn) bei &#039;&#039;&#039;Waermekraft&#039;&#039;&#039;maschinen und &#039;&#039;&#039;links&#039;&#039;&#039;drehender Kreisprozess (Gegenuhrzeigersinn) bei &#039;&#039;&#039;Kraftwaerme&#039;&#039;&#039;maschinen sehr deutlich wird. &lt;br /&gt;
Um deren Funktionsprinzip besser zu verstehen, sollte man ein Verstaendnis fuer den Kreisprozess einer periodisch arbeitenden Waermekraftmaschine, bzw. Kraftwaermemaschine entwickeln.&lt;br /&gt;
Man hat ein Arbeitsmedium, das verschiedene Zustandsaenderungen (Druck, Volumen, Temperatur und Energie) durchlaeuft.  &lt;br /&gt;
Fuer die theoretische Erlaeuterung ist es ausreichend einen solchen (Kreis-)Prozess mit nur 2 Zustaenden zu betrachten.&lt;br /&gt;
Im pV-Diagramm (auch p,V-Diagramm, oder p,v-Diagramm) ergibt sich qualitativ die folgende Darstellung.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Kreisprozess.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Rechtsprozess (obere Grafik): Umwandlung von Waermeenergie in mechanische Arbeit (Q-&amp;gt;W)&lt;br /&gt;
&lt;br /&gt;
Linksprozess (untere Grafik): Umwandlung von mechanischer Arbeit in Waermeenergie (W-&amp;gt;Q)&lt;br /&gt;
&lt;br /&gt;
==Anmerkungen zum pV-Diagramm==&lt;br /&gt;
Der Druck wird in bar angegeben. Die gesetzliche, aber nicht SI-Einheit, hat nur den Vorteil, dass die Zahlen an der y-Acchse nicht so grosz sind. Man koennte aber genau so gut 10^5 Pa schreiben.&lt;br /&gt;
Das Pascal ist im Internationalen Einheitensystem (SI) die Maßeinheit des Drucks sowie der mechanischen Spannung. Sie ist nach Blaise Pascal benannt und folgendermaßen definiert:&lt;br /&gt;
&lt;br /&gt;
    1 Pa = 1 N·m−2&lt;br /&gt;
&lt;br /&gt;
Hektopascal (1 hPa = 100 Pa) und dem Kilopascal (1 kPa = 1000 Pa) auch das Bar (1 bar = 10^5 Pa = 100 kPa)&lt;br /&gt;
&lt;br /&gt;
Der mittlere Luftdruck der Atmosphäre auf Meereshöhe (Standard- bzw. Normdruck) beträgt&lt;br /&gt;
&lt;br /&gt;
    1 atm = 101325 Pa = 1013,25 hPa = 1,01325 bar = 1013,25 mbar.&lt;br /&gt;
&lt;br /&gt;
Wie beim Druck mit bar verhaelt es sich auch beim Volumen. Ein Liter ist zwar eine gesetzliche Maszeinheit, aber 0,001 m^3 ist etwas sperrig.&lt;br /&gt;
Der Liter wird noch durch die Stoffmenge (SI-Einheit) geteilt. &lt;br /&gt;
&lt;br /&gt;
 Avogadrosches Gesetz: Gleiche Volumina verschiedener Gase enthalten bei gleichem Druck und gleicher Temperatur die gleiche Anzahl an Teilchen. Mit anderen Worten, 1 Mol eines (idealen) Gases nimmt bei 0 °C und 101325 Pa ein Volumen von 22,4 l ein. Dieses Gesetz gilt streng nur für ideale Gase.&lt;br /&gt;
&lt;br /&gt;
Wenn man also an der x-Achse einen Wert von z.B. 40 angeschrieben findet, sind das 40 l/mol (Liter pro mol). &lt;br /&gt;
&lt;br /&gt;
Mit der 2D-Darstellung des pV-Diagramm konnte ich mich noch nie richtig anfreunden. Die Isochoren und Isobaren sind zwar sehr einfach zu deuten, aber die dritte Dimension, die Temperatur, faellt entweder unter den Tisch oder wird als &amp;quot;Tiefenwert&amp;quot; in die 2D-Darstellung eingefuegt.&lt;br /&gt;
Um aber isotherme, isentrope (adiabatische), polytrope Vorgaenge zu erkennen/deuten/verstehen ist fuer mich die 3D-Darstellung also p(V,T) unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=Thermische Maschinen=&lt;br /&gt;
Legende: rot=&amp;quot;Warmseite&amp;quot; blau=&amp;quot;Kaltseite&amp;quot; gruen=&amp;quot;Energiegewinn Haupteffekt&amp;quot; grau=&amp;quot;Energiestrom (Waerme/Elektro) Nebeneffekt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:ThermischeMaschinen.png|500px]]&lt;br /&gt;
  &lt;br /&gt;
==Waermekraftmaschinen==&lt;br /&gt;
Der Carnot-Prozesz z. B. wird rechtsherum (Rechtsprozess/Plus-Zyklus) durchlaufen.&lt;br /&gt;
In diesem Fall wird Waermeenergie in mechanische Energie gewandelt.&lt;br /&gt;
Typische Vertreter sind der Verbrennungsmotor oder Dampfmaschine.&lt;br /&gt;
Dieser Maschinentyp soll hier nicht naeher betrachtet werden.&lt;br /&gt;
&lt;br /&gt;
==Kraftwaermemaschinen==&lt;br /&gt;
Der Kreisprozess wird linksherum (Linksprozess/Minus-Zyklus)durchlaufen.&lt;br /&gt;
Typische Vertreter sind Waermetauscher (Kuehlschrank, Klimaanlage) und Waermepumpen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Heatpump2.svg|mini]]&lt;br /&gt;
&lt;br /&gt;
Beim Linksprozess muessen wir mechanische Arbeit zufuehren um den Kreislauf zu durchlaufen,&lt;br /&gt;
&lt;br /&gt;
da der &amp;quot;Rueckweg&amp;quot; mehr Energie benoetigt als der &amp;quot;Hinweg&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Die mechanische Arbeit wird von einem Kompressor/Verdichter erbracht, der elektrische Energie in mechanische umwandelt, die zum &amp;quot;Antreiben&amp;quot; des Waermestroms dient.&lt;br /&gt;
 &lt;br /&gt;
Neben dem Kompressor/Verdichter (4) gibt es fuer den Zustandsablauf noch drei weitere technische Bauteile, den Verdampfer (3), den Kondensator (1) und eine Drossel (2).&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist beim Kuehlschrank, Klimaanlage und Waermepumpe weitestgehend identisch.&lt;br /&gt;
 &lt;br /&gt;
Wie kann man sich nun den technischen Ablauf am besten merken.&lt;br /&gt;
&lt;br /&gt;
Fangen wir mit dem Kompressor an. Er nimmt die notwendige (elektrische) Energie auf, um vom Zustand 2 (V grosz,p klein) zurueck zum Zustand 1 (V klein, p grosz) zu kommen. Er ist also fuer eine Volumenverkleinerung und Druckerhoehung verantwortlich.&lt;br /&gt;
Der &amp;quot;Gegenspieler&amp;quot; zum Kompressor ist die Drossel. Ohne sie wuerde der Kompressor ins &amp;quot;Leere&amp;quot; arbeiten. Die Druckerhoehung (mit Volumenverkleinerung) geschieht also nur weil am &amp;quot;Ausgang&amp;quot; des Kompressors eine Drossel den &amp;quot;Ausweg&amp;quot; verkleinert.&lt;br /&gt;
Jeder der schon mal mit einer Luftpumpe gearbeitet hat kennt den Effekt, dass wenn man das Luftaustrittsventil zuhaelt, die Pumpe beim Zusammenschieben warm wird. Diese Waerme wird durch einen Waermetauscher zwischen Kompressor und Drossel abgegeben. Wenn man weisz (s.u.), dass condensare dicht zusammendraengen heiszt, liegt es nahe diesen Waermetauscher Kondensator zu nennen. Nach dem Zustand 1 gibt die Drossel das Gas (evtl. sogar fluessig) wieder in die &amp;quot;Freiheit&amp;quot;. Der Druck sinkt und das Volumen nimmt wieder zu. Dieser Vorgang benoetigt Energie, die aus der Umgebung mit Hilfe eines weiteren Waermetauschers (Lamellenwaermeuebertrager bei der Waermepumpe) genommen wird. An dieser Stelle ist es hiflreich, sich nochmal zu vergegenwaertigen, dass es Kaelte physikalisch eigentlich gar nicht gibt, sondern kalt eigentlich mit weniger warm besser ausgedrueckt werden kann. Da der zweite Waermetauscher Energie aus der Umgebung aufnimmt, um die Volumenzunahme des Kreislaufmittels zu unterstuetzen, &amp;quot;fehlt&amp;quot; diese Energie in der unmittelbaren Umgebung des Waermetauschers. Der Umgebung wird also Energie entzogen, allerdings weniger als der Kondensator an Waermeenegie abgibt. Die unmittelbare Umgebung wird also kaelter. Diese kalte Luftmasse wird durch einen Ventilator wegtransportiert, um fuer &amp;quot;neue&amp;quot; waermere Luft Platz zu machen. Merke: Kaelte ist fehlende Waerme:-) Der zweite Waermetauscher wird auch Verdampfer genannt, da die eingesetzten &amp;quot;Kaeltemittel&amp;quot; idR fluessig die Drossel verlassen und danach im Waermetauscher verdampfen, also ihren Aggregatzustand von fluessig nach gasfoermig wechseln und dabei Waerme aufnehmen (muessen).&lt;br /&gt;
&lt;br /&gt;
Auf dem Foto auf dieser [https://www.lieber-lieber.de/service/waermepumpentausch Seite] sieht man gut den Verdichter, die zwei Waermetauscher und die Drossel. Leider ist das Bild zu schlecht um die anderen Komponenten auszumachen.&lt;br /&gt;
&lt;br /&gt;
Eine sehr schoene schematische Darstellung einer Waermepumpe findet sich  [https://www.danfoss.com/de-de/markets/buildings-commercial/dcs/heat-pumps/#tab-related-applications hier]&lt;br /&gt;
&lt;br /&gt;
Eine noch detailliertere Beschreibung ist [https://www.energie-experten.org/heizung/waermepumpe hier] entnommen.&lt;br /&gt;
&lt;br /&gt;
Zitat:&lt;br /&gt;
&lt;br /&gt;
 Während der Verdampfer Wärme aufnimmt, gibt der Verflüssiger (Kondensator) die Wärme des vom Verdichter kommenden heißen Kältemittelgases über einen Wärmetauscher an das  Heizungswassers wieder ab. Dabei tritt der überhitzte Dampf in den Verflüssiger ein, wird auf Verflüssigungstemperatur abgekühlt (Erhitzung) und kondensiert (Verflüssigung). Nach der Verflüssigung des Kältemittels wird das Kondensat noch weiter gekühlt (Unterkühlung), um Dampfblasen vor dem Expansionsventil zu vermeiden. Diese könnten sonst die Flüssigkeitszufuhr zum Verdampfer mindern und diesen in seiner Funktionsfähigkeit einschränken.&lt;br /&gt;
&lt;br /&gt;
 Damit der Dampf jedoch Wärme an die Umgebung abgeben kann, muss seine Temperatur höher liegen, als die Umgebungstemperatur. Dies ist nur bei sehr hohen Drücken möglich ist. Bei einer Umgebungstemperatur von 40 °C muss z.B. das Kältemittel R12 auf über 10 bar komprimiert werden. Die obere Temperatur, bei der die Wärmepumpe noch Energie an die Umgebung abgeben kann, hängt also stark davon ab, wie hoch der Dampf im Verdichter komprimiert werden kann, was wiederum die Leistungszahl bzw. Jahresarbeitszahl der Wärmepumpe beeinflusst.&lt;br /&gt;
&lt;br /&gt;
 Verflüssigen und Verdampfen sind zwei zentrale Prozesse in einer Wärmepumpe. Die Verflüssigung bezeichnet den Phasenübergang eines Gases oder Gasgemisches in den flüssigen Aggregatzustand. Analog dazu ist Verdampfung der Phasenübergang einer Flüssigkeit oder eines Flüssigkeitsgemisches in den gasförmigen Aggregatzustand. Die sehr ähnliche Funktion des Verdampfers und des Verflüssigers machen es daher recht einfach möglich, mit einer Wärmepumpe auch zu kühlen, indem nur die Funktionen von Verdampfer und Verflüssiger getauscht werden. Aus technischer Sicht geschieht dies durch ein Umschaltventil, zwei Rückschlagventile und ein zweites Expansionsventil.&lt;br /&gt;
&lt;br /&gt;
 Im Verflüssiger wird der Wärmestrom vom Kältemittel zu Heizmedium durch die Übertragungsfläche des Wärmetauschers, die Temperaturdifferenz und die Wärmedurchgangszahl bestimmt. In Wärmepumpen beträgt die Temperaturdifferenz beim Heizmedium Wasser etwa 2 bis 5 Kelvin (K) und beim Heizmedium Luft wie bei Luft/Luft-Wärmepumpen rund 5 bis 10 K. Die Wärmemenge, die der Verflüssiger auf das Heizmedium überträgt, ist daher in etwa die Summe der Wärme, die im Verdampfer aufgenommen wurde, plus der vom Verdichter aufgenommenen elektrischen Energie.&lt;br /&gt;
&lt;br /&gt;
===Kondensieren===&lt;br /&gt;
&lt;br /&gt;
Wortherkunft: lateinisch condensare → la „dicht zusammendrängen“, einer Ableitung zum Adjektiv densus → la „dicht“ mit dem Präfix con- → la „mit, zusammen“;&lt;br /&gt;
&lt;br /&gt;
Synonym kann auch verflüssigen (seltener: dehydratisieren, eindampfen, evaporieren) benutzt werden.&lt;br /&gt;
&lt;br /&gt;
 Ein Kondensator (oder Kondenser) ist ein Apparat, in welchem ein Stoff vom gasförmigen Aggregatzustand in den flüssigen Aggregatzustand überführt wird (Kondensation). &lt;br /&gt;
&lt;br /&gt;
Diese Definition eines Kondensator ist zu kurz gegriffen und laesst eine Verbindung zum elektrischen Kondensator nicht mehr zu.&lt;br /&gt;
Besser waere eine Definition wie folgt:&lt;br /&gt;
&lt;br /&gt;
 Ein Kondensator ist ein (technischer) Gegenstand, der ein Medium dicht zusammendrängt.&lt;br /&gt;
&lt;br /&gt;
Besser als Gegenstand finde ich noch Device. &lt;br /&gt;
&lt;br /&gt;
Das Medium beim elektrischen Kondensator waeren die Elektronen und bei einem Kondenser waere es z. B. Wasser.&lt;br /&gt;
&lt;br /&gt;
Der Kondensator wird auch Verfluessiger genannt.&lt;br /&gt;
&lt;br /&gt;
===Expansionsorgan===&lt;br /&gt;
&lt;br /&gt;
Das Expansionsorgan ist ein Bauteil einer Wärmepumpe≡, das zwischen Verflüssiger und Verdampfer eingebaut wird und zur Absenkung des Druckes (Entspannung des Gases) erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
Das Expansionsorgan, eigentlich Expansionsventil ist ein gesteuertes Drosselventil (Drossel). Es heißt so, weil es die Expansion im Verdampfer so steuert, dass möglichst kein flüssiges Kältemittel mehr übrig bleibt. Damit soll der  (Gas-)Kompressor geschuetzt werden. &lt;br /&gt;
&lt;br /&gt;
===Rohrleitungen===&lt;br /&gt;
Duenne Rohre deuten auf fluessige Phase und dicke Leitungen auf gasfoermige Phase hin.&lt;br /&gt;
&lt;br /&gt;
==Warmepumpenparameter==&lt;br /&gt;
&lt;br /&gt;
===Kaeltemittel===&lt;br /&gt;
Die Daten sind der Anleitung meiner Waermepumpe entnommen.&lt;br /&gt;
&lt;br /&gt;
Das Gerät enthält das fluorierte Treibhausgas Difluormethan (R32), welches für die Funktionalitaet des Geräts erforderlich ist. Die industrielle Bezeichnung lautet HFKW-32. Die gebraeuchliche Bezeichnung ist R32. Die chemische Bezeichnung ist Difluormethan und die chemische Summenformel ist CH2F2. Das Treibhauspotential ist mit GWP675 angegeben.&lt;br /&gt;
&lt;br /&gt;
===Jahresarbeitszahl===&lt;br /&gt;
Das Verhältnis zwischen Umgebungswärme und Antriebsenergie drückt sich in der &#039;&#039;&#039;Jahresarbeitszahl&#039;&#039;&#039; einer Wärmepumpe aus. Je höher diese Zahl, desto größer ist der Anteil der kostenlosen Umweltenergie und desto weniger Antriebsenergie wird benötigt. Hierfür sollte die Wärmequellentemperatur hoch und die Vorlauftemperatur des Heizkörpers niedrig sein.&lt;br /&gt;
Fuer LuftWasserWaermepumpen wurde eine Jahresarbeitszahl von 3 bestimmt.&lt;br /&gt;
&lt;br /&gt;
Gaengige Leistungsbezeichnungen für Luft/Wasser-Wärmepumpen sind A10/W35, A2/W50 und A2/W35.&lt;br /&gt;
&lt;br /&gt;
https://www.vaillant.de/heizung/heizung-verstehen/tipps-rund-um-ihre-heizung/jahresarbeitszahl/&lt;br /&gt;
&lt;br /&gt;
===Wirkungsgrad===&lt;br /&gt;
Gern wird im Zusammenhang mit dem Wirkungsgrad der Coefficient Of Performance (COP) bzw. die Leistungszahl von Wärmepumpen genannt oder gar faelschlicherweise gleichgesetzt.&lt;br /&gt;
&lt;br /&gt;
Ein Koeffizient ist ein konstanter Faktor, ein COP sozusagen ein Leistungsfaktor. Gelegentlich liest man auch Leistungsziffer was unterstellt das bei 9 im Dezimalsystem Schluss waere;-). Der COP ist also eine Zahl ohne Einheit die das Verhaeltnis von Heizleistung und Eingangsleistung ins Heizsystem ausgedrueckt wird. Die Eingangsleistung ins Heizsystem ist etwas niedriger, durch Luefter, Steuerung, ... als die elektrische Eingangsleistung der Waermepumpe. &lt;br /&gt;
&lt;br /&gt;
Auch die Angabe nach der Europäischen Norm EN 14511 ist zur Ermittlung des Wirkungsgrades wenig hilfreich. &lt;br /&gt;
 A10/W35 = COP 4,3&lt;br /&gt;
 A2/W50 = COP 2,7&lt;br /&gt;
Besser waere es eine Messkurve, oder besser noch eine Funktion f(TLuft,TWasser) anzugeben wonach sich der COP einer jeden Betriebssituation ermitteln lassen wuerde.&lt;br /&gt;
&lt;br /&gt;
[https://www.bauwion.de/begriffe/leistungszahl-cop-en-14511 Zitat:]&lt;br /&gt;
&lt;br /&gt;
 Leistungszahl (COP) nach EN 14511&lt;br /&gt;
 &lt;br /&gt;
 Die Wirtschaftlichkeit von Wärmepumpen wird durch die sogenannte Leistungszahl ε beschreiben. Man nennt die Leistungszahl auch Coefficient of Performance (COP). Sie definiert sich durch das Verhältnis zwischen der erzeugten Heizleistung und dem aufgenommenen elektrischen Antriebsstrom einer Wärmepumpe. Je höher diese Zahl ist, desto besser ist der Wirkungsgrad. Grundsätzlich kann die Leistungszahl nach DIN EN 255-3 oder DIN EN 14511 ermittelt werden, die jeweils von unterschiedlichen Spreizungen bei der Vorlauftemperatur ausgehen, so dass auch unterschiedliche Leistungszahlen entstehen. Um vergleichbare Werte verschiedener Systeme gegenüberstellen zu können, müssen also die sowohl die Norm als auch die Rahmenbedingungen übereinstimmen, unter denen die Werte unter Laborbedingungen ermittelt wurden. Hierzu werden folgende genormte Prüfkurzzeichen verwendet, die den Betriebszustand der Prüfung beschreiben:&lt;br /&gt;
 &lt;br /&gt;
 W=                Water, Wasser&lt;br /&gt;
 B=                engl. Brine (=Sole)&lt;br /&gt;
 S=                Sole&lt;br /&gt;
 A=                engl. Air (=Luft)&lt;br /&gt;
 E=                Erdreich&lt;br /&gt;
 &lt;br /&gt;
 Beispiel: A0/W35 = 3,0&lt;br /&gt;
  &lt;br /&gt;
 Die Kennzeichnung bedeutet, dass eine Luftwärmepumpe bei einer Außenlufttemperatur von 0°C (A0) und einer Vorlauftemperatur von 35°C  (W35) aus einem Kilowatt elektrischer Antriebsleistung 3,0 kW Heizleistung erwirtschaftet. Die Leistungszahl bzw. der COP ist in diesem Beispiel 3,0. Grundsätzlich ist beim Vergleich der Leistungszahlen genau darauf zu achten, nach welcher Norm und welchen Betriebspunkten die Werte ermittelt wurden. Dagegen sind die Ergebnisse aus den unabhängigen Prüfungen des EHPA (European Heat Pump  Association) nach normierten Bedingungen entstanden, so dass die dort veröffentlichten Werte immer vergleichbar sind.&lt;br /&gt;
 &lt;br /&gt;
 Formel: COP = Heizleistung / elektr. Antriebsleistung  Einheit: keine&lt;br /&gt;
&lt;br /&gt;
Eine Überschlagrechnung sagt mir, dass bei einem kWh-Preis fuer elektr. Strom von ca. 27 ct. (Stand 12/2021) und einem kWh-Preis bei Gas von ca. 6 ct (Stand 12/2021) muesste eine Waermepumpe unter allen Betriebsbedingungen (Sommer, Winter, ...) mindestens einen COP von  4,5 haben, dass sich eine Waermepumpe gegenueber einer Gasheizung lohnt und da ist der hoehere Anschaffungspreis noch nicht beruecksichtigt. Viele technische Informationsblaetter der WP-Hersteller bleiben einen &amp;quot;Durchschnitts-COP&amp;quot; schuldig. Gerne wird mit einem maximalen COP geworben, der in der Regel aber nur unter Idealbedingungen erreichbar ist. Da man (leider) sein Gas nicht selbst produzieren kann, bleibt eigentlich nur noch die Moeglichkeit an der Stromschraube zu drehen. Mit meiner PV-(Insel)Anlage habe ich zur Zeit Gestehungskosten von 8 ct/kWh und mit Speicher von etwa 17 ct/kWh. Dann sieht die Rechnung schon deutlich besser aus. Dann auch wieder eine Waermepumpe mit PV-Strom als Poolheizung ideal, im Winter braucht man aber doch recht viel Flaeche fuer eine PV-Anlage, die auch im Winter genuegend Strom zur Verfuegung stellt, um eine Waermepumpe (moeglicht keine Luft) zu betreiben und die E-Autos wollen im Winter ja auch noch voll geladen werden. Da kommen einem die &amp;quot;neuen&amp;quot; PV-Module aus China mit 600 Wp gerade recht. Damit ist der Flaechenbedarf nicht mehr ganz so grosz wie noch vor einigen Jahren. Hier im Saarland liegt der Ertrag im Winter im Dezember dann doch bei schlappen 20 kWh/Wp. Ich runde mal groszzuegig für Nov, Dez und Jan auf je 30 kWh/Wp auf, damit es sich besser rechnen laesst. Das sind also 1kWh pro Wp. Um den Pool auf Temperatur zu halten ist eine kWh schnell aufgebraucht. Ein E-Auto benoetigt etwa 10 kwh auf 100 km. Um z.B. Pool und Auto zu unterhalten sind schnell 5 kWh pro Tag notwendig. Was mit einer 5 kWp-Anlage nach erreichbar scheint. (Messungen folgen ...). Eine 5 kWp-Anlage hat etwa einen Flaechenbedarf (10 Module) 17 qm. Diese Zahl erscheint mir recht niedrig. Ich werde in Q1/2022 mit einen 60 qm Anlage eine Testreihe beginnen. Bericht folgt.&lt;br /&gt;
&lt;br /&gt;
===Technische Daten===&lt;br /&gt;
*Modell:BP-39WS-B Mini&lt;br /&gt;
*Artikelnummer:049273&lt;br /&gt;
*Gesamtgewicht (netto/brutto):19kg / 21kg&lt;br /&gt;
*Abmessungen (B x H x T):365mm × 370mm x 320mm&lt;br /&gt;
*Heizleistung *:3,9kW&lt;br /&gt;
*Eingangsleistung Heizung *:0,65kW&lt;br /&gt;
*Bewertung der Eingangsleistung0,85kW&lt;br /&gt;
*Eingangsstrom Heizung *:3,3A&lt;br /&gt;
*Betriebsspannung und -frequenz **:220-240V~, 50Hz&lt;br /&gt;
*Leistungsziffer COP6,0&lt;br /&gt;
*Schutzklasse:I&lt;br /&gt;
*Schutzart:IPX4&lt;br /&gt;
*Schallleistungspegel:47 dB(A)&lt;br /&gt;
*Material Wärmeübertrager:Titan in PVC&lt;br /&gt;
*Durchsatz Wasser:3m3/h - 4m3/h&lt;br /&gt;
*Durchsatz Luft:1200m3/h&lt;br /&gt;
*Arbeitsdruck Niederdruckseite:0,7MPa&lt;br /&gt;
*Max. BetriebsdruckNiederdruckseite:1,5MPa&lt;br /&gt;
*Arbeitsdruck Hochdruckseite:3,0MPa&lt;br /&gt;
*Max. Betriebsdruck Hochdruckseite:4,3MPa&lt;br /&gt;
*Kältemittel:R32Masse Kältemittel:280g&lt;br /&gt;
*Treibhauspotential GWP:675CO2-Äquivalent:0,19kg/t&lt;br /&gt;
*Temperaturanstieg Poolwasser***(Außentemp.=Wassertemp.=26°C)&lt;br /&gt;
*10m³ 0,3°C/h&lt;br /&gt;
*20m³ 0,2°C/h&lt;br /&gt;
*30m³ 0,1°C/h&lt;br /&gt;
*40m³ 0,1°C/h&lt;br /&gt;
*50m³ 0,1°C/h&lt;br /&gt;
 * variabel - in Abhängigkeit der Umgebungsbedingungen.&lt;br /&gt;
 ** Einphasenwechselstrom&lt;br /&gt;
 *** Wärmeverlust wurde nicht berücksichtigt (z.B.: mit oder ohne Abdeckung, Isolierung, ...)&lt;br /&gt;
&lt;br /&gt;
=Faustformeln=&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=Weiterfuehrende Quellen=&lt;br /&gt;
Ein wirklich tolles Dokument kommt von der Firma Siemens (siemens.de/buildingtechnologies) mit dem Namen Kältetechnik (Siemens-Kaeltetechnik.pdf). Leider kann ich aufgrund von Copyright-Bestimmung das Dokument hier nicht zum Download anbieten,&lt;br /&gt;
das Kundenbetreuungscenter von Siemens hilft aber bestimmt gerne weiter.&lt;br /&gt;
&lt;br /&gt;
 Siemens AG Building Technologies Division Lyoner Straße 27 60528 Frankfurt am MainKundenbetreuungs-Center Tel. 0800 100 76 39 info.de.sbt@siemens.comArtikel-Nr. E10003-A38-H214 (Stand 04/2017)&lt;br /&gt;
&lt;br /&gt;
https://www.amberger-kuehltechnik.de/wp-content/uploads/Grundlagen-Kaelte.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.andreasjahnke.de/index_htm_files/Schulung%20Kaeltetechnik%20Grundlagen.pdf&lt;br /&gt;
&lt;br /&gt;
https://www.gunt.de/images/download/Cat3a_german.pdf&lt;br /&gt;
&lt;br /&gt;
https://docplayer.org/67215201-Fachwissen-kaeltetechnik.html&lt;br /&gt;
&lt;br /&gt;
https://www.umsicht.fraunhofer.de/content/dam/umsicht/de/dokumente/referenzen/flexkaelte/K%C3%A4ltetechnik_in_Deutschland-Steckbriefe_zu_K%C3%A4ltetechnologien.pdf&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Windows_PIN_0xd0000225&amp;diff=5207</id>
		<title>Windows PIN 0xd0000225</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Windows_PIN_0xd0000225&amp;diff=5207"/>
		<updated>2026-07-31T15:53:38Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Problem=&lt;br /&gt;
Nach einem Windowsupdate (Win11 23H2 auf 24H2) am 20241213 hat Windows bei der Anmeldung meinen Fingerabdruck nicht mehr akzeptiert.&lt;br /&gt;
&lt;br /&gt;
Auch die PIN und das Kennwort haben mit Fehler abgebrochen.&lt;br /&gt;
&lt;br /&gt;
=Loesungsversuche=&lt;br /&gt;
Der abgesicherte Modus mit Deinstallation der Updates brachte keinen Erfolg.&lt;br /&gt;
&lt;br /&gt;
Das Umbenennen des NGC-Ordners brachte keinen Erfolg.&lt;br /&gt;
&lt;br /&gt;
Also erst mal Datensicherung machen;-)&lt;br /&gt;
&lt;br /&gt;
In Windows_RE &lt;br /&gt;
&lt;br /&gt;
 diskpart  startet das Programm und man gelang in eine Shell&lt;br /&gt;
 &lt;br /&gt;
 list disk&lt;br /&gt;
 select disk &amp;lt;n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 list volume&lt;br /&gt;
 select volume &amp;lt;n&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eigentlich muesste es list disks und list volumes heiszen. Selektieren braucht man nur wenn man nachfolgende Kommandos nutzt die sich auf eine Disk oder ein Volume beziehen.&lt;br /&gt;
Um z.B. ein Volume zu formatieren braucht man die Disk nicht zu selektieren. Es reicht ein select volume &amp;lt;n&amp;gt; und anschlieszend&lt;br /&gt;
&lt;br /&gt;
 format fs=ntfs label=&amp;lt;name&amp;gt; [quick]&lt;br /&gt;
&lt;br /&gt;
Hier sieht man neben der zugeordneten Laufwerksbuchstaben auch die Groesze der Partitionen.&lt;br /&gt;
&lt;br /&gt;
 fsutil volume diskfree c:&lt;br /&gt;
&lt;br /&gt;
Jetzt kann ich abschätzen wie grosz mein BackupMedium sein muss.&lt;br /&gt;
&lt;br /&gt;
Als Backupmethode will ich mal xcopy und robocopy eine Chance geben. Wenn das nicht klappt dann LiveLinux und rsync.&lt;br /&gt;
&lt;br /&gt;
==Robocopy, die Erste==&lt;br /&gt;
Als haette ich es geahnt robocopy went out of destination disk space!!!&lt;br /&gt;
&lt;br /&gt;
 fsutil fsinfo ntfsinfo YourDestinationCopyDriveLetter:&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Robocopy, die Zweite==&lt;br /&gt;
[https://www.reddit.com/r/techsupport/comments/18hxnh6/robocopy_backup_taking_ages_due_to_recursive/]&lt;br /&gt;
&lt;br /&gt;
=Loesung=&lt;br /&gt;
Den entscheidenen Hinweis habe ich von dieser [https://www.easeus.de/partitionieren-tipps/windows-11-passwort-vergessen-zuruecksetzen.html Seite] erhalten.Im eingebetteten Video wird erklaert wie man das Passwort des/der Benutzer zueruecksetzen kann.&lt;br /&gt;
&lt;br /&gt;
Hier im Schnellverfahren. &lt;br /&gt;
&lt;br /&gt;
*Den Button der Barrierefreiheit auf dem Anmeldebildschirm mit der Eingabeaufforderung verknuepfen.&lt;br /&gt;
*Benutzerkonten-Verwaltung oeffnen&lt;br /&gt;
*Passwort neu setzen&lt;br /&gt;
&lt;br /&gt;
Der Button der Barrierefreiheit ist normalerweise mit dem Programm Utilman.exe verknuepft. Diese Verknuepfung setzt man auf cmd.exe neu und sichert das Programm zur Barrierefreiheit.&lt;br /&gt;
Um das zu tun, startet man den Abgesicherten Modus. Ich glaub der heiszt gar nicht mehr so. Es wird jetzt ein Windows RE gestartet. &lt;br /&gt;
Windows RE entweder mit Shift + Restart wenn man sich im Anmeldebildschirm befindet oder Strg+F8 sofern man gerade bootet.&lt;br /&gt;
&lt;br /&gt;
 cd \window\System32&lt;br /&gt;
 ren Utilman.exe Utilman1.exe&lt;br /&gt;
 cp cmd.exe Utilma.exe&lt;br /&gt;
&lt;br /&gt;
Exit und Continue. Wenn man jetzt wieder im Anmeldebildschirm landet, kann man durch einen Klick auf das Maennlein die Eingabeaufforderung starten und folgendes eingeben.&lt;br /&gt;
&lt;br /&gt;
 control userpasswords2&lt;br /&gt;
&lt;br /&gt;
Im der nun erscheinenden Benutzerkontenliste den gewünschten Benutzer auswaehlen und unten auf Kennwort ruecksetzen klicken und zweimal ein neues Passwort eingeben. Voilà!&lt;br /&gt;
&lt;br /&gt;
Das ist so simpel, dass ich immer noch staune.&lt;br /&gt;
&lt;br /&gt;
Interessant ist noch zu bemerken, dass der Aufruf der Benutzerkontenliste im angemeldeten Zustand, beim Zuruecksetzten auf Strg+Alt+Entf verweist.&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Wandhalterungen&amp;diff=5206</id>
		<title>Wandhalterungen</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Wandhalterungen&amp;diff=5206"/>
		<updated>2026-07-31T15:53:37Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zwei kleine Beispiele einer Wandhalterung. Einmal für die XBOX , um sie hinter dem Fernseher zu verstecken und eine Wandhalterung für ein Microsoft Surface, dass ich als SmartHomeDisplay benutze.&lt;br /&gt;
Sollte jemand Interesse haben, schreibt euren Wunsch in den Kommentar.&lt;br /&gt;
===XBOX-Halterung===&lt;br /&gt;
Das X-Anordnung fand ich irgendwie passend.&lt;br /&gt;
&lt;br /&gt;
[[Datei:XBOX-Halterung.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
===Surface Halterung===&lt;br /&gt;
Beim Entwurf habe ich festegestellt, dass das Surface auf der Rückseite oben rechts und links metallische Gehäuseteile besitzt, so dass ich mit 2 Neodym-Magneten ganz einfach das Tablet fixieren kann. Es ist leicht zu entnehmen aber auch durch die leichte Schrägstellung und den Magneten, so fest dass ein unbeabsichtigtes Lösen unwahrscheinlich ist. Dadurch dass der Ladeanschluss auch magnetisch einklappt ist eine Entnahme recht komfortabel.  &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Datei:Surface-Halterung 1.jpg|200px]]&lt;br /&gt;
|[[Datei:Surface-Halterung 2.jpg|200px]]&lt;br /&gt;
|[[Datei:Surface-Halterung 3.jpg|150px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Wallboxen&amp;diff=5205</id>
		<title>Wallboxen</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Wallboxen&amp;diff=5205"/>
		<updated>2026-07-31T15:53:36Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Wer ein E-Auto faehrt braucht eigentlich (k)eine Wallbox. Bei meinem Tesla Model 3 war ein einphasiges Ladegeraet dabei. Da ich in meinem Haus derzeit die Photovoltaik eh nur einphasig speichere, kommt mir die einphasige Ladung gerade recht.&lt;br /&gt;
Fuer die Batterie ist es sowieso schonender und bei einer Ladestrombegrenzung von 10 A ist mein Akku (60 kWh) nach ca. 24 Stunden voll und das schaffe ich locker einmal die Woche.&lt;br /&gt;
&lt;br /&gt;
Die Wallboxen (3) habe ich nur wenn&#039;s mal schnell gehen soll und weil sie [https://wallboxcenter.de/kfw-wallboxen-firmen-unternehmen-kfw441-kommunen-kfw-339/ gefoerdert] wurden. &lt;br /&gt;
&lt;br /&gt;
Ich habe mich bewusst fuer 3 unterschiedliche Modelle entschieden, um Erfahrung zu sammeln.&lt;br /&gt;
&lt;br /&gt;
=Modell 1 Heidelberg=&lt;br /&gt;
Status: gekauft&lt;br /&gt;
&lt;br /&gt;
Energy Control 11kW (nicht Home Eco)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Heidelberg Wallbox Energy Control&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Heidelberg Wallbox Home Eco&lt;br /&gt;
&lt;br /&gt;
Material/Optik&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Edelstahlfront, Silber-schwarz&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Metallgehäuse, Silber-schwarz&lt;br /&gt;
&lt;br /&gt;
Ladeleistung&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
11 kW&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
11 kW&lt;br /&gt;
&lt;br /&gt;
Stecker&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Typ-2-Anschluss&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
Typ-2-Anschluss&lt;br /&gt;
&lt;br /&gt;
Länge Ladekabel&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
5 oder 7,5 Meter&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
3,5, 5 oder 7,5 Meter&lt;br /&gt;
&lt;br /&gt;
KfW-Förderfähig&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
nein&lt;br /&gt;
&lt;br /&gt;
Fehlerstromschutz integriert&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
ja&lt;br /&gt;
&lt;br /&gt;
Besonderheiten&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
    Integriertes Lastmanagementsystem (mit bis zu 16 weiteren Wallboxen vernetzbar)&lt;br /&gt;
    KfW-förderfähig Für Innen- und Außenbereich geeignet&lt;br /&gt;
    Optionale Zugriffskontrolle per Schaltelement z. B. RFID oder Schlüsselschalter&lt;br /&gt;
    Mit zwei verschieden großen Ladekabeln erhältlich&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
    Für Innen- und Außenbereich geeignet&lt;br /&gt;
    Optionale Zugangskontrolle, z. B. RFID, Schlüsselschalter&lt;br /&gt;
    Mit drei verschieden großen Ladekabeln erhältlich&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=Modell 2 Zappi=&lt;br /&gt;
Status: Auswahlprozess&lt;br /&gt;
&lt;br /&gt;
Es gibt Stand 11/2022, mal abgesehen von Gehaeusefarbe (weisz/schwarz), Anschlussmoeglichkeit (Stecker/Kabel) und der Ladeleistung (22 kW/7kW),  3 Varianten. &lt;br /&gt;
&lt;br /&gt;
Bei der Suche nach der geeigneten Zappi ist fuer mich die Modellbezeichnung hilfreich:&lt;br /&gt;
&lt;br /&gt;
Die nachgestellte Buchstabenkombination (T U W B) steht wohl fuer &#039;&#039;&#039;B&#039;&#039;&#039;lack, &#039;&#039;&#039;W&#039;&#039;&#039;hite. &#039;&#039;&#039;T&#039;&#039;&#039; kommt mit Kabel (Tethered) und &#039;&#039;&#039;U&#039;&#039;&#039; mit Steckdose (Untethered). Die 22 kW Varianten fuehren &#039;&#039;&#039;22&#039;&#039;&#039; in der Bezeichnung und die 7,4 kW-Varianten &#039;&#039;&#039;07&#039;&#039;&#039; Ich habe auch schon die Bezeichnung 27 gesehen..&lt;br /&gt;
Das nachgestellte -T oder -A war mir lange nicht klar. Es gibt [https://myenergi.nl/wp-content/uploads/sites/4/2021/04/Zappi-2-Full-Manual-V1_6_2_T.pdf hier] eine Anleitung nur fuer die T-Modelle und haben einen Hinweis in einer Fusznote: -T variant is fully compliant with EN 61851-1:2019. Die A-Modelle benutzen anstatt 868 MHz, 915 MHz zur Kommunikation.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [https://myenergi.de/wp-content/uploads/2019/04/zappidatasheet_deutsch_0720_web.pdf hier].&lt;br /&gt;
&lt;br /&gt;
Weiter Links zur Info:&lt;br /&gt;
Diverse Links zur Information:&lt;br /&gt;
&lt;br /&gt;
Zappi Bedienungsanleitung:&lt;br /&gt;
myenergi.de/wp-content/uploads…eisung-v1.4_DE_120720.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zappi Schnellinstallationsanleitung:&lt;br /&gt;
myenergi.de/wp-content/uploads…V1_21_09_2020_Ansicht.pdf&lt;br /&gt;
&lt;br /&gt;
Zappi Datenblatt:&lt;br /&gt;
myenergi.de/wp-content/uploads…heet_deutsch_0720_web.pdf&lt;br /&gt;
&lt;br /&gt;
Infos bezüglich Probleme mit Kia und Hyundai:&lt;br /&gt;
myenergi.de/kia-e-niro/&lt;br /&gt;
&lt;br /&gt;
Hub Bedienungsanleitung:&lt;br /&gt;
myenergi.de/wp-content/uploads…ng_v.3.2.-DE-05_27_20.pdf&lt;br /&gt;
&lt;br /&gt;
Hub &amp;amp; App Datenblatt:&lt;br /&gt;
myenergi.de/wp-content/uploads…heet_deutsch_0520_web.pdf&lt;br /&gt;
&lt;br /&gt;
App Installation:&lt;br /&gt;
myenergi.de/wp-content/uploads…egistrierung_20_12_03.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Harvi Bedienungsanleitung:&lt;br /&gt;
myenergi.de/wp-content/uploads…weisung_v.1.0.DE-0520.pdf&lt;br /&gt;
&lt;br /&gt;
Harvi Schnellinstallationsanweisung:&lt;br /&gt;
myenergi.de/wp-content/uploads…ht_v.1.0.-DE-05_27_20.pdf&lt;br /&gt;
&lt;br /&gt;
FAQS:&lt;br /&gt;
myenergi.de/faqs/&lt;br /&gt;
&lt;br /&gt;
Firmware Update Anleitung:&lt;br /&gt;
myenergi.de/wp-content/uploads…irmware-update_081020.pdf&lt;br /&gt;
NEU (03.05.2021):&lt;br /&gt;
myenergi.com/updating-your-firmware/&lt;br /&gt;
&lt;br /&gt;
Firmware Versionen Zappi, Hub usw.:&lt;br /&gt;
support.myenergi.com/hc/en-gb/…Current-firmware-versions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CT Installationsleitfaden:&lt;br /&gt;
myenergi.de/wp-content/uploads…en_30_11_2020_Ansicht.pdf&lt;br /&gt;
&lt;br /&gt;
Englischsprachiges Forum:&lt;br /&gt;
myenergi.info/firmware-versions-t133.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Im [https://myenergi.de/wp-content/uploads/2020/08/zappi_quick_installationsguide_V1_21_09_2020_Ansicht.pdf Handbuch] werden folgende Modellbezeichnungen aufgefuehrt: Einphasig: 207TB, 207TB-T, 207TW, 207TW-T, 207UB, 207UB-T, 207UW, 207UW-T &lt;br /&gt;
Dreiphasig: 222TB, 207TB-T, 222TW, 222TW-T, 222UB, 222UB-T, 222UW, 222UW-T&lt;br /&gt;
&lt;br /&gt;
Wobei bei &#039;&#039;Dreiphasig&#039; das zweite Modell wohl 222TB-T heiszen soll.&lt;br /&gt;
&lt;br /&gt;
Zappi V1&lt;br /&gt;
&lt;br /&gt;
Gibt es die ueberhaupt noch?&lt;br /&gt;
&lt;br /&gt;
Das [https://myenergi.com/wiki/zappi-v1/ WIKI] gibt naehere Informationen.&lt;br /&gt;
&lt;br /&gt;
Zappi V2&lt;br /&gt;
&lt;br /&gt;
Das [https://myenergi.com/wiki/zappi-v2/ WIKI] gibt naehere Informationen.&lt;br /&gt;
&lt;br /&gt;
ZAPPI 222TB EAN: 761856647657 (Preis 11/22: 820 Euro)&lt;br /&gt;
&lt;br /&gt;
Zappi V2.1&lt;br /&gt;
&lt;br /&gt;
ZAPPI 2H22TB-T (Preis 11/22: 1100 Euro ohne Kabel, 1200 Euro mit Kabel)&lt;br /&gt;
&lt;br /&gt;
=Modell 3 ???=&lt;br /&gt;
Status: noch nicht gekauft&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=WRT54G_(Revival)&amp;diff=5204</id>
		<title>WRT54G (Revival)</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=WRT54G_(Revival)&amp;diff=5204"/>
		<updated>2026-07-31T15:53:34Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Wie so oft kann ich mich von alter ausgedienter Hardware nicht trennen und ueberlege was man mit so einem Schaetzchen wie dem WRT54G(L V1.1) noch so tun kann. Die Nutzung als AP ist nicht mehr zeitgemaesz, aber als Client kann ich mir einen Einsatz noch gut vorstellen. Abgesehen von der Tatsache dass ein Raspi doch etwas flinker ist, braucht man sich bei einem WRT54G keine Sorgen um sterbende SD-Karten zu machen. Und um ein paar kleine Routinen und Sensoren im Netzwerk einzubinden reicht die Performance der WRT54G in vielen Faellen.&lt;br /&gt;
&lt;br /&gt;
Durch ein paar kleine Hardwareeingriffe kann man den WRT54G mit einem SD-Kartenleser, mit 2 seriellen Schnittstellen und mit zwei USB-Ports (V1.1) ausstatten. Ein Variante, die ich im Netz gefunden habe, integriert noch einen Arduino-ProMicro in das Gehäuse und eroeffnet so ein riesiges Feld an Moeglichkeiten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HINWEIS:&#039;&#039;&#039; Das hier beschriebene Vorgehen der systematischen Analyse einer (Embedded-)Hardware laesst sich natuerlich vorgangsgleich auf andere Hardware anwenden. Es ist fuer mich oft der einzige (richtige) Weg, um ein tieferes Verstaendnis von Zusammenhaengen zu erkennen. Das immer wieder erstaunliche an der Sache ist, dass ab einem bestimmten Grad des Eintauchens sich viele Forenfragen in Luft aufloesen. Oder anders ausgedrueckt, macht man sich einmal diese Arbeit weisz man auf einmal was man tut und probiert nicht einfach nur rum.&lt;br /&gt;
&lt;br /&gt;
=DD-WRT vs. OpenWRT=&lt;br /&gt;
Ich bin hin- und hergerissen. Mit OpenWRT waren die Erfahrungen (Kamikaze, White Russian) aber eher schlecht. Danach habe ich lange Zeit DD-WRT (v3.0-r36247 std (06/29/18) KERNEL 2.4.37) benutzt und es ging so. Aber die 6 APs (mittlerweile durch Ubiquiti-APs ersetzt) im Haus haben immer irgendwie gezickt. &lt;br /&gt;
&lt;br /&gt;
Jetzt wo der AP-Modus keine Rolle mehr spielt und MMC, JFFS, CIFS, USB, TTYSXX und das Aufspielen neuer Software eine groeszere Rolle spielen, war ich mit DD-WRT irgendwie in einer gefuehlten Sackgasse. DD-WRT bietet zum Beispiel Unterstützung von ip (a und r aber nicht n) parallel zu ifconfig, route und arp, aber gibt z.B. keine Fehlermeldungen bei Befehlen wie mount, mkdir. Auch eine Hilfe sucht man vergebens. Da hilft oft nur ein Blick in den SourceCode was die Software tut, oder halt nicht wie gewohnt funktioniert. &lt;br /&gt;
&lt;br /&gt;
Der Support (DD-WRT) fuer CIFS, MMC und JFFS wird zwar in der WebGUI angeboten, laesst sich auch konfigurieren, aber CIFS und MMC lieszen sich nicht mounten und die Unterstuetzung von JFFS war auf der Konsole nicht auffindbar. &lt;br /&gt;
&lt;br /&gt;
Bei OpenWRT Backfire war es mir bisher nicht moeglich den WLAN-Treiber fuer den BCM4306 zum Laufen zu bringen. Das Backfire-Image 10.03.1  brcm-2.4 wird als stabil fuer WRT54G(V4/L) angegeben, meldet aber (dmesg) &amp;quot;No Broadcom Chipset&amp;quot; osae beim Laden des Treibers (:-(). Das Image brcm47xx wird dagegen als &amp;quot;works (somewhat unstable)&amp;quot; bewertet, laeuft bei mir bisher sauber. Ich weiß nicht auf was sich [https://openwrt.org/toh/linksys/wrt54g hier] das &#039;unstable&#039; bezieht. &lt;br /&gt;
&lt;br /&gt;
Um da einen Schritt vorwaerts zu machen, muss ich erst eine paar zurueck machen. &lt;br /&gt;
&lt;br /&gt;
Um schneller vergleichen zu koennen, habe ich einen Router mit Backfire 10.03.1 und den anderen mit DD-WRT v3.0 36247 laufen.   &lt;br /&gt;
&lt;br /&gt;
Aber der Reihe nach.&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
Um sich eine besser Bild von den Zusammenhaengen zu machen hier nochmal die Hardware im Ueberblick.&lt;br /&gt;
&lt;br /&gt;
==CPU==&lt;br /&gt;
Label: Broadcom BCM5352EKPBG &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# cat /proc/cpuinfo &lt;br /&gt;
system type             : Broadcom BCM5352 chip rev 0&lt;br /&gt;
processor               : 0&lt;br /&gt;
cpu model               : BCM3302 V0.8&lt;br /&gt;
BogoMIPS                : 199.47&lt;br /&gt;
wait instruction        : no&lt;br /&gt;
microsecond timers      : yes&lt;br /&gt;
tlb_entries             : 32&lt;br /&gt;
extra interrupt vector  : no&lt;br /&gt;
hardware watchpoint     : no&lt;br /&gt;
ASEs implemented        :&lt;br /&gt;
VCED exceptions         : not available&lt;br /&gt;
VCEI exceptions         : not available&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise: &lt;br /&gt;
&lt;br /&gt;
Die 199.47 BogoMIPS lassen auf 200 MHz und ein Verhältnis von 1 schlieszen. &lt;br /&gt;
&lt;br /&gt;
Der CPU-Kern BCM3302 findet auch in den SoC BCM4712, BCM53xx und BCM5836 Verwendung (siehe dazu http://oleg.wl500g.info/sdram.html)&lt;br /&gt;
&lt;br /&gt;
==SDRAM==&lt;br /&gt;
&lt;br /&gt;
Label: Winbond W9412G6JH-5&lt;br /&gt;
&lt;br /&gt;
Size: 2M x 4 BANKS * 16 BITS DDR SDRAM =&amp;gt; 16 MebiByte&lt;br /&gt;
&lt;br /&gt;
CELL-Array (Bank) Konfiguration: 4096 * 512 * 16 = 33.554.432 Bit mal 4 Baenke = 134.217.728 Bit = 16.777.216 Byte&lt;br /&gt;
&lt;br /&gt;
Adressraum: 0x000000 - 0xFFFFFF &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD_WRT:~# nvram show|grep sdram&lt;br /&gt;
sdram_config=0x0062&lt;br /&gt;
sdram_refresh=0x0000&lt;br /&gt;
sdram_ncdl=0xfe0008&lt;br /&gt;
sdram_init=0x010b&lt;br /&gt;
&lt;br /&gt;
DD-WRT:~# free&lt;br /&gt;
             total       used       free     shared    buffers     cached&lt;br /&gt;
Mem:         13004      11808       1196          0       1452       5180&lt;br /&gt;
-/+ buffers/cache:       5176       7828&lt;br /&gt;
Swap:            0          0          0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nuetzlicher Link:&lt;br /&gt;
&lt;br /&gt;
[http://oleg.wl500g.info/sdram.html]&lt;br /&gt;
&lt;br /&gt;
==Flash==&lt;br /&gt;
&lt;br /&gt;
Label: MXIC (Macronix) MX29LV320EBTI-70G&lt;br /&gt;
&lt;br /&gt;
Size: 4 MebiByte of 8 Bits each or 2 MebiBytes of 16&lt;br /&gt;
&lt;br /&gt;
Irgendwo habe ich gelesen, dass der WRT54G den 16 Bit-Zugriff nutzt.&lt;br /&gt;
&lt;br /&gt;
Adressierung: 0x000000 bis 0x3FFFFF&lt;br /&gt;
&lt;br /&gt;
Sector Structure  - 8K-Byte x 8 and 64K-Byte x 63•  Extra 256-Byte sector for securit&lt;br /&gt;
&lt;br /&gt;
DD-WRT:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Flash device: 0x400000 at 0x1c000000&lt;br /&gt;
bootloader size: 262144&lt;br /&gt;
Physically mapped flash: Filesystem type: squashfs, size=0x2c8102&lt;br /&gt;
partition size = 2930688&lt;br /&gt;
Creating 4 MTD partitions on &amp;quot;Physically mapped flash&amp;quot;:&lt;br /&gt;
0x00000000-0x00040000 : &amp;quot;cfe&amp;quot;&lt;br /&gt;
0x00040000-0x003f0000 : &amp;quot;linux&amp;quot;&lt;br /&gt;
0x00124800-0x003f0000 : &amp;quot;rootfs&amp;quot;&lt;br /&gt;
mtd: partition &amp;quot;rootfs&amp;quot; doesn&#039;t start on an erase block boundary -- force read-only&lt;br /&gt;
0x003f0000-0x00400000 : &amp;quot;nvram&amp;quot;&lt;br /&gt;
sflash not supported on this router&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Label cfe: 256 MebiByte (262.144 Byte) Bootloader&lt;br /&gt;
 Label linux:  3.776 MebiByte (3.866.624) darin enthalten (am Ende)  2.862 MebiByte (2.930.688) rootfs&lt;br /&gt;
 Label nvram: 64 KibiByte (65536) Configvariablen&lt;br /&gt;
&lt;br /&gt;
Was man hier jetzt erkennen kann, dass das eigentliche Image (.bin,.trx) sich im MTD-Device mit dem Label linux (inkl. dem Device rootfs) befindet. Fuer das Image bleiben 4 MebiByte minus 256 MebiByte (CFE Bootloader) minus 64 KibiByte (nvram) uebrig. Die Squashfs-Size (s.o.) 0x2c8102 (2.916.610 Byte) ist vermutlich die belegte Groesze in der linux-Partition.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Mit dem Programm mtd (http://www.linux-mtd.infradead.org/archive/tech/faq.html memory technology device) werden die Partitionen gemountet/administriert/...&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtd/&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   0 Jan  1 01:00 0&lt;br /&gt;
cr--r--r--    1 root     root       90,   1 Jan  1 01:00 0ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   2 Jan  1 01:00 1&lt;br /&gt;
cr--r--r--    1 root     root       90,   3 Jan  1 01:00 1ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   4 Jan  1 01:00 2&lt;br /&gt;
cr--r--r--    1 root     root       90,   5 Jan  1 01:00 2ro&lt;br /&gt;
crw-rw-rw-    1 root     root       90,   6 Jan  1 01:00 3&lt;br /&gt;
cr--r--r--    1 root     root       90,   7 Jan  1 01:00 3ro&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtdblock/&lt;br /&gt;
0  1  2  3&lt;br /&gt;
DD-WRT:~# ls -l /dev/mtdblock/&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   0 Jan  1 01:00 0&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   1 Jan  1 01:00 1&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   2 Jan  1 01:00 2&lt;br /&gt;
brw-rw-rw-    1 root     root       31,   3 Jan  1 01:00 3&lt;br /&gt;
&lt;br /&gt;
DD-WRT:~# mtd&lt;br /&gt;
Usage: mtd [&amp;lt;options&amp;gt; ...] &amp;lt;command&amp;gt; [&amp;lt;arguments&amp;gt; ...] &amp;lt;device&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The device is in the format of mtdX (eg: mtd4) or its label.&lt;br /&gt;
mtd recognizes these commands:&lt;br /&gt;
        unlock                  unlock the device&lt;br /&gt;
        resetbc                 reset bootcounter for WRT1900AC/WRT1200AC/WRT1900ACv2&lt;br /&gt;
        erase                   erase all data on device&lt;br /&gt;
        write &amp;lt;imagefile&amp;gt;|-     write &amp;lt;imagefile&amp;gt; (use - for stdin) to device&lt;br /&gt;
Following options are available:&lt;br /&gt;
        -q                      quiet mode (once: no [w] on writing,&lt;br /&gt;
                                           twice: no status messages)&lt;br /&gt;
        -r                      reboot after successful command&lt;br /&gt;
        -f                      force write without trx checks&lt;br /&gt;
        -e &amp;lt;device&amp;gt;             erase &amp;lt;device&amp;gt; before executing the command&lt;br /&gt;
&lt;br /&gt;
Example: To write linux.trx to mtd4 labeled as linux and reboot afterwards&lt;br /&gt;
         mtd -r write linux.trx linux&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CFE (Common Firmware Environment) Bootloader===&lt;br /&gt;
&lt;br /&gt;
CFE ist nicht nur der Bootloader (fuer Broadcom), sondern auch ein Interface fuer die Hardware.&lt;br /&gt;
&lt;br /&gt;
Auf Github befindet sich der [https://github.com/kevbroch/cfe Sourcecode].&lt;br /&gt;
&lt;br /&gt;
 Definition [https://academic.microsoft.com/topic/203009010/publication/search?q=Common%20Firmware%20Environment&amp;amp;qe=And(Composite(F.FId%253D203009010)%252CTy%253D%270%27)&amp;amp;f=&amp;amp;orderBy=0]&lt;br /&gt;
 Common Firmware Environment (CFE), pronounced as &#039;cafe&#039;, is a firmware interface and bootloader developed by Broadcom for 32-bit and 64-bit system- on-a-chip systems. It is intended to be a flexible toolkit of CPU initialization and bootstrap code for use on embedded processors (typically running on MIPS32/64 instruction set CPUs found in Broadcom SoCs). It is roughly analogous to the BIOS on the IBM PC platform. Its source-code is available on Open source license from Broadcom. Common embedded system alternatives include Das U-Boot.&lt;br /&gt;
&lt;br /&gt;
Da das CFE mit dem BIOS bei einem PC vergleichbar ist, kann man sich vorstellen, dass sollte da ein &amp;quot;Defekt&amp;quot; vorliegen, die einfachen Mechanismen zum wiederherstellen der Embedded Hardware schwieriger werden. Manchmal wird in diesem Zusammenhang auch schon von &amp;quot;bricked&amp;quot; gesprochen. Dies ist aber nicht ganz richtig. Es bleiben in diesem Fall noch mindestens 2 Moeglichkeiten der Rettung: Erstens JTAG und zweitens Flash ausloeten und extern behandeln! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Mit der zweiten Moeglichkeit habe ich mal ein Panasonic-Notebook mit verlorenem BIOS-Passwort wiederbelebt, obwohl selbst Panasonic behauptet hat, dass es da keine Rettung gaebe, da ihre BIOSe sicher seien und keine (SW-)Moeglichkeit des Passwortruecksetzens besteht. Also wer so einen &amp;quot;hoffnungslosen&amp;quot; Fall hat, dem kann ich gerne weiterhelfen.&lt;br /&gt;
&lt;br /&gt;
Interessant ist auch der Hinweis im [https://en.wikipedia.org/wiki/Common_Firmware_Environment Wiki], dass CFE auch in SmartTVs von LG und Samsung Einsatz findet. Sogar Amiga (meinen hab ich noch:-))) NG nutzt ihn.&lt;br /&gt;
&lt;br /&gt;
===Linux (Image/Squashfs)===&lt;br /&gt;
&lt;br /&gt;
Am Beispiel eines (alten) Images sei die Konvertierung von bin nach trx (und ggf. zuerueck) gezeigt.&lt;br /&gt;
&lt;br /&gt;
 dd if=lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin of=lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx bs=32 skip=1&lt;br /&gt;
&lt;br /&gt;
Mit diesem Befehl werden die ersten 32 Byte des Bin-Images entfernt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads # ll lede*&lt;br /&gt;
-rw-r--r-- 1 chris users &#039;&#039;&#039;4001824&#039;&#039;&#039; Jul 27 21:22 lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin&lt;br /&gt;
-rw-r--r-- 1 root  root  &#039;&#039;&#039;4001792&#039;&#039;&#039; Jul 29 22:59 lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.bin|more&lt;br /&gt;
00000000  57 35 34 47 00 00 00 00  13 06 16 04 47 01 55 32  |W54G........G.U2|&lt;br /&gt;
00000010  4e 44 00 06 1f 00 00 00  00 00 00 00 00 00 00 00  |ND..............|&lt;br /&gt;
00000020  48 44 52 30 00 10 3d 00  3d a6 e1 7b 00 00 01 00  |HDR0..=.=..{....|&lt;br /&gt;
00000030  1c 00 00 00 24 09 00 00  00 54 12 00 1f 8b 08 00  |....$....T......|&lt;br /&gt;
00000040  00 00 00 00 02 03 8d 57  5d 68 1c d7 15 fe e6 ee  |.......W]h......|&lt;br /&gt;
00000050  ac b4 fa 4b 47 ab 95 b3  8e 55 32 d7 ba 5a 6d bd  |...KG....U2..Zm.|&lt;br /&gt;
00000060  2e dd b8 ae ab 87 2d 9d  ae 64 23 8a 1f d6 3f 69  |......-..d#...?i|&lt;br /&gt;
00000070  4d 29 61 51 44 f1 43 a0  72 d3 80 1f fa 30 28 4a  |M)aQD.C.r....0(J|&lt;br /&gt;
00000080  11 45 78 36 60 83 1e 4c  59 d6 92 a3 94 45 2b 3b  |.Ex6`..LY....E+;|&lt;br /&gt;
00000090  4a ea 42 9d 2c c2 6d 5a  68 a1 50 43 fd d2 22 42  |J.B.,.mZh.PC..&amp;quot;B|&lt;br /&gt;
000000a0  1e f2 54 f2 d0 36 6e 42  3b fd ce ec 6c ad 3a 36  |..T..6nB;...l.:6|&lt;br /&gt;
000000b0  cd c2 72 67 ee cf 39 df  fd ce 39 df bd b3 e0 7f  |..rg..9...9.....|&lt;br /&gt;
000000c0  be f4 87 f0 f6 b8 83 b5  56 06 eb ad 2c ae b7 c6  |........V...,...|&lt;br /&gt;
000000d0  f0 5a ab ea f7 97 80 19  0d 3f 59 3a 3f bc 6e e0  |.Z.......?Y:?.n.|&lt;br /&gt;
000000e0  f7 94 b2 4f ff da 00 1b  2b c0 72 d3 c6 ba 6b 63  |...O....+.r...kc|&lt;br /&gt;
000000f0  c9 3d 94 ba 8e 8f 43 37  03 fe 2c df f1 30 36 6c  |.=....C7..,..06l|&lt;br /&gt;
00000100  cc 72 51 65 e1 a6 a5 6f  f1 27 c3 50 48 19 7b 39  |.rQe...o.&#039;.PH.{9|&lt;br /&gt;
00000110  af fc 44 da 98 5a 45 ed  bc 9a 86 85 d3 39 ec a6  |..D..ZE......9..|&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C lede-17.01.7-brcm47xx-legacy-linksys-wrt54g-squashfs.trx|more&lt;br /&gt;
00000000  48 44 52 30 00 10 3d 00  3d a6 e1 7b 00 00 01 00  |HDR0..=.=..{....|&lt;br /&gt;
00000010  1c 00 00 00 24 09 00 00  00 54 12 00 1f 8b 08 00  |....$....T......|&lt;br /&gt;
00000020  00 00 00 00 02 03 8d 57  5d 68 1c d7 15 fe e6 ee  |.......W]h......|&lt;br /&gt;
00000030  ac b4 fa 4b 47 ab 95 b3  8e 55 32 d7 ba 5a 6d bd  |...KG....U2..Zm.|&lt;br /&gt;
00000040  2e dd b8 ae ab 87 2d 9d  ae 64 23 8a 1f d6 3f 69  |......-..d#...?i|&lt;br /&gt;
00000050  4d 29 61 51 44 f1 43 a0  72 d3 80 1f fa 30 28 4a  |M)aQD.C.r....0(J|&lt;br /&gt;
00000060  11 45 78 36 60 83 1e 4c  59 d6 92 a3 94 45 2b 3b  |.Ex6`..LY....E+;|&lt;br /&gt;
00000070  4a ea 42 9d 2c c2 6d 5a  68 a1 50 43 fd d2 22 42  |J.B.,.mZh.PC..&amp;quot;B|&lt;br /&gt;
00000080  1e f2 54 f2 d0 36 6e 42  3b fd ce ec 6c ad 3a 36  |..T..6nB;...l.:6|&lt;br /&gt;
00000090  cd c2 72 67 ee cf 39 df  fd ce 39 df bd b3 e0 7f  |..rg..9...9.....|&lt;br /&gt;
000000a0  be f4 87 f0 f6 b8 83 b5  56 06 eb ad 2c ae b7 c6  |........V...,...|&lt;br /&gt;
000000b0  f0 5a ab ea f7 97 80 19  0d 3f 59 3a 3f bc 6e e0  |.Z.......?Y:?.n.|&lt;br /&gt;
000000c0  f7 94 b2 4f ff da 00 1b  2b c0 72 d3 c6 ba 6b 63  |...O....+.r...kc|&lt;br /&gt;
000000d0  c9 3d 94 ba 8e 8f 43 37  03 fe 2c df f1 30 36 6c  |.=....C7..,..06l|&lt;br /&gt;
000000e0  cc 72 51 65 e1 a6 a5 6f  f1 27 c3 50 48 19 7b 39  |.rQe...o.&#039;.PH.{9|&lt;br /&gt;
000000f0  af fc 44 da 98 5a 45 ed  bc 9a 86 85 d3 39 ec a6  |..D..ZE......9..|&lt;br /&gt;
00000100  8e 1a cf b1 ca d3 29 78  18 31 f6 ea 88 b5 1f 67  |......)x.1.....g|&lt;br /&gt;
00000110  54 da 03 f6 23 af d2 35  1a d8 f5 3d 7c c0 bf 9f  |T...#..5...=|...|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Header des Bin-Images (57 35 34 47 00 00 00 00  13 06 16 04 47 01 55 32 4e 44 00 06 1f 00 00 00  00 00 00 00 00 00 00 00) muss ich mir bei Gelegenheit mal noch genauer anschauen.&lt;br /&gt;
&lt;br /&gt;
Fuer die kleine Image-Analyse ist das Programm &#039;binwalk&#039; recht nuetzlich.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads # binwalk dd-wrt.v24_std_generic_36247.bin &lt;br /&gt;
&lt;br /&gt;
DECIMAL       HEXADECIMAL     DESCRIPTION&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
0             0x0             TRX firmware header, little endian, image size: 3858432 bytes, CRC32: 0xA663F3EF, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x9D0, rootfs offset: 0xE4800&lt;br /&gt;
28            0x1C            gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)&lt;br /&gt;
2512          0x9D0           LZMA compressed data, properties: 0x6E, dictionary size: 33554432 bytes, uncompressed size: 2985984 bytes&lt;br /&gt;
935936        0xE4800         Squashfs filesystem, little endian, DD-WRT signature, version 3.0, size: 2916610 bytes, 690 inodes, blocksize: 131072 bytes, created: 2018-06-29 09:09:45&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # binwalk dd-wrt.v24_mini_generic_44715.bin&lt;br /&gt;
&lt;br /&gt;
DECIMAL       HEXADECIMAL     DESCRIPTION&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
0             0x0             TRX firmware header, little endian, image size: 3375104 bytes, CRC32: 0x9886060E, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0xA34, rootfs offset: 0xCF400&lt;br /&gt;
28            0x1C            gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)&lt;br /&gt;
2612          0xA34           LZMA compressed data, properties: 0x6E, dictionary size: 33554432 bytes, uncompressed size: 2756608 bytes&lt;br /&gt;
848896        0xCF400         Squashfs filesystem, little endian, DD-WRT signature, version 3.0, size: 2521285 bytes, 650 inodes, blocksize: 131072 bytes, created: 2020-11-03 04:01:08&lt;br /&gt;
&lt;br /&gt;
worker:/home/chris/Downloads # hexdump -C  dd-wrt.v24_mini_generic_44715.bin |more&lt;br /&gt;
00000000  48 44 52 30 00 80 33 00  0e 06 86 98 00 00 01 00  |HDR0..3.........|&lt;br /&gt;
00000010  1c 00 00 00 34 0a 00 00  00 f4 0c 00 1f 8b 08 00  |....4...........|&lt;br /&gt;
00000020  00 00 00 00 02 03 95 58  5d 6c 14 d7 15 3e 33 b3  |.......X]l...&amp;gt;3.|&lt;br /&gt;
00000030  eb dd b5 dd 74 d6 ec 3a  a6 71 61 27 7b 67 3d b1  |....t..:.qa&#039;{g=.|&lt;br /&gt;
00000040  f3 b0 20 8b 6e ab 7d 18  d6 b6 ba a5 a9 e4 90 54  |.. .n.}........T|&lt;br /&gt;
00000050  72 db 3c 58 04 28 aa 2a  95 a4 50 f1 40 db 09 01  |r.&amp;lt;X.(.*..P.@...|&lt;br /&gt;
00000060  e2 46 0e b3 a8 04 f9 a1  55 b6 36 6b d6 68 61 96  |.F......U.6k.ha.|&lt;br /&gt;
00000070  14 42 2b 85 c6 b5 b0 01  a9 aa 48 db a4 95 da 07  |.B+.......H.....|&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also haben wir nach dem BIN-Header (s.o.) auch noch einen TRX-Header (28 Bytes: 48 44 52 30 00 80 33 00  0e 06 86 98 00 00 01 00 1c 00 00 00 34 0a 00 00  00 f4 0c 00)&lt;br /&gt;
&lt;br /&gt;
Ab 0x1C steht der gzip-header beginnend mit der Magic Number (1f 8b). Siehe dazu [https://en.wikipedia.org/wiki/Gzip weiter]&lt;br /&gt;
&lt;br /&gt;
Um die Analyse weiter zu treiben habe ich noch ein paar Zusatzpakete unter OpenSuSE (15.3) installiert.&lt;br /&gt;
&lt;br /&gt;
 zypper in openocd&lt;br /&gt;
 zypper in sasquatch&lt;br /&gt;
 zypper in bcm43xx-firmware&lt;br /&gt;
 zypper in pullin-bcm43xx-firmware&lt;br /&gt;
&lt;br /&gt;
Um sasquatch zu installieren war bei mir noch ein Repo hinzuzufuegen.&lt;br /&gt;
&lt;br /&gt;
 zypper ar &amp;quot;https://download.opensuse.org/repositories/devel:/tools/openSUSE_Leap_15.3/&amp;quot; DEVEL&lt;br /&gt;
&lt;br /&gt;
Mit sasqautch war nun auch binwalk mit dem extrahieren der SquachFS-Partition erfolgreich.  &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
binwalk --extract dd-wrt.v24_std_generic_44715.bin&lt;br /&gt;
worker:/home/chris/Downloads # ll _dd-wrt.v24_std_generic_44715.bin.extracted/&lt;br /&gt;
total 8944&lt;br /&gt;
-rw-r--r--  1 root root    4816 Jul 31 09:19 1C&lt;br /&gt;
-rw-r--r--  1 root root 2748416 Jul 31 09:19 A34&lt;br /&gt;
-rw-r--r--  1 root root 3622348 Jul 31 09:19 A34.7z&lt;br /&gt;
-rw-r--r--  1 root root 2772622 Jul 31 09:19 CF400.squashfs&lt;br /&gt;
drwxr-xr-x 15 root root    4096 Nov  3  2020 squashfs-root&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Namen der extrahierten Dateien ist die hexadezimale Position im bin-File. Zusaetzlich zu sind die Inhalte bei A34 und CF400 noch dekomprimiert angelegt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads/_dd-wrt.v24_std_generic_44715.bin.extracted # 7z l A34.7z &lt;br /&gt;
&lt;br /&gt;
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21&lt;br /&gt;
p7zip Version 16.02 (locale=de_DE.UTF-8,Utf16=on,HugeFiles=on,64 bits,16 CPUs Intel(R) Xeon(R) CPU           X5570  @ 2.93GHz (106A5),ASM)&lt;br /&gt;
&lt;br /&gt;
Scanning the drive for archives:&lt;br /&gt;
1 file, 3622348 bytes (3538 KiB)&lt;br /&gt;
&lt;br /&gt;
Listing archive: A34.7z&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Path = A34.7z&lt;br /&gt;
Open WARNING: Can not open the file as [7z] archive&lt;br /&gt;
Type = lzma&lt;br /&gt;
&lt;br /&gt;
   Date      Time    Attr         Size   Compressed  Name&lt;br /&gt;
------------------- ----- ------------ ------------  ------------------------&lt;br /&gt;
                    .....      2748416               A34&lt;br /&gt;
------------------- ----- ------------ ------------  ------------------------&lt;br /&gt;
                               2748416      3622348  1 files&lt;br /&gt;
&lt;br /&gt;
Warnings: 1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
unsquashfs fuehrte hier nicht zum Erfolg. Da die Magic Number von 0x73717368 auf 0x74717368 (Grrrr!) geaendert wurde.&lt;br /&gt;
Siehe hierzu [https://github.com/jtreml/firmware-mod-kit]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
worker:/home/chris/Downloads/_dd-wrt.v24_std_generic_44715.bin.extracted # sasquatch -i CF400.squashfs &lt;br /&gt;
SquashFS version [3.0] / inode count [700] suggests a SquashFS image of the same endianess&lt;br /&gt;
Non-standard SquashFS Magic: hsqt&lt;br /&gt;
Parallel unsquashfs: Using 1 processor&lt;br /&gt;
Trying to decompress using default gzip decompressor...&lt;br /&gt;
Trying to decompress with lzma...&lt;br /&gt;
Trying to decompress with lzma-adaptive...&lt;br /&gt;
Detected lzma-adaptive compression&lt;br /&gt;
654 inodes (693 blocks) to write&lt;br /&gt;
&lt;br /&gt;
squashfs-root&lt;br /&gt;
dir_scan: failed to make directory squashfs-root, because File exists&lt;br /&gt;
&lt;br /&gt;
created 0 files&lt;br /&gt;
created 0 directories&lt;br /&gt;
created 0 symlinks&lt;br /&gt;
created 0 devices&lt;br /&gt;
created 0 fifos&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
https://reverseengineering.stackexchange.com/questions/15508/how-to-convert-the-dumped-firmware-from-linksys-wrt54gl-via-jtag-port-in-an-un&lt;br /&gt;
&lt;br /&gt;
===NVRAM===&lt;br /&gt;
&lt;br /&gt;
NonVolatileRAM. Die (Config-)Variablen zur Einstellung der Linux-Umgebung auf der (Embedded-)Hardware werden zur Laufzeit im RAM abgelegt und beim Booten aus der Partition mit dem Label nvram geladen. Das erklaert auch warum man nach einer Aenderung einer Variablen mit &#039;nvram commit&#039; die Aenderungen in die Flash-Partitiion uebertraegt und somit &#039;nichtfluechtig&#039; macht. Vergisst man nach einer Variablenaenderung das Committen (sich bekennen, verpflichten: Sinn?) geht die Aenderung bei einem  Reboot verloren.&lt;br /&gt;
&lt;br /&gt;
==Weitere WRT54G Hardware==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
DD-WRT:~# cat /proc/pci &lt;br /&gt;
PCI devices found:&lt;br /&gt;
  Bus  0, device   0, function  0:&lt;br /&gt;
    Class 0501: PCI device 14e4:0800 (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18000000 [0x18000fff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1fc00000 [0x1fffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1c000000 [0x1dffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x1a000000 [0x1bffffff].&lt;br /&gt;
  Bus  0, device   1, function  0:&lt;br /&gt;
    Class 0200: PCI device 14e4:4713 (rev 0).&lt;br /&gt;
      IRQ 4.&lt;br /&gt;
      Master Capable.  Latency=64.  &lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18001000 [0x18001fff].&lt;br /&gt;
  Bus  0, device   2, function  0:&lt;br /&gt;
    Class 0b30: PCI device 14e4:0816 (rev 0).&lt;br /&gt;
      IRQ 5.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18002000 [0x18002fff].&lt;br /&gt;
  Bus  0, device   3, function  0:&lt;br /&gt;
    Class 0c03: PCI device 14e4:4716 (rev 0).&lt;br /&gt;
      IRQ 6.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18003000 [0x18003fff].&lt;br /&gt;
  Bus  0, device   4, function  0:&lt;br /&gt;
    Class 0500: PCI device 14e4:080f (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18004000 [0x18004fff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x0 [0x7ffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x10000000 [0x17ffffff].&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x80000000 [0x9fffffff].&lt;br /&gt;
  Bus  0, device   5, function  0:&lt;br /&gt;
    Class 0280: PCI device 14e4:4320 (rev 0).&lt;br /&gt;
      IRQ 2.&lt;br /&gt;
      Master Capable.  Latency=64.  &lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18005000 [0x18005fff].&lt;br /&gt;
  Bus  0, device   6, function  0:&lt;br /&gt;
    Class 0280: PCI device 14e4:4719 (rev 0).&lt;br /&gt;
      IRQ 3.&lt;br /&gt;
      Non-prefetchable 32 bit memory at 0x18006000 [0x18006fff].&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://devicehunt.com/view/type/pci/vendor/14E4&lt;br /&gt;
&lt;br /&gt;
* BUS 0/DEVICE 0 14e4:0800 Sentry5 Chipcommon I/O Controller&lt;br /&gt;
* BUS 0/DEVICE 1 14e4:4713 Sentry5 Ethernet Controller&lt;br /&gt;
* BUS 0/DEVICE 2 14e4:0816 BCM3302 Sentry5 MIPS32 CPU&lt;br /&gt;
* BUS 0/DEVICE 3 14e4:4716 BCM47xx Sentry5 USB Host Controller&lt;br /&gt;
* BUS 0/DEVICE 4 14e4:080f Sentry5 DDR/SDR RAM Controller&lt;br /&gt;
* BUS 0/DEVICE 5 14e4:4320 BCM4306 802.11b/g Wireless LAN Controller&lt;br /&gt;
* BUS 0/DEVICE 6 14e4:4719 BCM47xx/53xx RoboSwitch Core&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Passende Treiber:&lt;br /&gt;
 BCM4306 	PCI 	14e4:4320 	Broadcom 	WEP WPA WPA2 	b/g 	b43, b43legacy - Firmware muss installiert werden. Die Benötigte Firmwaredatei ucode4/5.fw ist nur in dem weiter unten im Forum verlinkten älteren Installationspaket enthalten!&lt;br /&gt;
&lt;br /&gt;
https://linux-club.de/wiki/opensuse/Broadcom_Wireless&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# firmware for b43&lt;br /&gt;
URL1=http://www.lwfinger.com/b43-firmware&lt;br /&gt;
FILE1=broadcom-wl-6.30.163.46.tar.bz2&lt;br /&gt;
FIRMWARE1=broadcom-wl-6.30.163.46.wl_apsta.o&lt;br /&gt;
&lt;br /&gt;
# firmware for b43legacy&lt;br /&gt;
URL2=http://downloads.openwrt.org/sources&lt;br /&gt;
FILE2=wl_apsta-3.130.20.0.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Pimpups=&lt;br /&gt;
==SDCard==&lt;br /&gt;
Um es vorweg zu nehmen: Lasst es! &lt;br /&gt;
&lt;br /&gt;
Es funktioniert zwar, aber es ist so langsam, dass es in der Praxis keinen Vorteil bringt.&lt;br /&gt;
&lt;br /&gt;
Ich habe als SDCard-Adapter diesen hier verwendet.&lt;br /&gt;
[[Datei:WRT54 SDCARD PCB top.jpg|mini]]&lt;br /&gt;
[[Datei:WRT54 SDCARD PCB bottom.jpg|mini]]&lt;br /&gt;
Auf der Karte ist ein 5C-&amp;gt;3.3V Stabi, so dass ich die Karte an 5V anschliessen konnte.&lt;br /&gt;
&lt;br /&gt;
Vom Insert bis Mount kann schon mal ne Minute dauern.&lt;br /&gt;
&lt;br /&gt;
==SERCON==&lt;br /&gt;
&lt;br /&gt;
Da der WRT54G 2 serielle Schnittstellen an JP2 anbietet kann im einfachsten Fall eine als Konsole und er zweite zur Kommunikation mit z. B. einem  Microcontroller verwendet werden. Aber auch eine virtuelle Anbindung über Sercon wäre eine schöne Sache.&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Serial Interface==&lt;br /&gt;
&lt;br /&gt;
[https://store.curiousinventor.com/product/spk-wrt-serial-port-kit-for-wrt54g-router/]&lt;br /&gt;
&lt;br /&gt;
==OneWire==&lt;br /&gt;
&lt;br /&gt;
[https://owfs.org/index_php_page_wireless-router.html]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
&lt;br /&gt;
=WIKI Hinweise=&lt;br /&gt;
&lt;br /&gt;
To support third-party firmware, Linksys has re-released the WRT54G v4, under the new model name WRT54GL (the &#039;L&#039; in this name allegedly stands for &#039;Linux&#039;). It is also possible to replace the 2 MB flash chip in the WRT54G with a 4 MB flash chip. The Macronix International 29LV320BTC-90 is a suitable part although others may work as well. The user must first install a JTAG header and use a JTAG cable to back up the firmware, then replace the chip and restore the firmware with the JTAG cable. After testing for proper functionality of the modified unit, third-party firmware can be flashed using the JTAG cable and a suitable image file.&lt;br /&gt;
&lt;br /&gt;
With the Attitude Adjustment (12.09)[46] release of OpenWrt, all WRT54G hardware versions with 16 MB of RAM are no longer supported, and older Backfire (10.03)[47] is recommended instead. Issues came from dropping support for the legacy Broadcom target brcm-2.4, making lower end devices run out of memory easily. Support for Attitude Adjustment is limited to WRT54G hardware versions with 32 MB of RAM, which includes WRT54GS and (apart from performing RAM upgrades through hardware modifications) some of the WRT54G and WRT54GL versions having the capability for unlocking their additional 16 MB of RAM.[48][49][50][51][52][53]&lt;br /&gt;
&lt;br /&gt;
=JTAG=&lt;br /&gt;
Nur der Vollstaendigkeit wegen hier noch ein paar Worte zu JTAG.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;J&#039;&#039;&#039;oint &#039;&#039;&#039;T&#039;&#039;&#039;est &#039;&#039;&#039;A&#039;&#039;&#039;ction &#039;&#039;&#039;G&#039;&#039;&#039;roup (kurz JTAG) ist ein häufig verwendetes Synonym für den IEEE-Standard 1149.1, der eine Methodik für das Testen und Debuggen integrierter Schaltungen, also Hardware auf Leiterplatten, beschreibt.&lt;br /&gt;
&lt;br /&gt;
[https://www.linux-magazin.de/ausgaben/2010/06/diagnosewerkzeug/ Einstieg]&lt;br /&gt;
&lt;br /&gt;
JTAG besteht aus nur 4+2 Pins TCK, TMS, TDI und TDO. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|JTAG-Interface&lt;br /&gt;
|-&lt;br /&gt;
|PIN&lt;br /&gt;
|Name&lt;br /&gt;
|Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|TCK&lt;br /&gt;
|Test Clock&lt;br /&gt;
|Takt der Datenuebertragung&lt;br /&gt;
|-&lt;br /&gt;
|TMS&lt;br /&gt;
|Test Mode Select&lt;br /&gt;
|Navigation im Zustandsautomaten&lt;br /&gt;
|-&lt;br /&gt;
|TDI&lt;br /&gt;
|Test Data In&lt;br /&gt;
|Daten Adapter-&amp;gt;Geraet&lt;br /&gt;
|-&lt;br /&gt;
|TDO&lt;br /&gt;
|Test Data Out&lt;br /&gt;
|Daten Adapter&amp;lt;-Geraet&lt;br /&gt;
|-&lt;br /&gt;
|/TRST&lt;br /&gt;
|Test Reset&lt;br /&gt;
|Zustandsautomat in Ausgangszustand&lt;br /&gt;
|-&lt;br /&gt;
|/SRST&lt;br /&gt;
|System Reset&lt;br /&gt;
|Hardwarereset&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt keine einheitliche Steckerbelegung für JTAG-Anschluesse.&lt;br /&gt;
&lt;br /&gt;
==Debrick==&lt;br /&gt;
&lt;br /&gt;
[https://zedt.eu/tech/hardware/recovering-a-bricked-linksys-wrt54gl-v1-1-using-jtag-part-1-the-hardware/]&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Weiterfuehrende Links/Analysen/Techniken=&lt;br /&gt;
&lt;br /&gt;
https://www.heise.de/ct/ausgabe/2013-21-Hinter-den-Kulissen-eines-Router-Botnets-2313886.html&lt;br /&gt;
&lt;br /&gt;
https://www.heise.de/newsticker/meldung/Funkregulierung-als-Angriff-auf-alternative-Software-Open-Source-Projekte-gefaehrdet-2805855.html&lt;br /&gt;
&lt;br /&gt;
https://forum.ubuntuusers.de/topic/netzwerkkarte-nach-deaktivierung-im-autostart/#post-2480236&lt;br /&gt;
&lt;br /&gt;
https://www.broadcom.com/support/802.11&lt;br /&gt;
&lt;br /&gt;
https://t3n.de/news/sicherheitsluecke-milliarde-1257306/&lt;br /&gt;
&lt;br /&gt;
https://www.agner.org/optimize/ objconv&lt;br /&gt;
&lt;br /&gt;
https://rjmendez.github.io/posts/2019/02/Indeed_CTF_Embedded_2/&lt;br /&gt;
&lt;br /&gt;
https://berlioux.com/electronique/wrt-sim/wrt-sim-en.html&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=WLAN_Schaltsteckdose&amp;diff=5203</id>
		<title>WLAN Schaltsteckdose</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=WLAN_Schaltsteckdose&amp;diff=5203"/>
		<updated>2026-07-31T15:53:33Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
&amp;quot;OMG, warum baut der eine WLAN-Steckdosenleiste, wenn&#039;s sowas doch fertig zu kaufen gibt?&amp;quot;&lt;br /&gt;
[https://www.smarthomearea.de/bestenlisten-fuer-alle-smart-home-geraete/bestenliste-top-10-wifi-steckdosenleisten-wlan-steckdosenleisten-vernetzte-mehrfachsteckdosen-amazon-echo-alexa-google-home-assistant-9463/]&lt;br /&gt;
&lt;br /&gt;
Die meisten, bzw. alle, die ich bis jetzt gefunden habe erfuellen nicht alle Kriterien und die Betonung liegt auf Steckdosenleiste.&lt;br /&gt;
&lt;br /&gt;
Auswahlbedingungen:&lt;br /&gt;
* Rueckmeldefunktion: schaltbar von mehreren &amp;quot;Stellen&amp;quot; mit gegenseitiger Anzeige des aktuellen Schaltzustandes.&lt;br /&gt;
* FHEM-Intergration, oder &amp;quot;offene&amp;quot;-Schnittstelle. Eine Smartphone-App-Steuerung ist ja selten daemlich. &lt;br /&gt;
* Cloudfree Wie viele Apps/Clouds soll ich noch installieren.&lt;br /&gt;
* Skalierbar 2,3,4,... Steckdosen.&lt;br /&gt;
* evtl. Dimmerfunktion&lt;br /&gt;
* Preis, selbst wenn man SONOFF (z.B. SONOFF POW R2 1 Kanal Schaltaktor WLAN, mit Messfunktion) nimmt.&lt;br /&gt;
&lt;br /&gt;
==Smartphone-App-Steuerung==&lt;br /&gt;
Schalten muss schnell und einfach sein!&lt;br /&gt;
&lt;br /&gt;
Was nutzt es mir wenn ich fuer jeden Smartplug-Hersteller eine andere App benoetige.&lt;br /&gt;
&lt;br /&gt;
Selbst wenn ein Schlauer auf die Idee kommt, alles in einer App zu integrieren, muss ich idR die App oeffnen und navigieren. Da nutzen auch keine SprachassistentINNEN, solange ER nicht Jarvis heiszt und mit WENIGEN Angaben weiss, was ER zu tun hat.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
=Vorhaben 1=&lt;br /&gt;
[[Datei:Schaltsteckdosenleiste.jpg|mini]]&lt;br /&gt;
Einzeln schaltbare Steckdosenleisten sind schon unter 10 Euro zu haben. Ein Umbau lohnt eigentlich nicht. Da die Einbausteckdose 713 von Bals schon fuer 2 Euro/Stueck zu haben ist. Na gut, man muss den Gehaeusepreis dazurechnen. Als Gehaeuse kann ein Stueck Kabelkanal dienen.&lt;br /&gt;
[[Datei:Bals Einbausteckdose.png|mini]]&lt;br /&gt;
=Vorhaben 2=&lt;br /&gt;
[[Datei:Schaltsteckdosenleiste selbstbau.jpg|mini]]&lt;br /&gt;
&lt;br /&gt;
=Vorhaben 3=&lt;br /&gt;
[[Datei:SteckdosenleisteinBox.jpg|mini]]&lt;br /&gt;
&lt;br /&gt;
=NodeMCU=&lt;br /&gt;
Allen Vorhaben liegen aehnliche Forderungen zugrunde.&lt;br /&gt;
* WLAN-Anbindung&lt;br /&gt;
* MQTT-Steuerung&lt;br /&gt;
* Toggletaster &lt;br /&gt;
* Signalisierung Schaltzustand&lt;br /&gt;
* 1-polige-/2-polige-Trennung&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Ausgehend von dem Testprogramm aus dem Artikel [[NodeMCU]] beginnt jetzt die Bereinigung, Optimierung und Anpassung des Codes.&lt;br /&gt;
Der Uebersichtlichkeit geschuldet packe ich die Kommentare in den Quellcode.&lt;br /&gt;
&lt;br /&gt;
Forderung an die Software:&lt;br /&gt;
* Parameter zur Anpassung&lt;br /&gt;
* Interrupts &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Firmware NodeMCU (ESP8266) Schaltsteckdose&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//funktioniert 20210821 mit NodeMCU ueber USB&lt;br /&gt;
//Blink fehlt noch&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;            // in den DHT examples benutzt&lt;br /&gt;
#include &amp;lt;Ticker.h&amp;gt;             // in den DHT examples benutzt, esp8266 library that calls functions periodically&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;        // Include the Wi-Fi library&lt;br /&gt;
#include &amp;lt;PubSubClient.h&amp;gt;       // MQTT &lt;br /&gt;
#include &amp;lt;DHT.h&amp;gt;                // DHT Temp/Hum DHT11 DHT22&lt;br /&gt;
#include &amp;lt;PCF8574.h&amp;gt;            // I2C Port-Expander 8 IN/OUT&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;               // This library allows you to communicate with I2C / TWI devices &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// WLAN //&lt;br /&gt;
WiFiClient espClient;&lt;br /&gt;
const char* ssid     = &amp;quot;XXX&amp;quot;;         // The SSID (name) of the Wi-Fi network you want to connect to&lt;br /&gt;
const char* password = &amp;quot;YYY&amp;quot;;     // The password of the Wi-Fi network&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// MQTT //&lt;br /&gt;
const char* mqtt_server = &amp;quot;192.168.178.x&amp;quot;;&lt;br /&gt;
PubSubClient client(espClient);&lt;br /&gt;
unsigned long lastMsg = 0;&lt;br /&gt;
#define MSG_BUFFER_SIZE	(50)&lt;br /&gt;
char msg[MSG_BUFFER_SIZE];&lt;br /&gt;
long int value = 0;&lt;br /&gt;
&lt;br /&gt;
// DHT //&lt;br /&gt;
Ticker ticker;&lt;br /&gt;
DHT11 sensor;  // change to DHT22 if needed!&lt;br /&gt;
volatile float humidity = 0;&lt;br /&gt;
volatile float temperature = 0;&lt;br /&gt;
volatile uint8_t error = 0;&lt;br /&gt;
volatile int8_t result = 0;&lt;br /&gt;
int grad = 248; // mit dem Gradzeichen gibt es schon mal Probleme&lt;br /&gt;
&lt;br /&gt;
void readDHT() {  // Funktion eigentlich ueberfluessig, da nur eine (weitere) Funktion aufgerufen wird &lt;br /&gt;
  sensor.read();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//PCF&lt;br /&gt;
PCF8574 PCF(0x20);   // Man beachte, dass die Slave-Adresse nur 7-Bit lang ist und nicht zwischen R/W unterscheidet.&lt;br /&gt;
&lt;br /&gt;
// this callback will be called from an interrupt&lt;br /&gt;
// it should be short and carry the ICACHE_RAM_ATTR attribute&lt;br /&gt;
void IRAM_ATTR handleData(float h, float t) {&lt;br /&gt;
  humidity = h;&lt;br /&gt;
  temperature = t;&lt;br /&gt;
  result = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// this callback will be called from an interrupt&lt;br /&gt;
// it should be short and carry the ICACHE_RAM_ATTR attribute // ICACHE_RAM_ATTR veraltet&lt;br /&gt;
void IRAM_ATTR handleError(uint8_t e) {&lt;br /&gt;
  error = e;&lt;br /&gt;
  result = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void callback(char* topic, byte* payload, unsigned int length) {&lt;br /&gt;
  Serial.print(&amp;quot;Message arrived [&amp;quot;);&lt;br /&gt;
  Serial.print(topic);&lt;br /&gt;
  Serial.print(&amp;quot;] &amp;quot;);&lt;br /&gt;
  for (unsigned int i = 0; i &amp;lt; length; i++) {&lt;br /&gt;
    Serial.print((char)payload[i]);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
&lt;br /&gt;
  // Switch on the LED if an 1 was received as first character&lt;br /&gt;
  // Ein Moeglichkeit der Auswertung um Schaltzustaende zu aendern&lt;br /&gt;
  if ((char)payload[0] == &#039;1&#039;) {&lt;br /&gt;
    digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level&lt;br /&gt;
    // but actually the LED is on; this is because&lt;br /&gt;
    // it is active low on the ESP-01)&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// MQTT Verbindung nicht vorhanden&lt;br /&gt;
void reconnect() {&lt;br /&gt;
  // Loop until we&#039;re reconnected&lt;br /&gt;
  while (!client.connected()) {&lt;br /&gt;
    Serial.print(&amp;quot;Attempting MQTT connection...&amp;quot;);&lt;br /&gt;
    // Create a random client ID&lt;br /&gt;
    String clientId = &amp;quot;ESP8266Client-&amp;quot;;&lt;br /&gt;
    clientId += String(random(0xffff), HEX);  // ClientID muss in die global configs &lt;br /&gt;
    // Attempt to connect&lt;br /&gt;
    if (client.connect(clientId.c_str())) {&lt;br /&gt;
      Serial.println(&amp;quot;connected&amp;quot;);&lt;br /&gt;
      // Once connected, publish an announcement...&lt;br /&gt;
      client.publish(&amp;quot;outTopic&amp;quot;, &amp;quot;hello world&amp;quot;);   // outTopic muss in die global configs&lt;br /&gt;
      // ... and resubscribe&lt;br /&gt;
      client.subscribe(&amp;quot;inTopic&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;failed, rc=&amp;quot;);&lt;br /&gt;
      Serial.print(client.state());&lt;br /&gt;
      Serial.println(&amp;quot; try again in 5 seconds&amp;quot;);&lt;br /&gt;
      // Wait 5 seconds before retrying&lt;br /&gt;
      delay(5000);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the BUILTIN_LED (alte Bezeichnung) pin as an output&lt;br /&gt;
&lt;br /&gt;
 // Die ganze serielle Kommunikation braucht man eigentlich nur zum  Debuggen &lt;br /&gt;
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer&lt;br /&gt;
  delay(10);&lt;br /&gt;
  Serial.println(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
  //sensor.setup(D4);&lt;br /&gt;
  sensor.setPin(D8);&lt;br /&gt;
  sensor.onData(handleData);&lt;br /&gt;
  sensor.onError(handleError);&lt;br /&gt;
  ticker.attach(30, readDHT);&lt;br /&gt;
&lt;br /&gt;
  WiFi.mode(WIFI_STA);// ist scheinbar der defaultwert wird in letzter Version nicht benutzt&lt;br /&gt;
  WiFi.begin(ssid, password);             // Connect to the network&lt;br /&gt;
  Serial.print(&amp;quot;Connecting to &amp;quot;);&lt;br /&gt;
  Serial.print(ssid); Serial.println(&amp;quot; ...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.print(++i); Serial.print(&#039; &#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  randomSeed(micros());&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&#039;\n&#039;);&lt;br /&gt;
  Serial.println(&amp;quot;Connection established!&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;IP address:\t&amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP());         // Send the IP address of the ESP8266 to the computer&lt;br /&gt;
&lt;br /&gt;
  client.setServer(mqtt_server, 1883);&lt;br /&gt;
  client.setCallback(callback);&lt;br /&gt;
&lt;br /&gt;
  PCF.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (result &amp;gt; 0) {&lt;br /&gt;
    Serial.printf(&amp;quot;Humid: %g %%\n&amp;quot;, humidity);&lt;br /&gt;
    Serial.println();&lt;br /&gt;
    Serial.printf(&amp;quot;Temp: %3.1f %cC\n&amp;quot;, temperature,grad);&lt;br /&gt;
    Serial.println();&lt;br /&gt;
  } else if (result &amp;lt; 0) {&lt;br /&gt;
    Serial.printf(&amp;quot;Error: %s\n&amp;quot;, sensor.getError());&lt;br /&gt;
  }&lt;br /&gt;
  result = 0;&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
  reconnect();&lt;br /&gt;
  }&lt;br /&gt;
  client.loop();&lt;br /&gt;
&lt;br /&gt;
  unsigned long now = millis();&lt;br /&gt;
  if (now - lastMsg &amp;gt; 2000) {&lt;br /&gt;
    lastMsg = now;&lt;br /&gt;
    ++value;&lt;br /&gt;
    snprintf (msg, MSG_BUFFER_SIZE, &amp;quot;hello world #%ld&amp;quot;, value);&lt;br /&gt;
    Serial.print(&amp;quot;Publish message: &amp;quot;);&lt;br /&gt;
    Serial.println(msg);&lt;br /&gt;
    client.publish(&amp;quot;outTopic&amp;quot;, msg);&lt;br /&gt;
    PCF.toggle(4);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MQTT Topics===&lt;br /&gt;
Zur Zeit zeigt sich durch Tests in FHEM noch Kraut und Rueben.&lt;br /&gt;
[[Datei:FHEM MQTT DeviceIDs.png|mini]]&lt;br /&gt;
 &lt;br /&gt;
Hier mal eine kleine Zusammenstellung der Dos and Donts or Best practices&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Never use a leading forward slash&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A leading forward slash is permitted in MQTT. For example, /myhome/groundfloor/livingroom. However, the leading forward slash introduces an unnecessary topic level with a zero character at the front. The zero does not provide any benefit and often leads to confusion.&lt;br /&gt;
Topic names must consist of at least one character to be valid.&lt;br /&gt;
&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
is already a topic name.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Never use spaces in a topic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A space is the natural enemy of every programmer. When things are not going the way they should, spaces make it much harder to read and debug topics. As with leading forward slashes, just because something is allowed, doesn’t mean it should be used. UTF-8 has many different white space types, such uncommon characters should be avoided.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keep the topic short and concise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Each topic is included in every message in which it is used. Make your topics as short and concise as possible. When it comes to small devices, every byte counts and topic length has a big impact.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use only ASCII characters, avoid non printable characters&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Because non-ASCII UTF-8 characters often display incorrectly, it is very difficult to find typos or issues related to the character set. Unless it is absolutely necessary, we recommend avoiding the use of non-ASCII characters in a topic.&lt;br /&gt;
E&#039;&#039;&#039;mbed a unique identifier or the Client Id into the topic&#039;&#039;&#039;&lt;br /&gt;
It can be very helpful to include the unique identifier of the publishing client in the topic. The unique identifier in the topic helps you identify who sent the message. The embedded ID can be used to enforce authorization. Only a client that has the same client ID as the ID in the topic is allowed to publish to that topic. For example, a client with the client1 ID is allowed to publish to client1/status, but not permitted to publish to client2/status.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don’t subscribe to #&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sometimes, it is necessary to subscribe to all messages that are transferred over the broker. For example, to persist all messages into a database. Do not subscribe to all messages on a broker by using an MQTT client and subscribing to a multi-level wildcard. Frequently, the subscribing client is not able to process the load of messages that results from this method (especially if you have a massive throughput). Our recommendation is to implement an extension in the MQTT broker. For example, with the plugin system of HiveMQ you can hook into the behavior of HiveMQ and add an asynchronous routine to process each incoming message and persist it to a database.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don’t forget extensibility&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Topics are a flexible concept and there is no need to preallocate them in any way. However, both the publisher and the subscriber need to be aware of the topic. It is important to think about how topics can be extended to allow for new features or products. For example, if your smart-home solution adds new sensors, it should be possible to add these to your topic tree without changing the whole topic hierarchy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use specific topics, not general ones&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you name topics, don’t use them in the same way as in a queue. Differentiate your topics as much as possible. For example, if you have three sensors in your living room, create topics for myhome/livingroom/temperature, myhome/livingroom/brightness and myhome/livingroom/humidity. Do not send all values over myhome/livingroom. Use of a single topic for all messages is a anti pattern. Specific naming also makes it possible for you to use other MQTT features such as retained messages. For more on retained messages, see part 8 of the Essentials series.&lt;br /&gt;
&lt;br /&gt;
Diese Zusammenstellung empfand ich als sehr hilfreich. &lt;br /&gt;
&lt;br /&gt;
In meinem Haus hat jeder Raum bereits eine Nummer mit vorangestelltem UG, EG und DG. Jetzt kaeme noch der Garten als neuer &amp;quot;Raum&amp;quot; dazu. Oder ich entscheide eine Stufe darueber bereits zwischen Haus und Garten. Da ich im Garten zwischen Pool Carport unterscheiden will, muss ich wohl auch noch eine Unterteilung nach Terrasse hinzufuegen. Bisher habe ich das alles in FHEM unter &amp;quot;Auszen&amp;quot; zusammengefasst.&lt;br /&gt;
Die erste Ebene waere also Haus/Außenanlage, Außenbereich oder einfach nur Außen.&lt;br /&gt;
&lt;br /&gt;
Noch etwas detaillierter geht es [https://pi3g.com/2019/05/29/mqtt-topic-tree-design-best-practices-tips-examples/ hier] weiter.&lt;br /&gt;
&lt;br /&gt;
Ein erster Versuch fuer mich sieht dann so aus (weder am Anfang noch am Ende steht ein Slash):&lt;br /&gt;
 Haus/[UG,EG,DG]/[1-9]+/ClientID/Art&lt;br /&gt;
 Außen/[Terrasse,Veranda,Garten,Pool,Carport,...]/ClientID/Art&lt;br /&gt;
&lt;br /&gt;
 Art waere dann [Schalter,Temperatur,Feuchtigkeit,Dimmer,...]&lt;br /&gt;
&lt;br /&gt;
Einen Payload im JSON-Format benoetige ich erst mal nicht. Ich werde nach Moeglichkeit numerische Payloads gebrauchen.&lt;br /&gt;
Spaetestens wenn man mehrere Schalter in einem Client vereint stellt sich die Frage ob ich z.B. fuer jeden Schalter einen Topic anlege, oder im Topic Schalter eine Zahl als Repraesentation aller Schalter uebergebe.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
 ..../ClientID/Schalter1 0      &lt;br /&gt;
 ..../ClientID/Schalter2 0&lt;br /&gt;
 ..../ClientID/Schalter3 1&lt;br /&gt;
 ..../ClientID/Schalter4 0&lt;br /&gt;
 ..../ClientID/Schalter5 1&lt;br /&gt;
oder&lt;br /&gt;
 ..../ClientID/Schalter 00101&lt;br /&gt;
 &lt;br /&gt;
Da ich im zweiten Beispiel den aktuellen Zustand erst bestimmen muss um die Message zu erzeugen faellt die Wahl auf die erste Variante.&lt;br /&gt;
Auf Unterstriche zur Bedeutungs-/Worttrennung verzichte ich.&lt;br /&gt;
&lt;br /&gt;
===DEBUG-Mode===&lt;br /&gt;
Die ganzen Serial-Prints kommen in eine bedingte Kompilierung.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
https://cmatic.de/?accessid=2&amp;amp;id=16&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Videostreaming&amp;diff=5202</id>
		<title>Videostreaming</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Videostreaming&amp;diff=5202"/>
		<updated>2026-07-31T15:53:32Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Wie selbstvestaendlich benutzt man Videostreaming von Youtube, Prime, .... &lt;br /&gt;
&lt;br /&gt;
Irgendwie werde ich das Gefuehl aber nicht los, sobald die Anforderung zu simpel wird kommen einem nicht geahnte Schwierigkeiten in die Quere.&lt;br /&gt;
Da spielt der Liebingsplayer eine Video nicht ab, weil der passende Codec nicht lizenziert oder installiert ist, die Latenzen machen das fluessige schauen unmoeglich, die Rechenleistung des Rechners reicht nicht aus um die Anforderungen eines Codec zu bedienen und und und ...&lt;br /&gt;
&lt;br /&gt;
Der Ausloeser fuer diesen Beitrag ist die Moeglichkeit zu schaffen, von einem System geringer Leistung (RasPi,NAO...) mit angeschlossener Kamera, das Videobild ueber eine Netzwerkverbindung moeglichst in einem Browser, oder Viewer-Marke-Eigenbau fluessig anzuzeigen.&lt;br /&gt;
&lt;br /&gt;
Da das eigentliche Ziel eine ressourcenschonende Uebertragung von Videomaterial von z.B. RasPI, NAO, ... zu OpenCV ist kann der [https://www.it-jim.com/blog/gstreamer-for-computer-vision-and-audio-processing/ Artikel] recht interessant sein.&lt;br /&gt;
&lt;br /&gt;
=Dateiformate=&lt;br /&gt;
&lt;br /&gt;
Auch Videodateitypen, oder auch Datei-Container. Ein Container enthält das Video, Audiodaten und ggf. weitere Informationen wie Untertitel oder Metadaten.&lt;br /&gt;
[https://de.wikipedia.org/wiki/Containerformat]&lt;br /&gt;
Fuer mich nach wie vor von Interesse&lt;br /&gt;
MPEG-1 und MPEG-2 (m2p, mpg, mpeg, ts)&lt;br /&gt;
MPEG-4 (mp4, m4v)&lt;br /&gt;
Matroska (mkv)&lt;br /&gt;
HTML5 (WebM)&lt;br /&gt;
&lt;br /&gt;
Instagram&lt;br /&gt;
    Videoformat: MP4 oder MOV&lt;br /&gt;
    Audio: AAC&lt;br /&gt;
    Video-Codec: H.264&lt;br /&gt;
    Framerate: maximal 30 Bilder pro Sekunde (fps)&lt;br /&gt;
    Maximale Dateigröße: 15 MB&lt;br /&gt;
&lt;br /&gt;
YouTube&lt;br /&gt;
    Videoformat: MP4&lt;br /&gt;
    Audio: AAC-LC&lt;br /&gt;
    Video-Codec: H.264&lt;br /&gt;
    Framerate: selbe Framerate wie bei der Aufnahme, gängig sind 24, 25, 30, 48, 50 und 60 Bilder pro Sekunde&lt;br /&gt;
    Maximale Dateigröße: 256 GB&lt;br /&gt;
&lt;br /&gt;
WhatsApp&lt;br /&gt;
 TODO&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um mich der Sache zu naehern, hier eine Sammlung der ausprobierten Befehle.&lt;br /&gt;
&lt;br /&gt;
=Versuch und Irrtum=&lt;br /&gt;
&lt;br /&gt;
Das man nicht blind im Nebel stochert.&lt;br /&gt;
&lt;br /&gt;
 v4l2-ctl --list-formats&lt;br /&gt;
 ioctl: VIDIOC_ENUM_FMT&lt;br /&gt;
        Index       : 0&lt;br /&gt;
        Type        : Video Capture&lt;br /&gt;
        Pixel Format: &#039;YUYV&#039;&lt;br /&gt;
        Name        : YUYV 4:2:2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 v4l2-ctl -d /dev/video0 --list-framesizes=YUYV&lt;br /&gt;
 ioctl: VIDIOC_ENUM_FRAMESIZES&lt;br /&gt;
        Size: Discrete 640x480&lt;br /&gt;
        Size: Discrete 160x120&lt;br /&gt;
        Size: Discrete 176x144&lt;br /&gt;
        Size: Discrete 320x240&lt;br /&gt;
        Size: Discrete 352x288&lt;br /&gt;
&lt;br /&gt;
 v4l2-ctl -L&lt;br /&gt;
           brightness 0x00980900 (int)    : min=0 max=255 step=1 default=124 value=124&lt;br /&gt;
             contrast 0x00980901 (int)    : min=0 max=255 step=1 default=145 value=145&lt;br /&gt;
           saturation 0x00980902 (int)    : min=0 max=255 step=1 default=75 value=75&lt;br /&gt;
                  hue 0x00980903 (int)    : min=-127 max=127 step=1 default=0 value=0&lt;br /&gt;
                gamma 0x00980910 (int)    : min=1 max=8 step=1 default=4 value=4&lt;br /&gt;
                 gain 0x00980913 (int)    : min=0 max=65535 step=1 default=16 value=16&lt;br /&gt;
 power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=1 value=1&lt;br /&gt;
                                0: Disabled&lt;br /&gt;
                                1: 50 Hz&lt;br /&gt;
                                2: 60 Hz&lt;br /&gt;
            sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=10 value=10&lt;br /&gt;
&lt;br /&gt;
  gst-device-monitor-1.0&lt;br /&gt;
  Device found:&lt;br /&gt;
&lt;br /&gt;
        name  : \_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399&lt;br /&gt;
        class : Source/Video&lt;br /&gt;
        caps  : video/x-raw, format=YUY2, width=160, height=120&lt;br /&gt;
                video/x-raw, format=YUY2, width=176, height=144&lt;br /&gt;
                video/x-raw, format=YUY2, width=320, height=240&lt;br /&gt;
                video/x-raw, format=YUY2, width=352, height=288&lt;br /&gt;
                video/x-raw, format=YUY2, width=640, height=480&lt;br /&gt;
        gst-launch-1.0 libcamerasrc camera-name=&amp;quot;\\_SB_.PCI0.EUS1-4.1.4:1.0-18ec:3399&amp;quot; ! ...&lt;br /&gt;
&lt;br /&gt;
Einmal YUYV 4:2:2 und jetzt YUY2&lt;br /&gt;
&lt;br /&gt;
     packed 4:2:2 YUV&lt;br /&gt;
&lt;br /&gt;
       +--+--+--+--+ +--+--+--+--+&lt;br /&gt;
       |Y0|U0|Y1|V0| |Y2|U2|Y3|V2| ...&lt;br /&gt;
       +--+--+--+--+ +--+--+--+--+&lt;br /&gt;
&lt;br /&gt;
        Component 0: Y&lt;br /&gt;
          depth:           8&lt;br /&gt;
          pstride:         2&lt;br /&gt;
          offset:          0&lt;br /&gt;
&lt;br /&gt;
        Component 1: U&lt;br /&gt;
          depth:           8&lt;br /&gt;
          offset:          1&lt;br /&gt;
          pstride:         4&lt;br /&gt;
&lt;br /&gt;
        Component 2: V&lt;br /&gt;
          depth            8&lt;br /&gt;
          offset:          3&lt;br /&gt;
          pstride:         4&lt;br /&gt;
&lt;br /&gt;
        Image&lt;br /&gt;
          default rstride: RU4 (width * 2)&lt;br /&gt;
          default size:    rstride (image) * height&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==1==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 v4l2src device=&amp;quot;/dev/video0&amp;quot; ! autovideoconvert ! autovideosink sync=false&lt;br /&gt;
&lt;br /&gt;
Das sync=false am Ende laesst das Video erst fluessig erscheinen.&lt;br /&gt;
&lt;br /&gt;
==2==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 v4l2src device=&amp;quot;/dev/video0&amp;quot; ! videoconvert ! clockoverlay ! x264enc tune=zerolatency ! mpegtsmux ! hlssink playlist-root=http://192.168.178.10/gstreamer/hlstest location=/mnt/SERVER/WWW/gstreamer/hlstest/segment_%05d.ts target-duration=5 max-files=5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein HTML5 Player gibt diesen Stream nicht wieder.  &lt;br /&gt;
&lt;br /&gt;
Es gibt in HTML5 folgende Einschraenkung, .ts ist da nicht dabei.&lt;br /&gt;
.mp4 = H.264 + AAC&lt;br /&gt;
.ogg/.ogv = Theora + Vorbis&lt;br /&gt;
.webm = VP8 + Vorbis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 webmmux name=mux ! filesink location=test.webm            \&lt;br /&gt;
   videotestsrc num-buffers=250 ! video/x-raw,framerate=25/1 ! videoconvert ! vp8enc ! queue ! mux.video_0 \&lt;br /&gt;
   audiotestsrc samplesperbuffer=44100 num-buffers=10 ! audio/x-raw,rate=44100 ! vorbisenc ! queue ! mux.audio_0&lt;br /&gt;
&lt;br /&gt;
Zum Probieren ganz hilfreich, da &amp;quot;Fehler&amp;quot; bei der Quelle(nangabe) wegfallen.&lt;br /&gt;
&lt;br /&gt;
==4==&lt;br /&gt;
 &lt;br /&gt;
 gst-launch-1.0 webmmux name=mux ! filesink location=test.webm   v4l2src device=/dev/video0 ! videoconvert ! vp8enc ! queue ! mux.video_0 &lt;br /&gt;
&lt;br /&gt;
Video war mit deutlicher Verzoegerung im Browser zu sehen. Der Name mux wird dann ganz am Ende als Referenz benutzt mux.video oder mux.audio.&lt;br /&gt;
Damit erklaert sich auch die hier &amp;quot;falsche&amp;quot; Reihenfolge der Pipe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==5==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 v4l2src device=/dev/video0  ! queue ! x264enc ! mp4mux ! filesink location=video.mp4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==6==&lt;br /&gt;
ffmpegcolorspace wurde durch videoconvert ersetzt.&lt;br /&gt;
 &lt;br /&gt;
 gst-launch-1.0 v4l2src ! videoconvert ! jpegenc ! avimux ! filesink location=output.avi&lt;br /&gt;
&lt;br /&gt;
Fuehrt beim Firefox zum Download.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==7==&lt;br /&gt;
Erzeugt zwar eine mp4-Datei. Das Abspielen gelingt aber weder mit VLC noch MPlayer.&lt;br /&gt;
&lt;br /&gt;
 st-launch-1.0 v4l2src  ! videoconvert ! x264enc ! mp4mux ! filesink location=video.mp4 -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==8==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 -v v4l2src ! videoconvert ! rtpvrawpay ! udpsink host=&amp;quot;127.0.0.1&amp;quot; port=5000&lt;br /&gt;
&lt;br /&gt;
Geht irgendwie, aber kein brauchbares Bild. VLC bleibt schwarz.&lt;br /&gt;
Mplayer bringt Stream not seekable! und auch kein Bild&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 -v udpsrc port=5000 caps = &amp;quot;application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, width=(string)640, height=(string)480, payload=(int)96, sampling=(string)RGBA, depth=(string)8, a-framerate=30/1&amp;quot; ! rtpvrawdepay ! videoconvert ! queue ! xvimagesink sync=false&lt;br /&gt;
&lt;br /&gt;
==9==&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 -e -v v4l2src ! videoconvert ! videoscale ! videorate ! &amp;quot;video/x-raw,format=I420,width=640,height=480,framerate=30/1&amp;quot; ! x264enc key-int-max=15 ! rtph264pay ! udpsink host=localhost port=5000&lt;br /&gt;
&lt;br /&gt;
Da ist der Server bei ueber 100% CPU-Last. Das erklaert die leichte Verzoegerung.&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 -v udpsrc uri=udp://localhost:5000 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Vektorisieren_mit_potracer_und_mkbitmap&amp;diff=5201</id>
		<title>Vektorisieren mit potracer und mkbitmap</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Vektorisieren_mit_potracer_und_mkbitmap&amp;diff=5201"/>
		<updated>2026-07-31T15:53:31Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Eigentlich hatte ich zwei Anwendungsfaelle um verschiedene Bitmaps zu vektorisieren.&lt;br /&gt;
* Eine Bitmap so zu konvertieren, dass ich sie als Grundlage fue eine CNC-Fraese nutzen konnte und&lt;br /&gt;
* die Icons in FHEM waren mir oft zu klein, zu grosz, zu unscharf, ...&lt;br /&gt;
&lt;br /&gt;
=Einstieg=&lt;br /&gt;
Ich suchte etwas fuer die Kommandozeile. Schnell bin ich auf das [https://potrace.sourceforge.net/ Paket Potrace] von Peter Selinger gestoszen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den Grundlagen von Ubuntuusers habe ich nicht hinzuzufuegen. Sie gehen aber leider ueber die Informationen der Man-Pages nicht hinaus.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.ubuntuusers.de/potrace/&lt;br /&gt;
* https://wiki.ubuntuusers.de/mkbitmap/&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der Nutzung ist mkbitmap und dann potrace. Es wird empfohlen die Bitmaps mit mkbitmap fuer potrace vorzubereiten. Das ist aber kein muss.&lt;br /&gt;
&lt;br /&gt;
==mkbitmap==&lt;br /&gt;
&lt;br /&gt;
mkbitmap 1.16. Transforms images into bitmaps with scaling and filtering.&lt;br /&gt;
&lt;br /&gt;
Usage: mkbitmap [options] [file...]&lt;br /&gt;
&lt;br /&gt;
OPTIONS&lt;br /&gt;
&lt;br /&gt;
General:&lt;br /&gt;
 -h, --help           - print this help message and exit&lt;br /&gt;
 -v, --version        - print version info and exit&lt;br /&gt;
 -l, --license        - print license info and exit&lt;br /&gt;
 -o, --output &amp;lt;file&amp;gt;  - output to file&lt;br /&gt;
 -x, --nodefaults     - turn off default options&lt;br /&gt;
&lt;br /&gt;
Inversion:&lt;br /&gt;
 -i, --invert         - invert the input (undo &#039;blackboard&#039; effect)&lt;br /&gt;
&lt;br /&gt;
Highpass filtering:&lt;br /&gt;
 -f, --filter &amp;lt;n&amp;gt;     - apply highpass filter with radius n (default 4)&lt;br /&gt;
 -n, --nofilter       - no highpass filtering&lt;br /&gt;
 -b, --blur &amp;lt;n&amp;gt;       - apply lowpass filter with radius n (default: none)&lt;br /&gt;
&lt;br /&gt;
Scaling:&lt;br /&gt;
 -s, --scale &amp;lt;n&amp;gt;      - scale by integer factor n (default 2)&lt;br /&gt;
 -1, --linear         - use linear interpolation&lt;br /&gt;
 -3, --cubic          - use cubic interpolation (default)&lt;br /&gt;
&lt;br /&gt;
Thresholding:&lt;br /&gt;
 -t, --threshold &amp;lt;n&amp;gt;  - set threshold for bilevel conversion (default 0.45)&lt;br /&gt;
 -g, --grey           - no bilevel conversion, output a greymap&lt;br /&gt;
&lt;br /&gt;
Possible input file formats are: pnm (pbm, pgm, ppm), bmp.&lt;br /&gt;
The default options are: -f 4 -s 2 -3 -t 0.45&lt;br /&gt;
&lt;br /&gt;
Manpage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Beipiele=&lt;br /&gt;
&lt;br /&gt;
[https://potrace.sourceforge.net/samples.html]&lt;br /&gt;
&lt;br /&gt;
[https://potrace.sourceforge.net/mkbitmap.html]&lt;br /&gt;
&lt;br /&gt;
Diese zweite Seite, mit vorangeschaltetem mkbitnap erlaeutert schoen die Varienten zum besten Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Der richtige Threshold, also die Stufe ab der ein Pixel weiß oder schwarz wird ist nicht einfach zu finden.&lt;br /&gt;
&lt;br /&gt;
Ohne Anwendung eines Highpassfilters kommt er zu folgenden Ueberlegungen.&lt;br /&gt;
&lt;br /&gt;
 Wenn wir eine einfache Schwellenwertmethode zur Konvertierung von Grautönen in Schwarz/Weiß anwenden, können wir nie ganz den richtigen Schwellenwert finden. Der Hintergrund wird schwarz, bevor der Vordergrund zufriedenstellend ist. Die folgenden Bilder wurden auf verschiedenen Ebenen mit Schwellenwerten versehen.&lt;br /&gt;
&lt;br /&gt;
 Durch die Hochpassfilterung werden großflächige Unregelmäßigkeiten wie Hintergrundschwankungen unterdrückt, während kleinräumige Details wie Linien erhalten bleiben. Die Filterung hängt von einem Parameter namens Filterradius ab, der ungefähr der Größe der erhaltenen Features entspricht. Der Filterradius kann auch anhand der Linienstärke ermittelt werden. Die folgende Bildsequenz veranschaulicht die Wirkung des Filterradiusparameters.&lt;br /&gt;
&lt;br /&gt;
So ergibt sich der erste Befehl mit dem man anfangen kann.&lt;br /&gt;
&lt;br /&gt;
 mkbitmap -f 2 -s 2 -t 0.48&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Tibber_Pulse_(API)&amp;diff=5200</id>
		<title>Tibber Pulse (API)</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Tibber_Pulse_(API)&amp;diff=5200"/>
		<updated>2026-07-31T15:53:28Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Da ich aktuell vom Energieversorger einen zweiten Hausanschluss (40kW :-() gelegt bekommen habe und ich für die Wallboxen zur Foerderung einen 100% Oekostrom haben musste, habe ich kurzerhand einen Vertrag mit Tibber (mal zum Testen) abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
Pulse IR und Bridge&lt;br /&gt;
[[Datei:Tibber Pulse IR und Bridge.png|mini|Tibber Pulse IR und Bridge]]&lt;br /&gt;
Eigentlich verlief die Installation problemlos. Fuer mich war allerdings der Assistent in der Tibber-App zu kindisch. Das ist eher was für Apple-User. Ich haette mir an der ein oder anderen Stelle mehr Hardcore-Infos gewuenscht. Da der mehrstufige Prozess (WLAN-Bridge-Pulse-Zaehler) doch einige Stolperfallen enthaelt, ist es fuer mich eher frustrierend jedesmal bei einem Fehler zurueck auf Los geschickt zu werden. Das geht definitiv besser. Ist aber wieder ein Beispiel, dass die Informatiker-Jobs heute nur noch durch 5-jaehrige Schimpansen (ungelernte ;-)) besetzt werden.&lt;br /&gt;
&lt;br /&gt;
Bei mir gab es letztendlich nur einen gravierenden Fehler. Von den mitgelieferten Akkus des Pulse war einer defekt. Bei mir sind das zwei AA-Zellen auf LiBasis! Ein Nachladen mit einem Lithium-1.5V-Lader hat keinen Erfolg gebracht. Erst der Austausch gegen 2 neue Zellen war erfolgreich.&lt;br /&gt;
&lt;br /&gt;
=App=&lt;br /&gt;
[[Datei:TibberAppIcon.png|mini|TibberAppIcon]]&lt;br /&gt;
Die App find ich ziemlich verquer. Sobald Rechnungsanschrift und Installationsorte unterschiedlich sind, geht das Chaos los. Auch der Support tut sich dann schwer. Ich traue mich gar nicht so richtig weitere Vertraege abzuschlieszen.&lt;br /&gt;
Alles ueber die App machen zu wollen/muessen ist ... Das gehoert fuer mich ins WebUserPortal.&lt;br /&gt;
&lt;br /&gt;
Was echt nervt ist, dass sich gefühlt jeden Monat das LookandFeel aendert. Schon die dritte oder vierte Designaenderung des Homescreens (Zuhause).&lt;br /&gt;
&lt;br /&gt;
=API=&lt;br /&gt;
Da die App eher suboptimal ist, habe ich recht zuegig damit angefangen mir die notwendigen Infos ueber die API auf eine Infoseite im Intranet zu holen. Ein Integration in FHEM und/oder HA steht noch aus.&lt;br /&gt;
&lt;br /&gt;
=Erste Schritte=&lt;br /&gt;
&lt;br /&gt;
Uebersicht [https://developer.tibber.com/docs/overview]&lt;br /&gt;
&lt;br /&gt;
Zusammenfassung: Die Plattform wird über GraphQL verfügbar gemacht, eine Technologie, die von Facebook konzipiert und entwickelt wurde.&lt;br /&gt;
&lt;br /&gt;
==Was ist GraphQL?==&lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/GraphQL Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/graphql GraphQL]&lt;br /&gt;
&lt;br /&gt;
===ChatGPT zu GraphQL===&lt;br /&gt;
&lt;br /&gt;
GraphQL ist eine von Facebook entwickelte Abfragesprache und Laufzeitumgebung für APIs (Application Programming Interfaces). Im Gegensatz zu traditionellen RESTful APIs, bei denen die Client-Anwendung verschiedene Endpunkte aufruft, um Daten abzurufen oder zu manipulieren, ermöglicht GraphQL dem Client, genau die Daten abzurufen, die er benötigt, indem er eine einzige Abfrage an den Server sendet.&lt;br /&gt;
&lt;br /&gt;
Hier sind einige Hauptmerkmale von GraphQL:&lt;br /&gt;
&lt;br /&gt;
    &#039;&#039;&#039;Declarative Datenabfrage&#039;&#039;&#039;: Der Client spezifiziert genau, welche Daten er vom Server erhalten möchte, indem er eine GraphQL-Abfrage definiert, die die benötigten Felder und deren Struktur beschreibt. Dadurch kann der Client genau die Daten erhalten, die er benötigt, ohne Overfetching oder Underfetching.&lt;br /&gt;
    &#039;&#039;&#039;Typsystem&#039;&#039;&#039;: GraphQL definiert ein Typsystem, das die Struktur und den Typ der Daten beschreibt, die von der API zurückgegeben werden können. Dies ermöglicht eine strikte Typisierung und verbesserte Dokumentation.&lt;br /&gt;
    &#039;&#039;&#039;Single-Endpoint-Architektur&#039;&#039;&#039;: Im Gegensatz zu RESTful APIs, die oft mehrere Endpunkte für verschiedene Ressourcentypen haben, hat eine GraphQL-API normalerweise nur einen Endpunkt, über den alle Abfragen und Mutationen gesendet werden.&lt;br /&gt;
    &#039;&#039;&#039;Echtzeitfähigkeit&#039;&#039;&#039;: GraphQL unterstützt auch Abonnements, die es ermöglichen, Daten in Echtzeit zu empfangen, wenn sich etwas ändert. Dies ist besonders nützlich für Anwendungsfälle wie Live-Chats, Benachrichtigungen und Echtzeit-Dashboard-Aktualisierungen.&lt;br /&gt;
    &#039;&#039;&#039;Entwicklungserfahrung&#039;&#039;&#039;: GraphQL bietet eine verbesserte Entwicklererfahrung, da Clients genau die Daten erhalten können, die sie benötigen, und Entwickler APIs schneller entwickeln können, ohne sich um Versionierung oder unerwartete Seiteneffekte durch Änderungen an der Backend-API kümmern zu müssen.&lt;br /&gt;
&lt;br /&gt;
Insgesamt bietet GraphQL eine flexible, effiziente und moderne Möglichkeit, APIs zu entwerfen und zu verwenden, die den Anforderungen moderner Anwendungen besser gerecht wird als traditionelle RESTful APIs.&lt;br /&gt;
&lt;br /&gt;
Auf der Tibber-Seite heiszt es:&lt;br /&gt;
&lt;br /&gt;
 The GraphQL query language is basically about selecting fields on objects.&lt;br /&gt;
&lt;br /&gt;
Was dies bedeutet kommt weiter unten. Weiter heiszt es auf der Tibber Seite.&lt;br /&gt;
&lt;br /&gt;
    GraphQL ist eine Abfragesprache für Ihre(? unsere) API und eine serverseitige Laufzeitumgebung zum Ausführen von Abfragen mithilfe eines Typsystems, das Sie für Ihre Daten definieren. GraphQL ist nicht an eine bestimmte Datenbank oder Speicher-Engine gebunden und wird stattdessen durch Ihren vorhandenen Code und Ihre Daten unterstützt.&lt;br /&gt;
&lt;br /&gt;
Mit der Uebersetzung von Google hadere ich noch. Der Satz kommt vermutlich ursrpruenglich von Facebook und wurde von Tibber 1:1 uebernommen.&lt;br /&gt;
&lt;br /&gt;
Der naechste Satz gibt schon mehr Aufschluss:&lt;br /&gt;
 Tibber hat sich für GraphQL als API entschieden, weil es unseren Integratoren und uns selbst Flexibilitaet bietet. Die Moeglichkeit, die gewuenschten Daten genau zu definieren, macht die Nutzung wesentlich einfacher als herkoemmliche [https://www.ibm.com/de-de/topics/rest-apis REST-basierte APIs]. Es ist auch sehr schoen, dass die serverseitige Implementierung von GraphQL sehr gut mit unserer Microservice-Architektur zusammenspielt :-)&lt;br /&gt;
&lt;br /&gt;
Zum Einstieg nutze ich den [https://developer.tibber.com/explorer Api Explorer im TibberDev]. Nachdem man sich dort einen Personal Token angelegt hat, kann&#039;s direkt losgehen. Der [https://developer.tibber.com/explorer GraphiQL] hat auch eine Autovervollstaendigung. Sehr praktisch.&lt;br /&gt;
[[Datei:TibberDevAccount.png|mini|TibberDevAccount]]&lt;br /&gt;
Die Root-Types sind &lt;br /&gt;
*query: Query&lt;br /&gt;
*mutation: RootMutation&lt;br /&gt;
*subscription: RootSubscription&lt;br /&gt;
*fragment feht irgendwie in der Doc &lt;br /&gt;
&lt;br /&gt;
Der Aufbau ist recht simpel und das Doc in knapp einer Stunde durchprobiert. So dass ich dann schnell an dem Punkt angelangt bin, dass ich ein Programm (PHP, Python oder JavaScript) brauche welches die fuer mich interessanten Daten in meine MySQL-DB uebertraegt. Ob ich zuerst anzeige und dann speichere, also sozusagen ueber die Datenbank puffere, oder umgekehrt muss ich noch festlegen.&lt;br /&gt;
&lt;br /&gt;
===ChatGPT zum Subprotokoll===&lt;br /&gt;
&lt;br /&gt;
Das Subprotokoll &amp;quot;graphql-transport-ws&amp;quot; ist ein WebSocket-Subprotokoll, das speziell für die Kommunikation zwischen Client und Server in GraphQL-Anwendungen entwickelt wurde. Es basiert auf dem WebSocket-Protokoll, das eine bidirektionale, persistente Verbindung zwischen einem Client und einem Server ermöglicht.&lt;br /&gt;
&lt;br /&gt;
Im Kontext von GraphQL wird &amp;quot;graphql-transport-ws&amp;quot; verwendet, um GraphQL-Abfragen, Mutationen und Abonnements über WebSocket-Verbindungen zu übertragen. Im Gegensatz zum traditionellen HTTP-Protokoll, das eine separate Anfrage-Antwort-Struktur hat, ermöglicht WebSocket eine kontinuierliche Kommunikation zwischen Client und Server, was besonders nützlich ist, wenn Echtzeit-Aktualisierungen benötigt werden, wie bei Abonnements in GraphQL.&lt;br /&gt;
&lt;br /&gt;
Das Subprotokoll &amp;quot;graphql-transport-ws&amp;quot; definiert spezifische Nachrichtenformate und Handshake-Verfahren, die für die GraphQL-Kommunikation über WebSockets erforderlich sind. Durch die Verwendung dieses Subprotokolls können Entwickler GraphQL-Anwendungen erstellen, die von den Echtzeitfähigkeiten von WebSocket profitieren, ohne auf die Vorteile und Flexibilität von GraphQL verzichten zu müssen.&lt;br /&gt;
&lt;br /&gt;
==Mehrfacher Hinweis Subprotokolwechsel Dezember 2022==&lt;br /&gt;
&lt;br /&gt;
 Die TibberAPI unterstuetzte zunaechst GraphQL-Websocket-Subscriptions mithilfe des Unterprotokolls graphql-ws. Diese Bibliothek wird/wurde jedoch archiviert und nicht mehr gepflegt. Daher wurde am 31. Maerz 2022 die Unterstützung für das Unterprotokoll graphql-transport-ws hinzugefuegt.&lt;br /&gt;
&lt;br /&gt;
 Die Unterstuetzung für das alte Protokoll wird im Dezember 2022 entfernt. Gleichzeitig aendert sich auch die URL für die Verbindung zum Websocket-Server. Zuvor konnte die Verbindung unter &#039;&#039;&#039;wss://api.tibber.com/v1-beta/gql/subscriptions&#039;&#039;&#039; hergestellt werden. Nach der Aenderung muss die URL ueber GraphQL abgefragt werden (siehe Beispiel unten) und der Client muss das Unterprotokoll graphql-transport-ws unterstuetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight code=xml&amp;gt;&lt;br /&gt;
Frage:&lt;br /&gt;
{&lt;br /&gt;
  viewer {&lt;br /&gt;
    websocketSubscriptionUrl&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Antwort:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;data&amp;quot;: {&lt;br /&gt;
    &amp;quot;viewer&amp;quot;: {&lt;br /&gt;
      &amp;quot;websocketSubscriptionUrl&amp;quot;: &amp;quot;wss://websocket-api.tibber.com/v1-beta/gql/subscriptions&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anfragenbegrenzung==&lt;br /&gt;
 Zum Schutz der API gilt eine Ratenbegrenzung von 100 Anfragen in 5 Minuten pro IP-Adresse. Beachten Sie, dass die Preise einmal täglich am Nachmittag berechnet werden (für Norwegen und Schweden sind sie zunächst vorläufig und werden später möglicherweise mit geringfügigen Änderungen nach Bestätigung der Wechselkurse endgültig festgelegt). Sie können „priceInfo.today“ und „priceInfo.tomorrow“ verwenden, um sie im Voraus abzurufen, anstatt nur „priceInfo.current“ für die aktuelle Stunde zu verwenden.&lt;br /&gt;
&lt;br /&gt;
=In medias res=&lt;br /&gt;
Zum Starten empfiehlt die Tibber-API-Doc, die fundamentalen Konzepte von GraphQL, die Kommunikation mit der API und den Explorer.&lt;br /&gt;
&lt;br /&gt;
Um die nachfolgenden Beispiele schnell zu verstehen, hier der Link zur [https://developer.tibber.com/docs/reference API-Referenz]&lt;br /&gt;
&lt;br /&gt;
 Bei der GraphQL-Abfragesprache geht es im Wesentlichen um die Auswahl von Feldern in Objekten.&lt;br /&gt;
&lt;br /&gt;
Auf der Docs-Reference-Seite gibt es einen interessanten Hinweis:&lt;br /&gt;
  This reference is auto-generated from https://api.tibber.com&lt;br /&gt;
&lt;br /&gt;
Es koennte als eine URL geben, die einem die aktuelle &#039;&#039;&#039;Tibber GraphQL Schema Reference&#039;&#039;&#039; direkt zur Auswertung ausgibt. Der Umweg ueber das Parsen der HTML-Ausgabe ginge zur Not natuerlich auch.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Objekt Typen==&lt;br /&gt;
&lt;br /&gt;
Die Begriffsdifferenzierung Objekt und Object Types ist mir derzeit noch nicht klar. Ich werde wohl um die allgemeine [https://github.com/graphql/graphql-spec Spec von GraphQL] nicht herumkommen:-(&lt;br /&gt;
&lt;br /&gt;
Bei &#039;Home&#039; wird von einem Objekttyp gesprochen. Klar ist, man hat Objekte, die mit dem Schluesselwort type eingeleitet und dann beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
 Einige Felder sind Skalare (Boolesche Werte, Zeichenfolgen, Ganzzahlen, Gleitkommazahlen), waehrend andere Objekttypen sind (Adresse, LegalEntity). Eine GraphQL-Abfrage muss vollstaendig auf Skalarebene sein. D.h. in einer Abfrage duerfen die abgefragten Felder keine Objekte (keine weiteren Objekttypen) sein, sondern hierarchisch heruntergebrochen auf weitere Inhalte bis es Skalare sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
This query is valid:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    homes{&lt;br /&gt;
        id&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
This is not:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    homes{&lt;br /&gt;
        id&lt;br /&gt;
        owner   &amp;lt;- hier ist der Fehler. Dies ist kein Skalar!&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
The owner field is an object type and you would need to specify which scalar fields you would like returned:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    homes{&lt;br /&gt;
        id&lt;br /&gt;
        owner{&lt;br /&gt;
            name&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==query Datenabfrage (read)==&lt;br /&gt;
&lt;br /&gt;
query-&amp;gt;viewer&lt;br /&gt;
&lt;br /&gt;
Zuerst mit homes die Zaehlerplatz-iD holen und dan mit home (id: &amp;quot;&amp;lt;ID&amp;gt;&amp;quot;) nur die data dazu holen.&lt;br /&gt;
&lt;br /&gt;
Hello World;-)&lt;br /&gt;
{&lt;br /&gt;
  viewer {&lt;br /&gt;
    login&lt;br /&gt;
    name&lt;br /&gt;
    userId&lt;br /&gt;
    accountType&lt;br /&gt;
    home (id: &amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;) {&lt;br /&gt;
      id&lt;br /&gt;
      features {&lt;br /&gt;
        realTimeConsumptionEnabled&lt;br /&gt;
      }&lt;br /&gt;
      subscriptions {&lt;br /&gt;
        id&lt;br /&gt;
      }&lt;br /&gt;
      currentSubscription {&lt;br /&gt;
        id&lt;br /&gt;
      }&lt;br /&gt;
      meteringPointData {&lt;br /&gt;
        consumptionEan&lt;br /&gt;
        gridCompany&lt;br /&gt;
        gridAreaCode&lt;br /&gt;
        priceAreaCode&lt;br /&gt;
        productionEan&lt;br /&gt;
        energyTaxType&lt;br /&gt;
        vatType&lt;br /&gt;
        estimatedAnnualConsumption&lt;br /&gt;
      }&lt;br /&gt;
      owner {&lt;br /&gt;
        id&lt;br /&gt;
      }&lt;br /&gt;
      mainFuseSize&lt;br /&gt;
    }&lt;br /&gt;
    websocketSubscriptionUrl&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interessant fand ich z.B.&lt;br /&gt;
&lt;br /&gt;
          &amp;quot;priceAreaCode&amp;quot;: &amp;quot;Amprion&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
          &amp;quot;estimatedAnnualConsumption&amp;quot;: 500&lt;br /&gt;
&lt;br /&gt;
          &amp;quot;mainFuseSize&amp;quot;: null&lt;br /&gt;
&lt;br /&gt;
und was da noch alles an Daten einzutragen ist.&lt;br /&gt;
 size: Int&lt;br /&gt;
 The size of the home in square meters&lt;br /&gt;
&lt;br /&gt;
==mutation Datenveraenderung (write)==&lt;br /&gt;
&lt;br /&gt;
Mutationen gibt es nur 3, wobei die erste bei mir entfaellt.&lt;br /&gt;
&lt;br /&gt;
 sendMeterReading(input: MeterReadingInput!): MeterReadingResponse!&lt;br /&gt;
 Send meter reading for home (only available for Norwegian users) &lt;br /&gt;
 &lt;br /&gt;
 updateHome(input: UpdateHomeInput!): Home!&lt;br /&gt;
 Update home information&lt;br /&gt;
 &lt;br /&gt;
 sendPushNotification(input: PushNotificationInput!): PushNotificationResponse!&lt;br /&gt;
 Send notification to Tibber app on registered devices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==subscription==&lt;br /&gt;
&lt;br /&gt;
Subscription hat nur 2 Felder, wobei dauerhaft nur das erste interessant ist.&lt;br /&gt;
&lt;br /&gt;
 liveMeasurement(homeId: ID!): LiveMeasurement&lt;br /&gt;
 Subscribe to real-time measurement stream from Pulse or Watty device&lt;br /&gt;
&lt;br /&gt;
 testMeasurement(homeId: ID!): LiveMeasurement&lt;br /&gt;
 Subscribe to test stream&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=xml&amp;gt;&lt;br /&gt;
subscription{&lt;br /&gt;
  liveMeasurement(homeId: &amp;quot;&amp;lt;homeID&amp;gt;&amp;quot;){&lt;br /&gt;
    timestamp&lt;br /&gt;
    power&lt;br /&gt;
    lastMeterConsumption&lt;br /&gt;
    accumulatedConsumption&lt;br /&gt;
    accumulatedProduction&lt;br /&gt;
    accumulatedConsumptionLastHour&lt;br /&gt;
    accumulatedProductionLastHour&lt;br /&gt;
    accumulatedCost&lt;br /&gt;
    accumulatedReward&lt;br /&gt;
    currency&lt;br /&gt;
    minPower&lt;br /&gt;
    averagePower&lt;br /&gt;
    maxPower&lt;br /&gt;
    powerProduction&lt;br /&gt;
    powerReactive&lt;br /&gt;
    powerProductionReactive&lt;br /&gt;
    minPowerProduction&lt;br /&gt;
    maxPowerProduction&lt;br /&gt;
    lastMeterProduction&lt;br /&gt;
    powerFactor&lt;br /&gt;
    voltagePhase1&lt;br /&gt;
    voltagePhase2&lt;br /&gt;
    voltagePhase3&lt;br /&gt;
    currentL1&lt;br /&gt;
    currentL2&lt;br /&gt;
    currentL3&lt;br /&gt;
    signalStrength&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==fragment==&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
&lt;br /&gt;
Dazu habe ich bisher keine weiteren Infos gefunden.&lt;br /&gt;
&lt;br /&gt;
=Programmierung=&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung steht bei mir hier die Client-Programmierung im Vordergrund.&lt;br /&gt;
&lt;br /&gt;
==Query/Mutation==&lt;br /&gt;
&lt;br /&gt;
Die Abfragen und Aenderungen zu programmieren sind schnell erledigt.&lt;br /&gt;
&lt;br /&gt;
Der Einstieg auf der Konsole gelingt mit curl recht gut. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
 curl \&lt;br /&gt;
-H &amp;quot;Authorization: Bearer xxxxx-yyyyyy_dhfakjebnrqauvhdjhfaklhdf \&lt;br /&gt;
-H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
-X POST \&lt;br /&gt;
-d  &#039;mutation{ sendMeterReading(input:{homeId:&amp;quot;some home id&amp;quot;, reading: 123}){time reading  }}&#039; https://api.tibber.com/v1-beta/gql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subscription==&lt;br /&gt;
&lt;br /&gt;
Die Subscriptions sind schon ein wenig anspruchsvoller zu programmieren als Query und Mutation (QuM).&lt;br /&gt;
Ist QuM eine simple http-Anfrage mit einer Antwort im JSON-Format, ist es bei den Subscriptions ein Websocket, der einmal geoeffnet in unregelmaeszigen Abstaenden JSON-Pakete liefert.&lt;br /&gt;
&lt;br /&gt;
===Anforderungen für Websocket-Abonnement-Clients===&lt;br /&gt;
&lt;br /&gt;
* Clients muessen den User-Agent-Header festlegen, wenn sie die GraphQL-API aufrufen und eine Websocket-Verbindung oeffnen. Sowohl die Plattform als auch die Treiberversion muessen angegeben werden. Z.B. Homey/10.0.0 com.tibber/1.8.3&lt;br /&gt;
* Clients müssen das Unterprotokoll graphql-transport-ws implementieren&lt;br /&gt;
* Clients müssen Jitter und exponentielles Backoff implementieren, wenn sie Anfragen an die API wiederholen&lt;br /&gt;
* Clients müssen die WebSocket-Server-URL dynamisch abfragen&lt;br /&gt;
&lt;br /&gt;
===Best Practices für die Implementierung von WebSocket-Abonnement-Clients===&lt;br /&gt;
&lt;br /&gt;
Bei der Implementierung eines Clients zum Abonnieren von Live-Daten sind einige Szenarien zu beruecksichtigen:&lt;br /&gt;
* Keine Daten aufgrund von Netzwerkproblemen: Es kann sinnvoll sein, einen Wiederverbindungsmechanismus zu implementieren, falls mehrere Minuten lang keine Daten empfangen wurden. Bei einem erneuten Versuch muss zunaechst die alte Websocket-Verbindung zerstoert und ordnungsgemaeszer Jitter und exponentielle Verzoegerung implementiert werden.&lt;br /&gt;
* Ein Echtzeitgeraet wird moeglicherweise entfernt. Es wird empfohlen, vor dem erneuten Verbinden immer zu ueberpruefen, ob home.features.realTimeConsumptionEnabled einen echten Wert hat.&lt;br /&gt;
* Eine WebSocket-Verbindung kann aufgrund eines ungueltigen Authentifizierungstokens verboten sein (z. B. weil ein Benutzer möglicherweise sein Tibber-Konto entfernt hat). In diesem Fall darf der Client es nicht mit demselben Token erneut versuchen. Stattdessen muss der Autorisierungsprozess erneut ausgeführt werden, wobei der Benutzer neue Anmeldeinformationen eingibt.&lt;br /&gt;
* Es kann zu einem Neustart der Tibber-Websocket-API kommen, was bedeutet, dass die Verbindung mit dem &amp;quot;Code 1001&amp;quot; und dem Grund &amp;quot;Going away&amp;quot; geschlossen wird. In diesem Fall kann der Client nach einer zufälligen Verzoegerung von 1 bis 60 Sekunden (Jitter angewendet) die Verbindung wiederherstellen, um zu vermeiden, dass alle Clients gleichzeitig die Verbindung wiederherstellen.&lt;br /&gt;
&lt;br /&gt;
In PHP habe ich wenig bis gar nichts gefunden. Ich wollte mir auch einfach die Nutzung einer GraphQL-Library ersparen. Python habe ich erst einmal an den Schluss verschoben und einem Integration in FHEM den Vorzug gegeben.&lt;br /&gt;
&lt;br /&gt;
===Perl (FHEM)===&lt;br /&gt;
Hier der Code der tatsaechlich funktioniert, obwohl er an ein paar Stellen nicht so vorgeht wie ich aus den Tibber-Docs erwartet hatte.&lt;br /&gt;
&lt;br /&gt;
HINWEIS: Dies ist der &amp;quot;nackte&amp;quot; Perl-Code. In der &amp;quot;Originaldatei&amp;quot; sind noch die &amp;quot;FHEM-Escapes&amp;quot; doppelter Strichpunkt und Zeilenfolgezeichen \ enthalten. Eine Eingabe ueber die FHEM-Kommandozeile hat bei mir nicht funktioniert. Erst das direkte Einkopieren in die fhem.conf zeigte das nachfolgende, funktionierende Ergebnis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line&amp;gt;&lt;br /&gt;
connect:cmd:.connect {&lt;br /&gt;
	my $hash = $defs{$name};&lt;br /&gt;
	my $devState = DevIo_IsOpen($hash);&lt;br /&gt;
	return &amp;quot;Device already open&amp;quot; if (defined($devState));&lt;br /&gt;
	&lt;br /&gt;
	# establish connection to websocket&lt;br /&gt;
	# format must also include portnumber if a path is to be specified&lt;br /&gt;
	$hash-&amp;gt;{DeviceName} = AttrVal($name, &amp;quot;websocketURL&amp;quot;, &amp;quot;wss:echo.websocket.org:443&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# special headers needed for Tibber, see also Developer Tools in Browser&lt;br /&gt;
	$hash-&amp;gt;{header}{&#039;Sec-WebSocket-Protocol&#039;} = &#039;graphql-transport-ws&#039;;&lt;br /&gt;
	$hash-&amp;gt;{header}{&#039;Host&#039;} = &#039;websocket-api.tibber.com&#039;;&lt;br /&gt;
	$hash-&amp;gt;{header}{&#039;Origin&#039;} = &#039;https://developer.tibber.com&#039;;&lt;br /&gt;
	&lt;br /&gt;
	# callback function when &amp;quot;select()&amp;quot; signals data for us&lt;br /&gt;
	# websocket Ping/Pongs are treated in DevIo but still call this function&lt;br /&gt;
	$hash-&amp;gt;{directReadFn} = sub () {&lt;br /&gt;
		my $hash = $defs{$name};&lt;br /&gt;
		&lt;br /&gt;
		# we can read without closing the DevIo, because select() signalled data&lt;br /&gt;
		my $buf = DevIo_SimpleRead($hash);&lt;br /&gt;
		&lt;br /&gt;
		# if read fails, close device&lt;br /&gt;
		if(!defined($buf)) {&lt;br /&gt;
			DevIo_CloseDev($hash);&lt;br /&gt;
			$buf = &amp;quot;not_connected&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#Log(3, &amp;quot;$name:$reading: websocket data: &amp;gt;&amp;gt;&amp;gt;$buf&amp;lt;&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		# only update our reading if buffer is not empty and if last update is older than minInterval&lt;br /&gt;
		if ($buf ne &amp;quot;&amp;quot;) {&lt;br /&gt;
			my $websocketDataAge = ReadingsAge($name, &amp;quot;websocketData&amp;quot;, 3600);&lt;br /&gt;
			my $minInterval = AttrVal($name, &amp;quot;minInterval&amp;quot;, 0);&lt;br /&gt;
			my $isNext = ($buf =~ /.*id.*type.*next.*payload.*data.*liveMeasurement.*/s);&lt;br /&gt;
			&lt;br /&gt;
			readingsBeginUpdate($hash);&lt;br /&gt;
			readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;$buf&amp;quot;) if ($isNext &amp;amp;&amp;amp; $websocketDataAge &amp;gt; $minInterval);&lt;br /&gt;
			readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;$buf&amp;quot;) if (!$isNext);&lt;br /&gt;
			readingsEndUpdate($hash, 1);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	# open DevIo websocket&lt;br /&gt;
	DevIo_OpenDev($hash, 0, undef, sub(){&lt;br /&gt;
		my ($hash, $error) = @_;&lt;br /&gt;
		return &amp;quot;$error&amp;quot; if ($error);&lt;br /&gt;
		&lt;br /&gt;
		my $token = AttrVal($name, &amp;quot;token&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		DevIo_SimpleWrite($hash, &#039;{&amp;quot;type&amp;quot;:&amp;quot;connection_init&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;token&amp;quot;:&amp;quot;&#039;.$token.&#039;&amp;quot;}}&#039;, 2);&lt;br /&gt;
	});&lt;br /&gt;
	readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
},&lt;br /&gt;
disconnect:cmd:.disconnect {&lt;br /&gt;
	my $hash = $defs{$name};&lt;br /&gt;
	RemoveInternalTimer($hash);&lt;br /&gt;
	DevIo_SimpleRead($hash);&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
	&lt;br /&gt;
	return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
},&lt;br /&gt;
onDisconnect {&lt;br /&gt;
	my $myState = ReadingsVal($name, &amp;quot;state&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
	my $myData = ReadingsVal($name, &amp;quot;websocketData&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
	return if ($myState ne &amp;quot;disconnected&amp;quot; and $myData ne &amp;quot;not_connected&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	## timer callback function, called after a few seconds to initiate a reconnect&lt;br /&gt;
	my $timerFunction = sub() {&lt;br /&gt;
		my ($hash) = @_;&lt;br /&gt;
		my $devState = DevIo_IsOpen($hash);&lt;br /&gt;
		&lt;br /&gt;
		# only re-connect if device is not connected&lt;br /&gt;
		readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;connect&amp;quot;, 1) if (!defined($devState));&lt;br /&gt;
	};&lt;br /&gt;
	my $hash = $defs{$name};&lt;br /&gt;
	RemoveInternalTimer($hash, $timerFunction);&lt;br /&gt;
	&lt;br /&gt;
	# wait a random time before reconnect (exponential backoff TBD):&lt;br /&gt;
	my $rwait = int(rand(200)) + 30;&lt;br /&gt;
	InternalTimer(gettimeofday() + $rwait, $timerFunction, $hash);&lt;br /&gt;
	readingsBulkUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;reconnect attempt in $rwait seconds&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
},&lt;br /&gt;
onConnectionAck:websocketData:.*connection_ack.* {&lt;br /&gt;
	#websocketData contains the string &amp;quot;connection_ack&amp;quot;&lt;br /&gt;
	Log(3, &amp;quot;$name:$reading: got connection ack&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# do not proceed if connection is lost&lt;br /&gt;
	my $hash = $defs{$name};&lt;br /&gt;
	my $devState = DevIo_IsOpen($hash);&lt;br /&gt;
	return &amp;quot;Device not open&amp;quot; if (!defined($devState));&lt;br /&gt;
	&lt;br /&gt;
	readingsBulkUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;got connection ack&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	my $homeId = AttrVal($name, &amp;quot;homeId&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
	my $myId = AttrVal($name, &amp;quot;myId&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# build the query, do it in pieces, the comma at the end caused perl errors&lt;br /&gt;
	# so we put it together in this not very elegant way&lt;br /&gt;
	my $json = &#039;{ &amp;quot;id&amp;quot;:&amp;quot;&#039;. $myId .&#039;&amp;quot;, &amp;quot;type&amp;quot;:&amp;quot;subscribe&amp;quot;&#039;.&amp;quot;, &amp;quot;;&lt;br /&gt;
	$json .= &#039;&amp;quot;payload&amp;quot;:{&#039;;&lt;br /&gt;
	$json .= &#039;&amp;quot;variables&amp;quot;:{}&#039;.&amp;quot;, &amp;quot;;&lt;br /&gt;
	$json .= &#039;&amp;quot;extensions&amp;quot;:{}&#039;.&amp;quot;, &amp;quot;;&lt;br /&gt;
	$json .= &#039;&amp;quot;query&amp;quot;:&amp;quot;subscription { liveMeasurement( homeId: \&amp;quot;&#039;.$homeId.&#039;\&amp;quot; ) &#039;;&lt;br /&gt;
	$json .= &#039;{ timestamp power lastMeterConsumption accumulatedConsumption accumulatedProduction &#039;;&lt;br /&gt;
	$json .= &#039;accumulatedProductionLastHour accumulatedCost accumulatedReward currency minPower averagePower maxPower &#039;;&lt;br /&gt;
	$json .= &#039;powerProduction powerReactive powerProductionReactive minPowerProduction maxPowerProduction lastMeterProduction &#039;;&lt;br /&gt;
	$json .= &#039;powerFactor voltagePhase1 voltagePhase2 voltagePhase3 signalStrength }}&amp;quot;&#039;;&lt;br /&gt;
	$json .= &#039;}}&#039;;&lt;br /&gt;
	&lt;br /&gt;
	#send the string via websocket as ASCII&lt;br /&gt;
	Log(3, &amp;quot;$name:$reading: sending JSON: &amp;gt;&amp;gt;&amp;gt;$json&amp;lt;&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
	DevIo_SimpleWrite($hash, $json, 2);&lt;br /&gt;
	&lt;br /&gt;
	return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
},&lt;br /&gt;
onNextLiveMeasurement:websocketData:.*next.*payload.*data.*liveMeasurement.* {&lt;br /&gt;
	#websocketData contains next-live-measurement-data&lt;br /&gt;
	my $val = ReadingsVal($name, &amp;quot;websocketData&amp;quot;, &amp;quot;{}&amp;quot;);&lt;br /&gt;
	my %res = %{json2nameValue($val, undef, undef, &amp;quot;payload_data_liveMeasurement.*&amp;quot;)};&lt;br /&gt;
	&lt;br /&gt;
	my $ret = &amp;quot;got values for:\n&amp;quot;;&lt;br /&gt;
	foreach my $k (sort keys %res) {&lt;br /&gt;
		$ret .= &amp;quot;$k\n&amp;quot;;&lt;br /&gt;
		readingsBulkUpdate($hash, makeReadingName($k), $res{$k});&lt;br /&gt;
	}&lt;br /&gt;
	return $ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Code Analyse====&lt;br /&gt;
&lt;br /&gt;
Es gibt 5 Eintrittspunkte:&lt;br /&gt;
* connect&lt;br /&gt;
* disconnect&lt;br /&gt;
* onDisconnect&lt;br /&gt;
* onConnectionAck&lt;br /&gt;
* onNextLiveMeasurement&lt;br /&gt;
&lt;br /&gt;
Die ersten beiden legen die Befehlsfolgen für ein Start-Kommando (set cmd connect, bzw. set cmd disconnect) oder Stop-Kommando fest.&lt;br /&gt;
Die letzten 3 reagieren auf die entsprechenden Events.&lt;br /&gt;
=====connect=====&lt;br /&gt;
&lt;br /&gt;
Lexikalische Variablen mittels my, bzw. my()&lt;br /&gt;
&lt;br /&gt;
 Jede Variable, die mit our deklariert oder auch &amp;quot;einfach so&amp;quot; ohne eine Deklaration verwendet wird, wird in die Symboltabelle des jeweils aktuellen Packages aufgenommen.&lt;br /&gt;
 Deklariert man dagegen eine Variable mit dem Operator my, so wird die entsprechende Variable in einer anderen Tabelle abgelegt, auf die kein expliziter Zugriff möglich ist. &lt;br /&gt;
 Neben der Tatsache, daß my-Variablen in einer eigenen Tabelle verwaltet werden, ist von besonderer Bedeutung, daß sie nur einen recht beschränkten Gültigkeitsbereich besitzen. Eine durch my erzeugte Variable steht nur in dem aktuellen Block (definiert durch geschweifte Klammern &amp;quot;{...}&amp;quot;), der aktuellen Datei oder innerhalb eines Arguments von eval() zur Verfügung. Außerhalb davon existieren diese Variablen nicht, es ist also (im Gegensatz zu our-Variablen) auch mit Hilfe des Package-Namens dort kein Zugriff möglich&lt;br /&gt;
 Es kann in einem Package durchaus zwei Variablen gleichen Namens geben: eine in der Symboltabelle und eine, die durch einen Aufruf von my entstanden ist. In einem solchen Falle wird bei einfacher Verwendung des Bezeichners auf die my-Variable zugegriffen. &lt;br /&gt;
&lt;br /&gt;
In $defs stehen alle Defines drin. In $hash wird also der Name des des aufrufenden Devices lokal hinterlegt und danach mit DevIO_IsOpen() der Status abgefragt. &lt;br /&gt;
$defs ist ein Hash. Ein Hash ist ein anderer Namen fuer ein assoziatives Array. Also eine ungeordnete Liste von Skalaren (Zahl oder String) die ueber einen Stringwert angesprochen (Lookup) werden koennen.  &lt;br /&gt;
&lt;br /&gt;
FHEM-Spezial:&lt;br /&gt;
 In $defs findet man alle Devices, z.b. $defs{&amp;quot;Rolladen_Tuere&amp;quot;} beinhaltet das Device.&lt;br /&gt;
 my @alle = keys %defs;&lt;br /&gt;
 my @teilmenge = defInfo(&#039;TYPE=notify&#039;,&#039;NAME&#039;); liefert ein array mit allen notify devices.&lt;br /&gt;
 z.B. my @teilmenge = defInfo(&#039;NAME=Rollladen.*&#039;,&#039;NAME&#039;);&lt;br /&gt;
&lt;br /&gt;
 return &amp;quot;Device already open&amp;quot; if (defined($devState));&lt;br /&gt;
Sollte also das Device bereits im State &amp;quot;offen&amp;quot; sein, wird die connect-Routine abgebrochen. Dann erscheint in den Readings nicht Datum/Uhrzeit des Connects sondern die Meldung &amp;quot;Device already open&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 # establish connection to websocket&lt;br /&gt;
 # format must also include portnumber if a path is to be specified&lt;br /&gt;
 $hash-&amp;gt;{DeviceName} = AttrVal($name, &amp;quot;websocketURL&amp;quot;, &amp;quot;wss:echo.websocket.org:443&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 HASH-Operationen (Beispiel):&lt;br /&gt;
 $href ={APR =&amp;gt; 4,AUG =&amp;gt; 8}; #anonymous hash&lt;br /&gt;
 $el = $href-&amp;gt;{APR}; $el = %{$href}{APR}; #access element of hash&lt;br /&gt;
 $href2 = {%{$href1}}; #copy hash&lt;br /&gt;
 if (ref($r) eq &amp;quot;HASH&amp;quot;) {} #checks if $r points to hash&lt;br /&gt;
&lt;br /&gt;
Dem Internal &amp;quot;DeviceName&amp;quot; wird das Ergebnis von AttrVal() zugewiesen. Bei mir ergab das:&lt;br /&gt;
 DeviceName wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions&lt;br /&gt;
&lt;br /&gt;
 FHEM-Referenz:&lt;br /&gt;
 AttrVal(&amp;lt;devicename&amp;gt;,&amp;lt;attribute&amp;gt;,&amp;lt;defaultvalue&amp;gt;)&lt;br /&gt;
 Gibt das entsprechende Attribut des Gerätes zurück&lt;br /&gt;
 { Value(&amp;quot;wz&amp;quot;) }&lt;br /&gt;
 { OldValue(&amp;quot;wz&amp;quot;) }&lt;br /&gt;
 { time_str2num(OldTimestamp(&amp;quot;wz&amp;quot;)) }&lt;br /&gt;
 { ReadingsVal(&amp;quot;wz&amp;quot;, &amp;quot;measured-temp&amp;quot;, &amp;quot;20&amp;quot;)+0 }&lt;br /&gt;
 { ReadingsTimestamp(&amp;quot;wz&amp;quot;, &amp;quot;measured-temp&amp;quot;, 0)}&lt;br /&gt;
 { AttrVal(&amp;quot;wz&amp;quot;, &amp;quot;room&amp;quot;, &amp;quot;none&amp;quot;) }&lt;br /&gt;
&lt;br /&gt;
Das Attribut websocketURL ist bei mir wss:websocket-api.tibber.com:443/v1-beta/gql/subscriptions. Somit erklaert sich auch der Eintrag bei DeviceName. &amp;quot;wss:echo.websocket.org:443&amp;quot; ist nur der Defaultwert.&lt;br /&gt;
&lt;br /&gt;
Man haette zum Testen auch die folgenden beiden verwenden/eintragen koennen.&lt;br /&gt;
 There are free test servers that we can use to experiment with a WebSocket client, such as:&lt;br /&gt;
&lt;br /&gt;
    Hoppscotch – wss://echo-websocket.hoppscotch.io (GUI)&lt;br /&gt;
    λ if else – wss://ws.ifelse.io (GUI)&lt;br /&gt;
&lt;br /&gt;
 Both provide a GUI for testing via a browser. The former sends a timestamp to the client every second but doesn’t respond to client messages. The latter is a standard echo service that sends a copy of each received message back to the client. Both make sense in testing.&lt;br /&gt;
&lt;br /&gt;
Da curl nicht nativ websocket-Kommunikation unterstuetzt kann man auf folgende Tool ausweichen. Auch chrome bietet ein Websocket-Client-Plugin.&lt;br /&gt;
*wssh3&lt;br /&gt;
*websocat&lt;br /&gt;
*wscat&lt;br /&gt;
&lt;br /&gt;
 # special headers needed for Tibber, see also Developer Tools in Browser&lt;br /&gt;
 $hash-&amp;gt;{header}{&#039;Sec-WebSocket-Protocol&#039;} = &#039;graphql-transport-ws&#039;;&lt;br /&gt;
 $hash-&amp;gt;{header}{&#039;Host&#039;} = &#039;websocket-api.tibber.com&#039;;&lt;br /&gt;
 $hash-&amp;gt;{header}{&#039;Origin&#039;} = &#039;https://developer.tibber.com&#039;;&lt;br /&gt;
&lt;br /&gt;
 # callback function when &amp;quot;select()&amp;quot; signals data for us&lt;br /&gt;
 # websocket Ping/Pongs are treated in DevIo but still call this function&lt;br /&gt;
&lt;br /&gt;
	$hash-&amp;gt;{directReadFn} = sub () {&lt;br /&gt;
		my $hash = $defs{$name};&lt;br /&gt;
		&lt;br /&gt;
		# we can read without closing the DevIo, because select() signalled data&lt;br /&gt;
		my $buf = DevIo_SimpleRead($hash);&lt;br /&gt;
		&lt;br /&gt;
		# if read fails, close device&lt;br /&gt;
		if(!defined($buf)) {&lt;br /&gt;
			DevIo_CloseDev($hash);&lt;br /&gt;
			$buf = &amp;quot;not_connected&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		#Log(3, &amp;quot;$name:$reading: websocket data: &amp;gt;&amp;gt;&amp;gt;$buf&amp;lt;&amp;lt;&amp;lt;&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		# only update our reading if buffer is not empty and if last update is older than minInterval&lt;br /&gt;
		if ($buf ne &amp;quot;&amp;quot;) {&lt;br /&gt;
			my $websocketDataAge = ReadingsAge($name, &amp;quot;websocketData&amp;quot;, 3600);&lt;br /&gt;
			my $minInterval = AttrVal($name, &amp;quot;minInterval&amp;quot;, 0);&lt;br /&gt;
			my $isNext = ($buf =~ /.*id.*type.*next.*payload.*data.*liveMeasurement.*/s);&lt;br /&gt;
			&lt;br /&gt;
			readingsBeginUpdate($hash);&lt;br /&gt;
			readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;$buf&amp;quot;) if ($isNext &amp;amp;&amp;amp; $websocketDataAge &amp;gt; $minInterval);&lt;br /&gt;
			readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;$buf&amp;quot;) if (!$isNext);&lt;br /&gt;
			readingsEndUpdate($hash, 1);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
Die Callback-Funktion wird direkt, ohne Namen, in das/den (?) Hash unter directReadFn abgelegt. &lt;br /&gt;
Die Callback-Funktion:&lt;br /&gt;
Hier wird mit Hilfe der Funktion DevIo_SimpleRead() die Rueckmeldung des Server eingelesen. Siehe [https://wiki.fhem.de/wiki/DevIo]&lt;br /&gt;
Hinweis zum Logging in FHEM: [https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Logging]&lt;br /&gt;
Die eigentliche Aktivitaet geschieht in den sieben Zeilen am Ende der Callback-Fkt. &lt;br /&gt;
 ReadingsAge(&amp;lt;devicename&amp;gt;,&amp;lt;reading&amp;gt;,&amp;lt;defaultvalue&amp;gt;) #gibt das Alter des Readings in Sekunden zurück. &lt;br /&gt;
 AttrVal hatten wir schon.&lt;br /&gt;
 isNext bekommt seinen Wert aus dem durch einen REGEX geliefert Wert des Buffers. Beispiel ($match) = ($dirty =~ /^(.*)$/s); &lt;br /&gt;
&lt;br /&gt;
 Die Funktion readingsBeginUpdate() bereitet die Definition mit dem Hash $hash auf ein Update von Readings vor. Dies betrifft insbesondere das Setzen von Umgebungsvariablen sowie dem aktuellen Zeitstempel als Änderungszeitpunkt. Der Aufruf dieser Funktion ist notwendig um eigentliche Updates mit der Funktion readingsBulkUpdate() auf der gewünschten Definition durchführen zu können. [https://wiki.fhem.de/wiki/DevelopmentModuleAPI#readingsBeginUpdate]&lt;br /&gt;
&lt;br /&gt;
Die Funktion readingsEndUpdate() beendet den Bulk-Update Prozess durch die Funktionen readingsBeginUpdate() &amp;amp; readingsBulkUpdate() und triggert optional die entsprechenden Events sämtlicher erzeugter Readings für die Definition $hash. Desweiteren werden nachgelagerte Tasks wie bspw. die Erzeugung von User-Readings (Attribut: userReadings), sowie die Erzeugung des STATE aufgrund des Attributs stateFormat durchgeführt. Sofern $do_trigger gesetzt ist, werden alle anstehenden Events nach Abschluss getriggert.&lt;br /&gt;
&lt;br /&gt;
	# open DevIo websocket&lt;br /&gt;
	DevIo_OpenDev($hash, 0, undef, sub(){&lt;br /&gt;
		my ($hash, $error) = @_;&lt;br /&gt;
		return &amp;quot;$error&amp;quot; if ($error);&lt;br /&gt;
		&lt;br /&gt;
		my $token = AttrVal($name, &amp;quot;token&amp;quot;, &amp;quot;???&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		DevIo_SimpleWrite($hash, &#039;{&amp;quot;type&amp;quot;:&amp;quot;connection_init&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;token&amp;quot;:&amp;quot;&#039;.$token.&#039;&amp;quot;}}&#039;, 2);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
Das ist die eigentliche Kontaktaufnahme. &lt;br /&gt;
&lt;br /&gt;
Dies dient vermutlich dazu, bis zum ersten Empfang von Daten, das Reading websocketDate zu leeren.&lt;br /&gt;
&lt;br /&gt;
 return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss erscheint dann im Reading connect die aktuelle Zeit.&lt;br /&gt;
&lt;br /&gt;
readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=====disconnect=====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
 disconnect:cmd:.disconnect {&lt;br /&gt;
	my $hash = $defs{$name};&lt;br /&gt;
	RemoveInternalTimer($hash);&lt;br /&gt;
	DevIo_SimpleRead($hash);&lt;br /&gt;
	DevIo_CloseDev($hash);&lt;br /&gt;
	return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erlaeuterung:&lt;br /&gt;
&lt;br /&gt;
*Die Funktion RemoveInternalTimer löscht möglicherweise noch anstehende Timer welche mit dem Übergabeparameter $arg gescheduled sind. Optional kann man zusätzlich die Suche auf eine bestimmte Funktion $functionName weiter einschränken. [https://wiki.fhem.de/wiki/DevelopmentModuleAPI#RemoveInternalTimer]&lt;br /&gt;
&lt;br /&gt;
*Die Funktion DevIo_SimpleRead() liest anstehende Daten für die Verbindung von $hash ein und gibt diese zurück. [https://wiki.fhem.de/wiki/DevIo#DevIo_SimpleRead()]&lt;br /&gt;
&lt;br /&gt;
*Die Funktion DevIo_CloseDev() schließt eine evtl. geöffnete Verbindung für die Definition $hash. [https://wiki.fhem.de/wiki/DevIo#DevIo_CloseDev()]&lt;br /&gt;
&lt;br /&gt;
*POSIX:: [https://metacpan.org/pod/POSIX#strftime]&lt;br /&gt;
&lt;br /&gt;
=====onDisconnect=====&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=====onConnectionAck=====&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====onNextLiveMeasurement=====&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
Zum Eingewoehnen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
// WebSocket-Verbindung herstellen&lt;br /&gt;
const socket = new WebSocket(&#039;ws://echo.websocket.org&#039;);&lt;br /&gt;
&lt;br /&gt;
// Event-Handler für Verbindungsereignisse&lt;br /&gt;
socket.onopen = function(event) {&lt;br /&gt;
    console.log(&#039;WebSocket-Verbindung hergestellt.&#039;);&lt;br /&gt;
    // Nachricht senden, sobald die Verbindung hergestellt ist&lt;br /&gt;
    socket.send(&#039;Hallo Server!&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onmessage = function(event) {&lt;br /&gt;
    console.log(&#039;Nachricht vom Server erhalten:&#039;, event.data);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onclose = function(event) {&lt;br /&gt;
    console.log(&#039;WebSocket-Verbindung geschlossen.&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onerror = function(error) {&lt;br /&gt;
    console.error(&#039;WebSocket-Fehler aufgetreten:&#039;, error);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und jetzt das Gerippe fuer Tibber mit Haut versehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=javascript&amp;gt;&lt;br /&gt;
const WebSocket = require(&#039;ws&#039;);&lt;br /&gt;
&lt;br /&gt;
const query = `subscription {&lt;br /&gt;
    liveMeasurement(homeId: &amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;) {&lt;br /&gt;
      timestamp&lt;br /&gt;
      power&lt;br /&gt;
      accumulatedConsumption&lt;br /&gt;
      minPower&lt;br /&gt;
      maxPower&lt;br /&gt;
      averagePower&lt;br /&gt;
      voltagePhase1&lt;br /&gt;
      currentL1&lt;br /&gt;
      accumulatedCost&lt;br /&gt;
      currency&lt;br /&gt;
   } &lt;br /&gt;
}`;&lt;br /&gt;
&lt;br /&gt;
// WebSocket-Verbindung herstellen&lt;br /&gt;
const socket = new WebSocket(&#039;wss://websocket-api.tibber.com/v1-beta/gql/subscriptions&#039;,[&#039;graphql-transport-ws&#039;], { &lt;br /&gt;
        headers: {&lt;br /&gt;
                &#039;Content-Type&#039;: &#039;application/json&#039;,&lt;br /&gt;
                &#039;User-Agent&#039;: &#039;NodeJS tibberview&#039;,&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Event-Handler für Verbindungsereignisse&lt;br /&gt;
socket.onopen = function(event) {&lt;br /&gt;
    console.log(&amp;quot;WebSocket-Verbindung hergestellt.&amp;quot;);&lt;br /&gt;
    // Nachricht senden, sobald die Verbindung hergestellt ist&lt;br /&gt;
   const connectionQuery = {&lt;br /&gt;
      type: &amp;quot;connection_init&amp;quot;,&lt;br /&gt;
      payload: {&lt;br /&gt;
          token: &amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    socket.send(JSON.stringify(connectionQuery));&lt;br /&gt;
    console.log(&amp;quot;Verbindung zum &#039;Tibber feed&#039; hergestellt.&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onmessage = function(event) {&lt;br /&gt;
    console.log(&amp;quot;Nachricht vom Server erhalten:&amp;quot;, event.data);&lt;br /&gt;
    const msg = JSON.parse(event.data);&lt;br /&gt;
&lt;br /&gt;
    if (msg.type === &amp;quot;connection_ack&amp;quot;) {&lt;br /&gt;
      console.log(&amp;quot;Tibber ACK empfangen: &amp;quot;, msg);&lt;br /&gt;
&lt;br /&gt;
      const realtimeDataQuery = {&lt;br /&gt;
        id: &amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&lt;br /&gt;
        type: &amp;quot;subscribe&amp;quot;,&lt;br /&gt;
        payload: { query }&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      socket.send(JSON.stringify(realtimeDataQuery));&lt;br /&gt;
    }&lt;br /&gt;
    else if (msg.type === &amp;quot;next&amp;quot;) {&lt;br /&gt;
      if (!msg.payload.data) {&lt;br /&gt;
        console.log(&amp;quot;⚠  Nachricht hat keinen Inhalt.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      const data = msg.payload.data.liveMeasurement;&lt;br /&gt;
      socket.emit(&amp;quot;data&amp;quot;, data);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;Nachrichteninhalt: &amp;quot;, msg)&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onclose = function(event) {&lt;br /&gt;
    console.log(&#039;WebSocket-Verbindung geschlossen.&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
socket.onerror = function(error) {&lt;br /&gt;
    console.error(&#039;WebSocket-Fehler aufgetreten:&#039;, error);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm erzeugte folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
worker:/mnt/1.5T_RAID/Programme/JavaScript/WebSocket # node tibberclient_demo.js &lt;br /&gt;
WebSocket-Verbindung hergestellt.&lt;br /&gt;
Verbindung zum &#039;Tibber feed&#039; hergestellt.&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;type&amp;quot;:&amp;quot;connection_ack&amp;quot;}&lt;br /&gt;
Tibber ACK empfangen:  { type: &#039;connection_ack&#039; }&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:48.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306.6,&amp;quot;voltagePhase1&amp;quot;:230.1,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:51.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306.3,&amp;quot;voltagePhase1&amp;quot;:229.8,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:52.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306.3,&amp;quot;voltagePhase1&amp;quot;:230,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:53.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306.2,&amp;quot;voltagePhase1&amp;quot;:230.3,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:54.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306.1,&amp;quot;voltagePhase1&amp;quot;:230.3,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:55.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306,&amp;quot;voltagePhase1&amp;quot;:230.2,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:56.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2306,&amp;quot;voltagePhase1&amp;quot;:229.8,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:57.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2305.9,&amp;quot;voltagePhase1&amp;quot;:229.9,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:58.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2305.8,&amp;quot;voltagePhase1&amp;quot;:230.1,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:46:59.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2305.8,&amp;quot;voltagePhase1&amp;quot;:230.4,&amp;quot;currentL1&amp;quot;:2.6,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:47:00.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2305.7,&amp;quot;voltagePhase1&amp;quot;:230.1,&amp;quot;currentL1&amp;quot;:2.7,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
Nachricht vom Server erhalten: {&amp;quot;id&amp;quot;:&amp;quot;xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;next&amp;quot;,&amp;quot;payload&amp;quot;:{&amp;quot;data&amp;quot;:{&amp;quot;liveMeasurement&amp;quot;:{&amp;quot;timestamp&amp;quot;:&amp;quot;2024-03-17T08:47:01.000+01:00&amp;quot;,&amp;quot;power&amp;quot;:0,&amp;quot;accumulatedConsumption&amp;quot;:20.258,&amp;quot;minPower&amp;quot;:0,&amp;quot;maxPower&amp;quot;:5150,&amp;quot;averagePower&amp;quot;:2305.6,&amp;quot;voltagePhase1&amp;quot;:229.9,&amp;quot;currentL1&amp;quot;:2.7,&amp;quot;accumulatedCost&amp;quot;:11.672781,&amp;quot;currency&amp;quot;:&amp;quot;SEK&amp;quot;}}}}&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An der Stelle mache ich jetzt einen Ausflug in PHP.&lt;br /&gt;
&lt;br /&gt;
===PHP===&lt;br /&gt;
Nachdem der Websocket-Kontakt mit JavaScript funktioniert hat, kommt jetzt ein Serverprogramm was folgendes tun soll.&lt;br /&gt;
&lt;br /&gt;
*Abfrage der Basisdaten&lt;br /&gt;
*Objekt Types Builder&lt;br /&gt;
*Mutation&lt;br /&gt;
*Websocket Subsrciption&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
&lt;br /&gt;
Quelle: https://github.com/Danielhiversen/pyTibber&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client-Beispiel mit eingesetztem DEMO_TOKEN und user_agent&lt;br /&gt;
Obwohl DEMO_TOKEN in tibber.py definiert ist, wird es nicht uebernommen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
import tibber.const&lt;br /&gt;
import tibber&lt;br /&gt;
import asyncio&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async def start():&lt;br /&gt;
  tibber_connection = tibber.Tibber(tibber.const.DEMO_TOKEN, user_agent=&amp;quot;worker&amp;quot;)&lt;br /&gt;
  await tibber_connection.update_info()&lt;br /&gt;
  print(tibber_connection.name)&lt;br /&gt;
&lt;br /&gt;
  home = tibber_connection.get_homes()[0]&lt;br /&gt;
  await home.fetch_consumption_data()&lt;br /&gt;
  await home.update_info()&lt;br /&gt;
  print(home.address1)&lt;br /&gt;
&lt;br /&gt;
  await home.update_price_info()&lt;br /&gt;
  print(home.current_price_info)&lt;br /&gt;
  &lt;br /&gt;
  # await tibber_connection.close_connection()&lt;br /&gt;
&lt;br /&gt;
loop = asyncio.run(start())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
import tibber.const&lt;br /&gt;
import asyncio&lt;br /&gt;
&lt;br /&gt;
import aiohttp&lt;br /&gt;
import tibber&lt;br /&gt;
&lt;br /&gt;
def _callback(pkg):&lt;br /&gt;
    print(pkg)&lt;br /&gt;
    data = pkg.get(&amp;quot;data&amp;quot;)&lt;br /&gt;
    if data is None:&lt;br /&gt;
        return&lt;br /&gt;
    print(data.get(&amp;quot;liveMeasurement&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
async def run():&lt;br /&gt;
    async with aiohttp.ClientSession() as session:&lt;br /&gt;
        tibber_connection = tibber.Tibber(tibber.const.DEMO_TOKEN, websession=session, user_agent=&amp;quot;worker&amp;quot;)&lt;br /&gt;
        await tibber_connection.update_info()&lt;br /&gt;
    home = tibber_connection.get_homes()[0]&lt;br /&gt;
    await home.rt_subscribe(_callback)    &lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
      await asyncio.sleep(10)&lt;br /&gt;
&lt;br /&gt;
loop = asyncio.run(run())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Starlink&amp;diff=5199</id>
		<title>Starlink</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Starlink&amp;diff=5199"/>
		<updated>2026-07-31T15:53:27Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Starlink Mini=&lt;br /&gt;
So heute (2026-06-29) mal Starlink in Betrieb genommen.&lt;br /&gt;
&lt;br /&gt;
Die Lieferung war ein K(r)ampf. Bestellt am 11. Mai 2026 und heute ist der Router immer noch nicht da!&lt;br /&gt;
DHL hat zwar nachverpackt, aber wieder zurueckgeschickt. Eine Supportanfrage wurde zwar beantwortet, aber immer noch kein neuer Router unterwegs. &lt;br /&gt;
&lt;br /&gt;
Den Router brauche ich aber GsD nicht. Die Antenne hat soweit schon alles eingebaut. &lt;br /&gt;
Per WLAN mit dem Mobil verbunden und die Ausrichtung durchgefuehrt.&lt;br /&gt;
&lt;br /&gt;
Das spezielle Ethernetkabel, mit Feuchtigkeitsschutz, habe ich bei AliExpress bestellt.&lt;br /&gt;
&lt;br /&gt;
Die Antenne hat standardmaeszig die IP 192.168.1.1.&lt;br /&gt;
&lt;br /&gt;
DHCP ist eingebaut.&lt;br /&gt;
&lt;br /&gt;
Ein per LAN angeschlossener PC hat die IP 192.168.1.222 erhalten.&lt;br /&gt;
&lt;br /&gt;
Der Bandbreitentest ergab bei einem 100 MBit/s-Vertrag folgendes:&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-06-29 at 18-40-02 Browsermessung Breitbandmessung.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt die Antenne an den zweiten WAN-Anschluss des USG-3P und als Backup (Distributed; Failover taugt nix! Kein automatisches Restore nach einem Fallback!) fuer meinen Vodafone Kabel-Gigabit-Anschluss.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ping von der console:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ping clx.de&lt;br /&gt;
PING clx.de (217.160.223.182) 56(84) bytes of data.&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=1 ttl=56 time=45.4 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=2 ttl=56 time=24.0 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=3 ttl=56 time=34.4 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=4 ttl=56 time=32.7 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=5 ttl=56 time=27.5 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=6 ttl=56 time=25.9 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=7 ttl=56 time=39.9 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=8 ttl=56 time=45.8 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=9 ttl=56 time=45.4 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=10 ttl=56 time=36.0 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=11 ttl=56 time=26.9 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=12 ttl=56 time=44.5 ms&lt;br /&gt;
64 bytes from clienthosting.eu (217.160.223.182): icmp_seq=13 ttl=56 time=24.3 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Speedtest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
speedtest-cli --server 73799&lt;br /&gt;
Retrieving speedtest.net configuration...&lt;br /&gt;
Testing from Starlink (145.224.73.201)...&lt;br /&gt;
Retrieving speedtest.net server list...&lt;br /&gt;
Retrieving information for the selected server...&lt;br /&gt;
Hosted by Bordell RoyalGirl (Berlin) [0.12 km]: 1800000.0 ms&lt;br /&gt;
Testing download speed................................................................................&lt;br /&gt;
Download: 92.09 Mbit/s&lt;br /&gt;
Testing upload speed......................................................................................................&lt;br /&gt;
Upload: 37.41 Mbit/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
speedtest-cli --server 69225&lt;br /&gt;
Retrieving speedtest.net configuration...&lt;br /&gt;
Testing from Starlink (145.224.73.201)...&lt;br /&gt;
Retrieving speedtest.net server list...&lt;br /&gt;
Retrieving information for the selected server...&lt;br /&gt;
Hosted by cndd.net (Berlin) [1.63 km]: 1800000.0 ms&lt;br /&gt;
Testing download speed................................................................................&lt;br /&gt;
Download: 91.54 Mbit/s&lt;br /&gt;
Testing upload speed......................................................................................................&lt;br /&gt;
Upload: 38.59 Mbit/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Vergleich ein Vodafone300 (Gigabit-Kabel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
speedtest-cli --server 1973&lt;br /&gt;
Retrieving speedtest.net configuration...&lt;br /&gt;
Testing from Vodafone Germany (77.24.97.213)...&lt;br /&gt;
Retrieving speedtest.net server list...&lt;br /&gt;
Retrieving information for the selected server...&lt;br /&gt;
Hosted by DegNet GmbH (Deggendorf) [148.20 km]: 1800000.0 ms&lt;br /&gt;
Testing download speed................................................................................&lt;br /&gt;
Download: 281.15 Mbit/s&lt;br /&gt;
Testing upload speed......................................................................................................&lt;br /&gt;
Upload: 32.11 Mbit/s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was die 1800000.0 ms bedeuten sollen muss ich noch rausfinden.&lt;br /&gt;
&lt;br /&gt;
=EasterEgg=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh admin@192.168.1.1&lt;br /&gt;
The authenticity of host &#039;192.168.1.1 (192.168.1.1)&#039; can&#039;t be established.&lt;br /&gt;
ECDSA key fingerprint is SHA256:iVCavjPXwZzXDSnWIHi+nqJe5K8oe9URY6ipf5dwYwU.&lt;br /&gt;
This key is not known by any other names.&lt;br /&gt;
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
Warning: Permanently added &#039;192.168.1.1&#039; (ECDSA) to the list of known hosts.&lt;br /&gt;
&lt;br /&gt;
-----BEGIN CERTIFICATE-----&lt;br /&gt;
MIIB6zCCAXCgAwIBAgIMAQAAAAAAAAABtXq1MAoGCCqGSM49BAMDMBsxGTAXBgNV&lt;br /&gt;
BAMTEFNwYWNlWCBSb3V0ZXIgQ0EwHhcNMjUxMDEyMDAwMDAwWhcNNDUxMDEyMDAw&lt;br /&gt;
MDAwWjBIMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGU3BhY2VYMSgwJgYDVQQDEx9S&lt;br /&gt;
b3V0ZXItMDEwMDAwMDAwMDAwMDAwMDAxQjU3QUI1MHYwEAYHKoZIzj0CAQYFK4EE&lt;br /&gt;
ACIDYgAEjwUdaSvXuwKV+Esmefdhn1hyDdevo8VVaIxs17CymQtoFgUApAWsby3b&lt;br /&gt;
U3p5TBPGkx1ERnm24stNf9dHeby4O1eYEDi2e+2fyXqvFbj3zRVYz5YuGOkAD4ng&lt;br /&gt;
//jt4Dcio1AwTjAdBgNVHQ4EFgQUo3Z4qcDEJe2nsXebQirJtA6ZoUgwHwYDVR0j&lt;br /&gt;
BBgwFoAUXK1XuFQFitF8QKLiv/LDgeiTQiAwDAYDVR0TBAUwAwEBADAKBggqhkjO&lt;br /&gt;
PQQDAwNpADBmAjEAuZZgNNj2rdtAOUM580KSjajK+TFguE2QK2ccAgmriQd4k0pO&lt;br /&gt;
MEkwFJ8FJZ96WSkEAjEAmMzGiWHzvmGQYWuknBsg1gXCClUhi3NksFUsdqeoubWb&lt;br /&gt;
SIVBnB886ms6coVOcptg&lt;br /&gt;
-----END CERTIFICATE-----&lt;br /&gt;
&lt;br /&gt;
                                                                   +&lt;br /&gt;
                                                    +&lt;br /&gt;
                                          +    +&lt;br /&gt;
                                   +     +&lt;br /&gt;
                              +      +                                  __&lt;br /&gt;
   + + + + +              +     +               __                     /  \&lt;br /&gt;
     +        +       +     +                  /  \                   |~~~~|&lt;br /&gt;
        +       + +      +                    |~~~~|    ______________ \  /&lt;br /&gt;
           +   +      +                        \  /    /            //  ||&lt;br /&gt;
             +      + +                         ||    /  O   -=-   //  /&lt;br /&gt;
         +      +        +                       \  _/  ,_____,   //__/&lt;br /&gt;
      +       +    +        +                     \//    \___/   //\&lt;br /&gt;
    +       +         +        +                   /            // \\&lt;br /&gt;
   + + + + +             + + + + +                /____________//   \\&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
 In 2021, Starlink WiFi basically consisted of router and a dishy cable. That&lt;br /&gt;
 was it. That&#039;s all of Starlink WiFi in 2021. As you can see, I&#039;m a routing&lt;br /&gt;
 machine. And, yeah, I believe in kicking off wireless communication events&lt;br /&gt;
 with mariachi bands. I really like mariachi bands.&lt;br /&gt;
&lt;br /&gt;
  2026.06.18.mr79817                        Router-010000000000000001B57AB5&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
admin@192.168.1.1: Permission denied (publickey,keyboard-interactive).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ports=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nmap -v -A 192.168.1.1&lt;br /&gt;
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-03 16:59 CEST&lt;br /&gt;
NSE: Loaded 157 scripts for scanning.&lt;br /&gt;
NSE: Script Pre-scanning.&lt;br /&gt;
Initiating NSE at 16:59&lt;br /&gt;
Completed NSE at 16:59, 0.00s elapsed&lt;br /&gt;
Initiating NSE at 16:59&lt;br /&gt;
Completed NSE at 16:59, 0.00s elapsed&lt;br /&gt;
Initiating NSE at 16:59&lt;br /&gt;
Completed NSE at 16:59, 0.00s elapsed&lt;br /&gt;
Initiating ARP Ping Scan at 16:59&lt;br /&gt;
Scanning 192.168.1.1 [1 port]&lt;br /&gt;
Completed ARP Ping Scan at 16:59, 0.06s elapsed (1 total hosts)&lt;br /&gt;
Initiating Parallel DNS resolution of 1 host. at 16:59&lt;br /&gt;
Completed Parallel DNS resolution of 1 host. at 16:59, 0.04s elapsed&lt;br /&gt;
Initiating SYN Stealth Scan at 16:59&lt;br /&gt;
Scanning 192.168.1.1 [1000 ports]&lt;br /&gt;
Discovered open port 53/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 80/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 22/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 9002/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 9003/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 9001/tcp on 192.168.1.1&lt;br /&gt;
Discovered open port 9000/tcp on 192.168.1.1&lt;br /&gt;
Completed SYN Stealth Scan at 16:59, 4.75s elapsed (1000 total ports)&lt;br /&gt;
Initiating Service scan at 16:59&lt;br /&gt;
Scanning 7 services on 192.168.1.1&lt;br /&gt;
Completed Service scan at 16:59, 26.18s elapsed (7 services on 1 host)&lt;br /&gt;
Initiating OS detection (try #1) against 192.168.1.1&lt;br /&gt;
Retrying OS detection (try #2) against 192.168.1.1&lt;br /&gt;
NSE: Script scanning 192.168.1.1.&lt;br /&gt;
Initiating NSE at 16:59&lt;br /&gt;
Completed NSE at 17:00, 8.58s elapsed&lt;br /&gt;
Initiating NSE at 17:00&lt;br /&gt;
Completed NSE at 17:00, 0.34s elapsed&lt;br /&gt;
Initiating NSE at 17:00&lt;br /&gt;
Completed NSE at 17:00, 0.00s elapsed&lt;br /&gt;
Nmap scan report for 192.168.1.1&lt;br /&gt;
Host is up (0.00076s latency).&lt;br /&gt;
Not shown: 992 filtered tcp ports (no-response)&lt;br /&gt;
PORT     STATE  SERVICE      VERSION&lt;br /&gt;
22/tcp   open   ssh          OpenSSH 7.4 (protocol 2.0)&lt;br /&gt;
| ssh-hostkey: &lt;br /&gt;
|   2048 c6:25:91:7b:dd:f8:fb:fe:96:af:eb:a3:02:95:2e:bb (RSA)&lt;br /&gt;
|_  384 2c:e3:a4:8c:23:3d:70:67:79:7d:75:24:0f:d2:fb:b2 (ECDSA)&lt;br /&gt;
53/tcp   open   tcpwrapped&lt;br /&gt;
| dns-nsid: &lt;br /&gt;
|   NSID: Go SpaceX! Go Starlink! (476f205370616365582120476f20537461726c696e6b21)&lt;br /&gt;
|   id.server: Go SpaceX! Go Starlink!&lt;br /&gt;
|_  bind.version: 2002-03-14&lt;br /&gt;
80/tcp   open   http         Golang net/http server&lt;br /&gt;
|_http-title: Starlink&lt;br /&gt;
| http-methods: &lt;br /&gt;
|_  Supported Methods: GET HEAD POST&lt;br /&gt;
|_http-favicon: Unknown favicon MD5: D43B9C2E786CF83C5C8E48DC6A22C6FC&lt;br /&gt;
| fingerprint-strings: &lt;br /&gt;
|   FourOhFourRequest, GetRequest: &lt;br /&gt;
|     HTTP/1.0 200 OK&lt;br /&gt;
|     X-Content-Type-Options: nosniff&lt;br /&gt;
|     X-Frame-Options: DENY&lt;br /&gt;
|     Date: Fri, 03 Jul 2026 14:59:36 GMT&lt;br /&gt;
|     Content-Type: text/html; charset=utf-8&lt;br /&gt;
|     &amp;lt;!doctype html&amp;gt;&lt;br /&gt;
|     &amp;lt;html&amp;gt;&lt;br /&gt;
|     &amp;lt;head&amp;gt;&lt;br /&gt;
|     &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
|     &amp;lt;link rel=&amp;quot;shortcut icon&amp;quot; href=&amp;quot;static/favicon.ico&amp;quot;&amp;gt;&lt;br /&gt;
|     &amp;lt;title&amp;gt;Starlink&amp;lt;/title&amp;gt;&lt;br /&gt;
|     &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;static/css/layout.css&amp;quot; media=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
|     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, maximum-scale=1.0, user-scalable=1&amp;quot;&amp;gt;&lt;br /&gt;
|     &amp;lt;style&amp;gt;&lt;br /&gt;
|     .button-link, .button-link:visited {&lt;br /&gt;
|     display: inline-block;&lt;br /&gt;
|     padding: 10px 20px;&lt;br /&gt;
|     font-size: 16px;&lt;br /&gt;
|     color: black;&lt;br /&gt;
|     background-color: white;&lt;br /&gt;
|     text-decoration: none;&lt;br /&gt;
|     border-radius: 5px;&lt;br /&gt;
|     text-align: center;&lt;br /&gt;
|     .button-link:hover {&lt;br /&gt;
|   HTTPOptions: &lt;br /&gt;
|     HTTP/1.0 405 Method Not Allowed&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     X-Content-Type-Options: nosniff&lt;br /&gt;
|     Date: Fri, 03 Jul 2026 14:59:36 GMT&lt;br /&gt;
|     Content-Length: 19&lt;br /&gt;
|     Method not allowed&lt;br /&gt;
|   RTSPRequest: &lt;br /&gt;
|     HTTP/1.1 400 Bad Request&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     Connection: close&lt;br /&gt;
|_    Request&lt;br /&gt;
443/tcp  closed https&lt;br /&gt;
9000/tcp open   grpc&lt;br /&gt;
9001/tcp open   http         Golang net/http server&lt;br /&gt;
|_http-title: Site doesn&#039;t have a title (text/plain; charset=utf-8).&lt;br /&gt;
| fingerprint-strings: &lt;br /&gt;
|   FourOhFourRequest: &lt;br /&gt;
|     HTTP/1.0 500 Internal Server Error&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     X-Content-Type-Options: nosniff&lt;br /&gt;
|     Date: Fri, 03 Jul 2026 14:59:51 GMT&lt;br /&gt;
|     Content-Length: 22&lt;br /&gt;
|     Internal Server Error&lt;br /&gt;
|   GenericLines, Help, LPDString, RTSPRequest, SIPOptions, SSLSessionReq, Socks5: &lt;br /&gt;
|     HTTP/1.1 400 Bad Request&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     Connection: close&lt;br /&gt;
|     Request&lt;br /&gt;
|   GetRequest, HTTPOptions: &lt;br /&gt;
|     HTTP/1.0 500 Internal Server Error&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     X-Content-Type-Options: nosniff&lt;br /&gt;
|     Date: Fri, 03 Jul 2026 14:59:36 GMT&lt;br /&gt;
|     Content-Length: 22&lt;br /&gt;
|     Internal Server Error&lt;br /&gt;
|   OfficeScan: &lt;br /&gt;
|     HTTP/1.1 400 Bad Request: missing required Host header&lt;br /&gt;
|     Content-Type: text/plain; charset=utf-8&lt;br /&gt;
|     Connection: close&lt;br /&gt;
|_    Request: missing required Host header&lt;br /&gt;
| http-methods: &lt;br /&gt;
|_  Supported Methods: POST&lt;br /&gt;
9002/tcp open   ssl/dynamid?&lt;br /&gt;
| ssl-cert: Subject: commonName=Router-010000000000000001B57AB5/organizationName=SpaceX/countryName=US&lt;br /&gt;
| Issuer: commonName=SpaceX Router CA&lt;br /&gt;
| Public Key type: ec&lt;br /&gt;
| Public Key bits: 384&lt;br /&gt;
| Signature Algorithm: ecdsa-with-SHA384&lt;br /&gt;
| Not valid before: 2025-10-12T00:00:00&lt;br /&gt;
| Not valid after:  2045-10-12T00:00:00&lt;br /&gt;
| MD5:   0d98:5c08:8aba:44e1:22ac:b8d1:0501:477e&lt;br /&gt;
|_SHA-1: 0856:39fd:132e:ac24:dda6:57aa:e902:5ae0:c208:0e0b&lt;br /&gt;
9003/tcp open   grpc&lt;br /&gt;
2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :&lt;br /&gt;
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============&lt;br /&gt;
SF-Port80-TCP:V=7.95%I=7%D=7/3%Time=6A47CE58%P=x86_64-suse-linux-gnu%r(Get&lt;br /&gt;
SF:Request,1553,&amp;quot;HTTP/1\.0\x20200\x20OK\r\nX-Content-Type-Options:\x20nosn&lt;br /&gt;
SF:iff\r\nX-Frame-Options:\x20DENY\r\nDate:\x20Fri,\x2003\x20Jul\x202026\x&lt;br /&gt;
SF:2014:59:36\x20GMT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\n\r&lt;br /&gt;
SF:\n&amp;lt;!doctype\x20html&amp;gt;\r\n&amp;lt;html&amp;gt;\r\n&amp;lt;head&amp;gt;\r\n\t&amp;lt;meta\x20http-equiv=\&amp;quot;Con&lt;br /&gt;
SF:tent-Type\&amp;quot;\x20content=\&amp;quot;text/html;\x20charset=utf-8\&amp;quot;\x20/&amp;gt;\r\n\t&amp;lt;link&lt;br /&gt;
SF:\x20rel=\&amp;quot;shortcut\x20icon\&amp;quot;\x20href=\&amp;quot;static/favicon\.ico\&amp;quot;&amp;gt;\r\n\t&amp;lt;tit&lt;br /&gt;
SF:le&amp;gt;Starlink&amp;lt;/title&amp;gt;\r\n\r\n\x20\x20\x20\x20&amp;lt;link\x20rel=\&amp;quot;stylesheet\&amp;quot;\&lt;br /&gt;
SF:x20type=\&amp;quot;text/css\&amp;quot;\x20href=\&amp;quot;static/css/layout\.css\&amp;quot;\x20media=\&amp;quot;scre&lt;br /&gt;
SF:en\&amp;quot;&amp;gt;\r\n\r\n\x20\x20\x20\x20&amp;lt;meta\x20name=\&amp;quot;viewport\&amp;quot;\x20content=\&amp;quot;wi&lt;br /&gt;
SF:dth=device-width,\x20maximum-scale=1\.0,\x20user-scalable=1\&amp;quot;&amp;gt;\r\n\x20\&lt;br /&gt;
SF:x20\x20\x20&amp;lt;style&amp;gt;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\.button-link,\x2&lt;br /&gt;
SF:0\.button-link:visited\x20{\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20&lt;br /&gt;
SF:\x20\x20display:\x20inline-block;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x&lt;br /&gt;
SF:20\x20\x20\x20padding:\x2010px\x2020px;\r\n\x20\x20\x20\x20\x20\x20\x20&lt;br /&gt;
SF:\x20\x20\x20\x20\x20font-size:\x2016px;\r\n\x20\x20\x20\x20\x20\x20\x20&lt;br /&gt;
SF:\x20\x20\x20\x20\x20color:\x20black;\r\n\x20\x20\x20\x20\x20\x20\x20\x2&lt;br /&gt;
SF:0\x20\x20\x20\x20background-color:\x20white;\r\n\x20\x20\x20\x20\x20\x2&lt;br /&gt;
SF:0\x20\x20\x20\x20\x20\x20text-decoration:\x20none;\r\n\x20\x20\x20\x20\&lt;br /&gt;
SF:x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x205px;\r\n\x20\x20\x20\x&lt;br /&gt;
SF:20\x20\x20\x20\x20\x20\x20\x20\x20text-align:\x20center;\r\n\x20\x20\x2&lt;br /&gt;
SF:0\x20\x20\x20\x20\x20}\r\n\r\n\x20\x20\x20\x20\x20\x20\x20\x20\.button-&lt;br /&gt;
SF:link:hover\x20{\r\n\x20\x20\x20\x20\x20\x20\x20\x20&amp;quot;)%r(HTTPOptions,B9,&lt;br /&gt;
SF:&amp;quot;HTTP/1\.0\x20405\x20Method\x20Not\x20Allowed\r\nContent-Type:\x20text/&lt;br /&gt;
SF:plain;\x20charset=utf-8\r\nX-Content-Type-Options:\x20nosniff\r\nDate:\&lt;br /&gt;
SF:x20Fri,\x2003\x20Jul\x202026\x2014:59:36\x20GMT\r\nContent-Length:\x201&lt;br /&gt;
SF:9\r\n\r\nMethod\x20not\x20allowed\n&amp;quot;)%r(RTSPRequest,67,&amp;quot;HTTP/1\.1\x2040&lt;br /&gt;
SF:0\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\&lt;br /&gt;
SF:nConnection:\x20close\r\n\r\n400\x20Bad\x20Request&amp;quot;)%r(FourOhFourReques&lt;br /&gt;
SF:t,1000,&amp;quot;HTTP/1\.0\x20200\x20OK\r\nX-Content-Type-Options:\x20nosniff\r\&lt;br /&gt;
SF:nX-Frame-Options:\x20DENY\r\nDate:\x20Fri,\x2003\x20Jul\x202026\x2014:5&lt;br /&gt;
SF:9:36\x20GMT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\n\r\n&amp;lt;!do&lt;br /&gt;
SF:ctype\x20html&amp;gt;\r\n&amp;lt;html&amp;gt;\r\n&amp;lt;head&amp;gt;\r\n\t&amp;lt;meta\x20http-equiv=\&amp;quot;Content-T&lt;br /&gt;
SF:ype\&amp;quot;\x20content=\&amp;quot;text/html;\x20charset=utf-8\&amp;quot;\x20/&amp;gt;\r\n\t&amp;lt;link\x20re&lt;br /&gt;
SF:l=\&amp;quot;shortcut\x20icon\&amp;quot;\x20href=\&amp;quot;static/favicon\.ico\&amp;quot;&amp;gt;\r\n\t&amp;lt;title&amp;gt;Sta&lt;br /&gt;
SF:rlink&amp;lt;/title&amp;gt;\r\n\r\n\x20\x20\x20\x20&amp;lt;link\x20rel=\&amp;quot;stylesheet\&amp;quot;\x20typ&lt;br /&gt;
SF:e=\&amp;quot;text/css\&amp;quot;\x20href=\&amp;quot;static/css/layout\.css\&amp;quot;\x20media=\&amp;quot;screen\&amp;quot;&amp;gt;\&lt;br /&gt;
SF:r\n\r\n\x20\x20\x20\x20&amp;lt;meta\x20name=\&amp;quot;viewport\&amp;quot;\x20content=\&amp;quot;width=de&lt;br /&gt;
SF:vice-width,\x20maximum-scale=1\.0,\x20user-scalable=1\&amp;quot;&amp;gt;\r\n\x20\x20\x2&lt;br /&gt;
SF:0\x20&amp;lt;style&amp;gt;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\.button-link,\x20\.but&lt;br /&gt;
SF:ton-link:visited\x20{\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x&lt;br /&gt;
SF:20display:\x20inline-block;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20&lt;br /&gt;
SF:\x20\x20padding:\x2010px\x2020px;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x&lt;br /&gt;
SF:20\x20\x20\x20font-size:\x2016px;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x&lt;br /&gt;
SF:20\x20\x20\x20color:\x20black;\r\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\&lt;br /&gt;
SF:x20\x20\x20background-color:\x20white;\r\n\x20\x20\x20\x20\x20\x20\x20\&lt;br /&gt;
SF:x20\x20\x20\x20\x20text-decoration:\x20none;\r\n\x20\x20\x20\x20\x20\x2&lt;br /&gt;
SF:0\x20\x20\x20\x20\x20\x20border-radius:\x205px;\r\n\x20\x20\x20\x20\x20&lt;br /&gt;
SF:\x20\x20\x20\x20\x20\x20\x20text-align:\x20center;\r\n\x20\x20\x20\x20\&lt;br /&gt;
SF:x20\x20\x20\x20}\r\n\r\n\x20\x20\x20\x20\x20\x20\x20\x20\.button-link:h&lt;br /&gt;
SF:over\x20{\r\n\x20\x20\x20\x20\x20\x20\x20\x20&amp;quot;);&lt;br /&gt;
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============&lt;br /&gt;
SF-Port9001-TCP:V=7.95%I=7%D=7/3%Time=6A47CE58%P=x86_64-suse-linux-gnu%r(G&lt;br /&gt;
SF:enericLines,67,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20&lt;br /&gt;
SF:text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\&lt;br /&gt;
SF:x20Request&amp;quot;)%r(GetRequest,BF,&amp;quot;HTTP/1\.0\x20500\x20Internal\x20Server\x2&lt;br /&gt;
SF:0Error\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nX-Content-Ty&lt;br /&gt;
SF:pe-Options:\x20nosniff\r\nDate:\x20Fri,\x2003\x20Jul\x202026\x2014:59:3&lt;br /&gt;
SF:6\x20GMT\r\nContent-Length:\x2022\r\n\r\nInternal\x20Server\x20Error\n&amp;quot;&lt;br /&gt;
SF:)%r(SSLSessionReq,67,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Typ&lt;br /&gt;
SF:e:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n400\x&lt;br /&gt;
SF:20Bad\x20Request&amp;quot;)%r(HTTPOptions,BF,&amp;quot;HTTP/1\.0\x20500\x20Internal\x20Se&lt;br /&gt;
SF:rver\x20Error\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nX-Con&lt;br /&gt;
SF:tent-Type-Options:\x20nosniff\r\nDate:\x20Fri,\x2003\x20Jul\x202026\x20&lt;br /&gt;
SF:14:59:36\x20GMT\r\nContent-Length:\x2022\r\n\r\nInternal\x20Server\x20E&lt;br /&gt;
SF:rror\n&amp;quot;)%r(RTSPRequest,67,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20Request\r\nConten&lt;br /&gt;
SF:t-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close\r\n\r\n&lt;br /&gt;
SF:400\x20Bad\x20Request&amp;quot;)%r(Help,67,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20Request\r&lt;br /&gt;
SF:\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:\x20close&lt;br /&gt;
SF:\r\n\r\n400\x20Bad\x20Request&amp;quot;)%r(FourOhFourRequest,BF,&amp;quot;HTTP/1\.0\x2050&lt;br /&gt;
SF:0\x20Internal\x20Server\x20Error\r\nContent-Type:\x20text/plain;\x20cha&lt;br /&gt;
SF:rset=utf-8\r\nX-Content-Type-Options:\x20nosniff\r\nDate:\x20Fri,\x2003&lt;br /&gt;
SF:\x20Jul\x202026\x2014:59:51\x20GMT\r\nContent-Length:\x2022\r\n\r\nInte&lt;br /&gt;
SF:rnal\x20Server\x20Error\n&amp;quot;)%r(LPDString,67,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20&lt;br /&gt;
SF:Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nConnection:&lt;br /&gt;
SF:\x20close\r\n\r\n400\x20Bad\x20Request&amp;quot;)%r(SIPOptions,67,&amp;quot;HTTP/1\.1\x20&lt;br /&gt;
SF:400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20charset=utf-8\&lt;br /&gt;
SF:r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request&amp;quot;)%r(Socks5,67,&amp;quot;HTT&lt;br /&gt;
SF:P/1\.1\x20400\x20Bad\x20Request\r\nContent-Type:\x20text/plain;\x20char&lt;br /&gt;
SF:set=utf-8\r\nConnection:\x20close\r\n\r\n400\x20Bad\x20Request&amp;quot;)%r(Offi&lt;br /&gt;
SF:ceScan,A3,&amp;quot;HTTP/1\.1\x20400\x20Bad\x20Request:\x20missing\x20required\x&lt;br /&gt;
SF:20Host\x20header\r\nContent-Type:\x20text/plain;\x20charset=utf-8\r\nCo&lt;br /&gt;
SF:nnection:\x20close\r\n\r\n400\x20Bad\x20Request:\x20missing\x20required&lt;br /&gt;
SF:\x20Host\x20header&amp;quot;);&lt;br /&gt;
MAC Address: 74:24:9F:45:7A:B5 (Tibro)&lt;br /&gt;
Aggressive OS guesses: Linux 3.2 - 4.14 (98%), Linux 3.10 - 4.11 (94%), OpenWrt Chaos Calmer 15.05 (Linux 3.18) or Designated Driver (Linux 4.1 or 4.4) (94%), Android 5.1 (94%), Android 6 - 9 (Linux 3.18) (94%), Linux 3.2 - 3.16 (94%), Linux 3.18 (93%), DD-WRT (Linux 3.18) (93%), Linux 4.4 (93%), Android 4 (92%)&lt;br /&gt;
No exact OS matches for host (test conditions non-ideal).&lt;br /&gt;
Uptime guess: 3.511 days (since Tue Jun 30 04:44:28 2026)&lt;br /&gt;
Network Distance: 1 hop&lt;br /&gt;
TCP Sequence Prediction: Difficulty=252 (Good luck!)&lt;br /&gt;
IP ID Sequence Generation: All zeros&lt;br /&gt;
&lt;br /&gt;
TRACEROUTE&lt;br /&gt;
HOP RTT     ADDRESS&lt;br /&gt;
1   0.76 ms 192.168.1.1&lt;br /&gt;
&lt;br /&gt;
NSE: Script Post-scanning.&lt;br /&gt;
Initiating NSE at 17:00&lt;br /&gt;
Completed NSE at 17:00, 0.00s elapsed&lt;br /&gt;
Initiating NSE at 17:00&lt;br /&gt;
Completed NSE at 17:00, 0.00s elapsed&lt;br /&gt;
Initiating NSE at 17:00&lt;br /&gt;
Completed NSE at 17:00, 0.00s elapsed&lt;br /&gt;
Read data files from: /usr/bin/../share/nmap&lt;br /&gt;
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .&lt;br /&gt;
Nmap done: 1 IP address (1 host up) scanned in 43.89 seconds&lt;br /&gt;
           Raw packets sent: 2045 (93.288KB) | Rcvd: 37 (2.244KB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=traceroute=&lt;br /&gt;
&lt;br /&gt;
Route auf die oeffentliche IPV4 der Antenne. Man sieht die Pakete laufen ueber meinen Kabelanschluss raus&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
traceroute 145.224.73.201&lt;br /&gt;
traceroute to 145.224.73.201 (145.224.73.201), 30 hops max, 60 byte packets&lt;br /&gt;
 1  USG-3P (192.168.178.1)  0.426 ms  0.600 ms  0.856 ms&lt;br /&gt;
 2  192.168.1.1 (192.168.1.1)  3.551 ms  4.550 ms  4.628 ms&lt;br /&gt;
 3  ip4d1861d6.fixed.kabel-deutschland.de (77.24.97.214)  16.167 ms  20.308 ms  22.135 ms&lt;br /&gt;
 4  ip5886d836.static.kabel-deutschland.de (88.134.216.54)  18.312 ms  22.198 ms  22.233 ms&lt;br /&gt;
 5  ip5886c1b6.static.kabel-deutschland.de (88.134.193.182)  24.488 ms  26.521 ms  28.066 ms&lt;br /&gt;
 6  145.254.3.170 (145.254.3.170)  29.953 ms  24.044 ms  19.597 ms&lt;br /&gt;
 7  145.254.2.195 (145.254.2.195)  17.266 ms  22.275 ms 145.254.2.15 (145.254.2.15)  25.638 ms&lt;br /&gt;
 8  ae32-100-pcr1.fnt.cw.net (195.2.18.217)  24.221 ms spacex-ic-371295.ip.twelve99-cust.net (62.115.37.21)  23.103 ms ae32-100-pcr1.fnt.cw.net (195.2.18.217)  17.806 ms&lt;br /&gt;
 9  telia-gw.fnt.cw.net (195.2.22.238)  20.614 ms  18.744 ms ae17.pcr1.fnt.cw.net (195.2.20.226)  21.914 ms&lt;br /&gt;
10  telia-gw.fnt.cw.net (195.2.22.238)  21.985 ms spacex-ic-371295.ip.twelve99-cust.net (62.115.37.21)  21.789 ms  23.601 ms&lt;br /&gt;
11  spacex-ic-371295.ip.twelve99-cust.net (62.115.37.21)  23.583 ms  18.059 ms  19.935 ms&lt;br /&gt;
12  * * *&lt;br /&gt;
13  undefined.hostname.localhost (206.224.68.195)  24.057 ms  22.618 ms *&lt;br /&gt;
14  * * *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Telia ist ein großer schwedischer Telekommunikationskonzern. Der internationale Backbone-Bereich hieß früher Telia Carrier; das globale IP-Backbone ist unter AS1299 bekannt. Telia Carrier wurde später als Arelion weitergeführt. Das zeigt ziemlich eindeutig einen Netzübergang/Peering-Punkt zwischen dem Cable-&amp;amp;-Wireless-Backbone und dem damaligen Telia/Twelve99-Backbone in Frankfurt.&lt;br /&gt;
spacex-ic-371295.ip.twelve99-cust.net hat die IP-Adresse 62.115.37.21. Der Name bezeichnet sehr wahrscheinlich einen Interconnect zwischen dem Arelion/Twelve99-Backbone und SpaceX/Starlink.Die Lokalisierung ist sehr wahrscheinlich Frankfurt am Main. Und dann verliert sich die Spur:-(&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Sungo_SXL_MQTT_Anbindung&amp;diff=5198</id>
		<title>Sungo SXL MQTT Anbindung</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Sungo_SXL_MQTT_Anbindung&amp;diff=5198"/>
		<updated>2026-07-31T15:53:25Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Nach einer kleinen Pause (5 Monate) versuche ich die SunGO SXL Anbindung aus dem Versuchstadium zu befreien und mal alles ordentlich zu machen. Die Hardware kommt in eine Gehäuse und die Software soll ihren ersten Stresstest bestehen.&lt;br /&gt;
&lt;br /&gt;
=Ausgangssituation=&lt;br /&gt;
[[Datei:SunGO Raspi Interface roh.jpg|mini]]&lt;br /&gt;
Abgesehen von der SunGo SXL Steuerung sind aktuelle noch ein RasPi 3B, ein CP2102 USBSER und Arduino NANO und 4 DS18B20 im Einsatz.&lt;br /&gt;
Das Netzteil ist nur eine Übergangslösung. Am liebsten wuerde ich eine MiniUSV mit ins Gehaeuse packen. Mal schauen was es da von der Stange gibt.&lt;br /&gt;
Auf dem RasPi laeuft derzeit nur eine Software die die Aufgabe hat die Daten des SunGo-Interfaces und die Temperaturen der 4 DS18B20 (Vor-/Ruecklauf-Heizkreis1 und Vor-/Ruecklauf-Fuszbodenheizung) einzulesen und per MQTT an den FHEM-Broker (MQTT-Server) zu liefern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
Verdammt! Nach 5 Monaten raecht sich die fehlende Dokumentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sungo_MQTT==&lt;br /&gt;
Dieses Programm liest die Daten des Interfaces ueber die USB-Schnittstelle ein und uebergibt sie an die Console und den MQTT-Server. &lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Sungo_MQTT.c&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt; // termios is the API that is in general recommended for serial I/O in Unix.&lt;br /&gt;
#include &amp;quot;MQTTClient.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// MQTT defines&lt;br /&gt;
#define ADDRESS     &amp;quot;tcp://192.168.178.12:1883&amp;quot;&lt;br /&gt;
//#define ADDRESS     &amp;quot;tcp://localhost:1883&amp;quot;&lt;br /&gt;
#define CLIENTID    &amp;quot;SunGo&amp;quot;&lt;br /&gt;
//#define TOPIC       &amp;quot;MQTTExamples&amp;quot;&lt;br /&gt;
//#define PAYLOAD     &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
#define QOS         0&lt;br /&gt;
#define TIMEOUT     10000L&lt;br /&gt;
&lt;br /&gt;
// SERCOM defines&lt;br /&gt;
#define BAUDRATE B115200&lt;br /&gt;
#define MODEMDEVICE &amp;quot;/dev/ttyS1&amp;quot;&lt;br /&gt;
#define _POSIX_SOURCE 1 /* POSIX compliant source */&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
#define TRUE 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// SunGo defines&lt;br /&gt;
#define DUMMY       0&lt;br /&gt;
#define TEMPERATUR  1   // °C&lt;br /&gt;
#define STRAHLUNG   2   // W/m²     &lt;br /&gt;
#define SPEICHER1    7   // kwh&lt;br /&gt;
#define DATUM      8&lt;br /&gt;
#define UHRZEIT     9&lt;br /&gt;
#define PROZENT     10  // %&lt;br /&gt;
#define FUNKTION1   11&lt;br /&gt;
#define FUNKTION2   12&lt;br /&gt;
#define SPEICHER2    15 // h&lt;br /&gt;
#define VOLUMENSTROM 19 // l/min&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
volatile int STOP=FALSE; // braucht man eigentlich nicht Man koennte z.B. um die Endlosschleife elegant zu verlassen durch einen Taster mit ISR die globale Variabe STOP auf true setzen&lt;br /&gt;
// solange das nicht realisiert ist laeuft die &amp;quot;main-Schleife&amp;quot; endlos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// globale Variablen &lt;br /&gt;
char datum[11];&lt;br /&gt;
char uhrzeit[7];&lt;br /&gt;
char temperatur[25];&lt;br /&gt;
char prozent[7];&lt;br /&gt;
char strahlung[8];&lt;br /&gt;
char fehler[17];&lt;br /&gt;
char stunden[8];&lt;br /&gt;
char dummy[7];&lt;br /&gt;
&lt;br /&gt;
// hexadezimale Darstellung in dezimale umstellen&lt;br /&gt;
unsigned int hextodec(char hex[10]){&lt;br /&gt;
  unsigned int decimal=0;&lt;br /&gt;
  unsigned int length=0;&lt;br /&gt;
  unsigned int base = 1;&lt;br /&gt;
  int i=0;&lt;br /&gt;
  &lt;br /&gt;
  while(hex[i]!=&#039;\0&#039;){&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
  length=i;&lt;br /&gt;
&lt;br /&gt;
    //printf(&amp;quot;hextodec %s\n\r&amp;quot;,hex);&lt;br /&gt;
    //printf(&amp;quot;length %d\n\r&amp;quot;,length);&lt;br /&gt;
  &lt;br /&gt;
  for(i = length-1; i &amp;gt;= 0; i--){&lt;br /&gt;
    //printf(&amp;quot;i: %d\n\r&amp;quot;,i); &lt;br /&gt;
    if (i&amp;lt;0)i=0;&lt;br /&gt;
      if(hex[i] &amp;gt;= &#039;0&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;9&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 48) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;A&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;F&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 55) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;f&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 87) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //printf(&amp;quot;decimal %d\n\r&amp;quot;,decimal);&lt;br /&gt;
  return decimal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void delay(int number_of_seconds) // wird doch nicht gebraucht&lt;br /&gt;
{&lt;br /&gt;
    // Converting time into milli_seconds&lt;br /&gt;
    int milli_seconds = 1000 * number_of_seconds;&lt;br /&gt;
  &lt;br /&gt;
    // Storing start time&lt;br /&gt;
    clock_t start_time = clock();&lt;br /&gt;
  &lt;br /&gt;
    // looping till required time is not achieved&lt;br /&gt;
    while (clock() &amp;lt; start_time + milli_seconds)&lt;br /&gt;
        ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// allgemeine Funktion; die verschiedenen Typen werden ueber switch case angesprochen  &lt;br /&gt;
void formatieren(unsigned char typ,unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;   // dient der Aufnahme des zu wandelnden Wertes gebildet aus highbyte und lowbyte&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;     // hilfvariable&lt;br /&gt;
    char formatted[25]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char dataStr[5]=&amp;quot;&amp;quot;;&lt;br /&gt;
    unsigned int dataInteger;&lt;br /&gt;
    float dataFloat;&lt;br /&gt;
    unsigned int dataStunden, dataMinuten;&lt;br /&gt;
&lt;br /&gt;
    //memset(formatted,&#039;\0&#039;,sizeof(formatted));&lt;br /&gt;
    //memset(data,&#039;\0&#039;,sizeof(data)); &lt;br /&gt;
    //memset(tmp,&#039;\0&#039;,sizeof(tmp)); &lt;br /&gt;
    &lt;br /&gt;
    // aus den beiden Einzelwerten wird der &amp;quot;Gesamtwert in der &amp;quot;richtigen&amp;quot; Reihenfolge gebildet&lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
 &lt;br /&gt;
    //printf(&amp;quot;Data: %s\n&amp;quot;,data);&lt;br /&gt;
    &lt;br /&gt;
    dataInteger=hextodec(data);&lt;br /&gt;
 &lt;br /&gt;
   switch(typ) {&lt;br /&gt;
	case DUMMY:         if(TRUE){&lt;br /&gt;
                            strcpy(dummy,data);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(dummy,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
                        } &lt;br /&gt;
                        break;&lt;br /&gt;
    case DATUM:         sprintf(dataStr,&amp;quot;%d&amp;quot;,dataInteger);&lt;br /&gt;
                        strcpy(formatted,&amp;quot;00.00.2021&amp;quot;);&lt;br /&gt;
                        if(strlen(dataStr)==3){&lt;br /&gt;
                            formatted[0]=dataStr[1];  &lt;br /&gt;
                            formatted[1]=dataStr[2]; &lt;br /&gt;
                            formatted[4]=dataStr[0]; &lt;br /&gt;
                            strcpy(datum,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else if(strlen(dataStr)==4){&lt;br /&gt;
                            formatted[0]=dataStr[2];  &lt;br /&gt;
                            formatted[1]=dataStr[3]; &lt;br /&gt;
                            formatted[3]=dataStr[0]; &lt;br /&gt;
                            formatted[4]=dataStr[1]; &lt;br /&gt;
                            strcpy(datum,formatted);&lt;br /&gt;
                        }   &lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(datum,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break;&lt;br /&gt;
	case UHRZEIT:       dataStunden=(unsigned int)dataInteger/60;&lt;br /&gt;
                        dataMinuten=dataInteger-(dataStunden*60);&lt;br /&gt;
                        if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen &lt;br /&gt;
                            sprintf(formatted,&amp;quot;%02d:%02d&amp;quot;,dataStunden,dataMinuten);&lt;br /&gt;
                            strcpy(uhrzeit,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(uhrzeit,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break;&lt;br /&gt;
    case TEMPERATUR:   dataFloat=(float)dataInteger/10.0;&lt;br /&gt;
                        if(TRUE){&lt;br /&gt;
                            //sprintf(formatted,&amp;quot;%5.1f °C (%d)     &amp;quot;,dataFloat,dataInteger);&lt;br /&gt;
                            sprintf(formatted,&amp;quot;%5.1f °C&amp;quot;,dataFloat);&lt;br /&gt;
                            strcpy(temperatur,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(temperatur,&amp;quot;Error!\0&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break;&lt;br /&gt;
    case SPEICHER2:     if(TRUE){&lt;br /&gt;
                            sprintf(formatted,&amp;quot;%dh&amp;quot;,dataInteger);&lt;br /&gt;
                            strcpy(stunden,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(stunden,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break;&lt;br /&gt;
    case PROZENT:       if(TRUE){&lt;br /&gt;
                            sprintf(formatted,&amp;quot;%3d%%&amp;quot;,dataInteger);&lt;br /&gt;
                            strcpy(prozent,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(prozent,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break;     &lt;br /&gt;
    case STRAHLUNG:     if(TRUE){&lt;br /&gt;
                            sprintf(formatted,&amp;quot;%d W/m²    &amp;quot;,dataInteger);&lt;br /&gt;
                            strcpy(strahlung,formatted);&lt;br /&gt;
                        }&lt;br /&gt;
                        else{&lt;br /&gt;
                            strcpy(strahlung,&amp;quot;Error!\0&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        break; &lt;br /&gt;
	default:            printf(&amp;quot;Type Error (unknown)\n&amp;quot;); break;&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
     return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{   int i;                                  // Schleifenzaehler allgemein&lt;br /&gt;
    unsigned int state=0, syncstate=0;      // state 10,20,30 oder 31 entsprechend 0100, 0200, 0300, 0301&lt;br /&gt;
    unsigned int dsIndex, dfIndex;          // Zeiger auf Datensatz und Datenfeld&lt;br /&gt;
    unsigned long zeitzaehler=0;            // Ausgabe verlangsamen 500000 etwa 1 Minute&lt;br /&gt;
   &lt;br /&gt;
    unsigned char buf[1];&lt;br /&gt;
    unsigned char merker[6];&lt;br /&gt;
    unsigned char datensatz[100];&lt;br /&gt;
    unsigned char datenfeld[100];&lt;br /&gt;
    unsigned char datenfelder[50][16];&lt;br /&gt;
    bool printflag;&lt;br /&gt;
&lt;br /&gt;
    // MQTT Vorbereitung&lt;br /&gt;
    MQTTClient client;&lt;br /&gt;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;&lt;br /&gt;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;&lt;br /&gt;
    MQTTClient_deliveryToken token;&lt;br /&gt;
    int mqttrc;                             // &lt;br /&gt;
    char topic[255];                        // zur Aufnahme Werte unterhalb des basetopic&lt;br /&gt;
    char *basetopic = &amp;quot;Haus/Heizung/Solaranlage/SunGo/&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    // MQTT Cleint Struktur anlegen&lt;br /&gt;
    if ((mqttrc = MQTTClient_create(&amp;amp;client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
         printf(&amp;quot;Failed to create mqttclient, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
         exit(EXIT_FAILURE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   // SerCOM Vorbereitung&lt;br /&gt;
    struct termios oldtio,newtio;&lt;br /&gt;
    int fd; // FileDescriptor SerCOM&lt;br /&gt;
    int res; // SerCOM Einlesekontrolle&lt;br /&gt;
    &lt;br /&gt;
    // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nimm diese sonst versuche default&lt;br /&gt;
    if (argc &amp;gt; 1)&lt;br /&gt;
        fd = open(argv[1], O_RDWR | O_NOCTTY );&lt;br /&gt;
    else&lt;br /&gt;
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );&lt;br /&gt;
    if (fd &amp;lt;0) {&lt;br /&gt;
        perror(MODEMDEVICE); &lt;br /&gt;
        exit(-1); &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // sichere die aktuellen Einstellungen&lt;br /&gt;
    tcgetattr(fd,&amp;amp;oldtio); &lt;br /&gt;
    &lt;br /&gt;
    // baue die neuen Einstellungen zusammen&lt;br /&gt;
    bzero(&amp;amp;newtio, sizeof(newtio));&lt;br /&gt;
    newtio.c_cflag = BAUDRATE |  CS8 | CLOCAL | CREAD;&lt;br /&gt;
    newtio.c_iflag = IGNPAR | IXON | IXOFF;&lt;br /&gt;
    newtio.c_oflag = 0;&lt;br /&gt;
    newtio.c_lflag = 0; &lt;br /&gt;
    newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */&lt;br /&gt;
    newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */&lt;br /&gt;
&lt;br /&gt;
    tcflush(fd, TCIFLUSH);&lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;newtio);&lt;br /&gt;
   &lt;br /&gt;
    setvbuf(stdout, (char *)NULL, _IONBF, 0);&lt;br /&gt;
    &lt;br /&gt;
    // hier sind alle Vorbereitungen (SERCOM, MQTT) abgeschlossen jetzt koennen die Daten des Interfaces eingelesen, aufbereitet und per MQTT gesendet werden&lt;br /&gt;
    // Die 4 verschiedenen denkbaren Pakete (DPA_1, DPA_2, DPB_1, DPB_2) beginnen alle mit AA 55 55 AA (DEZ: 170 85 85 170)&lt;br /&gt;
    // wenn diese Folge erkannt wird bestimmen die beiden folgenden Bytes den Typ des Paketes&lt;br /&gt;
    while (STOP==FALSE) {   // Endlosschleife &lt;br /&gt;
 &lt;br /&gt;
         res = read(fd,buf,1);   &lt;br /&gt;
  &lt;br /&gt;
        //sobald ein AA kommt beginne die Beobachtung&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            syncstate=0;&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==0)){  // wenn der syncstate 0 (gleich Anfang) und ein AA erkannt wird dann setze sysncstate=1&lt;br /&gt;
            syncstate=1;&lt;br /&gt;
            merker[0]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==85) &amp;amp;&amp;amp; (syncstate==1)){    // wenn der syncstate 1 (AA bereits erkannt) und ein 55 erkannt wird dann setze sysncstate=2&lt;br /&gt;
            syncstate=2;&lt;br /&gt;
            merker[1]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==85) &amp;amp;&amp;amp; (syncstate==2)){    // wenn der syncstate 2 (AA 55 bereits erkannt) und ein 55 erkannt wird dann setze sysncstate=3&lt;br /&gt;
            syncstate=3;&lt;br /&gt;
            merker[2]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==3)){    // wenn der syncstate 3 (AA 55 55 bereits erkannt) und ein AA erkannt wird dann setze sysncstate=4&lt;br /&gt;
            syncstate=4;&lt;br /&gt;
            merker[3]=buf[0];&lt;br /&gt;
            state=0;&lt;br /&gt;
        }&lt;br /&gt;
        // wenn AA 55 55 AA erkannt wurde steht syncstate auf 4 , in merker[0-3] befindet sich die Syncfolge und state ist 0&lt;br /&gt;
        // wenn das nachfolgende Byte entweder 01 02 oder 03 ist ist alles wie erwartet und kann weitergehen syncstate = 5&lt;br /&gt;
        if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==4)){&lt;br /&gt;
            merker[4]=buf[0];&lt;br /&gt;
            syncstate=5;&lt;br /&gt;
        }   &lt;br /&gt;
        // ab hier werden die 4 Pakete unterschieden DPA_1 0200 (state 20), DPA_2 0100 (state 10), DPB_1 0301 (state 31) und DPB_2 0300 (state 30)&lt;br /&gt;
 &lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==1) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=10; // state 10 bereit fuer 0100  Daten fuer das LC-Display&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==2) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=20; // state 20 bereit fuer 0200 hat keinen (?) Inhalt -&amp;gt; keine Auswertung &lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
     &lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==3) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=30; // state 30 bereit fuer 0300 Datensatze&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            dsIndex=0;&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==1) &amp;amp;&amp;amp; (merker[4]==3) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=31; // state 31 bereit fuer 0301 Datenfaelder&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            dfIndex=0;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        // state 10 und 20 werden nicht ausgewertet        &lt;br /&gt;
        if ((state==10) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==20) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
 &lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==30)  &amp;amp;&amp;amp; printflag){&lt;br /&gt;
 &lt;br /&gt;
            if(dsIndex&amp;lt;100)datensatz[dsIndex++]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==31) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
 &lt;br /&gt;
            if(dfIndex&amp;lt;100)datenfeld[dfIndex++]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
         //printf(&amp;quot;syncstate: %d, state: %d, %X\n\r&amp;quot;,syncstate,state,buf[0]);   &lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printflag=TRUE;&lt;br /&gt;
 &lt;br /&gt;
        if (zeitzaehler==10000){&lt;br /&gt;
            // es wird etwa 3 mal pro Minute eine Auswahl der Datensaetze ausgegeben&lt;br /&gt;
            // Datum: 18.09.2021&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Uhrzeit: 12:17&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Kollektor:  58.6 °C&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Speicher unten:  49.2 °C&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Speicher oben:  52.1 °C&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Rücklaufanhebung T7:  52.0 °C&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Rücklaufanhebung T8:  28.1 °C&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Ausgang 1:  60%&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Ausgang 6: 100%&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
            // Speicher 2: 15632h&lt;br /&gt;
            // Message published, return code 0&lt;br /&gt;
&lt;br /&gt;
            conn_opts.keepAliveInterval = 20;&lt;br /&gt;
            conn_opts.cleansession = 1;&lt;br /&gt;
            // Baue MQTT Verbindung auf&lt;br /&gt;
            if ((mqttrc = MQTTClient_connect(client, &amp;amp;conn_opts)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to connect, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }&lt;br /&gt;
            //Datum&lt;br /&gt;
            formatieren(DATUM,datensatz[2],datensatz[3]);&lt;br /&gt;
            printf(&amp;quot;Datum: %s\n&amp;quot;,datum); &lt;br /&gt;
            strcpy(topic,basetopic);&lt;br /&gt;
            strcat(topic,&amp;quot;Datum&amp;quot;);&lt;br /&gt;
            pubmsg.payload = datum;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(datum);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }  &lt;br /&gt;
            //Uhrzeit&lt;br /&gt;
            formatieren(UHRZEIT,datensatz[4],datensatz[5]);&lt;br /&gt;
            printf(&amp;quot;Uhrzeit: %s\n&amp;quot;,uhrzeit);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Uhrzeit&amp;quot;);            &lt;br /&gt;
            pubmsg.payload = uhrzeit;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(uhrzeit);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            } &lt;br /&gt;
            //Kollektor&lt;br /&gt;
            formatieren(TEMPERATUR,datensatz[6],datensatz[7]);&lt;br /&gt;
            printf(&amp;quot;Kollektor: %s\n&amp;quot;,temperatur);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Kollektor/Temperatur&amp;quot;);&lt;br /&gt;
            pubmsg.payload = temperatur;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(temperatur);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }&lt;br /&gt;
             //Speicher unten&lt;br /&gt;
            formatieren(TEMPERATUR,datensatz[8],datensatz[9]);&lt;br /&gt;
            printf(&amp;quot;Speicher unten: %s\n&amp;quot;,temperatur);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Speicher/unten/Temperatur&amp;quot;);&lt;br /&gt;
            pubmsg.payload = temperatur;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(temperatur);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }&lt;br /&gt;
            //Speicher oben&lt;br /&gt;
            formatieren(TEMPERATUR,datensatz[10],datensatz[11]);&lt;br /&gt;
            printf(&amp;quot;Speicher oben: %s\n&amp;quot;,temperatur);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Speicher/oben/Temperatur&amp;quot;);&lt;br /&gt;
            pubmsg.payload = temperatur;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(temperatur);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            } &lt;br /&gt;
            //Rücklaufanhebung T7&lt;br /&gt;
            formatieren(TEMPERATUR,datensatz[18],datensatz[19]);&lt;br /&gt;
            printf(&amp;quot;Rücklaufanhebung T7: %s\n&amp;quot;,temperatur);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Rücklaufanhebung/T7/Temperatur&amp;quot;);&lt;br /&gt;
            pubmsg.payload = temperatur;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(temperatur);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }              &lt;br /&gt;
            //Rücklaufanhebung T8&lt;br /&gt;
            formatieren(TEMPERATUR,datensatz[20],datensatz[21]);&lt;br /&gt;
            printf(&amp;quot;Rücklaufanhebung T8: %s\n&amp;quot;,temperatur);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Rücklaufanhebung/T8/Temperatur&amp;quot;);&lt;br /&gt;
            pubmsg.payload = temperatur;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(temperatur);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            } &lt;br /&gt;
           //Ausgang 1&lt;br /&gt;
            formatieren(PROZENT,datensatz[32],0);&lt;br /&gt;
            printf(&amp;quot;Ausgang 1: %s\n&amp;quot;,prozent);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Ausgang/1/Prozent&amp;quot;);&lt;br /&gt;
            pubmsg.payload = prozent;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(prozent);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }  &lt;br /&gt;
           //Ausgang 6&lt;br /&gt;
            formatieren(PROZENT,datensatz[37],0);&lt;br /&gt;
            printf(&amp;quot;Ausgang 6: %s\n&amp;quot;,prozent);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Ausgang/6/Prozent&amp;quot;);&lt;br /&gt;
            pubmsg.payload = prozent;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(prozent);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }  &lt;br /&gt;
            // Speicherstunden&lt;br /&gt;
            formatieren(SPEICHER2,datensatz[50],datensatz[51]);&lt;br /&gt;
            printf(&amp;quot;Speicher 2: %s\n&amp;quot;,stunden);&lt;br /&gt;
            strcpy(topic,basetopic);            &lt;br /&gt;
            strcat(topic,&amp;quot;Speicher/Stunden&amp;quot;);&lt;br /&gt;
            pubmsg.payload = stunden;&lt;br /&gt;
            pubmsg.payloadlen = (int)strlen(stunden);&lt;br /&gt;
            pubmsg.qos = QOS;&lt;br /&gt;
            pubmsg.retained = 0;&lt;br /&gt;
            if ((mqttrc = MQTTClient_publishMessage(client, topic, &amp;amp;pubmsg, &amp;amp;token)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to publish message, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
                exit(EXIT_FAILURE);&lt;br /&gt;
            }else{&lt;br /&gt;
                printf(&amp;quot;Message published, return code %d\n&amp;quot;, mqttrc); &lt;br /&gt;
            }  &lt;br /&gt;
    /*    printf(&amp;quot;Waiting for up to %d seconds for publication of %s\n&amp;quot;&lt;br /&gt;
                &amp;quot;on topic %s for client with ClientID: %s\n&amp;quot;,&lt;br /&gt;
                (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);&lt;br /&gt;
        rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);&lt;br /&gt;
        printf(&amp;quot;Message with delivery token %d delivered\n&amp;quot;, token);&lt;br /&gt;
    */&lt;br /&gt;
            if ((mqttrc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS){&lt;br /&gt;
                printf(&amp;quot;Failed to disconnect, return code %d\n&amp;quot;, mqttrc);&lt;br /&gt;
            }&lt;br /&gt;
            zeitzaehler=0;&lt;br /&gt;
        }&lt;br /&gt;
        zeitzaehler++;&lt;br /&gt;
        if (zeitzaehler%100000==0)printf(&amp;quot;%d\n&amp;quot;,zeitzaehler); // Lebenszeichen&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    close(fd);                      // schliesze serielle Schnittstelle&lt;br /&gt;
    &lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;oldtio);  // stelle die alte ComConfig wieder her&lt;br /&gt;
   &lt;br /&gt;
    MQTTClient_destroy(&amp;amp;client);    // beende die MQTT Kommunikation&lt;br /&gt;
    &lt;br /&gt;
    return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sungoauswertungcurses==&lt;br /&gt;
Dieses Programm dient erst mal nur dem Einlesen und Interpretieren der Daten vom Interface. Sie werden nach der Aufbereitung geordnet und auf der Console mittels curses ausgegeben. In diesem Programm sind noch die alten Varianten der Konvertierungsfunktionen vorhanden.&lt;br /&gt;
Dies ist zwar nicht elegant, aber es funktioniert.&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Sungoauswertungcurses.c&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt; // termios is the API that is in general recommended for serial I/O in Unix.&lt;br /&gt;
#include &amp;lt;curses.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUDRATE B115200&lt;br /&gt;
#define MODEMDEVICE &amp;quot;/dev/ttyS1&amp;quot;&lt;br /&gt;
#define _POSIX_SOURCE 1 /* POSIX compliant source */&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
#define TRUE 1&lt;br /&gt;
&lt;br /&gt;
volatile int STOP=FALSE;&lt;br /&gt;
&lt;br /&gt;
char datum[11];&lt;br /&gt;
char uhrzeit[7];&lt;br /&gt;
char temperatur[25];&lt;br /&gt;
char prozent[7];&lt;br /&gt;
char fehler[17];&lt;br /&gt;
char stunden[8];&lt;br /&gt;
char dummy[7];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unsigned int hextodec(char hex[10]){&lt;br /&gt;
  unsigned int decimal=0;&lt;br /&gt;
  unsigned int length=0;&lt;br /&gt;
  unsigned int base = 1;&lt;br /&gt;
  int i=0;&lt;br /&gt;
  &lt;br /&gt;
  while(hex[i]!=&#039;\0&#039;){&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
  length=i;&lt;br /&gt;
&lt;br /&gt;
    //printf(&amp;quot;hextodec %s\n\r&amp;quot;,hex);&lt;br /&gt;
    //printf(&amp;quot;length %d\n\r&amp;quot;,length);&lt;br /&gt;
  &lt;br /&gt;
  for(i = length-1; i &amp;gt;= 0; i--){&lt;br /&gt;
    //printf(&amp;quot;i: %d\n\r&amp;quot;,i); &lt;br /&gt;
    if (i&amp;lt;0)i=0;&lt;br /&gt;
      if(hex[i] &amp;gt;= &#039;0&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;9&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 48) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;A&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;F&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 55) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;f&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 87) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //printf(&amp;quot;decimal %d\n\r&amp;quot;,decimal);&lt;br /&gt;
  return decimal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void datumformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char datumStr_formatted[]=&amp;quot;00.00.2021&amp;quot;;&lt;br /&gt;
    char datumStr[5]=&amp;quot;&amp;quot;;&lt;br /&gt;
    unsigned int datumInt;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;0135&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    datumInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,datumInt);&lt;br /&gt;
    sprintf(datumStr,&amp;quot;%d&amp;quot;,datumInt);&lt;br /&gt;
    if(strlen(datumStr)==3){&lt;br /&gt;
        datumStr_formatted[0]=datumStr[1];  &lt;br /&gt;
        datumStr_formatted[1]=datumStr[2]; &lt;br /&gt;
        datumStr_formatted[4]=datumStr[0]; &lt;br /&gt;
        strcpy(datum,datumStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else if(strlen(datumStr)==4){&lt;br /&gt;
        datumStr_formatted[0]=datumStr[2];  &lt;br /&gt;
        datumStr_formatted[1]=datumStr[3]; &lt;br /&gt;
        datumStr_formatted[3]=datumStr[0]; &lt;br /&gt;
        datumStr_formatted[4]=datumStr[1]; &lt;br /&gt;
        strcpy(datum,datumStr_formatted);&lt;br /&gt;
    }   &lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(datum,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char uhrzeitStr_formatted[]=&amp;quot;00:00&amp;quot;;&lt;br /&gt;
    unsigned int uhrzeitInt, stunden, minuten;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    uhrzeitInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,uhrzeitInt);&lt;br /&gt;
    stunden=(unsigned int)uhrzeitInt/60;&lt;br /&gt;
    minuten=uhrzeitInt-(stunden*60);&lt;br /&gt;
    if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen &lt;br /&gt;
        sprintf(uhrzeitStr_formatted,&amp;quot;%02d:%02d&amp;quot;,stunden,minuten);&lt;br /&gt;
        strcpy(uhrzeit,uhrzeitStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(uhrzeit,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char temperaturStr_formatted[20]=&amp;quot;&amp;quot;;&lt;br /&gt;
    unsigned int temperaturInt;&lt;br /&gt;
    float temperaturFloat;&lt;br /&gt;
    size_t l;&lt;br /&gt;
 &lt;br /&gt;
    memset(data,&#039;\0&#039;,sizeof(data)); &lt;br /&gt;
    memset(tmp,&#039;\0&#039;,sizeof(tmp)); &lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%02X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    //strcpy(data,&amp;quot;0500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    temperaturInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,temperaturInt);&lt;br /&gt;
    temperaturFloat=(float)temperaturInt/10.0;&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        memset(temperaturStr_formatted,&#039;\0&#039;,sizeof(temperaturStr_formatted));&lt;br /&gt;
        sprintf(temperaturStr_formatted,&amp;quot;%5.1f °C (%d)     &amp;quot;,temperaturFloat,temperaturInt);&lt;br /&gt;
        strcpy(temperatur,temperaturStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(temperatur,&amp;quot;Error!\0&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void prozentformatieren(unsigned char byte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char prozentStr_formatted[]=&amp;quot;000%&amp;quot;;&lt;br /&gt;
    unsigned int prozentInt;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,byte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    prozentInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,prozentInt);&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(prozentStr_formatted,&amp;quot;%3d%%&amp;quot;,prozentInt);&lt;br /&gt;
        strcpy(prozent,prozentStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(prozent,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char stundenStr_formatted[]=&amp;quot;000000h&amp;quot;;&lt;br /&gt;
    unsigned int stundenInt;&lt;br /&gt;
      &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    stundenInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,temperaturInt);&lt;br /&gt;
     &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(stundenStr_formatted,&amp;quot;%dh&amp;quot;,stundenInt);&lt;br /&gt;
        strcpy(stunden,stundenStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(stunden,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char fehlerStr_formatted[9];&lt;br /&gt;
    unsigned int fehlerInt;&lt;br /&gt;
&lt;br /&gt;
    fehlerInt=12345;&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(fehlerStr_formatted,&amp;quot;%d&amp;quot;,fehlerInt);&lt;br /&gt;
        strcpy(fehler,fehlerStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(fehler,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
     &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
         strcpy(dummy,data);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(dummy,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    struct termios oldtio,newtio;&lt;br /&gt;
    &lt;br /&gt;
    int fd;&lt;br /&gt;
    int c;&lt;br /&gt;
    int res;&lt;br /&gt;
    int i,k,l;&lt;br /&gt;
    unsigned int x,y,z,t1,t2,t3,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;&lt;br /&gt;
    unsigned int state=0, syncstate=0;&lt;br /&gt;
   &lt;br /&gt;
    unsigned char buf[1];&lt;br /&gt;
    unsigned char merker[6];&lt;br /&gt;
    unsigned char datensatz[200];&lt;br /&gt;
    unsigned char datenfeld[100];&lt;br /&gt;
    unsigned char datenfelder[50][16];&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    bool printflag;&lt;br /&gt;
    &lt;br /&gt;
    memset(temperatur, &#039;\0&#039;, sizeof(temperatur));&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default&lt;br /&gt;
    if (argc &amp;gt; 1)&lt;br /&gt;
        fd = open(argv[1], O_RDWR | O_NOCTTY );&lt;br /&gt;
    else&lt;br /&gt;
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );&lt;br /&gt;
    if (fd &amp;lt;0) {&lt;br /&gt;
        perror(MODEMDEVICE); &lt;br /&gt;
        exit(-1); &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // sichere die aktuellen Einstellungen&lt;br /&gt;
    tcgetattr(fd,&amp;amp;oldtio); &lt;br /&gt;
    &lt;br /&gt;
    // baue die neuen Einstellungen zusammen&lt;br /&gt;
    bzero(&amp;amp;newtio, sizeof(newtio));&lt;br /&gt;
    newtio.c_cflag = BAUDRATE |  CS8 | CLOCAL | CREAD;&lt;br /&gt;
    newtio.c_iflag = IGNPAR | IXON | IXOFF;&lt;br /&gt;
    newtio.c_oflag = 0;&lt;br /&gt;
    newtio.c_lflag = 0; &lt;br /&gt;
    newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */&lt;br /&gt;
    newtio.c_cc[VMIN]     = 5;   /* blocking read until 5 chars received */&lt;br /&gt;
&lt;br /&gt;
    tcflush(fd, TCIFLUSH);&lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;newtio);&lt;br /&gt;
   &lt;br /&gt;
    setvbuf(stdout, (char *)NULL, _IONBF, 0);&lt;br /&gt;
    &lt;br /&gt;
    initscr();&lt;br /&gt;
    getmaxyx(stdscr,x,y);&lt;br /&gt;
    printf(&amp;quot;X:%d/Y:%d\n&amp;quot;,x,y);&lt;br /&gt;
    while (STOP==FALSE) {       /* loop for input */&lt;br /&gt;
        res = read(fd,buf,1);   /* returns after 5 chars have been input */&lt;br /&gt;
        //printf(&amp;quot;A: syncstate: %d, state: %d, %X\n\r&amp;quot;,syncstate,state,buf[0]); &lt;br /&gt;
 &lt;br /&gt;
        //sobald ein AA kommt beginne die Beobachtung&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            syncstate=0;&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==0)){&lt;br /&gt;
            syncstate=1;&lt;br /&gt;
            merker[0]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==85) &amp;amp;&amp;amp; (syncstate==1)){&lt;br /&gt;
            syncstate=2;&lt;br /&gt;
            merker[1]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==85) &amp;amp;&amp;amp; (syncstate==2)){&lt;br /&gt;
            syncstate=3;&lt;br /&gt;
            merker[2]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==170) &amp;amp;&amp;amp; (syncstate==3)){&lt;br /&gt;
            syncstate=4;&lt;br /&gt;
            merker[3]=buf[0];&lt;br /&gt;
            state=0;&lt;br /&gt;
        }&lt;br /&gt;
        if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==4)){&lt;br /&gt;
            merker[4]=buf[0];&lt;br /&gt;
            syncstate=5;&lt;br /&gt;
        }   &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==1) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=10; // state 10 bereit fuer 0100&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            x=1;&lt;br /&gt;
            y=8;&lt;br /&gt;
            stelle=0;&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==2) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=20; // state 10 bereit fuer 0100&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            x=2;&lt;br /&gt;
            y=8;  &lt;br /&gt;
            stelle=0;            &lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==0) &amp;amp;&amp;amp; (merker[4]==3) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=30; // state 10 bereit fuer 0100&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            dsIndex=0;&lt;br /&gt;
            x=3;&lt;br /&gt;
            y=8;     &lt;br /&gt;
            stelle=0;&lt;br /&gt;
        }&lt;br /&gt;
        if ((buf[0]==1) &amp;amp;&amp;amp; (merker[4]==3) &amp;amp;&amp;amp; (merker[0]==170) &amp;amp;&amp;amp; (merker[1]==85) &amp;amp;&amp;amp; (merker[2]==85) &amp;amp;&amp;amp; (merker[3]==170) &amp;amp;&amp;amp; (syncstate==5)){&lt;br /&gt;
            state=31; // state 10 bereit fuer 0100&lt;br /&gt;
            printflag=FALSE;&lt;br /&gt;
            for(i=0;i&amp;lt;5;i++)merker[i]=0;&lt;br /&gt;
            dfIndex=0;&lt;br /&gt;
            x=4;&lt;br /&gt;
            y=8;&lt;br /&gt;
            stelle=0;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        zeilenproblock=3;&lt;br /&gt;
                &lt;br /&gt;
        if ((state==10) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
            z=(x-1)*zeilenproblock+x;&lt;br /&gt;
            mvprintw(z,1,&amp;quot;0100:&amp;quot;);&lt;br /&gt;
            mvaddch(z,y,buf[0]);&lt;br /&gt;
            mvprintw(z+1,y,&amp;quot;%02X &amp;quot;,buf[0]);&lt;br /&gt;
            mvprintw(z+2,y,&amp;quot;%d &amp;quot;,stelle);&lt;br /&gt;
            y+=3;&lt;br /&gt;
            stelle++;&lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==20) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
            z=(x-1)*zeilenproblock+x;&lt;br /&gt;
            mvprintw(z,1,&amp;quot;0200:&amp;quot;);&lt;br /&gt;
            mvaddch(z,y,buf[0]);&lt;br /&gt;
            mvprintw(z+1,y,&amp;quot;%02X &amp;quot;,buf[0]);&lt;br /&gt;
            mvprintw(z+2,y,&amp;quot;%d &amp;quot;,stelle);&lt;br /&gt;
            y+=3;&lt;br /&gt;
            stelle++;&lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==30)  &amp;amp;&amp;amp; printflag){&lt;br /&gt;
            z=(x-1)*zeilenproblock+x;&lt;br /&gt;
            mvprintw(z,1,&amp;quot;0300:&amp;quot;);&lt;br /&gt;
            mvaddch(z,y,buf[0]);&lt;br /&gt;
            mvprintw(z+1,y,&amp;quot;%02X &amp;quot;,buf[0]);            &lt;br /&gt;
            mvprintw(z+2,y,&amp;quot;%d &amp;quot;,stelle);&lt;br /&gt;
            y+=3;&lt;br /&gt;
            stelle++;&lt;br /&gt;
            if(dsIndex&amp;lt;100)datensatz[dsIndex++]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        else if ((state==31) &amp;amp;&amp;amp; printflag) {&lt;br /&gt;
            z=(x-1)*zeilenproblock+x;            &lt;br /&gt;
            mvprintw(z,1,&amp;quot;0301:&amp;quot;);&lt;br /&gt;
            mvaddch(z,y,buf[0]);&lt;br /&gt;
            mvprintw(z+1,y,&amp;quot;%02X &amp;quot;,buf[0]);            &lt;br /&gt;
            mvprintw(z+2,y,&amp;quot;%d &amp;quot;,stelle);&lt;br /&gt;
            y+=3;&lt;br /&gt;
            stelle++;&lt;br /&gt;
            if(dfIndex&amp;lt;100)datenfeld[dfIndex++]=buf[0];&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
         //printf(&amp;quot;syncstate: %d, state: %d, %X\n\r&amp;quot;,syncstate,state,buf[0]);   &lt;br /&gt;
        }&lt;br /&gt;
        //mvprintw(5,1,&amp;quot;Test&amp;quot;);&lt;br /&gt;
        printflag=TRUE;&lt;br /&gt;
        refresh();&lt;br /&gt;
        //printf(&amp;quot;E: syncstate: %d, state: %d, %X\n\r&amp;quot;,syncstate,state,buf[0]); &lt;br /&gt;
        //if (buf[0]==&#039;z&#039;) STOP=TRUE;&lt;br /&gt;
        //x max = 4&lt;br /&gt;
        z=20;&lt;br /&gt;
        t1=35;&lt;br /&gt;
        t2=t1+30;&lt;br /&gt;
        sort1=0;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Datum: (2,3)&amp;quot;);&lt;br /&gt;
        datumformatieren(datensatz[2],datensatz[3]);&lt;br /&gt;
        //printf(&amp;quot;datum: %s&amp;quot;,datum);&lt;br /&gt;
        mvprintw(z+sort1,t1,datum);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[2],datensatz[3]);  &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Uhrzeit: (4,5)&amp;quot;);&lt;br /&gt;
        uhrzeitformatieren(datensatz[4],datensatz[5]);&lt;br /&gt;
        //printf(&amp;quot;uhrzeit: %s&amp;quot;,uhrzeit);&lt;br /&gt;
        mvprintw(z+sort1,t1,uhrzeit);  &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[4],datensatz[5]);  &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Kollektor: (6,7)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[6],datensatz[7]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[6],datensatz[7]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Speicher unten: (8,9)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[8],datensatz[9]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[8],datensatz[9]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Speicher oben: (10,11)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[10],datensatz[11]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[10],datensatz[11]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Thermostat: (12,13)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[12],datensatz[13]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur);  &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[12],datensatz[13]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Poolschutz: (14,15)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[14],datensatz[15]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[14],datensatz[15]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ertrag: (16,17)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[16],datensatz[17]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[16],datensatz[17]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ruecklaufanhebung T7: (18,19)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[18],datensatz[19]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[18],datensatz[19]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ruecklaufanhebung T8: (20,21)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[20],datensatz[21]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[20],datensatz[21]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;T: (22,23)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[22],datensatz[23]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,&amp;quot;%s&amp;quot;,temperatur); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[22],datensatz[23]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (24,25)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[24],datensatz[25]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[24],datensatz[25]);         &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Strahlung: (26,27)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[26],datensatz[27]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[26],datensatz[27]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (28,29)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[28],datensatz[29]);&lt;br /&gt;
         //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);  &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[28],datensatz[29]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (30,31)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[30],datensatz[31]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);   &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[30],datensatz[31]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 1: (32)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[32]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);  &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[32]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 2: (33)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[33]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);  &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[33]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 3: (34)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[34]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);   &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[34]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 4: (35)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[35]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[35]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 5: (36)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[36]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[36]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Ausgang 6: (37)&amp;quot;);&lt;br /&gt;
        prozentformatieren(datensatz[37]);&lt;br /&gt;
        //printf(&amp;quot;prozent: %s&amp;quot;,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t1,prozent);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X&amp;quot;,datensatz[37]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Fehler: (38-45)&amp;quot;);&lt;br /&gt;
        fehlerformatieren(datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);&lt;br /&gt;
        //printf(&amp;quot;fehler: %s&amp;quot;,fehler);&lt;br /&gt;
        mvprintw(z+sort1,t1,fehler); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X %02X %02X %02X %02X %02X %02X&amp;quot;,datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);&lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Speicher 1: (46,47)&amp;quot;);&lt;br /&gt;
        temperaturformatieren(datensatz[46],datensatz[47]);&lt;br /&gt;
        //printf(&amp;quot;temperatur: %s&amp;quot;,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t1,temperatur);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[46],datensatz[47]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (48,49)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[48],datensatz[49]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[48],datensatz[49]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Speicher 2: (50,51)&amp;quot;);&lt;br /&gt;
        stundenformatieren(datensatz[50],datensatz[51]);&lt;br /&gt;
        //printf(&amp;quot;stunden: %s&amp;quot;,stunden);&lt;br /&gt;
        mvprintw(z+sort1,t1,stunden);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[50],datensatz[51]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (52,53)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[52],datensatz[53]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[52],datensatz[53]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (54,55)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[54],datensatz[55]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[54],datensatz[55]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Funktion 1 aktiv: (56,57)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[56],datensatz[57]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[56],datensatz[57]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Funktion 2 aktiv: (58,59)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[58],datensatz[59]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[58],datensatz[59]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Volumenstrom: (60,61)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[60],datensatz[61]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[60],datensatz[61]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (62,63)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[62],datensatz[63]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy); &lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[62],datensatz[63]); &lt;br /&gt;
        sort1++;&lt;br /&gt;
        mvprintw(z+sort1,1,&amp;quot;Dummy: (64,65)&amp;quot;);&lt;br /&gt;
        dummyformatieren(datensatz[64],datensatz[65]);&lt;br /&gt;
        //printf(&amp;quot;dummy: %s&amp;quot;,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t1,dummy);&lt;br /&gt;
        mvprintw(z+sort1,t2,&amp;quot;%02X %02X&amp;quot;,datensatz[64],datensatz[65]); &lt;br /&gt;
        &lt;br /&gt;
        t3=t2+20;&lt;br /&gt;
        sort2=0;&lt;br /&gt;
        &lt;br /&gt;
        i=0;&lt;br /&gt;
        mvprintw(z+sort2,t3,&amp;quot;%02X &amp;quot;,datenfeld[i++]);   &lt;br /&gt;
        mvprintw(z+sort2,t3+3,&amp;quot;%02X &amp;quot;,datenfeld[i++]);&lt;br /&gt;
        mvprintw(z+sort2,t3+6,&amp;quot;%02X &amp;quot;,datenfeld[i++]); &lt;br /&gt;
        for(k=0;k&amp;lt;32;k++){&lt;br /&gt;
            sprintf(tmp,&amp;quot;%X&amp;quot;,datenfeld[i+(k*16)]);&lt;br /&gt;
            strcpy(data,tmp);&lt;br /&gt;
            sort2=hextodec(data)*2;&lt;br /&gt;
            if (sort2&amp;gt;62) sort2=64;&lt;br /&gt;
            for(l=0;l&amp;lt;16;l++){&lt;br /&gt;
                mvprintw(z+sort2,t3+(l*3),&amp;quot;%02X &amp;quot;,datenfeld[i+(k*16)+l]);  &lt;br /&gt;
                if (datenfeld[i+(k*16)+l]!=0){ mvprintw(z+sort2+1,t3+(l*3),&amp;quot;%c &amp;quot;,datenfeld[i+(k*16)+l]);  }&lt;br /&gt;
                else { mvprintw(z+sort2+1,t3+(l*3),&amp;quot; &amp;quot;); }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    endwin();&lt;br /&gt;
    &lt;br /&gt;
    close(fd);&lt;br /&gt;
    &lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;oldtio);&lt;br /&gt;
    &lt;br /&gt;
    return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sungoserialcapture==&lt;br /&gt;
Diese Programm liest die Interfacedaten und schreibt die Daten ohne Auswertung zur weiteren Bearbeitung in ein Datei.&lt;br /&gt;
Auch in diesem Programm sind noch die alten Varianten der Konvertierungsfunktionen vorhanden.&lt;br /&gt;
Dies ist zwar nicht elegant, aber es funktioniert.&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Sungoserialcapture.c&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;termios.h&amp;gt; // termios is the API that is in general recommended for serial I/O in Unix.&lt;br /&gt;
#include &amp;lt;curses.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BAUDRATE B115200&lt;br /&gt;
#define MODEMDEVICE &amp;quot;/dev/ttyS1&amp;quot;&lt;br /&gt;
#define _POSIX_SOURCE 1 /* POSIX compliant source */&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
#define TRUE 1&lt;br /&gt;
&lt;br /&gt;
volatile int STOP=FALSE;&lt;br /&gt;
&lt;br /&gt;
char datum[11];&lt;br /&gt;
char uhrzeit[7];&lt;br /&gt;
char temperatur[8];&lt;br /&gt;
char prozent[7];&lt;br /&gt;
char fehler[17];&lt;br /&gt;
char stunden[8];&lt;br /&gt;
char dummy[7];&lt;br /&gt;
&lt;br /&gt;
unsigned int hextodec(char hex[10]){&lt;br /&gt;
  unsigned int decimal=0;&lt;br /&gt;
  unsigned int length=0;&lt;br /&gt;
  unsigned int base = 1;&lt;br /&gt;
  int i=0;&lt;br /&gt;
  &lt;br /&gt;
  while(hex[i]!=&#039;\0&#039;){&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
  length=i;&lt;br /&gt;
&lt;br /&gt;
  //printf(&amp;quot;hextodec %s\n\r&amp;quot;,hex);&lt;br /&gt;
  //printf(&amp;quot;length %d\n\r&amp;quot;,length);&lt;br /&gt;
  &lt;br /&gt;
  for(i = length-1; i &amp;gt;= 0; i--){&lt;br /&gt;
    //printf(&amp;quot;i: %d\n\r&amp;quot;,i); &lt;br /&gt;
    if (i&amp;lt;0)i=0;&lt;br /&gt;
      if(hex[i] &amp;gt;= &#039;0&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;9&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 48) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;A&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;F&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 55) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
      else if(hex[i] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; hex[i] &amp;lt;= &#039;f&#039;){&lt;br /&gt;
        decimal += ((unsigned char)hex[i] - 87) * base;&lt;br /&gt;
        base *= 16;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //printf(&amp;quot;decimal %d\n\r&amp;quot;,decimal);&lt;br /&gt;
  return decimal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void datumformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char datumStr_formatted[]=&amp;quot;00.00.2021&amp;quot;;&lt;br /&gt;
    char datumStr[5]=&amp;quot;&amp;quot;;&lt;br /&gt;
    unsigned int datumInt;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;0135&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    datumInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,datumInt);&lt;br /&gt;
    sprintf(datumStr,&amp;quot;%d&amp;quot;,datumInt);&lt;br /&gt;
    if(strlen(datumStr)==3){&lt;br /&gt;
        datumStr_formatted[0]=datumStr[1];  &lt;br /&gt;
        datumStr_formatted[1]=datumStr[2]; &lt;br /&gt;
        datumStr_formatted[4]=datumStr[0]; &lt;br /&gt;
        strcpy(datum,datumStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else if(strlen(datumStr)==4){&lt;br /&gt;
        datumStr_formatted[0]=datumStr[2];  &lt;br /&gt;
        datumStr_formatted[1]=datumStr[3]; &lt;br /&gt;
        datumStr_formatted[3]=datumStr[0]; &lt;br /&gt;
        datumStr_formatted[4]=datumStr[1]; &lt;br /&gt;
        strcpy(datum,datumStr_formatted);&lt;br /&gt;
    }   &lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(datum,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char uhrzeitStr_formatted[]=&amp;quot;00:00&amp;quot;;&lt;br /&gt;
    unsigned int uhrzeitInt, stunden, minuten;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    uhrzeitInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,uhrzeitInt);&lt;br /&gt;
    stunden=(unsigned int)uhrzeitInt/60;&lt;br /&gt;
    minuten=uhrzeitInt-(stunden*60);&lt;br /&gt;
    if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen &lt;br /&gt;
        sprintf(uhrzeitStr_formatted,&amp;quot;%d:%d&amp;quot;,stunden,minuten);&lt;br /&gt;
        strcpy(uhrzeit,uhrzeitStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(uhrzeit,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char temperaturStr_formatted[]=&amp;quot;000.0°C&amp;quot;;&lt;br /&gt;
    unsigned int temperaturInt;&lt;br /&gt;
    float temperaturFloat;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    temperaturInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,temperaturInt);&lt;br /&gt;
    temperaturFloat=(float)temperaturInt/10.0;&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(temperaturStr_formatted,&amp;quot;%.1f°C&amp;quot;,temperaturFloat);&lt;br /&gt;
        strcpy(temperatur,temperaturStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(temperatur,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void prozentformatieren(unsigned char byte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char prozentStr_formatted[]=&amp;quot;000%&amp;quot;;&lt;br /&gt;
    unsigned int prozentInt;&lt;br /&gt;
    size_t l;&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,byte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    prozentInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,prozentInt);&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(prozentStr_formatted,&amp;quot;%d%%&amp;quot;,prozentInt);&lt;br /&gt;
        strcpy(prozent,prozentStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(prozent,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char stundenStr_formatted[]=&amp;quot;000000h&amp;quot;;&lt;br /&gt;
    unsigned int stundenInt;&lt;br /&gt;
      &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    //strcpy(data,&amp;quot;1500&amp;quot;);&lt;br /&gt;
    //printf(&amp;quot;data: %s\n\r&amp;quot;,data);&lt;br /&gt;
    stundenInt=hextodec(data);&lt;br /&gt;
    //printf(&amp;quot;int: %d\n\r&amp;quot;,temperaturInt);&lt;br /&gt;
     &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(stundenStr_formatted,&amp;quot;%dh&amp;quot;,stundenInt);&lt;br /&gt;
        strcpy(stunden,stundenStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(stunden,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char fehlerStr_formatted[9];&lt;br /&gt;
    unsigned int fehlerInt;&lt;br /&gt;
&lt;br /&gt;
    fehlerInt=12345;&lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
        sprintf(fehlerStr_formatted,&amp;quot;%d&amp;quot;,fehlerInt);&lt;br /&gt;
        strcpy(fehler,fehlerStr_formatted);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(fehler,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
     &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,highbyte);&lt;br /&gt;
    strcpy(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);&lt;br /&gt;
    &lt;br /&gt;
    sprintf(tmp,&amp;quot;%X&amp;quot;,lowbyte);&lt;br /&gt;
    strcat(data,tmp);&lt;br /&gt;
    //l=strlen(data);&lt;br /&gt;
    //printf(&amp;quot;data: %s (%d)\n\r&amp;quot;,data,l);  &lt;br /&gt;
    &lt;br /&gt;
    if(TRUE){&lt;br /&gt;
         strcpy(dummy,data);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        strcpy(dummy,&amp;quot;Error!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
   FILE *fp;&lt;br /&gt;
   struct termios oldtio,newtio;&lt;br /&gt;
    &lt;br /&gt;
    int fd;&lt;br /&gt;
    int c;&lt;br /&gt;
    int res;&lt;br /&gt;
    int i,k,l;&lt;br /&gt;
    unsigned int x,y,z,t1,t2,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;&lt;br /&gt;
    unsigned int state=0, syncstate=0;&lt;br /&gt;
   &lt;br /&gt;
    unsigned char buf[1];&lt;br /&gt;
    unsigned char merker[6];&lt;br /&gt;
    unsigned char datensatz[100];&lt;br /&gt;
    unsigned char datenfeld[100];&lt;br /&gt;
    unsigned char datenfelder[50][16];&lt;br /&gt;
    char data[10]=&amp;quot;&amp;quot;;&lt;br /&gt;
    char tmp[3]=&amp;quot;&amp;quot;;&lt;br /&gt;
    bool printflag;&lt;br /&gt;
&lt;br /&gt;
    // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nimm diese sonst veruche default&lt;br /&gt;
    if (argc &amp;gt; 1)&lt;br /&gt;
        fd = open(argv[1], O_RDWR | O_NOCTTY );&lt;br /&gt;
    else&lt;br /&gt;
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );&lt;br /&gt;
    if (fd &amp;lt;0) {&lt;br /&gt;
        perror(MODEMDEVICE); &lt;br /&gt;
        exit(-1); &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // sichere die aktuellen Einstellungen&lt;br /&gt;
    tcgetattr(fd,&amp;amp;oldtio); &lt;br /&gt;
    &lt;br /&gt;
    // baue die neuen Einstellungen zusammen&lt;br /&gt;
    bzero(&amp;amp;newtio, sizeof(newtio));&lt;br /&gt;
    newtio.c_cflag = BAUDRATE |  CS8 | CLOCAL | CREAD;&lt;br /&gt;
    newtio.c_iflag = IGNPAR | IXON | IXOFF;&lt;br /&gt;
    newtio.c_oflag = 0;&lt;br /&gt;
    newtio.c_lflag = 0; &lt;br /&gt;
    newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */&lt;br /&gt;
    newtio.c_cc[VMIN]     = 5;   /* blocking read until 5 chars received */&lt;br /&gt;
&lt;br /&gt;
    tcflush(fd, TCIFLUSH);&lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;newtio);&lt;br /&gt;
   &lt;br /&gt;
    setvbuf(stdout, (char *)NULL, _IONBF, 0);&lt;br /&gt;
&lt;br /&gt;
    fp=fopen(&amp;quot;sungocapture.bin&amp;quot;,&amp;quot;w&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (fp == NULL)&lt;br /&gt;
      return 0;&lt;br /&gt;
    &lt;br /&gt;
    while (STOP==FALSE) {       /* loop for input */&lt;br /&gt;
        res = read(fd,buf,1);   /* returns after 5 chars have been input */&lt;br /&gt;
        //printf(&amp;quot;A: syncstate: %d, state: %d, %X\n\r&amp;quot;,syncstate,state,buf[0]); &lt;br /&gt;
 &lt;br /&gt;
        fputc(res,fp);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    fclose(fp);&lt;br /&gt;
    &lt;br /&gt;
    close(fd);&lt;br /&gt;
    &lt;br /&gt;
    tcsetattr(fd,TCSANOW,&amp;amp;oldtio);&lt;br /&gt;
    &lt;br /&gt;
    return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Solarthermie_SunGo_SXL&amp;diff=5197</id>
		<title>Solarthermie SunGo SXL</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Solarthermie_SunGo_SXL&amp;diff=5197"/>
		<updated>2026-07-31T15:53:23Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Suchwort: Prozeda&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
Angeregt durch drei Artikel unter https://hobbyelektronik.org&amp;lt;ref&amp;gt;https://hobbyelektronik.org/w/index.php/Prozeda-Decoder&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://hobbyelektronik.org/w/index.php/Pirozeda-HAT&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://hobbyelektronik.org/w/index.php/Prozeda-Decoder/Der_Datenstick&amp;lt;/ref&amp;gt; habe ich mein Vorhaben, die SunGo SXL Solarthermie Steuerung in meine Gebäudeautomation zu integrieren, wieder aufgenommen.&lt;br /&gt;
Die Artikel sind für mich eine schöne Quelle (gewesen) meine Informationen und Daten abzugleichen und die Sicherheit zu haben, dass so wie ich mir das Ganze vorstelle, es scheinbar funktioniert.&lt;br /&gt;
Was durchaus erstaunlich ist. Denn bereits zu Beginn habe ich bei der Analyse des Datensticks im Datenblatt des AT45DB081D die Taktfrequenz bis zu 66 MHz gelesen. &lt;br /&gt;
Sollte die SunGo diese Rate ausnutzen, ist eine Emulation des Datensticks doch schon recht aufwendig und alle Mikrocontroller und RasPis dieser Welt als reine Softwareemulatoren auszen vor. Aber dazu weiter unten mehr.&lt;br /&gt;
&lt;br /&gt;
==Allgemeines==&lt;br /&gt;
Die SunGo SXL ist eine Steuerung für solarthermische Anlagen der Firma Wagner&amp;amp;Co.&lt;br /&gt;
Die Steuerung bietet die Möglichkeit des Datenloggings. Zu diesem Zweck wird an der markierten Stelle ein kleiner Stick eingesteckt.&lt;br /&gt;
Um die Daten, die auf dem Stick aufgezeichnet werden, zu visualisieren, muss der Stick abgezogen werden und am PC in einen Leseadapter gesteckt werden.&lt;br /&gt;
Dann lassen sich mit der mitgelieferten Software (Datalogging Solareg II; DtSol2.exe)die Daten einlesen, anzeigen und exportieren.&lt;br /&gt;
&lt;br /&gt;
==Artikel==&lt;br /&gt;
Die Artikel liefern eine Vielzahl von mitprotokollierten Daten und deren Analyse bis hin zur Beschreibung des möglichen Nachrichtenformats. Dafür herzlichen Dank, das hat mir viel Zeit gespart.&lt;br /&gt;
Auch die Interface-Implementierung mit Hilfe eines ATmega328 und die Datenaufbereitung durch einen RasPi ist eine gelungene Referenz. Zwischendrin haben mich dann aber immer mal wieder Aussagen unsicher gemacht,&lt;br /&gt;
die ich nicht nachvollziehen konnte. Dazu gehörten z. B. die Aussagen &amp;quot;Datenstick als Sackgasse herausgestellt&amp;quot; und &amp;quot;Leider stellte sich heraus, dass der Regler für den &amp;quot;zweiten Kanal&amp;quot; keinen Chip select herausführt.&amp;quot;&lt;br /&gt;
Der Interface-ATmega ist auch z.B. MISO nicht angeschlossen. Was ist mit den Daten, die die SunGo lesen will!!!&lt;br /&gt;
Da ich diese Dinge nicht nachvollziehen kann habe ich mich entschlossen &amp;quot;meinen&amp;quot; Weg zu gehen und mir mit den Erkenntnissen der Artikel nur Gewissheit zu verschaffen, dass ich nicht in Fallen tappe, die bereits ausfindig gemacht wurden. &lt;br /&gt;
&lt;br /&gt;
==Vorbemerkungen==&lt;br /&gt;
Im ersten Analyseschritt konzentriere ich mich ganz auf die Daten auf dem Datenstick. Wenn es gelingt das Datenformat zu &amp;quot;lesen&amp;quot; kann man daraus schließen welche Daten am Port der Steuerung übertragen werden und zwar in beide Richtungen!&lt;br /&gt;
Es ist doch sehr erstaunlich, dass durch einen fehlenden Stick am Steckplatz der Steuerung und damit fehlender Parameter z.B. des Log-Intervalls, die Steuerung freiwillig trotzdem Daten an den Stick sendet. Die Analyse der Kommunikation der SunGo über den MiniDIN-Port kommt erst später, sobald die Daten des Datensticks interpretierbar sind.&lt;br /&gt;
&lt;br /&gt;
Ergänzung nach fortgeschrittener Entwicklung: Meine weiter oben dargestellten Bedenken haben sich eigentlich in Luft aufgelöst. Der Datenstick ist in sofern ein Sackgasse, da es nicht notwendig ist die SungoSXL zu bewegen den Datenstick zu beschreiben, da (alle) die notwendigen Daten zweimal auf dem SPI anliegen. Ein mögliche Erklärung ist schnell gefunden. An dem nach außen geführten SPI hängt intern wenigstens ein weiterer Client, dessen #CS (leider) nicht nach außen geführt ist. Somit kann man am  MOSI die Daten mitlauschen. Für die Datenaufbereitung ist allerdings die Analyse der Datenspeicherung auf dem Datastick von (entscheidender) Bedeutung. Den (außen) fehlenden ChipSelect habe ich virtuell durch eine Timingroutine erzeugt. Ich gebe zu, dass ich mit meiner derzeitigen Lösung, die zwar funktioniert, eigentlich nicht glücklich bin. Kurz gesagt, ich würde die Daten lieber schön nach jedem Paket in der Datenlücke per seriellem Interface an den PC übertragen. Dumm ist halt nur, dass man die Lücke nicht richtig findet. Da muss ich mir noch was ausdenken, aber dazu unten mehr.&lt;br /&gt;
&lt;br /&gt;
==Datastick Analyse==&lt;br /&gt;
[[Datei:SunGoSXL AT45DB081D.png|mini]]&lt;br /&gt;
Den Datenumfang sieht man am schönsten in der Datalog-Software (Datalogging Solareg II)&lt;br /&gt;
&lt;br /&gt;
Datalogging-Software (V2.02.16) Menüstruktur:&lt;br /&gt;
&lt;br /&gt;
*Datei&lt;br /&gt;
**Lese Datastick (STRG-L)&lt;br /&gt;
**Öffnen (STRG-O)&lt;br /&gt;
**Initialisiere Datastick ([[#Initialisierung Datenstick|Initialisierung Datenstick]])&lt;br /&gt;
**Log-Intervall setzen ([[#LogIntervall setzen|LogIntervall setzen]])&lt;br /&gt;
**Speichern&lt;br /&gt;
**Drucken..&lt;br /&gt;
**Beenden&lt;br /&gt;
*Optionen&lt;br /&gt;
**Sprache&lt;br /&gt;
**Auslesegeschwindigkeit anpassen ([[#Delay ermitteln|Delay ermitteln]])&lt;br /&gt;
**Rohdaten Datastick lesen ([[#Datenstick Rohdaten|Datenstick Rohdaten]])&lt;br /&gt;
**Datastick löschen ([[#Datenstick löschen|Datenstick löschen]])&lt;br /&gt;
**Bezeichnungsänderungen löschen&lt;br /&gt;
**Schreiben des Datasticks ermöglichen (?)&lt;br /&gt;
**Ertrag dokumentieren&lt;br /&gt;
*Hilfe&lt;br /&gt;
**Inhalt...&lt;br /&gt;
**Über..&lt;br /&gt;
&lt;br /&gt;
Als Analysezeitraum diente eine Aufzeichnung vom 03.11. (Start 04:16 Uhr) bis 14.11. (Ende 12:56 Uhr).&lt;br /&gt;
Zur Aufzeichnung stehen folgende Werte zu Verfügung:&lt;br /&gt;
*Uhrzeit&lt;br /&gt;
*T1 Kollektor °C&lt;br /&gt;
*T2 Speicher unten&lt;br /&gt;
*T3 Speicher oben&lt;br /&gt;
*T4 Thermostat A&lt;br /&gt;
*T5 Poolschutz&lt;br /&gt;
*T6 Ertrag T&lt;br /&gt;
*T7 Rücklaufanhebung T&lt;br /&gt;
*T8 Rücklaufanhebung T&lt;br /&gt;
*T9 T&lt;br /&gt;
*Strahlung W/m²&lt;br /&gt;
*Speicher kWh&lt;br /&gt;
*Speicher h&lt;br /&gt;
*Funktion aktiv 1&lt;br /&gt;
*Funktion aktiv 2&lt;br /&gt;
*Volumenstrom l/min&lt;br /&gt;
&lt;br /&gt;
Wobei hier noch nicht deutlich erkennbar ist, ob gerade die Werte Strahlung und Speicher, Werte sind die in der Datalog-Software aufbereitet sind und sich somit gar nicht als Rohdaten auf dem Datenstick befinden.&lt;br /&gt;
&lt;br /&gt;
Anzahl Datensätze: (Aufzeichnungsintervall 1 Minute)&lt;br /&gt;
*03.11. 1184&lt;br /&gt;
*04.11. 1440&lt;br /&gt;
*05.11. 1440&lt;br /&gt;
*06.11. 1440&lt;br /&gt;
*07.11. 1440&lt;br /&gt;
*08.11. 1440&lt;br /&gt;
*09.11. 1440&lt;br /&gt;
*10.11. 1440&lt;br /&gt;
*11.11. 1440&lt;br /&gt;
*12.11. 1440&lt;br /&gt;
*13.11. 1440&lt;br /&gt;
*14.11. 777   in Summe 16361 Einträge&lt;br /&gt;
&lt;br /&gt;
Der benutzte Datenstick hat eine Größe von 8 Mbit. Die Funktion &amp;quot;Rohdaten Datastick lesen&amp;quot; erzeugt eine Datei namens &amp;quot;debug.bin&amp;quot; mit einer Größe von 2 MiB. Da kommen doch Zweifel auf, dass es sich wirklich um die Rohdaten auf dem Stick handelt.&lt;br /&gt;
&lt;br /&gt;
Mein FlashCat-EEPROM-Programmer liefert den tatsächlichen Inhalt des EEPROMS. Und siehe da. Das was da in debug.bin drin steht ist nach meinem Verständnis gar kein &amp;quot;binärer&amp;quot; Inhalt, sondern eine TXT-Datei, die die hexadezimale Entsprechung der eigentlichen Binärdatei in ASCII enthält.&lt;br /&gt;
Beispiel: In der Binärdatei steht HEX AA 55 01 05 ... Dies ist die hexadezimale Darstellung der Binärdaten 10101010 01010101 00000001 00001001 ... im EEPROM. Wenn man nun diese AA 55 01 05 (4 Byte) in ASCII codiert erhält man 61 61 35 35 30 31 30 35 (8 Byte).... &lt;br /&gt;
Dadurch erklärt sich die doppelte Dateigröße. Die Verwendung eines solchen Formates (Codierung) erschließt sich mir nicht. &lt;br /&gt;
NB: Endian habe ich nicht kontrolliert. Die Bin-Datei lässt Little-Endian vermuten. Ist aber eigentlich auch egal. Ich muss sowieso später im Ausleseprogramm individuell darauf reagieren.&lt;br /&gt;
&lt;br /&gt;
Als Grundlage für die weitere Untersuchung dient natürlich jetzt die &amp;quot;korrekte&amp;quot; Bin-Datei. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Inhalt EEPROM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family:Courier;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
0000:0000 | &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;AA 55 01 05 23 01 &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;FF FF  FF FF FF FF FF FF FF 01  | ŠU..#.ĸĸĸĸĸĸĸĸĸ.&amp;lt;/span&amp;gt;&lt;br /&gt;
0000:0010 | &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;20 57 61 67 6E 65 72 20  26 20 43 6F 20 20 00 00 |  Wagner &amp;amp; Co  ..&lt;br /&gt;
0000:0020 | 00 00 00 00 00 00 00 00  00 00 20 53 6F 6C 61 72 | .......... Solar&lt;br /&gt;
0000:0030 | 20 53 6F 6C 61 72 74 65  63 68 6E 69 6B 20 31 34 |  Solartechnik 14&lt;br /&gt;
0000:0040 | 31 35 31 36 53 50 31 32  30 31 31 32 35 31 30 30 | 1516SP1201125100&lt;br /&gt;
0000:0050 | 20 20 53 79 73 74 65 6D  2D 4E 72 2E 20 20 04 BB |   System-Nr.  .ŧ&lt;br /&gt;
0000:0060 | 20 53 79 73 74 65 6D 2D  56 65 72 2E 20 20 00 66 |  System-Ver.  .f&amp;lt;/span&amp;gt;&lt;br /&gt;
0000:0070 | &amp;lt;span style=&amp;quot;color:Teal&amp;quot;&amp;gt;FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0080 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0090 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00A0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00B0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00C0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00D0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00E0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:00F0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0100 | BF FF 7E FF F7 E7 DF FF  FF FF FF FF FF FF FF FF | ŋĸ~ĸũįßĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0110 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0120 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0130 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0140 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0150 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0160 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0170 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0180 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0190 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01A0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01B0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01C0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01D0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01E0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:01F0 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&lt;br /&gt;
0000:0200 | FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF | ĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸĸ&amp;lt;/span&amp;gt;&lt;br /&gt;
0000:0210 | &amp;lt;span style=&amp;quot;color:Navi&amp;quot;&amp;gt;20 20 20 20 44 61 74 75  6D 20 20 20 20 20 00 08 |     Datum     ..&lt;br /&gt;
0000:0220 | 20 20 20 55 68 72 7A 65  69 74 20 20 20 20 00 09 |    Uhrzeit    ..&lt;br /&gt;
0000:0230 | 20 20 4B 6F 6C 6C 65 6B  74 6F 72 20 20 20 00 01 |   Kollektor   ..&lt;br /&gt;
0000:0240 | 20 20 53 70 65 69 63 68  65 72 20 B9 20 20 00 01 |   Speicher đ  ..&lt;br /&gt;
0000:0250 | 20 20 53 70 65 69 63 68  65 72 20 B3 20 20 00 01 |   Speicher ģ  ..&lt;br /&gt;
0000:0260 | 20 54 68 65 72 6D 6F 73  74 61 74 20 41 20 00 01 |  Thermostat A ..&lt;br /&gt;
0000:0270 | 20 20 50 6F 6F 6C 73 63  68 75 74 7A 20 20 00 01 |   Poolschutz  ..&lt;br /&gt;
0000:0280 | 20 20 45 72 74 72 61 67  20 20 20 54 20 20 00 01 |   Ertrag   T  ..&lt;br /&gt;
0000:0290 | 52 FC 63 6B 6C 2E 41 6E  68 2E 20 54 20 20 00 01 | Rückl.Anh. T  ..&lt;br /&gt;
0000:02A0 | 52 FC 63 6B 6C 2E 41 6E  68 2E 20 54 20 20 00 01 | Rückl.Anh. T  ..&lt;br /&gt;
0000:02B0 | 20 20 20 54 20 20 20 20  20 20 00 00 00 00 00 01 |    T      ......&lt;br /&gt;
0000:02C0 | 44 75 6D 6D 79 00 00 00  00 00 00 00 00 00 00 00 | Dummy...........&lt;br /&gt;
0000:02D0 | 53 74 72 61 68 6C 75 6E  67 20 00 00 00 00 00 02 | Strahlung ......&lt;br /&gt;
0000:02E0 | 44 75 6D 6D 79 00 00 00  00 00 00 00 00 00 00 00 | Dummy...........&lt;br /&gt;
0000:02F0 | 44 75 6D 6D 79 00 00 00  00 00 00 00 00 00 00 00 | Dummy...........&lt;br /&gt;
0000:0300 | 20 20 41 75 73 67 61 6E  67 20 31 20 20 20 00 0A |   Ausgang 1   ..&lt;br /&gt;
0000:0310 | BF FF 3E FF E7 E7 DF FF  20 20 41 75 73 67 61 6E | ŋĸ&amp;gt;ĸįįßĸ  Ausgan&lt;br /&gt;
0000:0320 | 67 20 32 20 20 20 00 0A  20 20 41 75 73 67 61 6E | g 2   ..  Ausgan&lt;br /&gt;
0000:0330 | 67 20 33 20 20 20 00 0A  20 20 41 75 73 67 61 6E | g 3   ..  Ausgan&lt;br /&gt;
0000:0340 | 67 20 34 20 20 20 00 0A  20 20 41 75 73 67 61 6E | g 4   ..  Ausgan&lt;br /&gt;
0000:0350 | 67 20 35 20 20 20 00 0A  20 20 41 75 73 67 61 6E | g 5   ..  Ausgan&lt;br /&gt;
0000:0360 | 67 20 36 20 20 20 00 0A  20 20 46 65 68 6C 65 72 | g 6   ..  Fehler&lt;br /&gt;
0000:0370 | 20 20 00 00 00 00 00 0D  20 20 46 65 68 6C 65 72 |   ......  Fehler&lt;br /&gt;
0000:0380 | 20 20 00 00 00 00 00 0D  20 20 46 65 68 6C 65 72 |   ......  Fehler&lt;br /&gt;
0000:0390 | 20 20 00 00 00 00 00 0E  20 20 20 53 70 65 69 63 |   ......   Speic&lt;br /&gt;
0000:03A0 | 68 65 72 20 20 20 00 07  44 75 6D 6D 79 00 00 00 | her   ..Dummy...&lt;br /&gt;
0000:03B0 | 00 00 00 00 00 00 00 00  44 75 6D 6D 79 00 00 00 | ........Dummy...&lt;br /&gt;
0000:03C0 | 00 00 00 00 00 00 00 00  20 20 20 53 70 65 69 63 | ........   Speic&lt;br /&gt;
0000:03D0 | 68 65 72 20 20 20 00 0F  44 75 6D 6D 79 00 00 00 | her   ..Dummy...&lt;br /&gt;
0000:03E0 | 00 00 00 00 00 00 00 00  44 75 6D 6D 79 00 00 00 | ........Dummy...&lt;br /&gt;
0000:03F0 | 00 00 00 00 00 00 00 00  46 75 6E 6B 74 69 6F 6E | ........Funktion&lt;br /&gt;
0000:0400 | 20 61 6B 74 69 76 00 0B  46 75 6E 6B 74 69 6F 6E |  aktiv..Funktion&lt;br /&gt;
0000:0410 | 20 61 6B 74 69 76 00 0C  BF FF 3E FF E7 E7 DF FF |  aktiv..ŋĸ&amp;gt;ĸįįßĸ&lt;br /&gt;
0000:0420 | 20 56 6F 6C 75 6D 65 6E  73 74 72 6F 6D 20 00 13 |  Volumenstrom ..&lt;br /&gt;
0000:0430 | 44 75 6D 6D 79 00 00 00  00 00 00 00 00 00 00 00 | Dummy...........&lt;br /&gt;
0000:0440 | 44 75 6D 6D 79 00 00 00  00 00 00 00 00 00 00 00 | Dummy...........&lt;br /&gt;
0000:0450 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0460 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0470 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0480 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0490 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04A0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04B0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04C0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04D0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04E0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:04F0 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0500 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 | ................&lt;br /&gt;
0000:0510 | 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 0C &amp;lt;/span&amp;gt;| ................&lt;br /&gt;
0000:7F60 | &amp;lt;span style=&amp;quot;background-color:OrangeRed&amp;quot;&amp;gt;BF FF 7E FF F7 E7 DF FF&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:FireBrick&amp;quot;&amp;gt; 4F 04 00 01 2E 00 E6 00 | ŋĸ~ĸũįßĸO.....æ.&lt;br /&gt;
0000:7F70 | 25 01 C4 09 C4 09 C4 09  0D 01 DE 00 A2 FE 00 00 | %.Ä.Ä.Ä...Þ.Ēþ..&lt;br /&gt;
0000:7F80 | 00 00 00 00 00 00 00 00  00 00 00 64 00 15 15 08 | ...........d....&lt;br /&gt;
0000:7F90 | 00 00 00 00 00 00 00 00  7D 01 00 00 00 00 01 00 | ........}.......&lt;br /&gt;
0000:7FA0 | 00 00 00 00 00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#008800&amp;quot;&amp;gt;   4F 04 01 01 2E 00 E6 00 | ........O.....æ.&lt;br /&gt;
0000:7FB0 | 25 01 C4 09 C4 09 C4 09  0D 01 DE 00 A2 FE 00 00 | %.Ä.Ä.Ä...Þ.Ēþ..&lt;br /&gt;
0000:7FC0 | 00 00 00 00 00 00 00 00  00 00 00 64 00 15 15 08 | ...........d....&lt;br /&gt;
0000:7FD0 | 00 00 00 00 00 00 00 00  7D 01 00 00 00 00 01 00 | ........}.......&lt;br /&gt;
0000:7FE0 | 00 00 00 00 00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:FireBrick&amp;quot;&amp;gt;  4F 04 02 01 2E 00 E6 00 | ........O.....æ.&lt;br /&gt;
0000:7FF0 | 25 01 C4 09 C4 09 C4 09  0B 01 DF 00 A2 FE 00 00 | %.Ä.Ä.Ä...ß.Ēþ..&lt;br /&gt;
0000:8000 | 00 00 00 00 00 00 00 00  00 00 00 64 00 15 15 08 | ...........d....&lt;br /&gt;
0000:8010 | 00 00 00 00 00 00 00 00  7D 01 00 00 00 00 01 00 | ........}.......&lt;br /&gt;
0000:8020 | 00 00 00 00 00 00 00 00&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#008800&amp;quot;&amp;gt;  4F 04 03 01 2E 00 E6 00 | ........O.....æ.&lt;br /&gt;
0000:8030 | 25 01 C4 09 C4 09 C4 09  0D 01 DE 00 A2 FE 00 00 | %.Ä.Ä.Ä...Þ.Ēþ..&lt;br /&gt;
0000:8040 | 00 00 00 00 00 00 00 00  00 00 00 64 00 15 15 08 | ...........d....&lt;br /&gt;
0000:8050 | 00 00 00 00 00 00 00 00  7D 01 00 00 00 00 01 00 | ........}.......&lt;br /&gt;
0000:8060 | 00 00 00 00 00 00 00 00  &amp;lt;span style=&amp;quot;background-color:OrangeRed&amp;quot;&amp;gt;BF FF 7E FF F7 E7 DF FF&amp;lt;/span&amp;gt; | ........ŋĸ~ĸũįßĸ&amp;lt;/span&amp;gt;&lt;br /&gt;
0000:8070 | &amp;lt;span style=&amp;quot;color:Firebrick&amp;quot;&amp;gt; 4F 04 04 01 2E 00 E7 00  25 01 C4 09 C4 09 C4 09 | O.....į.%.Ä.Ä.Ä.&lt;br /&gt;
0000:8080 | 0D 01 DE 00 A2 FE 00 00  00 00 00 00 00 00 00 00 | ..Þ.Ēþ..........&lt;br /&gt;
0000:8090 | 00 00 00 64 00 15 15 08  00 00 00 00 00 00 00 00 | ...d............&lt;br /&gt;
0000:80A0 | 7D 01 00 00 00 00 01 00  00 00 00 00 00 00 00 00 | }...............&lt;br /&gt;
0000:80B0 | &amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#008800&amp;quot;&amp;gt;4F 04 05 01 2E 00 E6 00 25 01 C4 09 C4 09 C4 09 | O.....æ.%.Ä.Ä.Ä.&lt;br /&gt;
0000:80C0 | 0C 01 DD 00 A2 FE 00 00  00 00 00 00 00 00 00 00 | ..Ý.Ēþ..........&lt;br /&gt;
0000:80D0 | 00 00 00 64 00 15 15 08  00 00 00 00 00 00 00 00 | ...d............&lt;br /&gt;
0000:80E0 | 7D 01 00 00 00 00 01 00  00 00 00 00 00 00 00 00 | }...............&lt;br /&gt;
0000:80F0 | 4F 04 06 01 2D 00 E6 00  24 01 C4 09 C4 09 C4 09 | O...-.æ.$.Ä.Ä.Ä.&lt;br /&gt;
0000:8100 | 0B 01 DD 00 A2 FE 00 00  00 00 00 00 00 00 00 00 | ..Ý.Ēþ..........&lt;br /&gt;
0000:8110 | 00 00 00 64 00 15 15 08  00 00 00 00 00 00 00 00 | ...d............&lt;br /&gt;
0000:8120 | 7D 01 00 00 00 00 01 00  00 00 00 00 00 00 00 00 | }...............&lt;br /&gt;
0000:8130 | 4F 04 07 01 2F 00 E6 00  26 01 C4 09 C4 09 C4 09 | O.../.æ.&amp;amp;.Ä.Ä.Ä.&lt;br /&gt;
0000:8140 | 0E 01 DE 00 A2 FE 00 00  00 00 00 00 00 00 00 00 | ..Þ.Ēþ..........&lt;br /&gt;
0000:8150 | 00 00 00 64 00 15 15 08  00 00 00 00 00 00 00 00 | ...d............&lt;br /&gt;
0000:8160 | 7D 01 00 00 00 00 01 00  00 00 00 00 00 00 00 00 | }...............&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
     &lt;br /&gt;
In der Darstellung des BIN-Files musste ich etwas tricksen. Man erkennt den Sprung an Adresse 0000:0510 - 0000:7F60.&lt;br /&gt;
Das kommt daher, dass ich hier die passenden Daten zu der nachfolgenden Exportdatei zeigen will. Da die Daten im EEPROM in&lt;br /&gt;
einem Ringpuffer-Verfahren abgelegt sind und in der Exportdatei chronologisch gezeigt werden, erklärt sich, dass der älteste Eintrag im Ringpuffer in der Regel nicht am Anfang des EEPROM-Speichers abgelegt ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Binärdatei hat folgende Struktur:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset (hex)!!Offset (dez)!!Datenbytes!!Bemerkung &lt;br /&gt;
|-&lt;br /&gt;
|0x00000|| 0 ||AA 55 LI XX XX XX ||File Signatur erinnert an die Magic Number. Das dritte Byte ist das Logintervall.&lt;br /&gt;
|-&lt;br /&gt;
|0x00006|| 6 ||FF ... FF 01||&lt;br /&gt;
|-&lt;br /&gt;
|0x00010|| 16 ||20 57 61 67 ... ||Wagner&amp;amp; Co ... System-Nr. und System-Version sind als 2 Byte Integer codiert&lt;br /&gt;
|-&lt;br /&gt;
|0x00100|| 256 || 8 Byte (Identifier ?)&lt;br /&gt;
|-&lt;br /&gt;
|0x00210||  528  || ||Kopfdaten (Kopfzeile Messwerte incl. Typ und Reihenfolge). Pro Eintrag 16 Bytes.&lt;br /&gt;
|-&lt;br /&gt;
|0x00520||    || ||In Blöcken von jeweils 264 Byte Daten (Datum (8 Byte) + 4 * Werte (64 Byte))&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Was im Vergleich mit der auf hobbyelektronik.org veröffentlichen Binärdatei auffällt ist, dass der Wert 0x40 (64) in der Datalogging Software kein zulässiges LogIntervall ist. Es werden nur die Werte 1,2,5,10,15,20 und 30 Minuten vorgeschlagen. Die nächsten Bytes sind bei mir 05 23 01, in der Vergleichsdatei 05 24 01. Die darauf folgende Reihe von FF schließen mit 01 oder 00 ab. Ein weiterer großer Unterschied ist an Offset-Position 0000:0100 zu sehen. In meiner Binärdatei steht ab dieser Stelle ein 8 Byte (Zufallswert). Dieser Wert fehlt in der Vergleichsdatei. Der Grund liegt in der (Page-)Organisation des EEPROMs. Dort sind 256 bzw. 264 Bytes pro Page einstellbar. Die Differenz sind genau die fraglichen 8 Bytes. Aber egal ob sie nun mitgelesen/geschrieben werden, sie lassen sich leicht im Programm ausfiltern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family:Courier;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
00000000  AA 55 40 05 24 01 FF FF FF FF FF FF FF FF FF 00  ªU@.$.ÿÿÿÿÿÿÿÿÿ.&lt;br /&gt;
00000010  20 20 57 61 67 6E 65 72 20 26 20 43 6F 20 00 00    Wagner &amp;amp; Co ..&lt;br /&gt;
00000020  00 00 00 00 00 00 00 00 00 00 20 53 6F 6C 61 72  .......... Solar&lt;br /&gt;
00000030  20 53 6F 6C 61 72 74 65 63 68 6E 69 6B 20 XX XX   Solartechnik XX&lt;br /&gt;
00000040  XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX  XXXXXXXXXXXXXXXX&lt;br /&gt;
00000050  20 20 53 79 73 74 65 6D 2D 4E 72 2E 20 20 XX XX    System-Nr.  XX&lt;br /&gt;
00000060  20 53 79 73 74 65 6D 2D 56 65 72 2E 20 20 XX XX   System-Ver.  XX&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die darauf folgenden Kopfdaten haben immer 16 Bytes. Das zweitletzte Byte ist wohl immer 0x00 und stellt den Stringabschluss dar. Das letzte (16.) Byte ist der Typ des (Mess-)wertes. &lt;br /&gt;
*00 Dummy&lt;br /&gt;
*01 Temperatur&lt;br /&gt;
*02 (Strahlung) W/m²&lt;br /&gt;
*07 (Speicher) kWh&lt;br /&gt;
*08 Datum&lt;br /&gt;
*09 Uhrzeit&lt;br /&gt;
*0A Prozent&lt;br /&gt;
*0B (Funktion aktiv)&lt;br /&gt;
*0C (Funktion aktiv)&lt;br /&gt;
*0D (Fehler)&lt;br /&gt;
*0E (Fehler)&lt;br /&gt;
*0F (Speicher) h&lt;br /&gt;
*13 (Volumenstrom) l/min&lt;br /&gt;
&lt;br /&gt;
Es werden folgende Werte geschrieben:&lt;br /&gt;
#Datum 2 Byte Little Endian uint16  Ob die führenden Nullen mit gerechnet werden muss ich noch testen. Sonst wäre z.B. 112 nicht eindeutig 1.12. oder 11.2. &lt;br /&gt;
#Uhrzeit 2 Byte Little Endian uint16 Anzahl der Minuten seit Mitternacht.&lt;br /&gt;
#Kollektor 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Speicher unten 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Speicher oben 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Thermostat 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Poolschutz 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Ertrag 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Rücklaufanhebung 1 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#Rücklaufanhebung 2 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle&lt;br /&gt;
#T (?) 2 Byte Little Endian uint16 Teiler 10 damit 1 Nachkommastelle Zweier-Komplement&lt;br /&gt;
#Dummy 2 Byte 00 00&lt;br /&gt;
#Strahlung 2 Byte bei mir immer 00 00 , daher kann ich nicht kontrollieren&lt;br /&gt;
#Dummy 2 Byte 00 00&lt;br /&gt;
#Dummy 2 Byte 00 00&lt;br /&gt;
#Ausgang 1 1 Byte Prozent&lt;br /&gt;
#Ausgang 2 1 Byte Prozent&lt;br /&gt;
#Ausgang 3 1 Byte Prozent&lt;br /&gt;
#Ausgang 4 1 Byte Prozent&lt;br /&gt;
#Ausgang 5 1 Byte Prozent&lt;br /&gt;
#Ausgang 6 1 Byte Prozent&lt;br /&gt;
#Fehler (0D) X Byte&lt;br /&gt;
#Fehler (0D) X Byte&lt;br /&gt;
#Fehler (0E) Y Byte X+X+Y = 8&lt;br /&gt;
#Speicher (07)&lt;br /&gt;
#Dummy (00) 2 Byte 00 00&lt;br /&gt;
#Dummy  (00) 2 Byte 00 00&lt;br /&gt;
#Speicher (15) 2 Byte Little Endian uint16&lt;br /&gt;
#Dummy (00) 2 Byte 00 00 &lt;br /&gt;
#Dummy (00) 2 Byte 00 00&lt;br /&gt;
#Funktion aktiv (11) 2 Byte Little Endian uint16&lt;br /&gt;
#Funktion aktiv (12) 2 Byte Little Endian uint16&lt;br /&gt;
AB Byte 60 gibt es keinen Hinweis mehr im Typ 0301 &lt;br /&gt;
#Volumenstrom  2 Byte Little Endian uint16&lt;br /&gt;
#Dummy 2 Byte 00 00&lt;br /&gt;
#Dummy 2 Byte 00 00&lt;br /&gt;
#(Checksumme ?) 2 Byte &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Die Exportdatei der Datalogging-Software dient als Abgleich.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;txt&amp;quot; line&amp;gt;&lt;br /&gt;
;Datalogging&lt;br /&gt;
; Wagner &amp;amp; Co  &lt;br /&gt;
;&lt;br /&gt;
; Solartechnik &lt;br /&gt;
1317SP1201105100&lt;br /&gt;
;  System-Nr.  	1211&lt;br /&gt;
; System-Ver.  	102&lt;br /&gt;
Datum	Uhrzeit	Kollektor	Speicher  unten	Speicher  oben	Thermostat A	Poolschutz	Ertrag   T	Rückl.Anh. T	Rückl.Anh. T	T	Strahlung	Ausgang 1	Ausgang 2	Ausgang 3	Ausgang 4	Ausgang 5	Ausgang 6	Speicher	Speicher	Funktion aktiv	Funktion aktiv	Volumenstrom&lt;br /&gt;
8	9	1	1	1	1	1	1	1	1	1	2	10	10	10	10	10	10	7	15	11	12	19&lt;br /&gt;
&lt;br /&gt;
03.11.21	04:16:00	4.600	23.000	29.300	250.000	250.000	250.000	26.900	22.200	-35.000	0.000	0.000	0.000	0.000	0.000	0.000	100.000	0	381	0.100	0.000	0.000&lt;br /&gt;
03.11.21	04:17:00	4.600	23.000	29.300	250.000	250.000	250.000	26.900	22.200	-35.000	0.000	0.000	0.000	0.000	0.000	0.000	100.000	0	381	0.100	0.000	0.000&lt;br /&gt;
03.11.21	04:18:00	4.600	23.000	29.300	250.000	250.000	250.000	26.700	22.300	-35.000	0.000	0.000	0.000	0.000	0.000	0.000	100.000	0	381	0.100	0.000	0.000&lt;br /&gt;
03.11.21	04:19:00	4.600	23.000	29.300	250.000	250.000	250.000	26.900	22.200	-35.000	0.000	0.000	0.000	0.000	0.000	0.000	100.000	0	381	0.100	0.000	0.000&lt;br /&gt;
03.11.21	04:20:00	4.600	23.100	29.300	250.000	250.000	250.000	26.900	22.200	-35.000	0.000	0.000	0.000	0.000	0.000	0.000	100.000	0	381	0.100	0.000	0.000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Initialisierung Datenstick===&lt;br /&gt;
&lt;br /&gt;
Der Vorgang wird durch den entsprechenden Menüeintrag aufgerufen. In der Übersicht erkennt man, dass der Initialisierungsprozess ca. 16 Sekunden dauert. Die Unterbrechnung am Anfang bis ca. 8 Sekunden hat die Ursache in der (User-)Reaktion auf die Meldung, dass der Stick bereits eine Kennung besitzt und ob wirklich neu geschrieben werden soll.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Datastick Initialisierung Overview.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Man erkennt bei der Startabfrage die aktuelle Kennung AA 55 01 00 ab Offset 8 und BD FF 26 55 A5 05 94 2F AA 55 01 00 ( am Ende dann: DE EF 93 2A D2 82 CA 17 D5 2A 80 80 7F).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Datastick Initialisierung Start.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Die Erase-Methode ist hier das Block-Erase. Die 50h ist der Opcode gefolgt von der Blockadresse. &lt;br /&gt;
&lt;br /&gt;
 A block of eight pages can be erased at one time. This command is useful when large amountsof data has to be written into the device. This will avoid using multiple Page Erase Commands.To perform a block erase  for the DataFlash standard page size (264-bytes), an opcode of 50Hmust be loaded into the device, followed by three address bytes comprised of three don’t carebits, nine page address bits (PA11 -PA3) and 12 don’t care bits. The nine page address bits areused to specify which block of eight pages is to be erased. To perform a block erase for thebinary page size (256-bytes), the opcode 50H must be loaded into the device, followed by threeaddress bytes consisting of four don’t care bits, nine page address bits (A19 - A11) and 11 don’tcare bits. The nine page address bits are used to specify which block of eight pages is to beerased. When a low-to-high transition occurs on the CS pin, the part will erase the selectedblock of eight pages. The erase operation is internally self-timed and should take place in a max-imum time of tBE. During this time, the status register will indicate that the part is busy.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Datastick Initialisierung Erase.png|600px]]&lt;br /&gt;
&lt;br /&gt;
Die letzte Blockadresse die gelöscht wird ist 1F F0 00. Dann folgt noch ein Main Memory Page Program Through Buffer 1 82h und ein Main Memory Page Read D2h&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Datastick Initialisierung End.png|600px]]&lt;br /&gt;
&lt;br /&gt;
===LogIntervall setzen===&lt;br /&gt;
Das LogIntervall setzen besteht wirklich nur im Verändern des Wertes nach AA 55. Hier in diesem Fall 1E für 30 Minuten.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Datastick LogIntervall setzen.png|660px]]&lt;br /&gt;
&lt;br /&gt;
===Delay ermitteln===&lt;br /&gt;
[[Datei:SunGo Software Screenshot Lesegeschwindigkeit.png|600px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot SunGo Lesegeschwindigkeittest.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:SunGo Software Screenshot Lesegeschwindigkeit Delay.png|120px]]&lt;br /&gt;
&lt;br /&gt;
===Datenstick Rohdaten===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===Datenstick löschen===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==Steuerung Analyse==&lt;br /&gt;
&lt;br /&gt;
Zu Beginn der Analyse der Steuerung gleich etwas Beruhigendes. Der SPI-Takt (5 us/200 kHz) der Steuerung ist gemütlich. Die Bits werden auf der Mitte (fallende Flanke) des Taktes übernommen.&lt;br /&gt;
Als Grundlage diente mir ein knapp 20 Sekunden langer Mitschnitt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SunGo Steuerung Screenshot 20Sekunden Sample.png|x100px]]&lt;br /&gt;
&lt;br /&gt;
Der Zyklus wiederholt sich jede Sekunde. Es kommen 5 Doppelpakete (DPA) mit einem Abstand von 200 ms. Je nachdem wie man den Anfang festlegt, kommen bevor der Zyklus von neuem beginnt in der 146ms Lücke noch ein Doppelpaket (DPB) und die EEPROM-Abfrage.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SunGo Steuerung Screenshot Pulseview Overview.png|x100px]]&lt;br /&gt;
&lt;br /&gt;
Refresh: 200ms&lt;br /&gt;
&lt;br /&gt;
DPA_1 ist ein AA 55 55 AA 02 00  17x AA 16x AA&lt;br /&gt;
&lt;br /&gt;
DPA_2 ist ein AA 55 55 AA 01 00 und enthält die Daten für das Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:SunGo Steuerung Screenshot Pulseview Paketabstaende.png|x100px]]&lt;br /&gt;
&lt;br /&gt;
*DPA_1 (AB): 3,5ms&lt;br /&gt;
*P (BC): 46,5ms      (AC): 50ms&lt;br /&gt;
*DPA_2 (CD): 4,4ms&lt;br /&gt;
*P (DE): 145,6ms     (CE): 150ms&lt;br /&gt;
*Periode (AE): 200ms&lt;br /&gt;
&lt;br /&gt;
Refresh: 1s&lt;br /&gt;
&lt;br /&gt;
DPB_1 ist ein AA 55 55 AA 03 01  Inhalt noch nicht untersucht&lt;br /&gt;
&lt;br /&gt;
DPB_2 ist ein AA 55 55 AA 03 00  Nutzdaten &lt;br /&gt;
&lt;br /&gt;
[[Datei:SunGo Screenshot Datenpaket B.png|x100px]]&lt;br /&gt;
&lt;br /&gt;
Nach jedem fünften DPA_2 folgt&lt;br /&gt;
*Pause 21ms&lt;br /&gt;
*DPB_1 5ms&lt;br /&gt;
*Pause 15ms&lt;br /&gt;
*DPB_2 5ms&lt;br /&gt;
*Pause 10ms&lt;br /&gt;
*EEPROM 2ms&lt;br /&gt;
*Pause 88ms&lt;br /&gt;
&lt;br /&gt;
DPA_1:&amp;quot;kleines&amp;quot; Paket (AB): 320us: AA 55 55 AA 02 00 (P970us) 1100us: 17*AA (P67us)  1033us:16*AA  gesamt:3491us dann Abstand 46ms&lt;br /&gt;
Pause: 50ms&lt;br /&gt;
&lt;br /&gt;
DPA_2:&amp;quot;großes&amp;quot; Paket (CD) 320us: AA 55 55 AA 01 00 (P290us)  3787us: 64 Byte (10P=592us) gesamt:4387us&lt;br /&gt;
&lt;br /&gt;
Vor dem CS (Periodendauer: 1000ms) kommt immer noch ein weiteres Doppelpaket dazwischen&lt;br /&gt;
*0s: DPA (+DPB+EEPROM-Abfrage in der 145,6ms Lücke)&lt;br /&gt;
*200ms: DPA&lt;br /&gt;
*400ms: DPA&lt;br /&gt;
*600ms: DPA&lt;br /&gt;
*800ms: DPA &lt;br /&gt;
*1000ms: next Cycle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Inhalt der &amp;quot;Nicht-EEPROM&amp;quot; Pakete===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1800px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;Daten der Pakete ohne EEPROM Chip Select&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Zeile 5924&lt;br /&gt;
AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 03 01 0D 11 04 08 52 FC 63 6B 6C 2E 41 6E 68 2E 20 54 20 20 01 09 52 FC 63 6B 6C 2E 41 6E 68 2E 20 54 20 20 01 0A 20 20 20 54 20 20 20 20 20 20 00 00 00 00 01 0B 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 00 23 4C AA 55 55 AA 03 00 20 00 35 01 1B 04 7D 00 18 01 1D 01 C4 09 C4 09 C4 09 23 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 0A&lt;br /&gt;
&lt;br /&gt;
Zeile 18438&lt;br /&gt;
AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 03 01 0D 11 04 0C 53 74 72 61 68 6C 75 6E 67 20 00 00 00 00 02 0D 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 0E 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 0F 20 20 41 75 73 67 61 6E 67 20 31 20 20 20 0A 00 23 2E AA 55 55 AA 03 00 20 00 35 01 1B 04 7D 00 18 01 1D 01 C4 09 C4 09 C4 09 23 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 0A&lt;br /&gt;
&lt;br /&gt;
Zeile 30952&lt;br /&gt;
AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 35 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 AA 55 55 AA 03 01 0D 11 04 10 20 20 41 75 73 67 61 6E 67 20 32 20 20 20 0A 11 20 20 41 75 73 67 61 6E 67 20 33 20 20 20 0A 12 20 20 41 75 73 67 61 6E 67 20 34 20 20 20 0A 13 20 20 41 75 73 67 61 6E 67 20 35 20 20 20 0A 00 23 99 AA 55 55 AA 03 00 20 00 35 01 1B 04 7D 00 18 01 1C 01 C4 09 C4 09 C4 09 22 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 08&lt;br /&gt;
&lt;br /&gt;
Zeile 43466&lt;br /&gt;
AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 03 01 0D 11 04 14 20 20 41 75 73 67 61 6E 67 20 36 20 20 20 0A 15 20 20 46 65 68 6C 65 72 20 20 00 00 00 00 0D 16 20 20 46 65 68 6C 65 72 20 20 00 00 00 00 0D 17 20 20 46 65 68 6C 65 72 20 20 00 00 00 00 0E 00 23 0B AA 55 55 AA 03 00 20 00 35 01 1B 04 7D 00 18 01 1C 01 C4 09 C4 09 C4 09 22 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 08&lt;br /&gt;
&lt;br /&gt;
Zeile 55980&lt;br /&gt;
AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 03 01 0D 11 04 18 20 20 20 53 70 65 69 63 68 65 72 20 20 20 07 19 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 1A 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 1B 20 20 20 53 70 65 69 63 68 65 72 20 20 20 0F 00 23 BF AA 55 55 AA 03 00 20 00 35 01 1B 04 7D 00 18 01 1C 01 C4 09 C4 09 C4 09 22 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 08&lt;br /&gt;
&lt;br /&gt;
Zeile 68494&lt;br /&gt;
AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 02 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E 34 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 AA 55 55 AA 03 01 0D 11 04 1C 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 1D 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 1E 46 75 6E 6B 74 69 6F 6E 20 61 6B 74 69 76 0B 1F 46 75 6E 6B 74 69 6F 6E 20 61 6B 74 69 76 0C 00 23 04 AA 55 55 AA 03 00 20 00 35 01 1B 04 7C 00 17 01 1C 01 C4 09 C4 09 C4 09 21 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 05&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mann kann in den Paketen &amp;quot;Steuersequenzen&amp;quot; ausmachen. Sie werden durch &#039;AA 55 55 AA&#039; eingeleitet und von einem Selektor (2 Byte ?) 01 00, 02 00, 03 00 und 03 01 gefolgt.&lt;br /&gt;
&lt;br /&gt;
Hier die sind Beispieldaten sortiert nach den Selektoren:&lt;br /&gt;
 AA 55 55 AA 01 00 20 20 53 70 65 69 63 68 65 72 20 DE 20 20 20 20 32 38 2E (35 oder 34) 01 43 20 20 20 31 36 20 05 2D 01 43 2D 06 31 30 35 20 01 01 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  (61 bei 34 und 62 bei 35)&lt;br /&gt;
                        S  p  e  i  c  h  e  r      ^             2  8  .   5       4    °  C          1  6        -  °  C  -     1  0  5      &lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;&#039;01 00&#039;&#039;&#039;&#039; spricht das Display an. &lt;br /&gt;
&lt;br /&gt;
 AA 55 55 AA 02 00 33xAA&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;&#039;02 00&#039;&#039;&#039;&#039; hat &amp;quot;keinen&amp;quot; Inhalt.&lt;br /&gt;
&lt;br /&gt;
 AA 55 55 AA 03 00 Einleitung 20 00 (64 Nutzbytes)  35 01 1B 04 7C 00 17 01 1C 01 C4 09 C4 09 C4 09 21 01 2D 01 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 15 08 00 00 00 00 00 00 00 00 FD 38 00 00 00 00 01 00 00 00 00 00 00 00 00 00  Abschluss 20 05&lt;br /&gt;
                                                   Datum Uhrzeit&lt;br /&gt;
                                                   09.03. 17:31&lt;br /&gt;
 Datensatz aus dem Stick:                           4F 04 03 01 2E 00 E6 00 25 01 C4 09 C4 09 C4 09 0D 01 DE 00 A2 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 64 00 15 15 08 00 00 00 00 00 00 00 00 7D 01 00 00 00 00 01 00 00 00 00 00 00 00 00 00&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;&#039;03 00&#039;&#039;&#039;&#039; ist der Interessante. Beim Vergleich der Nutzdaten mit dem Speicherstickinhalt-Datensatz sieht man die Übereinstimmung des Aufbaus. SUPER! Dann kann man sich die Emulation des Stick sparen und durch sniffen und einem Selektorscan nach &#039;03 00&#039; hat man das gleiche Ergebnis!&lt;br /&gt;
Das einzige Problem ist das fehlende ChipSelect zu diesen Datenpaketen.&lt;br /&gt;
&lt;br /&gt;
 AA 55 55 AA 03 01 0D 11 04  (67 Byte)  &lt;br /&gt;
                            1C 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 &lt;br /&gt;
                            1D 44 75 6D 6D 79 00 00 00 00 00 00 00 00 00 00 &lt;br /&gt;
                            1E 46 75 6E 6B 74 69 6F 6E 20 61 6B 74 69 76 0B &lt;br /&gt;
                            1F 46 75 6E 6B 74 69 6F 6E 20 61 6B 74 69 76 0C &lt;br /&gt;
                            00 23 04&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung des &#039;&#039;&#039;&#039;03 01&#039;&#039;&#039;&#039; Datensatzes habe ich noch nicht untersucht. Nachtrag: Der Datensatz 0301 enthält die übermittelten Datenfelder (Klartext) des Datensatzes 0300. Dann ergibt es auch einen Sinn wenn 0301 immer vor 0300 gesendet wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um den Arduino im Sniffing-Mode und nicht im Emulator-Mode zu betreiben ist das Timing der Pakete hilfreich. Durch das fehlende Chipselect ist man gezwungen irgendwie einen Rhythmus oder Trigger im Ausleseprogramm zu implementieren.&lt;br /&gt;
&lt;br /&gt;
==Arduino als SPI-Master==&lt;br /&gt;
[[Datei:Datastick Adapter.png|mini|Datastick Adapter]]&lt;br /&gt;
Als erste Quelle habe ich https://www.arduino.cc/en/Tutorial/SPIEEPROM benutzt.&lt;br /&gt;
Ich hatte mir für den Anschluss von DigiAnalyzer auf die Schnelle einen Adapter gebastelt. Leider hat er am original Interface seinen Dienst versagt. Ich gehe von Laufzeitproblemen aus. &lt;br /&gt;
Er bekommt eine zweite Chance als Brücke zum Arduino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;SPI Master EEPROM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define DATAOUT 11//MOSI&lt;br /&gt;
#define DATAIN  12//MISO&lt;br /&gt;
#define SPICLOCK  13//sck&lt;br /&gt;
#define SLAVESELECT 10//ss&lt;br /&gt;
//opcodes&lt;br /&gt;
#define WREN  6&lt;br /&gt;
#define WRDI  4&lt;br /&gt;
#define RDSR  5&lt;br /&gt;
#define WRSR  1&lt;br /&gt;
#define READ  3&lt;br /&gt;
#define WRITE 2&lt;br /&gt;
byte eeprom_output_data;&lt;br /&gt;
byte eeprom_input_data=0;&lt;br /&gt;
byte clr;&lt;br /&gt;
int address=0;&lt;br /&gt;
//data buffer&lt;br /&gt;
char buffer [128];&lt;br /&gt;
void fill_buffer()&lt;br /&gt;
{&lt;br /&gt;
  for (int I=0;I&amp;lt;128;I++)&lt;br /&gt;
  {&lt;br /&gt;
    buffer[I]=I;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
char spi_transfer(volatile char data)&lt;br /&gt;
{&lt;br /&gt;
  SPDR = data;                    // Start the transmission&lt;br /&gt;
  while (!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)))     // Wait the end of the transmission&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
  return SPDR;                    // return the received byte&lt;br /&gt;
}&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(DATAOUT, OUTPUT);&lt;br /&gt;
  pinMode(DATAIN, INPUT);&lt;br /&gt;
  pinMode(SPICLOCK,OUTPUT);&lt;br /&gt;
  pinMode(SLAVESELECT,OUTPUT);&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //disable device&lt;br /&gt;
  // SPCR = 01010000&lt;br /&gt;
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,&lt;br /&gt;
  //sample on leading edge of clk,system clock/4 rate (fastest)&lt;br /&gt;
  SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR);&lt;br /&gt;
  clr=SPSR;&lt;br /&gt;
  clr=SPDR;&lt;br /&gt;
  delay(10);&lt;br /&gt;
  //fill buffer with data&lt;br /&gt;
  fill_buffer();&lt;br /&gt;
  //fill eeprom w/ buffer&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
  spi_transfer(WREN); //write enable&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH);&lt;br /&gt;
  delay(10);&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
  spi_transfer(WRITE); //write instruction&lt;br /&gt;
  address=0;&lt;br /&gt;
  spi_transfer((char)(address&amp;gt;&amp;gt;8));   //send MSByte address first&lt;br /&gt;
  spi_transfer((char)(address));      //send LSByte address&lt;br /&gt;
  //write 128 bytes&lt;br /&gt;
  for (int I=0;I&amp;lt;128;I++)&lt;br /&gt;
  {&lt;br /&gt;
    spi_transfer(buffer[I]); //write data byte&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //release chip&lt;br /&gt;
  //wait for eeprom to finish writing&lt;br /&gt;
  delay(3000);&lt;br /&gt;
  Serial.print(&#039;h&#039;,BYTE);&lt;br /&gt;
  Serial.print(&#039;i&#039;,BYTE);&lt;br /&gt;
  Serial.print(&#039;\n&#039;,BYTE);//debug&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
byte read_eeprom(int EEPROM_address)&lt;br /&gt;
{&lt;br /&gt;
  //READ EEPROM&lt;br /&gt;
  int data;&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
  spi_transfer(READ); //transmit read opcode&lt;br /&gt;
  spi_transfer((char)(EEPROM_address&amp;gt;&amp;gt;8));   //send MSByte address first&lt;br /&gt;
  spi_transfer((char)(EEPROM_address));      //send LSByte address&lt;br /&gt;
  data = spi_transfer(0xFF); //get data byte&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  eeprom_output_data = read_eeprom(address);&lt;br /&gt;
  Serial.print(eeprom_output_data,DEC);&lt;br /&gt;
  Serial.print(&#039;\n&#039;,BYTE);&lt;br /&gt;
  address++;&lt;br /&gt;
  if (address == 128)&lt;br /&gt;
    address = 0;&lt;br /&gt;
  delay(500); //pause for readability&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt das Ganze entsprechend anpassen. Erst mal nur lesender Zugriff. &lt;br /&gt;
&lt;br /&gt;
 The following code examples show how to initialize the SPI as a master and how to perform a simple transmission. DDR_SPI in the examples must be replaced by the actual data direction register controlling the SPI pins. DD_MOSI, DD_MISO and DD_SCK must be replaced by the actual data direction bits for these pins. E.g. if MOSI is placed on pin PB5, replace DD_MOSI with DDB5 and DDR_SPI with DDRB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void SPI_MasterInit(void){&lt;br /&gt;
 /* Set MOSI and SCK output, all others input */&lt;br /&gt;
 DDR_SPI = (1&amp;lt;&amp;lt;DD_MOSI)|(1&amp;lt;&amp;lt;DD_SCK);&lt;br /&gt;
 /* Enable SPI, Master, set clock rate fck/16 */&lt;br /&gt;
 SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SPI_MasterTransmit(char cData){&lt;br /&gt;
 /* Start transmission */&lt;br /&gt;
 SPDR = cData;&lt;br /&gt;
 /* Wait for transmission complete */&lt;br /&gt;
 while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dem Beispiel aus dem Atmega328 Manual fehlt (natürlich) noch ein bisschen was. Fassen wir mal zusammen was zu tun ist.&lt;br /&gt;
&lt;br /&gt;
#Die vier I/Os (MISO, MOSI, SCK, /SS) entsprechend Master-Mode setzen. (siehe Tabelle)&lt;br /&gt;
#Die 8 Schalter im SPCR und SPI2X im SPSR setzen.&lt;br /&gt;
#Den globalen Interrupt setzen (SEI). Bräuchte man im Master-Mode eigentlich nicht. Ich gehe auf Nummer sicher und lasse eine Interrupt-Routine zur Kontrolle mitlaufen.&lt;br /&gt;
#Pollen von WCOL&lt;br /&gt;
#Schreiben eines Bytes, evtl. als Unterroutine einer Transferfunktion.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!PinDirection!!Master SPIDirection!!Slave SPI&lt;br /&gt;
|-&lt;br /&gt;
|MOSI||User defined (Output)||Input&lt;br /&gt;
|-&lt;br /&gt;
|MISO||Input||User defined (Output)&lt;br /&gt;
|-&lt;br /&gt;
|SCK||User defined (Output)||Input&lt;br /&gt;
|-&lt;br /&gt;
|SS||User defined (Output or Input)||Input&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Anhand der Tabelle erkennt man, dass man als Nutzer selbst dafür Sorge tragen muss die Richtungen der I/Os richtig zu setzen.&lt;br /&gt;
&lt;br /&gt;
 When the SPI is enabled, the data direction of the MOSI, MISO, SCK, and SS pins is overridden according to the table.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:600px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;SPI Master EEPROM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
// Anschluesse kann man so lassen&lt;br /&gt;
#define DATAOUT 11//MOSI&lt;br /&gt;
#define DATAIN  12//MISO&lt;br /&gt;
#define SPICLOCK  13//sck&lt;br /&gt;
#define SLAVESELECT 10//ss&lt;br /&gt;
&lt;br /&gt;
// Opcodes muessen angepasst werden&lt;br /&gt;
#define MainMemoryPageRead  210 // D2h&lt;br /&gt;
// weitere folgen&lt;br /&gt;
&lt;br /&gt;
byte eeprom_output_data;&lt;br /&gt;
byte eeprom_input_data=0;&lt;br /&gt;
byte clr;&lt;br /&gt;
int address=0;&lt;br /&gt;
&lt;br /&gt;
//data buffer auf Pagegroesze setzen &lt;br /&gt;
char buffer [264];&lt;br /&gt;
&lt;br /&gt;
// die Buffer Obergrenze anpassen&lt;br /&gt;
void fill_buffer(){&lt;br /&gt;
  for (int i=0;i&amp;lt;buffer.length();i++){&lt;br /&gt;
    buffer[i]=0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
char spi_transfer(volatile char data){&lt;br /&gt;
  SPDR = data;                    // Start the transmission&lt;br /&gt;
  while (!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)))  {     // Wait the end of the transmission&lt;br /&gt;
&lt;br /&gt;
  };&lt;br /&gt;
  return SPDR;                    // return the received byte&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//READ EEPROM&lt;br /&gt;
byte read_eeprom(int address){&lt;br /&gt;
  int data;&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
   spi_transfer(READ); //transmit read opcode&lt;br /&gt;
   spi_transfer((char)(address&amp;gt;&amp;gt;8));   //send MSByte address first&lt;br /&gt;
   spi_transfer((char)(address));      //send LSByte address&lt;br /&gt;
   data = spi_transfer(0xFF); //get data byte&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup(){&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
&lt;br /&gt;
  pinMode(DATAOUT, OUTPUT);&lt;br /&gt;
  pinMode(DATAIN, INPUT);&lt;br /&gt;
  pinMode(SPICLOCK,OUTPUT);&lt;br /&gt;
  pinMode(SLAVESELECT,OUTPUT);&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //disable device&lt;br /&gt;
  // SPCR = 01010000&lt;br /&gt;
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,&lt;br /&gt;
  //sample on leading edge of clk,system clock/4 rate (fastest)&lt;br /&gt;
  SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR);&lt;br /&gt;
  clr=SPSR;&lt;br /&gt;
  clr=SPDR;&lt;br /&gt;
&lt;br /&gt;
  delay(10);&lt;br /&gt;
&lt;br /&gt;
  //fill buffer with data&lt;br /&gt;
  fill_buffer();&lt;br /&gt;
 &lt;br /&gt;
 //fill eeprom w/ buffer&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
&lt;br /&gt;
  spi_transfer(WREN); // &lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH);&lt;br /&gt;
&lt;br /&gt;
  delay(10);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(SLAVESELECT,LOW);&lt;br /&gt;
  spi_transfer(WRITE); //write instruction&lt;br /&gt;
  address=0;&lt;br /&gt;
  spi_transfer((char)(address&amp;gt;&amp;gt;8));   //send MSByte address first&lt;br /&gt;
  spi_transfer((char)(address));      //send LSByte address&lt;br /&gt;
  //write 128 bytes&lt;br /&gt;
  for (int i=0;i&amp;lt;128;i++){&lt;br /&gt;
    spi_transfer(buffer[i]); //write data byte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(SLAVESELECT,HIGH); //release chip&lt;br /&gt;
  //wait for eeprom to finish writing&lt;br /&gt;
&lt;br /&gt;
  delay(3000);&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&#039;h&#039;,BYTE);&lt;br /&gt;
  Serial.print(&#039;i&#039;,BYTE);&lt;br /&gt;
  Serial.print(&#039;\n&#039;,BYTE);//debug&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){&lt;br /&gt;
  eeprom_output_data = read_eeprom(address);&lt;br /&gt;
  Serial.print(eeprom_output_data,DEC);&lt;br /&gt;
  Serial.print(&#039;\n&#039;,BYTE);&lt;br /&gt;
  address++;&lt;br /&gt;
  if (address == 264)&lt;br /&gt;
    address = 0;&lt;br /&gt;
  delay(500); //pause for readability&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beispiel 2===&lt;br /&gt;
Für meinen Test habe ich es mir etwas einfacher gemacht und die SPI-Library benutzt. Ich habe soweit alles kommentiert. &lt;br /&gt;
Die nächsten Erweiterungen wären vielleicht:&lt;br /&gt;
#Weitere Opcodes&lt;br /&gt;
#Tastencodes interpretieren und daraus den Index auf das Opcode-Array bestimmen&lt;br /&gt;
#define DEBUG&lt;br /&gt;
#erweitern des Opcode-Arrays, nicht nur Transferlänge, sondern &amp;quot;richtige&amp;quot; Aufteilung Opcode,&amp;lt;Adresse&amp;gt;,Antwort -&amp;gt;Gesamttransferlaenge daraus berechnen&lt;br /&gt;
#Buffer an Gesamtlaenge anpassen&lt;br /&gt;
#Interpretieren des Status und Ausgabe in Klartext&lt;br /&gt;
#Aufforderung zur Eingabe&lt;br /&gt;
#Hilfetext beim Start im Terminal&lt;br /&gt;
#Begrenzen der Ausgabe auf die Nutzbytes&lt;br /&gt;
#... &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:1000px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;SPI Master EEPROM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include&amp;lt;SPI.h&amp;gt;                             //Library fuer SPI&lt;br /&gt;
&lt;br /&gt;
#define MAXCOMBYTES 10&lt;br /&gt;
&lt;br /&gt;
//AT45DB081D Standard parts are shipped with the page size set to 264-bytes. The user is able to configure these parts to a 256-byte page size if desired&lt;br /&gt;
unsigned char opcodes[][2]={&lt;br /&gt;
{215,2}, // D7 Status Register Read&lt;br /&gt;
{159,4} // 9F Manufacturer and Device Read&lt;br /&gt;
};&lt;br /&gt;
unsigned char serialBuffer[MAXCOMBYTES];&lt;br /&gt;
&lt;br /&gt;
byte index=0;&lt;br /&gt;
&lt;br /&gt;
const int slaveSelectPin = 10;            // /SS bzw /CS ist an PIN 10 (PB2) angeschlossen&lt;br /&gt;
&lt;br /&gt;
void setup (void){&lt;br /&gt;
  Serial.begin(115200);                   // Serielle Kommunikation vorbereiten&lt;br /&gt;
  Serial.println(&amp;quot;Master to EEPROM&amp;quot;);     // schon mal was ausgeben, dass man sieht das es lebt&lt;br /&gt;
&lt;br /&gt;
  SPI.begin();                            // SPI Kommunikation vorbereiten&lt;br /&gt;
  SPI.setClockDivider(SPI_CLOCK_DIV8);    // Da das EEPROM bis 66 MHz verträgt kann man hier nix falsch machen (16/8=2Mhz)&lt;br /&gt;
  pinMode(slaveSelectPin,OUTPUT);         // ist nicht notwendig wird in SPI.begin erledigt&lt;br /&gt;
  digitalWrite(slaveSelectPin,HIGH);      // den SPI Slave &amp;quot;abschalten&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void){&lt;br /&gt;
  byte j; //Laufvariable keine weitere Bedeutung&lt;br /&gt;
  //char *hexbyte=&amp;quot;abcdefghij&amp;quot;; // in C++ nicht erlaubt&lt;br /&gt;
  char outstr[5];  // outstr als pointer auf einen string nach dem Muster &#039;0X## &#039;&lt;br /&gt;
  byte serialIncomingByte = 0; // zum Einlesen der Tastatureingaben ueber die serielle Schnittstelle&lt;br /&gt;
  byte transferlength = 0; // Gesamtlaenge der Uebertragung OpCode+&amp;lt;Adresse&amp;gt;+Antwort&lt;br /&gt;
&lt;br /&gt;
  if (Serial.available() &amp;gt; 0) { // nur reagieren wenn eine Taste im seriellen Terminal gedrueckt wurde&lt;br /&gt;
    serialIncomingByte = Serial.read(); // einlesen der Taste, derzeit nur 1 und 2 erlaubt&lt;br /&gt;
    sprintf(outstr,&amp;quot;%d &amp;quot;,serialIncomingByte);&lt;br /&gt;
    Serial.println(outstr);&lt;br /&gt;
&lt;br /&gt;
    for (index=0;index&amp;lt;MAXCOMBYTES;index++){&lt;br /&gt;
      serialBuffer[index]=&#039;\0&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (serialIncomingByte==49){ // Taste 1 gedrueckt&lt;br /&gt;
      serialBuffer[0]=opcodes[0][0];&lt;br /&gt;
      transferlength=opcodes[0][1];&lt;br /&gt;
    }&lt;br /&gt;
    if (serialIncomingByte==50){ // Taste 2 gedrueckt&lt;br /&gt;
      serialBuffer[0]=opcodes[1][0];&lt;br /&gt;
      transferlength=opcodes[1][1];&lt;br /&gt;
    }&lt;br /&gt;
    Serial.print(&amp;quot;Gesendet: &amp;quot;);&lt;br /&gt;
    for(j=0;j&amp;lt;MAXCOMBYTES;j++){&lt;br /&gt;
      sprintf(outstr,&amp;quot;0x%02X &amp;quot;,serialBuffer[j]);&lt;br /&gt;
      Serial.print(outstr);&lt;br /&gt;
    }&lt;br /&gt;
    Serial.println();&lt;br /&gt;
    digitalWrite(slaveSelectPin,LOW);&lt;br /&gt;
    SPI.transfer(serialBuffer,transferlength);&lt;br /&gt;
    digitalWrite(slaveSelectPin,HIGH);&lt;br /&gt;
&lt;br /&gt;
    Serial.print(&amp;quot;Empfangen: &amp;quot;);&lt;br /&gt;
    for(j=0;j&amp;lt;MAXCOMBYTES;j++){&lt;br /&gt;
      sprintf(outstr,&amp;quot;0x%02X &amp;quot;,serialBuffer[j]);&lt;br /&gt;
      Serial.print(outstr);&lt;br /&gt;
    }&lt;br /&gt;
    Serial.println();&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe nach betätigen der Tasten 2 und 1:&lt;br /&gt;
 Gesendet: 0x9F 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;
 Empfangen: 0x9F 0x1F 0x25 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;
 Gesendet: 0xD7 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;
 Empfangen: 0xD7 0xA4 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot PulseView SPI EEPROM 1.png|x100px]]&lt;br /&gt;
[[Datei:Screenshot PulseView SPI EEPROM 2.png|x100px]]&lt;br /&gt;
&lt;br /&gt;
Aus der Statusmeldung kann man ablesen, dass das EEPROM im 264-Byte-PageSize-Modus (Bit 0 = 0) arbeitet. Das erklärt vielleicht auch warum in den Beispielen von .org die 8 Byte zu Beginn jeder Page fehlen, wenn das verwendete EEPROM im 256-Byte Modus gearbeitet hat. Ob die Steuerung, dieses ausliest und darauf regiert muss ich noch feststellen. (Bug or Feature?)&lt;br /&gt;
&lt;br /&gt;
==Arduino als SPI-Slave==&lt;br /&gt;
&lt;br /&gt;
 In SPI slave mode, the control logic will sample the incoming signal of the SCK pin. To ensure correct sampling of the clock signal, the minimum low and high periods should be:Low periods: Longer than 2 CPU clock cycles.High periods: Longer than 2 CPU clock cycles.&lt;br /&gt;
&lt;br /&gt;
Diese Aussage macht mir noch etwas Sorgen. Ich habe die Taktrate am SCK noch nicht an der Steuerung nachgemessen. Der eingesetzte AT45DB081D verträgt Frequenzen bis 66 MHz. Damit wäre der Atmega völlig überfordert. Allerdings bezieht sich diese Angabe auf lesenden Zugriff. Im SPI-Slave-Betrieb will ich ja die schreibenden Zugriffe der Steuerung entgegnehmen. Will ich mal hoffen, dass die Steuerung es eher gemächlich mag. Dass es bei hobbyelektronik.org scheinbar mit einem ATmega328 geklappt hat, lässt hoffen.&lt;br /&gt;
&lt;br /&gt;
Wie weiter oben bereits erwähnt. Habe ich nachgemessen und den Takt der Steuerung mit 200 kHz festgestellt. Also ist die Geschwindigkeit des Arduino völlig ausreichend. Man könnte sogar auf die SPI-Schnittstelle verzichten.&lt;br /&gt;
&lt;br /&gt;
===Sniffing-Mode===&lt;br /&gt;
&lt;br /&gt;
====1. Versuch====&lt;br /&gt;
&lt;br /&gt;
Bei diesem Versuch erzeugt sich der Mikrocontroller sein SlaveSelect selbst. Der SS (PIN10) wird auf einen anderen Output-Pin verbunden, der vom Programm nach bestimmen Kriterien geschaltet wird.&lt;br /&gt;
&lt;br /&gt;
Programmablauf:&lt;br /&gt;
*warte auf eine Lücke (SCK low), die länger als 88 ms (&amp;lt; 146 ms) dauert.&lt;br /&gt;
*setzte den Pseudo-SS auf low.&lt;br /&gt;
*lese SPI&lt;br /&gt;
*Endlosschleife&lt;br /&gt;
&lt;br /&gt;
Das Warten auf die Lücke kann man sich vermutlich sogar ganz sparen. Da die Bytesequenz &#039;AA 55 55 AA&#039; einen Datensatz ankündigt kann man man ein SPI-Dauerlesen einrichten und warten bis die Startsequenz &amp;quot;vorbeikommt&amp;quot; und alle nachfolgenden Bytes in den Puffer schreiben. Ein Lücke, die dann länger als 10 ms ist gibt den Trigger zur Verarbeitung. Sollten die 10 ms zur Verarbeitung nicht ausreichen könnte man den EEPROM-SS als Trigger nehmen. Wenn also EEPROM-SS kommt, SPI anhalten und die Verarbeitung starten. Dann hätte man 88 ms zur Verarbeitung, das sollte für den ersten Versuch reichen.&lt;br /&gt;
&lt;br /&gt;
=====Verdeutlichung=====&lt;br /&gt;
&lt;br /&gt;
Der ATmega soll als Interface zwischen dem SPI-Port der SunGoSXL und einer seriellen Verbindung (auch über SER2USB-Adapter an USB) eines Auswerte-Systems (Raspi, PC, ...) dienen.&lt;br /&gt;
Dazu sind im Wesentlichen 2 Programmroutinen notwendig. Eine Sniffer-Routine, die die SPI-Daten aufnimmt und in einem Puffer ablegt und eine zweite Routine die regelmäßig (Sekundentakt?) die Pufferdaten über die serielle Schnittstelle weiterreicht. Die Aufnahme und Abgabe sind leicht zu implementieren, das passende Timing ist eine Herausforderung. Da ich keine Lust habe, das ganze in Assembler zu schreiben, da hätte ich ja die volle Kontrolle über die Timer und Interruptabläufe, wollte ich doch bei C bleiben. Das Problem sei kurz geschildert. Sobald man mehr als eine Library benutzt hat man kaum noch eine Kontrolle über die Nutzung der Hardwareresourcen eines Mikrocontrollers. Vorausgesetzt, die Libraries sind sauber implementiert wird aber durch das harmonische Nebeneinander automatisch eine Programm-Overhead (oft über 80%) erzeugt, der Echtzeitanwendungen das Leben schwer macht. Ein Methode, die ich schon praktiziert habe ist, den Code per C zu erzeugen und dann den daraus gewonnen Assembler-Code zu bereinigen. Das erspart das mühsame Assembler from the scratch.&lt;br /&gt;
&lt;br /&gt;
Also was ist zu tun?&lt;br /&gt;
&lt;br /&gt;
Grob gesagt haben wir im Sekundentakt (bietet sich durch das EEPROM-CS an) insgesamt x Pakete einzulesen, in den Puffer zu schreiben und seriell auszugeben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sungo Gesamtpakete Timing.png|800px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Sungo Gesamtpakete Tabelle.png|500px]]&lt;br /&gt;
&lt;br /&gt;
===Emulator-Mode===&lt;br /&gt;
&lt;br /&gt;
Diese Version verfogle ich erst weiter, sobald der Sniffing-Mode kein befriedigendes Ergebnis liefert.&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&lt;br /&gt;
https://github.com/chris-heo/pirozeda&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Socat_%26_Co.&amp;diff=5196</id>
		<title>Socat &amp; Co.</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Socat_%26_Co.&amp;diff=5196"/>
		<updated>2026-07-31T15:53:22Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erfahrungen mit socat, nc (netcat) und ser2net. Motivation fuer diese Zusammenstellung war die Notwendigkeit Sensoren, bzw. Devices (TUL (EIB/KNX), Buderus Logamatic, Schmidt Holzofensteuerung, Wagner Sungo Solarthermie, ELV Wetterstation, Hörmann SupraMatic Garagentorantrieb, Tuercommander (Eigenbau), ELV Keymatic, Abus,  und, und, und) an FHEM anzuschlieszen. Die Kabelage im Haus hatte ueberhand genommen und da meine CISCO-Switches noch einige Ports frei hatten waren schnell ein paar Atoms, PIs und Arduinos angschlossen. Um jetzt aber die Peripherie der Satelliten an FHEM anzuheften mussten die meist seriellen Adapter irgendwie dem Server mit FHEM zugänglich gemacht werden. Die o.g. drei Programme erfüllen bisher genau meine Vorstellungen. Leider konnte fhem2fhem mich nicht überzeugen. Die Baustelle FHEM auf dem zentralen Hausserver ist nach wie vor groß genug;-) &lt;br /&gt;
&lt;br /&gt;
Die Inbetriebnahme der socat/nc/ser2net-Scripte dauerte nur einen Tag. Probleme macht noch die Stabilitaet. Der Stresstest für das (Gesamt-)System ist auch noch nicht ausgearbeitet.  &lt;br /&gt;
&lt;br /&gt;
Derzeitiger Einsatz von Socat und nc (netcat):&lt;br /&gt;
Auf meinen Server läuft fhem. Fhem auf dem Interfacerechner oder Fritzbox oder Raspi oder .. laufen zu lassen ist für mich keine Option. Es sprechen einige Dinge wie Performance, zentrale Datenhaltung, Administrationaufwand dagegen.&lt;br /&gt;
Auf dem Interface-Rechner [[FHEM-GW|fhem-gw (IP 192.168.178.XX)]] laufen derzeit 3 Interfaces + die Tuerklingel. Die 3 Interfaces werden über nc dem Server übergeben. Auf dem IPC läuft nc im Server-Modus auf Port 3333. (nc -lk 3333 &amp;amp; oder nc -lk 3333 | /bin/bash &amp;amp;)&lt;br /&gt;
So ist es dann möglich die Klingel von jedem Rechner aus dem Netzwerk mit folgendem Kommando zu starten: &lt;br /&gt;
 /usr/bin/netcat 192.168.178.12 3333 &amp;lt; /opt/fhem_resources/tuerklingel.cmd &amp;gt;result.txt. &lt;br /&gt;
In tuerklingel.cmd steht aplay /fhem_resources/Assembly.wav. Da alles was in tuerklingel.cmd steht in der bash auf dem IPC ausgeführt wird, besteht hier natuerlich ein Sicherheitsrisiko, welches noch Beachtung finden sollte.&lt;br /&gt;
&lt;br /&gt;
Zum Weiterreichen der 3 Interfaces wird ser2net benutzt: Auf Port 2001 in die Buderus Logamatic angebunden, 2002 der TPUART für den EIB, auf 2003 der CUL für die 868 MHz Kommunikation und auf 2004 ein FH1000PC ebenfalls für 868 MHz Kommunikation. Das FHZ1000PC-Funkinterface wird eigentlich nicht mehr benötigt. Werde ich wohl demnächst mal auf 433MHz umbauen um vielleicht die Schaltsteckdosen zu bedienen.&lt;br /&gt;
Die Konfigurationsdatei ist /etc/ser2net.conf.&lt;br /&gt;
&lt;br /&gt;
Jedes Kapitel beginnt jeweils mit der Eroerterung der Manpage. Im Anschluss folgen meine eigenen ausdokumentierten Konfigurationsdateien als Beispiele.&lt;br /&gt;
&lt;br /&gt;
Was ich mal noch probieren muss:&lt;br /&gt;
&lt;br /&gt;
 - PuTTY starten (IP, Port bzw. raw als Verbindung angeben)&lt;br /&gt;
 - auf der seriellen Schnittstelle ein beliebiges Terminalprogramm starten&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
[https://tibbo.com/ Tibbo]&lt;br /&gt;
&lt;br /&gt;
[http://www.dihav.com/view.php?id=serialterminal]&lt;br /&gt;
&lt;br /&gt;
[http://com0com.sourceforge.net/]&lt;br /&gt;
&lt;br /&gt;
== socat ==&lt;br /&gt;
&lt;br /&gt;
Was sagt die Man-Page (man socat der Version 1.7.3.1):&lt;br /&gt;
&lt;br /&gt;
=== NAME ===&lt;br /&gt;
      socat - Multipurpose relay (SOcket CAT)&lt;br /&gt;
&lt;br /&gt;
Also auf deutsch ein &amp;quot;Vielzweck-Relais&amp;quot;, oder besser vielleicht eine Allzweck-Übermittlungsstation.&lt;br /&gt;
Der Sinn erschließt sich im Deutschen aus der Beschreibung allerdings immer noch nicht vollständig.&lt;br /&gt;
 &lt;br /&gt;
Socat ist ein Portmanteau (Kontamination) aus SOcket und CAT.&lt;br /&gt;
Die beiden Ursprungsworte sind dem geübten Unixer wohl bekannt.&lt;br /&gt;
Hier eine (Wiki-)Kurzdefinition.&lt;br /&gt;
&lt;br /&gt;
[https://de.wikipedia.org/wiki/Socket_(Software) Socket] Ein Socket (von engl. Sockel, Steckverbindung oder Steckdose) ist ein vom Betriebssystem bereitgestelltes Objekt, das als Kommunikationsendpunkt dient. Ein Programm verwendet Sockets, um Daten mit anderen Programmen auszutauschen. Das andere Programm kann sich dabei auf demselben Computer (Interprozesskommunikation) oder einem anderen, via Netzwerk erreichbaren Computer befinden. Die Kommunikation über Sockets erfolgt in der Regel bidirektional, das heißt, über das Socket können Daten sowohl empfangen als auch gesendet werden.&lt;br /&gt;
&lt;br /&gt;
[http://www.linfo.org/cat.html cat] cat ist einer der am meisten genutzten Befehle auf Unix-ähnlichen Betriebssystemen. Er hat im Wesentlichen drei Aufgaben in Bezug zu Textdateien: sie anzuzeigen, sie zu kombinieren oder neue zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
Betrachtet man sich nun die socat-Syntax entwickelt man langsam eine Vorstellung wozu socat dienlich sein kann.&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS === &lt;br /&gt;
(Zusammenfassung)&lt;br /&gt;
&lt;br /&gt;
       socat [options] &amp;lt;address&amp;gt; &amp;lt;address&amp;gt;&lt;br /&gt;
       socat -V&lt;br /&gt;
       socat -h[h[h]] | -?[?[?]]&lt;br /&gt;
       filan&lt;br /&gt;
       procan&lt;br /&gt;
&lt;br /&gt;
Abgesehen von der Tatsache, dass in der ersten der fünf Zeilen das Wichtigste zum richtigen Gebrauch beschrieben steht, erkennt man, dass zu dem socat-Softwarepaket noch zwei weitere Programme, filan und procan, gehören.&lt;br /&gt;
Auf diese wird weiter unten noch eingegangen.&lt;br /&gt;
&lt;br /&gt;
Das linuxUSER-Magazin beschreibt socat in der Ausgabe 04.2014 wie folgt:&lt;br /&gt;
 Socket Cat oder kurz Socat ermöglicht das Einrichten bidirektionaler Verbindungen zwischen zwei Systemen. Dabei reicht das Spektrum von der einfachen Datenübertragung bis hin zum Streamen großer Datenmengen. So eignet sich das Tool beispielsweise für schlichte TCP-Weiterleitungen ebenso wie als Relaying-Lösung zwischen IPv6 und IPv4. Auch als SSL-Wrapper auf Server- oder Client-Seite kommt Socat infrage, wenn der umzuleitende Dienst nicht SSL-fähigist. In Kombination mit Chroot lassen sich so sichere Umgebungen gestalten. Sowohl die umfangreiche Manpage als auch die Webseite des Projekts bieten dafür inspirierende Beispiele. &lt;br /&gt;
&lt;br /&gt;
 Der Verbindungsaufbauerfolgt bei Socat in vier Stufen, beginnend mit dem Auswertender übergebenen Kommandozeilenparameter. Es folgt der Verbindungsaufbau,dessen erfolgreichen Abschluss Socat abwartet. Dann fährt es mit der Verarbeitung fort. Steht die Verbindung, lassen sich Daten in beide Richtungen übertragen.Sobald eines der Systeme ein EOFSignal sendet, baut Socat die Verbindung ab. Die gesamte Konfiguration erfolgt über Parameter,eine Konfigurationsdatei kennt das Tool nicht.Da es neben den Verbindungsoptionen zahlreiche weitere Einstellungen unterstützt,wie etwa Blockgröße,Timeout oder Debugging,empfiehlt es sich, Socat via Skript aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Ab der Reihe nach.&lt;br /&gt;
&lt;br /&gt;
=== DESCRIPTION === &lt;br /&gt;
(noch ins Deutsche zu übersetzen)&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;Socat&#039;&#039;&#039;  is  a command line based utility that establishes two bidirectional byte streams and transfers data between them. Because the streams can&lt;br /&gt;
       be constructed from a large set of different types of data sinks and sources (see address types), and because lots of  address  options  may  be&lt;br /&gt;
       applied to the streams, socat can be used for many different purposes.&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;Filan&#039;&#039;&#039;  is  a  utility that prints information about its active file descriptors to stdout. It has been written for debugging socat, but might be&lt;br /&gt;
       useful for other purposes too. Use the -h option to find more infos.&lt;br /&gt;
&lt;br /&gt;
       &#039;&#039;&#039;Procan&#039;&#039;&#039; is a utility that prints information about process parameters to stdout. It has been written to better understand some UNIX process prop-&lt;br /&gt;
       erties and for debugging socat, but might be useful for other purposes too.&lt;br /&gt;
&lt;br /&gt;
       The &#039;&#039;&#039;life cycle&#039;&#039;&#039; of a socat instance typically consists of four phases:&lt;br /&gt;
&lt;br /&gt;
       - In the &#039;&#039;&#039;init phase&#039;&#039;&#039;, the command line options are parsed and logging is initialized.&lt;br /&gt;
       - During  the  &#039;&#039;&#039;open phase&#039;&#039;&#039;, socat opens the first address and afterwards the second address. These steps are usually blocking; thus, especially for&lt;br /&gt;
       complex address types like socks, connection requests or authentication dialogs must be completed before the next step is started.&lt;br /&gt;
       - In the &#039;&#039;&#039;transfer phase&#039;&#039;&#039;, socat watches both streams’ read and write file descriptors via select() , and, when data is available on  one  side  and&lt;br /&gt;
       can  be  written  to  the  other side, socat reads it, performs newline character conversions if required, and writes the data to the write file&lt;br /&gt;
       descriptor of the other stream, then continues waiting for more data in both directions.&lt;br /&gt;
       - When one of the streams effectively reaches EOF, the &#039;&#039;&#039;closing phase&#039;&#039;&#039; begins. Socat transfers the EOF condition to the other stream, i.e. tries  to&lt;br /&gt;
       shutdown  only  its  write  stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other&lt;br /&gt;
       direction, but then closes all remaining channels and terminates.&lt;br /&gt;
&lt;br /&gt;
=== OPTIONS ===&lt;br /&gt;
&lt;br /&gt;
Die Nennung der (speziellen) Optionen -V, -h[h[h]] und -?[?[?]] (s.o.) ist nur dadurch begründet, dass diese ohne die oblogatorischen Adressbezeichner auskommen.&lt;br /&gt;
Kleiner Hinweis am Rande: Angaben in [] sind optional also wahlfrei/nicht zwingend und Angaben in &amp;lt;&amp;gt; sind obligatorisch also verpflichtend/zwingend.&lt;br /&gt;
Leider konnte ich keine entsprechende Erläuterung auf der [https://de.wikipedia.org/wiki/Manpage Wiki-Seite] finden.  &lt;br /&gt;
   &lt;br /&gt;
   Socat provides some command line options that modify the behaviour of&lt;br /&gt;
   the program. They have nothing to do with so called address options&lt;br /&gt;
   that are used as parts of address specifications.&lt;br /&gt;
&lt;br /&gt;
Socat stellt einige (24) Kommandozeilenoptionen bereit, die das Verhalten des Programms beeinflussen.&lt;br /&gt;
Diese haben nichts mit den (sogenannten) Adressoptionen zu tun, die weiter unten bei den Adressangaben erläutert werden. &lt;br /&gt;
Aus Gründen der besseren Übersicht sind Mehrfachnennungen der Optionen -h oder -? und -d jeweils in einer Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nr !! Option !! Originaltext !! Übersetzung/Erläuterung Beispiele zu jeder Option finden sich im Anschluss an die Tabelle &lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;-V&#039;&#039;&#039; || Print version and available feature information to stdout, and exit. || Gibt die Versionsnummer und eine Übersicht über die (einkompilierten) Möglichkeiten auf die Standardausgabe (idR der Bildschirm) aus und endet.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;-h[h[h]] bzw. -?[?[?]]&#039;&#039;&#039;  || Print a help text to stdout describing command line options and available address types, and exit. (2x) Like −h, plus a list of the short names of all available address options. Some options are platform dependend, so this output is helpful for checking the particular implementation. (3x) Like −hh, plus a list of all available address option names. || Gibt den Hilfetext des Programms aus. Das Mehrfachnenen der Option erweiter den Hilfetext noch um mögliche Kurznamen und mögliche Adressoptionen.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;-d[d[d[d]]]&#039;&#039;&#039; || Without this option, only fatal and error messages are generated; applying this option also prints warning messages. See DIAGNOSTICS for more information. (2x) Prints fatal, error, warning, and notice messages. (3x) Prints fatal, error, warning, notice, and info messages. (4x) Prints fatal, error, warning, notice, info, and debug messages. || &lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;-D&#039;&#039;&#039; || Logs information about file descriptors before starting the transfer phase. ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;−ly[&amp;lt;facility&amp;gt;&#039;&#039;&#039;] || Writes messages to syslog instead of stderr; severity as defined with −d option. With optional &amp;lt;facility&amp;gt;, the syslog type can be selected, default is &amp;quot;daemon&amp;quot;. Third party libraries might not obey this option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &#039;&#039;&#039;−lf &amp;lt;logfile&amp;gt;&#039;&#039;&#039; || Writes messages to &amp;lt;logfile&amp;gt; [filename] instead of stderr. Some third party libraries, in particular libwrap, might not obey this option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &#039;&#039;&#039;-ls&#039;&#039;&#039; || Writes messages to stderr (this is the default). Some third party libraries might not obey this option, in particular libwrap appears to only log to syslog. ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &#039;&#039;&#039;−lp&amp;lt;progname&amp;gt;&#039;&#039;&#039; || Overrides the program name printed in error messages and used for constructing environment variable names. ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &#039;&#039;&#039;-lu&#039;&#039;&#039; || Extends the timestamp of error messages to microsecond resolution. Does not work when logging to syslog. ||&lt;br /&gt;
|-&lt;br /&gt;
| 10|| &#039;&#039;&#039;−lm[&amp;lt;facility&amp;gt;]&#039;&#039;&#039; || Mixed log mode. During startup messages are printed to stderr; when socat starts the transfer phase loop or daemon mode (i.e. after opening all streams and before starting data transfer, or, with listening sockets with fork option, before the first accept call), it switches logging to syslog. With optional &amp;lt;facility&amp;gt;, the syslog type can be selected, default is &amp;quot;daemon&amp;quot;. ||&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &#039;&#039;&#039;−lh&#039;&#039;&#039; || Adds hostname to log messages. Uses the value from environment variable HOSTNAME or the value retrieved with uname() if HOSTNAME is not set. ||&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &#039;&#039;&#039;−v&#039;&#039;&#039; || Writes the transferred data not only to their target streams, but also to stderr. The output format is text with some conversions for readability, and prefixed with &amp;quot;&amp;gt; &amp;quot; or &amp;quot;&amp;lt; &amp;quot; indicating flow directions. ||&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &#039;&#039;&#039;-x&#039;&#039;&#039; || Writes the transferred data not only to their target streams, but also to stderr. The output format is hexadecimal, prefixed with &amp;quot;&amp;gt; &amp;quot; or &amp;quot;&amp;lt; &amp;quot; indicating flow directions. Can be combined with −v . ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &#039;&#039;&#039;−b&amp;lt;size&amp;gt;&#039;&#039;&#039; || Sets the data transfer block &amp;lt;size&amp;gt; [size_t]. At most &amp;lt;size&amp;gt; bytes are transferred per step. Default is 8192 bytes. ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || &#039;&#039;&#039;-s&#039;&#039;&#039; || By default, socat terminates when an error occurred to prevent the process from running when some option could not be applied. With this option, socat is sloppy with errors and tries to continue. Even with this option, socat will exit on fatals, and will abort connection attempts when security checks failed. ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || &#039;&#039;&#039;−t&amp;lt;timeout&amp;gt;&#039;&#039;&#039; || When one channel has reached EOF, the write part of the other channel is shut down. Then, socat waits &amp;lt;timeout&amp;gt; [timeval] seconds before terminating. Default is 0.5 seconds. This timeout only applies to addresses where write and read part can be closed independently. When during the timeout interval the read part gives EOF, socat terminates without awaiting the timeout. ||&lt;br /&gt;
|-&lt;br /&gt;
| 17 || &#039;&#039;&#039;−T&amp;lt;timeout&amp;gt;&#039;&#039;&#039; || Total inactivity timeout: when socat is already in the transfer loop and nothing has happened for &amp;lt;timeout&amp;gt; [timeval] seconds (no data arrived, no interrupt occurred...) then it terminates. Useful with protocols like UDP that cannot transfer EOF.&lt;br /&gt;
|-&lt;br /&gt;
| 18 || &#039;&#039;&#039;-u&#039;&#039;&#039; || Uses unidirectional mode. The first address is only used for reading, and the second address is only used for writing (example). ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || &#039;&#039;&#039;-U&#039;&#039;&#039; || Uses unidirectional mode in reverse direction. The first address is only used for writing, and the second address is only used for reading. ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &#039;&#039;&#039;-g&#039;&#039;&#039; || During address option parsing, don’t check if the option is considered useful in the given address environment. Use it if you want to force, e.g., appliance of a socket option to a serial device. ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || &#039;&#039;&#039;−L&amp;lt;lockfile&amp;gt;&#039;&#039;&#039; ||    If lockfile exists, exits with error. If lockfile does not exist, creates it and continues, unlinks lockfile on exit. ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || &#039;&#039;&#039;−W&amp;lt;lockfile&amp;gt;&#039;&#039;&#039; || If lockfile exists, waits until it disappears. When lockfile does not exist, creates it and continues, unlinks lockfile on exit. ||&lt;br /&gt;
|-&lt;br /&gt;
| 23 || &#039;&#039;&#039;−4&#039;&#039;&#039; || Use IP version 4 in case that the addresses do not implicitly or explicitly specify a version; this is the default. ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || &#039;&#039;&#039;−6&#039;&#039;&#039; || Use IP version 6 in case that the addresses do not implicitly or explicitly specify a version. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ADDRESS SPECIFICATIONS ===&lt;br /&gt;
&lt;br /&gt;
   With the address command line arguments, the user gives socat&lt;br /&gt;
   instructions and the necessary information for establishing the byte&lt;br /&gt;
   streams.&lt;br /&gt;
&lt;br /&gt;
   An address specification usually consists of an address type keyword,&lt;br /&gt;
   zero or more required address parameters separated by ’:’ from the&lt;br /&gt;
   keyword and from each other, and zero or more address options separated&lt;br /&gt;
   by ’,’.&lt;br /&gt;
&lt;br /&gt;
   The keyword specifies the address type (e.g., TCP4, OPEN, EXEC). For&lt;br /&gt;
   some keywords there exist synonyms (’−’ for STDIO, TCP for TCP4).&lt;br /&gt;
   Keywords are case insensitive. For a few special address types, the&lt;br /&gt;
   keyword may be omitted: Address specifications starting with a number&lt;br /&gt;
   are assumed to be FD (raw file descriptor) addresses; if a ’/’ is found&lt;br /&gt;
   before the first ’:’ or ’,’, GOPEN (generic file open) is assumed.&lt;br /&gt;
&lt;br /&gt;
   The required number and type of address parameters depend on the&lt;br /&gt;
   address type. E.g., TCP4 requires a server specification (name or&lt;br /&gt;
   address), and a port specification (number or service name).&lt;br /&gt;
&lt;br /&gt;
   Zero or more address options may be given with each address. They&lt;br /&gt;
   influence the address in some ways. Options consist of an option&lt;br /&gt;
   keyword or an option keyword and a value, separated by ’=’. Option&lt;br /&gt;
   keywords are case insensitive. For filtering the options that are&lt;br /&gt;
   useful with an address type, each option is member of one option group.&lt;br /&gt;
   For each address type there is a set of option groups allowed. Only&lt;br /&gt;
   options belonging to one of these address groups may be used (except&lt;br /&gt;
   with option −g).&lt;br /&gt;
&lt;br /&gt;
   Address specifications following the above schema are also called&lt;br /&gt;
   single address specifications. Two single addresses can be combined&lt;br /&gt;
   with &amp;quot;!!&amp;quot; to form a dual type address for one channel. Here, the first&lt;br /&gt;
   address is used by socat for reading data, and the second address for&lt;br /&gt;
   writing data. There is no way to specify an option only once for being&lt;br /&gt;
   applied to both single addresses.&lt;br /&gt;
&lt;br /&gt;
   Usually, addresses are opened in read/write mode. When an address is&lt;br /&gt;
   part of a dual address specification, or when option −u or −U is used,&lt;br /&gt;
   an address might be used only for reading or for writing. Considering&lt;br /&gt;
   this is important with some address types.&lt;br /&gt;
&lt;br /&gt;
   With socat version 1.5.0 and higher, the lexical analysis tries to&lt;br /&gt;
   handle quotes and parenthesis meaningfully and allows escaping of&lt;br /&gt;
   special characters. If one of the characters ( { [ ’ is found, the&lt;br /&gt;
   corresponding closing character − ) } ] ’ − is looked for; they may&lt;br /&gt;
   also be nested. Within these constructs, socats special characters and&lt;br /&gt;
   strings : , !! are not handled specially. All those characters and&lt;br /&gt;
   strings can be escaped with \ or within &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== ADDRESS TYPES ===&lt;br /&gt;
&lt;br /&gt;
   This section describes the available address types with their keywords,&lt;br /&gt;
   parameters, and semantics.&lt;br /&gt;
   CREATE:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Opens &amp;lt;filename&amp;gt; with creat() and uses the file descriptor for writing.&lt;br /&gt;
   This address type requires write−only context, because a file opened&lt;br /&gt;
   with creat cannot be read from.&lt;br /&gt;
   Flags like O_LARGEFILE cannot be applied. If you need them use OPEN&lt;br /&gt;
   with options create,create.&lt;br /&gt;
   &amp;lt;filename&amp;gt; must be a valid existing or not existing path. If &amp;lt;filename&amp;gt;&lt;br /&gt;
   is a named pipe, creat() might block; if &amp;lt;filename&amp;gt; refers to a socket,&lt;br /&gt;
   this is an error.&lt;br /&gt;
   Option groups: FD,REG,NAMED&lt;br /&gt;
   Useful options: mode, user, group, unlink−early, unlink−late, append&lt;br /&gt;
   See also: OPEN, GOPEN&lt;br /&gt;
&lt;br /&gt;
   EXEC:&amp;lt;command−line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Forks a sub process that establishes communication with its parent&lt;br /&gt;
   process and invokes the specified program with execvp() .&lt;br /&gt;
   &amp;lt;command−line&amp;gt; is a simple command with arguments separated by single&lt;br /&gt;
   spaces. If the program name contains a ’/’, the part after the last ’/’&lt;br /&gt;
   is taken as ARGV[0]. If the program name is a relative path, the&lt;br /&gt;
   execvp() semantics for finding the program via $PATH apply. After&lt;br /&gt;
   successful program start, socat writes data to stdin of the process and&lt;br /&gt;
   reads from its stdout using a UNIX domain socket generated by&lt;br /&gt;
   socketpair() per default. (example)&lt;br /&gt;
   Option groups: FD,SOCKET,EXEC,FORK,TERMIOS&lt;br /&gt;
   Useful options: path, fdin, fdout, chroot, su, su−d, nofork, pty,&lt;br /&gt;
   stderr, ctty, setsid, pipes, login, sigint, sigquit&lt;br /&gt;
   See also: SYSTEM&lt;br /&gt;
&lt;br /&gt;
   FD:&amp;lt;fdnum&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Uses the file descriptor &amp;lt;fdnum&amp;gt;. It must already exist as valid UN*X&lt;br /&gt;
   file descriptor.&lt;br /&gt;
   Option groups: FD (TERMIOS,REG,SOCKET)&lt;br /&gt;
   See also: STDIO, STDIN, STDOUT, STDERR&lt;br /&gt;
&lt;br /&gt;
   GOPEN:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   (Generic open) This address type tries to handle any file system entry&lt;br /&gt;
   except directories usefully. &amp;lt;filename&amp;gt; may be a relative or absolute&lt;br /&gt;
   path. If it already exists, its type is checked. In case of a UNIX&lt;br /&gt;
   domain socket, socat connects; if connecting fails, socat assumes a&lt;br /&gt;
   datagram socket and uses sendto() calls. If the entry is not a socket,&lt;br /&gt;
   socat opens it applying the O_APPEND flag. If it does not exist, it is&lt;br /&gt;
   opened with flag O_CREAT as a regular file (example).&lt;br /&gt;
   Option groups: FD,REG,SOCKET,NAMED,OPEN&lt;br /&gt;
   See also: OPEN, CREATE, UNIX−CONNECT&lt;br /&gt;
&lt;br /&gt;
   IP−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Opens a raw IP socket. Depending on host specification or option pf, IP&lt;br /&gt;
   protocol version 4 or 6 is used. It uses &amp;lt;protocol&amp;gt; to send packets to&lt;br /&gt;
   &amp;lt;host&amp;gt; [IP address] and receives packets from host, ignores packets&lt;br /&gt;
   from other hosts. Protocol 255 uses the raw socket with the IP header&lt;br /&gt;
   being part of the data.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6&lt;br /&gt;
   Useful options: pf, ttl&lt;br /&gt;
   See also: IP4−SENDTO, IP6−SENDTO, IP−RECVFROM, IP−RECV, UDP−SENDTO,&lt;br /&gt;
   UNIX−SENDTO&lt;br /&gt;
&lt;br /&gt;
   INTERFACE:&amp;lt;interface&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Communicates with a network connected on an interface using raw packets&lt;br /&gt;
   including link level data. &amp;lt;interface&amp;gt; is the name of the network&lt;br /&gt;
   interface. Currently only available on Linux. Option groups: FD,SOCKET&lt;br /&gt;
   Useful options: pf, type&lt;br /&gt;
   See also: ip−recv&lt;br /&gt;
&lt;br /&gt;
   IP4−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−SENDTO, but always uses IPv4.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4&lt;br /&gt;
&lt;br /&gt;
   IP6−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−SENDTO, but always uses IPv6.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6&lt;br /&gt;
&lt;br /&gt;
   IP−DATAGRAM:&amp;lt;address&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sends outgoing data to the specified address which may in particular be&lt;br /&gt;
   a broadcast or multicast address. Packets arriving on the local socket&lt;br /&gt;
   are checked if their source addresses match RANGE or TCPWRAP options.&lt;br /&gt;
   This address type can for example be used for implementing symmetric or&lt;br /&gt;
   asymmetric broadcast or multicast communications.&lt;br /&gt;
   Option groups: FD, SOCKET, IP4, IP6, RANGE&lt;br /&gt;
   Useful options: bind, range, tcpwrap, broadcast, ip−multicast−loop,&lt;br /&gt;
   ip−multicast−ttl, ip−multicast−if, ip−add−membership, ttl, tos, pf&lt;br /&gt;
   See also: IP4−DATAGRAM, IP6−DATAGRAM, IP−SENDTO, IP−RECVFROM, IP−RECV,&lt;br /&gt;
   UDP−DATAGRAM&lt;br /&gt;
&lt;br /&gt;
   IP4−DATAGRAM:&amp;lt;host&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−DATAGRAM, but always uses IPv4. (example)&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,RANGE&lt;br /&gt;
&lt;br /&gt;
   IP6−DATAGRAM:&amp;lt;host&amp;gt;:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−DATAGRAM, but always uses IPv6. Please note that IPv6 does not&lt;br /&gt;
   know broadcasts.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,RANGE&lt;br /&gt;
&lt;br /&gt;
   IP−RECVFROM:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Opens a raw IP socket of &amp;lt;protocol&amp;gt;. Depending on option pf, IP&lt;br /&gt;
   protocol version 4 or 6 is used. It receives one packet from an&lt;br /&gt;
   unspecified peer and may send one or more answer packets to that peer.&lt;br /&gt;
   This mode is particularly useful with fork option where each arriving&lt;br /&gt;
   packet − from arbitrary peers − is handled by its own sub process. This&lt;br /&gt;
   allows a behaviour similar to typical UDP based servers like ntpd or&lt;br /&gt;
   named.&lt;br /&gt;
   Please note that the reply packets might be fetched as incoming traffic&lt;br /&gt;
   when sender and receiver IP address are identical because there is no&lt;br /&gt;
   port number to distinguish the sockets.&lt;br /&gt;
   This address works well with IP−SENDTO address peers (see above).&lt;br /&gt;
   Protocol 255 uses the raw socket with the IP header being part of the&lt;br /&gt;
   data.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,CHILD,RANGE&lt;br /&gt;
   Useful options: pf, fork, range, ttl, broadcast&lt;br /&gt;
   See also: IP4−RECVFROM, IP6−RECVFROM, IP−SENDTO, IP−RECV, UDP−RECVFROM,&lt;br /&gt;
   UNIX−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   IP4−RECVFROM:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−RECVFROM, but always uses IPv4.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,CHILD,RANGE&lt;br /&gt;
&lt;br /&gt;
   IP6−RECVFROM:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−RECVFROM, but always uses IPv6.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,CHILD,RANGE&lt;br /&gt;
&lt;br /&gt;
   IP−RECV:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Opens a raw IP socket of &amp;lt;protocol&amp;gt;. Depending on option pf, IP&lt;br /&gt;
   protocol version 4 or 6 is used. It receives packets from multiple&lt;br /&gt;
   unspecified peers and merges the data. No replies are possible. It can&lt;br /&gt;
   be, e.g., addressed by socat IP−SENDTO address peers. Protocol 255 uses&lt;br /&gt;
   the raw socket with the IP header being part of the data.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,RANGE&lt;br /&gt;
   Useful options: pf, range&lt;br /&gt;
   See also: IP4−RECV, IP6−RECV, IP−SENDTO, IP−RECVFROM, UDP−RECV,&lt;br /&gt;
   UNIX−RECV&lt;br /&gt;
&lt;br /&gt;
   IP4−RECV:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−RECV, but always uses IPv4.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,RANGE&lt;br /&gt;
&lt;br /&gt;
   IP6−RECV:&amp;lt;protocol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like IP−RECV, but always uses IPv6.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,RANGE&lt;br /&gt;
&lt;br /&gt;
   OPEN:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Opens &amp;lt;filename&amp;gt; using the open() system call (example). This operation&lt;br /&gt;
   fails on UNIX domain sockets.&lt;br /&gt;
   Note: This address type is rarly useful in bidirectional mode.&lt;br /&gt;
   Option groups: FD,REG,NAMED,OPEN&lt;br /&gt;
   Useful options: creat, excl, noatime, nofollow, append, rdonly, wronly,&lt;br /&gt;
   lock, readbytes, ignoreeof&lt;br /&gt;
   See also: CREATE, GOPEN, UNIX−CONNECT&lt;br /&gt;
&lt;br /&gt;
   OPENSSL:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Tries to establish a SSL connection to &amp;lt;port&amp;gt; [TCP service] on &amp;lt;host&amp;gt;&lt;br /&gt;
   [IP address] using TCP/IP version 4 or 6 depending on address&lt;br /&gt;
   specification, name resolution, or option pf.&lt;br /&gt;
   NOTE: Up to version 1.7.2.4 the server certificate was only checked for&lt;br /&gt;
   validity against the system certificate store or cafile or capath, but&lt;br /&gt;
   not for match with the server’s name or its IP address. Since version&lt;br /&gt;
   1.7.3.0 socat checks the peer certificate for match with the &amp;lt;host&amp;gt;&lt;br /&gt;
   parameter or the value of the openssl−commonname option. Socat tries to&lt;br /&gt;
   match it against the certificates subject commonName, and the&lt;br /&gt;
   certifications extension subjectAltName DNS names. Wildcards in the&lt;br /&gt;
   certificate are supported.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,OPENSSL,RETRY&lt;br /&gt;
   Useful options: cipher, method, verify, commonname cafile, capath,&lt;br /&gt;
   certificate, key, compress, bind, pf, connect−timeout, sourceport,&lt;br /&gt;
   retry&lt;br /&gt;
   See also: OPENSSL−LISTEN, TCP&lt;br /&gt;
&lt;br /&gt;
   OPENSSL−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Listens on tcp &amp;lt;port&amp;gt; [TCP service]. The IP version is 4 or the one&lt;br /&gt;
   specified with pf. When a connection is accepted, this address behaves&lt;br /&gt;
   as SSL server.&lt;br /&gt;
   Note: You probably want to use the certificate option with this&lt;br /&gt;
   address.&lt;br /&gt;
   NOTE: The client certificate is only checked for validity against&lt;br /&gt;
   cafile or capath, but not for match with the client’s name or its IP&lt;br /&gt;
   address!&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,LISTEN,OPENSSL,CHILD,RANGE,RETRY&lt;br /&gt;
   Useful options: pf, cipher, method, verify, commonname cafile, capath,&lt;br /&gt;
   certificate, key, compress, fork, bind, range, tcpwrap, su, reuseaddr,&lt;br /&gt;
   retry&lt;br /&gt;
   See also: OPENSSL, TCP−LISTEN&lt;br /&gt;
&lt;br /&gt;
   PIPE:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   If &amp;lt;filename&amp;gt; already exists, it is opened. If it does not exist, a&lt;br /&gt;
   named pipe is created and opened. Beginning with socat version 1.4.3,&lt;br /&gt;
   the named pipe is removed when the address is closed (but see option&lt;br /&gt;
   unlink−close&lt;br /&gt;
   Note: When a pipe is used for both reading and writing, it works as&lt;br /&gt;
   echo service.&lt;br /&gt;
   Note: When a pipe is used for both reading and writing, and socat tries&lt;br /&gt;
   to write more bytes than the pipe can buffer (Linux 2.4: 2048 bytes),&lt;br /&gt;
   socat might block. Consider using socat option, e.g., −b 2048&lt;br /&gt;
   Option groups: FD,NAMED,OPEN&lt;br /&gt;
   Useful options: rdonly, nonblock, group, user, mode, unlink−early&lt;br /&gt;
   See also: unnamed pipe&lt;br /&gt;
&lt;br /&gt;
   PIPE&lt;br /&gt;
&lt;br /&gt;
   Creates an unnamed pipe and uses it for reading and writing. It works&lt;br /&gt;
   as an echo, because everything written to it appeares immediately as&lt;br /&gt;
   read data.&lt;br /&gt;
&lt;br /&gt;
   Note: When socat tries to write more bytes than the pipe can queue&lt;br /&gt;
   (Linux 2.4: 2048 bytes), socat might block. Consider, e.g., using&lt;br /&gt;
   option −b 2048&lt;br /&gt;
   Option groups: FD&lt;br /&gt;
   See also: named pipe&lt;br /&gt;
&lt;br /&gt;
   PROXY:&amp;lt;proxy&amp;gt;:&amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Connects to an HTTP proxy server on port 8080 using TCP/IP version 4 or&lt;br /&gt;
   6 depending on address specification, name resolution, or option pf,&lt;br /&gt;
   and sends a CONNECT request for hostname:port. If the proxy grants&lt;br /&gt;
   access and succeeds to connect to the target, data transfer between&lt;br /&gt;
   socat and the target can start. Note that the traffic need not be HTTP&lt;br /&gt;
   but can be an arbitrary protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,HTTP,RETRY&lt;br /&gt;
   Useful options: proxyport, ignorecr, proxyauth, resolve, crnl, bind,&lt;br /&gt;
   connect−timeout, mss, sourceport, retry&lt;br /&gt;
   See also: SOCKS, TCP&lt;br /&gt;
&lt;br /&gt;
   PTY&lt;br /&gt;
&lt;br /&gt;
   Generates a pseudo terminal (pty) and uses its master side. Another&lt;br /&gt;
   process may open the pty’s slave side using it like a serial line or&lt;br /&gt;
   terminal. (example). If both the ptmx and the openpty mechanisms are&lt;br /&gt;
   available, ptmx is used (POSIX).&lt;br /&gt;
&lt;br /&gt;
   Option groups: FD,NAMED,PTY,TERMIOS&lt;br /&gt;
   Useful options: link, openpty, wait−slave, mode, user, group&lt;br /&gt;
   See also: UNIX−LISTEN, PIPE, EXEC, SYSTEM&lt;br /&gt;
&lt;br /&gt;
   READLINE&lt;br /&gt;
&lt;br /&gt;
   Uses GNU readline and history on stdio to allow editing and reusing&lt;br /&gt;
   input lines (example). This requires the GNU readline and history&lt;br /&gt;
   libraries. Note that stdio should be a (pseudo) terminal device,&lt;br /&gt;
   otherwise readline does not seem to work.&lt;br /&gt;
   Option groups: FD,READLINE,TERMIOS&lt;br /&gt;
   Useful options: history, noecho&lt;br /&gt;
   See also: STDIO&lt;br /&gt;
&lt;br /&gt;
   SCTP−CONNECT:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Establishes an SCTP stream connection to the specified &amp;lt;host&amp;gt; [IP&lt;br /&gt;
   address] and &amp;lt;port&amp;gt; [TCP service] using TCP/IP version 4 or 6 depending&lt;br /&gt;
   on address specification, name resolution, or option pf.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,SCTP,CHILD,RETRY&lt;br /&gt;
   Useful options: bind, pf, connect−timeout, tos, mtudiscover,&lt;br /&gt;
   sctp−maxseg, sctp−nodelay, nonblock, sourceport, retry, readbytes&lt;br /&gt;
   See also: SCTP4−CONNECT, SCTP6−CONNECT, SCTP−LISTEN, TCP−CONNECT&lt;br /&gt;
&lt;br /&gt;
   SCTP4−CONNECT:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like SCTP−CONNECT, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,SCTP,CHILD,RETRY&lt;br /&gt;
&lt;br /&gt;
   SCTP6−CONNECT:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like SCTP−CONNECT, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,SCTP,CHILD,RETRY&lt;br /&gt;
&lt;br /&gt;
   SCTP−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Listens on &amp;lt;port&amp;gt; [TCP service] and accepts a TCP/IP connection. The IP&lt;br /&gt;
   version is 4 or the one specified with address option pf, socat option&lt;br /&gt;
   (−4, −6), or environment variable SOCAT_DEFAULT_LISTEN_IP. Note that&lt;br /&gt;
   opening this address usually blocks until a client connects.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,IP6,SCTP,RETRY&lt;br /&gt;
   Useful options: crnl, fork, bind, range, tcpwrap, pf, max−children,&lt;br /&gt;
   backlog, sctp−maxseg, sctp−nodelay, su, reuseaddr, retry, cool−write&lt;br /&gt;
   See also: SCTP4−LISTEN, SCTP6−LISTEN, TCP−LISTEN, SCTP−CONNECT&lt;br /&gt;
&lt;br /&gt;
   SCTP4−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like SCTP−LISTEN, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,SCTP,RETRY&lt;br /&gt;
&lt;br /&gt;
   SCTP6−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like SCTP−LISTEN, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP6,SCTP,RETRY&lt;br /&gt;
&lt;br /&gt;
   SOCKET−CONNECT:&amp;lt;domain&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;remote−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a stream socket using the first and second given socket&lt;br /&gt;
   parameters and SOCK_STREAM (see man socket\(2)) and connects to the&lt;br /&gt;
   remote−address. The two socket parameters have to be specified by int&lt;br /&gt;
   numbers. Consult your OS documentation and include files to find the&lt;br /&gt;
   appropriate values. The remote−address must be the data representation&lt;br /&gt;
   of a sockaddr structure without sa_family and (BSD) sa_len components.&lt;br /&gt;
   Please note that you can − beyond the options of the specified groups −&lt;br /&gt;
   also use options of higher level protocols when you apply socat option&lt;br /&gt;
   −g.&lt;br /&gt;
   Option groups: FD,SOCKET,CHILD,RETRY&lt;br /&gt;
   Useful options: bind, setsockopt−int, setsockopt−bin, setsockopt−string&lt;br /&gt;
   See also: TCP, UDP−CONNECT, UNIX−CONNECT, SOCKET−LISTEN, SOCKET−SENDTO&lt;br /&gt;
&lt;br /&gt;
   SOCKET−DATAGRAM:&amp;lt;domain&amp;gt;:&amp;lt;type&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;remote−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a datagram socket using the first three given socket parameters&lt;br /&gt;
   (see man socket\(2)) and sends outgoing data to the remote−address. The&lt;br /&gt;
   three socket parameters have to be specified by int numbers. Consult&lt;br /&gt;
   your OS documentation and include files to find the appropriate values.&lt;br /&gt;
   The remote−address must be the data representation of a sockaddr&lt;br /&gt;
   structure without sa_family and (BSD) sa_len components.&lt;br /&gt;
   Please note that you can − beyond the options of the specified groups −&lt;br /&gt;
   also use options of higher level protocols when you apply socat option&lt;br /&gt;
   −g.&lt;br /&gt;
   Option groups: FD,SOCKET,RANGE&lt;br /&gt;
   Useful options: bind, range, setsockopt−int, setsockopt−bin,&lt;br /&gt;
   setsockopt−string&lt;br /&gt;
   See also: UDP−DATAGRAM, IP−DATAGRAM, SOCKET−SENDTO, SOCKET−RECV,&lt;br /&gt;
   SOCKET−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   SOCKET−LISTEN:&amp;lt;domain&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;local−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a stream socket using the first and second given socket&lt;br /&gt;
   parameters and SOCK_STREAM (see man socket\(2)) and waits for incoming&lt;br /&gt;
   connections on local−address. The two socket parameters have to be&lt;br /&gt;
   specified by int numbers. Consult your OS documentation and include&lt;br /&gt;
   files to find the appropriate values. The local−address must be the&lt;br /&gt;
   data representation of a sockaddr structure without sa_family and (BSD)&lt;br /&gt;
   sa_len components.&lt;br /&gt;
   Please note that you can − beyond the options of the specified groups −&lt;br /&gt;
   also use options of higher level protocols when you apply socat option&lt;br /&gt;
   −g.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,RANGE,CHILD,RETRY&lt;br /&gt;
   Useful options: setsockopt−int, setsockopt−bin, setsockopt−string&lt;br /&gt;
   See also: TCP, UDP−CONNECT, UNIX−CONNECT, SOCKET−LISTEN, SOCKET−SENDTO,&lt;br /&gt;
   SOCKET−SENDTO&lt;br /&gt;
&lt;br /&gt;
   SOCKET−RECV:&amp;lt;domain&amp;gt;:&amp;lt;type&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;local−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a socket using the three given socket parameters (see man&lt;br /&gt;
   socket\(2)) and binds it to &amp;lt;local−address&amp;gt;. Receives arriving data.&lt;br /&gt;
   The three parameters have to be specified by int numbers. Consult your&lt;br /&gt;
   OS documentation and include files to find the appropriate values. The&lt;br /&gt;
   local−address must be the data representation of a sockaddr structure&lt;br /&gt;
   without sa_family and (BSD) sa_len components.&lt;br /&gt;
   Option groups: FD,SOCKET,RANGE&lt;br /&gt;
   Useful options: range, setsockopt−int, setsockopt−bin,&lt;br /&gt;
   setsockopt−string&lt;br /&gt;
   See also: UDP−RECV, IP−RECV, UNIX−RECV, SOCKET−DATAGRAM, SOCKET−SENDTO,&lt;br /&gt;
   SOCKET−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   SOCKET−RECVFROM:&amp;lt;domain&amp;gt;:&amp;lt;type&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;local−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a socket using the three given socket parameters (see man&lt;br /&gt;
   socket\(2)) and binds it to &amp;lt;local−address&amp;gt;. Receives arriving data and&lt;br /&gt;
   sends replies back to the sender. The first three parameters have to be&lt;br /&gt;
   specified as int numbers. Consult your OS documentation and include&lt;br /&gt;
   files to find the appropriate values. The local−address must be the&lt;br /&gt;
   data representation of a sockaddr structure without sa_family and (BSD)&lt;br /&gt;
   sa_len components.&lt;br /&gt;
   Option groups: FD,SOCKET,CHILD,RANGE&lt;br /&gt;
   Useful options: fork, range, setsockopt−int, setsockopt−bin,&lt;br /&gt;
   setsockopt−string&lt;br /&gt;
   See also: UDP−RECVFROM, IP−RECVFROM, UNIX−RECVFROM, SOCKET−DATAGRAM,&lt;br /&gt;
   SOCKET−SENDTO, SOCKET−RECV&lt;br /&gt;
&lt;br /&gt;
   SOCKET−SENDTO:&amp;lt;domain&amp;gt;:&amp;lt;type&amp;gt;:&amp;lt;protocol&amp;gt;:&amp;lt;remote−address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a socket using the three given socket parameters (see man&lt;br /&gt;
   socket\(2)). Sends outgoing data to the given address and receives&lt;br /&gt;
   replies. The three parameters have to be specified as int numbers.&lt;br /&gt;
   Consult your OS documentation and include files to find the appropriate&lt;br /&gt;
   values. The remote−address must be the data representation of a&lt;br /&gt;
   sockaddr structure without sa_family and (BSD) sa_len components.&lt;br /&gt;
   Option groups: FD,SOCKET&lt;br /&gt;
   Useful options: bind, setsockopt−int, setsockopt−bin, setsockopt−string&lt;br /&gt;
   See also: UDP−SENDTO, IP−SENDTO, UNIX−SENDTO, SOCKET−DATAGRAM,&lt;br /&gt;
   SOCKET−RECV SOCKET−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   SOCKS4:&amp;lt;socks−server&amp;gt;:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Connects via &amp;lt;socks−server&amp;gt; [IP address] to &amp;lt;host&amp;gt; [IPv4 address] on&lt;br /&gt;
   &amp;lt;port&amp;gt; [TCP service], using socks version 4 protocol over IP version 4&lt;br /&gt;
   or 6 depending on address specification, name resolution, or option pf&lt;br /&gt;
   (example).&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,SOCKS4,RETRY&lt;br /&gt;
   Useful options: socksuser, socksport, sourceport, pf, retry&lt;br /&gt;
   See also: SOCKS4A, PROXY, TCP&lt;br /&gt;
&lt;br /&gt;
   SOCKS4A:&amp;lt;socks−server&amp;gt;:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   like SOCKS4, but uses socks protocol version 4a, thus leaving host name&lt;br /&gt;
   resolution to the socks server.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,SOCKS4,RETRY&lt;br /&gt;
&lt;br /&gt;
   STDERR&lt;br /&gt;
&lt;br /&gt;
   Uses file descriptor 2.&lt;br /&gt;
&lt;br /&gt;
   Option groups: FD (TERMIOS,REG,SOCKET)&lt;br /&gt;
   See also: FD&lt;br /&gt;
&lt;br /&gt;
   STDIN&lt;br /&gt;
&lt;br /&gt;
   Uses file descriptor 0.&lt;br /&gt;
&lt;br /&gt;
   Option groups: FD (TERMIOS,REG,SOCKET)&lt;br /&gt;
   Useful options: readbytes&lt;br /&gt;
   See also: FD&lt;br /&gt;
&lt;br /&gt;
   STDIO&lt;br /&gt;
&lt;br /&gt;
   Uses file descriptor 0 for reading, and 1 for writing.&lt;br /&gt;
&lt;br /&gt;
   Option groups: FD (TERMIOS,REG,SOCKET)&lt;br /&gt;
   Useful options: readbytes&lt;br /&gt;
   See also: FD&lt;br /&gt;
&lt;br /&gt;
   STDOUT&lt;br /&gt;
&lt;br /&gt;
   Uses file descriptor 1.&lt;br /&gt;
&lt;br /&gt;
   Option groups: FD (TERMIOS,REG,SOCKET)&lt;br /&gt;
   See also: FD&lt;br /&gt;
&lt;br /&gt;
   SYSTEM:&amp;lt;shell−command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Forks a sub process that establishes communication with its parent&lt;br /&gt;
   process and invokes the specified program with system() . Please note&lt;br /&gt;
   that &amp;lt;shell−command&amp;gt; [string] must not contain ’,’ or &amp;quot;!!&amp;quot;, and that&lt;br /&gt;
   shell meta characters may have to be protected. After successful&lt;br /&gt;
   program start, socat writes data to stdin of the process and reads from&lt;br /&gt;
   its stdout.&lt;br /&gt;
   Option groups: FD,SOCKET,EXEC,FORK,TERMIOS&lt;br /&gt;
   Useful options: path, fdin, fdout, chroot, su, su−d, nofork, pty,&lt;br /&gt;
   stderr, ctty, setsid, pipes, sigint, sigquit&lt;br /&gt;
   See also: EXEC&lt;br /&gt;
&lt;br /&gt;
   TCP:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Connects to &amp;lt;port&amp;gt; [TCP service] on &amp;lt;host&amp;gt; [IP address] using TCP/IP&lt;br /&gt;
   version 4 or 6 depending on address specification, name resolution, or&lt;br /&gt;
   option pf.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,TCP,RETRY&lt;br /&gt;
   Useful options: crnl, bind, pf, connect−timeout, tos, mtudiscover, mss,&lt;br /&gt;
   nodelay, nonblock, sourceport, retry, readbytes&lt;br /&gt;
   See also: TCP4, TCP6, TCP−LISTEN, UDP, SCTP−CONNECT, UNIX−CONNECT&lt;br /&gt;
&lt;br /&gt;
   TCP4:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like TCP, but only supports IPv4 protocol (example).&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,TCP,RETRY&lt;br /&gt;
&lt;br /&gt;
   TCP6:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like TCP, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,TCP,RETRY&lt;br /&gt;
&lt;br /&gt;
   TCP−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Listens on &amp;lt;port&amp;gt; [TCP service] and accepts a TCP/IP connection. The IP&lt;br /&gt;
   version is 4 or the one specified with address option pf, socat option&lt;br /&gt;
   (−4, −6), or environment variable SOCAT_DEFAULT_LISTEN_IP. Note that&lt;br /&gt;
   opening this address usually blocks until a client connects.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,IP6,TCP,RETRY&lt;br /&gt;
   Useful options: crnl, fork, bind, range, tcpwrap, pf, max−children,&lt;br /&gt;
   backlog, mss, su, reuseaddr, retry, cool−write&lt;br /&gt;
   See also: TCP4−LISTEN, TCP6−LISTEN, UDP−LISTEN, SCTP−LISTEN,&lt;br /&gt;
   UNIX−LISTEN, OPENSSL−LISTEN, TCP−CONNECT&lt;br /&gt;
&lt;br /&gt;
   TCP4−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like TCP−LISTEN, but only supports IPv4 protocol (example).&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,TCP,RETRY&lt;br /&gt;
&lt;br /&gt;
   TCP6−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like TCP−LISTEN, but only supports IPv6 protocol.&lt;br /&gt;
   Additional useful option: ipv6only&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP6,TCP,RETRY&lt;br /&gt;
&lt;br /&gt;
   TUN[:&amp;lt;if−addr&amp;gt;/&amp;lt;bits&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
   Creates a Linux TUN/TAP device and optionally assignes it the address&lt;br /&gt;
   and netmask given by the parameters. The resulting network interface is&lt;br /&gt;
   almost ready for use by other processes; socat serves its &amp;quot;wire side&amp;quot;.&lt;br /&gt;
   This address requires read and write access to the tunnel cloning&lt;br /&gt;
   device, usually /dev/net/tun , as well as permission to set some&lt;br /&gt;
   ioctl()s. Option iff−up is required to immediately activate the&lt;br /&gt;
   interface!&lt;br /&gt;
   Option groups: FD,NAMED,OPEN,TUN&lt;br /&gt;
   Useful options: iff−up, tun−device, tun−name, tun−type, iff−no−pi&lt;br /&gt;
   See also: ip−recv&lt;br /&gt;
&lt;br /&gt;
   UDP:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Connects to &amp;lt;port&amp;gt; [UDP service] on &amp;lt;host&amp;gt; [IP address] using UDP/IP&lt;br /&gt;
   version 4 or 6 depending on address specification, name resolution, or&lt;br /&gt;
   option pf.&lt;br /&gt;
   Please note that, due to UDP protocol properties, no real connection is&lt;br /&gt;
   established; data has to be sent for ‘connecting’ to the server, and no&lt;br /&gt;
   end−of−file condition can be transported.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6&lt;br /&gt;
   Useful options: ttl, tos, bind, sourceport, pf&lt;br /&gt;
   See also: UDP4, UDP6, UDP−LISTEN, TCP, IP&lt;br /&gt;
&lt;br /&gt;
   UDP4:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4&lt;br /&gt;
&lt;br /&gt;
   UDP6:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6&lt;br /&gt;
&lt;br /&gt;
   UDP−DATAGRAM:&amp;lt;address&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sends outgoing data to the specified address which may in particular be&lt;br /&gt;
   a broadcast or multicast address. Packets arriving on the local socket&lt;br /&gt;
   are checked for the correct remote port and if their source addresses&lt;br /&gt;
   match RANGE or TCPWRAP options. This address type can for example be&lt;br /&gt;
   used for implementing symmetric or asymmetric broadcast or multicast&lt;br /&gt;
   communications.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,RANGE&lt;br /&gt;
   Useful options: bind, range, tcpwrap, broadcast, ip−multicast−loop,&lt;br /&gt;
   ip−multicast−ttl, ip−multicast−if, ip−add−membership, ttl, tos,&lt;br /&gt;
   sourceport, pf&lt;br /&gt;
   See also: UDP4−DATAGRAM, UDP6−DATAGRAM, UDP−SENDTO, UDP−RECVFROM,&lt;br /&gt;
   UDP−RECV, UDP−CONNECT, UDP−LISTEN, IP−DATAGRAM&lt;br /&gt;
&lt;br /&gt;
   UDP4−DATAGRAM:&amp;lt;address&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−DATAGRAM, but only supports IPv4 protocol (example1,&lt;br /&gt;
   example2).&lt;br /&gt;
   Option groups: FD,SOCKET,IP4, RANGE&lt;br /&gt;
&lt;br /&gt;
   UDP6−DATAGRAM:&amp;lt;address&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−DATAGRAM, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,RANGE&lt;br /&gt;
&lt;br /&gt;
   UDP−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Waits for a UDP/IP packet arriving on &amp;lt;port&amp;gt; [UDP service] and&lt;br /&gt;
   ‘connects’ back to sender. The accepted IP version is 4 or the one&lt;br /&gt;
   specified with option pf. Please note that, due to UDP protocol&lt;br /&gt;
   properties, no real connection is established; data has to arrive from&lt;br /&gt;
   the peer first, and no end−of−file condition can be transported. Note&lt;br /&gt;
   that opening this address usually blocks until a client connects.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4,IP6&lt;br /&gt;
   Useful options: fork, bind, range, pf&lt;br /&gt;
   See also: UDP, UDP4−LISTEN, UDP6−LISTEN, TCP−LISTEN&lt;br /&gt;
&lt;br /&gt;
   UDP4−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−LISTEN, but only support IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP4&lt;br /&gt;
&lt;br /&gt;
   UDP6−LISTEN:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−LISTEN, but only support IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,LISTEN,CHILD,RANGE,IP6&lt;br /&gt;
&lt;br /&gt;
   UDP−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Communicates with the specified peer socket, defined by &amp;lt;port&amp;gt; [UDP&lt;br /&gt;
   service] on &amp;lt;host&amp;gt; [IP address], using UDP/IP version 4 or 6 depending&lt;br /&gt;
   on address specification, name resolution, or option pf. It sends&lt;br /&gt;
   packets to and receives packets from that peer socket only. This&lt;br /&gt;
   address effectively implements a datagram client. It works well with&lt;br /&gt;
   socat UDP−RECVFROM and UDP−RECV address peers.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6&lt;br /&gt;
   Useful options: ttl, tos, bind, sourceport, pf&lt;br /&gt;
   See also: UDP4−SENDTO, UDP6−SENDTO, UDP−RECVFROM, UDP−RECV,&lt;br /&gt;
   UDP−CONNECT, UDP−LISTEN, IP−SENDTO&lt;br /&gt;
&lt;br /&gt;
   UDP4−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−SENDTO, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4&lt;br /&gt;
&lt;br /&gt;
   UDP6−SENDTO:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−SENDTO, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6&lt;br /&gt;
&lt;br /&gt;
   UDP−RECVFROM:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a UDP socket on &amp;lt;port&amp;gt; [UDP service] using UDP/IP version 4 or&lt;br /&gt;
   6 depending on option pf. It receives one packet from an unspecified&lt;br /&gt;
   peer and may send one or more answer packets to that peer. This mode is&lt;br /&gt;
   particularly useful with fork option where each arriving packet − from&lt;br /&gt;
   arbitrary peers − is handled by its own sub process. This allows a&lt;br /&gt;
   behaviour similar to typical UDP based servers like ntpd or named. This&lt;br /&gt;
   address works well with socat UDP−SENDTO address peers.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,CHILD,RANGE&lt;br /&gt;
   Useful options: fork, ttl, tos, bind, sourceport, pf&lt;br /&gt;
   See also: UDP4−RECVFROM, UDP6−RECVFROM, UDP−SENDTO, UDP−RECV,&lt;br /&gt;
   UDP−CONNECT, UDP−LISTEN, IP−RECVFROM, UNIX−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   UDP4−RECVFROM:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−RECVFROM, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,CHILD,RANGE&lt;br /&gt;
&lt;br /&gt;
   UDP6−RECVFROM:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−RECVFROM, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,CHILD,RANGE&lt;br /&gt;
&lt;br /&gt;
   UDP−RECV:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a UDP socket on &amp;lt;port&amp;gt; [UDP service] using UDP/IP version 4 or&lt;br /&gt;
   6 depending on option pf. It receives packets from multiple unspecified&lt;br /&gt;
   peers and merges the data. No replies are possible. It works well with,&lt;br /&gt;
   e.g., socat UDP−SENDTO address peers; it behaves similar to a syslog&lt;br /&gt;
   server.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,IP6,RANGE&lt;br /&gt;
   Useful options: fork, pf, bind, sourceport, ttl, tos&lt;br /&gt;
   See also: UDP4−RECV, UDP6−RECV, UDP−SENDTO, UDP−RECVFROM, UDP−CONNECT,&lt;br /&gt;
   UDP−LISTEN, IP−RECV, UNIX−RECV&lt;br /&gt;
&lt;br /&gt;
   UDP4−RECV:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−RECV, but only supports IPv4 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP4,RANGE&lt;br /&gt;
&lt;br /&gt;
   UDP6−RECV:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like UDP−RECV, but only supports IPv6 protocol.&lt;br /&gt;
   Option groups: FD,SOCKET,IP6,RANGE&lt;br /&gt;
&lt;br /&gt;
   UNIX−CONNECT:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Connects to &amp;lt;filename&amp;gt; assuming it is a UNIX domain socket. If&lt;br /&gt;
   &amp;lt;filename&amp;gt; does not exist, this is an error; if &amp;lt;filename&amp;gt; is not a&lt;br /&gt;
   UNIX domain socket, this is an error; if &amp;lt;filename&amp;gt; is a UNIX domain&lt;br /&gt;
   socket, but no process is listening, this is an error.&lt;br /&gt;
   Option groups: FD,SOCKET,NAMED,RETRY,UNIX&lt;br /&gt;
   ) Useful options: bind&lt;br /&gt;
   See also: UNIX−LISTEN, UNIX−SENDTO, TCP&lt;br /&gt;
&lt;br /&gt;
   UNIX−LISTEN:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Listens on &amp;lt;filename&amp;gt; using a UNIX domain stream socket and accepts a&lt;br /&gt;
   connection. If &amp;lt;filename&amp;gt; exists and is not a socket, this is an error.&lt;br /&gt;
   If &amp;lt;filename&amp;gt; exists and is a UNIX domain socket, binding to the&lt;br /&gt;
   address fails (use option unlink−early!). Note that opening this&lt;br /&gt;
   address usually blocks until a client connects. Beginning with socat&lt;br /&gt;
   version 1.4.3, the file system entry is removed when this address is&lt;br /&gt;
   closed (but see option unlink−close) (example).&lt;br /&gt;
   Option groups: FD,SOCKET,NAMED,LISTEN,CHILD,RETRY,UNIX&lt;br /&gt;
   Useful options: fork, umask, mode, user, group, unlink−early&lt;br /&gt;
   See also: UNIX−CONNECT, UNIX−RECVFROM, UNIX−RECV, TCP−LISTEN&lt;br /&gt;
&lt;br /&gt;
   UNIX−SENDTO:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Communicates with the specified peer socket, defined by [&amp;lt;filename&amp;gt;]&lt;br /&gt;
   assuming it is a UNIX domain datagram socket. It sends packets to and&lt;br /&gt;
   receives packets from that peer socket only. Please note that it might&lt;br /&gt;
   be neccessary to bind the local socket to an address (e.g. /tmp/sock1,&lt;br /&gt;
   which must not exist before). This address type works well with socat&lt;br /&gt;
   UNIX−RECVFROM and UNIX−RECV address peers.&lt;br /&gt;
   Option groups: FD,SOCKET,NAMED,UNIX&lt;br /&gt;
   Useful options: bind&lt;br /&gt;
   See also: UNIX−RECVFROM, UNIX−RECV, UNIX−CONNECT, UDP−SENDTO, IP−SENDTO&lt;br /&gt;
&lt;br /&gt;
   UNIX−RECVFROM:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a UNIX domain datagram socket [&amp;lt;filename&amp;gt;]. Receives one packet&lt;br /&gt;
   and may send one or more answer packets to that peer. This mode is&lt;br /&gt;
   particularly useful with fork option where each arriving packet − from&lt;br /&gt;
   arbitrary peers − is handled by its own sub process. This address works&lt;br /&gt;
   well with socat UNIX−SENDTO address peers.&lt;br /&gt;
   Option groups: FD,SOCKET,NAMED,CHILD,UNIX&lt;br /&gt;
   Useful options: fork&lt;br /&gt;
   See also: UNIX−SENDTO, UNIX−RECV, UNIX−LISTEN, UDP−RECVFROM,&lt;br /&gt;
   IP−RECVFROM&lt;br /&gt;
&lt;br /&gt;
   UNIX−RECV:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Creates a UNIX domain datagram socket [&amp;lt;filename&amp;gt;]. Receives packets&lt;br /&gt;
   from multiple unspecified peers and merges the data. No replies are&lt;br /&gt;
   possible. It can be, e.g., addressed by socat UNIX−SENDTO address&lt;br /&gt;
   peers. It behaves similar to a syslog server. Option groups:&lt;br /&gt;
   FD,SOCKET,NAMED,UNIX&lt;br /&gt;
   See also: UNIX−SENDTO, UNIX−RECVFROM, UNIX−LISTEN, UDP−RECV, IP−RECV&lt;br /&gt;
&lt;br /&gt;
   UNIX−CLIENT:&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Communicates with the specified peer socket, defined by [&amp;lt;filename&amp;gt;]&lt;br /&gt;
   assuming it is a UNIX domain socket. It first tries to connect and, if&lt;br /&gt;
   that fails, assumes it is a datagram socket, thus supporting both&lt;br /&gt;
   types.&lt;br /&gt;
   Option groups: FD,SOCKET,NAMED,UNIX&lt;br /&gt;
   Useful options: bind&lt;br /&gt;
   See also: UNIX−CONNECT, UNIX−SENDTO, GOPEN&lt;br /&gt;
&lt;br /&gt;
   ABSTRACT−CONNECT:&amp;lt;string&amp;gt;&lt;br /&gt;
   ABSTRACT−LISTEN:&amp;lt;string&amp;gt;&lt;br /&gt;
   ABSTRACT−SENDTO:&amp;lt;string&amp;gt;&lt;br /&gt;
   ABSTRACT−RECVFROM:&amp;lt;string&amp;gt;&lt;br /&gt;
   ABSTRACT−RECV:&amp;lt;string&amp;gt;&lt;br /&gt;
   ABSTRACT−CLIENT:&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   The ABSTRACT addresses are almost identical to the related UNIX&lt;br /&gt;
   addresses except that they do not address file system based sockets but&lt;br /&gt;
   an alternate UNIX domain address space. To archieve this the socket&lt;br /&gt;
   address strings are prefixed with &amp;quot;\0&amp;quot; internally. This feature is&lt;br /&gt;
   available (only?) on Linux. Option groups are the same as with the&lt;br /&gt;
   related UNIX addresses, except that the ABSTRACT addresses are not&lt;br /&gt;
   member of the NAMED group.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Performs a chroot() operation to &amp;lt;directory&amp;gt; before opening the&lt;br /&gt;
   address. This call might require root privilege.&lt;br /&gt;
&lt;br /&gt;
   setgid=&amp;lt;group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Changes the primary &amp;lt;group&amp;gt; of the process after processing the&lt;br /&gt;
   address. This call might require root privilege. Please note that this&lt;br /&gt;
   option does not drop other group related privileges.&lt;br /&gt;
&lt;br /&gt;
   setgid−early=&amp;lt;group&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like setgit but is performed before opening the address.&lt;br /&gt;
&lt;br /&gt;
   setuid=&amp;lt;user&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Changes the &amp;lt;user&amp;gt; (owner) of the process after processing the address.&lt;br /&gt;
   This call might require root privilege. Please note that this option&lt;br /&gt;
   does not drop group related privileges. Check if option su better fits&lt;br /&gt;
   your needs.&lt;br /&gt;
&lt;br /&gt;
   setuid−early=&amp;lt;user&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like setuid but is performed before opening the address.&lt;br /&gt;
&lt;br /&gt;
   su=&amp;lt;user&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Changes the &amp;lt;user&amp;gt; (owner) and groups of the process after processing&lt;br /&gt;
   the address (example). This call might require root privilege.&lt;br /&gt;
&lt;br /&gt;
   su−d=&amp;lt;user&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Short name for substuser−delayed. Changes the &amp;lt;user&amp;gt; (owner) and groups&lt;br /&gt;
   of the process after processing the address (example). The user and his&lt;br /&gt;
   groups are retrieved before a possible chroot() . This call might&lt;br /&gt;
   require root privilege.&lt;br /&gt;
&lt;br /&gt;
   setpgid=&amp;lt;pid_t&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Makes the process a member of the specified process group &amp;lt;pid_t&amp;gt;. If&lt;br /&gt;
   no value is given, or if the value is 0 or 1, the process becomes&lt;br /&gt;
   leader of a new process group.&lt;br /&gt;
&lt;br /&gt;
   setsid&lt;br /&gt;
&lt;br /&gt;
   Makes the process the leader of a new session (example).&lt;br /&gt;
&lt;br /&gt;
   READLINE option group&lt;br /&gt;
&lt;br /&gt;
   These options apply to the readline address type.&lt;br /&gt;
   history=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Reads and writes history from/to &amp;lt;filename&amp;gt; (example).&lt;br /&gt;
&lt;br /&gt;
   noprompt&lt;br /&gt;
&lt;br /&gt;
   Since version 1.4.0, socat per default tries to determine a prompt −&lt;br /&gt;
   that is then passed to the readline call − by remembering the last&lt;br /&gt;
   incomplete line of the output. With this option, socat does not pass a&lt;br /&gt;
   prompt to readline, so it begins line editing in the first column of&lt;br /&gt;
   the terminal.&lt;br /&gt;
&lt;br /&gt;
   noecho=&amp;lt;pattern&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies a regular pattern for a prompt that prevents the following&lt;br /&gt;
   input line from being displayed on the screen and from being added to&lt;br /&gt;
   the history. The prompt is defined as the text that was output to the&lt;br /&gt;
   readline address after the lastest newline character and before an&lt;br /&gt;
   input character was typed. The pattern is a regular expression, e.g.&lt;br /&gt;
   &amp;quot;^[Pp]assword:.*$&amp;quot; or &amp;quot;([Uu]ser:|[Pp]assword:)&amp;quot;. See regex\(7) for&lt;br /&gt;
   details. (example)&lt;br /&gt;
&lt;br /&gt;
   prompt=&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Passes the string as prompt to the readline function. readline prints&lt;br /&gt;
   this prompt when stepping through the history. If this string matches a&lt;br /&gt;
   constant prompt issued by an interactive program on the other socat&lt;br /&gt;
   address, consistent look and feel can be archieved.&lt;br /&gt;
&lt;br /&gt;
   APPLICATION option group&lt;br /&gt;
&lt;br /&gt;
   This group contains options that work at data level. Note that these&lt;br /&gt;
   options only apply to the &amp;quot;raw&amp;quot; data transferred by socat, but not to&lt;br /&gt;
   protocol data used by addresses like PROXY.&lt;br /&gt;
&lt;br /&gt;
   cr&lt;br /&gt;
&lt;br /&gt;
   Converts the default line termination character NL (’\n’, 0x0a) to/from&lt;br /&gt;
   CR (’\r’, 0x0d) when writing/reading on this channel.&lt;br /&gt;
&lt;br /&gt;
   crnl&lt;br /&gt;
&lt;br /&gt;
   Converts the default line termination character NL (’\n’, 0x0a) to/from&lt;br /&gt;
   CRNL (&amp;quot;\r\n&amp;quot;, 0x0d0a) when writing/reading on this channel (example).&lt;br /&gt;
   Note: socat simply strips all CR characters.&lt;br /&gt;
&lt;br /&gt;
   ignoreeof&lt;br /&gt;
&lt;br /&gt;
   When EOF occurs on this channel, socat ignores it and tries to read&lt;br /&gt;
   more data (like &amp;quot;tail −f&amp;quot;) (example).&lt;br /&gt;
&lt;br /&gt;
   readbytes=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   socat reads only so many bytes from this address (the address provides&lt;br /&gt;
   only so many bytes for transfer and pretends to be at EOF afterwards).&lt;br /&gt;
   Must be greater than 0.&lt;br /&gt;
&lt;br /&gt;
   lockfile=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   If lockfile exists, exits with error. If lockfile does not exist,&lt;br /&gt;
   creates it and continues, unlinks lockfile on exit.&lt;br /&gt;
&lt;br /&gt;
   waitlock=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   If lockfile exists, waits until it disappears. When lockfile does not&lt;br /&gt;
   exist, creates it and continues, unlinks lockfile on exit.&lt;br /&gt;
&lt;br /&gt;
   escape=&amp;lt;int&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the numeric code of a character that triggers EOF on the&lt;br /&gt;
   input stream. It is useful with a terminal in raw mode (example).&lt;br /&gt;
&lt;br /&gt;
   SOCKET option group&lt;br /&gt;
&lt;br /&gt;
   These options are intended for all kinds of sockets, e.g. IP or UNIX&lt;br /&gt;
   domain. Most are applied with a setsockopt() call.&lt;br /&gt;
   bind=&amp;lt;sockname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Binds the socket to the given socket address using the bind() system&lt;br /&gt;
   call. The form of &amp;lt;sockname&amp;gt; is socket domain dependent: IP4 and IP6&lt;br /&gt;
   allow the form [hostname|hostaddress][:(service|port)] (example), UNIX&lt;br /&gt;
   domain sockets require &amp;lt;filename&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
   connect−timeout=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Abort the connection attempt after &amp;lt;seconds&amp;gt; [timeval] with error&lt;br /&gt;
   status.&lt;br /&gt;
&lt;br /&gt;
   so−bindtodevice=&amp;lt;interface&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Binds the socket to the given &amp;lt;interface&amp;gt;. This option might require&lt;br /&gt;
   root privilege.&lt;br /&gt;
&lt;br /&gt;
   broadcast&lt;br /&gt;
&lt;br /&gt;
   For datagram sockets, allows sending to broadcast addresses and&lt;br /&gt;
   receiving packets addressed to broadcast addresses.&lt;br /&gt;
&lt;br /&gt;
   debug&lt;br /&gt;
&lt;br /&gt;
   Enables socket debugging.&lt;br /&gt;
&lt;br /&gt;
   dontroute&lt;br /&gt;
&lt;br /&gt;
   Only communicates with directly connected peers, does not use routers.&lt;br /&gt;
&lt;br /&gt;
   keepalive&lt;br /&gt;
&lt;br /&gt;
   Enables sending keepalives on the socket.&lt;br /&gt;
&lt;br /&gt;
   linger=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Blocks shutdown() or close() until data transfers have finished or the&lt;br /&gt;
   given timeout [int] expired.&lt;br /&gt;
&lt;br /&gt;
   oobinline&lt;br /&gt;
&lt;br /&gt;
   Places out−of−band data in the input data stream.&lt;br /&gt;
&lt;br /&gt;
   priority=&amp;lt;priority&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the protocol defined &amp;lt;priority&amp;gt; [&amp;lt;int&amp;gt;] for outgoing packets.&lt;br /&gt;
&lt;br /&gt;
   rcvbuf=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the size of the receive buffer after the socket() call to &amp;lt;bytes&amp;gt;&lt;br /&gt;
   [int]. With TCP sockets, this value corresponds to the socket’s maximal&lt;br /&gt;
   window size.&lt;br /&gt;
&lt;br /&gt;
   rcvbuf−late=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the size of the receive buffer when the socket is already&lt;br /&gt;
   connected to &amp;lt;bytes&amp;gt; [int]. With TCP sockets, this value corresponds to&lt;br /&gt;
   the socket’s maximal window size.&lt;br /&gt;
&lt;br /&gt;
   rcvlowat=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the minimum number of received bytes [int] until the socket&lt;br /&gt;
   layer will pass the buffered data to socat.&lt;br /&gt;
&lt;br /&gt;
   rcvtimeo=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the receive timeout [timeval].&lt;br /&gt;
&lt;br /&gt;
   reuseaddr&lt;br /&gt;
&lt;br /&gt;
   Allows other sockets to bind to an address even if parts of it (e.g.&lt;br /&gt;
   the local port) are already in use by socat (example).&lt;br /&gt;
&lt;br /&gt;
   sndbuf=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the size of the send buffer after the socket() call to &amp;lt;bytes&amp;gt;&lt;br /&gt;
   [int].&lt;br /&gt;
&lt;br /&gt;
   sndbuf−late=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the size of the send buffer when the socket is connected to&lt;br /&gt;
   &amp;lt;bytes&amp;gt; [int].&lt;br /&gt;
&lt;br /&gt;
   sndlowat=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the minimum number of bytes in the send buffer until the&lt;br /&gt;
   socket layer will send the data to &amp;lt;bytes&amp;gt; [int].&lt;br /&gt;
&lt;br /&gt;
   sndtimeo=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the send timeout to seconds [timeval].&lt;br /&gt;
&lt;br /&gt;
   pf=&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Forces the use of the specified IP version or protocol. &amp;lt;string&amp;gt; can be&lt;br /&gt;
   something like &amp;quot;ip4&amp;quot; or &amp;quot;ip6&amp;quot;. The resulting value is used as first&lt;br /&gt;
   argument to the socket() or socketpair() calls. This option affects&lt;br /&gt;
   address resolution and the required syntax of bind and range options.&lt;br /&gt;
&lt;br /&gt;
   type=&amp;lt;type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the type of the socket, specified as second argument to the&lt;br /&gt;
   socket() or socketpair() calls, to &amp;lt;type&amp;gt; [int]. Address resolution is&lt;br /&gt;
   not affected by this option. Under Linux, 1 means stream oriented&lt;br /&gt;
   socket, 2 means datagram socket, and 3 means raw socket.&lt;br /&gt;
&lt;br /&gt;
   prototype&lt;br /&gt;
&lt;br /&gt;
   Sets the protocol of the socket, specified as third argument to the&lt;br /&gt;
   socket() or socketpair() calls, to &amp;lt;prototype&amp;gt; [int]. Address&lt;br /&gt;
   resolution is not affected by this option. 6 means TCP, 17 means UDP.&lt;br /&gt;
&lt;br /&gt;
   so−timestamp&lt;br /&gt;
&lt;br /&gt;
   Sets the SO_TIMESTAMP socket option. This enables receiving and logging&lt;br /&gt;
   of timestamp ancillary messages.&lt;br /&gt;
&lt;br /&gt;
   setsockopt−int=&amp;lt;level&amp;gt;:&amp;lt;optname&amp;gt;:&amp;lt;optval&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Invokes setsockopt() for the socket with the given parameters. level&lt;br /&gt;
   [int] is used as second argument to setsockopt() and specifies the&lt;br /&gt;
   layer, e.g. SOL_TCP for TCP (6 on Linux), or SOL_SOCKET for the socket&lt;br /&gt;
   layer (1 on Linux). optname [int] is the third argument to setsockopt()&lt;br /&gt;
   and tells which socket option is to be set. For the actual numbers you&lt;br /&gt;
   might have to look up the appropriate include files of your system. The&lt;br /&gt;
   4th setsockopt() parameter, value [int], is passed to the function per&lt;br /&gt;
   pointer, and for the length parameter sizeof\(int) is taken&lt;br /&gt;
   implicitely.&lt;br /&gt;
&lt;br /&gt;
   setsockopt−bin=&amp;lt;level&amp;gt;:&amp;lt;optname&amp;gt;:&amp;lt;optval&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like setsockopt−int, but &amp;lt;optval&amp;gt; must be provided in dalan format and&lt;br /&gt;
   specifies an arbitrary sequence of bytes; the length parameter is&lt;br /&gt;
   automatically derived from the data.&lt;br /&gt;
&lt;br /&gt;
   setsockopt−string=&amp;lt;level&amp;gt;:&amp;lt;optname&amp;gt;:&amp;lt;optval&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Like setsockopt−int, but &amp;lt;optval&amp;gt; must be a string. This string is&lt;br /&gt;
   passed to the function with trailing null character, and the length&lt;br /&gt;
   parameter is automatically derived from the data.&lt;br /&gt;
&lt;br /&gt;
   UNIX option group&lt;br /&gt;
&lt;br /&gt;
   These options apply to UNIX domain based addresses.&lt;br /&gt;
   unix−tightsocklen=[0|1]&lt;br /&gt;
&lt;br /&gt;
   On socket operations, pass a socket address length that does not&lt;br /&gt;
   include the whole struct sockaddr_un record but (besides other&lt;br /&gt;
   components) only the relevant part of the filename or abstract string.&lt;br /&gt;
   Default is 1.&lt;br /&gt;
&lt;br /&gt;
   IP4 and IP6 option groups&lt;br /&gt;
&lt;br /&gt;
   These options can be used with IPv4 and IPv6 based sockets.&lt;br /&gt;
   tos=&amp;lt;tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the TOS (type of service) field of outgoing packets to &amp;lt;tos&amp;gt;&lt;br /&gt;
   [byte] (see RFC 791).&lt;br /&gt;
&lt;br /&gt;
   ttl=&amp;lt;ttl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the TTL (time to live) field of outgoing packets to &amp;lt;ttl&amp;gt; [byte].&lt;br /&gt;
&lt;br /&gt;
   ip−options=&amp;lt;data&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets IP options like source routing. Must be given in binary form,&lt;br /&gt;
   recommended format is a leading &amp;quot;x&amp;quot; followed by an even number of hex&lt;br /&gt;
   digits. This option may be used multiple times, data are appended.&lt;br /&gt;
   E.g., to connect to host 10.0.0.1 via some gateway using a loose source&lt;br /&gt;
   route, use the gateway as address parameter and set a loose source&lt;br /&gt;
   route using the option ip−options=x8307040a000001 .&lt;br /&gt;
   IP options are defined in RFC 791.&lt;br /&gt;
&lt;br /&gt;
   mtudiscover=&amp;lt;0|1|2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Takes 0, 1, 2 to never, want, or always use path MTU discover on this&lt;br /&gt;
   socket.&lt;br /&gt;
&lt;br /&gt;
   ip−pktinfo&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_PKTINFO socket option. This enables receiving and logging&lt;br /&gt;
   of ancillary messages containing destination address and interface&lt;br /&gt;
   (Linux) (example).&lt;br /&gt;
&lt;br /&gt;
   ip−recverr&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVERR socket option. This enables receiving and logging&lt;br /&gt;
   of ancillary messages containing detailled error information.&lt;br /&gt;
&lt;br /&gt;
   ip−recvopts&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVOPTS socket option. This enables receiving and logging&lt;br /&gt;
   of IP options ancillary messages (Linux, *BSD).&lt;br /&gt;
&lt;br /&gt;
   ip−recvtos&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVTOS socket option. This enables receiving and logging&lt;br /&gt;
   of TOS (type of service) ancillary messages (Linux).&lt;br /&gt;
&lt;br /&gt;
   ip−recvttl&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVTTL socket option. This enables receiving and logging&lt;br /&gt;
   of TTL (time to live) ancillary messages (Linux, *BSD).&lt;br /&gt;
&lt;br /&gt;
   ip−recvdstaddr&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVDSTADDR socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing destination address (*BSD)&lt;br /&gt;
   (example).&lt;br /&gt;
&lt;br /&gt;
   ip−recvif&lt;br /&gt;
&lt;br /&gt;
   Sets the IP_RECVIF socket option. This enables receiving and logging of&lt;br /&gt;
   interface ancillary messages (*BSD) (example).&lt;br /&gt;
&lt;br /&gt;
   ip−add−membership=&amp;lt;multicast−address:interface−address&amp;gt;&lt;br /&gt;
   ip−add−membership=&amp;lt;multicast−address:interface−name&amp;gt;&lt;br /&gt;
   ip−add−membership=&amp;lt;multicast−address:interface−index&amp;gt;&lt;br /&gt;
   ip−add−membership=&amp;lt;multicast−address:interface−address:interface−name&amp;gt;&lt;br /&gt;
   ip−add−membership=&amp;lt;multicast−address:interface−address:interface−index&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Makes the socket member of the specified multicast group. This is&lt;br /&gt;
   currently only implemented for IPv4. The option takes the IP address of&lt;br /&gt;
   the multicast group and info about the desired network interface. The&lt;br /&gt;
   most common syntax is the first one, while the others are only&lt;br /&gt;
   available on systems that provide struct mreqn (Linux).&lt;br /&gt;
   The indices of active network interfaces can be shown using the utility&lt;br /&gt;
   procan.&lt;br /&gt;
&lt;br /&gt;
   ip−multicast−if=&amp;lt;hostname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies hostname or address of the network interface to be used for&lt;br /&gt;
   multicast traffic.&lt;br /&gt;
&lt;br /&gt;
   ip−multicast−loop=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies if outgoing multicast traffic should loop back to the&lt;br /&gt;
   interface.&lt;br /&gt;
&lt;br /&gt;
   ip−multicast−ttl=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the TTL used for outgoing multicast traffic. Default is 1.&lt;br /&gt;
&lt;br /&gt;
   res−debug&lt;br /&gt;
   res−aaonly&lt;br /&gt;
   res−usevc&lt;br /&gt;
   res−primary&lt;br /&gt;
   res−igntc&lt;br /&gt;
   res−recurse&lt;br /&gt;
   res−defnames&lt;br /&gt;
   res−stayopen&lt;br /&gt;
   res−dnsrch&lt;br /&gt;
&lt;br /&gt;
   These options set the corresponding resolver (name resolution) option&lt;br /&gt;
   flags. Append &amp;quot;=0&amp;quot; to clear a default option. See man resolver\(5) for&lt;br /&gt;
   more information on these options. Note: these options are valid only&lt;br /&gt;
   for the address they are applied to.&lt;br /&gt;
&lt;br /&gt;
   IP6 option group&lt;br /&gt;
&lt;br /&gt;
   These options can only be used on IPv6 based sockets. See IP options&lt;br /&gt;
   for options that can be applied to both IPv4 and IPv6 sockets.&lt;br /&gt;
   ipv6only=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_V6ONLY socket option. If 0, the TCP stack will also&lt;br /&gt;
   accept connections using IPv4 protocol on the same port. The default is&lt;br /&gt;
   system dependent.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvdstopts&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVDSTOPTS socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing the destination options.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvhoplimit&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVHOPLIMIT socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing the hoplimit.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvhopopts&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVHOPOPTS socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing the hop options.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvpktinfo&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVPKTINFO socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing destination address and&lt;br /&gt;
   interface.&lt;br /&gt;
&lt;br /&gt;
   ipv6−unicast−hops=link(TYPE_INT)(&amp;lt;int&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_UNICAST_HOPS socket option. This sets the hop count limit&lt;br /&gt;
   (TTL) for outgoing unicast packets.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvrthdr&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVRTHDR socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing routing information.&lt;br /&gt;
&lt;br /&gt;
   ipv6−tclass&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_TCLASS socket option. This sets the transfer class of&lt;br /&gt;
   outgoing packets.&lt;br /&gt;
&lt;br /&gt;
   ipv6−recvtclass&lt;br /&gt;
&lt;br /&gt;
   Sets the IPV6_RECVTCLASS socket option. This enables receiving and&lt;br /&gt;
   logging of ancillary messages containing the transfer class.&lt;br /&gt;
&lt;br /&gt;
   TCP option group&lt;br /&gt;
&lt;br /&gt;
   These options may be applied to TCP sockets. They work by invoking&lt;br /&gt;
   setsockopt() with the appropriate parameters.&lt;br /&gt;
&lt;br /&gt;
   cork&lt;br /&gt;
&lt;br /&gt;
   Doesn’t send packets smaller than MSS (maximal segment size).&lt;br /&gt;
&lt;br /&gt;
   defer−accept&lt;br /&gt;
&lt;br /&gt;
   While listening, accepts connections only when data from the peer&lt;br /&gt;
   arrived.&lt;br /&gt;
&lt;br /&gt;
   keepcnt=&amp;lt;count&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the number of keepalives before shutting down the socket to&lt;br /&gt;
   &amp;lt;count&amp;gt; [int].&lt;br /&gt;
&lt;br /&gt;
   keepidle=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the idle time before sending the first keepalive to &amp;lt;seconds&amp;gt;&lt;br /&gt;
   [int].&lt;br /&gt;
&lt;br /&gt;
   keepintvl=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the interval between two keepalives to &amp;lt;seconds&amp;gt; [int].&lt;br /&gt;
&lt;br /&gt;
   linger2=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the time to keep the socket in FIN−WAIT−2 state to &amp;lt;seconds&amp;gt;&lt;br /&gt;
   [int].&lt;br /&gt;
&lt;br /&gt;
   mss=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the MSS (maximum segment size) after the socket() call to &amp;lt;bytes&amp;gt;&lt;br /&gt;
   [int]. This value is then proposed to the peer with the SYN or SYN/ACK&lt;br /&gt;
   packet (example).&lt;br /&gt;
&lt;br /&gt;
   mss−late=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the MSS of the socket after connection has been established to&lt;br /&gt;
   &amp;lt;bytes&amp;gt; [int].&lt;br /&gt;
&lt;br /&gt;
   nodelay&lt;br /&gt;
&lt;br /&gt;
   Turns off the Nagle algorithm for measuring the RTT (round trip time).&lt;br /&gt;
&lt;br /&gt;
   rfc1323&lt;br /&gt;
&lt;br /&gt;
   Enables RFC1323 TCP options: TCP window scale, round−trip time&lt;br /&gt;
   measurement (RTTM), and protect against wrapped sequence numbers (PAWS)&lt;br /&gt;
   (AIX).&lt;br /&gt;
&lt;br /&gt;
   stdurg&lt;br /&gt;
&lt;br /&gt;
   Enables RFC1122 compliant urgent pointer handling (AIX).&lt;br /&gt;
&lt;br /&gt;
   syncnt=&amp;lt;count&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the maximal number of SYN retransmits during connect to &amp;lt;count&amp;gt;&lt;br /&gt;
   [int].&lt;br /&gt;
&lt;br /&gt;
   md5sig&lt;br /&gt;
&lt;br /&gt;
   Enables generation of MD5 digests on the packets (FreeBSD).&lt;br /&gt;
&lt;br /&gt;
   noopt&lt;br /&gt;
&lt;br /&gt;
   Disables use of TCP options (FreeBSD, MacOSX).&lt;br /&gt;
&lt;br /&gt;
   nopush&lt;br /&gt;
&lt;br /&gt;
   sets the TCP_NOPUSH socket option (FreeBSD, MacOSX).&lt;br /&gt;
&lt;br /&gt;
   sack−disable&lt;br /&gt;
&lt;br /&gt;
   Disables use the selective acknowledge feature (OpenBSD).&lt;br /&gt;
&lt;br /&gt;
   signature−enable&lt;br /&gt;
&lt;br /&gt;
   Enables generation of MD5 digests on the packets (OpenBSD).&lt;br /&gt;
&lt;br /&gt;
   abort−threshold=&amp;lt;milliseconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the time to wait for an answer of the peer on an established&lt;br /&gt;
   connection (HP−UX).&lt;br /&gt;
&lt;br /&gt;
   conn−abort−threshold=&amp;lt;milliseconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the time to wait for an answer of the server during the initial&lt;br /&gt;
   connect (HP−UX).&lt;br /&gt;
&lt;br /&gt;
   keepinit&lt;br /&gt;
&lt;br /&gt;
   Sets the time to wait for an answer of the server during connect\()&lt;br /&gt;
   before giving up. Value in half seconds, default is 150 (75s) (Tru64).&lt;br /&gt;
&lt;br /&gt;
   paws&lt;br /&gt;
&lt;br /&gt;
   Enables the &amp;quot;protect against wrapped sequence numbers&amp;quot; feature (Tru64).&lt;br /&gt;
&lt;br /&gt;
   sackena&lt;br /&gt;
&lt;br /&gt;
   Enables selective acknowledge (Tru64).&lt;br /&gt;
&lt;br /&gt;
   tsoptena&lt;br /&gt;
&lt;br /&gt;
   Enables the time stamp option that allows RTT recalculation on existing&lt;br /&gt;
   connections (Tru64).&lt;br /&gt;
&lt;br /&gt;
   SCTP option group&lt;br /&gt;
&lt;br /&gt;
   These options may be applied to SCTP stream sockets.&lt;br /&gt;
   sctp−nodelay&lt;br /&gt;
&lt;br /&gt;
   Sets the SCTP_NODELAY socket option that disables the Nagle algorithm.&lt;br /&gt;
&lt;br /&gt;
   sctp−maxseg=&amp;lt;bytes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the SCTP_MAXSEG socket option to &amp;lt;bytes&amp;gt; [int]. This value is then&lt;br /&gt;
   proposed to the peer with the SYN or SYN/ACK packet.&lt;br /&gt;
&lt;br /&gt;
   UDP, TCP, and SCTP option groups&lt;br /&gt;
&lt;br /&gt;
   Here we find options that are related to the network port mechanism and&lt;br /&gt;
   thus can be used with UDP, TCP, and SCTP client and server addresses.&lt;br /&gt;
   sourceport=&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   For outgoing (client) TCP and UDP connections, it sets the source&lt;br /&gt;
   &amp;lt;port&amp;gt; using an extra bind() call. With TCP or UDP listen addresses,&lt;br /&gt;
   socat immediately shuts down the connection if the client does not use&lt;br /&gt;
   this sourceport (example).&lt;br /&gt;
&lt;br /&gt;
   lowport&lt;br /&gt;
&lt;br /&gt;
   Outgoing (client) TCP and UDP connections with this option use an&lt;br /&gt;
   unused random source port between 640 and 1023 incl. On UNIX class&lt;br /&gt;
   operating systems, this requires root privilege, and thus indicates&lt;br /&gt;
   that the client process is authorized by local root. TCP and UDP listen&lt;br /&gt;
   addresses with this option immediately shut down the connection if the&lt;br /&gt;
   client does not use a sourceport &amp;lt;= 1023. This mechanism can provide&lt;br /&gt;
   limited authorization under some circumstances.&lt;br /&gt;
&lt;br /&gt;
   SOCKS option group&lt;br /&gt;
&lt;br /&gt;
   When using SOCKS type addresses, some socks specific options can be&lt;br /&gt;
   set.&lt;br /&gt;
   socksport=&amp;lt;tcp service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Overrides the default &amp;quot;socks&amp;quot; service or port 1080 for the socks server&lt;br /&gt;
   port with &amp;lt;TCP service&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
   socksuser=&amp;lt;user&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sends the &amp;lt;user&amp;gt; [string] in the username field to the socks server.&lt;br /&gt;
   Default is the actual user name ($LOGNAME or $USER) (example).&lt;br /&gt;
&lt;br /&gt;
   HTTP option group&lt;br /&gt;
&lt;br /&gt;
   Options that can be provided with HTTP type addresses. The only HTTP&lt;br /&gt;
   address currently implemented is proxy−connect.&lt;br /&gt;
   proxyport=&amp;lt;TCP service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Overrides the default HTTP proxy port 8080 with &amp;lt;TCP service&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
   ignorecr&lt;br /&gt;
&lt;br /&gt;
   The HTTP protocol requires the use of CR+NL as line terminator. When a&lt;br /&gt;
   proxy server violates this standard, socat might not understand its&lt;br /&gt;
   answer. This option directs socat to interprete NL as line terminator&lt;br /&gt;
   and to ignore CR in the answer. Nevertheless, socat sends CR+NL to the&lt;br /&gt;
   proxy.&lt;br /&gt;
&lt;br /&gt;
   proxyauth=&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Provide &amp;quot;basic&amp;quot; authentication to the proxy server. The argument to the&lt;br /&gt;
   option is used with a &amp;quot;Proxy−Authorization: Base&amp;quot; header in base64&lt;br /&gt;
   encoded form.&lt;br /&gt;
   Note: username and password are visible for every user on the local&lt;br /&gt;
   machine in the process list; username and password are transferred to&lt;br /&gt;
   the proxy server unencrypted (base64 encoded) and might be sniffed.&lt;br /&gt;
&lt;br /&gt;
   resolve&lt;br /&gt;
&lt;br /&gt;
   Per default, socat sends to the proxy a CONNECT request containing the&lt;br /&gt;
   target hostname. With this option, socat resolves the hostname locally&lt;br /&gt;
   and sends the IP address. Please note that, according to RFC 2396, only&lt;br /&gt;
   name resolution to IPv4 addresses is implemented.&lt;br /&gt;
&lt;br /&gt;
   RANGE option group&lt;br /&gt;
&lt;br /&gt;
   These options check if a connecting client should be granted access.&lt;br /&gt;
   They can be applied to listening and receiving network sockets.&lt;br /&gt;
   tcp−wrappers options fall into this group.&lt;br /&gt;
   range=&amp;lt;address−range&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   After accepting a connection, tests if the peer is within range. For&lt;br /&gt;
   IPv4 addresses, address−range takes the form address/bits, e.g.&lt;br /&gt;
   10.0.0.0/8, or address:mask, e.g. 10.0.0.0:255.0.0.0 (example); for&lt;br /&gt;
   IPv6, it is [ip6−address/bits], e.g. [::1/128]. If the client address&lt;br /&gt;
   does not match, socat issues a warning and keeps listening/receiving.&lt;br /&gt;
&lt;br /&gt;
   tcpwrap[=&amp;lt;name&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
   Uses Wietse Venema’s libwrap (tcpd) library to determine if the client&lt;br /&gt;
   is allowed to connect. The configuration files are /etc/hosts.allow and&lt;br /&gt;
   /etc/hosts.deny per default, see &amp;quot;man 5 hosts_access&amp;quot; for more&lt;br /&gt;
   information. The optional &amp;lt;name&amp;gt; (type string) is passed to the wrapper&lt;br /&gt;
   functions as daemon process name (example). If omitted, the basename of&lt;br /&gt;
   socats invocation (argv[0]) is passed. If both tcpwrap and range&lt;br /&gt;
   options are applied to an address, both conditions must be fulfilled to&lt;br /&gt;
   allow the connection.&lt;br /&gt;
&lt;br /&gt;
   allow−table=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Takes the specified file instead of /etc/hosts.allow.&lt;br /&gt;
&lt;br /&gt;
   deny−table=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Takes the specified file instead of /etc/hosts.deny.&lt;br /&gt;
&lt;br /&gt;
   tcpwrap−etc=&amp;lt;directoryname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Looks for hosts.allow and hosts.deny in the specified directory. Is&lt;br /&gt;
   overridden by options hosts−allow and hosts−deny.&lt;br /&gt;
&lt;br /&gt;
   LISTEN option group&lt;br /&gt;
&lt;br /&gt;
   Options specific to listening sockets.&lt;br /&gt;
   backlog=&amp;lt;count&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the backlog value passed with the listen() system call to &amp;lt;count&amp;gt;&lt;br /&gt;
   [int]. Default is 5.&lt;br /&gt;
&lt;br /&gt;
   max−children=&amp;lt;count&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Limits the number of concurrent child processes [int]. Default is no&lt;br /&gt;
   limit.&lt;br /&gt;
&lt;br /&gt;
   CHILD option group&lt;br /&gt;
&lt;br /&gt;
   Options for addresses with multiple connections via child processes.&lt;br /&gt;
&lt;br /&gt;
   fork&lt;br /&gt;
&lt;br /&gt;
   After establishing a connection, handles its channel in a child process&lt;br /&gt;
   and keeps the parent process attempting to produce more connections,&lt;br /&gt;
   either by listening or by connecting in a loop (example).&lt;br /&gt;
&lt;br /&gt;
   SSL−CONNECT and SSL−LISTEN differ in when they actually fork off the&lt;br /&gt;
   child: SSL−LISTEN forks before the SSL handshake, while SSL−CONNECT&lt;br /&gt;
   forks afterwards. RETRY and FOREVER options are not inherited by the&lt;br /&gt;
   child process.&lt;br /&gt;
   On some operating systems (e.g. FreeBSD) this option does not work for&lt;br /&gt;
   UDP−LISTEN addresses.&lt;br /&gt;
&lt;br /&gt;
   EXEC option group&lt;br /&gt;
&lt;br /&gt;
   Options for addresses that invoke a program.&lt;br /&gt;
   path=&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Overrides the PATH environment variable for searching the program with&lt;br /&gt;
   &amp;lt;string&amp;gt;. This $PATH value is effective in the child process too.&lt;br /&gt;
&lt;br /&gt;
   login&lt;br /&gt;
&lt;br /&gt;
   Prefixes argv[0] for the execvp() call with ’−’, thus making a shell&lt;br /&gt;
   behave as login shell.&lt;br /&gt;
&lt;br /&gt;
   FORK option group&lt;br /&gt;
&lt;br /&gt;
   EXEC or SYSTEM addresses invoke a program using a child process and&lt;br /&gt;
   transfer data between socat and the program. The interprocess&lt;br /&gt;
   communication mechanism can be influenced with the following options.&lt;br /&gt;
   Per default, a socketpair() is created and assigned to stdin and stdout&lt;br /&gt;
   of the child process, while stderr is inherited from the socat process,&lt;br /&gt;
   and the child process uses file descriptors 0 and 1 for communicating&lt;br /&gt;
   with the main socat process.&lt;br /&gt;
&lt;br /&gt;
   nofork&lt;br /&gt;
&lt;br /&gt;
   Does not fork a subprocess for executing the program, instead calls&lt;br /&gt;
   execvp\() or system\() directly from the actual socat instance. This&lt;br /&gt;
   avoids the overhead of another process between the program and its&lt;br /&gt;
   peer, but introduces a lot of restrictions:&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   this option can only be applied to the second socat address.&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   it cannot be applied to a part of a dual address.&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   the first socat address cannot be OPENSSL or READLINE&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   socat options −b, −t, −D, −l, −v, −x become useless&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   for both addresses, options ignoreeof, cr, and crnl become useless&lt;br /&gt;
&lt;br /&gt;
   o&lt;br /&gt;
&lt;br /&gt;
   for the second address (the one with option nofork), options append,&lt;br /&gt;
   cloexec, flock, user, group, mode, nonblock, perm−late, setlk, and&lt;br /&gt;
   setpgid cannot be applied. Some of these could be used on the first&lt;br /&gt;
   address though.&lt;br /&gt;
&lt;br /&gt;
   pipes&lt;br /&gt;
&lt;br /&gt;
   Creates a pair of unnamed pipes for interprocess communication instead&lt;br /&gt;
   of a socket pair.&lt;br /&gt;
&lt;br /&gt;
   openpty&lt;br /&gt;
&lt;br /&gt;
   Establishes communication with the sub process using a pseudo terminal&lt;br /&gt;
   created with openpty() instead of the default (socketpair or ptmx).&lt;br /&gt;
&lt;br /&gt;
   ptmx&lt;br /&gt;
&lt;br /&gt;
   Establishes communication with the sub process using a pseudo terminal&lt;br /&gt;
   created by opening /dev/ptmx or /dev/ptc instead of the default&lt;br /&gt;
   (socketpair).&lt;br /&gt;
&lt;br /&gt;
   pty&lt;br /&gt;
&lt;br /&gt;
   Establishes communication with the sub process using a pseudo terminal&lt;br /&gt;
   instead of a socket pair. Creates the pty with an available mechanism.&lt;br /&gt;
   If openpty and ptmx are both available, it uses ptmx because this is&lt;br /&gt;
   POSIX compliant (example).&lt;br /&gt;
&lt;br /&gt;
   ctty&lt;br /&gt;
&lt;br /&gt;
   Makes the pty the controlling tty of the sub process (example).&lt;br /&gt;
&lt;br /&gt;
   stderr&lt;br /&gt;
&lt;br /&gt;
   Directs stderr of the sub process to its output channel by making&lt;br /&gt;
   stderr a dup() of stdout (example).&lt;br /&gt;
&lt;br /&gt;
   fdin=&amp;lt;fdnum&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Assigns the sub processes input channel to its file descriptor &amp;lt;fdnum&amp;gt;&lt;br /&gt;
   instead of stdin (0). The program started from the subprocess has to&lt;br /&gt;
   use this fd for reading data from socat (example).&lt;br /&gt;
&lt;br /&gt;
   fdout=&amp;lt;fdnum&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Assigns the sub processes output channel to its file descriptor &amp;lt;fdnum&amp;gt;&lt;br /&gt;
   instead of stdout (1). The program started from the subprocess has to&lt;br /&gt;
   use this fd for writing data to socat (example).&lt;br /&gt;
&lt;br /&gt;
   sighup, sigint, sigquit&lt;br /&gt;
&lt;br /&gt;
   Has socat pass signals of this type to the sub process. If no address&lt;br /&gt;
   has this option, socat terminates on these signals.&lt;br /&gt;
&lt;br /&gt;
   TERMIOS option group&lt;br /&gt;
&lt;br /&gt;
   For addresses that work on a tty (e.g., stdio, file:/dev/tty,&lt;br /&gt;
   exec:...,pty), the terminal parameters defined in the UN*X termios&lt;br /&gt;
   mechanism are made available as address option parameters. Please note&lt;br /&gt;
   that changes of the parameters of your interactive terminal remain&lt;br /&gt;
   effective after socat’s termination, so you might have to enter &amp;quot;reset&amp;quot;&lt;br /&gt;
   or &amp;quot;stty sane&amp;quot; in your shell afterwards. For EXEC and SYSTEM addresses&lt;br /&gt;
   with option PTY, these options apply to the pty by the child processes.&lt;br /&gt;
&lt;br /&gt;
   b0&lt;br /&gt;
&lt;br /&gt;
   Disconnects the terminal.&lt;br /&gt;
&lt;br /&gt;
   b19200&lt;br /&gt;
&lt;br /&gt;
   Sets the serial line speed to 19200 baud. Some other rates are&lt;br /&gt;
   possible; use something like socat −hh |grep ’ b[1−9]’ to find all&lt;br /&gt;
   speeds supported by your implementation.&lt;br /&gt;
&lt;br /&gt;
   Note: On some operating systems, these options may not be available.&lt;br /&gt;
   Use ispeed or ospeed instead.&lt;br /&gt;
&lt;br /&gt;
   echo=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Enables or disables local echo.&lt;br /&gt;
&lt;br /&gt;
   icanon=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets or clears canonical mode, enabling line buffering and some special&lt;br /&gt;
   characters.&lt;br /&gt;
&lt;br /&gt;
   raw&lt;br /&gt;
&lt;br /&gt;
   Sets raw mode, thus passing input and output almost unprocessed. This&lt;br /&gt;
   option is obsolete, use option rawer or cfmakeraw instead.&lt;br /&gt;
&lt;br /&gt;
   rawer&lt;br /&gt;
&lt;br /&gt;
   Makes terminal rawer than raw option. This option implicitly turns off&lt;br /&gt;
   echo. (example).&lt;br /&gt;
&lt;br /&gt;
   cfmakeraw&lt;br /&gt;
&lt;br /&gt;
   Sets raw mode by invoking cfmakeraw() or by simulating this call. This&lt;br /&gt;
   option implicitly turns off echo.&lt;br /&gt;
&lt;br /&gt;
   ignbrk=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Ignores or interpretes the BREAK character (e.g., ^C)&lt;br /&gt;
&lt;br /&gt;
   brkint=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   bs0&lt;br /&gt;
&lt;br /&gt;
   bs1&lt;br /&gt;
&lt;br /&gt;
   bsdly=&amp;lt;0|1&amp;gt;&lt;br /&gt;
   clocal=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   cr0&lt;br /&gt;
   cr1&lt;br /&gt;
   cr2&lt;br /&gt;
   cr3&lt;br /&gt;
&lt;br /&gt;
   Sets the carriage return delay to 0, 1, 2, or 3, respectively. 0 means&lt;br /&gt;
   no delay, the other values are terminal dependent.&lt;br /&gt;
&lt;br /&gt;
   crdly=&amp;lt;0|1|2|3&amp;gt;&lt;br /&gt;
   cread=&amp;lt;bool&amp;gt;&lt;br /&gt;
   crtscts=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   cs5&lt;br /&gt;
   cs6&lt;br /&gt;
   cs7&lt;br /&gt;
   cs8&lt;br /&gt;
&lt;br /&gt;
   Sets the character size to 5, 6, 7, or 8 bits, respectively.&lt;br /&gt;
&lt;br /&gt;
   csize=&amp;lt;0|1|2|3&amp;gt;&lt;br /&gt;
   cstopb=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets two stop bits, rather than one.&lt;br /&gt;
&lt;br /&gt;
   dsusp=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the value for the VDSUSP character that suspends the current&lt;br /&gt;
   foreground process and reactivates the shell (all except Linux).&lt;br /&gt;
&lt;br /&gt;
   echoctl=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Echos control characters in hat notation (e.g. ^A)&lt;br /&gt;
&lt;br /&gt;
   echoe=&amp;lt;bool&amp;gt;&lt;br /&gt;
   echok=&amp;lt;bool&amp;gt;&lt;br /&gt;
   echoke=&amp;lt;bool&amp;gt;&lt;br /&gt;
   echonl=&amp;lt;bool&amp;gt;&lt;br /&gt;
   echoprt=&amp;lt;bool&amp;gt;&lt;br /&gt;
   eof=&amp;lt;byte&amp;gt;&lt;br /&gt;
   eol=&amp;lt;byte&amp;gt;&lt;br /&gt;
   eol2=&amp;lt;byte&amp;gt;&lt;br /&gt;
   erase=&amp;lt;byte&amp;gt;&lt;br /&gt;
   discard=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   ff0&lt;br /&gt;
&lt;br /&gt;
   ff1&lt;br /&gt;
&lt;br /&gt;
   ffdly=&amp;lt;bool&amp;gt;&lt;br /&gt;
   flusho=&amp;lt;bool&amp;gt;&lt;br /&gt;
   hupcl=&amp;lt;bool&amp;gt;&lt;br /&gt;
   icrnl=&amp;lt;bool&amp;gt;&lt;br /&gt;
   iexten=&amp;lt;bool&amp;gt;&lt;br /&gt;
   igncr=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ignpar=&amp;lt;bool&amp;gt;&lt;br /&gt;
   imaxbel=&amp;lt;bool&amp;gt;&lt;br /&gt;
   inlcr=&amp;lt;bool&amp;gt;&lt;br /&gt;
   inpck=&amp;lt;bool&amp;gt;&lt;br /&gt;
   intr=&amp;lt;byte&amp;gt;&lt;br /&gt;
   isig=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ispeed=&amp;lt;unsigned−int&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Set the baud rate for incoming data on this line.&lt;br /&gt;
   See also: ospeed, b19200&lt;br /&gt;
&lt;br /&gt;
   istrip=&amp;lt;bool&amp;gt;&lt;br /&gt;
   iuclc=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ixany=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ixoff=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ixon=&amp;lt;bool&amp;gt;&lt;br /&gt;
   kill=&amp;lt;byte&amp;gt;&lt;br /&gt;
   lnext=&amp;lt;byte&amp;gt;&lt;br /&gt;
   min=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   nl0&lt;br /&gt;
&lt;br /&gt;
   Sets the newline delay to 0.&lt;br /&gt;
&lt;br /&gt;
   nl1&lt;br /&gt;
&lt;br /&gt;
   nldly=&amp;lt;bool&amp;gt;&lt;br /&gt;
   noflsh=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ocrnl=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ofdel=&amp;lt;bool&amp;gt;&lt;br /&gt;
   ofill=&amp;lt;bool&amp;gt;&lt;br /&gt;
   olcuc=&amp;lt;bool&amp;gt;&lt;br /&gt;
   onlcr=&amp;lt;bool&amp;gt;&lt;br /&gt;
   onlret=&amp;lt;bool&amp;gt;&lt;br /&gt;
   onocr=&amp;lt;bool&amp;gt;&lt;br /&gt;
   opost=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Enables or disables output processing; e.g., converts NL to CR−NL.&lt;br /&gt;
&lt;br /&gt;
   ospeed=&amp;lt;unsigned−int&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Set the baud rate for outgoing data on this line.&lt;br /&gt;
   See also: ispeed, b19200&lt;br /&gt;
&lt;br /&gt;
   parenb=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Enable parity generation on output and parity checking for input.&lt;br /&gt;
&lt;br /&gt;
   parmrk=&amp;lt;bool&amp;gt;&lt;br /&gt;
   parodd=&amp;lt;bool&amp;gt;&lt;br /&gt;
   pendin=&amp;lt;bool&amp;gt;&lt;br /&gt;
   quit=&amp;lt;byte&amp;gt;&lt;br /&gt;
   reprint=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   sane&lt;br /&gt;
&lt;br /&gt;
   Brings the terminal to something like a useful default state.&lt;br /&gt;
&lt;br /&gt;
   start=&amp;lt;byte&amp;gt;&lt;br /&gt;
   stop=&amp;lt;byte&amp;gt;&lt;br /&gt;
   susp=&amp;lt;byte&amp;gt;&lt;br /&gt;
   swtc=&amp;lt;byte&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   tab0&lt;br /&gt;
&lt;br /&gt;
   tab1&lt;br /&gt;
&lt;br /&gt;
   tab2&lt;br /&gt;
&lt;br /&gt;
   tab3&lt;br /&gt;
&lt;br /&gt;
   tabdly=&amp;lt;unsigned−int&amp;gt;&lt;br /&gt;
   time=&amp;lt;byte&amp;gt;&lt;br /&gt;
   tostop=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   vt0&lt;br /&gt;
&lt;br /&gt;
   vt1&lt;br /&gt;
&lt;br /&gt;
   vtdly=&amp;lt;bool&amp;gt;&lt;br /&gt;
   werase=&amp;lt;byte&amp;gt;&lt;br /&gt;
   xcase=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   xtabs&lt;br /&gt;
&lt;br /&gt;
   i−pop−all&lt;br /&gt;
&lt;br /&gt;
   With UNIX System V STREAMS, removes all drivers from the stack.&lt;br /&gt;
&lt;br /&gt;
   i−push=&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   With UNIX System V STREAMS, pushes the driver (module) with the given&lt;br /&gt;
   name (string) onto the stack. For example, to make sure that a&lt;br /&gt;
   character device on Solaris supports termios etc, use the following&lt;br /&gt;
   options: i−pop−all,i−push=ptem,i−push=ldterm,i−push=ttcompat&lt;br /&gt;
&lt;br /&gt;
   PTY option group&lt;br /&gt;
&lt;br /&gt;
   These options are intended for use with the pty address type.&lt;br /&gt;
   link=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Generates a symbolic link that points to the actual pseudo terminal&lt;br /&gt;
   (pty). This might help to solve the problem that ptys are generated&lt;br /&gt;
   with more or less unpredictable names, making it difficult to directly&lt;br /&gt;
   access the socat generated pty automatically. With this option, the&lt;br /&gt;
   user can specify a &amp;quot;fix&amp;quot; point in the file hierarchy that helps him to&lt;br /&gt;
   access the actual pty (example). Beginning with socat version 1.4.3,&lt;br /&gt;
   the symbolic link is removed when the address is closed (but see option&lt;br /&gt;
   unlink−close).&lt;br /&gt;
&lt;br /&gt;
   wait−slave&lt;br /&gt;
&lt;br /&gt;
   Blocks the open phase until a process opens the slave side of the pty.&lt;br /&gt;
   Usually, socat continues after generating the pty with opening the next&lt;br /&gt;
   address or with entering the transfer loop. With the wait−slave option,&lt;br /&gt;
   socat waits until some process opens the slave side of the pty before&lt;br /&gt;
   continuing. This option only works if the operating system provides the&lt;br /&gt;
   poll() system call. And it depends on an undocumented behaviour of&lt;br /&gt;
   pty’s, so it does not work on all operating systems. It has&lt;br /&gt;
   successfully been tested on Linux, FreeBSD, NetBSD, and on Tru64 with&lt;br /&gt;
   openpty.&lt;br /&gt;
&lt;br /&gt;
   pty−interval=&amp;lt;seconds&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   When the wait−slave option is set, socat periodically checks the HUP&lt;br /&gt;
   condition using poll() to find if the pty’s slave side has been opened.&lt;br /&gt;
   The default polling interval is 1s. Use the pty−interval option&lt;br /&gt;
   [timeval] to change this value.&lt;br /&gt;
&lt;br /&gt;
   OPENSSL option group&lt;br /&gt;
&lt;br /&gt;
   These options apply to the openssl and openssl−listen address types.&lt;br /&gt;
   cipher=&amp;lt;cipherlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Selects the list of ciphers that may be used for the connection. See&lt;br /&gt;
   the man page of ciphers , section CIPHER LIST FORMAT, for detailed&lt;br /&gt;
   information about syntax, values, and default of &amp;lt;cipherlist&amp;gt;.&lt;br /&gt;
   Several cipher strings may be given, separated by ’:’. Some simple&lt;br /&gt;
   cipher strings:&lt;br /&gt;
&lt;br /&gt;
   3DES&lt;br /&gt;
&lt;br /&gt;
   Uses a cipher suite with triple DES.&lt;br /&gt;
&lt;br /&gt;
   MD5&lt;br /&gt;
&lt;br /&gt;
   Uses a cipher suite with MD5.&lt;br /&gt;
&lt;br /&gt;
   aNULL&lt;br /&gt;
&lt;br /&gt;
   Uses a cipher suite without authentication.&lt;br /&gt;
&lt;br /&gt;
   NULL&lt;br /&gt;
&lt;br /&gt;
   Does not use encryption.&lt;br /&gt;
&lt;br /&gt;
   HIGH&lt;br /&gt;
&lt;br /&gt;
   Uses a cipher suite with &amp;quot;high&amp;quot; encryption. Note that the peer must&lt;br /&gt;
   support the selected property, or the negotiation will fail.&lt;br /&gt;
&lt;br /&gt;
   method=&amp;lt;ssl−method&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Sets the protocol version to be used. Valid strings (not case&lt;br /&gt;
   sensitive) are:&lt;br /&gt;
&lt;br /&gt;
   SSL2&lt;br /&gt;
&lt;br /&gt;
   Select SSL protocol version 2.&lt;br /&gt;
&lt;br /&gt;
   SSL3&lt;br /&gt;
&lt;br /&gt;
   Select SSL protocol version 3.&lt;br /&gt;
&lt;br /&gt;
   SSL23&lt;br /&gt;
&lt;br /&gt;
   Select the best available SSL or TLS protocol. This is the default when&lt;br /&gt;
   this option is not provided.&lt;br /&gt;
&lt;br /&gt;
   TLS1&lt;br /&gt;
&lt;br /&gt;
   Select TLS protocol version 1.&lt;br /&gt;
&lt;br /&gt;
   TLS1.1&lt;br /&gt;
&lt;br /&gt;
   Select TLS protocol version 1.1.&lt;br /&gt;
&lt;br /&gt;
   TLS1.2&lt;br /&gt;
&lt;br /&gt;
   Select TLS protocol version 1.2.&lt;br /&gt;
&lt;br /&gt;
   DTLS1&lt;br /&gt;
&lt;br /&gt;
   Select DTLS protocol version 1.&lt;br /&gt;
&lt;br /&gt;
   verify=&amp;lt;bool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Controls check of the peer’s certificate. Default is 1 (true).&lt;br /&gt;
   Disabling verify might open your socket for everyone, making the&lt;br /&gt;
   encryption useless!&lt;br /&gt;
&lt;br /&gt;
   cert=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the file with the certificate and private key for&lt;br /&gt;
   authentication. The certificate must be in OpenSSL format (*.pem). With&lt;br /&gt;
   openssl−listen, use of this option is strongly recommended. Except with&lt;br /&gt;
   cipher aNULL, &amp;quot;no shared ciphers&amp;quot; error will occur when no certificate&lt;br /&gt;
   is given.&lt;br /&gt;
&lt;br /&gt;
   key=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the file with the private key. The private key may be in this&lt;br /&gt;
   file or in the file given with the cert option. The party that has to&lt;br /&gt;
   proof that it is the owner of a certificate needs the private key.&lt;br /&gt;
&lt;br /&gt;
   dhparams=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the file with the Diffie Hellman parameters. These parameters&lt;br /&gt;
   may also be in the file given with the cert option in which case the&lt;br /&gt;
   dhparams option is not needed.&lt;br /&gt;
&lt;br /&gt;
   cafile=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the file with the trusted (root) authority certificates. The&lt;br /&gt;
   file must be in PEM format and should contain one or more certificates.&lt;br /&gt;
   The party that checks the authentication of its peer trusts only&lt;br /&gt;
   certificates that are in this file.&lt;br /&gt;
&lt;br /&gt;
   capath=&amp;lt;dirname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specifies the directory with the trusted (root) certificates. The&lt;br /&gt;
   directory must contain certificates in PEM format and their hashes (see&lt;br /&gt;
   OpenSSL documentation)&lt;br /&gt;
&lt;br /&gt;
   egd=&amp;lt;filename&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   On some systems, openssl requires an explicit source of random data.&lt;br /&gt;
   Specify the socket name where an entropy gathering daemon like egd&lt;br /&gt;
   provides random data, e.g. /dev/egd−pool.&lt;br /&gt;
&lt;br /&gt;
   pseudo&lt;br /&gt;
&lt;br /&gt;
   On systems where openssl cannot find an entropy source and where no&lt;br /&gt;
   entropy gathering daemon can be utilized, this option activates a&lt;br /&gt;
   mechanism for providing pseudo entropy. This is archieved by taking the&lt;br /&gt;
   current time in microseconds for feeding the libc pseudo random number&lt;br /&gt;
   generator with an initial value. openssl is then feeded with output&lt;br /&gt;
   from random\() calls.&lt;br /&gt;
&lt;br /&gt;
   NOTE:This mechanism is not sufficient for generation of secure keys!&lt;br /&gt;
&lt;br /&gt;
   compress&lt;br /&gt;
&lt;br /&gt;
   Enable or disable the use of compression for a connection. Setting this&lt;br /&gt;
   to &amp;quot;none&amp;quot; disables compression, setting it to &amp;quot;auto&amp;quot; lets OpenSSL&lt;br /&gt;
   choose the best available algorithm supported by both parties. The&lt;br /&gt;
   default is to not touch any compression−related settings. NOTE:&lt;br /&gt;
   Requires OpenSSL 0.9.8 or higher and disabling compression with OpenSSL&lt;br /&gt;
   0.9.8 affects all new connections in the process.&lt;br /&gt;
&lt;br /&gt;
   commonname=&amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Specify the commonname that the peer certificate must match. With&lt;br /&gt;
   OPENSSL−CONNECT address this overrides the given hostname or IP target&lt;br /&gt;
   address; with OPENSSL−LISTEN this turns on check of peer certificates&lt;br /&gt;
   commonname. This option has only meaning when option verify is not&lt;br /&gt;
   disabled and the choosen cipher provides a peer certificate.&lt;br /&gt;
&lt;br /&gt;
   fips&lt;br /&gt;
&lt;br /&gt;
   Enables FIPS mode if compiled in. For info about the FIPS encryption&lt;br /&gt;
   implementation standard see http://oss−institute.org/fips−faq.html.&lt;br /&gt;
   This mode might require that the involved certificates are generated&lt;br /&gt;
   with a FIPS enabled version of openssl. Setting or clearing this option&lt;br /&gt;
   on one socat address affects all OpenSSL addresses of this process.&lt;br /&gt;
&lt;br /&gt;
   RETRY option group&lt;br /&gt;
&lt;br /&gt;
   Options that control retry of some system calls, especially connection&lt;br /&gt;
   attempts.&lt;br /&gt;
   retry=&amp;lt;num&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Number of retries before the connection or listen attempt is aborted.&lt;br /&gt;
   Default is 0, which means just one attempt.&lt;br /&gt;
&lt;br /&gt;
   interval=&amp;lt;timespec&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Time between consecutive attempts (seconds, [timespec]). Default is 1&lt;br /&gt;
   second.&lt;br /&gt;
&lt;br /&gt;
   forever&lt;br /&gt;
&lt;br /&gt;
   Performs an unlimited number of retry attempts.&lt;br /&gt;
&lt;br /&gt;
   TUN option group&lt;br /&gt;
&lt;br /&gt;
   Options that control Linux TUN/TAP interface device addresses.&lt;br /&gt;
   tun−device=&amp;lt;device−file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Instructs socat to take another path for the TUN clone device. Default&lt;br /&gt;
   is /dev/net/tun.&lt;br /&gt;
&lt;br /&gt;
   tun−name=&amp;lt;if−name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   Gives the resulting network interface a specific name instead of the&lt;br /&gt;
   system generated (tun0, tun1, etc.)&lt;br /&gt;
&lt;br /&gt;
   tun−type=[tun|tap]&lt;br /&gt;
&lt;br /&gt;
   Sets the type of the TUN device; use this option to generate a TAP&lt;br /&gt;
   device. See the Linux docu for the difference between these types. When&lt;br /&gt;
   you try to establish a tunnel between two TUN devices, their types&lt;br /&gt;
   should be the same.&lt;br /&gt;
&lt;br /&gt;
   iff−no−pi&lt;br /&gt;
&lt;br /&gt;
   Sets the IFF_NO_PI flag which controls if the device includes&lt;br /&gt;
   additional packet information in the tunnel. When you try to establish&lt;br /&gt;
   a tunnel between two TUN devices, these flags should have the same&lt;br /&gt;
   values.&lt;br /&gt;
&lt;br /&gt;
   iff−up&lt;br /&gt;
&lt;br /&gt;
   Sets the TUN network interface status UP. Strongly recommended.&lt;br /&gt;
&lt;br /&gt;
   iff−broadcast&lt;br /&gt;
&lt;br /&gt;
   Sets the BROADCAST flag of the TUN network interface.&lt;br /&gt;
&lt;br /&gt;
   iff−debug&lt;br /&gt;
&lt;br /&gt;
   Sets the DEBUG flag of the TUN network interface.&lt;br /&gt;
&lt;br /&gt;
   iff−loopback&lt;br /&gt;
&lt;br /&gt;
   Sets the LOOPBACK flag of the TUN network interface.&lt;br /&gt;
&lt;br /&gt;
   iff−pointopoint&lt;br /&gt;
&lt;br /&gt;
   Sets the POINTOPOINT flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−notrailers&lt;br /&gt;
&lt;br /&gt;
   Sets the NOTRAILERS flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−running&lt;br /&gt;
&lt;br /&gt;
   Sets the RUNNING flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−noarp&lt;br /&gt;
&lt;br /&gt;
   Sets the NOARP flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−promisc&lt;br /&gt;
&lt;br /&gt;
   Sets the PROMISC flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−allmulti&lt;br /&gt;
&lt;br /&gt;
   Sets the ALLMULTI flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−master&lt;br /&gt;
&lt;br /&gt;
   Sets the MASTER flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−slave&lt;br /&gt;
&lt;br /&gt;
   Sets the SLAVE flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−multicast&lt;br /&gt;
&lt;br /&gt;
   Sets the MULTICAST flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−portsel&lt;br /&gt;
&lt;br /&gt;
   Sets the PORTSEL flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−automedia&lt;br /&gt;
&lt;br /&gt;
   Sets the AUTOMEDIA flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
   iff−dynamic&lt;br /&gt;
&lt;br /&gt;
   Sets the DYNAMIC flag of the TUN device.&lt;br /&gt;
&lt;br /&gt;
=== DATA VALUES ===&lt;br /&gt;
&lt;br /&gt;
   This section explains the different data types that address parameters&lt;br /&gt;
   and address options can take.&lt;br /&gt;
   address−range&lt;br /&gt;
&lt;br /&gt;
   Is currently only implemented for IPv4 and IPv6. See address−option&lt;br /&gt;
   ‘range’&lt;br /&gt;
&lt;br /&gt;
   bool&lt;br /&gt;
&lt;br /&gt;
   &amp;quot;0&amp;quot; or &amp;quot;1&amp;quot;; if value is omitted, &amp;quot;1&amp;quot; is taken.&lt;br /&gt;
&lt;br /&gt;
   byte&lt;br /&gt;
&lt;br /&gt;
   An unsigned int number, read with strtoul() , lower or equal to&lt;br /&gt;
   UCHAR_MAX .&lt;br /&gt;
&lt;br /&gt;
   command−line&lt;br /&gt;
&lt;br /&gt;
   A string specifying a program name and its arguments, separated by&lt;br /&gt;
   single spaces.&lt;br /&gt;
&lt;br /&gt;
   data&lt;br /&gt;
&lt;br /&gt;
   A raw data specification following dalan syntax. Currently the only&lt;br /&gt;
   valid form is a string starting with ’x’ followed by an even number of&lt;br /&gt;
   hex digits, specifying a sequence of bytes.&lt;br /&gt;
&lt;br /&gt;
   directory&lt;br /&gt;
&lt;br /&gt;
   A string with usual UN*X directory name semantics.&lt;br /&gt;
&lt;br /&gt;
   facility&lt;br /&gt;
&lt;br /&gt;
   The name of a syslog facility in lower case characters.&lt;br /&gt;
&lt;br /&gt;
   fdnum&lt;br /&gt;
&lt;br /&gt;
   An unsigned int type, read with strtoul() , specifying a UN*X file&lt;br /&gt;
   descriptor.&lt;br /&gt;
&lt;br /&gt;
   filename&lt;br /&gt;
&lt;br /&gt;
   A string with usual UN*X filename semantics.&lt;br /&gt;
&lt;br /&gt;
   group&lt;br /&gt;
&lt;br /&gt;
   If the first character is a decimal digit, the value is read with&lt;br /&gt;
   strtoul() as unsigned integer specifying a group id. Otherwise, it must&lt;br /&gt;
   be an existing group name.&lt;br /&gt;
&lt;br /&gt;
   int&lt;br /&gt;
&lt;br /&gt;
   A number following the rules of the strtol() function with base &amp;quot;0&amp;quot;,&lt;br /&gt;
   i.e. decimal number, octal number with leading &amp;quot;0&amp;quot;, or hexadecimal&lt;br /&gt;
   number with leading &amp;quot;0x&amp;quot;. The value must fit into a C int.&lt;br /&gt;
&lt;br /&gt;
   interface&lt;br /&gt;
&lt;br /&gt;
   A string specifying the device name of a network interface as shown by&lt;br /&gt;
   ifconfig or procan, e.g. &amp;quot;eth0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
   IP address&lt;br /&gt;
&lt;br /&gt;
   An IPv4 address in numbers−and−dots notation, an IPv6 address in hex&lt;br /&gt;
   notation enclosed in brackets, or a hostname that resolves to an IPv4&lt;br /&gt;
   or an IPv6 address.&lt;br /&gt;
   Examples: 127.0.0.1, [::1], www.dest−unreach.org, dns1&lt;br /&gt;
&lt;br /&gt;
   IPv4 address&lt;br /&gt;
&lt;br /&gt;
   An IPv4 address in numbers−and−dots notation or a hostname that&lt;br /&gt;
   resolves to an IPv4 address.&lt;br /&gt;
   Examples: 127.0.0.1, www.dest−unreach.org, dns2&lt;br /&gt;
&lt;br /&gt;
   IPv6 address&lt;br /&gt;
&lt;br /&gt;
   An iPv6 address in hexnumbers−and−colons notation enclosed in brackets,&lt;br /&gt;
   or a hostname that resolves to an IPv6 address.&lt;br /&gt;
   Examples: [::1], [1234:5678:9abc:def0:1234:5678:9abc:def0],&lt;br /&gt;
   ip6name.domain.org&lt;br /&gt;
&lt;br /&gt;
   long&lt;br /&gt;
&lt;br /&gt;
   A number read with strtol() . The value must fit into a C long.&lt;br /&gt;
&lt;br /&gt;
   long long&lt;br /&gt;
&lt;br /&gt;
   A number read with strtoll() . The value must fit into a C long long.&lt;br /&gt;
&lt;br /&gt;
   off_t&lt;br /&gt;
&lt;br /&gt;
   An implementation dependend signed number, usually 32 bits, read with&lt;br /&gt;
   strtol or strtoll.&lt;br /&gt;
&lt;br /&gt;
   off64_t&lt;br /&gt;
&lt;br /&gt;
   An implementation dependend signed number, usually 64 bits, read with&lt;br /&gt;
   strtol or strtoll.&lt;br /&gt;
&lt;br /&gt;
   mode_t&lt;br /&gt;
&lt;br /&gt;
   An unsigned integer, read with strtoul() , specifying mode (permission)&lt;br /&gt;
   bits.&lt;br /&gt;
&lt;br /&gt;
   pid_t&lt;br /&gt;
&lt;br /&gt;
   A number, read with strtol() , specifying a process id.&lt;br /&gt;
&lt;br /&gt;
   port&lt;br /&gt;
&lt;br /&gt;
   A uint16_t (16 bit unsigned number) specifying a TCP or UDP port, read&lt;br /&gt;
   with strtoul() .&lt;br /&gt;
&lt;br /&gt;
   protocol&lt;br /&gt;
&lt;br /&gt;
   An unsigned 8 bit number, read with strtoul() .&lt;br /&gt;
&lt;br /&gt;
   size_t&lt;br /&gt;
&lt;br /&gt;
   An unsigned number with size_t limitations, read with strtoul .&lt;br /&gt;
&lt;br /&gt;
   sockname&lt;br /&gt;
&lt;br /&gt;
   A socket address. See address−option ‘bind’&lt;br /&gt;
&lt;br /&gt;
   string&lt;br /&gt;
&lt;br /&gt;
   A sequence of characters, not containing ’\0’ and, depending on the&lt;br /&gt;
   position within the command line, ’:’, ’,’, or &amp;quot;!!&amp;quot;. Note that you&lt;br /&gt;
   might have to escape shell meta characters in the command line.&lt;br /&gt;
&lt;br /&gt;
   TCP service&lt;br /&gt;
&lt;br /&gt;
   A service name, not starting with a digit, that is resolved by&lt;br /&gt;
   getservbyname() , or an unsigned int 16 bit number read with strtoul()&lt;br /&gt;
   .&lt;br /&gt;
&lt;br /&gt;
   timeval&lt;br /&gt;
&lt;br /&gt;
   A double float specifying seconds; the number is mapped into a struct&lt;br /&gt;
   timeval, consisting of seconds and microseconds.&lt;br /&gt;
&lt;br /&gt;
   timespec&lt;br /&gt;
&lt;br /&gt;
   A double float specifying seconds; the number is mapped into a struct&lt;br /&gt;
   timespec, consisting of seconds and nanoseconds.&lt;br /&gt;
&lt;br /&gt;
   UDP service&lt;br /&gt;
&lt;br /&gt;
   A service name, not starting with a digit, that is resolved by&lt;br /&gt;
   getservbyname() , or an unsigned int 16 bit number read with strtoul()&lt;br /&gt;
   .&lt;br /&gt;
&lt;br /&gt;
   unsigned int&lt;br /&gt;
&lt;br /&gt;
   A number read with strtoul() . The value must fit into a C unsigned&lt;br /&gt;
   int.&lt;br /&gt;
&lt;br /&gt;
   user&lt;br /&gt;
&lt;br /&gt;
   If the first character is a decimal digit, the value is read with&lt;br /&gt;
   strtoul() as unsigned integer specifying a user id. Otherwise, it must&lt;br /&gt;
   be an existing user name.&lt;br /&gt;
&lt;br /&gt;
=== EXAMPLES ===&lt;br /&gt;
&lt;br /&gt;
   socat − TCP4:www.domain.org:80&lt;br /&gt;
&lt;br /&gt;
   transfers data between STDIO (−) and a TCP4 connection to port 80 of&lt;br /&gt;
   host www.domain.org. This example results in an interactive connection&lt;br /&gt;
   similar to telnet or netcat. The stdin terminal parameters are not&lt;br /&gt;
   changed, so you may close the relay with ^D or abort it with ^C.&lt;br /&gt;
&lt;br /&gt;
   socat -d -d READLINE,history=$HOME/.http_history \&lt;br /&gt;
   TCP4:www.domain.org:www,crnl&lt;br /&gt;
&lt;br /&gt;
   this is similar to the previous example, but you can edit the current&lt;br /&gt;
   line in a bash like manner (READLINE) and use the history file&lt;br /&gt;
   .http_history; socat prints messages about progress (−d −d). The port&lt;br /&gt;
   is specified by service name (www), and correct network line&lt;br /&gt;
   termination characters (crnl) instead of NL are used.&lt;br /&gt;
&lt;br /&gt;
   socat TCP4−LISTEN:www TCP4:www.domain.org:www&lt;br /&gt;
&lt;br /&gt;
   installs a simple TCP port forwarder. With TCP4−LISTEN it listens on&lt;br /&gt;
   local port &amp;quot;www&amp;quot; until a connection comes in, accepts it, then connects&lt;br /&gt;
   to the remote host (TCP4) and starts data transfer. It will not accept&lt;br /&gt;
   a econd connection.&lt;br /&gt;
&lt;br /&gt;
   socat -d -d -lmlocal2 \&lt;br /&gt;
   TCP4-LISTEN:80,bind=myaddr1,reuseaddr,fork,su=nobody,range=10.0.0.0/8 \&lt;br /&gt;
   TCP4:www.domain.org:80,bind=myaddr2&lt;br /&gt;
&lt;br /&gt;
   TCP port forwarder, each side bound to another local IP address (bind).&lt;br /&gt;
   This example handles an almost arbitrary number of parallel or&lt;br /&gt;
   consecutive connections by fork’ing a new process after each accept() .&lt;br /&gt;
   It provides a little security by su’ing to user nobody after forking;&lt;br /&gt;
   it only permits connections from the private 10 network (range); due to&lt;br /&gt;
   reuseaddr, it allows immediate restart after master process’s&lt;br /&gt;
   termination, even if some child sockets are not completely shut down.&lt;br /&gt;
   With −lmlocal2, socat logs to stderr until successfully reaching the&lt;br /&gt;
   accept loop. Further logging is directed to syslog with facility&lt;br /&gt;
   local2.&lt;br /&gt;
&lt;br /&gt;
   socat TCP4-LISTEN:5555,fork,tcpwrap=script \&lt;br /&gt;
   EXEC:/bin/myscript,chroot=/home/sandbox,su-d=sandbox,pty,stderr&lt;br /&gt;
&lt;br /&gt;
   a simple server that accepts connections (TCP4−LISTEN) and fork’s a new&lt;br /&gt;
   child process for each connection; every child acts as single relay.&lt;br /&gt;
   The client must match the rules for daemon process name &amp;quot;script&amp;quot; in&lt;br /&gt;
   /etc/hosts.allow and /etc/hosts.deny, otherwise it is refused access&lt;br /&gt;
   (see &amp;quot;man 5 hosts_access&amp;quot;). For EXEC’uting the program, the child&lt;br /&gt;
   process chroot’s to /home/sandbox, su’s to user sandbox, and then&lt;br /&gt;
   starts the program /home/sandbox/bin/myscript. Socat and myscript&lt;br /&gt;
   communicate via a pseudo tty (pty); myscript’s stderr is redirected to&lt;br /&gt;
   stdout, so its error messages are transferred via socat to the&lt;br /&gt;
   connected client.&lt;br /&gt;
&lt;br /&gt;
   socat EXEC:&amp;quot;mail.sh target@domain.com&amp;quot;,fdin=3,fdout=4 \&lt;br /&gt;
   TCP4:mail.relay.org:25,crnl,bind=alias1.server.org,mss=512&lt;br /&gt;
&lt;br /&gt;
   mail.sh is a shell script, distributed with socat, that implements a&lt;br /&gt;
   simple SMTP client. It is programmed to &amp;quot;speak&amp;quot; SMTP on its FDs 3 (in)&lt;br /&gt;
   and 4 (out). The fdin and fdout options tell socat to use these FDs for&lt;br /&gt;
   communication with the program. Because mail.sh inherits stdin and&lt;br /&gt;
   stdout while socat does not use them, the script can read a mail body&lt;br /&gt;
   from stdin. Socat makes alias1 your local source address (bind), cares&lt;br /&gt;
   for correct network line termination (crnl) and sends at most 512 data&lt;br /&gt;
   bytes per packet (mss).&lt;br /&gt;
&lt;br /&gt;
   socat −,escape=0x0f /dev/ttyS0,rawer,crnl&lt;br /&gt;
&lt;br /&gt;
   opens an interactive connection via the serial line, e.g. for talking&lt;br /&gt;
   with a modem. rawer sets the console’s and ttyS0’s terminal parameters&lt;br /&gt;
   to practicable values, crnl converts to correct newline characters.&lt;br /&gt;
   escape allows to terminate the socat process with character control−O.&lt;br /&gt;
   Consider using READLINE instead of the first address.&lt;br /&gt;
&lt;br /&gt;
   socat UNIX-LISTEN:/tmp/.X11-unix/X1,fork \&lt;br /&gt;
   SOCKS4:host.victim.org:127.0.0.1:6000,socksuser=nobody,sourceport=20&lt;br /&gt;
&lt;br /&gt;
   with UNIX−LISTEN, socat opens a listening UNIX domain socket&lt;br /&gt;
   /tmp/.X11−unix/X1. This path corresponds to local XWindow display :1 on&lt;br /&gt;
   your machine, so XWindow client connections to DISPLAY=:1 are accepted.&lt;br /&gt;
   Socat then speaks with the SOCKS4 server host.victim.org that might&lt;br /&gt;
   permit sourceport 20 based connections due to an FTP related weakness&lt;br /&gt;
   in its static IP filters. Socat pretends to be invoked by socksuser&lt;br /&gt;
   nobody, and requests to be connected to loopback port 6000 (only weak&lt;br /&gt;
   sockd configurations will allow this). So we get a connection to the&lt;br /&gt;
   victims XWindow server and, if it does not require MIT cookies or&lt;br /&gt;
   Kerberos authentication, we can start work. Please note that there can&lt;br /&gt;
   only be one connection at a time, because TCP can establish only one&lt;br /&gt;
   session with a given set of addresses and ports.&lt;br /&gt;
&lt;br /&gt;
   socat −u /tmp/readdata,seek−end=0,ignoreeof −&lt;br /&gt;
&lt;br /&gt;
   this is an example for unidirectional data transfer (−u). Socat&lt;br /&gt;
   transfers data from file /tmp/readdata (implicit address GOPEN),&lt;br /&gt;
   starting at its current end (seek−end=0 lets socat start reading at&lt;br /&gt;
   current end of file; use seek=0 or no seek option to first read the&lt;br /&gt;
   existing data) in a &amp;quot;tail −f&amp;quot; like mode (ignoreeof). The &amp;quot;file&amp;quot; might&lt;br /&gt;
   also be a listening UNIX domain socket (do not use a seek option then).&lt;br /&gt;
&lt;br /&gt;
   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |&lt;br /&gt;
   socat - EXEC:’ssh -l user server’,pty,setsid,ctty&lt;br /&gt;
&lt;br /&gt;
   EXEC’utes an ssh session to server. Uses a pty for communication&lt;br /&gt;
   between socat and ssh, makes it ssh’s controlling tty (ctty), and makes&lt;br /&gt;
   this pty the owner of a new process group (setsid), so ssh accepts the&lt;br /&gt;
   password from socat.&lt;br /&gt;
&lt;br /&gt;
   socat -u TCP4-LISTEN:3334,reuseaddr,fork \&lt;br /&gt;
   OPEN:/tmp/in.log,creat,append&lt;br /&gt;
&lt;br /&gt;
   implements a simple network based message collector. For each client&lt;br /&gt;
   connecting to port 3334, a new child process is generated (option&lt;br /&gt;
   fork). All data sent by the clients are append’ed to the file&lt;br /&gt;
   /tmp/in.log. If the file does not exist, socat creat’s it. Option&lt;br /&gt;
   reuseaddr allows immediate restart of the server process.&lt;br /&gt;
&lt;br /&gt;
   socat READLINE,noecho=’[Pp]assword:’ EXEC:’ftp&lt;br /&gt;
   ftp.server.com’,pty,setsid,ctty&lt;br /&gt;
&lt;br /&gt;
   wraps a command line history (READLINE) around the EXEC’uted ftp client&lt;br /&gt;
   utility. This allows editing and reuse of FTP commands for relatively&lt;br /&gt;
   comfortable browsing through the ftp directory hierarchy. The password&lt;br /&gt;
   is echoed! pty is required to have ftp issue a prompt. Nevertheless,&lt;br /&gt;
   there may occur some confusion with the password and FTP prompts.&lt;br /&gt;
&lt;br /&gt;
   socat PTY,link=$HOME/dev/vmodem0,rawer,wait-slave \&lt;br /&gt;
   EXEC:&amp;quot;ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   generates a pseudo terminal device (PTY) on the client that can be&lt;br /&gt;
   reached under the symbolic link $HOME/dev/vmodem0. An application that&lt;br /&gt;
   expects a serial line or modem can be configured to use&lt;br /&gt;
   $HOME/dev/vmodem0; its traffic will be directed to a modemserver via&lt;br /&gt;
   ssh where another socat instance links it to /dev/ttyS0.&lt;br /&gt;
&lt;br /&gt;
   socat TCP4-LISTEN:2022,reuseaddr,fork \&lt;br /&gt;
   PROXY:proxy:www.domain.org:22,proxyport=3128,proxyauth=user:pass&lt;br /&gt;
&lt;br /&gt;
   starts a forwarder that accepts connections on port 2022, and directs&lt;br /&gt;
   them through the proxy daemon listening on port 3128 (proxyport) on&lt;br /&gt;
   host proxy, using the CONNECT method, where they are authenticated as&lt;br /&gt;
   &amp;quot;user&amp;quot; with &amp;quot;pass&amp;quot; (proxyauth). The proxy should establish connections&lt;br /&gt;
   to host www.domain.org on port 22 then.&lt;br /&gt;
&lt;br /&gt;
   socat − SSL:server:4443,cafile=server.crt,cert=client.pem&lt;br /&gt;
&lt;br /&gt;
   is an OpenSSL client that tries to establish a secure connection to an&lt;br /&gt;
   SSL server. Option cafile specifies a file that contains trust&lt;br /&gt;
   certificates: we trust the server only when it presents one of these&lt;br /&gt;
   certificates and proofs that it owns the related private key. Otherwise&lt;br /&gt;
   the connection is terminated. With cert a file containing the client&lt;br /&gt;
   certificate and the associated private key is specified. This is&lt;br /&gt;
   required in case the server wishes a client authentication; many&lt;br /&gt;
   Internet servers do not.&lt;br /&gt;
   The first address (’−’) can be replaced by almost any other socat&lt;br /&gt;
   address.&lt;br /&gt;
&lt;br /&gt;
   socat&lt;br /&gt;
   SSL−LISTEN:4443,reuseaddr,pf=ip4,fork,cert=server.pem,cafile=client.crt&lt;br /&gt;
   PIPE&lt;br /&gt;
&lt;br /&gt;
   is an OpenSSL server that accepts TCP connections, presents the&lt;br /&gt;
   certificate from the file server.pem and forces the client to present a&lt;br /&gt;
   certificate that is verified against cafile.crt.&lt;br /&gt;
   The second address (’PIPE’) can be replaced by almost any other socat&lt;br /&gt;
   address.&lt;br /&gt;
   For instructions on generating and distributing OpenSSL keys and&lt;br /&gt;
   certificates see the additional socat docu socat−openssl.txt.&lt;br /&gt;
&lt;br /&gt;
   echo |socat −u − file:/tmp/bigfile,create,largefile,seek=100000000000&lt;br /&gt;
&lt;br /&gt;
   creates a 100GB sparse file; this requires a file system type that&lt;br /&gt;
   supports this (ext2, ext3, reiserfs, jfs; not minix, vfat). The&lt;br /&gt;
   operation of writing 1 byte might take long (reiserfs: some minutes;&lt;br /&gt;
   ext2: &amp;quot;no&amp;quot; time), and the resulting file can consume some disk space&lt;br /&gt;
   with just its inodes (reiserfs: 2MB; ext2: 16KB).&lt;br /&gt;
&lt;br /&gt;
   socat tcp−l:7777,reuseaddr,fork system:’filan −i 0 −s &amp;gt;&amp;amp;2’,nofork&lt;br /&gt;
&lt;br /&gt;
   listens for incoming TCP connections on port 7777. For each accepted&lt;br /&gt;
   connection, invokes a shell. This shell has its stdin and stdout&lt;br /&gt;
   directly connected to the TCP socket (nofork). The shell starts filan&lt;br /&gt;
   and lets it print the socket addresses to stderr (your terminal&lt;br /&gt;
   window).&lt;br /&gt;
&lt;br /&gt;
   echo −e &amp;quot;\0\14\0\0\c&amp;quot; |socat −u −&lt;br /&gt;
   file:/usr/bin/squid.exe,seek=0x00074420&lt;br /&gt;
&lt;br /&gt;
   functions as primitive binary editor: it writes the 4 bytes 000 014 000&lt;br /&gt;
   000 to the executable /usr/bin/squid at offset 0x00074420 (this is a&lt;br /&gt;
   real world patch to make the squid executable from Cygwin run under&lt;br /&gt;
   Windows, actual per May 2004).&lt;br /&gt;
&lt;br /&gt;
   socat − tcp:www.blackhat.org:31337,readbytes=1000&lt;br /&gt;
&lt;br /&gt;
   connects to an unknown service and prevents being flooded.&lt;br /&gt;
&lt;br /&gt;
   socat −U TCP:target:9999,end−close TCP−L:8888,reuseaddr,fork&lt;br /&gt;
&lt;br /&gt;
   merges data arriving from different TCP streams on port 8888 to just&lt;br /&gt;
   one stream to target:9999. The end−close option prevents the child&lt;br /&gt;
   processes forked off by the second address from terminating the shared&lt;br /&gt;
   connection to 9999 (close\(2) just unlinks the inode which stays active&lt;br /&gt;
   as long as the parent process lives; shutdown\(2) would actively&lt;br /&gt;
   terminate the connection).&lt;br /&gt;
&lt;br /&gt;
   socat −&lt;br /&gt;
   UDP4−DATAGRAM:192.168.1.0:123,sp=123,broadcast,range=192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
   sends a broadcast to the network 192.168.1.0/24 and receives the&lt;br /&gt;
   replies of the timeservers there. Ignores NTP packets from hosts&lt;br /&gt;
   outside this network.&lt;br /&gt;
&lt;br /&gt;
   socat −&lt;br /&gt;
   SOCKET−DATAGRAM:2:2:17:x007bxc0a80100x0000000000000000,bind=x007bx00000&lt;br /&gt;
   000x0000000000000000,setsockopt−int=1:6:1,range=x0000xc0a80100x00000000&lt;br /&gt;
   00000000:x0000xffffff00x0000000000000000&lt;br /&gt;
&lt;br /&gt;
   is semantically equivalent to the previous example, but all parameters&lt;br /&gt;
   are specified in generic form. the value 6 of setsockopt−int is the&lt;br /&gt;
   Linux value for SO_BROADCAST.&lt;br /&gt;
&lt;br /&gt;
   socat − IP4−DATAGRAM:255.255.255.255:44,broadcast,range=10.0.0.0/8&lt;br /&gt;
&lt;br /&gt;
   sends a broadcast to the local network\(s) using protocol 44. Accepts&lt;br /&gt;
   replies from the private address range only.&lt;br /&gt;
&lt;br /&gt;
   socat −&lt;br /&gt;
   UDP4−DATAGRAM:224.255.0.1:6666,bind=:6666,ip−add−membership=224.255.0.1&lt;br /&gt;
   :eth0&lt;br /&gt;
&lt;br /&gt;
   transfers data from stdin to the specified multicast address using UDP.&lt;br /&gt;
   Both local and remote ports are 6666. Tells the interface eth0 to also&lt;br /&gt;
   accept multicast packets of the given group. Multiple hosts on the&lt;br /&gt;
   local network can run this command, so all data sent by any of the&lt;br /&gt;
   hosts will be received by all the other ones. Note that there are many&lt;br /&gt;
   possible reasons for failure, including IP−filters, routing issues,&lt;br /&gt;
   wrong interface selection by the operating system, bridges, or a badly&lt;br /&gt;
   configured switch.&lt;br /&gt;
&lt;br /&gt;
   socat TCP:host2:4443 TUN:192.168.255.1/24,up&lt;br /&gt;
&lt;br /&gt;
   establishes one side of a virtual (but not private!) network with host2&lt;br /&gt;
   where a similar process might run, with UDP−L and tun address&lt;br /&gt;
   192.168.255.2. They can reach each other using the addresses&lt;br /&gt;
   192.168.255.1 and 192.168.255.2. Note that streaming eg. via TCP or SSL&lt;br /&gt;
   does not guarantee to retain packet boundaries and may thus cause&lt;br /&gt;
   packet loss.&lt;br /&gt;
&lt;br /&gt;
   socat PTY,link=/var/run/ppp,rawer INTERFACE:hdlc0&lt;br /&gt;
&lt;br /&gt;
   circumvents the problem that pppd requires a serial device and thus&lt;br /&gt;
   might not be able to work on a synchronous line that is represented by&lt;br /&gt;
   a network device. socat creates a PTY to make pppd happy, binds to the&lt;br /&gt;
   network interface hdlc0, and can transfer data between both devices.&lt;br /&gt;
   Use pppd on device /var/run/ppp then.&lt;br /&gt;
&lt;br /&gt;
   socat −T 1 −d −d TCP−L:10081,reuseaddr,fork,crlf SYSTEM:&amp;quot;echo −e&lt;br /&gt;
   \&amp;quot;\\\&amp;quot;HTTP/1.0 200 OK\\\nDocumentType: text/plain\\\n\\\ndate:&lt;br /&gt;
   \$\(date\)\\\nserver:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\\\nclient:&lt;br /&gt;
   \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n\\\&amp;quot;\&amp;quot;; cat; echo −e&lt;br /&gt;
   \&amp;quot;\\\&amp;quot;\\\n\\\&amp;quot;\&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   creates a simple HTTP echo server: each HTTP client that connects gets&lt;br /&gt;
   a valid HTTP reply that contains information about the client address&lt;br /&gt;
   and port as it is seen by the server host, the host address (which&lt;br /&gt;
   might vary on multihomed servers), and the original client request.&lt;br /&gt;
&lt;br /&gt;
   socat −d −d&lt;br /&gt;
   UDP4−RECVFROM:9999,so−broadcast,so−timestamp,ip−pktinfo,ip−recverr,ip−r&lt;br /&gt;
   ecvopts,ip−recvtos,ip−recvttl!!−&lt;br /&gt;
   SYSTEM:’export; sleep 1’ |grep SOCAT&lt;br /&gt;
&lt;br /&gt;
   waits for an incoming UDP packet on port 9999 and prints the&lt;br /&gt;
   environment variables provided by socat. On BSD based systems you have&lt;br /&gt;
   to replace ip−pktinfo with ip−recvdstaddr,ip−recvif. Especially&lt;br /&gt;
   interesting is SOCAT_IP_DSTADDR: it contains the target address of the&lt;br /&gt;
   packet which may be a unicast, multicast, or broadcast address.&lt;br /&gt;
&lt;br /&gt;
=== DIAGNOSTICS ===&lt;br /&gt;
&lt;br /&gt;
   Socat uses a logging mechanism that allows to filter messages by&lt;br /&gt;
   severity. The severities provided are more or less compatible to the&lt;br /&gt;
   appropriate syslog priority. With one or up to four occurrences of the&lt;br /&gt;
   −d command line option, the lowest priority of messages that are issued&lt;br /&gt;
   can be selected. Each message contains a single uppercase character&lt;br /&gt;
   specifying the messages severity (one of F, E, W, N, I, or D)&lt;br /&gt;
&lt;br /&gt;
   FATAL:&lt;br /&gt;
&lt;br /&gt;
   Conditions that require unconditional and immediate program&lt;br /&gt;
   termination.&lt;br /&gt;
&lt;br /&gt;
   ERROR:&lt;br /&gt;
&lt;br /&gt;
   Conditions that prevent proper program processing. Usually the program&lt;br /&gt;
   is terminated (see option −s).&lt;br /&gt;
&lt;br /&gt;
   WARNING:&lt;br /&gt;
&lt;br /&gt;
   Something did not function correctly or is in a state where correct&lt;br /&gt;
   further processing cannot be guaranteed, but might be possible.&lt;br /&gt;
&lt;br /&gt;
   NOTICE:&lt;br /&gt;
&lt;br /&gt;
   Interesting actions of the program, e.g. for supervising socat in some&lt;br /&gt;
   kind of server mode.&lt;br /&gt;
&lt;br /&gt;
   INFO:&lt;br /&gt;
&lt;br /&gt;
   Description of what the program does, and maybe why it happens. Allows&lt;br /&gt;
   to monitor the lifecycles of file descriptors.&lt;br /&gt;
&lt;br /&gt;
   DEBUG:&lt;br /&gt;
&lt;br /&gt;
   Description of how the program works, all system or library calls and&lt;br /&gt;
   their results.&lt;br /&gt;
&lt;br /&gt;
   Log messages can be written to stderr, to a file, or to syslog.&lt;br /&gt;
&lt;br /&gt;
   On exit, socat gives status 0 if it terminated due to EOF or inactivity&lt;br /&gt;
   timeout, with a positive value on error, and with a negative value on&lt;br /&gt;
   fatal error.&lt;br /&gt;
&lt;br /&gt;
=== FILES ===&lt;br /&gt;
&lt;br /&gt;
   /usr/bin/socat&lt;br /&gt;
   /usr/bin/filan&lt;br /&gt;
   /usr/bin/procan&lt;br /&gt;
&lt;br /&gt;
=== ENVIRONMENT VARIABLES ===&lt;br /&gt;
&lt;br /&gt;
   Input variables carry information from the environment to socat, output&lt;br /&gt;
   variables are set by socat for use in executed scripts and programs.&lt;br /&gt;
&lt;br /&gt;
   In the output variables beginning with &amp;quot;SOCAT&amp;quot; this prefix is actually&lt;br /&gt;
   replaced by the upper case name of the executable or the value of&lt;br /&gt;
   option −lp.&lt;br /&gt;
   SOCAT_DEFAULT_LISTEN_IP (input)&lt;br /&gt;
&lt;br /&gt;
   (Values 4 or 6) Sets the IP version to be used for listen, recv, and&lt;br /&gt;
   recvfrom addresses if no pf (protocol−family) option is given. Is&lt;br /&gt;
   overridden by socat options −4 or −6.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_PREFERRED_RESOLVE_IP (input)&lt;br /&gt;
&lt;br /&gt;
   (Values 0, 4, or 6) Sets the IP version to be used when resolving&lt;br /&gt;
   target host names when version is not specified by address type, option&lt;br /&gt;
   pf (protocol−family), or address format. If name resolution does not&lt;br /&gt;
   return a matching entry, the first result (with differing IP version)&lt;br /&gt;
   is taken. With value 0, socat always selects the first record and its&lt;br /&gt;
   IP version.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_FORK_WAIT (input)&lt;br /&gt;
&lt;br /&gt;
   Specifies the time (seconds) to sleep the parent and child processes&lt;br /&gt;
   after successful fork\(). Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_VERSION (output)&lt;br /&gt;
&lt;br /&gt;
   Socat sets this variable to its version string, e.g. &amp;quot;1.7.0.0&amp;quot; for&lt;br /&gt;
   released versions or e.g. &amp;quot;1.6.0.1+envvar&amp;quot; for temporary versions; can&lt;br /&gt;
   be used in scripts invoked by socat.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_PID (output)&lt;br /&gt;
&lt;br /&gt;
   Socat sets this variable to its process id. In case of fork address&lt;br /&gt;
   option, SOCAT_PID gets the child processes id. Forking for exec and&lt;br /&gt;
   system does not change SOCAT_PID.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_PPID (output)&lt;br /&gt;
&lt;br /&gt;
   Socat sets this variable to its process id. In case of fork, SOCAT_PPID&lt;br /&gt;
   keeps the pid of the master process.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_PEERADDR (output)&lt;br /&gt;
&lt;br /&gt;
   With passive socket addresses (all LISTEN and RECVFROM addresses), this&lt;br /&gt;
   variable is set to a string describing the peers socket address. Port&lt;br /&gt;
   information is not included.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_PEERPORT (output)&lt;br /&gt;
&lt;br /&gt;
   With appropriate passive socket addresses (TCP, UDP, and SCTP − LISTEN&lt;br /&gt;
   and RECVFROM), this variable is set to a string containing the number&lt;br /&gt;
   of the peer port.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_SOCKADDR (output)&lt;br /&gt;
&lt;br /&gt;
   With all LISTEN addresses, this variable is set to a string describing&lt;br /&gt;
   the local socket address. Port information is not included example&lt;br /&gt;
&lt;br /&gt;
   SOCAT_SOCKPORT (output)&lt;br /&gt;
&lt;br /&gt;
   With TCP−LISTEN, UDP−LISTEN, and SCTP−LISTEN addresses, this variable&lt;br /&gt;
   is set to the local port.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_TIMESTAMP (output)&lt;br /&gt;
&lt;br /&gt;
   With all RECVFROM addresses where address option so−timestamp is&lt;br /&gt;
   applied, socat sets this variable to the resulting timestamp.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_OPTIONS (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option ip−recvopts&lt;br /&gt;
   is applied, socat fills this variable with the IP options of the&lt;br /&gt;
   received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_DSTADDR (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option&lt;br /&gt;
   ip−recvdstaddr (BSD) or ip−pktinfo (other platforms) is applied, socat&lt;br /&gt;
   sets this variable to the destination address of the received packet.&lt;br /&gt;
   This is particularly useful to identify broadcast and multicast&lt;br /&gt;
   addressed packets.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_IF (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option ip−recvif&lt;br /&gt;
   (BSD) or ip−pktinfo (other platforms) is applied, socat sets this&lt;br /&gt;
   variable to the name of the interface where the packet was received.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_LOCADDR (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option ip−pktinfo&lt;br /&gt;
   is applied, socat sets this variable to the address of the interface&lt;br /&gt;
   where the packet was received.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_TOS (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option ip−recvtos&lt;br /&gt;
   is applied, socat sets this variable to the TOS (type of service) of&lt;br /&gt;
   the received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IP_TTL (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv4 based RECVFROM addresses where address option ip−recvttl&lt;br /&gt;
   is applied, socat sets this variable to the TTL (time to live) of the&lt;br /&gt;
   received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IPV6_HOPLIMIT (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv6 based RECVFROM addresses where address option&lt;br /&gt;
   ipv6−recvhoplimit is applied, socat sets this variable to the hoplimit&lt;br /&gt;
   value of the received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IPV6_DSTADDR (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv6 based RECVFROM addresses where address option&lt;br /&gt;
   ipv6−recvpktinfo is applied, socat sets this variable to the&lt;br /&gt;
   destination address of the received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_IPV6_TCLASS (output)&lt;br /&gt;
&lt;br /&gt;
   With all IPv6 based RECVFROM addresses where address option&lt;br /&gt;
   ipv6−recvtclass is applied, socat sets this variable to the transfer&lt;br /&gt;
   class of the received packet.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_OPENSSL_X509_ISSUER (output)&lt;br /&gt;
&lt;br /&gt;
   Issuer field from peer certificate&lt;br /&gt;
&lt;br /&gt;
   SOCAT_OPENSSL_X509_SUBJECT (output)&lt;br /&gt;
&lt;br /&gt;
   Subject field from peer certificate&lt;br /&gt;
&lt;br /&gt;
   SOCAT_OPENSSL_X509_COMMONNAME (output)&lt;br /&gt;
&lt;br /&gt;
   commonName entries from peer certificates subject. Multiple values are&lt;br /&gt;
   separated by &amp;quot; // &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
   SOCAT_OPENSSL_X509_* (output)&lt;br /&gt;
&lt;br /&gt;
   all other entries from peer certificates subject&lt;br /&gt;
&lt;br /&gt;
   SOCAT_OPENSSL_X509V3_DNS (output)&lt;br /&gt;
&lt;br /&gt;
   DNS entries from peer certificates extensions − subjectAltName field.&lt;br /&gt;
   Multiple values are separated by &amp;quot; // &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
   HOSTNAME (input)&lt;br /&gt;
&lt;br /&gt;
   Is used to determine the hostname for logging (see −lh).&lt;br /&gt;
&lt;br /&gt;
   LOGNAME (input)&lt;br /&gt;
&lt;br /&gt;
   Is used as name for the socks client user name if no socksuser is&lt;br /&gt;
   given.&lt;br /&gt;
   With options su and su−d, LOGNAME is set to the given user name.&lt;br /&gt;
&lt;br /&gt;
   USER (input)&lt;br /&gt;
&lt;br /&gt;
   Is used as name for the socks client user name if no socksuser is given&lt;br /&gt;
   and LOGNAME is empty.&lt;br /&gt;
   With options su and su−d, USER is set to the given user name.&lt;br /&gt;
&lt;br /&gt;
   SHELL (output)&lt;br /&gt;
&lt;br /&gt;
   With options su and su−d, SHELL is set to the login shell of the given&lt;br /&gt;
   user.&lt;br /&gt;
&lt;br /&gt;
   PATH (output)&lt;br /&gt;
&lt;br /&gt;
   Can be set with option path for exec and system addresses.&lt;br /&gt;
&lt;br /&gt;
   HOME (output)&lt;br /&gt;
&lt;br /&gt;
   With options su and su−d, HOME is set to the home directory of the&lt;br /&gt;
   given user.&lt;br /&gt;
&lt;br /&gt;
=== CREDITS ===&lt;br /&gt;
&lt;br /&gt;
   The work of the following groups and organizations was invaluable for&lt;br /&gt;
   this project:&lt;br /&gt;
&lt;br /&gt;
   The FSF (GNU, http://www.fsf.org/ project with their free and portable&lt;br /&gt;
   development software and lots of other useful tools and libraries.&lt;br /&gt;
&lt;br /&gt;
   The Linux developers community (http://www.linux.org/) for providing a&lt;br /&gt;
   free, open source operating system.&lt;br /&gt;
&lt;br /&gt;
   The Open Group (http://www.unix−systems.org/) for making their standard&lt;br /&gt;
   specifications available on the Internet for free.&lt;br /&gt;
&lt;br /&gt;
=== VERSION ===&lt;br /&gt;
&lt;br /&gt;
   This man page describes version 1.7.3 of socat.&lt;br /&gt;
&lt;br /&gt;
=== BUGS ===&lt;br /&gt;
&lt;br /&gt;
   Addresses cannot be nested, so a single socat process cannot, e.g.,&lt;br /&gt;
   drive ssl over socks.&lt;br /&gt;
&lt;br /&gt;
   Address option ftruncate without value uses default 1 instead of 0.&lt;br /&gt;
&lt;br /&gt;
   Verbose modes (−x and/or −v) display line termination characters&lt;br /&gt;
   inconsistently when address options cr or crnl are used: They show the&lt;br /&gt;
   data after conversion in either direction.&lt;br /&gt;
&lt;br /&gt;
   The data transfer blocksize setting (−b) is ignored with address&lt;br /&gt;
   readline.&lt;br /&gt;
&lt;br /&gt;
   Send bug reports to &amp;lt;socat@dest−unreach.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SEE ALSO ===&lt;br /&gt;
&lt;br /&gt;
   nc\(1), netcat6\(1), sock\(1), rinetd\(8), cage\(1), socks.conf\(5),&lt;br /&gt;
   openssl\(1), stunnel\(8), pty\(1), rlwrap\(1), setsid\(1)&lt;br /&gt;
&lt;br /&gt;
   Socat home page http://www.dest−unreach.org/socat/&lt;br /&gt;
&lt;br /&gt;
=== AUTHOR ===&lt;br /&gt;
&lt;br /&gt;
   Gerhard Rieger &amp;lt;rieger@dest−unreach.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ser2net ==&lt;br /&gt;
&lt;br /&gt;
Ser2net ist OpenSource und steht unter https://sourceforge.net/projects/ser2net/files/ser2net/ zum Download zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
=== README der Version 3.5 vom 2017-11-22 (kommentiert)===&lt;br /&gt;
&lt;br /&gt;
This is ser2net, a program for allowing network connections to serial&lt;br /&gt;
ports or [http://timelordz.com/wiki/IPMI_Configuration_and_Monitoring IMPI] (Intelligent Platform Monitoring Interface allow you to manage a server remotely.) Serial Over Lan ( SOL) connections.  &lt;br /&gt;
See the man page for information about using the program.&lt;br /&gt;
&lt;br /&gt;
Note that ser2net supports [https://tools.ietf.org/html/rfc2217 RFC2217] &lt;br /&gt;
(remote control of serial port parameters), but you must have a compliant client.  &lt;br /&gt;
The only one I know of is [http://www.columbia.edu/kermit kermit].&lt;br /&gt;
&lt;br /&gt;
ser2net supports making connections to IPMI SOL (serial over LAN)&lt;br /&gt;
capable systems.  This way, if you have a system with SOL, you can use&lt;br /&gt;
it with programs that speak sockets and avoid having to run a serial&lt;br /&gt;
cable to the system.  It uses [https://sourceforge.net/projects/openipmi/ OpenIPMI] for this, so you have to know&lt;br /&gt;
how to make an OpenIPMI connection to the remote system.  That can be&lt;br /&gt;
rather complicated, but for a simple example, add a line like:&lt;br /&gt;
&lt;br /&gt;
  3022:telnet:0:sol.lan -U &amp;lt;userid&amp;gt; -P &amp;lt;password&amp;gt; &amp;lt;ipmi BMC IP&amp;gt;:115200&lt;br /&gt;
&lt;br /&gt;
Obviously, use the IPMI BMC userid and password here.  Depending on&lt;br /&gt;
your system there are a lot of other options, and configuration of&lt;br /&gt;
IPMI on the remote system is not for the faint of heart.  And also, if&lt;br /&gt;
you put passwords in the ser2net.conf file, it becomes a security&lt;br /&gt;
issue and you should make it readable only by the user that runs&lt;br /&gt;
ser2net.&lt;br /&gt;
&lt;br /&gt;
ser2net also supports threading.  By default it runs with a single&lt;br /&gt;
thread but you can add &#039;-t &amp;lt;num threads&amp;gt;&#039; and it will spawn the given&lt;br /&gt;
number of threads.  On modern Linux systems it uses [https://en.wikipedia.org/wiki/Epoll epoll] to avoid&lt;br /&gt;
the  [https://en.wikipedia.org/wiki/Thundering_herd_problem &amp;quot;thundering herd&amp;quot;] issue, so it should be quite scalable.  Also,&lt;br /&gt;
it runs reconfigurations in a separate thread to avoid a reconfig&lt;br /&gt;
blocking things up.&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to compile with threads, you can add&lt;br /&gt;
&amp;quot;--with-pthreads=no&amp;quot; to the configure line.&lt;br /&gt;
&lt;br /&gt;
If you want the opposite of ser2net (you want to connect to a &amp;quot;local&amp;quot;&lt;br /&gt;
serial port device that is really remote) then Cyclades has provided&lt;br /&gt;
a tool for this at https://sourceforge.net/projects/cyclades-serial/.&lt;br /&gt;
It is capable of connecting to ser2net using RFC2217.&lt;br /&gt;
&lt;br /&gt;
If you check this out from git, you won&#039;t have all the configure&lt;br /&gt;
programs and files, because those are generated.  Do:&lt;br /&gt;
   autoreconf -i&lt;br /&gt;
to generate everything first.  Then you can run configure.&lt;br /&gt;
&lt;br /&gt;
=== NAME ===&lt;br /&gt;
&lt;br /&gt;
   ser2net − Serial to network proxy&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS ===&lt;br /&gt;
(Zusammenfassung)&lt;br /&gt;
&lt;br /&gt;
   ser2net [−c configfile] [−C configline] [−p controlport] [−n] [−d] [−b] [−v] [-P pidfile]&lt;br /&gt;
&lt;br /&gt;
=== DESCRIPTION ===&lt;br /&gt;
&lt;br /&gt;
   The ser2net daemon allows telnet and tcp sessions to be established&lt;br /&gt;
   with a unit’s serial ports.&lt;br /&gt;
&lt;br /&gt;
   The program comes up normally as a daemon, opens the TCP ports&lt;br /&gt;
   specified in the configuration file, and waits for connections. Once a&lt;br /&gt;
   connection occurs, the program attempts to set up the connection and&lt;br /&gt;
   open the serial port. If another user is already using the connection&lt;br /&gt;
   or serial port, the connection is refused with an error message.&lt;br /&gt;
&lt;br /&gt;
=== OPTIONS ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nr. !! Option !! Originaltext !! Übersetzung/Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || −c config−file || Set the configuration file to one other than the default of /etc/ser2net.conf || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 2 || −C config-line || Handle a single configuration line. This may be specified multiple times for multiple lines. This is just like a line in the config file. This disables the default config file, you must specify a -c after the last -C to have it read a config file, too. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 3 || -n || Stops the daemon from forking and detaching from the controlling terminal. This is useful for running from init. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 4 || -d|| Like -n, but also sends the system logs to standard output. This is most useful for debugging purposes. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 5 || -P pidfile || If specified, put the process id (pid) of ser2net in the pidfile, replacing whatever was in that file previously. A pidfile is not created by default, you must specify this to create one. Note also that this filename must be specific with the full path, as ser2net will change directory to &amp;quot;/&amp;quot; when it becomes a daemon. when it|| Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 6 || -u || If UUCP locking is enabled, this will disable the use of UUCP locks. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 7 || -b || Cisco IOS uses a different mechanism for specifying the baud rates than the mechanism described in RFC2217. This option sets the IOS version of setting the baud rates. The default is RFC2217’s. Note that this capability is now handled automatically and this option is ignored. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 8 || -v || Prints the version of the program and exits. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 9 || −p controlport || Enables the control port and sets the TCP port to listen to for the control port. A port number may be of the form [host,]port, such as 127.0.0.1,2000 or localhost,2000. If this is specified, it will only bind to the IP address specified for the port. Otherwise, it will bind to all the addresses on the machine. If the port number is zero, that means that standard in/out will be used for the only input/output, and only one port should be specified in the config. This way, it can be used from inetd. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 10 || −s signature || Specifies the default RFC2217 signature. || Beispiel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CONTROL PORT ===&lt;br /&gt;
&lt;br /&gt;
The control port provides a simple interface for controlling the ports&lt;br /&gt;
and viewing their status. To accomplish this, it has the following&lt;br /&gt;
commands:&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;showport [&amp;lt;TCP port&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
   Show information about a port. If no port is given, all ports are&lt;br /&gt;
   displayed.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;showshortport [&amp;lt;TCP port&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
   Show information about a port, each port on one line. If no port is&lt;br /&gt;
   given, all ports are displayed. This can produce very wide output.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;help&#039;&#039;&#039;&lt;br /&gt;
   Display a short list and summary of commands.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;exit&#039;&#039;&#039;&lt;br /&gt;
   Disconnect from the control port.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;version&#039;&#039;&#039;&lt;br /&gt;
   Display the version of this program.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;monitor &amp;lt;type&amp;gt; &amp;lt;tcp port&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Display all the input for a given port on the calling control port.&lt;br /&gt;
   Only one direction may be monitored at a time. The type field may be&lt;br /&gt;
   tcp or term and specifies whether to monitor data from the TCP port or&lt;br /&gt;
   from the serial port Note that data monitoring is best effort, if the&lt;br /&gt;
   controller port cannot keep up the data will be silently dropped. A&lt;br /&gt;
   controller may only monitor one thing and a port may only be monitored&lt;br /&gt;
   by one controller.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;monitor stop&#039;&#039;&#039;&lt;br /&gt;
   Stop the current monitor.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;disconnect &amp;lt;tcp port&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Disconnect the tcp connection on the port.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;setporttimeout &amp;lt;tcp port&amp;gt; &amp;lt;timeout&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Set the amount of time in seconds before the port connection will be&lt;br /&gt;
   shut down if no activity has been seen on the port.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;setportconfig &amp;lt;tcp port&amp;gt; &amp;lt;config&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Set the port configuration as in the device configuration in the&lt;br /&gt;
   /etc/ser2net.conf file. If conflicting options are specified, the last&lt;br /&gt;
   option will be the one used. Note that these will not change until the&lt;br /&gt;
   port is disconnected and connected again. Options 300, 1200, 2400,&lt;br /&gt;
   4800, 9600, 19200, 38400, 57600, 115200 set the various baud rates.&lt;br /&gt;
   EVEN, ODD, NONE set the parity. 1STOPBIT, 2STOPBITS set the number of&lt;br /&gt;
   stop bits. 7DATABITS, 8DATABITS set the number of data bits. [-]XONXOFF&lt;br /&gt;
   turns on (- off) XON/XOFF support. [-]RTSCTS turns on (- off) hardware&lt;br /&gt;
   flow control. [-]LOCAL ignores (- checks) the modem control lines (DCD,&lt;br /&gt;
   DTR, etc.)&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;setportcontrol &amp;lt;tcp port&amp;gt; &amp;lt;controls&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Modify dynamic port controls. These do not stay between connections.&lt;br /&gt;
   Controls are: DTRHI, DTRLO Turns on and off the DTR line. RTSHI, RTSLO&lt;br /&gt;
   Turns on and off the RTS line.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;setportenable &amp;lt;tcp port&amp;gt; &amp;lt;enable state&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
   Sets the port operation state. Valid states are: off to shut the TCP&lt;br /&gt;
   port down, raw to enable the TCP port transfer all I/O as-is, rawlp to&lt;br /&gt;
   enable the TCP port input and device output without termios setting,&lt;br /&gt;
   and telnet to enable the TCP port is up run the telnet negotiation&lt;br /&gt;
   protocol on the port.&lt;br /&gt;
&lt;br /&gt;
=== CONFIGURATION ===&lt;br /&gt;
&lt;br /&gt;
Configuration is accomplished through the file /etc/ser2net.conf. A&lt;br /&gt;
file with another name or path may be specified using the −c option, or&lt;br /&gt;
individual config lines may be specified with the −C option. This file&lt;br /&gt;
consists of one or more entries with the following format:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;TCP port&amp;gt;:&amp;lt;state&amp;gt;:&amp;lt;timeout&amp;gt;:&amp;lt;device&amp;gt;:&amp;lt;options&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   BANNER:&amp;lt;banner name&amp;gt;:&amp;lt;banner text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   SIGNATURE:&amp;lt;signature name&amp;gt;:&amp;lt;signature text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   OPENSTR:&amp;lt;openstr name&amp;gt;:&amp;lt;openstr text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   CLOSESTR:&amp;lt;closestr name&amp;gt;:&amp;lt;closestr text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   TRACEFILE:&amp;lt;tracefile name&amp;gt;:&amp;lt;tracefile&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
   CONTROLPORT:&amp;lt;port spec&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FIELDS ===&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;TCP port&#039;&#039;&#039;&lt;br /&gt;
   Name or number of the TCP/IP port to accept connections from for this&lt;br /&gt;
   device. A port number may be of the form &lt;br /&gt;
   &#039;&#039;&#039;[host,]port&#039;&#039;&#039;, such as 127.0.0.1,2000 or localhost,2000, or ::,2000. &lt;br /&gt;
   If this is specified, it will only bind to the IP address specified for the port. &lt;br /&gt;
   Otherwise, it will bind to all the ports on the machine. &lt;br /&gt;
   You can specify an IPV6 address in the port, any colon before the comma is ignored for parsing fields.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;state&#039;&#039;&#039;&lt;br /&gt;
   Either &#039;&#039;&#039;raw&#039;&#039;&#039; or &#039;&#039;&#039;rawlp&#039;&#039;&#039; or &#039;&#039;&#039;telnet&#039;&#039;&#039; or &#039;&#039;&#039;off&#039;&#039;&#039;. &lt;br /&gt;
   off disables the port from accepting connections. &lt;br /&gt;
   It can be turned on later from the control port.&lt;br /&gt;
   raw enables the port and transfers all data as-is between the port and&lt;br /&gt;
   the long. rawlp enables the port and transfers all input data to&lt;br /&gt;
   device, device is open without any termios setting. It allow to use&lt;br /&gt;
   /dev/lpX devices and printers connected to them. telnet enables the&lt;br /&gt;
   port and runs the telnet protocol on the port to set up telnet&lt;br /&gt;
   parameters. This is most useful for using telnet.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;timeout&#039;&#039;&#039;&lt;br /&gt;
   The &#039;&#039;&#039;time&#039;&#039;&#039; (in seconds) before the port will be disconnected if there is&lt;br /&gt;
   no activity on it. A zero value disables this function.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;device&#039;&#039;&#039;&lt;br /&gt;
   The name of the device to connect to. This must be in the form of&lt;br /&gt;
   &#039;&#039;&#039;/dev/&amp;lt;device&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;device configuration options&#039;&#039;&#039;&lt;br /&gt;
   Sets operational parameters for the serial port. &lt;br /&gt;
   Values may be separated by spaces or commas. &lt;br /&gt;
   Options&lt;br /&gt;
   * &#039;&#039;&#039;300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200&#039;&#039;&#039; set the various baud rates. &lt;br /&gt;
   * &#039;&#039;&#039;EVEN, ODD, NONE&#039;&#039;&#039; set the parity. &lt;br /&gt;
   * &#039;&#039;&#039;1STOPBIT, 2STOPBITS&#039;&#039;&#039; set the number of stop bits.&lt;br /&gt;
   * &#039;&#039;&#039;7DATABITS, 8DATABITS&#039;&#039;&#039; set the number of data bits. &lt;br /&gt;
   * &#039;&#039;&#039;[-]XONXOFF&#039;&#039;&#039; turns on (- off) XON/XOFF support. &lt;br /&gt;
   * &#039;&#039;&#039;[-]RTSCTS&#039;&#039;&#039; turns on (- off) hardware flow control. &lt;br /&gt;
   * &#039;&#039;&#039;[-]LOCAL&#039;&#039;&#039; ignores (- checks) the modem control lines (DCD, DTR, etc.) &lt;br /&gt;
   * &#039;&#039;&#039;[-]HANGUP_WHEN_DONE&#039;&#039;&#039; lowers (- does not lower) the modem control lines (DCD, DTR, etc.) when the connection closes. &lt;br /&gt;
   * &#039;&#039;&#039;NOBREAK&#039;&#039;&#039; disables automatic clearing of the break setting of the port. &lt;br /&gt;
   HINT: A serial break is not a character. It is a signal that can be sent using the TX line of the device sending the break.&lt;br /&gt;
   When a serial port is idle and no data is being sent the TX line is in a logical 1 state. While data is being send the TX line rapidly transitions between logical 0 and logical 1. &lt;br /&gt;
   Each frame of data takes a certain period of time to send, depending on the bit rate of the connection. This is called the &amp;quot;frame time&amp;quot; or &amp;quot;word time&amp;quot;.&lt;br /&gt;
   A break occurs when the TX line is held to a logical 0 for longer than one frame time.&lt;br /&gt;
   There are short breaks and long breaks. In general a short break is one that lasts longer than one frame time, but less than two frame times. A long break can last two or more frame times. &lt;br /&gt;
   Most serial devices that support breaks use a short break.&lt;br /&gt;
   * &#039;&#039;&#039;remctl&#039;&#039;&#039; allows remote control of the serial port parameters via RFC 2217. See the README for more info. &lt;br /&gt;
   * &#039;&#039;&#039;kickolduser&#039;&#039;&#039; sets the port so that the previous user will be kicked off if a new user comes in. Useful if you forget to log off from someplace else a lot. &lt;br /&gt;
   * &#039;&#039;&#039;&amp;lt;banner name&amp;gt;&#039;&#039;&#039; displays the given banner when a user connects to the port. &lt;br /&gt;
   * &#039;&#039;&#039;&amp;lt;signature name&amp;gt;&#039;&#039;&#039; sends RFC 2217 signature on clients request. &lt;br /&gt;
   * &#039;&#039;&#039;&amp;lt;openstr name&amp;gt;&#039;&#039;&#039; Send the given string to the device when the port is opened. &lt;br /&gt;
   * &#039;&#039;&#039;&amp;lt;closestr name&amp;gt;&#039;&#039;&#039; Send the given string to the device when the port is closed.&lt;br /&gt;
   * &#039;&#039;&#039;tr=&amp;lt;filename&amp;gt;&#039;&#039;&#039; When the port is opened, open the given tracefile and&lt;br /&gt;
   store all data read from the physical device (and thus written to the&lt;br /&gt;
   user’s TCP port) in the file. The actual filename is specified in the&lt;br /&gt;
   TRACEFILE directive. If the file already exists, it is appended. The&lt;br /&gt;
   file is closed when the port is closed.&lt;br /&gt;
   * &#039;&#039;&#039;tw=&amp;lt;filename&amp;gt;&#039;&#039;&#039; Like tr, but traces data written to the device.&lt;br /&gt;
   * &#039;&#039;&#039;tb=&amp;lt;filename&amp;gt;&#039;&#039;&#039; trace both read and written data to the same file. Note&lt;br /&gt;
   that this is independent of tr and tw, so you may be tracing read,&lt;br /&gt;
   write, and both to different files.&lt;br /&gt;
   * &#039;&#039;&#039;[-]hexdump&#039;&#039;&#039; turns on (- turns off) hexdump output to all trace files.&lt;br /&gt;
   Each line in the trace file will be 8 (or less) bytes in canonical&lt;br /&gt;
   hex+ASCII format. This is useful for debugging a binary protocol.&lt;br /&gt;
   * &#039;&#039;&#039;[-]timestamp&#039;&#039;&#039; adds (- removes) a timestamp to all of the trace files. A&lt;br /&gt;
   timestamp is prepended to each line if hexdump is active for the trace&lt;br /&gt;
   file. A timestamped line is also recorded in the trace file when a&lt;br /&gt;
   remote client connects or disconnects from the port.&lt;br /&gt;
   * &#039;&#039;&#039;[-][tr-|tw-|tb-]hexdump&#039;&#039;&#039; turns on (- turns off) hexdump output for only&lt;br /&gt;
   one trace file. May be combined with [-]hexdump. Order is important.&lt;br /&gt;
   * &#039;&#039;&#039;[-][tr-|tw-|tb-]timestamp&#039;&#039;&#039; adds (- removes) a timestamp to only one the&lt;br /&gt;
   trace files May be combined with [-]timestamp. Order is important.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;banner name&#039;&#039;&#039;&lt;br /&gt;
   A &#039;&#039;&#039;name&#039;&#039;&#039; for the banner; this may be used in the options of a port.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;banner text&#039;&#039;&#039;&lt;br /&gt;
   The &#039;&#039;&#039;text&#039;&#039;&#039; to display as the banner. It takes escape sequences for&lt;br /&gt;
   substituting strings, see [[#FBSF|&amp;quot;FILENAME, BANNER, AND STRING FORMATTING&amp;quot;]] for&lt;br /&gt;
   details.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;tracefile name&#039;&#039;&#039;&lt;br /&gt;
   A &#039;&#039;&#039;name&#039;&#039;&#039; for the tracefile, this is used in the tw, tr, and tb options of&lt;br /&gt;
   a port.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;tracefile&#039;&#039;&#039;&lt;br /&gt;
   The &#039;&#039;&#039;file&#039;&#039;&#039; to send the trace into. Note that this takes escape sequences&lt;br /&gt;
   for substituting strings, see [[#FBSF|&amp;quot;FILENAME, BANNER, AND STRING FORMATTING&amp;quot;]]&lt;br /&gt;
   for details. Note that when using the time escape sequences, the time&lt;br /&gt;
   is read once at port startup, so if you use both tw and tr they will&lt;br /&gt;
   have the same date and time.&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;port spec&#039;&#039;&#039;&lt;br /&gt;
   The control &#039;&#039;&#039;port&#039;&#039;&#039; specification as defined by the [−p] option on the&lt;br /&gt;
   command line. This lets the control port be specified in the&lt;br /&gt;
   configuration file. The command line will override this, and only the&lt;br /&gt;
   first port specified is used.&lt;br /&gt;
&lt;br /&gt;
   Blank lines and lines starting with ‘#’ are ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;FBSF&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FILENAME, BANNER, AND STRING FORMATTING ===&lt;br /&gt;
&lt;br /&gt;
   Filenames, banners, and open/close string may contain normal &amp;quot;C&amp;quot; escape&lt;br /&gt;
   sequences and a large number of other escape sequences, too:&lt;br /&gt;
&lt;br /&gt;
   \a - bell&lt;br /&gt;
   \b - backspace&lt;br /&gt;
   \f - form feed&lt;br /&gt;
   \n - newline&lt;br /&gt;
   \r - carriage return&lt;br /&gt;
   \t - tab&lt;br /&gt;
   \v - vertical tab&lt;br /&gt;
   \\ - \&lt;br /&gt;
   \? - ?&lt;br /&gt;
   \’ - ’&lt;br /&gt;
   \&amp;quot; - &amp;quot;&lt;br /&gt;
   \nnn - octal value for nnn&lt;br /&gt;
   \xXX - hex value for XX&lt;br /&gt;
   \d - The device name (/dev/ttyS0, etc.)&lt;br /&gt;
   \p - TCP port number&lt;br /&gt;
   \B - The serial port parameters (eg 9600N81)&lt;br /&gt;
   \Y -&amp;gt; year&lt;br /&gt;
   \y -&amp;gt; day of the year (days since Jan 1)&lt;br /&gt;
   \M -&amp;gt; month (Jan, Feb, Mar, etc.)&lt;br /&gt;
   \m -&amp;gt; month (as a number)&lt;br /&gt;
   \A -&amp;gt; day of the week (Mon, Tue, etc.)&lt;br /&gt;
   \D -&amp;gt; day of the month&lt;br /&gt;
   \e -&amp;gt; epoc (seconds since Jan 1, 1970)&lt;br /&gt;
   \U -&amp;gt; microseconds in the current second&lt;br /&gt;
   \p -&amp;gt; local port number&lt;br /&gt;
   \d -&amp;gt; local device name&lt;br /&gt;
   \I -&amp;gt; remote IP address (in dot format)&lt;br /&gt;
   \H -&amp;gt; hour (24-hour time)&lt;br /&gt;
   \h -&amp;gt; hour (12-hour time)&lt;br /&gt;
   \i -&amp;gt; minute&lt;br /&gt;
   \S -&amp;gt; second&lt;br /&gt;
   \q -&amp;gt; am/pm&lt;br /&gt;
   \P -&amp;gt; AM/PM&lt;br /&gt;
&lt;br /&gt;
   In addition, for backwards compatibility because filenames and banners&lt;br /&gt;
   used to have different formatting, \s is the serial port parameters if&lt;br /&gt;
   in a banner and seconds if in a filename. Use of this is discouraged as&lt;br /&gt;
   it may change in the future.&lt;br /&gt;
&lt;br /&gt;
   These sequences may be used to make the filename unique per open and&lt;br /&gt;
   identify which port/device the filename was for. Note that in filenames&lt;br /&gt;
   when using \d, everything up to and including last / in the device name&lt;br /&gt;
   is removed, because you can’t have a / in a filename. So in a filename&lt;br /&gt;
   /dev/ttyS0 would become just ttyS0.&lt;br /&gt;
&lt;br /&gt;
=== SECURITY ===&lt;br /&gt;
&lt;br /&gt;
   ser2net uses the tcp wrappers interface to implement host-based&lt;br /&gt;
   security. See hosts_access(5) for a description of the file setup. Two&lt;br /&gt;
   daemons are used by ser2net, &amp;quot;ser2net&amp;quot; is for the data ports and&lt;br /&gt;
   &amp;quot;ser2net-control&amp;quot; is for the control ports.&lt;br /&gt;
&lt;br /&gt;
=== SIGNALS ===&lt;br /&gt;
&lt;br /&gt;
   &#039;&#039;&#039;SIGHUP&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   If ser2net receives a SIGHUP, it will reread it configuration file and&lt;br /&gt;
   make the appropriate changes. If an inuse port is changed or deleted,&lt;br /&gt;
   the actual change will not occur until the port is disconnected.&lt;br /&gt;
&lt;br /&gt;
=== Error ===&lt;br /&gt;
&lt;br /&gt;
   Almost all error output goes to syslog, not standard output.&lt;br /&gt;
&lt;br /&gt;
=== FILES ===&lt;br /&gt;
&lt;br /&gt;
   /etc/ser2net.conf&lt;br /&gt;
&lt;br /&gt;
=== SEE ALSO ===&lt;br /&gt;
&lt;br /&gt;
   telnet(1), hosts_access(5)&lt;br /&gt;
&lt;br /&gt;
=== KNOWN PROBLEMS ===&lt;br /&gt;
&lt;br /&gt;
   None.&lt;br /&gt;
&lt;br /&gt;
=== AUTHOR ===&lt;br /&gt;
&lt;br /&gt;
   Corey Minyard &amp;lt;minyard@acm.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== nc (netcat) ==&lt;br /&gt;
&lt;br /&gt;
=== NAME ===&lt;br /&gt;
&lt;br /&gt;
   nc — arbitrary TCP and UDP connections and listens&lt;br /&gt;
&lt;br /&gt;
nc oder netcat (oft nur ein Link/Verknüpfung auf nc) ist ein Programm mit dem man nach Belieben, Verbindungen oder einfach nur &amp;quot;Zuhörer&amp;quot; für TCP oder UDP realisieren kann.&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS ===&lt;br /&gt;
(Zusammenfassung)&lt;br /&gt;
&lt;br /&gt;
   nc [−46DdhklnrStUuvzC] [−i interval] [−P proxy_username] [−p source_port] [−s source_ip_address] [−T ToS] [−w timeout] [−X proxy_protocol] [−x proxy_address[:port]] [hostname] [port[s]]&lt;br /&gt;
&lt;br /&gt;
Aus der Syntax kann man erkennen, dass sich (ohne Fehlermeldung) nc gänzlich ohne Parameter aufrufen lässt.&lt;br /&gt;
Es wird in diesem Fall ggf. folgender Hinweis ausgegeben:&lt;br /&gt;
&lt;br /&gt;
 This is nc from the netcat-openbsd package. An alternative nc is available in the netcat-traditional package.&lt;br /&gt;
&lt;br /&gt;
=== DESCRIPTION ===&lt;br /&gt;
&lt;br /&gt;
   The nc (or netcat) utility is used for just about anything under the&lt;br /&gt;
   sun involving TCP or UDP. It can open TCP connections, send UDP&lt;br /&gt;
   packets, listen on arbitrary TCP and UDP ports, do port scanning, and&lt;br /&gt;
   deal with both IPv4 and IPv6. Unlike telnet(1), nc scripts nicely, and&lt;br /&gt;
   separates error messages onto standard error instead of sending them to&lt;br /&gt;
   standard output, as telnet(1) does with some.&lt;br /&gt;
&lt;br /&gt;
   Common uses include:&lt;br /&gt;
    * simple TCP proxies&lt;br /&gt;
    * shell-script based HTTP clients and servers&lt;br /&gt;
    * network daemon testing&lt;br /&gt;
    * a SOCKS or HTTP ProxyCommand for ssh(1)&lt;br /&gt;
    * and much, much more&lt;br /&gt;
&lt;br /&gt;
=== OPTIONS ===&lt;br /&gt;
&lt;br /&gt;
   The 25 options are as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Überschrift !! Überschrift !! Überschrift&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;-4&#039;&#039;&#039; || Forces nc to use IPv4 addresses only. ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;-6&#039;&#039;&#039; || Forces nc to use IPv6 addresses only. ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;-D&#039;&#039;&#039; || Enable debugging on the socket. ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;-d&#039;&#039;&#039; || Do not attempt to read from stdin. ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;-h&#039;&#039;&#039; || Prints out nc help. ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &#039;&#039;&#039;-i interval&#039;&#039;&#039; || Specifies a delay time interval between lines of text sent and received. Also causes a delay time between connections to multiple ports. ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &#039;&#039;&#039;-k&#039;&#039;&#039; || Forces nc to stay listening for another connection after its current connection is completed. It is an error to use this option without the −l option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &#039;&#039;&#039;-l&#039;&#039;&#039; || Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the −p, −s, or −z options. Additionally, any timeouts specified with the −w option are ignored. ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &#039;&#039;&#039;-n&#039;&#039;&#039; || Do not do any DNS or service lookups on any specified addresses, hostnames or ports. ||&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &#039;&#039;&#039;−P proxy_username&#039;&#039;&#039; || Specifies a username to present to a proxy server that requires authentication. If no username is specified then authentication will not be attempted. Proxy authentication is only supported for HTTP CONNECT proxies at present. ||&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &#039;&#039;&#039;−p source_port&#039;&#039;&#039; || Specifies the source port nc should use, subject to privilege restrictions and availability. It is an error to use this option in conjunction with the −l option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &#039;&#039;&#039;-q&#039;&#039;&#039; || after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever. ||&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &#039;&#039;&#039;-r&#039;&#039;&#039; || Specifies that source and/or destination ports should be chosen randomly instead of sequentially within a range or in the order that the system assigns them. ||&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &#039;&#039;&#039;-S&#039;&#039;&#039; || Enables the RFC 2385 TCP MD5 signature option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 15 || &#039;&#039;&#039;−s source_ip_address&#039;&#039;&#039; || Specifies the IP of the interface which is used to send the packets. It is an error to use this option in conjunction with the −l option. ||&lt;br /&gt;
|-&lt;br /&gt;
| 16 || &#039;&#039;&#039;−T ToS&#039;&#039;&#039; || Specifies IP Type of Service (ToS) for the connection. Valid values are the tokens ‘‘lowdelay’’, ‘‘throughput’’, ‘‘reliability’’, or an 8-bit hexadecimal value preceded by ‘‘0x’’. ||&lt;br /&gt;
|-&lt;br /&gt;
| 17|| &#039;&#039;&#039;-C&#039;&#039;&#039; || Send CRLF as line-ending ||&lt;br /&gt;
|-&lt;br /&gt;
| 18 || &#039;&#039;&#039;-t&#039;&#039;&#039; || Causes nc to send RFC 854 DON’T and WON’T responses to RFC 854 DO and WILL requests. This makes it possible to use nc to script telnet sessions. ||&lt;br /&gt;
|-&lt;br /&gt;
| 19 || &#039;&#039;&#039;-U&#039;&#039;&#039; || Specifies to use Unix Domain Sockets. ||&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &#039;&#039;&#039;-u&#039;&#039;&#039; || Use UDP instead of the default option of TCP. ||&lt;br /&gt;
|-&lt;br /&gt;
| 21 || &#039;&#039;&#039;-v&#039;&#039;&#039; || Have nc give more verbose output. ||&lt;br /&gt;
|-&lt;br /&gt;
| 22 || &#039;&#039;&#039;−w timeout&#039;&#039;&#039; || If a connection and stdin are idle for more than timeout seconds, then the connection is silently closed. The −w flag has no effect on the −l option, i.e. nc will listen forever for a connection, with or without the −w flag. The default is no timeout. ||&lt;br /&gt;
|-&lt;br /&gt;
| 23 || &#039;&#039;&#039;−X proxy_protocol&#039;&#039;&#039; || Requests that nc should use the specified protocol when talking to the proxy server. Supported protocols are ‘‘4’’ (SOCKS v.4), ‘‘5’’ (SOCKS v.5) and ‘‘connect’’ (HTTPS proxy). If the protocol is not specified, SOCKS version 5 is used. ||&lt;br /&gt;
|-&lt;br /&gt;
| 24 || &#039;&#039;&#039;−x proxy_address[:port]&#039;&#039;&#039; || Requests that nc should connect to hostname using a proxy at proxy_address and port. If port is not specified, the well-known port for the proxy protocol is used (1080 for SOCKS, 3128 for HTTPS). ||&lt;br /&gt;
|-&lt;br /&gt;
| 25 || &#039;&#039;&#039;−z&#039;&#039;&#039; || Specifies that nc should just scan for listening daemons, without sending any data to them. It is an error to use this option in conjunction with the −l option. ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   hostname can be a numerical IP address or a symbolic hostname (unless&lt;br /&gt;
   the −n option is given). In general, a hostname must be specified,&lt;br /&gt;
   unless the −l option is given (in which case the local host is used).&lt;br /&gt;
&lt;br /&gt;
   port[s] can be single integers or ranges. Ranges are in the form nn-mm.&lt;br /&gt;
   In general, a destination port must be specified, unless the −U option&lt;br /&gt;
   is given (in which case a socket must be specified).&lt;br /&gt;
&lt;br /&gt;
=== CLIENT/SERVER MODEL ===&lt;br /&gt;
&lt;br /&gt;
   It is quite simple to build a very basic client/server model using nc.&lt;br /&gt;
   On one console, start nc listening on a specific port for a connection.&lt;br /&gt;
   For example:&lt;br /&gt;
&lt;br /&gt;
   $ nc -l 1234&lt;br /&gt;
&lt;br /&gt;
   nc is now listening on port 1234 for a connection. On a second console&lt;br /&gt;
   (or a second machine), connect to the machine and port being listened&lt;br /&gt;
   on:&lt;br /&gt;
&lt;br /&gt;
   $ nc 127.0.0.1 1234&lt;br /&gt;
&lt;br /&gt;
   There should now be a connection between the ports. Anything typed at&lt;br /&gt;
   the second console will be concatenated to the first, and vice-versa.&lt;br /&gt;
   After the connection has been set up, nc does not really care which&lt;br /&gt;
   side is being used as a ‘server’ and which side is being used as a&lt;br /&gt;
   ‘client’. The connection may be terminated using an EOF (‘^D’).&lt;br /&gt;
&lt;br /&gt;
=== DATA TRANSFER ===&lt;br /&gt;
&lt;br /&gt;
   The example in the previous section can be expanded to build a basic&lt;br /&gt;
   data transfer model. Any information input into one end of the&lt;br /&gt;
   connection will be output to the other end, and input and output can be&lt;br /&gt;
   easily captured in order to emulate file transfer.&lt;br /&gt;
&lt;br /&gt;
   Start by using nc to listen on a specific port, with output captured&lt;br /&gt;
   into a file:&lt;br /&gt;
&lt;br /&gt;
   $ nc -l 1234 &amp;gt; filename.out&lt;br /&gt;
&lt;br /&gt;
   Using a second machine, connect to the listening nc process, feeding it&lt;br /&gt;
   the file which is to be transferred:&lt;br /&gt;
&lt;br /&gt;
   $ nc host.example.com 1234 &amp;lt; filename.in&lt;br /&gt;
&lt;br /&gt;
   After the file has been transferred, the connection will close&lt;br /&gt;
   automatically.&lt;br /&gt;
&lt;br /&gt;
=== TALKING TO SERVERS ===&lt;br /&gt;
&lt;br /&gt;
   It is sometimes useful to talk to servers ‘‘by hand’’ rather than&lt;br /&gt;
   through a user interface. It can aid in troubleshooting, when it might&lt;br /&gt;
   be necessary to verify what data a server is sending in response to&lt;br /&gt;
   commands issued by the client. For example, to retrieve the home page&lt;br /&gt;
   of a web site:&lt;br /&gt;
&lt;br /&gt;
   $ echo -n &amp;quot;GET / HTTP/1.0\r\n\r\n&amp;quot; | nc host.example.com 80&lt;br /&gt;
&lt;br /&gt;
   Note that this also displays the headers sent by the web server. They&lt;br /&gt;
   can be filtered, using a tool such as sed(1), if necessary.&lt;br /&gt;
&lt;br /&gt;
   More complicated examples can be built up when the user knows the&lt;br /&gt;
   format of requests required by the server. As another example, an email&lt;br /&gt;
   may be submitted to an SMTP server using:&lt;br /&gt;
&lt;br /&gt;
   $ nc [-C] localhost 25 &amp;lt;&amp;lt; EOF&lt;br /&gt;
   HELO host.example.com&lt;br /&gt;
   MAIL FROM:&amp;lt;user@host.example.com&amp;gt;&lt;br /&gt;
   RCPT TO:&amp;lt;user2@host.example.com&amp;gt;&lt;br /&gt;
   DATA&lt;br /&gt;
   Body of email.&lt;br /&gt;
   .&lt;br /&gt;
   QUIT&lt;br /&gt;
   EOF&lt;br /&gt;
&lt;br /&gt;
=== PORT SCANNING ===&lt;br /&gt;
&lt;br /&gt;
   It may be useful to know which ports are open and running services on a&lt;br /&gt;
   target machine. The −z flag can be used to tell nc to report open&lt;br /&gt;
   ports, rather than initiate a connection. For example:&lt;br /&gt;
&lt;br /&gt;
   $ nc -z host.example.com 20-30&lt;br /&gt;
   Connection to host.example.com 22 port [tcp/ssh] succeeded!&lt;br /&gt;
   Connection to host.example.com 25 port [tcp/smtp] succeeded!&lt;br /&gt;
&lt;br /&gt;
   The port range was specified to limit the search to ports 20 − 30.&lt;br /&gt;
&lt;br /&gt;
   Alternatively, it might be useful to know which server software is&lt;br /&gt;
   running, and which versions. This information is often contained within&lt;br /&gt;
   the greeting banners. In order to retrieve these, it is necessary to&lt;br /&gt;
   first make a connection, and then break the connection when the banner&lt;br /&gt;
   has been retrieved. This can be accomplished by specifying a small&lt;br /&gt;
   timeout with the −w flag, or perhaps by issuing a &amp;quot;QUIT&amp;quot; command to the&lt;br /&gt;
   server:&lt;br /&gt;
&lt;br /&gt;
   $ echo &amp;quot;QUIT&amp;quot; | nc host.example.com 20-30&lt;br /&gt;
   SSH-1.99-OpenSSH_3.6.1p2&lt;br /&gt;
   Protocol mismatch.&lt;br /&gt;
   220 host.example.com IMS SMTP Receiver Version 0.84 Ready&lt;br /&gt;
&lt;br /&gt;
=== (more) EXAMPLES ===&lt;br /&gt;
&lt;br /&gt;
   Open a TCP connection to port 42 of host.example.com, using port 31337&lt;br /&gt;
   as the source port, with a timeout of 5 seconds:&lt;br /&gt;
&lt;br /&gt;
   $ nc -p 31337 -w 5 host.example.com 42&lt;br /&gt;
&lt;br /&gt;
   Open a UDP connection to port 53 of host.example.com:&lt;br /&gt;
&lt;br /&gt;
   $ nc -u host.example.com 53&lt;br /&gt;
&lt;br /&gt;
   Open a TCP connection to port 42 of host.example.com using 10.1.2.3 as&lt;br /&gt;
   the IP for the local end of the connection:&lt;br /&gt;
&lt;br /&gt;
   $ nc -s 10.1.2.3 host.example.com 42&lt;br /&gt;
&lt;br /&gt;
   Create and listen on a Unix Domain Socket:&lt;br /&gt;
&lt;br /&gt;
   $ nc -lU /var/tmp/dsocket&lt;br /&gt;
&lt;br /&gt;
   Connect to port 42 of host.example.com via an HTTP proxy at 10.2.3.4,&lt;br /&gt;
   port 8080. This example could also be used by ssh(1); see the&lt;br /&gt;
   ProxyCommand directive in ssh_config(5) for more information.&lt;br /&gt;
&lt;br /&gt;
   $ nc -x10.2.3.4:8080 -Xconnect host.example.com 42&lt;br /&gt;
&lt;br /&gt;
   The same example again, this time enabling proxy authentication with&lt;br /&gt;
   username ‘‘ruser’’ if the proxy requires it:&lt;br /&gt;
&lt;br /&gt;
   $ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42&lt;br /&gt;
&lt;br /&gt;
=== SEE ALSO ===&lt;br /&gt;
&lt;br /&gt;
   cat(1), ssh(1)&lt;br /&gt;
&lt;br /&gt;
=== AUTHORS ===&lt;br /&gt;
&lt;br /&gt;
   Original implementation by *Hobbit* 〈 hobbit@avian.org〉 .&lt;br /&gt;
   Rewritten with IPv6 support by Eric Jackson &amp;lt;ericj@monkey.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== CAVEATS ===&lt;br /&gt;
&lt;br /&gt;
   UDP port scans will always succeed (i.e. report the port as open),&lt;br /&gt;
   rendering the −uz combination of flags relatively useless.&lt;br /&gt;
&lt;br /&gt;
   BSD April 22, 2017 BSD&lt;br /&gt;
&lt;br /&gt;
== setserial ==&lt;br /&gt;
&lt;br /&gt;
Die Angaben beziehen sich auf setserial version 2.17, 27-Jan-2000.&lt;br /&gt;
&lt;br /&gt;
=== NAME ===&lt;br /&gt;
&lt;br /&gt;
   setserial − get/set Linux serial port information&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS ===&lt;br /&gt;
&lt;br /&gt;
   setserial [ −abqvVWz ] device [ parameter1 [ arg ] ] ...&lt;br /&gt;
&lt;br /&gt;
   setserial -g [ −abGv ] device1 ...&lt;br /&gt;
&lt;br /&gt;
Man beachte hier die eckige Klammerung mit Leerzeichen und die Reihenfolge aller Übergabeparameter,&lt;br /&gt;
die nicht mit der Angabe der Ausgabe bei z. B. -v übereinstimmt!&lt;br /&gt;
&lt;br /&gt;
#setserial -v&lt;br /&gt;
setserial version 2.17, 27-Jan-2000&lt;br /&gt;
&lt;br /&gt;
usage:   setserial serial-device -abqvVWz [cmd1 [arg]] ... &lt;br /&gt;
         setserial -g [-abGv] device1 ...&lt;br /&gt;
&lt;br /&gt;
=== DESCRIPTION ===&lt;br /&gt;
&lt;br /&gt;
   setserial is a program designed to set and/or report the configuration&lt;br /&gt;
   information associated with a serial port. This information includes&lt;br /&gt;
   what I/O port and IRQ a particular serial port is using, and whether or&lt;br /&gt;
   not the break key should be interpreted as the Secure Attention Key,&lt;br /&gt;
   and so on.&lt;br /&gt;
&lt;br /&gt;
   During the normal bootup process, only COM ports 1-4 are initialized,&lt;br /&gt;
   using the default I/O ports and IRQ values, as listed below. In order&lt;br /&gt;
   to initialize any additional serial ports, or to change the COM 1-4&lt;br /&gt;
   ports to a nonstadard configuration, the setserial program should be&lt;br /&gt;
   used. Typically it is called from an rc.serial script, which is usually&lt;br /&gt;
   run out of /etc/rc.local.&lt;br /&gt;
&lt;br /&gt;
   The device argument or arguments specifies the serial device which&lt;br /&gt;
   should be configured or interrogated. It will usually have the&lt;br /&gt;
   following form: /dev/cua[0-3].&lt;br /&gt;
&lt;br /&gt;
   If no parameters are specified, setserial will print out the port type&lt;br /&gt;
   (i.e., 8250, 16450, 16550, 16550A, etc.), the hardware I/O port, the&lt;br /&gt;
   hardware IRQ line, its &amp;quot;baud base,&amp;quot; and some of its operational flags.&lt;br /&gt;
&lt;br /&gt;
   If the −g option is given, the arguments to setserial are interpreted&lt;br /&gt;
   as a list of devices for which the characteristics of those devices&lt;br /&gt;
   should be printed.&lt;br /&gt;
&lt;br /&gt;
   Without the −g option, the first argument to setserial is interpreted&lt;br /&gt;
   as the device to be modified or characteristics to be printed, and any&lt;br /&gt;
   additional arguments are interpreted as parameters which should be&lt;br /&gt;
   assigned to that serial device.&lt;br /&gt;
&lt;br /&gt;
   For the most part, superuser privilege is required to set the&lt;br /&gt;
   configuration parameters of a serial port. A few serial port parameters&lt;br /&gt;
   can be set by normal users, however, and these will be noted as&lt;br /&gt;
   exceptions in this manual page.&lt;br /&gt;
&lt;br /&gt;
=== OPTIONS ===&lt;br /&gt;
&lt;br /&gt;
   Setserial accepts the following options:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Nr. !! Option !! Originaltext!! Übersetzung/Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| 1 || -a || When reporting the configuration of a serial device, print all available information. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 2 || -b || When reporting the configuration of a serial device, print a summary of the device’s configuration, which might be suitable for printing during the bootup process, during the /etc/rc script. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 3 || -G || Print out the configuration information of the serial port in a form which can be fed back to setserial as command-line arguments. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 4 || -q || Be quiet. Setserial will print fewer lines of output. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 5 || -v || Be verbose. Setserial will print additional status output.|| Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 6 || -V || Display version and exit. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 7 || -W || Do wild interrupt initialization and exit. This option is no longer relevant in Linux kernels after version 2.1. || Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| 8 || -z || Zero out the serial flags before starting to set flags. This is related to the automatic saving of serial flags using the −G flag. || Beispiel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PARAMETERS ===&lt;br /&gt;
&lt;br /&gt;
   The following parameters can be assigned to a serial port.&lt;br /&gt;
&lt;br /&gt;
   All argument values are assumed to be in decimal unless preceeded by&lt;br /&gt;
   &amp;quot;0x&amp;quot;.&lt;br /&gt;
   port port_number&lt;br /&gt;
&lt;br /&gt;
   The port option sets the I/O port, as described above.&lt;br /&gt;
&lt;br /&gt;
   irq irq_number&lt;br /&gt;
&lt;br /&gt;
   The irq option sets the hardware IRQ, as described above.&lt;br /&gt;
&lt;br /&gt;
   uart uart_type&lt;br /&gt;
&lt;br /&gt;
   This option is used to set the UART type. The permitted types are none,&lt;br /&gt;
   8250, 16450, 16550, 16550A, 16650, 16650V2, 16654, 16750, 16850, 16950,&lt;br /&gt;
   and 16954. Using UART type none will disable the port.&lt;br /&gt;
&lt;br /&gt;
   Some internal modems are billed as having a &amp;quot;16550A UART with a 1k&lt;br /&gt;
   buffer&amp;quot;. This is a lie. They do not have really have a 16550A&lt;br /&gt;
   compatible UART; instead what they have is a 16450 compatible UART with&lt;br /&gt;
   a 1k receive buffer to prevent receiver overruns. This is important,&lt;br /&gt;
   because they do not have a transmit FIFO. Hence, they are not&lt;br /&gt;
   compatible with a 16550A UART, and the autoconfiguration process will&lt;br /&gt;
   correctly identify them as 16450’s. If you attempt to override this&lt;br /&gt;
   using the uart parameter, you will see dropped characters during file&lt;br /&gt;
   transmissions. These UART’s usually have other problems: the skip_test&lt;br /&gt;
   parameter also often must be specified.&lt;br /&gt;
&lt;br /&gt;
   autoconfig&lt;br /&gt;
&lt;br /&gt;
   When this parameter is given, setserial will ask the kernel to attempt&lt;br /&gt;
   to automatically configure the serial port. The I/O port must be&lt;br /&gt;
   correctly set; the kernel will attempt to determine the UART type, and&lt;br /&gt;
   if the auto_irq parameter is set, Linux will attempt to automatically&lt;br /&gt;
   determine the IRQ. The autoconfig parameter should be given after the&lt;br /&gt;
   port,auto_irq, and skip_test parameters have been specified.&lt;br /&gt;
&lt;br /&gt;
   auto_irq&lt;br /&gt;
&lt;br /&gt;
   During autoconfiguration, try to determine the IRQ. This feature is not&lt;br /&gt;
   guaranteed to always produce the correct result; some hardware&lt;br /&gt;
   configurations will fool the Linux kernel. It is generally safer not to&lt;br /&gt;
   use the auto_irq feature, but rather to specify the IRQ to be used&lt;br /&gt;
   explicitly, using the irq parameter.&lt;br /&gt;
&lt;br /&gt;
   ^auto_irq&lt;br /&gt;
&lt;br /&gt;
   During autoconfiguration, do not try to determine the IRQ.&lt;br /&gt;
&lt;br /&gt;
   skip_test&lt;br /&gt;
&lt;br /&gt;
   During autoconfiguration, skip the UART test. Some internal modems do&lt;br /&gt;
   not have National Semiconductor compatible UART’s, but have cheap&lt;br /&gt;
   imitations instead. Some of these cheasy imitations UART’s do not fully&lt;br /&gt;
   support the loopback detection mode, which is used by the kernel to&lt;br /&gt;
   make sure there really is a UART at a particular address before&lt;br /&gt;
   attempting to configure it. So for certain internal modems you will&lt;br /&gt;
   need to specify this parameter so Linux can initialize the UART&lt;br /&gt;
   correctly.&lt;br /&gt;
&lt;br /&gt;
   ^skip_test&lt;br /&gt;
&lt;br /&gt;
   During autoconfiguration, do not skip the UART test.&lt;br /&gt;
&lt;br /&gt;
   baud_base baud_base&lt;br /&gt;
&lt;br /&gt;
   This option sets the base baud rate, which is the clock frequency&lt;br /&gt;
   divided by 16. Normally this value is 115200, which is also the fastest&lt;br /&gt;
   baud rate which the UART can support.&lt;br /&gt;
&lt;br /&gt;
   spd_hi&lt;br /&gt;
&lt;br /&gt;
   Use 57.6kb when the application requests 38.4kb. This parameter may be&lt;br /&gt;
   specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   spd_vhi&lt;br /&gt;
&lt;br /&gt;
   Use 115kb when the application requests 38.4kb. This parameter may be&lt;br /&gt;
   specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   spd_shi&lt;br /&gt;
&lt;br /&gt;
   Use 230kb when the application requests 38.4kb. This parameter may be&lt;br /&gt;
   specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   spd_warp&lt;br /&gt;
&lt;br /&gt;
   Use 460kb when the application requests 38.4kb. This parameter may be&lt;br /&gt;
   specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   spd_cust&lt;br /&gt;
&lt;br /&gt;
   Use the custom divisor to set the speed when the application requests&lt;br /&gt;
   38.4kb. In this case, the baud rate is the baud_base divided by the&lt;br /&gt;
   divisor. This parameter may be specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   spd_normal&lt;br /&gt;
&lt;br /&gt;
   Use 38.4kb when the application requests 38.4kb. This parameter may be&lt;br /&gt;
   specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   divisor divisor&lt;br /&gt;
&lt;br /&gt;
   This option sets the custom divison. This divisor will be used then the&lt;br /&gt;
   spd_cust option is selected and the serial port is set to 38.4kb by the&lt;br /&gt;
   application. This parameter may be specified by a non-privileged user.&lt;br /&gt;
&lt;br /&gt;
   sak&lt;br /&gt;
&lt;br /&gt;
   Set the break key at the Secure Attention Key.&lt;br /&gt;
&lt;br /&gt;
   ^sak&lt;br /&gt;
&lt;br /&gt;
   disable the Secure Attention Key.&lt;br /&gt;
&lt;br /&gt;
   fourport&lt;br /&gt;
&lt;br /&gt;
   Configure the port as an AST Fourport card.&lt;br /&gt;
&lt;br /&gt;
   ^fourport&lt;br /&gt;
&lt;br /&gt;
   Disable AST Fourport configuration.&lt;br /&gt;
&lt;br /&gt;
   close_delay delay&lt;br /&gt;
&lt;br /&gt;
   Specify the amount of time, in hundredths of a second, that DTR should&lt;br /&gt;
   remain low on a serial line after the callout device is closed, before&lt;br /&gt;
   the blocked dialin device raises DTR again. The default value of this&lt;br /&gt;
   option is 50, or a half-second delay.&lt;br /&gt;
&lt;br /&gt;
   closing_wait delay&lt;br /&gt;
&lt;br /&gt;
   Specify the amount of time, in hundredths of a second, that the kernel&lt;br /&gt;
   should wait for data to be transmitted from the serial port while&lt;br /&gt;
   closing the port. If &amp;quot;none&amp;quot; is specified, no delay will occur. If&lt;br /&gt;
   &amp;quot;infinite&amp;quot; is specified the kernel will wait indefinitely for the&lt;br /&gt;
   buffered data to be transmitted. The default setting is 3000 or 30&lt;br /&gt;
   seconds of delay. This default is generally appropriate for most&lt;br /&gt;
   devices. If too long a delay is selected, then the serial port may hang&lt;br /&gt;
   for a long time if when a serial port which is not connected, and has&lt;br /&gt;
   data pending, is closed. If too short a delay is selected, then there&lt;br /&gt;
   is a risk that some of the transmitted data is output at all. If the&lt;br /&gt;
   device is extremely slow, like a plotter, the closing_wait may need to&lt;br /&gt;
   be larger.&lt;br /&gt;
&lt;br /&gt;
   session_lockout&lt;br /&gt;
&lt;br /&gt;
   Lock out callout port (/dev/cuaXX) accesses across different sessions.&lt;br /&gt;
   That is, once a process has opened a port, do not allow a process with&lt;br /&gt;
   a different session ID to open that port until the first process has&lt;br /&gt;
   closed it.&lt;br /&gt;
&lt;br /&gt;
   ^session_lockout&lt;br /&gt;
&lt;br /&gt;
   Do not lock out callout port accesses across different sessions.&lt;br /&gt;
&lt;br /&gt;
   pgrp_lockout&lt;br /&gt;
&lt;br /&gt;
   Lock out callout port (/dev/cuaXX) accesses across different process&lt;br /&gt;
   groups. That is, once a process has opened a port, do not allow a&lt;br /&gt;
   process in a different process group to open that port until the first&lt;br /&gt;
   process has closed it.&lt;br /&gt;
&lt;br /&gt;
   ^pgrp_lockout&lt;br /&gt;
&lt;br /&gt;
   Do not lock out callout port accesses across different process groups.&lt;br /&gt;
&lt;br /&gt;
   hup_notify&lt;br /&gt;
&lt;br /&gt;
   Notify a process blocked on opening a dial in line when a process has&lt;br /&gt;
   finished using a callout line (either by closing it or by the serial&lt;br /&gt;
   line being hung up) by returning EAGAIN to the open.&lt;br /&gt;
&lt;br /&gt;
   The application of this parameter is for getty’s which are blocked on a&lt;br /&gt;
   serial port’s dial in line. This allows the getty to reset the modem&lt;br /&gt;
   (which may have had its configuration modified by the application using&lt;br /&gt;
   the callout device) before blocking on the open again.&lt;br /&gt;
&lt;br /&gt;
   ^hup_notify&lt;br /&gt;
&lt;br /&gt;
   Do not notify a process blocked on opening a dial in line when the&lt;br /&gt;
   callout device is hung up.&lt;br /&gt;
&lt;br /&gt;
   split_termios&lt;br /&gt;
&lt;br /&gt;
   Treat the termios settings used by the callout device and the termios&lt;br /&gt;
   settings used by the dialin devices as separate.&lt;br /&gt;
&lt;br /&gt;
   ^split_termios&lt;br /&gt;
&lt;br /&gt;
   Use the same termios structure to store both the dialin and callout&lt;br /&gt;
   ports. This is the default option.&lt;br /&gt;
&lt;br /&gt;
   callout_nohup&lt;br /&gt;
&lt;br /&gt;
   If this particular serial port is opened as a callout device, do not&lt;br /&gt;
   hangup the tty when carrier detect is dropped.&lt;br /&gt;
&lt;br /&gt;
   ^callout_nohup&lt;br /&gt;
&lt;br /&gt;
   Do not skip hanging up the tty when a serial port is opened as a&lt;br /&gt;
   callout device. Of course, the HUPCL termios flag must be enabled if&lt;br /&gt;
   the hangup is to occur.&lt;br /&gt;
&lt;br /&gt;
   low_latency&lt;br /&gt;
&lt;br /&gt;
   Minimize the receive latency of the serial device at the cost of&lt;br /&gt;
   greater CPU utilization. (Normally there is an average of 5-10ms&lt;br /&gt;
   latency before characters are handed off to the line discpline to&lt;br /&gt;
   minimize overhead.) This is off by default, but certain real-time&lt;br /&gt;
   applications may find this useful.&lt;br /&gt;
&lt;br /&gt;
   ^low_latency&lt;br /&gt;
&lt;br /&gt;
   Optimize for efficient CPU processing of serial characters at the cost&lt;br /&gt;
   of paying an average of 5-10ms of latency before the characters are&lt;br /&gt;
   processed. This is the default.&lt;br /&gt;
&lt;br /&gt;
=== CONSIDERATIONS OF CONFIGURING SERIAL PORTS ===&lt;br /&gt;
&lt;br /&gt;
   It is important to note that setserial merely tells the Linux kernel&lt;br /&gt;
   where it should expect to find the I/O port and IRQ lines of a&lt;br /&gt;
   particular serial port. It does *not* configure the hardware, the&lt;br /&gt;
   actual serial board, to use a particular I/O port. In order to do that,&lt;br /&gt;
   you will need to physically program the serial board, usually by&lt;br /&gt;
   setting some jumpers or by switching some DIP switches.&lt;br /&gt;
&lt;br /&gt;
   This section will provide some pointers in helping you decide how you&lt;br /&gt;
   would like to configure your serial ports.&lt;br /&gt;
&lt;br /&gt;
   The &amp;quot;standard MS-DOS&amp;quot; port associations are given below:&lt;br /&gt;
&lt;br /&gt;
   /dev/ttys0 (COM1), port 0x3f8, irq 4&lt;br /&gt;
   /dev/ttys1 (COM2), port 0x2f8, irq 3&lt;br /&gt;
   /dev/ttys2 (COM3), port 0x3e8, irq 4&lt;br /&gt;
   /dev/ttys3 (COM4), port 0x2e8, irq 3&lt;br /&gt;
&lt;br /&gt;
   Due to the limitations in the design of the AT/ISA bus architecture,&lt;br /&gt;
   normally an IRQ line may not be shared between two or more serial&lt;br /&gt;
   ports. If you attempt to do this, one or both serial ports will become&lt;br /&gt;
   unreliable if you try to use both simultaneously. This limitation can&lt;br /&gt;
   be overcome by special multi-port serial port boards, which are&lt;br /&gt;
   designed to share multiple serial ports over a single IRQ line.&lt;br /&gt;
   Multi-port serial cards supported by Linux include the AST FourPort,&lt;br /&gt;
   the Accent Async board, the Usenet Serial II board, the Bocaboard&lt;br /&gt;
   BB-1004, BB-1008, and BB-2016 boards, and the HUB-6 serial board.&lt;br /&gt;
&lt;br /&gt;
   The selection of an alternative IRQ line is difficult, since most of&lt;br /&gt;
   them are already used. The following table lists the &amp;quot;standard MS-DOS&amp;quot;&lt;br /&gt;
   assignments of available IRQ lines:&lt;br /&gt;
&lt;br /&gt;
   IRQ 3: COM2&lt;br /&gt;
   IRQ 4: COM1&lt;br /&gt;
   IRQ 5: LPT2&lt;br /&gt;
   IRQ 7: LPT1&lt;br /&gt;
&lt;br /&gt;
   Most people find that IRQ 5 is a good choice, assuming that there is&lt;br /&gt;
   only one parallel port active in the computer. Another good choice is&lt;br /&gt;
   IRQ 2 (aka IRQ 9); although this IRQ is sometimes used by network&lt;br /&gt;
   cards, and very rarely VGA cards will be configured to use IRQ 2 as a&lt;br /&gt;
   vertical retrace interrupt. If your VGA card is configured this way;&lt;br /&gt;
   try to disable it so you can reclaim that IRQ line for some other card.&lt;br /&gt;
   It’s not necessary for Linux and most other Operating systems.&lt;br /&gt;
&lt;br /&gt;
   The only other available IRQ lines are 3, 4, and 7, and these are&lt;br /&gt;
   probably used by the other serial and parallel ports. (If your serial&lt;br /&gt;
   card has a 16bit card edge connector, and supports higher interrupt&lt;br /&gt;
   numbers, then IRQ 10, 11, 12, and 15 are also available.)&lt;br /&gt;
&lt;br /&gt;
   On AT class machines, IRQ 2 is seen as IRQ 9, and Linux will interpret&lt;br /&gt;
   it in this manner.&lt;br /&gt;
&lt;br /&gt;
   IRQ’s other than 2 (9), 3, 4, 5, 7, 10, 11, 12, and 15, should not be&lt;br /&gt;
   used, since they are assigned to other hardware and cannot, in general,&lt;br /&gt;
   be changed. Here are the &amp;quot;standard&amp;quot; assignments:&lt;br /&gt;
&lt;br /&gt;
   IRQ 0 Timer channel 0&lt;br /&gt;
   IRQ 1 Keyboard&lt;br /&gt;
   IRQ 2 Cascade for controller 2&lt;br /&gt;
   IRQ 3 Serial port 2&lt;br /&gt;
   IRQ 4 Serial port 1&lt;br /&gt;
   IRQ 5 Parallel port 2 (Reserved in PS/2)&lt;br /&gt;
   IRQ 6 Floppy diskette&lt;br /&gt;
   IRQ 7 Parallel port 1&lt;br /&gt;
   IRQ 8 Real-time clock&lt;br /&gt;
   IRQ 9 Redirected to IRQ2&lt;br /&gt;
   IRQ 10 Reserved&lt;br /&gt;
   IRQ 11 Reserved&lt;br /&gt;
   IRQ 12 Reserved (Auxillary device in PS/2)&lt;br /&gt;
   IRQ 13 Math coprocessor&lt;br /&gt;
   IRQ 14 Hard disk controller&lt;br /&gt;
   IRQ 15 Reserved&lt;br /&gt;
&lt;br /&gt;
=== MULTIPORT CONFIGURATION ===&lt;br /&gt;
&lt;br /&gt;
   Certain multiport serial boards which share multiple ports on a single&lt;br /&gt;
   IRQ use one or more ports to indicate whether or not there are any&lt;br /&gt;
   pending ports which need to be serviced. If your multiport board&lt;br /&gt;
   supports these ports, you should make use of them to avoid potential&lt;br /&gt;
   lockups if the interrupt gets lost.&lt;br /&gt;
&lt;br /&gt;
   In order to set these ports specify set_multiport as a parameter, and&lt;br /&gt;
   follow it with the multiport parameters. The multiport parameters take&lt;br /&gt;
   the form of specifying the port that should be checked, a mask which&lt;br /&gt;
   indicate which bits in the register are significant, and finally, a&lt;br /&gt;
   match parameter which specifies what the significant bits in that&lt;br /&gt;
   register must match when there is no more pending work to be done.&lt;br /&gt;
&lt;br /&gt;
   Up to four such port/mask/match combinations may be specified. The&lt;br /&gt;
   first such combinations should be specified by setting the parameters&lt;br /&gt;
   port1, mask1, and match1. The second such combination should be&lt;br /&gt;
   specified with port2, mask2, and match2, and so on. In order to disable&lt;br /&gt;
   this multiport checking, set port1 to be zero.&lt;br /&gt;
&lt;br /&gt;
   In order to view the current multiport settings, specify the parameter&lt;br /&gt;
   get_multiport on the command line.&lt;br /&gt;
&lt;br /&gt;
   Here are some multiport settings for some common serial boards:&lt;br /&gt;
&lt;br /&gt;
   AST FourPort port1 0x1BF mask1 0xf match1 0xf&lt;br /&gt;
&lt;br /&gt;
   Boca BB-1004/8 port1 0x107 mask1 0xff match1 0&lt;br /&gt;
&lt;br /&gt;
   Boca BB-2016 port1 0x107 mask1 0xff match1 0&lt;br /&gt;
   port2 0x147 mask2 0xff match2 0&lt;br /&gt;
&lt;br /&gt;
=== Hayes ESP Configuration ===&lt;br /&gt;
&lt;br /&gt;
   Setserial may also be used to configure ports on a Hayes ESP serial&lt;br /&gt;
   board.&lt;br /&gt;
&lt;br /&gt;
   The following parameters when configuring ESP ports:&lt;br /&gt;
   rx_trigger&lt;br /&gt;
&lt;br /&gt;
   This is the trigger level (in bytes) of the receive FIFO. Larger values&lt;br /&gt;
   may result in fewer interrupts and hence better performance; however, a&lt;br /&gt;
   value too high could result in data loss. Valid values are 1 through&lt;br /&gt;
   1023.&lt;br /&gt;
&lt;br /&gt;
   tx_trigger&lt;br /&gt;
&lt;br /&gt;
   This is the trigger level (in bytes) of the transmit FIFO. Larger&lt;br /&gt;
   values may result in fewer interrupts and hence better performance;&lt;br /&gt;
   however, a value too high could result in degraded transmit&lt;br /&gt;
   performance. Valid values are 1 through 1023.&lt;br /&gt;
&lt;br /&gt;
   flow_off&lt;br /&gt;
&lt;br /&gt;
   This is the level (in bytes) at which the ESP port will &amp;quot;flow off&amp;quot; the&lt;br /&gt;
   remote transmitter (i.e. tell him to stop stop sending more bytes).&lt;br /&gt;
   Valid values are 1 through 1023. This value should be greater than the&lt;br /&gt;
   receive trigger level and the flow on level.&lt;br /&gt;
&lt;br /&gt;
   flow_on&lt;br /&gt;
&lt;br /&gt;
   This is the level (in bytes) at which the ESP port will &amp;quot;flow on&amp;quot; the&lt;br /&gt;
   remote transmitter (i.e. tell him to resume sending bytes) after having&lt;br /&gt;
   flowed it off. Valid values are 1 through 1023. This value should be&lt;br /&gt;
   less than the flow off level, but greater than the receive trigger&lt;br /&gt;
   level.&lt;br /&gt;
&lt;br /&gt;
   rx_timeout&lt;br /&gt;
&lt;br /&gt;
   This is the amount of time that the ESP port will wait after receiving&lt;br /&gt;
   the final character before signaling an interrupt. Valid values are 0&lt;br /&gt;
   through 255. A value too high will increase latency, and a value too&lt;br /&gt;
   low will cause unnecessary interrupts.&lt;br /&gt;
&lt;br /&gt;
=== CAUTION ===&lt;br /&gt;
&lt;br /&gt;
   CAUTION: Configuring a serial port to use an incorrect I/O port can&lt;br /&gt;
   lock up your machine.&lt;br /&gt;
&lt;br /&gt;
=== FILES ===&lt;br /&gt;
&lt;br /&gt;
   /etc/rc.local /etc/rc.serial&lt;br /&gt;
&lt;br /&gt;
=== SEE ALSO ===&lt;br /&gt;
&lt;br /&gt;
   tty(4), ttys(4), kernel/chr_drv/serial.c&lt;br /&gt;
&lt;br /&gt;
=== AUTHOR ===&lt;br /&gt;
&lt;br /&gt;
   The original version of setserial was written by Rick Sladkey&lt;br /&gt;
   (jrs@world.std.com), and was modified by Michael K. Johnson&lt;br /&gt;
   (johnsonm@stolaf.edu).&lt;br /&gt;
&lt;br /&gt;
   This version has since been rewritten from scratch by Theodore Ts’o&lt;br /&gt;
   (tytso@mit.edu) on 1/1/93. Any bugs or problems are solely his&lt;br /&gt;
   responsibility.&lt;br /&gt;
&lt;br /&gt;
== statserial ==&lt;br /&gt;
&lt;br /&gt;
Die Angaben beziehen sich auf die Version 1.1-743.2.&lt;br /&gt;
&lt;br /&gt;
=== NAME ===&lt;br /&gt;
&lt;br /&gt;
   statserial − display serial port modem status lines&lt;br /&gt;
&lt;br /&gt;
=== SYNOPSIS ===&lt;br /&gt;
&lt;br /&gt;
   statserial [-n | -d | -x] &amp;lt;device-name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DESCRIPTION ===&lt;br /&gt;
&lt;br /&gt;
   Statserial displays a table of the signals on a standard 9-pin or&lt;br /&gt;
   25-pin serial port, and indicates the status of the handshaking lines.&lt;br /&gt;
   It can be useful for debugging problems with serial ports or modems.&lt;br /&gt;
&lt;br /&gt;
   The optional device-name parameter is the full name of the device file&lt;br /&gt;
   for the serial port in question. If not specified, the default is taken&lt;br /&gt;
   from the environment variable MODEM if set, otherwise /dev/cua1.&lt;br /&gt;
&lt;br /&gt;
=== COMMAND−LINE OPTIONS ===&lt;br /&gt;
&lt;br /&gt;
   Each of the command line options is mutually exclusive.&lt;br /&gt;
&lt;br /&gt;
   -n&lt;br /&gt;
&lt;br /&gt;
   Normally statserial will loop continuously, updating the status at one&lt;br /&gt;
   second intervals; you can exit using Control-C. The -n option disables&lt;br /&gt;
   looping.&lt;br /&gt;
&lt;br /&gt;
   -d&lt;br /&gt;
&lt;br /&gt;
   With this option the status of the modem is printed as a decimal&lt;br /&gt;
   number. The bits are encoded as follows (XXX indicates unused bits):&lt;br /&gt;
&lt;br /&gt;
   +---+---+---+---+---+---+---+---+---+&lt;br /&gt;
   | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |&lt;br /&gt;
   +---+---+---+---+---+---+---+---+---+&lt;br /&gt;
   |DSR|RI |DCD|CTS|XXX|XXX|RTS|DTR|XXX|&lt;br /&gt;
   +---+---+---+---+---+---+---+---+---+&lt;br /&gt;
&lt;br /&gt;
   -x&lt;br /&gt;
&lt;br /&gt;
   This option is the same as -d, except that the output is in&lt;br /&gt;
   hexadecimal.&lt;br /&gt;
&lt;br /&gt;
=== BUGS/LIMITATIONS ===&lt;br /&gt;
&lt;br /&gt;
   Statserial only works with devices that support the TIOCMGET ioctl.&lt;br /&gt;
&lt;br /&gt;
   You need permission to read the device file.&lt;br /&gt;
&lt;br /&gt;
   The device file may be locked if other applications are using it.&lt;br /&gt;
&lt;br /&gt;
=== AUTHOR ===&lt;br /&gt;
&lt;br /&gt;
   Statserial was written by Jeff Tranter (Jeff_Tranter@Mitel.COM), later&lt;br /&gt;
   updated by Frank Baumgart (godot@uni-paderborn.de) and is released&lt;br /&gt;
   under the conditions of the GNU General Public License. See the file&lt;br /&gt;
   COPYING and notes in the source code for details.&lt;br /&gt;
&lt;br /&gt;
=== SEE ALSO ===&lt;br /&gt;
&lt;br /&gt;
   setserial(8) stty(1)&lt;br /&gt;
   /usr/src/linux/drivers/char/serial.c /usr/include/linux/termios.h&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Slicer&amp;diff=5195</id>
		<title>Slicer</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Slicer&amp;diff=5195"/>
		<updated>2026-07-31T15:53:20Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Ich nutze diese Seite, um die verschiedenen Einstellmoeglichkeiten (Parameter) der beiden Slicing-Software-Produkte (Slicer) im Ueberblick zu haben.&lt;br /&gt;
Cura fuer den Filamentdruck und chitubox Harzdruck. &lt;br /&gt;
Derzeit benutze ich zur Modellerstellung Autodesk Fusion 360 (gelegentlich auch Blender oder Plasticity). &lt;br /&gt;
Der Auftritt der Slicer beginnt mit dem Datei-&amp;gt;3D-Drucken Menuepunkt in Fusion.&lt;br /&gt;
[[Datei:Fusion 3D Druck.jpg|mini]]&lt;br /&gt;
Fusion unterstuezt dabei 3 Ausgabeformate:&lt;br /&gt;
* 3MF 3D Manufacturing Format&lt;br /&gt;
* STL(binär) &lt;br /&gt;
* STL(ASCII) Standard Triangulation Language (De-facto-Standard mit Schwaechen)&lt;br /&gt;
* OBJ OBJect&lt;br /&gt;
&lt;br /&gt;
STP (STEP) STandard for the Exchange of Product model data und AMF – Additive Manufacturing File Format stehen in Fusion als Export nicht zur Verfuegung.&lt;br /&gt;
&lt;br /&gt;
AMF ist kurz gesagt eine Erweiterung des STL (1988), die seit 2009 zur Verfuegung steht. Es ist XML basierend. Es hat wenig Verbreitung.&lt;br /&gt;
&lt;br /&gt;
3MF ([http://3mf.io/  3MF Konsortium]) Von Microsoft gegruendet. Mitglieder u.a. Autodesk, PTC, Netfabb, Ultimaker, HP, Shapeways, Siemens. Unterstuetzt u.a. eine Miniaturansicht des Modells, Druckerprofile, Angaben zu Stützmaterialien.&lt;br /&gt;
&lt;br /&gt;
OBJ eigentlich fuer 3D-Grafik und Animation entwickelt. Unterstuetzt Farben und Texturen&lt;br /&gt;
&lt;br /&gt;
STL enthaelt nur die Oberflaechengeometrie des Modells in Dreiecksflaechen (Meshes). In 3D-Druckmenue von Fusion kann die &#039;Netzvorschau&#039; und die &#039;Anzahl der Dreiecke&#039; einen groben Eindruck von der Guete des Druckes vermitteln. Es werden keine weiteren Daten zu z.B. Farben, Texturen, ... gespeichert.&lt;br /&gt;
&lt;br /&gt;
Die Angaben zu den Verfeinerungsoptionen beziehen sich auf die Gestalt der Meshes (einfach nur Dreiecke, nicht zu verwechseln mit Mesh als Einheit oder gar WLAN-Mesh)&lt;br /&gt;
&lt;br /&gt;
=Datentransfer im Detail=&lt;br /&gt;
==Fusion 3D Druck Menue==&lt;br /&gt;
Beim Format &#039;3MF&#039; kann man den Einheitentyp (Zentimeter, Millimeter, Meter, Zoll, Fuß) nicht einstellen.&lt;br /&gt;
&lt;br /&gt;
Mit Struktur kann man alle Modelle in eine Datei ablegen, oder jedes Modell in eine eigene Datei.&lt;br /&gt;
&lt;br /&gt;
Mit eingeschalteter Netzvorschau kann man die Anzahl der generierten Dreiecke sehen. &lt;br /&gt;
&lt;br /&gt;
Mit den Verfeinerungseinstellungen &#039;Hoch&#039;, &#039;Mittel&#039; und &#039;Niedrig&#039; veraendert sich folgerichtig auch die Anzahl der Dreiecke.&lt;br /&gt;
&lt;br /&gt;
Zu den Verfeinerungsoptionen mein ChatGPT:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Flächenabmaß (Surface Deviation)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Flächenabmaß bezieht sich darauf, wie genau die Oberflächen von 3D-gedruckten Modellen die ursprünglichen CAD-Modelloberflächen abbilden sollen. Ein kleineres Flächenabmaß bedeutet eine höhere Genauigkeit und somit eine bessere Oberflächenqualität, was jedoch zu einer erhöhten Dateigröße und möglicherweise längeren Druckzeiten führt. Diese Einstellung ist besonders wichtig, wenn das Modell komplexe Kurven oder feine Details enthält.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Normales Abmaß (Normal Deviation)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das normale Abmaß steuert, wie genau die Normalen der Flächen im 3D-Modell repräsentiert werden sollen. Eine geringere Abweichung führt zu einer genaueren und glatteren Oberflächenwiedergabe, erhöht aber auch die Anforderungen an die Dateikomplexität und die Druckzeit.&lt;br /&gt;
An der Stelle bin ich mir nicht sicher, ob hier nicht ein Uebersetzungsfehler vorliegt. &#039;Normal Deviation&#039; ergibt Sinn. Die Uerbsetzung sollte besser &#039;Normalen Abmaß&#039; lauten. Naemlich das Abmasz (Abweichung) der Normalen, also von Dreieck und Original.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Maximale Kantenlänge (Maximum Edge Length)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Diese Einstellung begrenzt die Länge der Kanten im 3D-Druck-Modell. Eine kleinere maximale Kantenlänge kann die Genauigkeit des Modells verbessern, da sie dazu führt, dass Details feiner aufgelöst werden. Dies ist besonders nützlich bei Modellen mit vielen kleinen Features oder feinen Texturen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Seitenverhältnis (Aspect Ratio)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Seitenverhältnis bezieht sich auf das Verhältnis zwischen der Breite und Höhe der einzelnen Elemente des Modells. Ein ungünstiges Seitenverhältnis kann zu Druckproblemen führen, insbesondere bei dünnen, hohen Features, die während des Druckens brechen oder sich verziehen könnten. Die Optimierung des Seitenverhältnisses ist entscheidend für die strukturelle Integrität und die ästhetische Qualität des gedruckten Objekts.&lt;br /&gt;
&lt;br /&gt;
Die Verfeinerungsoptionen sind im Detail:&lt;br /&gt;
&lt;br /&gt;
Das Abmaß gibt die maximale erlaubte Abweichung zwischen den tatsächlichen und den idealen Oberflächen an. Das Flaechenabmaß konzentriert sich auf die geometrische Treue der Oberflaeche selbst. Das normale Abmaß bezieht sich auf die Genauigkeit, mit der die Normalen der Oberflächen im 3D-Modell wiedergegeben werden. Es betrifft die Praezision der Oberflaechennormalen, die für visuelle Effekte wie Beleuchtung und Texturierung wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Am einfachsten kann man sich die Werte an einem Quader klar machen. Ein Quader hat 6 Seiten, jeweils Rechtecke, die jedes durch 2 Meshes genau abgebildet werden koennen. Die Einstellungen haben somit keinen Einfluss auf die Abbildtreue.&lt;br /&gt;
&lt;br /&gt;
An der Stelle lass ich&#039;s mit den Einstellungen mal gut sein. Vielleicht mach mal weiter wenn ich mir die Meshing-Algorithmen mal genauer anschaue.&lt;br /&gt;
Ich sehe keinen Grund darin, den 3D Druck in Fusion nicht immer mit der Verfeinerung &#039;Hoch&#039; durchzufuehren. Warum soll man vor der Uebergabe in den Slicer auf Details verzichten. &lt;br /&gt;
&lt;br /&gt;
[[Datei:Fusion 3D Druck Quader.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
Als 3D-Objekt Viewer benutze ich F3D (Windows, Linux, ...) [https://github.com/f3d-app/f3d/releases/tag/v2.0.0]&lt;br /&gt;
&lt;br /&gt;
Dabei ist mir aufgefallen, dass die Koordinaten-Position (Ursprung) nicht dem Original in Fusion entspricht.&lt;br /&gt;
&lt;br /&gt;
Hinweis: X rot, Y gruen, Z blau (XYZ=RGB)&lt;br /&gt;
&lt;br /&gt;
Der Koerper hat im Original die Masze (20/10/5).&lt;br /&gt;
&lt;br /&gt;
===3MF===&lt;br /&gt;
Beim 3MF-Dateiformat handelt es sich um ein Zip-Archiv (File Signatur 50 4B 03 04). Die Datei enthielt im o. g. Beispiel zwei Dateien.&lt;br /&gt;
* 3D/3dmodel.model&lt;br /&gt;
*_rels/.rels&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Relationships xmlns=&amp;quot;http://schemas.openxmlformats.org/package/2006/relationships&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Relationship Type=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel&amp;quot; Target=&amp;quot;/3D/3dmodel.model&amp;quot; Id=&amp;quot;rel0&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Relationships&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;model xmlns=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/core/2015/02&amp;quot; unit=&amp;quot;millimeter&amp;quot; xml:lang=&amp;quot;en-US&amp;quot; xmlns:m=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/material/2015/02&amp;quot; xmlns:p=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/production/2015/06&amp;quot; xmlns:b=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/beamlattice/2017/02&amp;quot; xmlns:s=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/slice/2015/07&amp;quot; xmlns:sc=&amp;quot;http://schemas.microsoft.com/3dmanufacturing/securecontent/2019/04&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;metadata name=&amp;quot;Title&amp;quot; type=&amp;quot;QName&amp;quot; preserve=&amp;quot;1&amp;quot;&amp;gt;Scheibe v1&amp;lt;/metadata&amp;gt;&lt;br /&gt;
        &amp;lt;resources&amp;gt;&lt;br /&gt;
                &amp;lt;m:colorgroup id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;m:color color=&amp;quot;#A0A0A0FF&amp;quot;/&amp;gt;&lt;br /&gt;
                        &amp;lt;m:color color=&amp;quot;#A0A0A0FF&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;/m:colorgroup&amp;gt;&lt;br /&gt;
                &amp;lt;object id=&amp;quot;1&amp;quot; name=&amp;quot;Körper2&amp;quot; type=&amp;quot;model&amp;quot; p:UUID=&amp;quot;1eb949bd-306e-47d5-9ca5-fae3bfc7a5f0&amp;quot; pid=&amp;quot;2&amp;quot; pindex=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;mesh&amp;gt;&lt;br /&gt;
                                &amp;lt;vertices&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;20.000000&amp;quot; y=&amp;quot;10.000000&amp;quot; z=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;0&amp;quot; y=&amp;quot;10.000000&amp;quot; z=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;0&amp;quot; y=&amp;quot;10.000000&amp;quot; z=&amp;quot;5.000000&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;20.000000&amp;quot; y=&amp;quot;10.000000&amp;quot; z=&amp;quot;5.000000&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;20.000000&amp;quot; y=&amp;quot;0&amp;quot; z=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;20.000000&amp;quot; y=&amp;quot;0&amp;quot; z=&amp;quot;5.000000&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; z=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;vertex x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; z=&amp;quot;5.000000&amp;quot; /&amp;gt;&lt;br /&gt;
                                &amp;lt;/vertices&amp;gt;&lt;br /&gt;
                                &amp;lt;triangles&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;0&amp;quot; v2=&amp;quot;1&amp;quot; v3=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;3&amp;quot; v2=&amp;quot;1&amp;quot; v3=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;4&amp;quot; v2=&amp;quot;0&amp;quot; v3=&amp;quot;5&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;5&amp;quot; v2=&amp;quot;0&amp;quot; v3=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;6&amp;quot; v2=&amp;quot;4&amp;quot; v3=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;7&amp;quot; v2=&amp;quot;4&amp;quot; v3=&amp;quot;5&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;1&amp;quot; v2=&amp;quot;6&amp;quot; v3=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;2&amp;quot; v2=&amp;quot;6&amp;quot; v3=&amp;quot;7&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;7&amp;quot; v2=&amp;quot;5&amp;quot; v3=&amp;quot;2&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;2&amp;quot; v2=&amp;quot;5&amp;quot; v3=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;1&amp;quot; v2=&amp;quot;0&amp;quot; v3=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
                                        &amp;lt;triangle v1=&amp;quot;6&amp;quot; v2=&amp;quot;0&amp;quot; v3=&amp;quot;4&amp;quot; /&amp;gt;&lt;br /&gt;
                                &amp;lt;/triangles&amp;gt;&lt;br /&gt;
                        &amp;lt;/mesh&amp;gt;&lt;br /&gt;
                &amp;lt;/object&amp;gt;&lt;br /&gt;
        &amp;lt;/resources&amp;gt;&lt;br /&gt;
        &amp;lt;build p:UUID=&amp;quot;7216c12b-0a4b-464d-b9e2-85b262c4d008&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;item objectid=&amp;quot;1&amp;quot; p:UUID=&amp;quot;90cd1c31-7ad4-42cd-9206-7d2902c90d1f&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/build&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===STL Binaer===&lt;br /&gt;
File Signature 53 54 4c 42 20 41 54 46 STLB ATF [https://people.sc.fsu.edu/~jburkardt/data/stlb/stlb.html]&lt;br /&gt;
&lt;br /&gt;
===STL ASCII===&lt;br /&gt;
Im Gegensatz zum STLB-Format ist das STLA-Format direkt als Textdatei lesbar.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ascii&amp;quot; line&amp;gt;&lt;br /&gt;
solid ASCII&lt;br /&gt;
  facet normal 0.000000e+00 1.000000e+00 -0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 1.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 5.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 1.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 1.000000e+00 -0.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 5.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 -1.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 -1.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 5.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal -1.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal -1.000000e+00 -0.000000e+00 0.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 5.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 0.000000e+00 1.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 5.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 5.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal -0.000000e+00 0.000000e+00 1.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 5.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 5.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 5.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 0.000000e+00 -1.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
  facet normal 0.000000e+00 0.000000e+00 -1.000000e+00&lt;br /&gt;
    outer loop&lt;br /&gt;
      vertex   0.000000e+00 0.000000e+00 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 1.000000e+01 0.000000e+00&lt;br /&gt;
      vertex   2.000000e+01 0.000000e+00 0.000000e+00&lt;br /&gt;
    endloop&lt;br /&gt;
  endfacet&lt;br /&gt;
endsolid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===OBJ (MTL)===&lt;br /&gt;
Mit der OBJ-Datei wird auch noch gleichzeitig eine MTL-Datei (Material) exportiert. Die enthaelt Informationen zu der Textur.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ascii&amp;quot; line&amp;gt;&lt;br /&gt;
# WaveFront *.obj file (generated by Autodesk ATF)&lt;br /&gt;
&lt;br /&gt;
mtllib Quader.mtl&lt;br /&gt;
&lt;br /&gt;
g Körper2&lt;br /&gt;
&lt;br /&gt;
v 20.000000 10.000000 0.000000&lt;br /&gt;
v 0.000000 10.000000 0.000000&lt;br /&gt;
v 0.000000 10.000000 5.000000&lt;br /&gt;
v 20.000000 10.000000 5.000000&lt;br /&gt;
v 20.000000 0.000000 0.000000&lt;br /&gt;
v 20.000000 0.000000 5.000000&lt;br /&gt;
v 0.000000 0.000000 0.000000&lt;br /&gt;
v 0.000000 0.000000 5.000000&lt;br /&gt;
vt 0.000000 0.000000 0.000000&lt;br /&gt;
vt 2.000000 0.000000 0.000000&lt;br /&gt;
vt 0.000000 0.500000 0.000000&lt;br /&gt;
vt 2.000000 0.500000 0.000000&lt;br /&gt;
vt 0.000000 0.000000 0.000000&lt;br /&gt;
vt 1.000000 0.000000 0.000000&lt;br /&gt;
vt 0.000000 0.500000 0.000000&lt;br /&gt;
vt 1.000000 0.500000 0.000000&lt;br /&gt;
vt 0.000000 0.000000 0.000000&lt;br /&gt;
vt 2.000000 0.000000 0.000000&lt;br /&gt;
vt 0.000000 0.500000 0.000000&lt;br /&gt;
vt 2.000000 0.500000 0.000000&lt;br /&gt;
vt 0.000000 0.000000 0.000000&lt;br /&gt;
vt 1.000000 0.000000 0.000000&lt;br /&gt;
vt 0.000000 0.500000 0.000000&lt;br /&gt;
vt 1.000000 0.500000 0.000000&lt;br /&gt;
vt -1.000000 -0.500000 0.000000&lt;br /&gt;
vt 1.000000 -0.500000 0.000000&lt;br /&gt;
vt -1.000000 0.500000 0.000000&lt;br /&gt;
vt 1.000000 0.500000 0.000000&lt;br /&gt;
vt 1.000000 0.500000 0.000000&lt;br /&gt;
vt -1.000000 0.500000 0.000000&lt;br /&gt;
vt 1.000000 -0.500000 0.000000&lt;br /&gt;
vt -1.000000 -0.500000 0.000000&lt;br /&gt;
vn 0.000000 0.100000 0.000000&lt;br /&gt;
vn 0.000000 0.100000 0.000000&lt;br /&gt;
vn 0.000000 0.100000 0.000000&lt;br /&gt;
vn 0.000000 0.100000 0.000000&lt;br /&gt;
vn 0.100000 0.000000 0.000000&lt;br /&gt;
vn 0.100000 0.000000 0.000000&lt;br /&gt;
vn 0.100000 0.000000 0.000000&lt;br /&gt;
vn 0.100000 0.000000 0.000000&lt;br /&gt;
vn 0.000000 -0.100000 0.000000&lt;br /&gt;
vn 0.000000 -0.100000 0.000000&lt;br /&gt;
vn 0.000000 -0.100000 0.000000&lt;br /&gt;
vn 0.000000 -0.100000 0.000000&lt;br /&gt;
vn -0.100000 0.000000 0.000000&lt;br /&gt;
vn -0.100000 0.000000 0.000000&lt;br /&gt;
vn -0.100000 0.000000 0.000000&lt;br /&gt;
vn -0.100000 0.000000 0.000000&lt;br /&gt;
vn 0.000000 0.000000 0.100000&lt;br /&gt;
vn 0.000000 0.000000 0.100000&lt;br /&gt;
vn 0.000000 0.000000 0.100000&lt;br /&gt;
vn 0.000000 0.000000 0.100000&lt;br /&gt;
vn 0.000000 0.000000 -0.100000&lt;br /&gt;
vn 0.000000 0.000000 -0.100000&lt;br /&gt;
vn 0.000000 0.000000 -0.100000&lt;br /&gt;
vn 0.000000 0.000000 -0.100000&lt;br /&gt;
usemtl Stahl_-_satiniert&lt;br /&gt;
f 1/1/1 2/2/2 4/3/3&lt;br /&gt;
f 4/3/3 2/2/2 3/4/4&lt;br /&gt;
f 5/5/5 1/6/6 6/7/7&lt;br /&gt;
f 6/7/7 1/6/6 4/8/8&lt;br /&gt;
f 7/9/9 5/10/10 8/11/11&lt;br /&gt;
f 8/11/11 5/10/10 6/12/12&lt;br /&gt;
f 2/13/13 7/14/14 3/15/15&lt;br /&gt;
f 3/15/15 7/14/14 8/16/16&lt;br /&gt;
f 8/17/17 6/18/18 3/19/19&lt;br /&gt;
f 3/19/19 6/18/18 4/20/20&lt;br /&gt;
f 2/21/21 1/22/22 7/23/23&lt;br /&gt;
f 7/23/23 1/22/22 5/24/24&lt;br /&gt;
# 8 vertices&lt;br /&gt;
# 24 texture params&lt;br /&gt;
# 24 normals&lt;br /&gt;
# 12 facets&lt;br /&gt;
&lt;br /&gt;
# 1 groups&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ascii&amp;quot; line&amp;gt;&lt;br /&gt;
# WaveFront *.mtl file (generated by Autodesk ATF)&lt;br /&gt;
&lt;br /&gt;
newmtl Stahl_-_satiniert&lt;br /&gt;
Kd 0.627451 0.627451 0.627451&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CHITUBOX==&lt;br /&gt;
&lt;br /&gt;
Die Software ist soweit unspektakulaer. Neben den zu erwartenden Funktionen wie Verschieben, Drehen, Skalieren und Duplizieren und Spiegeln hat die Funktion &#039;Dig Hole&#039; in Kombination mit &#039;Hollow&#039; beim Resin-Druck eine besondere Bedeutung. Im Gegensatz zum Filament-Druck muss fluessiges Resin aus einem Hohlraum abflieszen koennen und dazu benoetigt es Loecher :-). Auf das Problem, dass in einem Hohlraum ein Vakuum gezogen wird ist damit beseitigt.&lt;br /&gt;
&lt;br /&gt;
Darueber hinaus gibt es eigentlich nur 2 notwendige Menues Stuetzstrukturen und Slice Settings.&lt;br /&gt;
&lt;br /&gt;
Der &#039;Slice Settings&#039;-Button befindet sich rechts im Dateibearbeitungs-Menue ganz unten, direkt ueber dem Slice-Button, mit dem man den Prozess abschlieszen kann.&lt;br /&gt;
Das Stuetzstrukturmenue befindet sich als Reiter rechts neben der Dateibearbeitung. Neben der Tatsache, dass man die Stuetzstruktur-Einstellungen in einer Config-Datei (zwischen-)speichern kann, ist der Autosupport-Button sehr hilfreich.&lt;br /&gt;
Recht hilfreich ist auch die Cavity- und Collision-Detector, die Alarm schlagen sollte mit den Modellen grunedsaetzlich was nicht stimmen.&lt;br /&gt;
&lt;br /&gt;
Die groeszte Beachtung sollte man wohl den Slice-Settings widmen. Die Einstellungen sind recht umfangreich und sind Maschinen und Resin-Typ abhaengig.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Chitubox Slice Settings Machine.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Chitubox Slice Settings Resin.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Chitubox Slice Settings Print.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Chitubox Slice Settings Advance.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Die Eintraege zu GCODE sind in meiner Version V2.2 nicht (mehr) vorhanden.&lt;br /&gt;
 Bug Fix v1.9.1: Fixed the bug that the gcode parameter is not displayed!?&lt;br /&gt;
&lt;br /&gt;
Nachdem Slicen bekommt man nochmal alle Einstellungen zu Maschine, Resin und Print angezeigt, dann kann man speichern. Bei mir kam beim Testen noch eine Warnung ich haette keine Island-Detection [https://www.chitubox.com/en/academy/tutorials/chitubox-basic/manual/island-detection-on-chitubox-explained] durchgefuehrt.&lt;br /&gt;
&lt;br /&gt;
Ausgegeben wird eine Datei im CTB-Format (ChiTuBox-Format [https://www.chitubox.com/en/page/sdk]).&lt;br /&gt;
&lt;br /&gt;
About CTB file format and the SDK&lt;br /&gt;
&lt;br /&gt;
Before the CTB file format was created, the commonly used slice file types were CBDDLP, CWS, ZIP, SLC, etc. They didn&#039;t perform well when dealing with the increasing number of new application scenarios, and their extensibility couldn&#039;t satisfy the growing demands of the LCD/DLP resin 3D printer users. So when CHITUBOX Basic V1.6.1 was released (in Nov 2019), CBD-Tech introduced a new file format tailored for LCD/DLP resin 3D printers – CTB (short for CHITUBOX). This format was lightweight, streamlined and highly extensible, and worked better with various resin 3D printers. As the functionalities of CHITUBOX continued to grow, the CTB format got updated continuously to fit in more application scenarios and support more resin printer features.&lt;br /&gt;
&lt;br /&gt;
Later, in 2021, LCD/DLP resin 3D printing technologies kept advancing, and so did the CHITUBOX software. So when CHITUBOX Basic V1.9.0 and CHITUBOX Pro were released, we introduced the new, upgraded CTB. This new format enables you to use the newly-added powerful features of the CHITUBOX software, such as Two-Stage Motion Control (TSMC), Resting Time, Multi-parameter Slice, and more.&lt;br /&gt;
&lt;br /&gt;
As the user base of CTB is rapidly growing, we also see requirements coming out from the developers in our communities and our business partners. To help them offer better products and services to the users, CBD-Tech publishes the standard and officially verified SDK for the CTB format. We hope these tools can simplify creative process for the developers and the partners and help them unleash their creativity.&lt;br /&gt;
&lt;br /&gt;
Hinweis aus dem Forum:  &lt;br /&gt;
Am I correct in thinking that the Elegoo Mars Pro only supports the new CTB format, and nothing else? I tried putting an old CBDDLP file on there and the printer just tried to open it as if it&#039;s a folder.&lt;br /&gt;
&lt;br /&gt;
Seems like a bit of a dissapointing step back if so, as it means there&#039;s currently no choice of slicer other than the (somewhat limited) Chitubox. Useful tools like the Photon File Validator for fixing bad supports also no longer work due to the forced new file format. &lt;br /&gt;
&lt;br /&gt;
You are correct, the pro only supports the new ctb format. It&#039;s actually a smaller more compact file than the old format and seems to be more stable. If you really want to work outside chitubox you can use slicers like the prusa slice and add/create supports then save the whole thing as an stl then bring into chitubox to simply slice. I believe eventually other software will catch up and support the new ctb format. &lt;br /&gt;
&lt;br /&gt;
You can import stl, obj, cbddlp, photon, photons, zip, slc, wow, fhd, cwS, ctb, phz, svgx, lgs, chitubox, cfg, ... files into Chitubox wich comes with the printer. From there you can convert the files to .cbt and print them.&lt;br /&gt;
&lt;br /&gt;
==Cura Ultimaker==&lt;br /&gt;
UltiMaker Cura ist eine kostenlose, benutzerfreundliche 3D-Drucksoftware, der Millionen von Nutzern vertrauen. Optimieren Sie Ihr 3D-Modell mit über 400 Einstellungen für die besten Slicing- und Druckergebnisse. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prusa Slicer==&lt;br /&gt;
PrusaSlicer ist ein quelloffenes, funktionsreiches und haeufig aktualisiertes Tool, das alles enthaelt, was Sie brauchen, um die perfekten Druckdateien für Ihren 3D-Drucker zu generieren. Sie koennen Neuigkeiten und das vollstaendige Versionsprotokoll auf Github einsehen.&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
Druckmodell-Plattformen: [https://www.thingiverse.com/ Thingiverse] [https://www.myminifactory.com/ MyMiniFactory]&lt;br /&gt;
&lt;br /&gt;
=Request for Comments=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Serial.print()_Funktion&amp;diff=5194</id>
		<title>Serial.print() Funktion</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Serial.print()_Funktion&amp;diff=5194"/>
		<updated>2026-07-31T15:53:19Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;oder serial.println()&lt;br /&gt;
&lt;br /&gt;
Nach dem ich schon in mehreren Programmen Probleme mit &amp;quot;zerschossenen&amp;quot; Variablen hatte trage ich hier mal alle meine Infos zusammen. &lt;br /&gt;
&lt;br /&gt;
Ähnlich gelagerte Probleme haben andere Nutzer bereits in Foren formuliert.&lt;br /&gt;
&lt;br /&gt;
https://www.arduinoforum.de/arduino-Thread-Problem-mit-char-array&lt;br /&gt;
&lt;br /&gt;
https://forum.arduino.cc/index.php?topic=368430.0&lt;br /&gt;
&lt;br /&gt;
Mit den Antworten war ich allerdings weniger zufrieden. Ich finde in Foren einfach zu oft die Reaktion:&lt;br /&gt;
&lt;br /&gt;
#Warum machst Du das so?&lt;br /&gt;
#Das geht so viel besser!&lt;br /&gt;
#Dein Ansatz ist falsch.&lt;br /&gt;
&lt;br /&gt;
Das heißt eigentlich wird gar zu selten auf das eigentliche Problem eingegangen, sondern es wird einfach ein Workaround geschildert oder gar eine komplett andere Evtl-Lösung empfohlen.&lt;br /&gt;
Ein  Kommentator spricht mir aus der Seele:&lt;br /&gt;
&lt;br /&gt;
 Ich verstehe deinen Lösungsvorschlag schon, aber mich würde mehr interessieren, warum meine Lösung nicht funktioniert.  &lt;br /&gt;
&lt;br /&gt;
==1. Fall==&lt;br /&gt;
Variablen haben nach einem Funktionsaufruf einen anderen (undefinierten) Wert, obwohl sie in der Funktion gar nicht benutzt wurden.&lt;br /&gt;
Unabhängig von der Scope-Problematik, sehe ich als Ursache fehlerhaft programmierte Libraries als Ursache. Dies tritt gerade dann zu Tage wenn mehrere Libraries in einem Programm benutzt werden, die sich &lt;br /&gt;
dann sehr oft gegenseitig beeinflussen. Die Problem wird dann auch noch durch den Umstand verstärkt wenn die (RAM-)Ressourcen ausgereizt werden, oder der Zugriff auf Kommunikationsschnittstellen aufgeteilt wird.&lt;br /&gt;
&lt;br /&gt;
==2.Fall==&lt;br /&gt;
Das Gepointere geht fast immer in die Hose. Obwohl die Logik (Speicherbereich zugewiesen, Inhalt vorhanden, String korrekt mit \0 abgeschlossen, ...) stimmt, erhält man nicht das gewünschte Ergebnis.&lt;br /&gt;
Hier habe ich mehrfach Versuche, die über seriellen Output, StatusLEDs oder angeschlossenes Display den Programmzustand nach &amp;quot;außen&amp;quot; melden, abgebrochen.&lt;br /&gt;
&lt;br /&gt;
==Lösung(en)==&lt;br /&gt;
Mein einziger Ansatz, der Lösungen verspricht, ist das Emulieren oder noch besser Step-Debugging wie ich es noch aus der Assemblerzeit mit dem MC86HC05/11 her kenne. Zu diesem Zweck habe ich mir jetzt mal&lt;br /&gt;
den Atmel-ICE ([https://de.wikipedia.org/wiki/In-Circuit-Emulator In-Circuit-Emulator]) zugelegt und werde die oben genannten Fälle mal &amp;quot;low Level&amp;quot; untersuchen.&lt;br /&gt;
&lt;br /&gt;
to be continued ...&lt;br /&gt;
&lt;br /&gt;
==Request for Comments==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;comments /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
	<entry>
		<id>https://tippvomtibb.de/wiki/index.php?title=Schaltjahr_berechnen&amp;diff=5193</id>
		<title>Schaltjahr berechnen</title>
		<link rel="alternate" type="text/html" href="https://tippvomtibb.de/wiki/index.php?title=Schaltjahr_berechnen&amp;diff=5193"/>
		<updated>2026-07-31T15:53:18Z</updated>

		<summary type="html">&lt;p&gt;Chris T. Ludwig: Rechtschreibkorrektur (automatisiert)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Allgemeines=&lt;br /&gt;
Ich habe vor kurzem als Dozent einen Python-Kurs gehalten. Auf der Suche nach &amp;quot;schoenen&amp;quot; kleinen Beispielen habe ich mich wieder an meinen Schulzeit erinnert und die Schaltjahr-Berechnung rausgekramt. Das war so ein Klassiker neben den Tuermen von Hanoi, Game of Life und allen Varianten von Zahlenberechnungen (Pi, Prim, Fibonacci, ggT, Fakultaet, ...)&lt;br /&gt;
&lt;br /&gt;
 Schaltjahr (lateinisch annus intercalarius oder annus bissextus)&lt;br /&gt;
&lt;br /&gt;
 Ein siderisches Jahr der Erde dauert derzeit im Mittel etwa 365,256 Tage, gemessen in SI-Einheiten, somit ungefähr 20 Minuten länger als ein tropisches Jahr.&lt;br /&gt;
&lt;br /&gt;
 Die Einschaltung eines zusätzlichen Tages oder Monats wird auch als Interkalation bezeichnet. Eine Sonderform der Schalttage sind Epagomene. &lt;br /&gt;
&lt;br /&gt;
 Der Julianische Kalender (Julius Caesar 45 v.Chr.) fuegt alle 4 Jahre einen Schalttag (29.2.) ein.&lt;br /&gt;
 &lt;br /&gt;
 Seit 1582 n.Chr. wird im gregorianischen Kalender alle 400 Jahre auf das Einfuegen verzichtet.   &lt;br /&gt;
&lt;br /&gt;
Die Regeln:&lt;br /&gt;
* Ist das Jahr durch 4 (ohne Rest) teilbar? (&amp;quot;Julianische Regel&amp;quot;)&lt;br /&gt;
* Ist das Jahr durch 100 (ohne Rest) und ist das Jahr durch 400 (ohne Rest) teilbar? (&amp;quot;Gregorianische Ergaenzung&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
=Programme=&lt;br /&gt;
==Excel==&lt;br /&gt;
In der Zelle A1 steht das Jahr.&lt;br /&gt;
&lt;br /&gt;
 =IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)&amp;lt;&amp;gt;0)),&amp;quot;Leap Year&amp;quot;, &amp;quot;NOT a Leap Year&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Die Bedingung mal etwas aufgeloest:&lt;br /&gt;
 OR(MOD(A1,400)=0, &lt;br /&gt;
    AND(MOD(A1,4)=0, &lt;br /&gt;
          MOD(A1,100)&amp;lt;&amp;gt;0&lt;br /&gt;
    )&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
Wie kommt man jetzt auf sowas?&lt;br /&gt;
&lt;br /&gt;
Wir haben 3 Bedingungen, die man alle 3 mit der Modulo-Operation abbilden kann.&lt;br /&gt;
Eine 0 bei der Modulo-Division bedeutet keinen Rest und damit ein &amp;quot;True&amp;quot; fuer das Schaltjahr.&lt;br /&gt;
* Jahr Modulo 4 = 0 -&amp;gt; Schaltjahr&lt;br /&gt;
* Jahr Modulo 400 = 0 UND Jahr Modulo 100 = 0 -&amp;gt; kein Schaltjahr&lt;/div&gt;</summary>
		<author><name>Chris T. Ludwig</name></author>
	</entry>
</feed>