Skip to the content
2 layers160 × 60 mmCarrier, the printed circuit board in 3D

Replacement interface and CGI protocol analysis for the Kohler DTV+ shower system controller (K-99695-NA / K-99693-P-NA), plus an open investigation into mid-shower shutoffs.

Size
160 × 60 mm
Copper layers
2
Thickness
1.6 mm
Parts
52
Nets
59
Pads
196
Tracks, vias
526, 21
Pours
37
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
29 Aug 2026
Updated
1 Nov 2026

Overview

Carrier is an open-source printed circuit board by ntotten, from the ntotten/Kohler-DTV-Plus repository on GitHub. It is a 2-layer board of 160 × 60 mm with 52 parts on 59 nets, routed with 526 tracks and 21 vias.

It is built around the THVD1410DGK, WIZ850IO and K104K15X7RF5TL2, with the CFR-25JB-52-120R, CFR-25JB-52-4K7 and M2.5 among its other parts. Its parts include 16 resistors, 8 connectors, 5 capacitors and 5 ICs. It belongs with the RP2040 boards of this library.

Main components

7

README

controller/hardware/README.md

controller/hardware — the carrier: schematic, board and cabling

Revision B's carrier: a two-layer PCB that holds the Pico 2, the WIZ850io and the five THVD1410 ports, and the cables between it, the K-99695, the valves and the panel. What they draw is specified in HARDWARE.md; where the two disagree, HARDWARE.md is right and the drawings are regenerated.

Carrier PCB, top

Every file here is generated. The scripts in tools/ are the source of the schematic and of the board, and nobody edits either in KiCad: change a table at the top of a script and run tools/render.sh, which regenerates everything and checks it.

FileWhat it is
carrier.svgThe schematic, rendered by KiCad
fab/What to order and how to build it: Gerber and drill zip, BOM, pick-and-place, drawings
cabling.svgEvery cable between the carrier, the K-99695, the valves and the panel
cabling-wires.csvThe same, one row per conductor, with the pin and signal at each end
carrier.kicad_sch, carrier.kicad_symThe schematic and the project's own symbols: Pico 2, the WIZ850io's two rows, THVD1410
carrier.kicad_pcbThe board
carrier.kicad_pro, carrier.kicad_druThe project: design rules, net classes and one custom DRC rule
carrier.pretty/The project's own footprints: the Pico 2 and the WIZ850io in their sockets, and the Würth valve jack
carrier.sesFreerouting's routing, kept so the board rebuilds without routing again
sym-lib-tablePoints KiCad at carrier.kicad_sym
cabling.wireviz.ymlThe cabling's source, for WireViz 0.4
tools/carrier_schematic.pyWrites the schematic from its tables: GPIO map, jack pins, ports, parts and part numbers
tools/check_netlist.pyChecks the netlist KiCad reads back against those tables
tools/carrier_footprints.pyWrites carrier.pretty from the Pico 2 datasheet, WIZnet's dimension drawing and Würth's jack data sheet
tools/carrier_board.pyPlaces, routes (replaying carrier.ses), pours ground and runs DRC, which must find nothing
tools/carrier_fab.pyWrites fab/
tools/wire_list.pyWrites cabling-wires.csv and checks the cabling against the board's nets
tools/render.shRuns all of it in order, and checks every Mermaid diagram in the repository
bash
pip install wireviz==0.4.1           # needs Graphviz: brew install graphviz
controller/hardware/tools/render.sh  # KiCad 7; --check fails if anything committed is stale

render.sh needs kicad-cli and a Python that can import KiCad's pcbnew (KICAD_CLI and KICAD_PYTHON override where it looks; on a Mac it finds both inside KiCad.app). The committed files were made with KiCad 7.0.11, and rerunning it with that version reproduces every one byte for byte; another version makes the same board in different bytes.

Routing is the one step that isn't repeatable: Freerouting finds a different route each run. So carrier.ses holds its result and every run replays it. After a change to the placement or the netlist, route again with render.sh --reroute, which needs Freerouting 2.4.1 (FREEROUTING_JAR) and Java 25 (JAVA), and commit the new carrier.ses with the board.

docs/diagrams.md is the convention for every drawing in this repository.

Parts

