<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Test Adapter pjlink-class2 v0.1.x GitHub]]></title><description><![CDATA[<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Aktuelle Test Version</th>
<th>0.1.2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Veröffentlichungsdatum</td>
<td>25.09.2026</td>
</tr>
<tr>
<td>Github Link</td>
<td><a href="https://github.com/AlanSRU/ioBroker.pjlink-class2" rel="nofollow ugc">https://github.com/AlanSRU/ioBroker.pjlink-class2</a></td>
</tr>
<tr>
<td>NPM Link</td>
<td><a href="https://www.npmjs.com/package/iobroker.pjlink-class2" rel="nofollow ugc">https://www.npmjs.com/package/iobroker.pjlink-class2</a></td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>Hinweis zur KI-Beteiligung:</strong> Dieser Adapter wurde mit Unterstützung einer KI (Claude) entwickelt. Code, Tests und Dokumentation habe ich geprüft, und der Adapter wurde an echten Projektoren sowie mit dem offiziellen PJLink-Testprogramm getestet (Details unten).</p>
<p dir="auto"><strong>Hinweis zur Sprache:</strong> Ich bin kein deutscher Muttersprachler – dieser Text wurde mit Hilfe übersetzt. Bitte entschuldigt eventuelle Fehler oder holprige Formulierungen. Fragen und Rückmeldungen gerne auf Deutsch oder Englisch; weiter unten steht der Text auch auf Englisch.</p>
</blockquote>
<p dir="auto">Hallo zusammen,</p>
<p dir="auto">ich stelle hier meinen neuen Adapter <strong>ioBroker.pjlink-class2</strong> zum Testen vor. Er steuert Projektoren und Displays über <strong>PJLink Klasse 1 und Klasse 2</strong> und ist als Alternative zum bestehenden <code>pjlink</code>-Adapter gedacht. <strong>Das PJLink-Protokoll ist vollständig im Adapter selbst umgesetzt – er ist nicht mehr von der alten npm-Bibliothek abhängig</strong>, auf der der <code>pjlink</code>-Adapter aufbaut.</p>
<h2>Warum ein neuer Adapter?</h2>
<p dir="auto">Der bestehende <code>pjlink</code>-Adapter baut auf einer npm-Bibliothek auf, die nur PJLink Klasse 1 unterstützt und kaum noch gepflegt wird. Bei uns ist er außerdem gelegentlich mit einem nicht abgefangenen <code>ECONNRESET</code> abgestürzt, wenn ein Projektor beim Ein- oder Ausschalten die Verbindung getrennt hat.</p>
<p dir="auto"><strong>pjlink-class2</strong> ersetzt diese Bibliothek durch eine eigene Umsetzung und unterstützt zusätzlich die Funktionen von PJLink Klasse 2.</p>
<h2>Was macht der Adapter?</h2>
<ul>
<li><strong>Eigene PJLink-Implementierung:</strong> Verbindung, Anmeldung, alle Befehle, UDP-Suche und Statusmeldungen sind direkt im Adapter programmiert. Es gibt keine Abhängigkeit von einer PJLink-Bibliothek; die einzige Laufzeit-Abhängigkeit ist <code>@iobroker/adapter-core</code>.</li>
<li><strong>Eine Instanz steuert beliebig viele Projektoren</strong>, jeder in einem eigenen Geräteordner (<code>pjlink-class2.0.&lt;name&gt;...</code>).</li>
<li><strong>Automatische Erkennung der PJLink-Klasse</strong> (<code>CLSS ?</code>). Klasse-2-Datenpunkte werden nur bei Klasse-2-Geräten angelegt.</li>
<li><strong>Kurze TCP-Sitzungen:</strong> Für jede Abfrage bzw. jeden Befehl wird verbunden, gesendet und wieder getrennt. Der Projektor bleibt so für andere Steuerungen (z. B. Crestron, Extron) erreichbar.</li>
<li><strong>Authentifizierung</strong> mit MD5 (ältere Geräte) und SHA-256 (neuere Geräte und das offizielle Testprogramm). Der Adapter erkennt selbst, welches Verfahren ein Gerät erwartet.</li>
<li><strong>Klasse 2 über UDP 4352:</strong> Statusmeldungen (Ein/Aus, Eingang, Fehlerstatus, Netzwerk verbunden) werden sofort übernommen, und über die <strong>Suche</strong> in der Instanzkonfiguration werden Klasse-2-Projektoren im eigenen Netz gefunden.</li>
<li><strong>Abgelehnte Befehle werden sichtbar:</strong> Meldet der Projektor z. B. <code>ERR3</code> (während Aufwärmen oder Abkühlen nicht möglich), steht das in <code>info.lastError</code>, statt stillschweigend ignoriert zu werden.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Funktion</th>
<th>Klasse 1</th>
<th>Klasse 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ein/Aus, Leistungsstatus (Aus/Ein/Abkühlen/Aufwärmen)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Eingang wählen (Klasse 2 auch alphanumerische Codes, z. B. <code>3A</code>)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Bild- und Tonstummschaltung</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Fehlerstatus (Lüfter, Lampe, Temperatur, Abdeckung, Filter, Sonstiges)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Lampenstunden (mehrere Lampen)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Name, Hersteller, Modell</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Standbild (Freeze), Lautsprecher- und Mikrofonlautstärke</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>Seriennummer, Softwareversion, Eingangsnamen</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>Eingangs- und empfohlene Auflösung, Filterstunden, Ersatzlampe/-filter</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>Statusmeldungen per UDP, Suche</td>
<td>–</td>
<td>✔</td>
</tr>
</tbody>
</table>
<h2>Voraussetzungen</h2>
<ul>
<li><strong>Node.js 22</strong> oder neuer, <strong>js-controller 6.0.11</strong> oder neuer, <strong>Admin 7.6.20</strong> oder neuer</li>
<li>PJLink muss am Projektor aktiviert sein (bei vielen Geräten unter Netzwerk-Einstellungen), TCP-Port 4352 muss vom ioBroker-Host erreichbar sein</li>
<li>Für Klasse-2-Statusmeldungen und die Suche: UDP-Port 4352 auf dem ioBroker-Host. <strong>Nur ein Programm pro Host</strong> kann diesen Port belegen – deshalb verwaltet eine Instanz alle Projektoren.</li>
</ul>
<h2>Konfiguration</h2>
<ul>
<li><strong>Projektoren:</strong> eine Zeile pro Gerät mit Name, IP-Adresse oder Hostname und Port (Standard 4352). Aus dem Namen wird der Ordner im Objektbaum.</li>
<li><strong>PJLink-Passwort:</strong> gilt für alle Projektoren, die eine Anmeldung verlangen (verschlüsselt gespeichert).</li>
<li><strong>Abfrageintervalle:</strong> Status (Standard 5 s) und Geräteinformationen wie Namen, Eingänge und Lampenstunden (Standard 300 s).</li>
<li><strong>Suche:</strong> sendet eine Klasse-2-Suche als Broadcast und trägt gefundene Projektoren in die Tabelle ein. Klasse-1-Geräte antworten darauf nicht und müssen von Hand eingetragen werden; Broadcasts gehen nicht über Router hinweg.</li>
</ul>
<h2>Installation</h2>
<p dir="auto">Der Adapter ist noch nicht im Latest-Repository. Installation über Admin → Adapter → <strong>„Benutzerdefiniert installieren“</strong> (GitHub-Symbol) → URL:<br />
<code>https://github.com/AlanSRU/ioBroker.pjlink-class2</code></p>
<p dir="auto">Danach eine Instanz anlegen, die Projektoren eintragen und speichern.</p>
<h2>Bisher getestet</h2>
<ul>
<li><strong>Klasse 1:</strong> drei <strong>NEC NP3250</strong> im Standby – alle Abfragen (Leistung, Eingang, Stummschaltung, Fehlerstatus, Lampe, Eingänge, Name, Hersteller, Modell). Schaltbefehle habe ich an diesen Geräten bewusst nicht gesendet, da sie im laufenden Betrieb sind.</li>
<li><strong>Klasse 2:</strong> mit dem offiziellen JBMIA-Testprogramm <strong>PJLinkTEST4CNT</strong> – Anmeldung (SHA-256), alle Abfragen, alle Befehle, Suche und alle vier Statusmeldungen.</li>
<li>Automatische Tests gegen einen Projektorsimulator (Klasse 1 und 2, mit und ohne Passwort) sowie Integrationstests unter Node.js 22, 24 und 26 auf Linux, Windows und macOS.</li>
</ul>
<p dir="auto"><strong>Noch nicht getestet:</strong> ein echter Klasse-2-Projektor sowie ein echtes Gerät mit Passwort.</p>
<h2>Bekannte Punkte / Einschränkungen</h2>
<ul>
<li><strong>Datenpunkte anders als beim <code>pjlink</code>-Adapter</strong> (Umstieg siehe unten); Skripte und Visualisierungen müssen angepasst werden.</li>
<li><strong>Ein gemeinsames Passwort</strong> für alle Projektoren (pro Projektor noch nicht möglich).</li>
<li><strong>Statusmeldungen</strong> schickt der Projektor an eine Steuerung – welche, hängt vom Gerät ab. Läuft eine zweite Steuerung (z. B. Crestron/Extron) parallel, kommen die Meldungen eventuell dort an. Die regelmäßige Abfrage läuft immer, die Werte bleiben also aktuell.</li>
<li><strong>NEC NP3250:</strong> Ein Einschaltbefehl kurz nach dem Abkühlen wird vom Projektor angenommen, aber ignoriert. Der Adapter hält <code>control.power</code> bis zu 30 s auf dem gewünschten Wert und meldet danach in <code>info.lastError</code>, dass sich nichts geändert hat.</li>
</ul>
<h2>Umstieg vom <code>pjlink</code>-Adapter</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th><code>pjlink.0.…</code></th>
<th><code>pjlink-class2.0.&lt;projektor&gt;.…</code></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>power</code></td>
<td><code>control.power</code></td>
</tr>
<tr>
<td><code>powerStatus</code> (0/1/2/3)</td>
<td><code>status.power</code> (gleiche Werte)</td>
</tr>
<tr>
<td><code>input</code> (Zahl)</td>
<td><code>control.input</code> (<strong>Text</strong>, z. B. <code>"31"</code>)</td>
</tr>
<tr>
<td><code>info.connection</code></td>
<td><code>info.connection</code> (pro Projektor; die Instanz meldet „mindestens einer erreichbar“)</td>
</tr>
</tbody>
</table>
<h2>Wie ihr helfen könnt</h2>
<ul>
<li><strong>Besonders gesucht:</strong> Tester mit <strong>echten Klasse-2-Projektoren</strong> (Epson, Panasonic, Sony, NEC u. a.) und mit <strong>Projektoren mit gesetztem PJLink-Passwort</strong></li>
<li>Bitte angeben: <strong>Hersteller und Modell</strong>, PJLink-Klasse (<code>info.class</code>), ob ein Passwort gesetzt ist</li>
<li>Bei Problemen: <strong>Log im Loglevel „debug“</strong> und kurze Beschreibung, was ihr erwartet habt</li>
<li>Fehler gerne auch direkt als Issue: <a href="https://github.com/AlanSRU/ioBroker.pjlink-class2/issues" rel="nofollow ugc">https://github.com/AlanSRU/ioBroker.pjlink-class2/issues</a></li>
</ul>
<h2>Changelog 0.1.x</h2>
<ul>
<li><strong>0.1.2:</strong> Datenquelle als „Abfrage“ deklariert (Klasse-2-Meldungen ergänzen sie nur), unterstützte Nachrichten auf die aktuelle Art deklariert, veraltete API-Aufrufe ersetzt</li>
<li><strong>0.1.1:</strong> Die nächste Abfrage wird erst geplant, wenn die vorherige abgeschlossen ist – ein langsamer Projektor führt so nicht mehr zu überlappenden Abfragen; Mindestversionen in der README</li>
<li><strong>0.1.0:</strong> erste Version</li>
</ul>
<p dir="auto">Vielen Dank fürs Testen!</p>
<hr />
<h1>English</h1>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Current test version</th>
<th>0.1.2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Release date</td>
<td>25 Sep 2026</td>
</tr>
<tr>
<td>GitHub</td>
<td><a href="https://github.com/AlanSRU/ioBroker.pjlink-class2" rel="nofollow ugc">https://github.com/AlanSRU/ioBroker.pjlink-class2</a></td>
</tr>
<tr>
<td>npm</td>
<td><a href="https://www.npmjs.com/package/iobroker.pjlink-class2" rel="nofollow ugc">https://www.npmjs.com/package/iobroker.pjlink-class2</a></td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>AI involvement:</strong> this adapter was developed with the help of an AI (Claude). I reviewed the code, tests and documentation, and it has been tested against real projectors and the official PJLink test tool (details below).</p>
</blockquote>
<p dir="auto">Hi all,</p>
<p dir="auto">I'd like to introduce my new adapter <strong>ioBroker.pjlink-class2</strong> for testing. It controls projectors and displays over <strong>PJLink Class 1 and Class 2</strong> and is meant as an alternative to the existing <code>pjlink</code> adapter. <strong>The PJLink protocol is implemented entirely within the adapter itself — it no longer depends on the old npm library</strong> that the <code>pjlink</code> adapter is built on.</p>
<h2>Why a new adapter?</h2>
<p dir="auto">The existing <code>pjlink</code> adapter is built on an npm library that supports only PJLink Class 1 and is barely maintained. In our installation it also occasionally crashed with an uncaught <code>ECONNRESET</code> when a projector dropped the connection during a power transition.</p>
<p dir="auto"><strong>pjlink-class2</strong> replaces that library with its own implementation and adds the PJLink Class 2 features.</p>
<h2>What it does</h2>
<ul>
<li><strong>Its own PJLink implementation:</strong> connection handling, authentication, every command, UDP search and status notifications are written directly in the adapter. There is no dependency on a PJLink library; the only runtime dependency is <code>@iobroker/adapter-core</code>.</li>
<li><strong>One instance drives any number of projectors</strong>, each in its own device folder (<code>pjlink-class2.0.&lt;name&gt;...</code>).</li>
<li><strong>Detects the PJLink class</strong> automatically (<code>CLSS ?</code>); Class 2 states are created only for Class 2 devices.</li>
<li><strong>Short TCP sessions:</strong> each poll or command connects, sends and disconnects, so the projector stays available to other control systems (e.g. Crestron, Extron).</li>
<li><strong>Authentication</strong> with MD5 (older devices) and SHA-256 (newer devices and the official test tool); the adapter works out which one a device expects.</li>
<li><strong>Class 2 over UDP 4352:</strong> status notifications (power, input, error status, link up) are applied immediately, and the <strong>search</strong> in the instance settings finds Class 2 projectors on the local network.</li>
<li><strong>Refused commands are visible:</strong> if the projector answers e.g. <code>ERR3</code> (not possible while warming up or cooling down), it shows in <code>info.lastError</code> instead of being silently ignored.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Feature</th>
<th>Class 1</th>
<th>Class 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Power, power status (off/on/cooling/warming)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Input selection (Class 2 also alphanumeric codes, e.g. <code>3A</code>)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Video and audio mute</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Error status (fan, lamp, temperature, cover, filter, other)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Lamp hours (multiple lamps)</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Name, manufacturer, model</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Freeze, speaker and microphone volume</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>Serial number, software version, input names</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>Input and recommended resolution, filter hours, replacement lamp/filter</td>
<td>–</td>
<td>✔</td>
</tr>
<tr>
<td>UDP status notifications, search</td>
<td>–</td>
<td>✔</td>
</tr>
</tbody>
</table>
<h2>Requirements</h2>
<ul>
<li><strong>Node.js 22</strong> or newer, <strong>js-controller 6.0.11</strong> or newer, <strong>Admin 7.6.20</strong> or newer</li>
<li>PJLink enabled on the projector (usually in its network settings), TCP port 4352 reachable from the ioBroker host</li>
<li>For Class 2 notifications and search: UDP port 4352 on the ioBroker host. <strong>Only one program per host</strong> can use it, which is why one instance handles all projectors.</li>
</ul>
<h2>Configuration</h2>
<ul>
<li><strong>Projectors:</strong> one row per device with name, IP address or host name, and port (default 4352). The name becomes the folder in the object tree.</li>
<li><strong>PJLink password:</strong> used for every projector that asks for one (stored encrypted).</li>
<li><strong>Poll intervals:</strong> status (default 5 s) and device information such as names, inputs and lamp hours (default 300 s).</li>
<li><strong>Search:</strong> broadcasts a Class 2 search and adds the projectors that reply to the table. Class 1 devices do not reply and must be added by hand; broadcasts do not cross routers.</li>
</ul>
<h2>Installation</h2>
<p dir="auto">The adapter is not in the latest repository yet. Install it via Admin → Adapters → <strong>"Custom install"</strong> (GitHub icon) → URL:<br />
<code>https://github.com/AlanSRU/ioBroker.pjlink-class2</code></p>
<p dir="auto">Then create an instance, add your projectors and save.</p>
<h2>Tested so far</h2>
<ul>
<li><strong>Class 1:</strong> three <strong>NEC NP3250</strong> in standby — every query (power, input, mute, error status, lamp, inputs, name, manufacturer, model). I deliberately did not send switching commands to these, as they are in production use.</li>
<li><strong>Class 2:</strong> the official JBMIA test tool <strong>PJLinkTEST4CNT</strong> — authentication (SHA-256), every query, every command, search and all four status notifications.</li>
<li>Automated tests against a projector simulator (Class 1 and 2, with and without a password), plus integration tests on Node.js 22, 24 and 26 on Linux, Windows and macOS.</li>
</ul>
<p dir="auto"><strong>Not tested yet:</strong> a real Class 2 projector, and a real device with a password set.</p>
<h2>Known issues / limitations</h2>
<ul>
<li><strong>States differ from the <code>pjlink</code> adapter</strong> (see migration below); scripts and visualisations need updating.</li>
<li><strong>One shared password</strong> for all projectors (no per-projector password yet).</li>
<li><strong>Status notifications</strong> go to one controller, and which one depends on the device. If a second control system (e.g. Crestron/Extron) is running, notifications may go there instead. Regular polling always runs, so the values stay current.</li>
<li><strong>NEC NP3250:</strong> a power-on sent shortly after cooling down is accepted but ignored by the projector. The adapter holds <code>control.power</code> at the requested value for up to 30 s, then reports in <code>info.lastError</code> that nothing changed.</li>
</ul>
<h2>Moving from the <code>pjlink</code> adapter</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th><code>pjlink.0.…</code></th>
<th><code>pjlink-class2.0.&lt;projector&gt;.…</code></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>power</code></td>
<td><code>control.power</code></td>
</tr>
<tr>
<td><code>powerStatus</code> (0/1/2/3)</td>
<td><code>status.power</code> (same values)</td>
</tr>
<tr>
<td><code>input</code> (number)</td>
<td><code>control.input</code> (<strong>string</strong>, e.g. <code>"31"</code>)</td>
</tr>
<tr>
<td><code>info.connection</code></td>
<td><code>info.connection</code> (per projector; the instance one means "at least one reachable")</td>
</tr>
</tbody>
</table>
<h2>How you can help</h2>
<ul>
<li><strong>Especially wanted:</strong> testers with <strong>real Class 2 projectors</strong> (Epson, Panasonic, Sony, NEC and others) and with <strong>projectors that have a PJLink password set</strong></li>
<li>Please include: <strong>manufacturer and model</strong>, PJLink class (<code>info.class</code>), whether a password is set</li>
<li>For problems: a <strong>log at level "debug"</strong> and a short description of what you expected</li>
<li>Issues are also welcome directly on GitHub: <a href="https://github.com/AlanSRU/ioBroker.pjlink-class2/issues" rel="nofollow ugc">https://github.com/AlanSRU/ioBroker.pjlink-class2/issues</a></li>
</ul>
<h2>Changelog 0.1.x</h2>
<ul>
<li><strong>0.1.2:</strong> data source declared as polling (Class 2 notifications only supplement it), supported messages declared the current way, deprecated API calls replaced</li>
<li><strong>0.1.1:</strong> the next poll is scheduled only when the previous one has finished, so a slow projector no longer causes overlapping polls; minimum versions in the README</li>
<li><strong>0.1.0:</strong> initial release</li>
</ul>
<p dir="auto">Thanks for testing!</p>
]]></description><link>https://forum.iobroker.net/topic/85435/test-adapter-pjlink-class2-v0.1.x-github</link><generator>RSS for Node</generator><lastBuildDate>Tue, 27 Oct 2026 23:48:46 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/85435.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Sep 2026 07:51:29 GMT</pubDate><ttl>60</ttl></channel></rss>