This app implements a rotary dial tester as a web app using navigator.serial (Web Serial API) and modern ESM (*.mjs) modules.
Live version: https://rotary-dial-tester.com/
The hosted build mirrors this repository and is the quickest way to try the tester without local setup. WebSerial requires a Chromium-based browser and will only allow connections on secure origins or http://localhost.
Inspiration: This project is inspired by the "NummernschalterPrüfer" app by Klaus Pfeiffer. The goal is to bring a similar rotary dial testing workflow to a modern, browser-based interface.
- Chromium browser (Chrome / Edge) with WebSerial
- The page must be served over
https://orhttp://localhost - A serial adapter that exposes modem status lines (DCD/DSR/RI) and is wired correctly
This app exposes its functionality through WebMCP (navigator.modelContext) in two ways:
- Imperative tools via JavaScript registration
- Declarative tools via hidden annotated forms
The app prefers the native Chrome implementation and also ships a local fallback polyfill at:
src/vendor/webmcp-global.iife.js
- Chrome version
146.0.7672.0or newer - Enable:
chrome://flags/#enable-webmcp-testing - Relaunch Chrome
If native WebMCP is unavailable, the fallback script initializes navigator.modelContext automatically.
Imperative tool names:
rotary_connectrotary_disconnectrotary_start_testrotary_stop_testrotary_set_debouncerotary_set_dtmfrotary_add_ideal_diagramsrotary_clear_diagramsrotary_show_analysisrotary_export_striprotary_download_diagramrotary_set_localerotary_open_helprotary_close_helprotary_get_staterotary_get_cyclesrotary_get_analysis
Declarative equivalents use the rotary_form_* prefix.
rotary_connect first tries previously granted ports (navigator.serial.getPorts()), then falls back to the browser chooser.
On first-time permission flows, the browser may still require one manual user interaction before agent calls can open the chooser.
For W48/W49 dials, use the dedicated adapter: https://github.com/SunboX/Rotary-Dial-Tester-Adapter It provides the correct wiring and connector mapping for these phones and matches the signal lines expected by the tester.
From the project folder:
npm install
npm startThen open: http://localhost:8080/
- nsi = DCD (dataCarrierDetect)
- nsr = DSR (dataSetReady)
- nsa = RI (ringIndicator)
- RTS is set to 1 on connect
- Connect COM
- Start Test
- Dial digits 2-0 (1 is not a full period for frequency measurement)
- Diagrams appear on the right (max. 10, rolling)
EP adds an extra wait time between two DCD reads. EP1 is the default. Higher values can compensate bounce but distort the measurement.
When 10 measurements in a row with the same digit are captured, two analyses are enabled:
- Runtime (10x): spread of runs (points/min/max)
- Pulse/Pause (10x): table with min/max/delta per period (without the first pulse off phase)
Note: The WebSerial API does not allow automatic COM port detection, so the port must be selected in the browser dialog.
This project is available under two licensing options:
GNU General Public License v3.0 or later (GPL-3.0-or-later).
You may use, modify, and distribute this project under the GPL. If you distribute modified versions or larger works based on this project, they must comply with the GPL, including source-code availability requirements.
Documentation, images, and other non-code media are licensed under Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA-4.0) unless otherwise marked. Bundled third-party files keep their own license notices, including the Manrope font under OFL-1.1, the WebMCP fallback bundle under MIT, and the Google Web Serial codelab-derived file under Apache-2.0 plus project modifications under GPL-3.0-or-later.
For use in closed-source, proprietary, or otherwise GPL-incompatible products, a separate commercial license is required.
Commercial licensing contact: mail@andrefiedler.de
Copyright (C) 2026 André Fiedler.
Copyright, license, attribution, and source-origin notices must be preserved as required by the GPL and the notice files in this repository. See NOTICE.md and COMMERCIAL-LICENSE.md for details.