52
QtyValueFootprintReferences
6TBDResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR5, R6, R11, R12, R15, R16
5100nCapacitor_THT:C_Rect_L4.0mm_W2.5mm_P2.50mmC1, C2, C3, C4, C5
5120Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR2, R4, R8, R10, R14
54k7Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR1, R3, R7, R9, R13
5THVD1410Package_SO:VSSOP-8_3.0x3.0mm_P0.65mmU1, U2, U3, U4, U5
46P6Ccarrier:RJ12_Wurth_615006138421_HorizontalJ1, J2, J3, J4
4M2.5MountingHole:MountingHole_2.7mm_M2.5H1, H2, H3, H4
18P8CConnector_RJ:RJ45_Amphenol_54602-x08_HorizontalJ5
1DC- to GND, here onlyNetTie:NetTie-2_SMD_Pad0.5mmNT1
1K1-2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP1
1K1-3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP2
1K1-4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP3
1K2-2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP7
1K2-3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP8
1K2-4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP9
1Panel DC in, 2.1 mmConnector_Wire:SolderWire-0.5sqmm_1x02_P4.8mm_D0.9mm_OD2.3mmJ6
1Raspberry Pi Pico 2carrier:Pico2_SocketedA1
1V1-2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP4
1V1-3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP5
1V1-4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP6
1V2-2Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP10
1V2-3Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP11
1V2-4Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP12
1WIZ850io J1 (SPI)carrier:WIZ850io_J1J10
1WIZ850io J2 (power, reset)carrier:WIZ850io_J2J11

Similar boards

  • 2 layers68.6 × 53.3 mmMie1001 daq simple, the printed circuit board in 3D

    Mie1001 daq simple

    Chaospossum/mie1001-daq

    MIE1001 Team 5: DAQ firmware and Arduino shield designs (preamp, ADS1115, MCP4725)

    35 parts
  • 4 layers273 × 178 mmPico thing, the printed circuit board in 3D

    Pico thing

    markrvmurray/pico-thing

    An 8-bit MC6809E / HD6309E single-board computer with a pair of Raspberry Pi Pico 2 (RP2350 / Pimoroni PGA2350) modules acting as intelligent bus peripherals, a 1–2 MB banked-RAM DAT/MMU, a 40-pin PATA hard-disk…

    206 parts1BSD-2-Clause
  • 2 layers80 × 70 mmJli2555-tin can, the printed circuit board in 3D

    Jli2555-tin can

    anauseam/JLI-2555-tin-can-mic

    JLI-2555 Microphone preamplifier

    26 partsCERN-OHL-P-2.0
  • 2 layers138.6 × 120 mmHexiLux v1, the printed circuit board in 3D

    HexiLux v1

    ZeusyBoy98/HexiLux

    A custom open-source smart lighting solution, using tiling hexagonal panels. Featuring music sync and home assistant compatibility.

    38 partsAGPL-3.0
  • 2 layers69 × 43 mmDiagral uart esp32, the printed circuit board in 3D

    Diagral uart esp32

    nicolas5000/diagral-esp32

    This project permits to connect Home Assitant to your Diagral alarm system DIAG91AGFK (using the 20 pins connector on the back)

    12 parts6Apache-2.0
  • 2 layers90.3 × 72.8 mmRio tangbob, the printed circuit board in 3D

    Rio tangbob

    multigcs/rio-tangbob

    71 parts4
  • 2 layers50.4 × 50.4 mmBluepill ethernet, the printed circuit board in 3D

    Bluepill ethernet

    kellerkindt/bluepill_sensor

    Bluepill stm31f103 ethernet sensor extension board with SW written in Rust

    47 parts3Apache-2.0
  • 4 layers331.4 × 259.8 mmOvenMonESP32, the printed circuit board in 3D

    OvenMonESP32

    ThiSel18/OvenMonESP32CircuitBoard

    KiCad Project for Oven Monitoring

    6 parts1

Questions

How big is the Carrier PCB?

It measures 160 × 60 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Carrier use?

52 parts, built around the THVD1410DGK, WIZ850IO, K104K15X7RF5TL2 and CFR-25JB-52-120R. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Carrier KiCad files?

From the ntotten/Kohler-DTV-Plus repository on GitHub, at the commit this page was made from: the board is controller/hardware/carrier.kicad_pcb and its schematic controller/hardware/carrier.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Carrier design in my own project?

Its repository states no licence, so its author keeps all rights: ask ntotten before reusing the design.