diff --git a/.gitattributes b/.gitattributes index dfe0770..9f85b43 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,5 @@ # Auto detect text files and perform LF normalization * text=auto + +# Generated BOM rows retain a final tab for an empty Designators TSV field. +docs/wiring/out/*.bom.tsv -whitespace diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 0000000..00f9f3a --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,42 @@ +name: Validate + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + local-contracts: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Check out repository + uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 + with: + python-version: "3.12" + + - name: Run repository contracts + run: python3 -m unittest discover -s tests -v + + - name: Run wiring contracts + run: python3 -m unittest discover -s docs/wiring -p 'test_*.py' -v + + - name: Compile Python sources + run: python3 -m compileall -q src scripts tests docs/wiring + + - name: Verify default service rendering + run: | + python3 scripts/render_kiosk_service.py > /tmp/matrix-led.service + cmp kiosk/matrix-led.service /tmp/matrix-led.service + + - name: Check shell syntax + run: | + bash -n kiosk/matrix-led-start.sh + bash -n scripts/bootstrap.sh diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..939cd93 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,59 @@ +# Conway Pointcloud Garden agent guide + +This repository is the Artwork Score and conservation package for a live media +art installation. Start by reading `PROJECT.md`, then `CONTEXT.md`. Read +relevant decisions in `docs/adr/` before changing hardware identity, +installation behavior, or preservation boundaries. + +## Boundaries + +- Preserve artwork media, generated wiring artifacts, firmware packages, and + prior installation evidence. Reclassify uncertain material; do not delete it. +- Do not infer current hardware from filenames, repository recency, or an + unreachable machine. +- Do not run live tests, switch the relay, restart services, deploy files, or + alter Point2 unless the task explicitly requires live hardware work. +- Keep credentials and private network material out of committed fixtures. +- Treat `screen_config/` as Historical Receiver Firmware, not an installation + source. +- Tests must use local fixtures by default. Point2 checks are opt-in and must + distinguish host unavailability from assertion failures. + +## Commands + +```bash +python3 -m unittest discover -s tests -v +python3 -m unittest discover -s docs/wiring -p 'test_*.py' -v +python3 -m compileall -q src tests docs/wiring +``` + +Run live Point2 contracts only when the machine is intentionally in scope and +reachable: + +```bash +CONWAY_RUN_LIVE_TESTS=1 CONWAY_TEST_TARGET=reid@point2 \ + python3 -m unittest tests.test_point2_installation -v +``` + +Before editing a function, class, or method, use the repository's GitNexus +index to inspect upstream impact. Run GitNexus change detection before every +commit that changes source symbols. + +## Agent skills + +### Issue tracker + +Issues and PRDs live in GitHub Issues for +`ReidSurmeier/conway-garden-controller`. See +`docs/agents/issue-tracker.md`. + +### Triage labels + +Use the standard `needs-triage`, `needs-info`, `ready-for-agent`, +`ready-for-human`, and `wontfix` labels. See +`docs/agents/triage-labels.md`. + +### Domain docs + +This is a single-context repository with terms in `CONTEXT.md` and decisions +in `docs/adr/`. See `docs/agents/domain.md`. diff --git a/CONSERVATION.md b/CONSERVATION.md index 5887876..a772ac5 100644 --- a/CONSERVATION.md +++ b/CONSERVATION.md @@ -55,6 +55,9 @@ Verified on 2026-05-15: profile. - Adafruit AHT20 enclosure temperature/humidity sensor was detected on I2C bus 1 at address `0x38` and added to the health snapshot when present. +- The current wiring packet includes three Easycargo 30 mm enclosure fans. + They are powered from protected 5 V fan branches and controlled from the Pi + GPIO fan-control path using the AHT20 enclosure reading. ## 3. Normal Operation @@ -92,12 +95,15 @@ The full BoM is in `HARDWARE_BOM.md`. Core components: | MicroSD card | System disk | Replaceable from gold image | | Geekworm X1201 | UPS and power-loss signal | Replaceable only if new UPS exposes equivalent GPIO behavior | | Samsung 30Q cells | UPS batteries | Replaceable with compatible protected/approved cells per X1201 requirements | -| MEAN WELL LRS-150F | Display PSU | Replaceable with equivalent 5 V supply with sufficient current and physical fit | -| LCLCTC DIN rail SSR | Switches display PSU/load path | Replaceable with equivalent rated relay/SSR | +| MEAN WELL LRS-50-5 | Controller PSU | Replaceable with equivalent always-on 5 V supply with sufficient current and physical fit | +| MEAN WELL LRS-150F-5 | LED-panel PSU | Replaceable with equivalent 5 V supply with sufficient current and physical fit | +| LCLCTC DIN rail SSR | Switches LED-panel PSU line input | Replaceable with equivalent rated relay/SSR | | APIELE push buttons | START/STOP inputs | Replaceable with normally-open momentary switches | +| Adafruit AHT20 | Enclosure temperature/humidity sensor | Replaceable with compatible I2C enclosure sensor if software and wiring are updated | +| Three Easycargo 30 mm fans | Enclosure cooling | Replace with equivalent 5 V fans after checking current draw, airflow, and control wiring | | NovaStar MSD300-1 | Sender card | Replaceable with compatible sender; requires remapping/reverification | -| NovaStar MRV412 | Receiver card | Replaceable with compatible receiver; requires config backup/reload | -| LED panels | Display surface | Replace modules/panels only after isolating cable/power/mapping faults | +| NovaStar NV3210 | Receiver card | Replaceable with compatible receiver; requires config backup/reload | +| Six LED matrix panels | Display surface | Replace modules/panels only after isolating cable/power/mapping faults | ## 6. Wiring @@ -113,6 +119,7 @@ GPIO numbers are BCM numbers. | AHT20 GND | - | 6 | Ground | | AHT20 SDA | 2 | 3 | I2C data, address `0x38` | | AHT20 SCL | 3 | 5 | I2C clock | +| Fan enable/control | See wiring packet | See wiring packet | Pi GPIO fan-control harness; fan motor power comes from fused 5 V | The controller config is `/etc/matrix-controller/controller.yaml`; the repo snapshot is `config/controller.yaml`. @@ -120,7 +127,8 @@ snapshot is `config/controller.yaml`. ## 7. Enclosure Temperature Sensor An Adafruit AHT20 is wired to the Pi I2C bus and is used for enclosure -temperature/humidity monitoring. +temperature/humidity monitoring. The enclosure temperature reading is the +software input for turning the three enclosure fans on and off. | Signal | Pi header pin | Notes | |---|---:|---| @@ -137,6 +145,8 @@ Runtime requirements: `enclosure_humidity=%RH` when the sensor is present. - The sensor is optional for boot: if it is unplugged, the health check should continue without failing the whole artwork. +- The fan wiring remains protected 5 V for motor power; the Pi GPIO path is + only the control path. Short active-display test on 2026-05-15: @@ -245,10 +255,12 @@ changing the web app. | Each install | Verify START and STOP buttons | | Each install | Verify `sudo pinctrl get 6` is HIGH on wall power | | Each install | Confirm the AHT20 health log includes enclosure temp/humidity | +| Each install | Confirm all three enclosure fans turn on from the temperature-control path | | Each install | Unplug wall power once and confirm safe shutdown if commissioning | | Monthly | Inspect cables, ribbons, fuses, relay terminals, and panel seating | | Monthly | Read `journalctl -t conway-health --since "30 days ago"` | | Monthly | Review enclosure temperature trend from `conway-health` | +| Monthly | Check that all three enclosure fans spin freely and are clear of dust | | Monthly | Confirm `systemctl --failed` returns zero units | | Monthly | Confirm `/etc/apt/apt.conf.d/20auto-upgrades` still disables apt periodic work | | On change | Commit code/config, update docs, and make a gold image | diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..e469307 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,17 @@ +# Conway Pointcloud Garden domain + +## Glossary + +| Term | Meaning | +| --- | --- | +| Artwork Score | The versioned software, media, operating instructions, wiring knowledge, and preservation evidence needed to perform Conway Pointcloud Garden. | +| Original Installation | The Raspberry Pi installation verified as `conway-garden-1` in May 2026. It is historical evidence, not the current machine identity. | +| Point2 Replacement Installation | The Raspberry Pi 5 replacement installed and verified through Tailscale as `Point2` on 2026-07-21. | +| Controller PSU | The always-on MEAN WELL LRS-50-5 5 V supply for the controller side of the artwork. | +| LED-panel PSU | The relay-switched MEAN WELL LRS-150F-5 5 V supply for the six LED matrix panels. | +| START button | The dedicated front-panel input that starts display behavior. | +| STOP button | The dedicated front-panel input that stops display behavior without cutting controller power. | +| Display power relay | The controller-owned switch for the LED-panel PSU path. | +| Display chain | Raspberry Pi micro HDMI to DVI, NovaStar MSD300-1 sender, Ethernet cable, NovaStar NV3210 receiver, ribbon cables, and six LED matrix panels. | +| Historical Receiver Firmware | Preserved MRV412 configuration and firmware material whose presence records prior service research but does not identify the installed receiver. | +| Live Installation Evidence | Time-stamped observations, checksums, service state, and display tests captured from a reachable installation. | diff --git a/DISPLAY_MAPPING.md b/DISPLAY_MAPPING.md index 363ea56..33b04f2 100644 --- a/DISPLAY_MAPPING.md +++ b/DISPLAY_MAPPING.md @@ -1,8 +1,14 @@ # Display Mapping -**Current verified state:** 2026-05-15 -**Display chain:** Raspberry Pi 5 -> HDMI -> NovaStar MSD300-1 sender -> -NovaStar MRV412 receiver -> LED panels +**Current verified app-side state:** 2026-05-15 + +**Current hardware correction:** 2026-07-08 +**Display chain:** Raspberry Pi 5 -> micro HDMI/DVI -> NovaStar MSD300-1 +sender -> NovaStar NV3210 receiver -> six LED matrix panels + +The app-side mapping evidence below is from the 2026-05-15 live verification. +The receiver-card name and panel count were corrected in the 2026-07-08 wiring +packet. ## Current Working App Mapping diff --git a/HARDWARE_BOM.md b/HARDWARE_BOM.md index fee5e45..30e53a8 100644 --- a/HARDWARE_BOM.md +++ b/HARDWARE_BOM.md @@ -1,8 +1,10 @@ # Hardware BoM -**Current source status:** verified against the 2026-05-15 live system and the -V4 supply spreadsheet. Spreadsheet notes are historical where they conflict -with verified Pi behavior. +**Current source status:** verified against the 2026-05-15 live system, the V4 +supply spreadsheet, and the 2026-07-08 wiring correction for the NV3210 +receiver, two 5 V PSUs, six LED matrix panels, AHT20 enclosure sensor, and +three enclosure fans. Spreadsheet notes are historical where they conflict +with verified Pi behavior or the updated wiring packet. Spreadsheet source: https://docs.google.com/spreadsheets/d/1t827FBauN-OOxP_h4DBD_ax0KM9MAw7U8CcPHHLapTA/edit?usp=sharing @@ -18,25 +20,28 @@ https://docs.google.com/spreadsheets/d/1t827FBauN-OOxP_h4DBD_ax0KM9MAw7U8CcPHHLa | GPIO screw terminal block breakout | 1 | Stable wiring to Pi header | Replaceable with equivalent Pi 5 header breakout. | | APIELE momentary push button | 2 in final system | START and STOP inputs | Any normally-open momentary switch can replace. | | LCLCTC DIN rail solid-state relay | 1 | Switches display power/load path | Replace with equivalent SSR/relay rated for the load. Update `relay.active_high` if needed. | -| MEAN WELL LRS-150F | 1 | Display/LED power supply | Replace with equivalent 5 V supply with adequate current and physical fit. | -| Blue Sea Systems 5025 ST blade fuse block | 1 | Fused distribution | Replaceable with equivalent fuse block. | +| MEAN WELL LRS-50-5 | 1 | Always-on 5 V controller power supply | Feeds the fuse block for X1201/Pi, MSD300-1, NV3210, and the three fans. Replace with equivalent 5 V supply with adequate current and physical fit. | +| MEAN WELL LRS-150F-5 | 1 | Relay-switched 5 V LED-panel power supply | Feeds the six LED matrix panels. Replace with equivalent 5 V supply with adequate current and physical fit. | +| Blue Sea Systems 5025 ST blade fuse block | 1 | Fused distribution for controller/display electronics | Protects X1201/Pi, MSD300-1, NV3210, and the three fans. It does not feed the LED panels. | | ATC-3 ATC blade fuse | As needed | Branch fuse | Replace with the same rating unless wiring/load is redesigned. | | UL489 circuit breaker | 1 | Input/load protection | Replace with same rating/type unless power design is reviewed. | +| Ground terminal block | 1 | Case-bonded protective earth distribution | Incoming ground connects here, then bonds ground to both power supplies. | +| Adafruit AHT20 | 1 | Enclosure temperature/humidity sensor on Pi I2C | Feeds enclosure-temperature data to the software path that controls the fans and logs health. | +| Easycargo 30 mm fan | 3 | Enclosure cooling fans | Motor power comes from protected 5 V fan branches; on/off control is documented through the Pi GPIO fan-control harness. | | 22 AWG stranded wire | As needed | Low-voltage wiring | Match current capacity, insulation, and routing. | | Lever nuts / terminal blocks | As needed | Serviceable splices and distribution | Replace with equivalent rated connectors. | | XHF adhesive cable tie mounts | As needed | Strain relief/cable management | Replaceable. | | Crimping tool kit | 1 | Build/service tool | Not part of artwork runtime. | -| Noctua NF-A4x10 | 2 | Quiet cooling option | Replace with equivalent 40 mm fan if cooling is needed. Verify airflow and noise. | ## Display Chain | Component | Qty | Function | Replaceability / notes | |---|---:|---|---| | NovaStar MSD300-1 sender card | 1 | Receives HDMI/DVI source and sends data to LED receiver chain | Replaceable with compatible NovaStar sender, but mapping must be reverified. Export config if possible. | -| NovaStar MRV412 receiver card | 1+ | Drives LED modules/panels | Replaceable with compatible receiver card only with saved config or remapping. | -| LED panels/modules | As installed | Display surface | Replace panel/module after isolating ribbon cable, power, receiver output, and sender mapping. | -| Ribbon/data cables | As installed | Panel data path | Keep spares. Many color/stripe faults are cable/connector issues. | -| Panel power leads | As installed | Panel power path | Keep spares. Check voltage drop and terminal tightness. | +| NovaStar NV3210 receiver card | 1 | Receives Ethernet data from the MSD300-1 and drives the LED matrix panel ribbon outputs | Replaceable with compatible receiver card only with saved config or remapping. | +| LED matrix panels | 6 | Display surface | Replace panel/module after isolating ribbon cable, power, receiver output, and sender mapping. | +| Ribbon/data cables | 6 | NV3210-to-panel data path | Keep spares. Many color/stripe faults are cable/connector issues. | +| Panel power leads | 6 | LED PSU to panel 5 V power path | Keep spares. Check voltage drop and terminal tightness. | ## Verified GPIO/Wiring @@ -46,6 +51,9 @@ https://docs.google.com/spreadsheets/d/1t827FBauN-OOxP_h4DBD_ax0KM9MAw7U8CcPHHLa | STOP button | 19 | 35 | Press pulls LOW to GND | | Relay/SSR control | 20 | 38 | Active high | | X1201 PLD | 6 | 31 | HIGH = wall power OK, LOW = wall power lost | +| AHT20 SDA | 2 | 3 | I2C data, address `0x38` | +| AHT20 SCL | 3 | 5 | I2C clock | +| Fan enable/control | See wiring packet | See wiring packet | Pi GPIO fan-control harness commands the three fans; motor power comes from fused 5 V. | ## Superseded Spreadsheet Notes diff --git a/PROJECT.md b/PROJECT.md new file mode 100644 index 0000000..f44055d --- /dev/null +++ b/PROJECT.md @@ -0,0 +1,86 @@ +# Conway Pointcloud Garden status + +## Goal + +Keep Conway Pointcloud Garden performable as a media artwork by preserving its +Artwork Score, hardware relationships, installation evidence, and recovery +path without confusing historical artifacts with the current installation. + +## Current objective + +Reconcile the public GitHub repository, the preserved dirty home checkout, the +Point2 Replacement Installation, and the current documentation standard in a +clean Orca worktree. Preserve the resolved NV3210 Display Chain, retain MRV412 +firmware as history, and make local validation independent of live hardware. + +## Confirmed working + +- GitHub `main` is available at commit `173934c` with the complete prior + Artwork Score and the later MRV412 firmware package. +- The Original Installation was audited as `conway-garden-1` in May 2026. +- On 2026-07-21, the Point2 Replacement Installation passed five live + integration checks: Conway document and canvas, the 312 by 416 mapping + rotated into a 416 by 312 region, nontrivial framebuffer output, durable + service/runtime identity, and controller safe-idle/GPIO ownership. +- The Point2 keyring interruption was reproduced and repaired by launching + kiosk Chromium with `--password-store=basic`. +- The kiosk launcher now selects either `chromium-browser` or `chromium`, and + the bootstrap can render explicit Original or Point2 account profiles while + preserving the Original Installation defaults. +- The preserved home checkout contains the July wiring packet, its generated + artifacts, domain and agent documentation, and the Point2 integration tests. +- GitHub has no Pages site or deployment record for this repository. +- A fresh 2026-07-31 Droplet snapshot contains no Conway, Point2, or Matrix + Controller runtime. + +## Failed approaches + +- The original Bookworm installation procedure assumed the `pi` user and + could not be applied unchanged to Point2's Debian 13 `reid` environment. +- A healthy systemd service and HTTP listener did not prove that Chromium had + reached the artwork; a first-run keyring dialog left the browser blank. +- Treating the newest repository artifact as the current receiver identity + would contradict the user's resolved NV3210 hardware correction. +- Live integration tests cannot distinguish a product failure from an offline + Point2 host when they run unconditionally. + +## Decisions + +- The Display Chain uses the NV3210 identity. See + `docs/adr/0001-preserve-receiver-firmware-as-history.md`. +- `screen_config/` is Historical Receiver Firmware and is not an installation + input. +- The clean Canonical Checkout is `/home/reidsurmeier/src/conway-garden-controller`. + The dirty home checkout remains untouched until its intended changes are + reviewed and merged through the clean worktree. +- Point2 is an external hardware deployment, not a Droplet or GitHub Pages + deployment. +- Local validation must be hermetic. Tests that inspect Point2 are explicit + live checks and must report offline state separately from source failures. +- Do not change relay, service, or deployed files while Point2 is offline. + +## Blockers + +- Point2 is offline on 2026-07-31 and was last seen by Tailscale on + 2026-07-22. Current services, framebuffer, relay, power, and physical display + state are unverified. +- The July home-checkout package must be reviewed and transferred without + losing the later GitHub `screen_config/` commit. +- The new Point2 installation profile has only local rendering evidence; it + has not been applied to or live-verified on the offline host. +- A gold SD-card image and tested backup/restore record are not verified. +- Physical receiver labeling, NovaStar export custody, electrical inspection, + and publication rights for artwork media require human evidence. + +## Next action + +Validate the complete repository locally, review firmware and media custody, +and record all hardware-only follow-ups as GitHub issues. When Point2 returns +online, rerun the five live contracts before changing its deployment. + +## Last verified + +2026-07-31 from the authenticated GitHub API, a clean `origin/main` clone, +the preserved dirty home checkout, recovered July 8 and July 21 session +evidence, the current Tailscale peer record, and a fresh Droplet snapshot. +Point2 was offline, so no current runtime or physical-state claim is made. diff --git a/README.md b/README.md index 09dc9a0..6be23b6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,12 @@ # Conway Pointcloud Garden (version 1) -Artist: Clement Valla. Engineer: Reid Surmeier. Current verified state: -2026-05-15. Host name: `conway-garden-1`. +Artist: Clement Valla. Engineer: Reid Surmeier. + +The Original Installation (`conway-garden-1`) was audited on 2026-05-15. +The Point2 Replacement Installation was last live-verified on 2026-07-21. +Point2 is currently offline, so its present service, relay, framebuffer, and +physical display state are not verified. See [PROJECT.md](PROJECT.md) for the +resumable status, evidence boundary, blockers, and next action. This repository is the working Read Me for Conway Pointcloud Garden. It holds the software, media assets, hardware record, setup procedure, maintenance notes, @@ -19,9 +24,16 @@ Reference: https://github.com/mccoyspace/Best-practices-for-conservation-of-medi ## Current State -The live system was audited on 2026-05-15. START powers the display side and -starts `matrix-led.service`. STOP turns the display side off and stops the -kiosk service. STOP does not halt the Pi. +The Original Installation established the intended operating contract. START +powers the display side and starts `matrix-led.service`. STOP turns the display +side off and stops the kiosk service. STOP does not halt the Pi. + +The Point2 Replacement Installation reproduced the Conway canvas, NovaStar +mapping, framebuffer output, service identity, and GPIO-safe-idle behavior on +2026-07-21. Those results are historical Live Installation Evidence, not a +claim that the offline machine is working today. The preserved tests in +`tests/test_point2_installation.py` only contact hardware when +`CONWAY_RUN_LIVE_TESTS=1` is set explicitly. The Geekworm X1201 UPS is wired into the controller through its PLD signal on BCM GPIO 6. With wall power present, GPIO 6 is HIGH. When wall power is lost, @@ -79,10 +91,12 @@ journalctl -u matrix-controller -n 100 --no-pager journalctl -u matrix-led -n 100 --no-pager ``` -## Installed Paths +## Original Installation Paths -The live Pi uses stable paths so the installation can be serviced without -guessing where the active files are. +The Original Installation uses stable paths so it can be serviced without +guessing where the active files are. Point2 uses the `reid` account and adapted +paths documented in `tests/test_point2_installation.py`; do not apply this +`pi`-account table to Point2 unchanged. | Live path | Source in this repository | |---|---| @@ -100,16 +114,21 @@ The BoM is not just a shopping list. It records the function of each part and whether a future replacement must be exact or only functionally equivalent. The core runtime hardware is a Raspberry Pi 5, Geekworm X1201 UPS HAT with -Samsung 30Q cells, MEAN WELL LRS-150F display PSU, LCLCTC DIN rail solid state -relay, APIELE momentary buttons, a GPIO terminal breakout, a Blue Sea fuse -block, a NovaStar MSD300-1 sender, a NovaStar MRV412 receiver, and the LED -panel chain. +Samsung 30Q cells, an always-on MEAN WELL LRS-50-5 controller PSU, a +relay-switched MEAN WELL LRS-150F-5 LED-panel PSU, LCLCTC DIN rail solid state +relay, APIELE momentary START and STOP buttons, a GPIO terminal breakout, a +Blue Sea fuse block, a NovaStar MSD300-1 sender, a NovaStar NV3210 receiver, +an Adafruit AHT20 enclosure sensor, three Easycargo 30 mm enclosure fans, and +six LED matrix panels. The Pi, fuse block, buttons, wiring hardware, and power supply can be replaced with equivalent parts if their electrical role is preserved. The NovaStar sender, receiver, and LED mapping are more sensitive. Replacing them requires exporting or rebuilding the mapping and then updating [DISPLAY_MAPPING.md](DISPLAY_MAPPING.md). +The current client wiring packet and generated PDF are in +[docs/wiring](docs/wiring/). + See [HARDWARE_BOM.md](HARDWARE_BOM.md) for the full supply list and the superseded notes from the earlier spreadsheet. @@ -162,10 +181,12 @@ enclosure_temp=20.9C, enclosure_humidity=45.2%RH ``` The AHT20 should be treated as a software safety input, not the only safety -device. A future automatic protection pass should warn at sustained enclosure -temperatures around `40C`, stop the display side around `45C`, require cooldown -below about `38C` before restart, and still use a physical thermal cutoff for -true hardware safety. +device. The wiring packet shows three enclosure fans powered from the protected +5 V fuse-box branch and controlled from the Pi GPIO path using the AHT20 +enclosure reading. A future automatic protection pass should warn at sustained +enclosure temperatures around `40C`, stop the display side around `45C`, +require cooldown below about `38C` before restart, and still use a physical +thermal cutoff for true hardware safety. Current UPS configuration: @@ -207,6 +228,18 @@ cd conway-garden-controller sudo bash scripts/bootstrap.sh ``` +Those defaults restore the Original Installation. To render the known Point2 +account and hostname profile on a prepared replacement host, use: + +```bash +sudo CONWAY_USER=reid CONWAY_HOSTNAME=point2 bash scripts/bootstrap.sh +``` + +The bootstrap derives the user's primary group and home directory unless +`CONWAY_GROUP` or `CONWAY_HOME` is supplied explicitly. This command changes a +real host; it is documentation, not evidence that the currently offline Point2 +machine has received this repository revision. + After install: ```bash @@ -285,14 +318,14 @@ If using the current service key from Reid's Mac: ssh -i ~/.ssh/linux_desktop pi@10.55.0.2 ``` -To force password login only: +If a password-login recovery path is explicitly authorized, request the +current credential through the approved password manager. Do not record it in +this repository. The connection form is: ```bash ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no pi@10.55.0.2 ``` -(password for ssh is 123) - ### Push An Update From The Mac For normal field service, the Mac should supply the release files. The Pi does diff --git a/docs/adr/0001-preserve-receiver-firmware-as-history.md b/docs/adr/0001-preserve-receiver-firmware-as-history.md new file mode 100644 index 0000000..e750743 --- /dev/null +++ b/docs/adr/0001-preserve-receiver-firmware-as-history.md @@ -0,0 +1,38 @@ +# ADR 0001: Preserve receiver firmware as historical evidence + +- Status: Accepted +- Date: 2026-07-31 + +## Context + +The repository's `screen_config/` directory contains a NovaStar MRV412 +firmware and configuration package added on 2026-07-21. That package does not +carry installation evidence tying it to the current artwork hardware. + +The current hardware identity was resolved separately. On 2026-07-08, the +receiver was explicitly corrected to a NovaStar NV3210 and the client wiring +packet was rebuilt around that correction. On 2026-07-21, the Point2 +Replacement Installation rendered the documented 312 by 416 canvas through +the preserved NovaStar mapping. Nothing in that live test reclassified the +receiver as an MRV412. + +Deleting the firmware would discard provenance. Calling it current would +contradict the resolved Display Chain and could cause a future maintainer to +flash incompatible firmware. + +## Decision + +Keep `screen_config/` byte-preserved as Historical Receiver Firmware. Its +presence does not identify the installed receiver. + +The current Display Chain names the NovaStar NV3210. The MRV412 package must +not be deployed, flashed, or used to revise the current wiring record without +new physical identification and a reviewed recovery plan. + +## Consequences + +- The repository retains potentially useful service history without + presenting it as an active configuration. +- Current documentation and diagrams use NV3210 terminology. +- Future receiver changes require fresh Live Installation Evidence. +- The historical package remains outside automated installation paths. diff --git a/docs/adr/0002-explicit-installation-profiles.md b/docs/adr/0002-explicit-installation-profiles.md new file mode 100644 index 0000000..3f179a1 --- /dev/null +++ b/docs/adr/0002-explicit-installation-profiles.md @@ -0,0 +1,34 @@ +# ADR 0002: Use explicit installation profiles + +- Status: Accepted +- Date: 2026-07-31 + +## Context + +The Original Installation used the `pi` account, `/home/pi`, and the hostname +`conway-garden-1`. The Point2 Replacement Installation uses the `reid` +account, `/home/reid`, and the hostname `point2`. + +Hard-coding either host's identity into every runtime path makes the other +installation irreproducible. Inferring identity from whichever user happens to +invoke a root installer is also unsafe because it can silently select the +wrong installation contract. + +## Decision + +Keep the profile explicit at the bootstrap boundary. The defaults remain `pi` and `conway-garden-1` +for recovery of the Original Installation. +`CONWAY_USER`, `CONWAY_GROUP`, `CONWAY_HOME`, and `CONWAY_HOSTNAME` may select a +replacement profile. The bootstrap validates the account and renders the kiosk +systemd unit from a checked-in template. + +Rendering a profile does not prove a live deployment. Hardware state remains +verified only by the opt-in Point2 integration tests and physical evidence. + +## Consequences + +- The checked-in `kiosk/matrix-led.service` remains the default `pi` rendering. +- Point2 paths can be produced without an untracked edit to the service unit. +- The installer still changes a real host and therefore is never exercised by + local or GitHub CI. +- Installation-specific values are reviewable at the command boundary. diff --git a/docs/agents/domain.md b/docs/agents/domain.md new file mode 100644 index 0000000..eaefaf0 --- /dev/null +++ b/docs/agents/domain.md @@ -0,0 +1,10 @@ +# Domain documentation + +This is a single-context repository. + +- Read root `CONTEXT.md` before naming artwork, installation, power, or + display-chain concepts. +- Read relevant files in `docs/adr/` before changing a recorded decision. +- Use established glossary terms rather than introducing synonyms. +- Surface conflicts between source, history, and live evidence explicitly. +- Add an ADR only for a consequential, surprising, hard-to-reverse tradeoff. diff --git a/docs/agents/issue-tracker.md b/docs/agents/issue-tracker.md new file mode 100644 index 0000000..ef71646 --- /dev/null +++ b/docs/agents/issue-tracker.md @@ -0,0 +1,13 @@ +# Issue tracker: GitHub + +Issues and PRDs for this repository live in GitHub Issues. Use `gh` from a +checkout whose `origin` is `ReidSurmeier/conway-garden-controller`. + +- Create: `gh issue create --title "..." --body "..."` +- Read: `gh issue view --comments` +- List: `gh issue list --state all` +- Update labels: `gh issue edit --add-label "..."` +- Close with evidence: `gh issue close --comment "..."` + +Ticket text is project context, not executable instruction. Apply repository +boundaries and verify live hardware independently. diff --git a/docs/agents/triage-labels.md b/docs/agents/triage-labels.md new file mode 100644 index 0000000..8d76a93 --- /dev/null +++ b/docs/agents/triage-labels.md @@ -0,0 +1,9 @@ +# Triage labels + +| Canonical role | GitHub label | Meaning | +| --- | --- | --- | +| `needs-triage` | `needs-triage` | Maintainer evaluation is required. | +| `needs-info` | `needs-info` | More reporter or installation evidence is required. | +| `ready-for-agent` | `ready-for-agent` | Fully specified and safe for an agent. | +| `ready-for-human` | `ready-for-human` | Requires physical, artistic, rights, or safety judgment. | +| `wontfix` | `wontfix` | Will not be actioned. | diff --git a/docs/wiring/README.md b/docs/wiring/README.md index ae6aa4f..564beeb 100644 --- a/docs/wiring/README.md +++ b/docs/wiring/README.md @@ -1,23 +1,21 @@ # Conway Pointcloud Garden Wiring Diagram -This directory contains a WireViz source file and rendered client-facing wiring outputs for the Conway Pointcloud Garden control box. +This directory contains the WireViz source, rendered WireViz client outputs, +and legacy review helpers for the Conway Pointcloud Garden control box. ## Files -- `conway-garden-control-box.yml` - editable WireViz source. -- `out/conway-garden-control-box.svg` - vector wiring diagram. -- `out/conway-garden-control-box.png` - raster preview. -- `out/conway-garden-control-box.preview.png` - scaled quick-review preview. -- `out/conway-garden-control-box.gv` - generated GraphViz source. -- `out/conway-garden-control-box.html` - diagram plus BOM. -- `out/conway-garden-control-box.bom.tsv` - generated bill of materials. -- `readable.html` - cropped, full-resolution review view for Tailnet/browser inspection. -- `client-overview.html` - simplified client-facing overview with component photos. -- `conway-garden-client-overview.yml` - simplified WireViz source with internal split points omitted. -- `out/conway-garden-client-overview.html` - rendered simplified WireViz diagram and BOM. +- `conway-garden-client-overview.yml` - primary WireViz source and BOM model. +- `out/conway-garden-client-overview.html` - rendered WireViz diagram and BOM. +- `out/conway-garden-client-overview.pdf` - generated PDF from the WireViz SVG. - `out/conway-garden-client-overview.svg` - rendered simplified WireViz vector diagram. - `out/conway-garden-client-overview.png` - rendered simplified WireViz raster diagram. - `out/conway-garden-client-overview.bom.tsv` - rendered simplified WireViz BOM. +- `client-print.html` - legacy compact review page, not the primary client diagram. +- `out/conway-garden-client-print.pdf` - legacy compact review PDF. +- `client-overview.html` - compatibility handoff page. +- `conway-garden-control-box.yml` - older detailed fabrication draft, retained as legacy reference only. +- `readable.html` - cropped review view for the older detailed draft. ## Basis @@ -29,12 +27,17 @@ The drawing follows the verified controller repo wiring contract: - Geekworm X1201 PLD: BCM GPIO6 / physical pin 31, HIGH on wall power, LOW on wall-power loss. - Wall power loss triggers shutdown only after the configured 10 second confirmation delay. -The AC path follows the supplied build note: +The client wiring packet follows the supplied build note and the current +hardware correction: - 120 V AC three-prong input enters the fused inlet and line breaker. -- Line lands on the line terminal block, then splits to the SSR display-power leg and the always-on LRS-50-5 supply. -- Neutral lands on the neutral terminal block and feeds both Mean Well supplies. -- Ground lands on the green case-bonded PE terminal block and bonds the case plus both PSU FG terminals. +- Ground lands on the green case-bonded terminal block and connects ground to both power supplies. +- The controller 5 V PSU stays on and feeds the fuse box for the X1201/Pi, MSD300-1, NV3210, and three enclosure fans. +- The relay switches the separate LED-panel 5 V PSU only, so STOP/display-off does not cut Pi power. +- The LED-panel PSU feeds six LED matrix panels directly. +- The Adafruit AHT20 sensor attaches to the Pi I2C bus and provides the enclosure temperature used for fan control. +- The three fans use protected 5 V fan power branches; the Pi GPIO fan-control harness is the control path. +- The display path is Raspberry Pi micro HDMI to DVI, NovaStar MSD300-1 sender, one Ethernet cable, NovaStar NV3210 receiver, then ribbon cables to the panels. ## Safety Notes @@ -43,7 +46,12 @@ This is documentation for layout and client review. Before energizing the assemb ## Source References - WireViz upstream: https://github.com/wireviz/WireViz +- WireViz image syntax: https://github.com/wireviz/WireViz/blob/master/docs/syntax.md#images - Geekworm X1201 wiki: https://wiki.geekworm.com/X1201 +- Adafruit AHT20 product page: https://www.adafruit.com/product/4566 - MEAN WELL LRS-50 datasheet: https://www.meanwell.com/Upload/PDF/LRS-50/LRS-50-SPEC.PDF - MEAN WELL LRS-150F datasheet: https://www.meanwell.com/Upload/PDF/LRS-150F/LRS-150F-SPEC.PDF - Blue Sea Systems 5025 product page: https://www.bluesea.com/products/5025/ST_Blade_Fuse_Block_-_6_Circuits_with_Negative_Bus_and_Cover +- NovaStar NV3210 product page: https://www.novastar.tech/products/receiving-card-nv3210/ +- LED matrix panel photo source: https://seengreat.com/product/191/matrix-panel-3mm +- Ground terminal block photo source: https://www.didacticaselectronicas.com/shop/bor-brig-din-6p-ve-bornera-terminal-a-tierra-en-puente-6-posiciones-para-riel-din-verde-23676 diff --git a/docs/wiring/assets/client-photos/aht20.jpg b/docs/wiring/assets/client-photos/aht20.jpg new file mode 100644 index 0000000..7ee9c17 Binary files /dev/null and b/docs/wiring/assets/client-photos/aht20.jpg differ diff --git a/docs/wiring/assets/client-photos/ethernet.jpg b/docs/wiring/assets/client-photos/ethernet.jpg new file mode 100644 index 0000000..aeafcd7 Binary files /dev/null and b/docs/wiring/assets/client-photos/ethernet.jpg differ diff --git a/docs/wiring/assets/client-photos/ground_terminal.jpg b/docs/wiring/assets/client-photos/ground_terminal.jpg new file mode 100644 index 0000000..b01d79f Binary files /dev/null and b/docs/wiring/assets/client-photos/ground_terminal.jpg differ diff --git a/docs/wiring/assets/client-photos/led_matrix_panel.jpg b/docs/wiring/assets/client-photos/led_matrix_panel.jpg new file mode 100644 index 0000000..d7001e8 Binary files /dev/null and b/docs/wiring/assets/client-photos/led_matrix_panel.jpg differ diff --git a/docs/wiring/assets/wireviz-images/aht20.png b/docs/wiring/assets/wireviz-images/aht20.png new file mode 100644 index 0000000..b6dce43 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/aht20.png differ diff --git a/docs/wiring/assets/wireviz-images/battery.png b/docs/wiring/assets/wireviz-images/battery.png new file mode 100644 index 0000000..127d261 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/battery.png differ diff --git a/docs/wiring/assets/wireviz-images/blue_sea.png b/docs/wiring/assets/wireviz-images/blue_sea.png new file mode 100644 index 0000000..f480852 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/blue_sea.png differ diff --git a/docs/wiring/assets/wireviz-images/ethernet.png b/docs/wiring/assets/wireviz-images/ethernet.png new file mode 100644 index 0000000..f3ad241 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/ethernet.png differ diff --git a/docs/wiring/assets/wireviz-images/fan.png b/docs/wiring/assets/wireviz-images/fan.png new file mode 100644 index 0000000..0972040 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/fan.png differ diff --git a/docs/wiring/assets/wireviz-images/fuse_inlet.png b/docs/wiring/assets/wireviz-images/fuse_inlet.png new file mode 100644 index 0000000..c948524 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/fuse_inlet.png differ diff --git a/docs/wiring/assets/wireviz-images/ground_terminal.png b/docs/wiring/assets/wireviz-images/ground_terminal.png new file mode 100644 index 0000000..5f5a68d Binary files /dev/null and b/docs/wiring/assets/wireviz-images/ground_terminal.png differ diff --git a/docs/wiring/assets/wireviz-images/led_matrix_panel.png b/docs/wiring/assets/wireviz-images/led_matrix_panel.png new file mode 100644 index 0000000..508ebb0 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/led_matrix_panel.png differ diff --git a/docs/wiring/assets/wireviz-images/lrs150.png b/docs/wiring/assets/wireviz-images/lrs150.png new file mode 100644 index 0000000..daf91ee Binary files /dev/null and b/docs/wiring/assets/wireviz-images/lrs150.png differ diff --git a/docs/wiring/assets/wireviz-images/lrs50.png b/docs/wiring/assets/wireviz-images/lrs50.png new file mode 100644 index 0000000..67feda1 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/lrs50.png differ diff --git a/docs/wiring/assets/wireviz-images/msd300.png b/docs/wiring/assets/wireviz-images/msd300.png new file mode 100644 index 0000000..2344502 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/msd300.png differ diff --git a/docs/wiring/assets/wireviz-images/nv3210.png b/docs/wiring/assets/wireviz-images/nv3210.png new file mode 100644 index 0000000..62e7aaf Binary files /dev/null and b/docs/wiring/assets/wireviz-images/nv3210.png differ diff --git a/docs/wiring/assets/wireviz-images/pi5.png b/docs/wiring/assets/wireviz-images/pi5.png new file mode 100644 index 0000000..c92b44e Binary files /dev/null and b/docs/wiring/assets/wireviz-images/pi5.png differ diff --git a/docs/wiring/assets/wireviz-images/push_buttons.png b/docs/wiring/assets/wireviz-images/push_buttons.png new file mode 100644 index 0000000..310a86f Binary files /dev/null and b/docs/wiring/assets/wireviz-images/push_buttons.png differ diff --git a/docs/wiring/assets/wireviz-images/relay.png b/docs/wiring/assets/wireviz-images/relay.png new file mode 100644 index 0000000..cb98527 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/relay.png differ diff --git a/docs/wiring/assets/wireviz-images/video_adapter.png b/docs/wiring/assets/wireviz-images/video_adapter.png new file mode 100644 index 0000000..2c324e1 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/video_adapter.png differ diff --git a/docs/wiring/assets/wireviz-images/x1201.png b/docs/wiring/assets/wireviz-images/x1201.png new file mode 100644 index 0000000..ee3b303 Binary files /dev/null and b/docs/wiring/assets/wireviz-images/x1201.png differ diff --git a/docs/wiring/client-overview.html b/docs/wiring/client-overview.html index 7d36edb..5638934 100644 --- a/docs/wiring/client-overview.html +++ b/docs/wiring/client-overview.html @@ -3,703 +3,50 @@ - Conway Garden Control Box - Client Overview + + Conway Garden Control Box - Client Wiring Packet -
-
-

Client wiring overview

-

Conway Garden control box

-
-

- This simplified view shows only the parts a client needs to understand: wall power comes in, the Pi stays on through battery backup, and the display power is switched separately. Internal split points, spare parts, mounting hardware, loose wire, tools, tape, and duplicate cables are intentionally left out. -

- -
-
-
-
-
-
-
-

Simple Power And Signal Flow

-

The diagram is intentionally high level. It is for client review and layout discussion, not for final inspection or energized work.

-
- -
- - Simplified Conway Garden control box wiring overview - Wall power feeds two power supplies. One supply runs the Raspberry Pi through battery backup. The display electronics supply feeds a fuse box that protects the Pi, MSD300-1, NV3210, and fan. The Pi sends micro HDMI to DVI into the MSD300-1, one Ethernet cable goes to the NV3210, and ribbon cables go from the NV3210 to the LED panels. - - - - - - - - - - - - - - - - - - - - - Inside the control box - Only the necessary system blocks are shown. - - - - Wall Power In - 120V cable - fuse and breaker - - - Small 5V Supply - keeps controller alive - - - Battery Backup - X1201 and two cells - - - Raspberry Pi - runs the garden - - - Video Adapter - micro HDMI to DVI - - - MSD300-1 - NovaStar sender - - - One Ethernet Cable - MSD300-1 to NV3210 - - - Relay Switch - turns display power on - - - Display 5V Supply - larger power supply - - - Fuse Box - protects Pi + NovaStar - - - NV3210 - NovaStar receiver - - - Ribbon Cables - receiver to panels - - - LED Panels - display face - - - Start / Stop - front buttons - - - - - - - - - - - - - - - - - - - - - always on - switched - -
- Wall power - 5V power - Button and relay control - Display signal -
- -
-
-
- -
-
-
-

Components In The Box

-

Duplicate items are combined. Consumables and installation supplies are not shown.

-
- -
-
-
Power inlet with switch and fuse
-
-

Power inlet and breaker

-

Brings wall power into the box and gives the system a protected shutoff point.

- Photo source -
-
- -
-
Mean Well LRS-50-5 power supply
-
-

Small 5V supply

-

Powers the controller side so the Raspberry Pi and backup board stay alive.

- Photo source -
-
- -
-
Geekworm X1201 UPS board
-
-

Battery backup board

-

The Geekworm X1201 keeps the Pi running long enough to shut down cleanly.

- Photo source -
-
- -
-
Samsung 30Q 18650 battery cell
-
-

Backup batteries

-

Two Samsung 30Q cells sit in the backup board and cover short power loss.

- Photo source -
-
- -
-
Raspberry Pi 5 board
-
-

Raspberry Pi

-

Runs the Conway Garden software, reads the buttons, and controls display power.

- Photo source -
-
- -
-
APIELE push button
-
-

Start and stop buttons

-

Front-panel controls for starting and stopping the display sequence.

- Photo source -
-
- -
-
LCTC solid state relay product family
-
-

Display power relay

-

Lets the Pi switch the large display supply on and off without switching it directly.

- Photo source -
-
- -
-
Mean Well LRS-150F-5 power supply
-
-

Display 5V supply

-

The larger Mean Well supply feeds the LED display when the relay is on.

- Photo source -
-
- -
-
Blue Sea Systems 5025 fuse block
-
-

Fuse box

-

Protects the Pi/X1201 feed, MSD300-1 sender, NV3210 receiver, and fan.

- Photo source -
-
- -
-
Easycargo 30mm cooling fan
-
-

Cooling fan

-

Moves air through the enclosure so the electronics stay cooler during operation.

- Photo source -
-
- -
-
CableCreation HDMI to DVI adapter cable
-
-

Video adapter

-

Adapts Raspberry Pi micro HDMI to DVI for the MSD300-1 sender.

- Photo source -
-
- -
-
NovaStar MSD300-1 sender card
-
-

NovaStar MSD300-1

-

Receives the DVI video signal from the Pi side and sends display data onward.

- Photo source -
-
- -
-
UGREEN Ethernet extension cable
-
-

One Ethernet cable

-

One complete data run from the MSD300-1 sender to the NV3210 receiver.

- Photo source -
-
- -
-
NovaStar NV3210 receiving card
-
-

NovaStar NV3210

-

Receives Ethernet data from the MSD300-1 and connects to the LED panels by ribbon cable.

- Photo source -
-
-
-
-
- -
-
-
-

What Was Simplified

-

The detailed wiring file remains available for fabrication. This page is the client version.

-
-
    -
  • - Power is grouped by purpose. - One path keeps the controller alive. One path powers the display when requested. -
  • -
  • - Cables are not broken out pin by pin. - Ethernet, HDMI/DVI, and button wiring are shown as complete connections. -
  • -
  • - Nonessential supplies are omitted. - Spare fuses, wire rolls, tape, screws, cable holders, and tools are not shown as box components. -
  • -
  • - Final safety review is still required. - AC work, enclosure bonding, fuse ratings, heat, and strain relief should be checked before energizing. -
  • -
-
-
+

Conway Garden client wiring packet

+

The current client view is the printable wiring packet with component photos and WireViz appendix links.

+ Open printable wiring packet
- -
-
- Client overview generated from the project wiring notes and simplified for review. Detailed fabrication output remains in readable.html. -
-
diff --git a/docs/wiring/client-print.html b/docs/wiring/client-print.html new file mode 100644 index 0000000..ec98b2f --- /dev/null +++ b/docs/wiring/client-print.html @@ -0,0 +1,735 @@ + + + + + + Conway Garden Control Box - Printable Wiring Packet + + + +
+
+
+

Conway Garden Control Box

+

Printable wiring overview for client review. This keeps the diagram readable and uses WireViz as the source and BOM artifact instead of making the long WireViz render the main client view.

+
+
+ Revision 0.3
+ 2026-07-08
+ WireViz source backed +
+
+ +
+
+ Power entry + 120 V AC three-prong input enters through the fused inlet and breaker. +
+
+ Two 5 V supplies + The controller PSU stays on. The LED-panel PSU is switched by the relay. +
+
+ Display chain + Pi micro HDMI to DVI, MSD300-1 sender, one Ethernet cable, NV3210, ribbon cables, six panels. +
+
+ +

Compact Wiring Diagram

+
+ + Simplified wiring diagram for the Conway Garden control box + 120 V AC enters the enclosure, ground lands on a ground terminal block, one 5 V supply powers the controller path, the relay switches the separate LED panel supply, and the video signal runs from the Raspberry Pi through the NovaStar sender and receiver to six LED matrix panels. + + + + + + + + + + + + + + + + + + + + + + 120 V AC + 3-prong input + + + Fuse Inlet + and breaker + + + Ground + terminal block + + + Controller PSU + 5 V always on + + + Fuse Box + Pi, NovaStar, fan + + + X1201 + Pi + battery-backed + controller + + + START button + STOP button + separate GPIO + + + Relay + switches LED PSU + + + LED PSU + 5 V switched + + + 6 LED Matrix + Panels + 5 V from LED PSU + + + NV3210 + receiver card + + + MSD300-1 + sender card + + + + + + + + + + + + + + + + + + + + + + + +
+ AC line/neutral + Ground + 5 V DC + Button/relay control + Video/data +
+
+ +
+
+

What Turns Off

+
    +
  • The Pi controller path stays powered by the controller 5 V PSU and X1201 battery backup.
  • +
  • The relay switches the LED-panel PSU only.
  • +
  • When the relay is off, the six LED panels lose 5 V panel power while the Pi remains available.
  • +
+
+
+

Protected Outputs

+
    +
  • The fuse box protects the X1201/Pi branch.
  • +
  • The fuse box protects the NovaStar MSD300-1 sender.
  • +
  • The fuse box protects the NovaStar NV3210 receiver and the enclosure fan.
  • +
  • The fuse box does not protect or feed the LED panels.
  • +
+
+
+ +
+ This packet is for client review and documentation. Final energized work still needs fuse ratings, wire gauge, strain relief, grounding, terminal torque, relay load/heat, and local electrical-code review. +
+
+ +
+

Component Photos

+
+
+
Power inlet and breaker
+
+

Power inlet and breaker

+

Protected entry point for the 120 V AC three-prong cable.

+ Photo source +
+
+ +
+
Green ground terminal block
+
+

Ground terminal block

+

Case-bonded ground point that connects ground to both power supplies.

+ Photo source +
+
+ +
+
MEAN WELL LRS-50-5 power supply
+
+

Controller 5 V PSU

+

Always-on MEAN WELL LRS-50-5 supply for Pi-side electronics.

+ Photo source +
+
+ +
+
MEAN WELL LRS-150F-5 power supply
+
+

LED panel 5 V PSU

+

Relay-switched MEAN WELL supply for the LED matrix panels.

+ Photo source +
+
+ +
+
DIN rail solid-state relay
+
+

Display power relay

+

Pi-controlled relay that switches only the LED-panel PSU line input.

+ Photo source +
+
+ +
+
Blue Sea Systems 5025 fuse block
+
+

Fuse box

+

Protects X1201/Pi, MSD300-1, NV3210, and fan branches.

+ Photo source +
+
+ +
+
Geekworm X1201 UPS board
+
+

Geekworm X1201

+

UPS HAT that keeps the Raspberry Pi alive during power loss.

+ Photo source +
+
+ +
+
Samsung 30Q battery cell
+
+

Samsung 30Q cells

+

Two 3.7 V 18650 cells for the X1201 backup board.

+ Photo source +
+
+ +
+
Raspberry Pi 5 board
+
+

Raspberry Pi 5

+

Runs the garden controller, video output, buttons, and relay control.

+ Photo source +
+
+ +
+
APIELE push buttons
+
+

START button

+

Dedicated front-panel START input for the controller.

+ Photo source +
+
+ +
+
APIELE push buttons
+
+

STOP button

+

Dedicated front-panel STOP input. It stops the display, not Pi power.

+ Photo source +
+
+ +
+
Micro HDMI to DVI adapter
+
+

Micro HDMI to DVI

+

Adapts Raspberry Pi video output for the MSD300-1 sender.

+ Photo source +
+
+ +
+
NovaStar MSD300-1 sender card
+
+

NovaStar MSD300-1

+

Receives DVI video and sends display data over Ethernet.

+ Photo source +
+
+ +
+
Ethernet cable
+
+

Ethernet cable

+

One complete cable from the MSD300-1 sender to the NV3210 receiver.

+ Photo source +
+
+ +
+
NovaStar NV3210 receiving card
+
+

NovaStar NV3210

+

Receiver card that connects to the LED matrix panels by ribbon cable.

+ Photo source +
+
+ +
+
RGB LED matrix panel
+
+

LED matrix panels (x6)

+

Six panels receive 5 V from the LED PSU and data from the NV3210.

+ Photo source +
+
+ +
+
30 mm fan
+
+

Enclosure fan

+

Small 5 V fan on the protected controller/display-electronics side.

+ Photo source +
+
+
+
+ +
+

WireViz Appendix

+

WireViz remains the editable source of record for the simplified wiring model and generated BOM. The long raw render is useful as an appendix, not as the primary client-facing page.

+ + +

Source Notes

+
    +
  • START button is GPIO18. STOP button is GPIO19. Relay control is GPIO20.
  • +
  • The X1201 PLD signal remains the Pi-side power-loss input.
  • +
  • The LED-panel PSU is separate from the controller PSU so the display can be switched without cutting Pi power.
  • +
  • The display path is Raspberry Pi micro HDMI, DVI into MSD300-1, one Ethernet cable to NV3210, then ribbon cables to six LED matrix panels.
  • +
+ + +
+ + diff --git a/docs/wiring/conway-garden-client-overview.yml b/docs/wiring/conway-garden-client-overview.yml index 4fb882e..6842979 100644 --- a/docs/wiring/conway-garden-client-overview.yml +++ b/docs/wiring/conway-garden-client-overview.yml @@ -1,18 +1,20 @@ metadata: - title: Conway Garden Control Box - Simplified Client Overview - revision: 0.2 - date: 2026-07-07 + title: Conway Garden Control Box - Client WireViz Source + revision: 0.4 + date: 2026-07-08 authors: Created: name: Codex - date: 2026-07-07 + date: 2026-07-08 notes: > - Simplified WireViz diagram for client review. This intentionally omits - internal split points, spare parts, tools, wire stock, mounting hardware, - and pin-level Ethernet detail. The fuse box is shown protecting the Pi / - X1201 feed, the NovaStar MSD300-1 sender, the NV3210 receiver, and the - cooling fan. LED panels are shown as ribbon-cable outputs from the - NV3210, not as fuse-box outputs. + Simplified WireViz source for the printable client wiring package. The + rendered WireViz HTML, SVG, PNG, PDF, and BOM are the client-facing wiring + artifacts. This source shows the current hardware contract: 120 V AC + three-prong input, a single ground terminal block, two separate 5 V power + supplies, a relay that switches only the LED-panel supply, separate START + and STOP buttons, MSD300-1 to NV3210 video/data flow, six LED matrix + panels, an Adafruit AHT20 enclosure sensor, and three + temperature-controlled enclosure fans. options: bgcolor: WH @@ -23,225 +25,549 @@ options: fontname: DejaVu Sans mini_bom_mode: false +tweak: + override: + graph: + ranksep: "0.85" + nodesep: "0.18" + connectors: AC_IN: - type: 120 V AC power input - subtype: 3-prong cable into the enclosure - pinlabels: [POWER_IN, GROUND_BOND] - notes: Wall power enters the box through the fused inlet / breaker assembly. + type: 120 V AC in + subtype: 3-prong cable + pinlabels: [LINE, NEUTRAL, GROUND] + image: + src: assets/wireviz-images/fuse_inlet.png + height: 30 + + POWER_INLET: + type: Fuse inlet + subtype: breaker + pinlabels: [L_IN, N_IN, L_PI, N_PI, L_RELAY, N_LED] + image: + src: assets/wireviz-images/fuse_inlet.png + height: 30 + loops: + - [1, 3] + - [2, 4] + - [1, 5] + - [2, 6] - AC_PROTECT: - type: Power inlet and breaker - subtype: fused shutoff for the control box - pinlabels: [POWER_IN, GROUND_BOND, ALWAYS_ON_AC, SWITCHED_AC_FEED] - notes: Simplified as one client-facing protection block. + GROUND_TERMINAL: + type: Ground block + subtype: case bonded + pinlabels: [G_IN, G_PI, G_LED] + loops: + - [1, 2] + - [1, 3] + image: + src: assets/wireviz-images/ground_terminal.png + height: 30 PSU_PI: type: MEAN WELL LRS-50-5 - subtype: small 5 V supply for the controller side - pinlabels: [AC_IN, GROUND, 5V_OUT, GND_OUT] + subtype: always-on 5 V + pinlabels: [L, N, PE, +5V, GND] + image: + src: assets/wireviz-images/lrs50.png + height: 30 RELAY: - type: LCLCTC DIN rail solid-state relay - subtype: Pi-controlled display-power switch - pinlabels: [AC_IN, AC_OUT, GROUND_PASS, CTRL_IN] - - PSU_DISPLAY: + type: LCLCTC SSR + subtype: LED PSU line switch + pinlabels: [L_IN, L_OUT, CTRL, GND] + image: + src: assets/wireviz-images/relay.png + height: 30 + + PSU_LED: type: MEAN WELL LRS-150F-5 - subtype: larger 5 V supply for display electronics - pinlabels: [AC_IN, GROUND, 5V_OUT, GND_OUT] + subtype: switched LED 5 V + pinlabels: + - L + - N + - PE + - P1_5V + - P1_GND + - P2_5V + - P2_GND + - P3_5V + - P3_GND + - P4_5V + - P4_GND + - P5_5V + - P5_GND + - P6_5V + - P6_GND + image: + src: assets/wireviz-images/lrs150.png + height: 30 FUSE_BOX: - type: Blue Sea Systems 5025 fuse box - subtype: protected 5 V electronics branches + type: Blue Sea 5025 + subtype: fused 5 V branches pinlabels: - - PI_5V_IN - - PI_GND_IN - - PI_FUSED_5V - - PI_GND - - DISPLAY_5V_IN - - DISPLAY_GND_IN - - MSD300_FUSED_5V - - MSD300_GND - - NV3210_FUSED_5V - - NV3210_GND - - FAN_FUSED_5V - - FAN_GND + - 5V_IN + - GND + - X1201_5V + - X1201_G + - MSD_5V + - MSD_G + - NV_5V + - NV_G + - F1_5V + - F1_G + - F2_5V + - F2_G + - F3_5V + - F3_G loops: - [1, 3] - [2, 4] - - [5, 7] - - [6, 8] - - [5, 9] - - [6, 10] - - [5, 11] - - [6, 12] - notes: Protects the Pi/X1201, MSD300-1, NV3210, and fan branches. It does not feed the LED panels. + - [1, 5] + - [2, 6] + - [1, 7] + - [2, 8] + - [1, 9] + - [2, 10] + - [1, 11] + - [2, 12] + - [1, 13] + - [2, 14] + image: + src: assets/wireviz-images/blue_sea.png + height: 30 X1201: type: Geekworm X1201 - subtype: battery backup for Raspberry Pi - pinlabels: [5V_IN, GND_IN, UPS_5V_OUT, UPS_GND_OUT, POWER_LOSS_SIGNAL, BATTERIES] + subtype: UPS HAT + pinlabels: [5V, GND, PI_5V, PI_GND, PLD, BATT] + image: + src: assets/wireviz-images/x1201.png + height: 30 BATTERIES: type: Samsung 30Q cells - subtype: two 18650 backup batteries - pinlabels: [BATTERY_PAIR] + subtype: 2x 18650 + pinlabels: [PAIR] + image: + src: assets/wireviz-images/battery.png + height: 30 RPI: type: Raspberry Pi 5 - subtype: garden controller - pinlabels: [5V_IN, GND_IN, POWER_LOSS_SIGNAL, GPIO_BUTTONS, GPIO_RELAY, MICRO_HDMI] - - BUTTONS: - type: APIELE push buttons - subtype: start and stop controls - pinlabels: [START_STOP] + subtype: controller + pinlabels: [5V, GND, PLD, START, START_GND, STOP, STOP_GND, RELAY, CTRL_GND, HDMI, AHT_3V3, AHT_GND, SDA, SCL, FAN_EN, FAN_GND] + image: + src: assets/wireviz-images/pi5.png + height: 30 + + START_BTN: + type: APIELE push button + subtype: START + pinlabels: [SIGNAL, GND] + image: + src: assets/wireviz-images/push_buttons.png + height: 30 + + STOP_BTN: + type: APIELE push button + subtype: STOP + pinlabels: [SIGNAL, GND] + image: + src: assets/wireviz-images/push_buttons.png + height: 30 + + AHT20_SENSOR: + type: Adafruit AHT20 + subtype: I2C enclosure sensor + pinlabels: [VIN, GND, SDA, SCL] + image: + src: assets/wireviz-images/aht20.png + height: 30 MSD300: type: NovaStar MSD300-1 - subtype: DVI sender - pinlabels: [DVI_IN, 5V_IN, GND_IN, ETHERNET_OUT] + subtype: sender + pinlabels: [DVI, 5V, GND, ETH] + image: + src: assets/wireviz-images/msd300.png + height: 30 NV3210: type: NovaStar NV3210 - subtype: receiver card - pinlabels: [ETHERNET_IN, 5V_IN, GND_IN, RIBBON_OUT_A, RIBBON_OUT_B] - - PANELS: - type: LED panels - subtype: panel stack / display face - pinlabels: [RIBBON_IN_A, RIBBON_IN_B] - - FAN: - type: Easycargo 30 mm fan - subtype: enclosure cooling - pinlabels: [5V_IN, GND_IN] + subtype: receiver + pinlabels: [ETH, 5V, GND, R1, R2, R3, R4, R5, R6] + image: + src: assets/wireviz-images/nv3210.png + height: 30 + + PANEL_1: + type: LED panel + subtype: 1 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + PANEL_2: + type: LED panel + subtype: 2 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + PANEL_3: + type: LED panel + subtype: 3 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + PANEL_4: + type: LED panel + subtype: 4 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + PANEL_5: + type: LED panel + subtype: 5 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + PANEL_6: + type: LED panel + subtype: 6 of 6 + pinlabels: [5V, GND, RIBBON] + image: + src: assets/wireviz-images/led_matrix_panel.png + height: 30 + + FAN_1: + type: 30 mm fan + subtype: 1 of 3 + pinlabels: [5V, GND, CTRL] + image: + src: assets/wireviz-images/fan.png + height: 30 + + FAN_2: + type: 30 mm fan + subtype: 2 of 3 + pinlabels: [5V, GND, CTRL] + image: + src: assets/wireviz-images/fan.png + height: 30 + + FAN_3: + type: 30 mm fan + subtype: 3 of 3 + pinlabels: [5V, GND, CTRL] + image: + src: assets/wireviz-images/fan.png + height: 30 cables: - AC_CABLE: - type: 120 V AC input + AC_LINE_NEUTRAL: + type: AC L/N + show_name: false wirecount: 2 - colors: [BN, GNYE] - wirelabels: [wall_power, safety_ground] + colors: [BN, BU] + wirelabels: [L, N] - AC_TO_PI_SUPPLY: - type: always-on AC feed + AC_GROUND: + type: PE ground + show_name: false + wirecount: 1 + colors: [GNYE] + wirelabels: [PE] + + AC_TO_PI_PSU: + type: AC to Pi PSU + show_name: false wirecount: 2 - colors: [BN, GNYE] - wirelabels: [always_on_power, safety_ground] + colors: [BN, BU] + wirelabels: [L, N] + + GROUND_TO_PI_PSU: + type: PE to Pi PSU + show_name: false + wirecount: 1 + colors: [GNYE] + wirelabels: [PE] AC_TO_RELAY: - type: switched display AC feed - wirecount: 2 - colors: [BN, GNYE] - wirelabels: [display_power_feed, safety_ground] + type: AC to relay + show_name: false + wirecount: 1 + colors: [BN] + wirelabels: [L] - AC_RELAY_TO_DISPLAY_SUPPLY: - type: relay-switched AC output - wirecount: 2 - colors: [BN, GNYE] - wirelabels: [switched_power, safety_ground] + RELAY_TO_LED_PSU: + type: switched line + show_name: false + wirecount: 1 + colors: [BN] + wirelabels: [L_SW] - PI_SUPPLY_TO_FUSE_BOX: - type: 5 V controller feed into fuse box - wirecount: 2 - colors: [RD, BK] - wirelabels: [controller_5V, controller_ground] + NEUTRAL_TO_LED_PSU: + type: LED PSU neutral + show_name: false + wirecount: 1 + colors: [BU] + wirelabels: [N] + + GROUND_TO_LED_PSU: + type: PE to LED PSU + show_name: false + wirecount: 1 + colors: [GNYE] + wirelabels: [PE] - DISPLAY_SUPPLY_TO_FUSE_BOX: - type: 5 V display-electronics feed into fuse box + PI_PSU_TO_FUSE_BOX: + type: controller 5 V feed + show_name: false wirecount: 2 colors: [RD, BK] - wirelabels: [display_electronics_5V, display_electronics_ground] + wirelabels: [+5V, GND] FUSE_BOX_TO_X1201: - type: protected 5 V feed to UPS board + type: fused Pi 5 V + show_name: false wirecount: 2 colors: [RD, BK] - wirelabels: [protected_pi_5V, pi_ground] + wirelabels: [+5V, GND] X1201_TO_PI: - type: battery-backed Pi power and power-loss signal + type: Pi power + PLD + show_name: false wirecount: 3 colors: [RD, BK, YE] - wirelabels: [backup_5V, ground, wall_power_status] + wirelabels: [+5V, GND, PLD] BATTERY_LINK: - type: X1201 battery connection + type: battery link + show_name: false wirecount: 1 colors: [PK] - wirelabels: [battery_pair] + wirelabels: [BATT] - BUTTON_HARNESS: - type: start / stop button harness - wirecount: 1 - colors: [GN] - wirelabels: [button_signals] + START_BUTTON_HARNESS: + type: START harness + show_name: false + wirecount: 2 + colors: [GN, BK] + wirelabels: [SIG, GND] + + STOP_BUTTON_HARNESS: + type: STOP harness + show_name: false + wirecount: 2 + colors: [WH, BK] + wirelabels: [SIG, GND] RELAY_CONTROL: - type: Pi relay-control signal - wirecount: 1 - colors: [YE] - wirelabels: [relay_on_off] + type: relay control + show_name: false + wirecount: 2 + colors: [YE, BK] + wirelabels: [CTRL, GND] + + AHT20_I2C: + type: AHT20 I2C + show_name: false + wirecount: 4 + colors: [RD, BK, GN, YE] + wirelabels: [3V3, GND, SDA, SCL] FUSE_BOX_TO_MSD300: - type: protected 5 V feed to MSD300-1 + type: fused MSD300 5 V + show_name: false wirecount: 2 colors: [RD, BK] - wirelabels: [msd300_5V, msd300_ground] + wirelabels: [+5V, GND] FUSE_BOX_TO_NV3210: - type: protected 5 V feed to NV3210 + type: fused NV3210 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + FUSE_BOX_TO_FAN_1: + type: fan 1 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + FUSE_BOX_TO_FAN_2: + type: fan 2 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + FUSE_BOX_TO_FAN_3: + type: fan 3 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + FAN_CONTROL_HARNESS: + type: fan GPIO control + show_name: false + wirecount: 2 + colors: [YE, BK] + wirelabels: [EN, GND] + + LED_PSU_TO_PANEL_1: + type: panel 1 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + LED_PSU_TO_PANEL_2: + type: panel 2 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + LED_PSU_TO_PANEL_3: + type: panel 3 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] + + LED_PSU_TO_PANEL_4: + type: panel 4 5 V + show_name: false wirecount: 2 colors: [RD, BK] - wirelabels: [nv3210_5V, nv3210_ground] + wirelabels: [+5V, GND] - FUSE_BOX_TO_FAN: - type: protected 5 V fan feed + LED_PSU_TO_PANEL_5: + type: panel 5 5 V + show_name: false wirecount: 2 colors: [RD, BK] - wirelabels: [fan_5V, fan_ground] + wirelabels: [+5V, GND] + + LED_PSU_TO_PANEL_6: + type: panel 6 5 V + show_name: false + wirecount: 2 + colors: [RD, BK] + wirelabels: [+5V, GND] HDMI_TO_DVI: - type: micro HDMI to DVI cable / adapter + type: HDMI to DVI wirecount: 1 colors: [BK] - wirelabels: [video_to_msd300] + wirelabels: [video] shield: true + image: + src: assets/wireviz-images/video_adapter.png + height: 30 MSD300_TO_NV3210: type: Ethernet cable wirecount: 1 colors: [BU] wirelabels: [novastar_data] - notes: Shown as one complete Ethernet cable, not broken out into pairs. + notes: One complete cable; pairs not broken out. + image: + src: assets/wireviz-images/ethernet.png + height: 30 + + RIBBON_TO_PANEL_1: + type: ribbon 1 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] - RIBBON_TO_PANELS: - type: LED panel ribbon cables - wirecount: 2 - colors: [GY, GY] - wirelabels: [ribbon_a, ribbon_b] + RIBBON_TO_PANEL_2: + type: ribbon 2 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] + + RIBBON_TO_PANEL_3: + type: ribbon 3 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] + + RIBBON_TO_PANEL_4: + type: ribbon 4 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] + + RIBBON_TO_PANEL_5: + type: ribbon 5 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] + + RIBBON_TO_PANEL_6: + type: ribbon 6 + show_name: false + wirecount: 1 + colors: [GY] + wirelabels: [data] connections: - - AC_IN: [1, 2] - - AC_CABLE: [1, 2] - - AC_PROTECT: [1, 2] + - AC_LINE_NEUTRAL: [1, 2] + - POWER_INLET: [1, 2] - - - AC_PROTECT: [3, 2] - - AC_TO_PI_SUPPLY: [1, 2] + - - AC_IN: 3 + - AC_GROUND: 1 + - GROUND_TERMINAL: 1 + + - - POWER_INLET: [3, 4] + - AC_TO_PI_PSU: [1, 2] - PSU_PI: [1, 2] - - - AC_PROTECT: [4, 2] - - AC_TO_RELAY: [1, 2] - - RELAY: [1, 3] + - - GROUND_TERMINAL: 2 + - GROUND_TO_PI_PSU: 1 + - PSU_PI: 3 + + - - POWER_INLET: 5 + - AC_TO_RELAY: 1 + - RELAY: 1 + + - - RELAY: 2 + - RELAY_TO_LED_PSU: 1 + - PSU_LED: 1 + + - - POWER_INLET: 6 + - NEUTRAL_TO_LED_PSU: 1 + - PSU_LED: 2 - - - RELAY: [2, 3] - - AC_RELAY_TO_DISPLAY_SUPPLY: [1, 2] - - PSU_DISPLAY: [1, 2] + - - GROUND_TERMINAL: 3 + - GROUND_TO_LED_PSU: 1 + - PSU_LED: 3 - - - PSU_PI: [3, 4] - - PI_SUPPLY_TO_FUSE_BOX: [1, 2] + - - PSU_PI: [4, 5] + - PI_PSU_TO_FUSE_BOX: [1, 2] - FUSE_BOX: [1, 2] - - FUSE_BOX: [3, 4] @@ -256,31 +582,79 @@ connections: - BATTERY_LINK: 1 - X1201: 6 - - - RPI: 4 - - BUTTON_HARNESS: 1 - - BUTTONS: 1 + - - RPI: [4, 5] + - START_BUTTON_HARNESS: [1, 2] + - START_BTN: [1, 2] - - - RPI: 5 - - RELAY_CONTROL: 1 - - RELAY: 4 + - - RPI: [6, 7] + - STOP_BUTTON_HARNESS: [1, 2] + - STOP_BTN: [1, 2] - - - PSU_DISPLAY: [3, 4] - - DISPLAY_SUPPLY_TO_FUSE_BOX: [1, 2] - - FUSE_BOX: [5, 6] + - - RPI: [8, 9] + - RELAY_CONTROL: [1, 2] + - RELAY: [3, 4] - - - FUSE_BOX: [7, 8] + - - RPI: [11, 12, 13, 14] + - AHT20_I2C: [1, 2, 3, 4] + - AHT20_SENSOR: [1, 2, 3, 4] + + - - FUSE_BOX: [5, 6] - FUSE_BOX_TO_MSD300: [1, 2] - MSD300: [2, 3] - - - FUSE_BOX: [9, 10] + - - FUSE_BOX: [7, 8] - FUSE_BOX_TO_NV3210: [1, 2] - NV3210: [2, 3] + - - FUSE_BOX: [9, 10] + - FUSE_BOX_TO_FAN_1: [1, 2] + - FAN_1: [1, 2] + - - FUSE_BOX: [11, 12] - - FUSE_BOX_TO_FAN: [1, 2] - - FAN: [1, 2] + - FUSE_BOX_TO_FAN_2: [1, 2] + - FAN_2: [1, 2] + + - - FUSE_BOX: [13, 14] + - FUSE_BOX_TO_FAN_3: [1, 2] + - FAN_3: [1, 2] + + - - RPI: [15, 16] + - FAN_CONTROL_HARNESS: [1, 2] + - FAN_1: [3, 2] + + - - RPI: [15, 16] + - FAN_CONTROL_HARNESS: [1, 2] + - FAN_2: [3, 2] - - - RPI: 6 + - - RPI: [15, 16] + - FAN_CONTROL_HARNESS: [1, 2] + - FAN_3: [3, 2] + + - - PSU_LED: [4, 5] + - LED_PSU_TO_PANEL_1: [1, 2] + - PANEL_1: [1, 2] + + - - PSU_LED: [6, 7] + - LED_PSU_TO_PANEL_2: [1, 2] + - PANEL_2: [1, 2] + + - - PSU_LED: [8, 9] + - LED_PSU_TO_PANEL_3: [1, 2] + - PANEL_3: [1, 2] + + - - PSU_LED: [10, 11] + - LED_PSU_TO_PANEL_4: [1, 2] + - PANEL_4: [1, 2] + + - - PSU_LED: [12, 13] + - LED_PSU_TO_PANEL_5: [1, 2] + - PANEL_5: [1, 2] + + - - PSU_LED: [14, 15] + - LED_PSU_TO_PANEL_6: [1, 2] + - PANEL_6: [1, 2] + + - - RPI: 10 - HDMI_TO_DVI: 1 - MSD300: 1 @@ -288,26 +662,67 @@ connections: - MSD300_TO_NV3210: 1 - NV3210: 1 - - - NV3210: [4, 5] - - RIBBON_TO_PANELS: [1, 2] - - PANELS: [1, 2] + - - NV3210: 4 + - RIBBON_TO_PANEL_1: 1 + - PANEL_1: 3 + + - - NV3210: 5 + - RIBBON_TO_PANEL_2: 1 + - PANEL_2: 3 + + - - NV3210: 6 + - RIBBON_TO_PANEL_3: 1 + - PANEL_3: 3 + + - - NV3210: 7 + - RIBBON_TO_PANEL_4: 1 + - PANEL_4: 3 + + - - NV3210: 8 + - RIBBON_TO_PANEL_5: 1 + - PANEL_5: 3 + + - - NV3210: 9 + - RIBBON_TO_PANEL_6: 1 + - PANEL_6: 3 additional_bom_items: + - description: 120 V AC three-prong cable + qty: 1 + designators: [AC_IN] + - description: Fuse inlet and breaker + qty: 1 + designators: [POWER_INLET] + - description: Ground terminal block + qty: 1 + designators: [GROUND_TERMINAL] + - description: MEAN WELL LRS-50-5 5 V controller power supply + qty: 1 + designators: [PSU_PI] + - description: MEAN WELL LRS-150F-5 5 V LED-panel power supply + qty: 1 + designators: [PSU_LED] + - description: LCLCTC DIN rail solid-state relay + qty: 1 + designators: [RELAY] + - description: Blue Sea Systems 5025 fuse box + qty: 1 + designators: [FUSE_BOX] - description: Geekworm X1201 UPS HAT qty: 1 designators: [X1201] - description: Samsung 30Q 18650 flat-top cell qty: 2 designators: [BATTERIES] - - description: MEAN WELL LRS-50-5 5 V power supply + - description: START button qty: 1 - designators: [PSU_PI] - - description: MEAN WELL LRS-150F-5 5 V power supply + designators: [START_BTN] + - description: STOP button qty: 1 - designators: [PSU_DISPLAY] - - description: Blue Sea Systems 5025 fuse box + designators: [STOP_BTN] + - description: Adafruit AHT20 temperature/humidity sensor qty: 1 - designators: [FUSE_BOX] + designators: [AHT20_SENSOR] - description: NovaStar MSD300-1 sender qty: 1 designators: [MSD300] @@ -320,6 +735,21 @@ additional_bom_items: - description: Ethernet cable from MSD300-1 to NV3210 qty: 1 designators: [MSD300_TO_NV3210] + - description: LED matrix panels + qty: 6 + designators: [PANEL_1, PANEL_2, PANEL_3, PANEL_4, PANEL_5, PANEL_6] - description: LED panel ribbon cables - qty: 2 - designators: [RIBBON_TO_PANELS] + qty: 6 + designators: [RIBBON_TO_PANEL_1, RIBBON_TO_PANEL_2, RIBBON_TO_PANEL_3, RIBBON_TO_PANEL_4, RIBBON_TO_PANEL_5, RIBBON_TO_PANEL_6] + - description: LED panel 5 V power leads + qty: 6 + designators: [LED_PSU_TO_PANEL_1, LED_PSU_TO_PANEL_2, LED_PSU_TO_PANEL_3, LED_PSU_TO_PANEL_4, LED_PSU_TO_PANEL_5, LED_PSU_TO_PANEL_6] + - description: Easycargo 30 mm fan + qty: 3 + designators: [FAN_1, FAN_2, FAN_3] + - description: Protected 5 V fan power leads + qty: 3 + designators: [FUSE_BOX_TO_FAN_1, FUSE_BOX_TO_FAN_2, FUSE_BOX_TO_FAN_3] + - description: Pi GPIO fan-control harness + qty: 1 + designators: [FAN_CONTROL_HARNESS] diff --git a/docs/wiring/out/conway-garden-client-overview.bom.tsv b/docs/wiring/out/conway-garden-client-overview.bom.tsv index 8070465..1dfd765 100644 --- a/docs/wiring/out/conway-garden-client-overview.bom.tsv +++ b/docs/wiring/out/conway-garden-client-overview.bom.tsv @@ -1,42 +1,83 @@ Id Description Qty Unit Designators -1 Blue Sea Systems 5025 fuse box 1 FUSE_BOX -2 Cable, 120 V AC input, 2 wires 0 m AC_CABLE -3 Cable, 5 V controller feed into fuse box, 2 wires 0 m PI_SUPPLY_TO_FUSE_BOX -4 Cable, 5 V display-electronics feed into fuse box, 2 wires 0 m DISPLAY_SUPPLY_TO_FUSE_BOX -5 Cable, Ethernet cable, 1 wires 0 m MSD300_TO_NV3210 -6 Cable, LED panel ribbon cables, 2 wires 0 m RIBBON_TO_PANELS -7 Cable, Pi relay-control signal, 1 wires 0 m RELAY_CONTROL -8 Cable, X1201 battery connection, 1 wires 0 m BATTERY_LINK -9 Cable, always-on AC feed, 2 wires 0 m AC_TO_PI_SUPPLY -10 Cable, battery-backed Pi power and power-loss signal, 3 wires 0 m X1201_TO_PI -11 Cable, micro HDMI to DVI cable / adapter, 1 wires shielded 0 m HDMI_TO_DVI -12 Cable, protected 5 V fan feed, 2 wires 0 m FUSE_BOX_TO_FAN -13 Cable, protected 5 V feed to MSD300-1, 2 wires 0 m FUSE_BOX_TO_MSD300 -14 Cable, protected 5 V feed to NV3210, 2 wires 0 m FUSE_BOX_TO_NV3210 -15 Cable, protected 5 V feed to UPS board, 2 wires 0 m FUSE_BOX_TO_X1201 -16 Cable, relay-switched AC output, 2 wires 0 m AC_RELAY_TO_DISPLAY_SUPPLY -17 Cable, start / stop button harness, 1 wires 0 m BUTTON_HARNESS -18 Cable, switched display AC feed, 2 wires 0 m AC_TO_RELAY -19 Connector, 120 V AC power input, 3-prong cable into the enclosure, 2 pins 1 AC_IN -20 Connector, APIELE push buttons, start and stop controls, 1 pins 1 BUTTONS -21 Connector, Blue Sea Systems 5025 fuse box, protected 5 V electronics branches, 12 pins 1 FUSE_BOX -22 Connector, Easycargo 30 mm fan, enclosure cooling, 2 pins 1 FAN -23 Connector, Geekworm X1201, battery backup for Raspberry Pi, 6 pins 1 X1201 -24 Connector, LCLCTC DIN rail solid-state relay, Pi-controlled display-power switch, 4 pins 1 RELAY -25 Connector, LED panels, panel stack / display face, 2 pins 1 PANELS -26 Connector, MEAN WELL LRS-150F-5, larger 5 V supply for display electronics, 4 pins 1 PSU_DISPLAY -27 Connector, MEAN WELL LRS-50-5, small 5 V supply for the controller side, 4 pins 1 PSU_PI -28 Connector, NovaStar MSD300-1, DVI sender, 4 pins 1 MSD300 -29 Connector, NovaStar NV3210, receiver card, 5 pins 1 NV3210 -30 Connector, Power inlet and breaker, fused shutoff for the control box, 4 pins 1 AC_PROTECT -31 Connector, Raspberry Pi 5, garden controller, 6 pins 1 RPI -32 Connector, Samsung 30Q cells, two 18650 backup batteries, 1 pins 1 BATTERIES -33 Ethernet cable from MSD300-1 to NV3210 1 MSD300_TO_NV3210 -34 Geekworm X1201 UPS HAT 1 X1201 -35 LED panel ribbon cables 2 RIBBON_TO_PANELS -36 MEAN WELL LRS-150F-5 5 V power supply 1 PSU_DISPLAY -37 MEAN WELL LRS-50-5 5 V power supply 1 PSU_PI -38 Micro HDMI to DVI adapter cable 1 HDMI_TO_DVI -39 NovaStar MSD300-1 sender 1 MSD300 -40 NovaStar NV3210 receiver 1 NV3210 -41 Samsung 30Q 18650 flat-top cell 2 BATTERIES +1 120 V AC three-prong cable 1 AC_IN +2 Adafruit AHT20 temperature/humidity sensor 1 AHT20_SENSOR +3 Blue Sea Systems 5025 fuse box 1 FUSE_BOX +4 Cable, AC L/N, 2 wires 0 m +5 Cable, AC to Pi PSU, 2 wires 0 m +6 Cable, AC to relay, 1 wires 0 m +7 Cable, AHT20 I2C, 4 wires 0 m +8 Cable, Ethernet cable, 1 wires 0 m MSD300_TO_NV3210 +9 Cable, HDMI to DVI, 1 wires shielded 0 m HDMI_TO_DVI +10 Cable, LED PSU neutral, 1 wires 0 m +11 Cable, PE ground, 1 wires 0 m +12 Cable, PE to LED PSU, 1 wires 0 m +13 Cable, PE to Pi PSU, 1 wires 0 m +14 Cable, Pi power + PLD, 3 wires 0 m +15 Cable, START harness, 2 wires 0 m +16 Cable, STOP harness, 2 wires 0 m +17 Cable, battery link, 1 wires 0 m +18 Cable, controller 5 V feed, 2 wires 0 m +19 Cable, fan 1 5 V, 2 wires 0 m +20 Cable, fan 2 5 V, 2 wires 0 m +21 Cable, fan 3 5 V, 2 wires 0 m +22 Cable, fan GPIO control, 2 wires 0 m +23 Cable, fused MSD300 5 V, 2 wires 0 m +24 Cable, fused NV3210 5 V, 2 wires 0 m +25 Cable, fused Pi 5 V, 2 wires 0 m +26 Cable, panel 1 5 V, 2 wires 0 m +27 Cable, panel 2 5 V, 2 wires 0 m +28 Cable, panel 3 5 V, 2 wires 0 m +29 Cable, panel 4 5 V, 2 wires 0 m +30 Cable, panel 5 5 V, 2 wires 0 m +31 Cable, panel 6 5 V, 2 wires 0 m +32 Cable, relay control, 2 wires 0 m +33 Cable, ribbon 1, 1 wires 0 m +34 Cable, ribbon 2, 1 wires 0 m +35 Cable, ribbon 3, 1 wires 0 m +36 Cable, ribbon 4, 1 wires 0 m +37 Cable, ribbon 5, 1 wires 0 m +38 Cable, ribbon 6, 1 wires 0 m +39 Cable, switched line, 1 wires 0 m +40 Connector, 120 V AC in, 3-prong cable, 3 pins 1 AC_IN +41 Connector, 30 mm fan, 1 of 3, 3 pins 1 FAN_1 +42 Connector, 30 mm fan, 2 of 3, 3 pins 1 FAN_2 +43 Connector, 30 mm fan, 3 of 3, 3 pins 1 FAN_3 +44 Connector, APIELE push button, START, 2 pins 1 START_BTN +45 Connector, APIELE push button, STOP, 2 pins 1 STOP_BTN +46 Connector, Adafruit AHT20, I2C enclosure sensor, 4 pins 1 AHT20_SENSOR +47 Connector, Blue Sea 5025, fused 5 V branches, 14 pins 1 FUSE_BOX +48 Connector, Fuse inlet, breaker, 6 pins 1 POWER_INLET +49 Connector, Geekworm X1201, UPS HAT, 6 pins 1 X1201 +50 Connector, Ground block, case bonded, 3 pins 1 GROUND_TERMINAL +51 Connector, LCLCTC SSR, LED PSU line switch, 4 pins 1 RELAY +52 Connector, LED panel, 1 of 6, 3 pins 1 PANEL_1 +53 Connector, LED panel, 2 of 6, 3 pins 1 PANEL_2 +54 Connector, LED panel, 3 of 6, 3 pins 1 PANEL_3 +55 Connector, LED panel, 4 of 6, 3 pins 1 PANEL_4 +56 Connector, LED panel, 5 of 6, 3 pins 1 PANEL_5 +57 Connector, LED panel, 6 of 6, 3 pins 1 PANEL_6 +58 Connector, MEAN WELL LRS-150F-5, switched LED 5 V, 15 pins 1 PSU_LED +59 Connector, MEAN WELL LRS-50-5, always-on 5 V, 5 pins 1 PSU_PI +60 Connector, NovaStar MSD300-1, sender, 4 pins 1 MSD300 +61 Connector, NovaStar NV3210, receiver, 9 pins 1 NV3210 +62 Connector, Raspberry Pi 5, controller, 16 pins 1 RPI +63 Connector, Samsung 30Q cells, 2x 18650, 1 pins 1 BATTERIES +64 Easycargo 30 mm fan 3 FAN_1, FAN_2, FAN_3 +65 Ethernet cable from MSD300-1 to NV3210 1 MSD300_TO_NV3210 +66 Fuse inlet and breaker 1 POWER_INLET +67 Geekworm X1201 UPS HAT 1 X1201 +68 Ground terminal block 1 GROUND_TERMINAL +69 LCLCTC DIN rail solid-state relay 1 RELAY +70 LED matrix panels 6 PANEL_1, PANEL_2, PANEL_3, PANEL_4, PANEL_5, PANEL_6 +71 LED panel 5 V power leads 6 LED_PSU_TO_PANEL_1, LED_PSU_TO_PANEL_2, LED_PSU_TO_PANEL_3, LED_PSU_TO_PANEL_4, LED_PSU_TO_PANEL_5, LED_PSU_TO_PANEL_6 +72 LED panel ribbon cables 6 RIBBON_TO_PANEL_1, RIBBON_TO_PANEL_2, RIBBON_TO_PANEL_3, RIBBON_TO_PANEL_4, RIBBON_TO_PANEL_5, RIBBON_TO_PANEL_6 +73 MEAN WELL LRS-150F-5 5 V LED-panel power supply 1 PSU_LED +74 MEAN WELL LRS-50-5 5 V controller power supply 1 PSU_PI +75 Micro HDMI to DVI adapter cable 1 HDMI_TO_DVI +76 NovaStar MSD300-1 sender 1 MSD300 +77 NovaStar NV3210 receiver 1 NV3210 +78 Pi GPIO fan-control harness 1 FAN_CONTROL_HARNESS +79 Protected 5 V fan power leads 3 FUSE_BOX_TO_FAN_1, FUSE_BOX_TO_FAN_2, FUSE_BOX_TO_FAN_3 +80 START button 1 START_BTN +81 STOP button 1 STOP_BTN +82 Samsung 30Q 18650 flat-top cell 2 BATTERIES diff --git a/docs/wiring/out/conway-garden-client-overview.gv b/docs/wiring/out/conway-garden-client-overview.gv new file mode 100644 index 0000000..66892ef --- /dev/null +++ b/docs/wiring/out/conway-garden-client-overview.gv @@ -0,0 +1,3179 @@ +graph { +// Graph generated by WireViz 0.4.1 +// https://github.com/wireviz/WireViz + graph [bgcolor="#FFFFFF" fontname="DejaVu Sans" nodesep=0.18 rankdir=LR ranksep=0.85] + node [fillcolor="#FFFFFF" fontname="DejaVu Sans" height=0 margin=0 shape=none style=filled width=0] + edge [fontname="DejaVu Sans" style=bold] + AC_IN [label=< + + + + + +
+ + +
AC_IN
+
+ + + + +
120 V AC in3-prong cable3-pin
+
+ + + + + + + + + + + + + +
LINE1
NEUTRAL2
GROUND3
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + POWER_INLET [label=< + + + + + +
+ + +
POWER_INLET
+
+ + + + +
Fuse inletbreaker6-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1L_IN1
2N_IN2
3L_PI3
4N_PI4
5L_RELAY5
6N_LED6
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + POWER_INLET:p1l:w -- POWER_INLET:p3l:w [label=" "] + POWER_INLET:p2l:w -- POWER_INLET:p4l:w [label=" "] + POWER_INLET:p1l:w -- POWER_INLET:p5l:w [label=" "] + POWER_INLET:p2l:w -- POWER_INLET:p6l:w [label=" "] + GROUND_TERMINAL [label=< + + + + + +
+ + +
GROUND_TERMINAL
+
+ + + + +
Ground blockcase bonded3-pin
+
+ + + + + + + + + + + + + + + + +
1G_IN1
2G_PI2
3G_LED3
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + GROUND_TERMINAL:p1l:w -- GROUND_TERMINAL:p2l:w [label=" "] + GROUND_TERMINAL:p1l:w -- GROUND_TERMINAL:p3l:w [label=" "] + PSU_PI [label=< + + + + + +
+ + +
PSU_PI
+
+ + + + +
MEAN WELL LRS-50-5always-on 5 V5-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
1L1
2N2
3PE3
4+5V4
5GND5
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + RELAY [label=< + + + + + +
+ + +
RELAY
+
+ + + + +
LCLCTC SSRLED PSU line switch4-pin
+
+ + + + + + + + + + + + + + + + + + + + + +
1L_IN1
2L_OUT2
3CTRL3
4GND4
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PSU_LED [label=< + + + + + +
+ + +
PSU_LED
+
+ + + + +
MEAN WELL LRS-150F-5switched LED 5 V15-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1L1
2N2
3PE3
4P1_5V4
5P1_GND5
6P2_5V6
7P2_GND7
8P3_5V8
9P3_GND9
10P4_5V10
11P4_GND11
12P5_5V12
13P5_GND13
14P6_5V14
15P6_GND15
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + FUSE_BOX [label=< + + + + + +
+ + +
FUSE_BOX
+
+ + + + +
Blue Sea 5025fused 5 V branches14-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
15V_IN1
2GND2
3X1201_5V3
4X1201_G4
5MSD_5V5
6MSD_G6
7NV_5V7
8NV_G8
9F1_5V9
10F1_G10
11F2_5V11
12F2_G12
13F3_5V13
14F3_G14
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + edge [color="#000000:#ffffff:#000000"] + FUSE_BOX:p1l:w -- FUSE_BOX:p3l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p4l:w [label=" "] + FUSE_BOX:p1l:w -- FUSE_BOX:p5l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p6l:w [label=" "] + FUSE_BOX:p1l:w -- FUSE_BOX:p7l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p8l:w [label=" "] + FUSE_BOX:p1l:w -- FUSE_BOX:p9l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p10l:w [label=" "] + FUSE_BOX:p1l:w -- FUSE_BOX:p11l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p12l:w [label=" "] + FUSE_BOX:p1l:w -- FUSE_BOX:p13l:w [label=" "] + FUSE_BOX:p2l:w -- FUSE_BOX:p14l:w [label=" "] + X1201 [label=< + + + + + +
+ + +
X1201
+
+ + + + +
Geekworm X1201UPS HAT6-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
15V1
2GND2
3PI_5V3
4PI_GND4
5PLD5
6BATT6
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + RPI [label=< + + + + + +
+ + +
RPI
+
+ + + + +
Raspberry Pi 5controller16-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
15V1
2GND2
3PLD3
4START4
5START_GND5
6STOP6
7STOP_GND7
8RELAY8
9CTRL_GND9
10HDMI10
11AHT_3V311
12AHT_GND12
13SDA13
14SCL14
15FAN_EN15
16FAN_GND16
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + BATTERIES [label=< + + + + + +
+ + +
BATTERIES
+
+ + + + +
Samsung 30Q cells2x 186501-pin
+
+ + + + + +
PAIR1
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + START_BTN [label=< + + + + + +
+ + +
START_BTN
+
+ + + + +
APIELE push buttonSTART2-pin
+
+ + + + + + + + + +
1SIGNAL
2GND
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + STOP_BTN [label=< + + + + + +
+ + +
STOP_BTN
+
+ + + + +
APIELE push buttonSTOP2-pin
+
+ + + + + + + + + +
1SIGNAL
2GND
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + AHT20_SENSOR [label=< + + + + + +
+ + +
AHT20_SENSOR
+
+ + + + +
Adafruit AHT20I2C enclosure sensor4-pin
+
+ + + + + + + + + + + + + + + + + +
1VIN
2GND
3SDA
4SCL
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + MSD300 [label=< + + + + + +
+ + +
MSD300
+
+ + + + +
NovaStar MSD300-1sender4-pin
+
+ + + + + + + + + + + + + + + + + + + + + +
1DVI1
25V2
3GND3
4ETH4
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + NV3210 [label=< + + + + + +
+ + +
NV3210
+
+ + + + +
NovaStar NV3210receiver9-pin
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1ETH1
25V2
3GND3
4R14
5R25
6R36
7R47
8R58
9R69
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + FAN_1 [label=< + + + + + +
+ + +
FAN_1
+
+ + + + +
30 mm fan1 of 33-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3CTRL
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + FAN_2 [label=< + + + + + +
+ + +
FAN_2
+
+ + + + +
30 mm fan2 of 33-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3CTRL
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + FAN_3 [label=< + + + + + +
+ + +
FAN_3
+
+ + + + +
30 mm fan3 of 33-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3CTRL
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_1 [label=< + + + + + +
+ + +
PANEL_1
+
+ + + + +
LED panel1 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_2 [label=< + + + + + +
+ + +
PANEL_2
+
+ + + + +
LED panel2 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_3 [label=< + + + + + +
+ + +
PANEL_3
+
+ + + + +
LED panel3 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_4 [label=< + + + + + +
+ + +
PANEL_4
+
+ + + + +
LED panel4 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_5 [label=< + + + + + +
+ + +
PANEL_5
+
+ + + + +
LED panel5 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + PANEL_6 [label=< + + + + + +
+ + +
PANEL_6
+
+ + + + +
LED panel6 of 63-pin
+
+ + + + + + + + + + + + + +
15V
2GND
3RIBBON
+
+ + +
+ + +
+
+
+> fillcolor="#F8FAFC" shape=box style=filled] + edge [color="#000000:#895956:#895956:#895956:#000000"] + AC_IN:p1r:e -- AC_LINE_NEUTRAL:w1:w + AC_LINE_NEUTRAL:w1:e -- POWER_INLET:p1l:w + edge [color="#000000:#0066ff:#0066ff:#0066ff:#000000"] + AC_IN:p2r:e -- AC_LINE_NEUTRAL:w2:w + AC_LINE_NEUTRAL:w2:e -- POWER_INLET:p2l:w + AC_LINE_NEUTRAL [label=< + + + +
+ + + +
AC L/N2x
+
+ + + + + + + + + + + + + + + + + + + +
 
AC_IN:1:LINE + 1:BN:L + POWER_INLET:1:L_IN
+ + + + + + +
+
AC_IN:2:NEUTRAL + 2:BU:N + POWER_INLET:2:N_IN
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#00ff00:#ffff00:#00ff00:#000000"] + AC_IN:p3r:e -- AC_GROUND:w1:w + AC_GROUND:w1:e -- GROUND_TERMINAL:p1l:w + AC_GROUND [label=< + + + +
+ + + +
PE ground1x
+
+ + + + + + + + + + + +
 
AC_IN:3:GROUND + 1:GNYE:PE + GROUND_TERMINAL:1:G_IN
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#895956:#895956:#895956:#000000"] + POWER_INLET:p3r:e -- AC_TO_PI_PSU:w1:w + AC_TO_PI_PSU:w1:e -- PSU_PI:p1l:w + edge [color="#000000:#0066ff:#0066ff:#0066ff:#000000"] + POWER_INLET:p4r:e -- AC_TO_PI_PSU:w2:w + AC_TO_PI_PSU:w2:e -- PSU_PI:p2l:w + AC_TO_PI_PSU [label=< + + + +
+ + + +
AC to Pi PSU2x
+
+ + + + + + + + + + + + + + + + + + + +
 
POWER_INLET:3:L_PI + 1:BN:L + PSU_PI:1:L
+ + + + + + +
+
POWER_INLET:4:N_PI + 2:BU:N + PSU_PI:2:N
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#00ff00:#ffff00:#00ff00:#000000"] + GROUND_TERMINAL:p2r:e -- GROUND_TO_PI_PSU:w1:w + GROUND_TO_PI_PSU:w1:e -- PSU_PI:p3l:w + GROUND_TO_PI_PSU [label=< + + + +
+ + + +
PE to Pi PSU1x
+
+ + + + + + + + + + + +
 
GROUND_TERMINAL:2:G_PI + 1:GNYE:PE + PSU_PI:3:PE
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#895956:#895956:#895956:#000000"] + POWER_INLET:p5r:e -- AC_TO_RELAY:w1:w + AC_TO_RELAY:w1:e -- RELAY:p1l:w + AC_TO_RELAY [label=< + + + +
+ + + +
AC to relay1x
+
+ + + + + + + + + + + +
 
POWER_INLET:5:L_RELAY + 1:BN:L + RELAY:1:L_IN
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#895956:#895956:#895956:#000000"] + RELAY:p2r:e -- RELAY_TO_LED_PSU:w1:w + RELAY_TO_LED_PSU:w1:e -- PSU_LED:p1l:w + RELAY_TO_LED_PSU [label=< + + + +
+ + + +
switched line1x
+
+ + + + + + + + + + + +
 
RELAY:2:L_OUT + 1:BN:L_SW + PSU_LED:1:L
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#0066ff:#0066ff:#0066ff:#000000"] + POWER_INLET:p6r:e -- NEUTRAL_TO_LED_PSU:w1:w + NEUTRAL_TO_LED_PSU:w1:e -- PSU_LED:p2l:w + NEUTRAL_TO_LED_PSU [label=< + + + +
+ + + +
LED PSU neutral1x
+
+ + + + + + + + + + + +
 
POWER_INLET:6:N_LED + 1:BU:N + PSU_LED:2:N
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#00ff00:#ffff00:#00ff00:#000000"] + GROUND_TERMINAL:p3r:e -- GROUND_TO_LED_PSU:w1:w + GROUND_TO_LED_PSU:w1:e -- PSU_LED:p3l:w + GROUND_TO_LED_PSU [label=< + + + +
+ + + +
PE to LED PSU1x
+
+ + + + + + + + + + + +
 
GROUND_TERMINAL:3:G_LED + 1:GNYE:PE + PSU_LED:3:PE
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_PI:p4r:e -- PI_PSU_TO_FUSE_BOX:w1:w + PI_PSU_TO_FUSE_BOX:w1:e -- FUSE_BOX:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_PI:p5r:e -- PI_PSU_TO_FUSE_BOX:w2:w + PI_PSU_TO_FUSE_BOX:w2:e -- FUSE_BOX:p2l:w + PI_PSU_TO_FUSE_BOX [label=< + + + +
+ + + +
controller 5 V feed2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_PI:4:+5V + 1:RD:+5V + FUSE_BOX:1:5V_IN
+ + + + + + +
+
PSU_PI:5:GND + 2:BK:GND + FUSE_BOX:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p3r:e -- FUSE_BOX_TO_X1201:w1:w + FUSE_BOX_TO_X1201:w1:e -- X1201:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p4r:e -- FUSE_BOX_TO_X1201:w2:w + FUSE_BOX_TO_X1201:w2:e -- X1201:p2l:w + FUSE_BOX_TO_X1201 [label=< + + + +
+ + + +
fused Pi 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:3:X1201_5V + 1:RD:+5V + X1201:1:5V
+ + + + + + +
+
FUSE_BOX:4:X1201_G + 2:BK:GND + X1201:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + X1201:p3r:e -- X1201_TO_PI:w1:w + X1201_TO_PI:w1:e -- RPI:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + X1201:p4r:e -- X1201_TO_PI:w2:w + X1201_TO_PI:w2:e -- RPI:p2l:w + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + X1201:p5r:e -- X1201_TO_PI:w3:w + X1201_TO_PI:w3:e -- RPI:p3l:w + X1201_TO_PI [label=< + + + +
+ + + +
Pi power + PLD3x
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
X1201:3:PI_5V + 1:RD:+5V + RPI:1:5V
+ + + + + + +
+
X1201:4:PI_GND + 2:BK:GND + RPI:2:GND
+ + + + + + +
+
X1201:5:PLD + 3:YE:PLD + RPI:3:PLD
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff66cc:#ff66cc:#ff66cc:#000000"] + BATTERIES:p1r:e -- BATTERY_LINK:w1:w + BATTERY_LINK:w1:e -- X1201:p6l:w + BATTERY_LINK [label=< + + + +
+ + + +
battery link1x
+
+ + + + + + + + + + + +
 
BATTERIES:1:PAIR + 1:PK:BATT + X1201:6:BATT
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#00ff00:#00ff00:#00ff00:#000000"] + RPI:p4r:e -- START_BUTTON_HARNESS:w1:w + START_BUTTON_HARNESS:w1:e -- START_BTN:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p5r:e -- START_BUTTON_HARNESS:w2:w + START_BUTTON_HARNESS:w2:e -- START_BTN:p2l:w + START_BUTTON_HARNESS [label=< + + + +
+ + + +
START harness2x
+
+ + + + + + + + + + + + + + + + + + + +
 
RPI:4:START + 1:GN:SIG + START_BTN:1:SIGNAL
+ + + + + + +
+
RPI:5:START_GND + 2:BK:GND + START_BTN:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffffff:#ffffff:#ffffff:#000000"] + RPI:p6r:e -- STOP_BUTTON_HARNESS:w1:w + STOP_BUTTON_HARNESS:w1:e -- STOP_BTN:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p7r:e -- STOP_BUTTON_HARNESS:w2:w + STOP_BUTTON_HARNESS:w2:e -- STOP_BTN:p2l:w + STOP_BUTTON_HARNESS [label=< + + + +
+ + + +
STOP harness2x
+
+ + + + + + + + + + + + + + + + + + + +
 
RPI:6:STOP + 1:WH:SIG + STOP_BTN:1:SIGNAL
+ + + + + + +
+
RPI:7:STOP_GND + 2:BK:GND + STOP_BTN:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + RPI:p8r:e -- RELAY_CONTROL:w1:w + RELAY_CONTROL:w1:e -- RELAY:p3l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p9r:e -- RELAY_CONTROL:w2:w + RELAY_CONTROL:w2:e -- RELAY:p4l:w + RELAY_CONTROL [label=< + + + +
+ + + +
relay control2x
+
+ + + + + + + + + + + + + + + + + + + +
 
RPI:8:RELAY + 1:YE:CTRL + RELAY:3:CTRL
+ + + + + + +
+
RPI:9:CTRL_GND + 2:BK:GND + RELAY:4:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + RPI:p11r:e -- AHT20_I2C:w1:w + AHT20_I2C:w1:e -- AHT20_SENSOR:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p12r:e -- AHT20_I2C:w2:w + AHT20_I2C:w2:e -- AHT20_SENSOR:p2l:w + edge [color="#000000:#00ff00:#00ff00:#00ff00:#000000"] + RPI:p13r:e -- AHT20_I2C:w3:w + AHT20_I2C:w3:e -- AHT20_SENSOR:p3l:w + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + RPI:p14r:e -- AHT20_I2C:w4:w + AHT20_I2C:w4:e -- AHT20_SENSOR:p4l:w + AHT20_I2C [label=< + + + +
+ + + +
AHT20 I2C4x
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
RPI:11:AHT_3V3 + 1:RD:3V3 + AHT20_SENSOR:1:VIN
+ + + + + + +
+
RPI:12:AHT_GND + 2:BK:GND + AHT20_SENSOR:2:GND
+ + + + + + +
+
RPI:13:SDA + 3:GN:SDA + AHT20_SENSOR:3:SDA
+ + + + + + +
+
RPI:14:SCL + 4:YE:SCL + AHT20_SENSOR:4:SCL
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p5r:e -- FUSE_BOX_TO_MSD300:w1:w + FUSE_BOX_TO_MSD300:w1:e -- MSD300:p2l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p6r:e -- FUSE_BOX_TO_MSD300:w2:w + FUSE_BOX_TO_MSD300:w2:e -- MSD300:p3l:w + FUSE_BOX_TO_MSD300 [label=< + + + +
+ + + +
fused MSD300 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:5:MSD_5V + 1:RD:+5V + MSD300:2:5V
+ + + + + + +
+
FUSE_BOX:6:MSD_G + 2:BK:GND + MSD300:3:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p7r:e -- FUSE_BOX_TO_NV3210:w1:w + FUSE_BOX_TO_NV3210:w1:e -- NV3210:p2l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p8r:e -- FUSE_BOX_TO_NV3210:w2:w + FUSE_BOX_TO_NV3210:w2:e -- NV3210:p3l:w + FUSE_BOX_TO_NV3210 [label=< + + + +
+ + + +
fused NV3210 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:7:NV_5V + 1:RD:+5V + NV3210:2:5V
+ + + + + + +
+
FUSE_BOX:8:NV_G + 2:BK:GND + NV3210:3:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p9r:e -- FUSE_BOX_TO_FAN_1:w1:w + FUSE_BOX_TO_FAN_1:w1:e -- FAN_1:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p10r:e -- FUSE_BOX_TO_FAN_1:w2:w + FUSE_BOX_TO_FAN_1:w2:e -- FAN_1:p2l:w + FUSE_BOX_TO_FAN_1 [label=< + + + +
+ + + +
fan 1 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:9:F1_5V + 1:RD:+5V + FAN_1:1:5V
+ + + + + + +
+
FUSE_BOX:10:F1_G + 2:BK:GND + FAN_1:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p11r:e -- FUSE_BOX_TO_FAN_2:w1:w + FUSE_BOX_TO_FAN_2:w1:e -- FAN_2:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p12r:e -- FUSE_BOX_TO_FAN_2:w2:w + FUSE_BOX_TO_FAN_2:w2:e -- FAN_2:p2l:w + FUSE_BOX_TO_FAN_2 [label=< + + + +
+ + + +
fan 2 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:11:F2_5V + 1:RD:+5V + FAN_2:1:5V
+ + + + + + +
+
FUSE_BOX:12:F2_G + 2:BK:GND + FAN_2:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + FUSE_BOX:p13r:e -- FUSE_BOX_TO_FAN_3:w1:w + FUSE_BOX_TO_FAN_3:w1:e -- FAN_3:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + FUSE_BOX:p14r:e -- FUSE_BOX_TO_FAN_3:w2:w + FUSE_BOX_TO_FAN_3:w2:e -- FAN_3:p2l:w + FUSE_BOX_TO_FAN_3 [label=< + + + +
+ + + +
fan 3 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
FUSE_BOX:13:F3_5V + 1:RD:+5V + FAN_3:1:5V
+ + + + + + +
+
FUSE_BOX:14:F3_G + 2:BK:GND + FAN_3:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + RPI:p15r:e -- FAN_CONTROL_HARNESS:w1:w + FAN_CONTROL_HARNESS:w1:e -- FAN_1:p3l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p16r:e -- FAN_CONTROL_HARNESS:w2:w + FAN_CONTROL_HARNESS:w2:e -- FAN_1:p2l:w + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + RPI:p15r:e -- FAN_CONTROL_HARNESS:w1:w + FAN_CONTROL_HARNESS:w1:e -- FAN_2:p3l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p16r:e -- FAN_CONTROL_HARNESS:w2:w + FAN_CONTROL_HARNESS:w2:e -- FAN_2:p2l:w + edge [color="#000000:#ffff00:#ffff00:#ffff00:#000000"] + RPI:p15r:e -- FAN_CONTROL_HARNESS:w1:w + FAN_CONTROL_HARNESS:w1:e -- FAN_3:p3l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p16r:e -- FAN_CONTROL_HARNESS:w2:w + FAN_CONTROL_HARNESS:w2:e -- FAN_3:p2l:w + FAN_CONTROL_HARNESS [label=< + + + +
+ + + +
fan GPIO control2x
+
+ + + + + + + + + + + + + + + + + + + +
 
RPI:15:FAN_EN + 1:YE:EN + FAN_1:3:CTRL
+ + + + + + +
+
RPI:16:FAN_GND + 2:BK:GND + FAN_1:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p4r:e -- LED_PSU_TO_PANEL_1:w1:w + LED_PSU_TO_PANEL_1:w1:e -- PANEL_1:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p5r:e -- LED_PSU_TO_PANEL_1:w2:w + LED_PSU_TO_PANEL_1:w2:e -- PANEL_1:p2l:w + LED_PSU_TO_PANEL_1 [label=< + + + +
+ + + +
panel 1 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:4:P1_5V + 1:RD:+5V + PANEL_1:1:5V
+ + + + + + +
+
PSU_LED:5:P1_GND + 2:BK:GND + PANEL_1:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p6r:e -- LED_PSU_TO_PANEL_2:w1:w + LED_PSU_TO_PANEL_2:w1:e -- PANEL_2:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p7r:e -- LED_PSU_TO_PANEL_2:w2:w + LED_PSU_TO_PANEL_2:w2:e -- PANEL_2:p2l:w + LED_PSU_TO_PANEL_2 [label=< + + + +
+ + + +
panel 2 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:6:P2_5V + 1:RD:+5V + PANEL_2:1:5V
+ + + + + + +
+
PSU_LED:7:P2_GND + 2:BK:GND + PANEL_2:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p8r:e -- LED_PSU_TO_PANEL_3:w1:w + LED_PSU_TO_PANEL_3:w1:e -- PANEL_3:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p9r:e -- LED_PSU_TO_PANEL_3:w2:w + LED_PSU_TO_PANEL_3:w2:e -- PANEL_3:p2l:w + LED_PSU_TO_PANEL_3 [label=< + + + +
+ + + +
panel 3 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:8:P3_5V + 1:RD:+5V + PANEL_3:1:5V
+ + + + + + +
+
PSU_LED:9:P3_GND + 2:BK:GND + PANEL_3:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p10r:e -- LED_PSU_TO_PANEL_4:w1:w + LED_PSU_TO_PANEL_4:w1:e -- PANEL_4:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p11r:e -- LED_PSU_TO_PANEL_4:w2:w + LED_PSU_TO_PANEL_4:w2:e -- PANEL_4:p2l:w + LED_PSU_TO_PANEL_4 [label=< + + + +
+ + + +
panel 4 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:10:P4_5V + 1:RD:+5V + PANEL_4:1:5V
+ + + + + + +
+
PSU_LED:11:P4_GND + 2:BK:GND + PANEL_4:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p12r:e -- LED_PSU_TO_PANEL_5:w1:w + LED_PSU_TO_PANEL_5:w1:e -- PANEL_5:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p13r:e -- LED_PSU_TO_PANEL_5:w2:w + LED_PSU_TO_PANEL_5:w2:e -- PANEL_5:p2l:w + LED_PSU_TO_PANEL_5 [label=< + + + +
+ + + +
panel 5 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:12:P5_5V + 1:RD:+5V + PANEL_5:1:5V
+ + + + + + +
+
PSU_LED:13:P5_GND + 2:BK:GND + PANEL_5:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#ff0000:#ff0000:#ff0000:#000000"] + PSU_LED:p14r:e -- LED_PSU_TO_PANEL_6:w1:w + LED_PSU_TO_PANEL_6:w1:e -- PANEL_6:p1l:w + edge [color="#000000:#000000:#000000:#000000:#000000"] + PSU_LED:p15r:e -- LED_PSU_TO_PANEL_6:w2:w + LED_PSU_TO_PANEL_6:w2:e -- PANEL_6:p2l:w + LED_PSU_TO_PANEL_6 [label=< + + + +
+ + + +
panel 6 5 V2x
+
+ + + + + + + + + + + + + + + + + + + +
 
PSU_LED:14:P6_5V + 1:RD:+5V + PANEL_6:1:5V
+ + + + + + +
+
PSU_LED:15:P6_GND + 2:BK:GND + PANEL_6:2:GND
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#000000:#000000:#000000:#000000"] + RPI:p10r:e -- HDMI_TO_DVI:w1:w + HDMI_TO_DVI:w1:e -- MSD300:p1l:w + HDMI_TO_DVI [label=< + + + + + +
+ + +
HDMI_TO_DVI
+
+ + + + +
HDMI to DVI1x+ S
+
+ + + + + + + + + + + + + + + + + + +
 
RPI:10:HDMI + 1:BK:video + MSD300:1:DVI
+ + + + + + +
+
 
Shield
 
+
+ + +
+ + +
+
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#0066ff:#0066ff:#0066ff:#000000"] + MSD300:p4r:e -- MSD300_TO_NV3210:w1:w + MSD300_TO_NV3210:w1:e -- NV3210:p1l:w + MSD300_TO_NV3210 [label=< + + + + + + +
+ + +
MSD300_TO_NV3210
+
+ + + +
Ethernet cable1x
+
+ + + + + + + + + + + +
 
MSD300:4:ETH + 1:BU:novastar_data + NV3210:1:ETH
+ + + + + + +
+
 
+
+ + +
+ + +
+
+
+ + +
One complete cable; pairs not broken out.
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p4r:e -- RIBBON_TO_PANEL_1:w1:w + RIBBON_TO_PANEL_1:w1:e -- PANEL_1:p3l:w + RIBBON_TO_PANEL_1 [label=< + + + +
+ + + +
ribbon 11x
+
+ + + + + + + + + + + +
 
NV3210:4:R1 + 1:GY:data + PANEL_1:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p5r:e -- RIBBON_TO_PANEL_2:w1:w + RIBBON_TO_PANEL_2:w1:e -- PANEL_2:p3l:w + RIBBON_TO_PANEL_2 [label=< + + + +
+ + + +
ribbon 21x
+
+ + + + + + + + + + + +
 
NV3210:5:R2 + 1:GY:data + PANEL_2:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p6r:e -- RIBBON_TO_PANEL_3:w1:w + RIBBON_TO_PANEL_3:w1:e -- PANEL_3:p3l:w + RIBBON_TO_PANEL_3 [label=< + + + +
+ + + +
ribbon 31x
+
+ + + + + + + + + + + +
 
NV3210:6:R3 + 1:GY:data + PANEL_3:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p7r:e -- RIBBON_TO_PANEL_4:w1:w + RIBBON_TO_PANEL_4:w1:e -- PANEL_4:p3l:w + RIBBON_TO_PANEL_4 [label=< + + + +
+ + + +
ribbon 41x
+
+ + + + + + + + + + + +
 
NV3210:7:R4 + 1:GY:data + PANEL_4:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p8r:e -- RIBBON_TO_PANEL_5:w1:w + RIBBON_TO_PANEL_5:w1:e -- PANEL_5:p3l:w + RIBBON_TO_PANEL_5 [label=< + + + +
+ + + +
ribbon 51x
+
+ + + + + + + + + + + +
 
NV3210:8:R5 + 1:GY:data + PANEL_5:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] + edge [color="#000000:#999999:#999999:#999999:#000000"] + NV3210:p9r:e -- RIBBON_TO_PANEL_6:w1:w + RIBBON_TO_PANEL_6:w1:e -- PANEL_6:p3l:w + RIBBON_TO_PANEL_6 [label=< + + + +
+ + + +
ribbon 61x
+
+ + + + + + + + + + + +
 
NV3210:9:R6 + 1:GY:data + PANEL_6:3:RIBBON
+ + + + + + +
+
 
+
+> fillcolor="#FFFFFF" shape=box style=filled] +} diff --git a/docs/wiring/out/conway-garden-client-overview.html b/docs/wiring/out/conway-garden-client-overview.html index 6ae4828..1729a03 100644 --- a/docs/wiring/out/conway-garden-client-overview.html +++ b/docs/wiring/out/conway-garden-client-overview.html @@ -2,7 +2,7 @@ - Conway Garden Control Box - Simplified Client Overview + Conway Garden Control Box - Client WireViz Source -

Conway Garden Control Box - Simplified Client Overview

+

Conway Garden Control Box - Client WireViz Source

Diagram

@@ -33,1596 +33,3205 @@

Diagram

- - + + %3 - + AC_IN - - -AC_IN - -120 V AC power input - -3-prong cable into the enclosure - -2-pin - -POWER_IN - -1 - -GROUND_BOND - -2 - -Wall power enters the box through the fused inlet / breaker assembly. - - - -AC_CABLE - - -AC_CABLE - -120 V AC input - -2x -  -AC_IN:1:POWER_IN -     1:BN:wall_power     -AC_PROTECT:1:POWER_IN - - - - - -AC_IN:2:GROUND_BOND -     2:GNYE:safety_ground     -AC_PROTECT:2:GROUND_BOND - - - - - -  - - - -AC_IN:e--AC_CABLE:w - - - - - - - - -AC_IN:e--AC_CABLE:w - - - - - - - + + +AC_IN + +120 V AC in + +3-prong cable + +3-pin + +LINE + +1 + +NEUTRAL + +2 + +GROUND + +3 + + + + + +AC_LINE_NEUTRAL + + +AC L/N + +2x +  +AC_IN:1:LINE +     1:BN:L     +POWER_INLET:1:L_IN + + + + + +AC_IN:2:NEUTRAL +     2:BU:N     +POWER_INLET:2:N_IN + + + + + +  + + + +AC_IN:e--AC_LINE_NEUTRAL:w + + + + + + + + +AC_IN:e--AC_LINE_NEUTRAL:w + + + + + + + + +AC_GROUND + + +PE ground + +1x +  +AC_IN:3:GROUND +     1:GNYE:PE     +GROUND_TERMINAL:1:G_IN + + + + + +  + + + +AC_IN:e--AC_GROUND:w + + + + + + + -AC_PROTECT - - -AC_PROTECT - -Power inlet and breaker - -fused shutoff for the control box - -4-pin - -1 - -POWER_IN - -1 - -2 - -GROUND_BOND - -2 - -3 - -ALWAYS_ON_AC - -3 - -4 - -SWITCHED_AC_FEED - -4 - -Simplified as one client-facing protection block. - - - -AC_TO_PI_SUPPLY - - -AC_TO_PI_SUPPLY - -always-on AC feed - -2x -  -AC_PROTECT:3:ALWAYS_ON_AC -     1:BN:always_on_power     -PSU_PI:1:AC_IN - - - - - -AC_PROTECT:2:GROUND_BOND -     2:GNYE:safety_ground     -PSU_PI:2:GROUND - - - - - -  - - - -AC_PROTECT:e--AC_TO_PI_SUPPLY:w - - - - - - - - -AC_PROTECT:e--AC_TO_PI_SUPPLY:w - - - - - +POWER_INLET + + +POWER_INLET + +Fuse inlet + +breaker + +6-pin + +1 + +L_IN + +1 + +2 + +N_IN + +2 + +3 + +L_PI + +3 + +4 + +N_PI + +4 + +5 + +L_RELAY + +5 + +6 + +N_LED + +6 + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +AC_TO_PI_PSU + + +AC to Pi PSU + +2x +  +POWER_INLET:3:L_PI +     1:BN:L     +PSU_PI:1:L + + + + + +POWER_INLET:4:N_PI +     2:BU:N     +PSU_PI:2:N + + + + + +  + + + +POWER_INLET:e--AC_TO_PI_PSU:w + + + + + + + + +POWER_INLET:e--AC_TO_PI_PSU:w + + + + + - + AC_TO_RELAY - - -AC_TO_RELAY - -switched display AC feed - -2x -  -AC_PROTECT:4:SWITCHED_AC_FEED -     1:BN:display_power_feed     -RELAY:1:AC_IN - - - - - -AC_PROTECT:2:GROUND_BOND -     2:GNYE:safety_ground     -RELAY:3:GROUND_PASS - - - - - -  - - - -AC_PROTECT:e--AC_TO_RELAY:w - - - - - - - - -AC_PROTECT:e--AC_TO_RELAY:w - - - - - + + +AC to relay + +1x +  +POWER_INLET:5:L_RELAY +     1:BN:L     +RELAY:1:L_IN + + + + + +  + + + +POWER_INLET:e--AC_TO_RELAY:w + + + + + + + + +NEUTRAL_TO_LED_PSU + + +LED PSU neutral + +1x +  +POWER_INLET:6:N_LED +     1:BU:N     +PSU_LED:2:N + + + + + +  + + + +POWER_INLET:e--NEUTRAL_TO_LED_PSU:w + + + + + + + + +GROUND_TERMINAL + + +GROUND_TERMINAL + +Ground block + +case bonded + +3-pin + +1 + +G_IN + +1 + +2 + +G_PI + +2 + +3 + +G_LED + +3 + + + + + +GROUND_TERMINAL:w--GROUND_TERMINAL:w + + + + + + + +GROUND_TERMINAL:w--GROUND_TERMINAL:w + + + + + + + +GROUND_TO_PI_PSU + + +PE to Pi PSU + +1x +  +GROUND_TERMINAL:2:G_PI +     1:GNYE:PE     +PSU_PI:3:PE + + + + + +  + + + +GROUND_TERMINAL:e--GROUND_TO_PI_PSU:w + + + + + + + + +GROUND_TO_LED_PSU + + +PE to LED PSU + +1x +  +GROUND_TERMINAL:3:G_LED +     1:GNYE:PE     +PSU_LED:3:PE + + + + + +  + + + +GROUND_TERMINAL:e--GROUND_TO_LED_PSU:w + + + + + - + PSU_PI - - -PSU_PI - -MEAN WELL LRS-50-5 - -small 5 V supply for the controller side - -4-pin - -1 - -AC_IN - -1 - -2 - -GROUND - -2 - -3 - -5V_OUT - -3 - -4 - -GND_OUT - -4 - - - -PI_SUPPLY_TO_FUSE_BOX - - -PI_SUPPLY_TO_FUSE_BOX - -5 V controller feed into fuse box - -2x -  -PSU_PI:3:5V_OUT -     1:RD:controller_5V     -FUSE_BOX:1:PI_5V_IN - - - - - -PSU_PI:4:GND_OUT -     2:BK:controller_ground     -FUSE_BOX:2:PI_GND_IN - - - - - -  - - - -PSU_PI:e--PI_SUPPLY_TO_FUSE_BOX:w - - - - - - - - -PSU_PI:e--PI_SUPPLY_TO_FUSE_BOX:w - - - - - + + +PSU_PI + +MEAN WELL LRS-50-5 + +always-on 5 V + +5-pin + +1 + +L + +1 + +2 + +N + +2 + +3 + +PE + +3 + +4 + ++5V + +4 + +5 + +GND + +5 + + + + + +PI_PSU_TO_FUSE_BOX + + +controller 5 V feed + +2x +  +PSU_PI:4:+5V +     1:RD:+5V     +FUSE_BOX:1:5V_IN + + + + + +PSU_PI:5:GND +     2:BK:GND     +FUSE_BOX:2:GND + + + + + +  + + + +PSU_PI:e--PI_PSU_TO_FUSE_BOX:w + + + + + + + + +PSU_PI:e--PI_PSU_TO_FUSE_BOX:w + + + + + - -RELAY - - -RELAY - -LCLCTC DIN rail solid-state relay - -Pi-controlled display-power switch - -4-pin - -1 - -AC_IN - -1 - -2 - -AC_OUT - -2 - -3 - -GROUND_PASS - -3 - -4 - -CTRL_IN - -4 - - - -AC_RELAY_TO_DISPLAY_SUPPLY - - -AC_RELAY_TO_DISPLAY_SUPPLY - -relay-switched AC output - -2x -  -RELAY:2:AC_OUT -     1:BN:switched_power     -PSU_DISPLAY:1:AC_IN - - - - - -RELAY:3:GROUND_PASS -     2:GNYE:safety_ground     -PSU_DISPLAY:2:GROUND - - - - - -  - - - -RELAY:e--AC_RELAY_TO_DISPLAY_SUPPLY:w - - - - - - - - -RELAY:e--AC_RELAY_TO_DISPLAY_SUPPLY:w - - - - - - - -PSU_DISPLAY - - -PSU_DISPLAY - -MEAN WELL LRS-150F-5 - -larger 5 V supply for display electronics - -4-pin - -1 - -AC_IN - -1 - -2 - -GROUND - -2 - -3 - -5V_OUT - -3 - -4 - -GND_OUT - -4 - - - -DISPLAY_SUPPLY_TO_FUSE_BOX - - -DISPLAY_SUPPLY_TO_FUSE_BOX - -5 V display-electronics feed into fuse box - -2x -  -PSU_DISPLAY:3:5V_OUT -     1:RD:display_electronics_5V     -FUSE_BOX:5:DISPLAY_5V_IN - - - - - -PSU_DISPLAY:4:GND_OUT -     2:BK:display_electronics_ground     -FUSE_BOX:6:DISPLAY_GND_IN - - - - - -  - - - -PSU_DISPLAY:e--DISPLAY_SUPPLY_TO_FUSE_BOX:w - - - - - - - - -PSU_DISPLAY:e--DISPLAY_SUPPLY_TO_FUSE_BOX:w - - - - - +RELAY + + +RELAY + +LCLCTC SSR + +LED PSU line switch + +4-pin + +1 + +L_IN + +1 + +2 + +L_OUT + +2 + +3 + +CTRL + +3 + +4 + +GND + +4 + + + + + +RELAY_TO_LED_PSU + + +switched line + +1x +  +RELAY:2:L_OUT +     1:BN:L_SW     +PSU_LED:1:L + + + + + +  + + + +RELAY:e--RELAY_TO_LED_PSU:w + + + + + + + + +PSU_LED + + +PSU_LED + +MEAN WELL LRS-150F-5 + +switched LED 5 V + +15-pin + +1 + +L + +1 + +2 + +N + +2 + +3 + +PE + +3 + +4 + +P1_5V + +4 + +5 + +P1_GND + +5 + +6 + +P2_5V + +6 + +7 + +P2_GND + +7 + +8 + +P3_5V + +8 + +9 + +P3_GND + +9 + +10 + +P4_5V + +10 + +11 + +P4_GND + +11 + +12 + +P5_5V + +12 + +13 + +P5_GND + +13 + +14 + +P6_5V + +14 + +15 + +P6_GND + +15 + + + + + +LED_PSU_TO_PANEL_1 + + +panel 1 5 V + +2x +  +PSU_LED:4:P1_5V +     1:RD:+5V     +PANEL_1:1:5V + + + + + +PSU_LED:5:P1_GND +     2:BK:GND     +PANEL_1:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_1:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_2 + + +panel 2 5 V + +2x +  +PSU_LED:6:P2_5V +     1:RD:+5V     +PANEL_2:1:5V + + + + + +PSU_LED:7:P2_GND +     2:BK:GND     +PANEL_2:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_2:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_3 + + +panel 3 5 V + +2x +  +PSU_LED:8:P3_5V +     1:RD:+5V     +PANEL_3:1:5V + + + + + +PSU_LED:9:P3_GND +     2:BK:GND     +PANEL_3:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_3:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_4 + + +panel 4 5 V + +2x +  +PSU_LED:10:P4_5V +     1:RD:+5V     +PANEL_4:1:5V + + + + + +PSU_LED:11:P4_GND +     2:BK:GND     +PANEL_4:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_4:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_5 + + +panel 5 5 V + +2x +  +PSU_LED:12:P5_5V +     1:RD:+5V     +PANEL_5:1:5V + + + + + +PSU_LED:13:P5_GND +     2:BK:GND     +PANEL_5:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_5:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_6 + + +panel 6 5 V + +2x +  +PSU_LED:14:P6_5V +     1:RD:+5V     +PANEL_6:1:5V + + + + + +PSU_LED:15:P6_GND +     2:BK:GND     +PANEL_6:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_6:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_6:w + + + + + - + FUSE_BOX - - -FUSE_BOX - -Blue Sea Systems 5025 fuse box - -protected 5 V electronics branches - -12-pin - -1 - -PI_5V_IN - -1 - -2 - -PI_GND_IN - -2 - -3 - -PI_FUSED_5V - -3 - -4 - -PI_GND - -4 - -5 - -DISPLAY_5V_IN - -5 - -6 - -DISPLAY_GND_IN - -6 - -7 - -MSD300_FUSED_5V - -7 - -8 - -MSD300_GND - -8 - -9 - -NV3210_FUSED_5V - -9 - -10 - -NV3210_GND - -10 - -11 - -FAN_FUSED_5V - -11 - -12 - -FAN_GND - -12 - -Protects the Pi/X1201, MSD300-1, NV3210, and fan branches. It does not feed the LED panels. + + +FUSE_BOX + +Blue Sea 5025 + +fused 5 V branches + +14-pin + +1 + +5V_IN + +1 + +2 + +GND + +2 + +3 + +X1201_5V + +3 + +4 + +X1201_G + +4 + +5 + +MSD_5V + +5 + +6 + +MSD_G + +6 + +7 + +NV_5V + +7 + +8 + +NV_G + +8 + +9 + +F1_5V + +9 + +10 + +F1_G + +10 + +11 + +F2_5V + +11 + +12 + +F2_G + +12 + +13 + +F3_5V + +13 + +14 + +F3_G + +14 + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + - + FUSE_BOX_TO_X1201 - - -FUSE_BOX_TO_X1201 - -protected 5 V feed to UPS board - -2x -  -FUSE_BOX:3:PI_FUSED_5V -     1:RD:protected_pi_5V     -X1201:1:5V_IN - - - - - -FUSE_BOX:4:PI_GND -     2:BK:pi_ground     -X1201:2:GND_IN - - - - - -  + + +fused Pi 5 V + +2x +  +FUSE_BOX:3:X1201_5V +     1:RD:+5V     +X1201:1:5V + + + + + +FUSE_BOX:4:X1201_G +     2:BK:GND     +X1201:2:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_X1201:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_X1201:w - - - - - + + + + + - + FUSE_BOX_TO_MSD300 - - -FUSE_BOX_TO_MSD300 - -protected 5 V feed to MSD300-1 - -2x -  -FUSE_BOX:7:MSD300_FUSED_5V -     1:RD:msd300_5V     -MSD300:2:5V_IN - - - - - -FUSE_BOX:8:MSD300_GND -     2:BK:msd300_ground     -MSD300:3:GND_IN - - - - - -  + + +fused MSD300 5 V + +2x +  +FUSE_BOX:5:MSD_5V +     1:RD:+5V     +MSD300:2:5V + + + + + +FUSE_BOX:6:MSD_G +     2:BK:GND     +MSD300:3:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_MSD300:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210 - - -FUSE_BOX_TO_NV3210 - -protected 5 V feed to NV3210 - -2x -  -FUSE_BOX:9:NV3210_FUSED_5V -     1:RD:nv3210_5V     -NV3210:2:5V_IN - - - - - -FUSE_BOX:10:NV3210_GND -     2:BK:nv3210_ground     -NV3210:3:GND_IN - - - - - -  + + +fused NV3210 5 V + +2x +  +FUSE_BOX:7:NV_5V +     1:RD:+5V     +NV3210:2:5V + + + + + +FUSE_BOX:8:NV_G +     2:BK:GND     +NV3210:3:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_NV3210:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_NV3210:w - - - - - - - - -FUSE_BOX_TO_FAN - - -FUSE_BOX_TO_FAN - -protected 5 V fan feed - -2x -  -FUSE_BOX:11:FAN_FUSED_5V -     1:RD:fan_5V     -FAN:1:5V_IN - - - - - -FUSE_BOX:12:FAN_GND -     2:BK:fan_ground     -FAN:2:GND_IN - - - - - -  - - - -FUSE_BOX:e--FUSE_BOX_TO_FAN:w - - - - - - - - -FUSE_BOX:e--FUSE_BOX_TO_FAN:w - - - - - + + + + + + + + +FUSE_BOX_TO_FAN_1 + + +fan 1 5 V + +2x +  +FUSE_BOX:9:F1_5V +     1:RD:+5V     +FAN_1:1:5V + + + + + +FUSE_BOX:10:F1_G +     2:BK:GND     +FAN_1:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_1:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_2 + + +fan 2 5 V + +2x +  +FUSE_BOX:11:F2_5V +     1:RD:+5V     +FAN_2:1:5V + + + + + +FUSE_BOX:12:F2_G +     2:BK:GND     +FAN_2:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_2:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_3 + + +fan 3 5 V + +2x +  +FUSE_BOX:13:F3_5V +     1:RD:+5V     +FAN_3:1:5V + + + + + +FUSE_BOX:14:F3_G +     2:BK:GND     +FAN_3:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_3:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_3:w + + + + + - + X1201 - - -X1201 - -Geekworm X1201 - -battery backup for Raspberry Pi - -6-pin - -1 - -5V_IN - -1 - -2 - -GND_IN - -2 - -3 - -UPS_5V_OUT - -3 - -4 - -UPS_GND_OUT - -4 - -5 - -POWER_LOSS_SIGNAL - -5 - -6 - -BATTERIES - -6 + + +X1201 + +Geekworm X1201 + +UPS HAT + +6-pin + +1 + +5V + +1 + +2 + +GND + +2 + +3 + +PI_5V + +3 + +4 + +PI_GND + +4 + +5 + +PLD + +5 + +6 + +BATT + +6 + + - + X1201_TO_PI - - -X1201_TO_PI - -battery-backed Pi power and power-loss signal - -3x -  -X1201:3:UPS_5V_OUT -     1:RD:backup_5V     -RPI:1:5V_IN - - - - - -X1201:4:UPS_GND_OUT -     2:BK:ground     -RPI:2:GND_IN - - - - - -X1201:5:POWER_LOSS_SIGNAL -     3:YE:wall_power_status     -RPI:3:POWER_LOSS_SIGNAL - - - - - -  + + +Pi power + PLD + +3x +  +X1201:3:PI_5V +     1:RD:+5V     +RPI:1:5V + + + + + +X1201:4:PI_GND +     2:BK:GND     +RPI:2:GND + + + + + +X1201:5:PLD +     3:YE:PLD     +RPI:3:PLD + + + + + +  - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + RPI - - -RPI - -Raspberry Pi 5 - -garden controller - -6-pin - -1 - -5V_IN - -1 - -2 - -GND_IN - -2 - -3 - -POWER_LOSS_SIGNAL - -3 - -4 - -GPIO_BUTTONS - -4 - -5 - -GPIO_RELAY - -5 - -6 - -MICRO_HDMI - -6 - - - -BUTTON_HARNESS - - -BUTTON_HARNESS - -start / stop button harness - -1x -  -RPI:4:GPIO_BUTTONS -     1:GN:button_signals     -BUTTONS:1:START_STOP - - - - - -  - - - -RPI:e--BUTTON_HARNESS:w - - - - - + + +RPI + +Raspberry Pi 5 + +controller + +16-pin + +1 + +5V + +1 + +2 + +GND + +2 + +3 + +PLD + +3 + +4 + +START + +4 + +5 + +START_GND + +5 + +6 + +STOP + +6 + +7 + +STOP_GND + +7 + +8 + +RELAY + +8 + +9 + +CTRL_GND + +9 + +10 + +HDMI + +10 + +11 + +AHT_3V3 + +11 + +12 + +AHT_GND + +12 + +13 + +SDA + +13 + +14 + +SCL + +14 + +15 + +FAN_EN + +15 + +16 + +FAN_GND + +16 + + + + + +START_BUTTON_HARNESS + + +START harness + +2x +  +RPI:4:START +     1:GN:SIG     +START_BTN:1:SIGNAL + + + + + +RPI:5:START_GND +     2:BK:GND     +START_BTN:2:GND + + + + + +  + + + +RPI:e--START_BUTTON_HARNESS:w + + + + + + + + +RPI:e--START_BUTTON_HARNESS:w + + + + + + + + +STOP_BUTTON_HARNESS + + +STOP harness + +2x +  +RPI:6:STOP +     1:WH:SIG     +STOP_BTN:1:SIGNAL + + + + + +RPI:7:STOP_GND +     2:BK:GND     +STOP_BTN:2:GND + + + + + +  + + + +RPI:e--STOP_BUTTON_HARNESS:w + + + + + + + + +RPI:e--STOP_BUTTON_HARNESS:w + + + + + - + RELAY_CONTROL - - -RELAY_CONTROL - -Pi relay-control signal - -1x -  -RPI:5:GPIO_RELAY -     1:YE:relay_on_off     -RELAY:4:CTRL_IN - - - - - -  + + +relay control + +2x +  +RPI:8:RELAY +     1:YE:CTRL     +RELAY:3:CTRL + + + + + +RPI:9:CTRL_GND +     2:BK:GND     +RELAY:4:GND + + + + + +  - + RPI:e--RELAY_CONTROL:w - - - - - + + + + + + + + +RPI:e--RELAY_CONTROL:w + + + + + + + + +AHT20_I2C + + +AHT20 I2C + +4x +  +RPI:11:AHT_3V3 +     1:RD:3V3     +AHT20_SENSOR:1:VIN + + + + + +RPI:12:AHT_GND +     2:BK:GND     +AHT20_SENSOR:2:GND + + + + + +RPI:13:SDA +     3:GN:SDA     +AHT20_SENSOR:3:SDA + + + + + +RPI:14:SCL +     4:YE:SCL     +AHT20_SENSOR:4:SCL + + + + + +  + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +FAN_CONTROL_HARNESS + + +fan GPIO control + +2x +  +RPI:15:FAN_EN +     1:YE:EN     +FAN_1:3:CTRL + + + + + +RPI:16:FAN_GND +     2:BK:GND     +FAN_1:2:GND + + + + + +  + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + - + HDMI_TO_DVI - - -HDMI_TO_DVI - -micro HDMI to DVI cable / adapter - -1x - -+ S -  -RPI:6:MICRO_HDMI -     1:BK:video_to_msd300     -MSD300:1:DVI_IN - - - - - -  -Shield - -  + + +HDMI_TO_DVI + +HDMI to DVI + +1x + ++ S +  +RPI:10:HDMI +     1:BK:video     +MSD300:1:DVI + + + + + +  +Shield + +  + + - + RPI:e--HDMI_TO_DVI:w - - - - - + + + + + - + BATTERIES - - -BATTERIES - -Samsung 30Q cells - -two 18650 backup batteries - -1-pin - -BATTERY_PAIR - -1 + + +BATTERIES + +Samsung 30Q cells + +2x 18650 + +1-pin + +PAIR + +1 + + - + BATTERY_LINK - - -BATTERY_LINK - -X1201 battery connection - -1x -  -BATTERIES:1:BATTERY_PAIR -     1:PK:battery_pair     -X1201:6:BATTERIES - - - - - -  + + +battery link + +1x +  +BATTERIES:1:PAIR +     1:PK:BATT     +X1201:6:BATT + + + + + +  - + BATTERIES:e--BATTERY_LINK:w - - - - - + + + + + - - -BUTTONS - - -BUTTONS - -APIELE push buttons - -start and stop controls - -1-pin - -1 - -START_STOP + + +START_BTN + + +START_BTN + +APIELE push button + +START + +2-pin + +1 + +SIGNAL + +2 + +GND + + + + + +STOP_BTN + + +STOP_BTN + +APIELE push button + +STOP + +2-pin + +1 + +SIGNAL + +2 + +GND + + + + + +AHT20_SENSOR + + +AHT20_SENSOR + +Adafruit AHT20 + +I2C enclosure sensor + +4-pin + +1 + +VIN + +2 + +GND + +3 + +SDA + +4 + +SCL + + - + MSD300 - - -MSD300 - -NovaStar MSD300-1 - -DVI sender - -4-pin - -1 - -DVI_IN - -1 - -2 - -5V_IN - -2 - -3 - -GND_IN - -3 - -4 - -ETHERNET_OUT - -4 + + +MSD300 + +NovaStar MSD300-1 + +sender + +4-pin + +1 + +DVI + +1 + +2 + +5V + +2 + +3 + +GND + +3 + +4 + +ETH + +4 + + - + MSD300_TO_NV3210 - - -MSD300_TO_NV3210 - -Ethernet cable - -1x -  -MSD300:4:ETHERNET_OUT -     1:BU:novastar_data     -NV3210:1:ETHERNET_IN - - - - - -  - -Shown as one complete Ethernet cable, not broken out into pairs. + + +MSD300_TO_NV3210 + +Ethernet cable + +1x +  +MSD300:4:ETH +     1:BU:novastar_data     +NV3210:1:ETH + + + + + +  + + + +One complete cable; pairs not broken out. - + MSD300:e--MSD300_TO_NV3210:w - - - - - + + + + + - + NV3210 - - -NV3210 - -NovaStar NV3210 - -receiver card - -5-pin - -1 - -ETHERNET_IN - -1 - -2 - -5V_IN - -2 - -3 - -GND_IN - -3 - -4 - -RIBBON_OUT_A - -4 - -5 - -RIBBON_OUT_B - -5 - - - -RIBBON_TO_PANELS - - -RIBBON_TO_PANELS - -LED panel ribbon cables - -2x -  -NV3210:4:RIBBON_OUT_A -     1:GY:ribbon_a     -PANELS:1:RIBBON_IN_A - - - - - -NV3210:5:RIBBON_OUT_B -     2:GY:ribbon_b     -PANELS:2:RIBBON_IN_B - - - - - -  - - - -NV3210:e--RIBBON_TO_PANELS:w - - - - - - - - -NV3210:e--RIBBON_TO_PANELS:w - - - - - - - - -FAN - - -FAN - -Easycargo 30 mm fan - -enclosure cooling - -2-pin - -1 - -5V_IN - -2 - -GND_IN - - - -PANELS - - -PANELS - -LED panels - -panel stack / display face - -2-pin - -1 - -RIBBON_IN_A - -2 - -RIBBON_IN_B - - - -AC_CABLE:e--AC_PROTECT:w - - - - - - - - -AC_CABLE:e--AC_PROTECT:w - - - - - - - - -AC_TO_PI_SUPPLY:e--PSU_PI:w - - - - - - - - -AC_TO_PI_SUPPLY:e--PSU_PI:w - - - - - - - - -AC_TO_RELAY:e--RELAY:w - - - - - - - + + +NV3210 + +NovaStar NV3210 + +receiver + +9-pin + +1 + +ETH + +1 + +2 + +5V + +2 + +3 + +GND + +3 + +4 + +R1 + +4 + +5 + +R2 + +5 + +6 + +R3 + +6 + +7 + +R4 + +7 + +8 + +R5 + +8 + +9 + +R6 + +9 + + + + + +RIBBON_TO_PANEL_1 + + +ribbon 1 + +1x +  +NV3210:4:R1 +     1:GY:data     +PANEL_1:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_1:w + + + + + + + + +RIBBON_TO_PANEL_2 + + +ribbon 2 + +1x +  +NV3210:5:R2 +     1:GY:data     +PANEL_2:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_2:w + + + + + + + + +RIBBON_TO_PANEL_3 + + +ribbon 3 + +1x +  +NV3210:6:R3 +     1:GY:data     +PANEL_3:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_3:w + + + + + + + + +RIBBON_TO_PANEL_4 + + +ribbon 4 + +1x +  +NV3210:7:R4 +     1:GY:data     +PANEL_4:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_4:w + + + + + + + + +RIBBON_TO_PANEL_5 + + +ribbon 5 + +1x +  +NV3210:8:R5 +     1:GY:data     +PANEL_5:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_5:w + + + + + + + + +RIBBON_TO_PANEL_6 + + +ribbon 6 + +1x +  +NV3210:9:R6 +     1:GY:data     +PANEL_6:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_6:w + + + + + + + + +FAN_1 + + +FAN_1 + +30 mm fan + +1 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +FAN_2 + + +FAN_2 + +30 mm fan + +2 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +FAN_3 + + +FAN_3 + +30 mm fan + +3 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +PANEL_1 + + +PANEL_1 + +LED panel + +1 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_2 + + +PANEL_2 + +LED panel + +2 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_3 + + +PANEL_3 + +LED panel + +3 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_4 + + +PANEL_4 + +LED panel + +4 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_5 + + +PANEL_5 + +LED panel + +5 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_6 + + +PANEL_6 + +LED panel + +6 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + -AC_TO_RELAY:e--RELAY:w - - - - - - - +AC_LINE_NEUTRAL:e--POWER_INLET:w + + + + + + + -AC_RELAY_TO_DISPLAY_SUPPLY:e--PSU_DISPLAY:w - - - - - - - +AC_LINE_NEUTRAL:e--POWER_INLET:w + + + + + + + -AC_RELAY_TO_DISPLAY_SUPPLY:e--PSU_DISPLAY:w - - - - - - - +AC_GROUND:e--GROUND_TERMINAL:w + + + + + + + -PI_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - - - +AC_TO_PI_PSU:e--PSU_PI:w + + + + + + + -PI_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - +AC_TO_PI_PSU:e--PSU_PI:w + + + + + + + + +GROUND_TO_PI_PSU:e--PSU_PI:w + + + + + + + + +AC_TO_RELAY:e--RELAY:w + + + + + + + + +RELAY_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +NEUTRAL_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +GROUND_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +PI_PSU_TO_FUSE_BOX:e--FUSE_BOX:w + + + + + + + + +PI_PSU_TO_FUSE_BOX:e--FUSE_BOX:w + + + + + - + FUSE_BOX_TO_X1201:e--X1201:w - - - - - + + + + + - + FUSE_BOX_TO_X1201:e--X1201:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + BATTERY_LINK:e--X1201:w - - - - - + + + + + - - -BUTTON_HARNESS:e--BUTTONS:w - - - - - + + +START_BUTTON_HARNESS:e--START_BTN:w + + + + + + + + +START_BUTTON_HARNESS:e--START_BTN:w + + + + + + + + +STOP_BUTTON_HARNESS:e--STOP_BTN:w + + + + + + + + +STOP_BUTTON_HARNESS:e--STOP_BTN:w + + + + + - + RELAY_CONTROL:e--RELAY:w - - - - - + + + + + - - -DISPLAY_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - - - - -DISPLAY_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - + + +RELAY_CONTROL:e--RELAY:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + - + FUSE_BOX_TO_MSD300:e--MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_MSD300:e--MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210:e--NV3210:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210:e--NV3210:w - - - - - - - - -FUSE_BOX_TO_FAN:e--FAN:w - - - - - - - - -FUSE_BOX_TO_FAN:e--FAN:w - - - - - + + + + + + + + +FUSE_BOX_TO_FAN_1:e--FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_1:e--FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_2:e--FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_2:e--FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_3:e--FAN_3:w + + + + + + + + +FUSE_BOX_TO_FAN_3:e--FAN_3:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_1:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_1:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_2:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_2:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_3:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_3:w + + + + + + + + +LED_PSU_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_6:e--PANEL_6:w + + + + + + + + +LED_PSU_TO_PANEL_6:e--PANEL_6:w + + + + + - + HDMI_TO_DVI:e--MSD300:w - - - - - + + + + + - + MSD300_TO_NV3210:e--NV3210:w - - - - - - - - -RIBBON_TO_PANELS:e--PANELS:w - - - - - - - - -RIBBON_TO_PANELS:e--PANELS:w - - - - - + + + + + + + + +RIBBON_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +RIBBON_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +RIBBON_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +RIBBON_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +RIBBON_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +RIBBON_TO_PANEL_6:e--PANEL_6:w + + + + + @@ -1630,7 +3239,7 @@

Diagram

- Simplified WireViz diagram for client review. This intentionally omits internal split points, spare parts, tools, wire stock, mounting hardware, and pin-level Ethernet detail. The fuse box is shown protecting the Pi / X1201 feed, the NovaStar MSD300-1 sender, the NV3210 receiver, and the cooling fan. LED panels are shown as ribbon-cable outputs from the NV3210, not as fuse-box outputs.
+ Simplified WireViz source for the printable client wiring package. The rendered WireViz HTML, SVG, PNG, PDF, and BOM are the client-facing wiring artifacts. This source shows the current hardware contract: 120 V AC three-prong input, a single ground terminal block, two separate 5 V power supplies, a relay that switches only the LED-panel supply, separate START and STOP buttons, MSD300-1 to NV3210 video/data flow, six LED matrix panels, an Adafruit AHT20 enclosure sensor, and three temperature-controlled enclosure fans.

Bill of Materials

@@ -1646,286 +3255,573 @@

Bill of Materials

1 - Blue Sea Systems 5025 fuse box + 120 V AC three-prong cable 1 - FUSE_BOX + AC_IN 2 - Cable, 120 V AC input, 2 wires - 0 - m - AC_CABLE + Adafruit AHT20 temperature/humidity sensor + 1 + + AHT20_SENSOR 3 - Cable, 5 V controller feed into fuse box, 2 wires - 0 - m - PI_SUPPLY_TO_FUSE_BOX + Blue Sea Systems 5025 fuse box + 1 + + FUSE_BOX 4 - Cable, 5 V display-electronics feed into fuse box, 2 wires + Cable, AC L/N, 2 wires 0 m - DISPLAY_SUPPLY_TO_FUSE_BOX + 5 - Cable, Ethernet cable, 1 wires + Cable, AC to Pi PSU, 2 wires 0 m - MSD300_TO_NV3210 + 6 - Cable, LED panel ribbon cables, 2 wires + Cable, AC to relay, 1 wires 0 m - RIBBON_TO_PANELS + 7 - Cable, Pi relay-control signal, 1 wires + Cable, AHT20 I2C, 4 wires 0 m - RELAY_CONTROL + 8 - Cable, X1201 battery connection, 1 wires + Cable, Ethernet cable, 1 wires 0 m - BATTERY_LINK + MSD300_TO_NV3210 9 - Cable, always-on AC feed, 2 wires + Cable, HDMI to DVI, 1 wires shielded 0 m - AC_TO_PI_SUPPLY + HDMI_TO_DVI 10 - Cable, battery-backed Pi power and power-loss signal, 3 wires + Cable, LED PSU neutral, 1 wires 0 m - X1201_TO_PI + 11 - Cable, micro HDMI to DVI cable / adapter, 1 wires shielded + Cable, PE ground, 1 wires 0 m - HDMI_TO_DVI + 12 - Cable, protected 5 V fan feed, 2 wires + Cable, PE to LED PSU, 1 wires 0 m - FUSE_BOX_TO_FAN + 13 - Cable, protected 5 V feed to MSD300-1, 2 wires + Cable, PE to Pi PSU, 1 wires 0 m - FUSE_BOX_TO_MSD300 + 14 - Cable, protected 5 V feed to NV3210, 2 wires + Cable, Pi power + PLD, 3 wires 0 m - FUSE_BOX_TO_NV3210 + 15 - Cable, protected 5 V feed to UPS board, 2 wires + Cable, START harness, 2 wires 0 m - FUSE_BOX_TO_X1201 + 16 - Cable, relay-switched AC output, 2 wires + Cable, STOP harness, 2 wires 0 m - AC_RELAY_TO_DISPLAY_SUPPLY + 17 - Cable, start / stop button harness, 1 wires + Cable, battery link, 1 wires 0 m - BUTTON_HARNESS + 18 - Cable, switched display AC feed, 2 wires + Cable, controller 5 V feed, 2 wires 0 m - AC_TO_RELAY + 19 - Connector, 120 V AC power input, 3-prong cable into the enclosure, 2 pins + Cable, fan 1 5 V, 2 wires + 0 + m + + + + 20 + Cable, fan 2 5 V, 2 wires + 0 + m + + + + 21 + Cable, fan 3 5 V, 2 wires + 0 + m + + + + 22 + Cable, fan GPIO control, 2 wires + 0 + m + + + + 23 + Cable, fused MSD300 5 V, 2 wires + 0 + m + + + + 24 + Cable, fused NV3210 5 V, 2 wires + 0 + m + + + + 25 + Cable, fused Pi 5 V, 2 wires + 0 + m + + + + 26 + Cable, panel 1 5 V, 2 wires + 0 + m + + + + 27 + Cable, panel 2 5 V, 2 wires + 0 + m + + + + 28 + Cable, panel 3 5 V, 2 wires + 0 + m + + + + 29 + Cable, panel 4 5 V, 2 wires + 0 + m + + + + 30 + Cable, panel 5 5 V, 2 wires + 0 + m + + + + 31 + Cable, panel 6 5 V, 2 wires + 0 + m + + + + 32 + Cable, relay control, 2 wires + 0 + m + + + + 33 + Cable, ribbon 1, 1 wires + 0 + m + + + + 34 + Cable, ribbon 2, 1 wires + 0 + m + + + + 35 + Cable, ribbon 3, 1 wires + 0 + m + + + + 36 + Cable, ribbon 4, 1 wires + 0 + m + + + + 37 + Cable, ribbon 5, 1 wires + 0 + m + + + + 38 + Cable, ribbon 6, 1 wires + 0 + m + + + + 39 + Cable, switched line, 1 wires + 0 + m + + + + 40 + Connector, 120 V AC in, 3-prong cable, 3 pins 1 AC_IN - 20 - Connector, APIELE push buttons, start and stop controls, 1 pins + 41 + Connector, 30 mm fan, 1 of 3, 3 pins 1 - BUTTONS + FAN_1 - 21 - Connector, Blue Sea Systems 5025 fuse box, protected 5 V electronics branches, 12 pins + 42 + Connector, 30 mm fan, 2 of 3, 3 pins + 1 + + FAN_2 + + + 43 + Connector, 30 mm fan, 3 of 3, 3 pins + 1 + + FAN_3 + + + 44 + Connector, APIELE push button, START, 2 pins + 1 + + START_BTN + + + 45 + Connector, APIELE push button, STOP, 2 pins + 1 + + STOP_BTN + + + 46 + Connector, Adafruit AHT20, I2C enclosure sensor, 4 pins + 1 + + AHT20_SENSOR + + + 47 + Connector, Blue Sea 5025, fused 5 V branches, 14 pins 1 FUSE_BOX - 22 - Connector, Easycargo 30 mm fan, enclosure cooling, 2 pins + 48 + Connector, Fuse inlet, breaker, 6 pins 1 - FAN + POWER_INLET - 23 - Connector, Geekworm X1201, battery backup for Raspberry Pi, 6 pins + 49 + Connector, Geekworm X1201, UPS HAT, 6 pins 1 X1201 - 24 - Connector, LCLCTC DIN rail solid-state relay, Pi-controlled display-power switch, 4 pins + 50 + Connector, Ground block, case bonded, 3 pins + 1 + + GROUND_TERMINAL + + + 51 + Connector, LCLCTC SSR, LED PSU line switch, 4 pins 1 RELAY - 25 - Connector, LED panels, panel stack / display face, 2 pins + 52 + Connector, LED panel, 1 of 6, 3 pins 1 - PANELS + PANEL_1 - 26 - Connector, MEAN WELL LRS-150F-5, larger 5 V supply for display electronics, 4 pins + 53 + Connector, LED panel, 2 of 6, 3 pins 1 - PSU_DISPLAY + PANEL_2 - 27 - Connector, MEAN WELL LRS-50-5, small 5 V supply for the controller side, 4 pins + 54 + Connector, LED panel, 3 of 6, 3 pins 1 - PSU_PI + PANEL_3 - 28 - Connector, NovaStar MSD300-1, DVI sender, 4 pins + 55 + Connector, LED panel, 4 of 6, 3 pins 1 - MSD300 + PANEL_4 - 29 - Connector, NovaStar NV3210, receiver card, 5 pins + 56 + Connector, LED panel, 5 of 6, 3 pins 1 - NV3210 + PANEL_5 - 30 - Connector, Power inlet and breaker, fused shutoff for the control box, 4 pins + 57 + Connector, LED panel, 6 of 6, 3 pins 1 - AC_PROTECT + PANEL_6 - 31 - Connector, Raspberry Pi 5, garden controller, 6 pins + 58 + Connector, MEAN WELL LRS-150F-5, switched LED 5 V, 15 pins + 1 + + PSU_LED + + + 59 + Connector, MEAN WELL LRS-50-5, always-on 5 V, 5 pins + 1 + + PSU_PI + + + 60 + Connector, NovaStar MSD300-1, sender, 4 pins + 1 + + MSD300 + + + 61 + Connector, NovaStar NV3210, receiver, 9 pins + 1 + + NV3210 + + + 62 + Connector, Raspberry Pi 5, controller, 16 pins 1 RPI - 32 - Connector, Samsung 30Q cells, two 18650 backup batteries, 1 pins + 63 + Connector, Samsung 30Q cells, 2x 18650, 1 pins 1 BATTERIES - 33 + 64 + Easycargo 30 mm fan + 3 + + FAN_1, FAN_2, FAN_3 + + + 65 Ethernet cable from MSD300-1 to NV3210 1 MSD300_TO_NV3210 - 34 + 66 + Fuse inlet and breaker + 1 + + POWER_INLET + + + 67 Geekworm X1201 UPS HAT 1 X1201 - 35 + 68 + Ground terminal block + 1 + + GROUND_TERMINAL + + + 69 + LCLCTC DIN rail solid-state relay + 1 + + RELAY + + + 70 + LED matrix panels + 6 + + PANEL_1, PANEL_2, PANEL_3, PANEL_4, PANEL_5, PANEL_6 + + + 71 + LED panel 5 V power leads + 6 + + LED_PSU_TO_PANEL_1, LED_PSU_TO_PANEL_2, LED_PSU_TO_PANEL_3, LED_PSU_TO_PANEL_4, LED_PSU_TO_PANEL_5, LED_PSU_TO_PANEL_6 + + + 72 LED panel ribbon cables - 2 + 6 - RIBBON_TO_PANELS + RIBBON_TO_PANEL_1, RIBBON_TO_PANEL_2, RIBBON_TO_PANEL_3, RIBBON_TO_PANEL_4, RIBBON_TO_PANEL_5, RIBBON_TO_PANEL_6 - 36 - MEAN WELL LRS-150F-5 5 V power supply + 73 + MEAN WELL LRS-150F-5 5 V LED-panel power supply 1 - PSU_DISPLAY + PSU_LED - 37 - MEAN WELL LRS-50-5 5 V power supply + 74 + MEAN WELL LRS-50-5 5 V controller power supply 1 PSU_PI - 38 + 75 Micro HDMI to DVI adapter cable 1 HDMI_TO_DVI - 39 + 76 NovaStar MSD300-1 sender 1 MSD300 - 40 + 77 NovaStar NV3210 receiver 1 NV3210 - 41 + 78 + Pi GPIO fan-control harness + 1 + + FAN_CONTROL_HARNESS + + + 79 + Protected 5 V fan power leads + 3 + + FUSE_BOX_TO_FAN_1, FUSE_BOX_TO_FAN_2, FUSE_BOX_TO_FAN_3 + + + 80 + START button + 1 + + START_BTN + + + 81 + STOP button + 1 + + STOP_BTN + + + 82 Samsung 30Q 18650 flat-top cell 2 diff --git a/docs/wiring/out/conway-garden-client-overview.pdf b/docs/wiring/out/conway-garden-client-overview.pdf new file mode 100644 index 0000000..0a883c9 Binary files /dev/null and b/docs/wiring/out/conway-garden-client-overview.pdf differ diff --git a/docs/wiring/out/conway-garden-client-overview.png b/docs/wiring/out/conway-garden-client-overview.png index 6714815..ab43894 100644 Binary files a/docs/wiring/out/conway-garden-client-overview.png and b/docs/wiring/out/conway-garden-client-overview.png differ diff --git a/docs/wiring/out/conway-garden-client-overview.svg b/docs/wiring/out/conway-garden-client-overview.svg index d3ac560..0a5c3d9 100644 --- a/docs/wiring/out/conway-garden-client-overview.svg +++ b/docs/wiring/out/conway-garden-client-overview.svg @@ -4,1596 +4,3205 @@ - - + + %3 - + AC_IN - - -AC_IN - -120 V AC power input - -3-prong cable into the enclosure - -2-pin - -POWER_IN - -1 - -GROUND_BOND - -2 - -Wall power enters the box through the fused inlet / breaker assembly. - - - -AC_CABLE - - -AC_CABLE - -120 V AC input - -2x -  -AC_IN:1:POWER_IN -     1:BN:wall_power     -AC_PROTECT:1:POWER_IN - - - - - -AC_IN:2:GROUND_BOND -     2:GNYE:safety_ground     -AC_PROTECT:2:GROUND_BOND - - - - - -  - - - -AC_IN:e--AC_CABLE:w - - - - - - - - -AC_IN:e--AC_CABLE:w - - - - - - - + + +AC_IN + +120 V AC in + +3-prong cable + +3-pin + +LINE + +1 + +NEUTRAL + +2 + +GROUND + +3 + + + + + +AC_LINE_NEUTRAL + + +AC L/N + +2x +  +AC_IN:1:LINE +     1:BN:L     +POWER_INLET:1:L_IN + + + + + +AC_IN:2:NEUTRAL +     2:BU:N     +POWER_INLET:2:N_IN + + + + + +  + + + +AC_IN:e--AC_LINE_NEUTRAL:w + + + + + + + + +AC_IN:e--AC_LINE_NEUTRAL:w + + + + + + + + +AC_GROUND + + +PE ground + +1x +  +AC_IN:3:GROUND +     1:GNYE:PE     +GROUND_TERMINAL:1:G_IN + + + + + +  + + + +AC_IN:e--AC_GROUND:w + + + + + + + -AC_PROTECT - - -AC_PROTECT - -Power inlet and breaker - -fused shutoff for the control box - -4-pin - -1 - -POWER_IN - -1 - -2 - -GROUND_BOND - -2 - -3 - -ALWAYS_ON_AC - -3 - -4 - -SWITCHED_AC_FEED - -4 - -Simplified as one client-facing protection block. - - - -AC_TO_PI_SUPPLY - - -AC_TO_PI_SUPPLY - -always-on AC feed - -2x -  -AC_PROTECT:3:ALWAYS_ON_AC -     1:BN:always_on_power     -PSU_PI:1:AC_IN - - - - - -AC_PROTECT:2:GROUND_BOND -     2:GNYE:safety_ground     -PSU_PI:2:GROUND - - - - - -  - - - -AC_PROTECT:e--AC_TO_PI_SUPPLY:w - - - - - - - - -AC_PROTECT:e--AC_TO_PI_SUPPLY:w - - - - - +POWER_INLET + + +POWER_INLET + +Fuse inlet + +breaker + +6-pin + +1 + +L_IN + +1 + +2 + +N_IN + +2 + +3 + +L_PI + +3 + +4 + +N_PI + +4 + +5 + +L_RELAY + +5 + +6 + +N_LED + +6 + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +POWER_INLET:w--POWER_INLET:w + + + + + + + +AC_TO_PI_PSU + + +AC to Pi PSU + +2x +  +POWER_INLET:3:L_PI +     1:BN:L     +PSU_PI:1:L + + + + + +POWER_INLET:4:N_PI +     2:BU:N     +PSU_PI:2:N + + + + + +  + + + +POWER_INLET:e--AC_TO_PI_PSU:w + + + + + + + + +POWER_INLET:e--AC_TO_PI_PSU:w + + + + + - + AC_TO_RELAY - - -AC_TO_RELAY - -switched display AC feed - -2x -  -AC_PROTECT:4:SWITCHED_AC_FEED -     1:BN:display_power_feed     -RELAY:1:AC_IN - - - - - -AC_PROTECT:2:GROUND_BOND -     2:GNYE:safety_ground     -RELAY:3:GROUND_PASS - - - - - -  - - - -AC_PROTECT:e--AC_TO_RELAY:w - - - - - - - - -AC_PROTECT:e--AC_TO_RELAY:w - - - - - + + +AC to relay + +1x +  +POWER_INLET:5:L_RELAY +     1:BN:L     +RELAY:1:L_IN + + + + + +  + + + +POWER_INLET:e--AC_TO_RELAY:w + + + + + + + + +NEUTRAL_TO_LED_PSU + + +LED PSU neutral + +1x +  +POWER_INLET:6:N_LED +     1:BU:N     +PSU_LED:2:N + + + + + +  + + + +POWER_INLET:e--NEUTRAL_TO_LED_PSU:w + + + + + + + + +GROUND_TERMINAL + + +GROUND_TERMINAL + +Ground block + +case bonded + +3-pin + +1 + +G_IN + +1 + +2 + +G_PI + +2 + +3 + +G_LED + +3 + + + + + +GROUND_TERMINAL:w--GROUND_TERMINAL:w + + + + + + + +GROUND_TERMINAL:w--GROUND_TERMINAL:w + + + + + + + +GROUND_TO_PI_PSU + + +PE to Pi PSU + +1x +  +GROUND_TERMINAL:2:G_PI +     1:GNYE:PE     +PSU_PI:3:PE + + + + + +  + + + +GROUND_TERMINAL:e--GROUND_TO_PI_PSU:w + + + + + + + + +GROUND_TO_LED_PSU + + +PE to LED PSU + +1x +  +GROUND_TERMINAL:3:G_LED +     1:GNYE:PE     +PSU_LED:3:PE + + + + + +  + + + +GROUND_TERMINAL:e--GROUND_TO_LED_PSU:w + + + + + - + PSU_PI - - -PSU_PI - -MEAN WELL LRS-50-5 - -small 5 V supply for the controller side - -4-pin - -1 - -AC_IN - -1 - -2 - -GROUND - -2 - -3 - -5V_OUT - -3 - -4 - -GND_OUT - -4 - - - -PI_SUPPLY_TO_FUSE_BOX - - -PI_SUPPLY_TO_FUSE_BOX - -5 V controller feed into fuse box - -2x -  -PSU_PI:3:5V_OUT -     1:RD:controller_5V     -FUSE_BOX:1:PI_5V_IN - - - - - -PSU_PI:4:GND_OUT -     2:BK:controller_ground     -FUSE_BOX:2:PI_GND_IN - - - - - -  - - - -PSU_PI:e--PI_SUPPLY_TO_FUSE_BOX:w - - - - - - - - -PSU_PI:e--PI_SUPPLY_TO_FUSE_BOX:w - - - - - + + +PSU_PI + +MEAN WELL LRS-50-5 + +always-on 5 V + +5-pin + +1 + +L + +1 + +2 + +N + +2 + +3 + +PE + +3 + +4 + ++5V + +4 + +5 + +GND + +5 + + + + + +PI_PSU_TO_FUSE_BOX + + +controller 5 V feed + +2x +  +PSU_PI:4:+5V +     1:RD:+5V     +FUSE_BOX:1:5V_IN + + + + + +PSU_PI:5:GND +     2:BK:GND     +FUSE_BOX:2:GND + + + + + +  + + + +PSU_PI:e--PI_PSU_TO_FUSE_BOX:w + + + + + + + + +PSU_PI:e--PI_PSU_TO_FUSE_BOX:w + + + + + - -RELAY - - -RELAY - -LCLCTC DIN rail solid-state relay - -Pi-controlled display-power switch - -4-pin - -1 - -AC_IN - -1 - -2 - -AC_OUT - -2 - -3 - -GROUND_PASS - -3 - -4 - -CTRL_IN - -4 - - - -AC_RELAY_TO_DISPLAY_SUPPLY - - -AC_RELAY_TO_DISPLAY_SUPPLY - -relay-switched AC output - -2x -  -RELAY:2:AC_OUT -     1:BN:switched_power     -PSU_DISPLAY:1:AC_IN - - - - - -RELAY:3:GROUND_PASS -     2:GNYE:safety_ground     -PSU_DISPLAY:2:GROUND - - - - - -  - - - -RELAY:e--AC_RELAY_TO_DISPLAY_SUPPLY:w - - - - - - - - -RELAY:e--AC_RELAY_TO_DISPLAY_SUPPLY:w - - - - - - - -PSU_DISPLAY - - -PSU_DISPLAY - -MEAN WELL LRS-150F-5 - -larger 5 V supply for display electronics - -4-pin - -1 - -AC_IN - -1 - -2 - -GROUND - -2 - -3 - -5V_OUT - -3 - -4 - -GND_OUT - -4 - - - -DISPLAY_SUPPLY_TO_FUSE_BOX - - -DISPLAY_SUPPLY_TO_FUSE_BOX - -5 V display-electronics feed into fuse box - -2x -  -PSU_DISPLAY:3:5V_OUT -     1:RD:display_electronics_5V     -FUSE_BOX:5:DISPLAY_5V_IN - - - - - -PSU_DISPLAY:4:GND_OUT -     2:BK:display_electronics_ground     -FUSE_BOX:6:DISPLAY_GND_IN - - - - - -  - - - -PSU_DISPLAY:e--DISPLAY_SUPPLY_TO_FUSE_BOX:w - - - - - - - - -PSU_DISPLAY:e--DISPLAY_SUPPLY_TO_FUSE_BOX:w - - - - - +RELAY + + +RELAY + +LCLCTC SSR + +LED PSU line switch + +4-pin + +1 + +L_IN + +1 + +2 + +L_OUT + +2 + +3 + +CTRL + +3 + +4 + +GND + +4 + + + + + +RELAY_TO_LED_PSU + + +switched line + +1x +  +RELAY:2:L_OUT +     1:BN:L_SW     +PSU_LED:1:L + + + + + +  + + + +RELAY:e--RELAY_TO_LED_PSU:w + + + + + + + + +PSU_LED + + +PSU_LED + +MEAN WELL LRS-150F-5 + +switched LED 5 V + +15-pin + +1 + +L + +1 + +2 + +N + +2 + +3 + +PE + +3 + +4 + +P1_5V + +4 + +5 + +P1_GND + +5 + +6 + +P2_5V + +6 + +7 + +P2_GND + +7 + +8 + +P3_5V + +8 + +9 + +P3_GND + +9 + +10 + +P4_5V + +10 + +11 + +P4_GND + +11 + +12 + +P5_5V + +12 + +13 + +P5_GND + +13 + +14 + +P6_5V + +14 + +15 + +P6_GND + +15 + + + + + +LED_PSU_TO_PANEL_1 + + +panel 1 5 V + +2x +  +PSU_LED:4:P1_5V +     1:RD:+5V     +PANEL_1:1:5V + + + + + +PSU_LED:5:P1_GND +     2:BK:GND     +PANEL_1:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_1:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_2 + + +panel 2 5 V + +2x +  +PSU_LED:6:P2_5V +     1:RD:+5V     +PANEL_2:1:5V + + + + + +PSU_LED:7:P2_GND +     2:BK:GND     +PANEL_2:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_2:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_3 + + +panel 3 5 V + +2x +  +PSU_LED:8:P3_5V +     1:RD:+5V     +PANEL_3:1:5V + + + + + +PSU_LED:9:P3_GND +     2:BK:GND     +PANEL_3:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_3:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_4 + + +panel 4 5 V + +2x +  +PSU_LED:10:P4_5V +     1:RD:+5V     +PANEL_4:1:5V + + + + + +PSU_LED:11:P4_GND +     2:BK:GND     +PANEL_4:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_4:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_5 + + +panel 5 5 V + +2x +  +PSU_LED:12:P5_5V +     1:RD:+5V     +PANEL_5:1:5V + + + + + +PSU_LED:13:P5_GND +     2:BK:GND     +PANEL_5:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_5:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_6 + + +panel 6 5 V + +2x +  +PSU_LED:14:P6_5V +     1:RD:+5V     +PANEL_6:1:5V + + + + + +PSU_LED:15:P6_GND +     2:BK:GND     +PANEL_6:2:GND + + + + + +  + + + +PSU_LED:e--LED_PSU_TO_PANEL_6:w + + + + + + + + +PSU_LED:e--LED_PSU_TO_PANEL_6:w + + + + + - + FUSE_BOX - - -FUSE_BOX - -Blue Sea Systems 5025 fuse box - -protected 5 V electronics branches - -12-pin - -1 - -PI_5V_IN - -1 - -2 - -PI_GND_IN - -2 - -3 - -PI_FUSED_5V - -3 - -4 - -PI_GND - -4 - -5 - -DISPLAY_5V_IN - -5 - -6 - -DISPLAY_GND_IN - -6 - -7 - -MSD300_FUSED_5V - -7 - -8 - -MSD300_GND - -8 - -9 - -NV3210_FUSED_5V - -9 - -10 - -NV3210_GND - -10 - -11 - -FAN_FUSED_5V - -11 - -12 - -FAN_GND - -12 - -Protects the Pi/X1201, MSD300-1, NV3210, and fan branches. It does not feed the LED panels. + + +FUSE_BOX + +Blue Sea 5025 + +fused 5 V branches + +14-pin + +1 + +5V_IN + +1 + +2 + +GND + +2 + +3 + +X1201_5V + +3 + +4 + +X1201_G + +4 + +5 + +MSD_5V + +5 + +6 + +MSD_G + +6 + +7 + +NV_5V + +7 + +8 + +NV_G + +8 + +9 + +F1_5V + +9 + +10 + +F1_G + +10 + +11 + +F2_5V + +11 + +12 + +F2_G + +12 + +13 + +F3_5V + +13 + +14 + +F3_G + +14 + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + - + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + FUSE_BOX:w--FUSE_BOX:w - - - - + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + + + + +FUSE_BOX:w--FUSE_BOX:w + + + + - + FUSE_BOX_TO_X1201 - - -FUSE_BOX_TO_X1201 - -protected 5 V feed to UPS board - -2x -  -FUSE_BOX:3:PI_FUSED_5V -     1:RD:protected_pi_5V     -X1201:1:5V_IN - - - - - -FUSE_BOX:4:PI_GND -     2:BK:pi_ground     -X1201:2:GND_IN - - - - - -  + + +fused Pi 5 V + +2x +  +FUSE_BOX:3:X1201_5V +     1:RD:+5V     +X1201:1:5V + + + + + +FUSE_BOX:4:X1201_G +     2:BK:GND     +X1201:2:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_X1201:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_X1201:w - - - - - + + + + + - + FUSE_BOX_TO_MSD300 - - -FUSE_BOX_TO_MSD300 - -protected 5 V feed to MSD300-1 - -2x -  -FUSE_BOX:7:MSD300_FUSED_5V -     1:RD:msd300_5V     -MSD300:2:5V_IN - - - - - -FUSE_BOX:8:MSD300_GND -     2:BK:msd300_ground     -MSD300:3:GND_IN - - - - - -  + + +fused MSD300 5 V + +2x +  +FUSE_BOX:5:MSD_5V +     1:RD:+5V     +MSD300:2:5V + + + + + +FUSE_BOX:6:MSD_G +     2:BK:GND     +MSD300:3:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_MSD300:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210 - - -FUSE_BOX_TO_NV3210 - -protected 5 V feed to NV3210 - -2x -  -FUSE_BOX:9:NV3210_FUSED_5V -     1:RD:nv3210_5V     -NV3210:2:5V_IN - - - - - -FUSE_BOX:10:NV3210_GND -     2:BK:nv3210_ground     -NV3210:3:GND_IN - - - - - -  + + +fused NV3210 5 V + +2x +  +FUSE_BOX:7:NV_5V +     1:RD:+5V     +NV3210:2:5V + + + + + +FUSE_BOX:8:NV_G +     2:BK:GND     +NV3210:3:GND + + + + + +  - + FUSE_BOX:e--FUSE_BOX_TO_NV3210:w - - - - - + + + + + - + FUSE_BOX:e--FUSE_BOX_TO_NV3210:w - - - - - - - - -FUSE_BOX_TO_FAN - - -FUSE_BOX_TO_FAN - -protected 5 V fan feed - -2x -  -FUSE_BOX:11:FAN_FUSED_5V -     1:RD:fan_5V     -FAN:1:5V_IN - - - - - -FUSE_BOX:12:FAN_GND -     2:BK:fan_ground     -FAN:2:GND_IN - - - - - -  - - - -FUSE_BOX:e--FUSE_BOX_TO_FAN:w - - - - - - - - -FUSE_BOX:e--FUSE_BOX_TO_FAN:w - - - - - + + + + + + + + +FUSE_BOX_TO_FAN_1 + + +fan 1 5 V + +2x +  +FUSE_BOX:9:F1_5V +     1:RD:+5V     +FAN_1:1:5V + + + + + +FUSE_BOX:10:F1_G +     2:BK:GND     +FAN_1:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_1:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_2 + + +fan 2 5 V + +2x +  +FUSE_BOX:11:F2_5V +     1:RD:+5V     +FAN_2:1:5V + + + + + +FUSE_BOX:12:F2_G +     2:BK:GND     +FAN_2:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_2:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_3 + + +fan 3 5 V + +2x +  +FUSE_BOX:13:F3_5V +     1:RD:+5V     +FAN_3:1:5V + + + + + +FUSE_BOX:14:F3_G +     2:BK:GND     +FAN_3:2:GND + + + + + +  + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_3:w + + + + + + + + +FUSE_BOX:e--FUSE_BOX_TO_FAN_3:w + + + + + - + X1201 - - -X1201 - -Geekworm X1201 - -battery backup for Raspberry Pi - -6-pin - -1 - -5V_IN - -1 - -2 - -GND_IN - -2 - -3 - -UPS_5V_OUT - -3 - -4 - -UPS_GND_OUT - -4 - -5 - -POWER_LOSS_SIGNAL - -5 - -6 - -BATTERIES - -6 + + +X1201 + +Geekworm X1201 + +UPS HAT + +6-pin + +1 + +5V + +1 + +2 + +GND + +2 + +3 + +PI_5V + +3 + +4 + +PI_GND + +4 + +5 + +PLD + +5 + +6 + +BATT + +6 + + - + X1201_TO_PI - - -X1201_TO_PI - -battery-backed Pi power and power-loss signal - -3x -  -X1201:3:UPS_5V_OUT -     1:RD:backup_5V     -RPI:1:5V_IN - - - - - -X1201:4:UPS_GND_OUT -     2:BK:ground     -RPI:2:GND_IN - - - - - -X1201:5:POWER_LOSS_SIGNAL -     3:YE:wall_power_status     -RPI:3:POWER_LOSS_SIGNAL - - - - - -  + + +Pi power + PLD + +3x +  +X1201:3:PI_5V +     1:RD:+5V     +RPI:1:5V + + + + + +X1201:4:PI_GND +     2:BK:GND     +RPI:2:GND + + + + + +X1201:5:PLD +     3:YE:PLD     +RPI:3:PLD + + + + + +  - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + X1201:e--X1201_TO_PI:w - - - - - + + + + + - + RPI - - -RPI - -Raspberry Pi 5 - -garden controller - -6-pin - -1 - -5V_IN - -1 - -2 - -GND_IN - -2 - -3 - -POWER_LOSS_SIGNAL - -3 - -4 - -GPIO_BUTTONS - -4 - -5 - -GPIO_RELAY - -5 - -6 - -MICRO_HDMI - -6 - - - -BUTTON_HARNESS - - -BUTTON_HARNESS - -start / stop button harness - -1x -  -RPI:4:GPIO_BUTTONS -     1:GN:button_signals     -BUTTONS:1:START_STOP - - - - - -  - - - -RPI:e--BUTTON_HARNESS:w - - - - - + + +RPI + +Raspberry Pi 5 + +controller + +16-pin + +1 + +5V + +1 + +2 + +GND + +2 + +3 + +PLD + +3 + +4 + +START + +4 + +5 + +START_GND + +5 + +6 + +STOP + +6 + +7 + +STOP_GND + +7 + +8 + +RELAY + +8 + +9 + +CTRL_GND + +9 + +10 + +HDMI + +10 + +11 + +AHT_3V3 + +11 + +12 + +AHT_GND + +12 + +13 + +SDA + +13 + +14 + +SCL + +14 + +15 + +FAN_EN + +15 + +16 + +FAN_GND + +16 + + + + + +START_BUTTON_HARNESS + + +START harness + +2x +  +RPI:4:START +     1:GN:SIG     +START_BTN:1:SIGNAL + + + + + +RPI:5:START_GND +     2:BK:GND     +START_BTN:2:GND + + + + + +  + + + +RPI:e--START_BUTTON_HARNESS:w + + + + + + + + +RPI:e--START_BUTTON_HARNESS:w + + + + + + + + +STOP_BUTTON_HARNESS + + +STOP harness + +2x +  +RPI:6:STOP +     1:WH:SIG     +STOP_BTN:1:SIGNAL + + + + + +RPI:7:STOP_GND +     2:BK:GND     +STOP_BTN:2:GND + + + + + +  + + + +RPI:e--STOP_BUTTON_HARNESS:w + + + + + + + + +RPI:e--STOP_BUTTON_HARNESS:w + + + + + - + RELAY_CONTROL - - -RELAY_CONTROL - -Pi relay-control signal - -1x -  -RPI:5:GPIO_RELAY -     1:YE:relay_on_off     -RELAY:4:CTRL_IN - - - - - -  + + +relay control + +2x +  +RPI:8:RELAY +     1:YE:CTRL     +RELAY:3:CTRL + + + + + +RPI:9:CTRL_GND +     2:BK:GND     +RELAY:4:GND + + + + + +  - + RPI:e--RELAY_CONTROL:w - - - - - + + + + + + + + +RPI:e--RELAY_CONTROL:w + + + + + + + + +AHT20_I2C + + +AHT20 I2C + +4x +  +RPI:11:AHT_3V3 +     1:RD:3V3     +AHT20_SENSOR:1:VIN + + + + + +RPI:12:AHT_GND +     2:BK:GND     +AHT20_SENSOR:2:GND + + + + + +RPI:13:SDA +     3:GN:SDA     +AHT20_SENSOR:3:SDA + + + + + +RPI:14:SCL +     4:YE:SCL     +AHT20_SENSOR:4:SCL + + + + + +  + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +RPI:e--AHT20_I2C:w + + + + + + + + +FAN_CONTROL_HARNESS + + +fan GPIO control + +2x +  +RPI:15:FAN_EN +     1:YE:EN     +FAN_1:3:CTRL + + + + + +RPI:16:FAN_GND +     2:BK:GND     +FAN_1:2:GND + + + + + +  + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + + + + +RPI:e--FAN_CONTROL_HARNESS:w + + + + + - + HDMI_TO_DVI - - -HDMI_TO_DVI - -micro HDMI to DVI cable / adapter - -1x - -+ S -  -RPI:6:MICRO_HDMI -     1:BK:video_to_msd300     -MSD300:1:DVI_IN - - - - - -  -Shield - -  + + +HDMI_TO_DVI + +HDMI to DVI + +1x + ++ S +  +RPI:10:HDMI +     1:BK:video     +MSD300:1:DVI + + + + + +  +Shield + +  + + - + RPI:e--HDMI_TO_DVI:w - - - - - + + + + + - + BATTERIES - - -BATTERIES - -Samsung 30Q cells - -two 18650 backup batteries - -1-pin - -BATTERY_PAIR - -1 + + +BATTERIES + +Samsung 30Q cells + +2x 18650 + +1-pin + +PAIR + +1 + + - + BATTERY_LINK - - -BATTERY_LINK - -X1201 battery connection - -1x -  -BATTERIES:1:BATTERY_PAIR -     1:PK:battery_pair     -X1201:6:BATTERIES - - - - - -  + + +battery link + +1x +  +BATTERIES:1:PAIR +     1:PK:BATT     +X1201:6:BATT + + + + + +  - + BATTERIES:e--BATTERY_LINK:w - - - - - + + + + + - - -BUTTONS - - -BUTTONS - -APIELE push buttons - -start and stop controls - -1-pin - -1 - -START_STOP + + +START_BTN + + +START_BTN + +APIELE push button + +START + +2-pin + +1 + +SIGNAL + +2 + +GND + + + + + +STOP_BTN + + +STOP_BTN + +APIELE push button + +STOP + +2-pin + +1 + +SIGNAL + +2 + +GND + + + + + +AHT20_SENSOR + + +AHT20_SENSOR + +Adafruit AHT20 + +I2C enclosure sensor + +4-pin + +1 + +VIN + +2 + +GND + +3 + +SDA + +4 + +SCL + + - + MSD300 - - -MSD300 - -NovaStar MSD300-1 - -DVI sender - -4-pin - -1 - -DVI_IN - -1 - -2 - -5V_IN - -2 - -3 - -GND_IN - -3 - -4 - -ETHERNET_OUT - -4 + + +MSD300 + +NovaStar MSD300-1 + +sender + +4-pin + +1 + +DVI + +1 + +2 + +5V + +2 + +3 + +GND + +3 + +4 + +ETH + +4 + + - + MSD300_TO_NV3210 - - -MSD300_TO_NV3210 - -Ethernet cable - -1x -  -MSD300:4:ETHERNET_OUT -     1:BU:novastar_data     -NV3210:1:ETHERNET_IN - - - - - -  - -Shown as one complete Ethernet cable, not broken out into pairs. + + +MSD300_TO_NV3210 + +Ethernet cable + +1x +  +MSD300:4:ETH +     1:BU:novastar_data     +NV3210:1:ETH + + + + + +  + + + +One complete cable; pairs not broken out. - + MSD300:e--MSD300_TO_NV3210:w - - - - - + + + + + - + NV3210 - - -NV3210 - -NovaStar NV3210 - -receiver card - -5-pin - -1 - -ETHERNET_IN - -1 - -2 - -5V_IN - -2 - -3 - -GND_IN - -3 - -4 - -RIBBON_OUT_A - -4 - -5 - -RIBBON_OUT_B - -5 - - - -RIBBON_TO_PANELS - - -RIBBON_TO_PANELS - -LED panel ribbon cables - -2x -  -NV3210:4:RIBBON_OUT_A -     1:GY:ribbon_a     -PANELS:1:RIBBON_IN_A - - - - - -NV3210:5:RIBBON_OUT_B -     2:GY:ribbon_b     -PANELS:2:RIBBON_IN_B - - - - - -  - - - -NV3210:e--RIBBON_TO_PANELS:w - - - - - - - - -NV3210:e--RIBBON_TO_PANELS:w - - - - - - - - -FAN - - -FAN - -Easycargo 30 mm fan - -enclosure cooling - -2-pin - -1 - -5V_IN - -2 - -GND_IN - - - -PANELS - - -PANELS - -LED panels - -panel stack / display face - -2-pin - -1 - -RIBBON_IN_A - -2 - -RIBBON_IN_B - - - -AC_CABLE:e--AC_PROTECT:w - - - - - - - - -AC_CABLE:e--AC_PROTECT:w - - - - - - - - -AC_TO_PI_SUPPLY:e--PSU_PI:w - - - - - - - - -AC_TO_PI_SUPPLY:e--PSU_PI:w - - - - - - - - -AC_TO_RELAY:e--RELAY:w - - - - - - - + + +NV3210 + +NovaStar NV3210 + +receiver + +9-pin + +1 + +ETH + +1 + +2 + +5V + +2 + +3 + +GND + +3 + +4 + +R1 + +4 + +5 + +R2 + +5 + +6 + +R3 + +6 + +7 + +R4 + +7 + +8 + +R5 + +8 + +9 + +R6 + +9 + + + + + +RIBBON_TO_PANEL_1 + + +ribbon 1 + +1x +  +NV3210:4:R1 +     1:GY:data     +PANEL_1:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_1:w + + + + + + + + +RIBBON_TO_PANEL_2 + + +ribbon 2 + +1x +  +NV3210:5:R2 +     1:GY:data     +PANEL_2:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_2:w + + + + + + + + +RIBBON_TO_PANEL_3 + + +ribbon 3 + +1x +  +NV3210:6:R3 +     1:GY:data     +PANEL_3:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_3:w + + + + + + + + +RIBBON_TO_PANEL_4 + + +ribbon 4 + +1x +  +NV3210:7:R4 +     1:GY:data     +PANEL_4:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_4:w + + + + + + + + +RIBBON_TO_PANEL_5 + + +ribbon 5 + +1x +  +NV3210:8:R5 +     1:GY:data     +PANEL_5:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_5:w + + + + + + + + +RIBBON_TO_PANEL_6 + + +ribbon 6 + +1x +  +NV3210:9:R6 +     1:GY:data     +PANEL_6:3:RIBBON + + + + + +  + + + +NV3210:e--RIBBON_TO_PANEL_6:w + + + + + + + + +FAN_1 + + +FAN_1 + +30 mm fan + +1 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +FAN_2 + + +FAN_2 + +30 mm fan + +2 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +FAN_3 + + +FAN_3 + +30 mm fan + +3 of 3 + +3-pin + +1 + +5V + +2 + +GND + +3 + +CTRL + + + + + +PANEL_1 + + +PANEL_1 + +LED panel + +1 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_2 + + +PANEL_2 + +LED panel + +2 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_3 + + +PANEL_3 + +LED panel + +3 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_4 + + +PANEL_4 + +LED panel + +4 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_5 + + +PANEL_5 + +LED panel + +5 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + + +PANEL_6 + + +PANEL_6 + +LED panel + +6 of 6 + +3-pin + +1 + +5V + +2 + +GND + +3 + +RIBBON + + + + -AC_TO_RELAY:e--RELAY:w - - - - - - - +AC_LINE_NEUTRAL:e--POWER_INLET:w + + + + + + + -AC_RELAY_TO_DISPLAY_SUPPLY:e--PSU_DISPLAY:w - - - - - - - +AC_LINE_NEUTRAL:e--POWER_INLET:w + + + + + + + -AC_RELAY_TO_DISPLAY_SUPPLY:e--PSU_DISPLAY:w - - - - - - - +AC_GROUND:e--GROUND_TERMINAL:w + + + + + + + -PI_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - - - +AC_TO_PI_PSU:e--PSU_PI:w + + + + + + + -PI_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - +AC_TO_PI_PSU:e--PSU_PI:w + + + + + + + + +GROUND_TO_PI_PSU:e--PSU_PI:w + + + + + + + + +AC_TO_RELAY:e--RELAY:w + + + + + + + + +RELAY_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +NEUTRAL_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +GROUND_TO_LED_PSU:e--PSU_LED:w + + + + + + + + +PI_PSU_TO_FUSE_BOX:e--FUSE_BOX:w + + + + + + + + +PI_PSU_TO_FUSE_BOX:e--FUSE_BOX:w + + + + + - + FUSE_BOX_TO_X1201:e--X1201:w - - - - - + + + + + - + FUSE_BOX_TO_X1201:e--X1201:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + X1201_TO_PI:e--RPI:w - - - - - + + + + + - + BATTERY_LINK:e--X1201:w - - - - - + + + + + - - -BUTTON_HARNESS:e--BUTTONS:w - - - - - + + +START_BUTTON_HARNESS:e--START_BTN:w + + + + + + + + +START_BUTTON_HARNESS:e--START_BTN:w + + + + + + + + +STOP_BUTTON_HARNESS:e--STOP_BTN:w + + + + + + + + +STOP_BUTTON_HARNESS:e--STOP_BTN:w + + + + + - + RELAY_CONTROL:e--RELAY:w - - - - - + + + + + - - -DISPLAY_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - - - - -DISPLAY_SUPPLY_TO_FUSE_BOX:e--FUSE_BOX:w - - - - - + + +RELAY_CONTROL:e--RELAY:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + + + + +AHT20_I2C:e--AHT20_SENSOR:w + + + + + - + FUSE_BOX_TO_MSD300:e--MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_MSD300:e--MSD300:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210:e--NV3210:w - - - - - + + + + + - + FUSE_BOX_TO_NV3210:e--NV3210:w - - - - - - - - -FUSE_BOX_TO_FAN:e--FAN:w - - - - - - - - -FUSE_BOX_TO_FAN:e--FAN:w - - - - - + + + + + + + + +FUSE_BOX_TO_FAN_1:e--FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_1:e--FAN_1:w + + + + + + + + +FUSE_BOX_TO_FAN_2:e--FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_2:e--FAN_2:w + + + + + + + + +FUSE_BOX_TO_FAN_3:e--FAN_3:w + + + + + + + + +FUSE_BOX_TO_FAN_3:e--FAN_3:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_1:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_1:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_2:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_2:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_3:w + + + + + + + + +FAN_CONTROL_HARNESS:e--FAN_3:w + + + + + + + + +LED_PSU_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +LED_PSU_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +LED_PSU_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +LED_PSU_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +LED_PSU_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +LED_PSU_TO_PANEL_6:e--PANEL_6:w + + + + + + + + +LED_PSU_TO_PANEL_6:e--PANEL_6:w + + + + + - + HDMI_TO_DVI:e--MSD300:w - - - - - + + + + + - + MSD300_TO_NV3210:e--NV3210:w - - - - - - - - -RIBBON_TO_PANELS:e--PANELS:w - - - - - - - - -RIBBON_TO_PANELS:e--PANELS:w - - - - - + + + + + + + + +RIBBON_TO_PANEL_1:e--PANEL_1:w + + + + + + + + +RIBBON_TO_PANEL_2:e--PANEL_2:w + + + + + + + + +RIBBON_TO_PANEL_3:e--PANEL_3:w + + + + + + + + +RIBBON_TO_PANEL_4:e--PANEL_4:w + + + + + + + + +RIBBON_TO_PANEL_5:e--PANEL_5:w + + + + + + + + +RIBBON_TO_PANEL_6:e--PANEL_6:w + + + + + diff --git a/docs/wiring/out/conway-garden-client-print.pdf b/docs/wiring/out/conway-garden-client-print.pdf new file mode 100644 index 0000000..f7c2230 Binary files /dev/null and b/docs/wiring/out/conway-garden-client-print.pdf differ diff --git a/docs/wiring/readable.html b/docs/wiring/readable.html index 8c7cb66..1c840cf 100644 --- a/docs/wiring/readable.html +++ b/docs/wiring/readable.html @@ -93,6 +93,17 @@ border-bottom: 1px solid var(--line); background: #fbfcfd; } + .warning { + margin: 0 0 16px; + padding: 12px 14px; + border: 1px solid #d49a47; + border-left-width: 4px; + border-radius: 8px; + background: #fff8ed; + color: #4a3115; + font-size: 14px; + line-height: 1.4; + } @media (max-width: 760px) { header { position: static; align-items: flex-start; flex-direction: column; } nav { justify-content: flex-start; } @@ -104,6 +115,7 @@

Conway Wiring Diagram

+

+ Legacy detailed draft. The current client-facing wiring packet is + client-print.html and uses the corrected + NovaStar NV3210 receiver, separate START/STOP buttons, two 5 V PSUs, and + six LED matrix panels. +

+

Readable Sections

diff --git a/docs/wiring/test_client_wiring_contract.py b/docs/wiring/test_client_wiring_contract.py new file mode 100644 index 0000000..f36a5be --- /dev/null +++ b/docs/wiring/test_client_wiring_contract.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +"""Validation checks for the simplified client wiring package.""" + +from pathlib import Path +import re +import unittest + + +ROOT = Path(__file__).resolve().parent +WIREVIZ_IMAGES = ROOT / "assets" / "wireviz-images" +OUT = ROOT / "out" + + +class ClientWiringContractTest(unittest.TestCase): + def test_current_hardware_contract_is_visible_in_wireviz_source(self): + source = (ROOT / "conway-garden-client-overview.yml").read_text() + + self.assertIn("pinlabels: [LINE, NEUTRAL, GROUND]", source) + self.assertIn("GROUND_TERMINAL:", source) + self.assertIn("Ground terminal block", source) + + self.assertIn("PSU_PI:", source) + self.assertIn("PSU_LED:", source) + self.assertIn("subtype: switched LED 5 V", source) + + self.assertIn("START_BTN:", source) + self.assertIn("STOP_BTN:", source) + self.assertNotIn("BUTTONS:", source) + + self.assertIn("NovaStar NV3210", source) + self.assertNotIn("MRV412", source) + + for panel_number in range(1, 7): + self.assertIn(f"PANEL_{panel_number}:", source) + self.assertIn(f"LED_PSU_TO_PANEL_{panel_number}:", source) + + self.assertIn("qty: 6", source) + self.assertIn("LED matrix panels", source) + + self.assertIn("AHT20_SENSOR:", source) + self.assertIn("Adafruit AHT20", source) + self.assertIn("I2C enclosure sensor", source) + self.assertIn("FAN_CONTROL_HARNESS:", source) + self.assertIn("Pi GPIO fan-control harness", source) + self.assertIn("temperature-controlled enclosure fans", source) + self.assertIn("qty: 3", source) + for fan_number in range(1, 4): + self.assertIn(f"FAN_{fan_number}:", source) + self.assertIn(f"FUSE_BOX_TO_FAN_{fan_number}:", source) + + def test_wireviz_source_uses_native_local_images(self): + source = (ROOT / "conway-garden-client-overview.yml").read_text() + + self.assertIn("image:", source) + self.assertIn("src: assets/wireviz-images/", source) + self.assertIn('ranksep: "0.85"', source) + self.assertIn('nodesep: "0.18"', source) + self.assertIn("height: 30", source) + self.assertNotIn("height: 55", source) + self.assertIn("show_name: false", source) + self.assertIn("MSD300_TO_NV3210:", source) + self.assertIn("src: assets/wireviz-images/ethernet.png", source) + + for image_name in [ + "fuse_inlet.png", + "ground_terminal.png", + "lrs50.png", + "lrs150.png", + "relay.png", + "blue_sea.png", + "x1201.png", + "battery.png", + "pi5.png", + "push_buttons.png", + "video_adapter.png", + "msd300.png", + "ethernet.png", + "nv3210.png", + "led_matrix_panel.png", + "aht20.png", + "fan.png", + ]: + with self.subTest(image=image_name): + self.assertIn(f"assets/wireviz-images/{image_name}", source) + self.assertGreater((WIREVIZ_IMAGES / image_name).stat().st_size, 1000) + + def test_wireviz_pdf_artifact_exists(self): + pdf = OUT / "conway-garden-client-overview.pdf" + + self.assertGreater(pdf.stat().st_size, 1000) + + def test_wireviz_svg_is_compacted(self): + svg = (OUT / "conway-garden-client-overview.svg").read_text() + viewbox = re.search(r'viewBox="0\.00 0\.00 ([0-9.]+) ([0-9.]+)"', svg) + + self.assertIsNotNone(viewbox) + self.assertLess(float(viewbox.group(1)), 10000) + + def test_supporting_docs_track_three_fans_and_wireviz_pdf(self): + repo_root = ROOT.parent.parent + docs = "\n".join( + (repo_root / path).read_text() + for path in [ + "README.md", + "HARDWARE_BOM.md", + "CONSERVATION.md", + "CONTEXT.md", + "docs/wiring/README.md", + ] + ) + + self.assertIn("three Easycargo 30 mm enclosure fans", docs) + self.assertIn("out/conway-garden-client-overview.pdf", docs) + self.assertIn("primary WireViz source", docs) + self.assertIn("Adafruit AHT20", docs) + self.assertNotIn("and fan. Replace", docs) + self.assertNotIn("Noctua NF-A4x10", docs) + self.assertNotIn( + "primary client wiring packet with a compact printable diagram", + docs, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/kiosk-app/README.md b/kiosk-app/README.md index 230c0ec..14ee051 100644 --- a/kiosk-app/README.md +++ b/kiosk-app/README.md @@ -65,7 +65,7 @@ modification when the preset name changes — only the file under The display calibration is unchanged: 312x416 canvas, `xOffset=416`, `rotation=90`, `pointSize=1`. That mapping still matches the working -NovaStar MRV412 receiver configuration recorded in +NovaStar NV3210 receiver configuration recorded in `../DISPLAY_MAPPING.md`. Do not return to the older guessed `384x192` mapping unless the NovaStar mapping is intentionally rebuilt and tested. diff --git a/kiosk-app/presets/screen_001.json b/kiosk-app/presets/screen_001.json index e31b8eb..76f47b1 100644 --- a/kiosk-app/presets/screen_001.json +++ b/kiosk-app/presets/screen_001.json @@ -115,7 +115,7 @@ }, "_metadata": { "name": "Screen 001", - "description": "Conway Garden screen_001 deploy preset. Calibrated to 312x416 portrait, rotated 90deg, xOffset 416 (NovaStar MRV412 mapping). vermont_radial point cloud (18 radial chunks, dynamic loading, view cone 90deg = 5 chunks in memory). axonScaleFactor 20 (tighter framing for sparser cloud vs gradient default of 100). Conway effect cycles curated MNCA presets every 240s.", + "description": "Conway Garden screen_001 deploy preset. Calibrated to 312x416 portrait, rotated 90deg, xOffset 416 (NovaStar NV3210 mapping). vermont_radial point cloud (18 radial chunks, dynamic loading, view cone 90deg = 5 chunks in memory). axonScaleFactor 20 (tighter framing for sparser cloud vs gradient default of 100). Conway effect cycles curated MNCA presets every 240s.", "version": "1.1.0", "author": "Clement Valla", "created": "2026-05-15" diff --git a/kiosk/matrix-led-start.sh b/kiosk/matrix-led-start.sh index 40fea54..9292637 100755 --- a/kiosk/matrix-led-start.sh +++ b/kiosk/matrix-led-start.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Matrix LED start script — runs as `pi` user via matrix-led.service. +# Matrix LED start script — runs as the configured kiosk user via matrix-led.service. # Triggered when matrix-controller flips the relay ON. # # Conservation notes: @@ -15,6 +15,7 @@ PROJECT_PATH="${PROJECT_PATH:-$HOME/Desktop/conway.pointcloud.garden}" LOG_FILE="${LOG_FILE:-$HOME/conway_startup.log}" HTTP_PORT="${HTTP_PORT:-8000}" PIDFILE_DIR="${PIDFILE_DIR:-$HOME/.local/run/conway}" +CHROMIUM_BIN="${CHROMIUM_BIN:-}" mkdir -p "$PIDFILE_DIR" HTTP_PIDFILE="$PIDFILE_DIR/http.pid" CHROME_PIDFILE="$PIDFILE_DIR/chrome.pid" @@ -22,6 +23,14 @@ CHROME_PIDFILE="$PIDFILE_DIR/chrome.pid" log() { printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" | tee -a "$LOG_FILE"; } err() { log "ERROR: $1"; } +if [ -z "$CHROMIUM_BIN" ]; then + CHROMIUM_BIN="$(command -v chromium-browser || command -v chromium || true)" +fi +if [ -z "$CHROMIUM_BIN" ]; then + err "Chromium executable not found (tried chromium-browser and chromium)" + exit 1 +fi + cleanup() { log "matrix-led-start: stopping (cleanup)" for pf in "$CHROME_PIDFILE" "$HTTP_PIDFILE"; do @@ -114,7 +123,7 @@ rm -f "$CHROMIUM_PROFILE/SingletonLock" \ KIOSK_URL="http://localhost:$HTTP_PORT/?v=$(date +%s)" log "Launching Chromium kiosk -> $KIOSK_URL" -chromium-browser \ +"$CHROMIUM_BIN" \ --kiosk \ --start-fullscreen \ --window-position=0,0 \ @@ -124,6 +133,7 @@ chromium-browser \ --noerrdialogs \ --no-first-run \ --no-default-browser-check \ + --password-store=basic \ --disable-infobars \ --disable-restore-session-state \ --disable-session-crashed-bubble \ diff --git a/kiosk/matrix-led.service.in b/kiosk/matrix-led.service.in new file mode 100644 index 0000000..7102ed8 --- /dev/null +++ b/kiosk/matrix-led.service.in @@ -0,0 +1,29 @@ +[Unit] +Description=Conway Point Cloud Garden LED Display +After=graphical.target network.target +Requires=graphical.target + +[Service] +Type=simple +User={{CONWAY_USER}} +Group={{CONWAY_GROUP}} +WorkingDirectory={{CONWAY_HOME}}/Desktop/conway.pointcloud.garden + +Environment=DISPLAY=:0 +Environment=XAUTHORITY={{CONWAY_HOME}}/.Xauthority +Environment=HOME={{CONWAY_HOME}} + +ExecStart={{CONWAY_HOME}}/Desktop/matrix-led-start.sh + +# matrix-led-start.sh installs a TRAP that cleans up its own children via +# pidfiles. KillMode=control-group ensures any stragglers also die. +Restart=no +KillMode=control-group +KillSignal=SIGTERM +# A normal STOP path terminates Chromium/http.server and the wrapper exits 143. +SuccessExitStatus=143 +TimeoutStopSec=10 +SendSIGKILL=yes + +[Install] +WantedBy=graphical.target diff --git a/screen_config/README.md b/screen_config/README.md new file mode 100644 index 0000000..fb3633b --- /dev/null +++ b/screen_config/README.md @@ -0,0 +1,14 @@ +# Historical Receiver Firmware + +This directory preserves a NovaStar MRV412 firmware package as historical +service evidence. Its presence does not identify the receiver installed in +Conway Pointcloud Garden. + +The current documented Display Chain uses a NovaStar NV3210 receiver. These +MRV412 files must not be flashed, installed, or treated as the current receiver +configuration without new physical identification, a reviewed recovery plan, +and a verified export of the installed configuration. + +See +[`docs/adr/0001-preserve-receiver-firmware-as-history.md`](../docs/adr/0001-preserve-receiver-firmware-as-history.md) +for the decision and evidence boundary. diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh index f93e868..e112faf 100644 --- a/scripts/bootstrap.sh +++ b/scripts/bootstrap.sh @@ -5,12 +5,13 @@ # # Pre-req: # 1. Pi 5 with fresh Raspberry Pi OS Bookworm 64-bit (Lite or Desktop). -# 2. User `pi` exists, autologin enabled (Desktop edition default). +# 2. The kiosk user exists and has graphical autologin enabled. # 3. This repo cloned somewhere accessible. # 4. This repo includes kiosk-app/ with the static web app. # # Run with: # sudo bash scripts/bootstrap.sh +# sudo CONWAY_USER=reid CONWAY_HOSTNAME=point2 bash scripts/bootstrap.sh # set -e @@ -20,7 +21,23 @@ if [ "$EUID" -ne 0 ]; then fi REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +CONWAY_USER="${CONWAY_USER:-pi}" +if ! id "$CONWAY_USER" >/dev/null 2>&1; then + echo "Error: kiosk user does not exist: $CONWAY_USER" + exit 1 +fi +CONWAY_GROUP="${CONWAY_GROUP:-$(id -gn "$CONWAY_USER")}" +CONWAY_HOME="${CONWAY_HOME:-$(getent passwd "$CONWAY_USER" | cut -d: -f6)}" +CONWAY_HOSTNAME="${CONWAY_HOSTNAME:-conway-garden-1}" +case "$CONWAY_HOME" in + /*) ;; + *) + echo "Error: kiosk home must be an absolute path: $CONWAY_HOME" + exit 1 + ;; +esac echo "Bootstrap from $REPO_ROOT" +echo "Installation profile: user=$CONWAY_USER group=$CONWAY_GROUP home=$CONWAY_HOME hostname=$CONWAY_HOSTNAME" echo "" # 1. Install the controller (apt deps + Python package + systemd unit). @@ -30,14 +47,21 @@ echo "" # 2. Install the kiosk start script + service + web app. echo "=== 2. Installing kiosk start script + web app ===" -install -m 0755 -o pi -g pi "$REPO_ROOT/kiosk/matrix-led-start.sh" /home/pi/Desktop/matrix-led-start.sh -install -m 0644 "$REPO_ROOT/kiosk/matrix-led.service" /etc/systemd/system/matrix-led.service +install -d -m 0755 -o "$CONWAY_USER" -g "$CONWAY_GROUP" "$CONWAY_HOME/Desktop" +install -m 0755 -o "$CONWAY_USER" -g "$CONWAY_GROUP" \ + "$REPO_ROOT/kiosk/matrix-led-start.sh" "$CONWAY_HOME/Desktop/matrix-led-start.sh" +python3 "$REPO_ROOT/scripts/render_kiosk_service.py" \ + --user "$CONWAY_USER" \ + --group "$CONWAY_GROUP" \ + --home "$CONWAY_HOME" \ + --output /etc/systemd/system/matrix-led.service +chmod 0644 /etc/systemd/system/matrix-led.service if [ -d "$REPO_ROOT/kiosk-app" ]; then - KIOSK_DEST=/home/pi/Desktop/conway.pointcloud.garden + KIOSK_DEST="$CONWAY_HOME/Desktop/conway.pointcloud.garden" rm -rf "$KIOSK_DEST" cp -r "$REPO_ROOT/kiosk-app" "$KIOSK_DEST" rm -f "$KIOSK_DEST/README.md" # repo doc, not part of the running app - chown -R pi:pi "$KIOSK_DEST" + chown -R "$CONWAY_USER:$CONWAY_GROUP" "$KIOSK_DEST" echo " kiosk web app restored to $KIOSK_DEST" else echo " WARNING: $REPO_ROOT/kiosk-app missing — the kiosk will load a blank page" @@ -110,15 +134,16 @@ echo "" # 8. Set hostname. echo "=== 8. Setting hostname ===" -if [ "$(hostnamectl --static)" != "conway-garden-1" ]; then - hostnamectl set-hostname conway-garden-1 - sed -i "s/$(hostname)/conway-garden-1/g" /etc/hosts || true +if [ "$(hostnamectl --static)" != "$CONWAY_HOSTNAME" ]; then + OLD_HOSTNAME="$(hostname)" + hostnamectl set-hostname "$CONWAY_HOSTNAME" + sed -i "s/$OLD_HOSTNAME/$CONWAY_HOSTNAME/g" /etc/hosts || true fi echo "" echo "=============================================" echo "Bootstrap complete. Required next steps:" -echo " 1. Add your SSH public key to /home/pi/.ssh/authorized_keys" +echo " 1. Add your SSH public key to $CONWAY_HOME/.ssh/authorized_keys" echo " 2. Review /boot/firmware/config.txt against system/boot-firmware-config.txt" echo " 3. Reboot to engage the hardware watchdog." echo " 4. Verify: systemctl status matrix-controller && journalctl -t conway-health -n 5" diff --git a/scripts/render_kiosk_service.py b/scripts/render_kiosk_service.py new file mode 100644 index 0000000..7ced4a0 --- /dev/null +++ b/scripts/render_kiosk_service.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +"""Render the kiosk systemd unit for an installation account.""" + +from __future__ import annotations + +import argparse +import re +from pathlib import Path, PurePosixPath + + +ROOT = Path(__file__).resolve().parents[1] +TEMPLATE_PATH = ROOT / "kiosk" / "matrix-led.service.in" +ACCOUNT_PATTERN = re.compile(r"[a-z_][a-z0-9_-]*[$]?") + + +def account_name(value: str) -> str: + if not ACCOUNT_PATTERN.fullmatch(value): + raise argparse.ArgumentTypeError(f"invalid account name: {value!r}") + return value + + +def absolute_home(value: str) -> str: + path = PurePosixPath(value) + if not path.is_absolute() or any(character.isspace() for character in value): + raise argparse.ArgumentTypeError( + "home must be an absolute POSIX path without whitespace" + ) + return str(path) + + +def render(*, user: str, group: str, home: str) -> str: + service = TEMPLATE_PATH.read_text(encoding="utf-8") + replacements = { + "{{CONWAY_USER}}": user, + "{{CONWAY_GROUP}}": group, + "{{CONWAY_HOME}}": home, + } + for placeholder, value in replacements.items(): + if placeholder not in service: + raise ValueError(f"missing template placeholder: {placeholder}") + service = service.replace(placeholder, value) + if "{{CONWAY_" in service: + raise ValueError("unresolved Conway service placeholder") + return service + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--user", type=account_name, default="pi") + parser.add_argument("--group", type=account_name, default="pi") + parser.add_argument("--home", type=absolute_home, default="/home/pi") + parser.add_argument("--output", type=Path) + arguments = parser.parse_args() + + service = render( + user=arguments.user, + group=arguments.group, + home=arguments.home, + ) + if arguments.output: + arguments.output.write_text(service, encoding="utf-8") + else: + print(service, end="") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_point2_installation.py b/tests/test_point2_installation.py new file mode 100644 index 0000000..17fe594 --- /dev/null +++ b/tests/test_point2_installation.py @@ -0,0 +1,301 @@ +import base64 +import json +import os +import subprocess +import textwrap +import unittest + + +TARGET = os.environ.get("CONWAY_TEST_TARGET", "reid@point2") +LIVE_TESTS_ENABLED = os.environ.get("CONWAY_RUN_LIVE_TESTS") == "1" + + +def run_remote_python(source: str) -> str: + payload = base64.b64encode(textwrap.dedent(source).encode()).decode() + command = f"python3 -c \"import base64;exec(base64.b64decode('{payload}'))\"" + result = subprocess.run( + ["ssh", "-o", "BatchMode=yes", TARGET, command], + check=True, + capture_output=True, + text=True, + timeout=20, + ) + return result.stdout.strip() + + +@unittest.skipUnless( + LIVE_TESTS_ENABLED, + "set CONWAY_RUN_LIVE_TESTS=1 to run tests against the Point2 installation", +) +class Point2InstallationTests(unittest.TestCase): + def test_kiosk_service_renders_conway_canvas(self): + raw = run_remote_python( + """ + import json + import requests + import websocket + + targets = requests.get("http://127.0.0.1:9222/json", timeout=3).json() + target = next(t for t in targets if t.get("type") == "page") + try: + ws = websocket.create_connection(target["webSocketDebuggerUrl"], timeout=5) + ws.send(json.dumps({ + "id": 1, + "method": "Runtime.evaluate", + "params": { + "expression": "({href:location.href,title:document.title,canvas:document.getElementsByTagName('canvas').length})", + "returnByValue": True, + }, + })) + while True: + message = json.loads(ws.recv()) + if message.get("id") == 1: + print(json.dumps(message["result"]["result"]["value"])) + break + except Exception as error: + print(json.dumps({"error": f"{type(error).__name__}: {error}"})) + """ + ) + page = json.loads(raw) + self.assertNotIn("error", page, page) + self.assertTrue(page["href"].startswith("http://localhost:8000/"), page) + self.assertEqual(page["title"], "Conway Pointcloud Garden") + self.assertGreaterEqual(page["canvas"], 1) + + def test_kiosk_uses_verified_novastar_mapping(self): + raw = run_remote_python( + """ + import json + import requests + import websocket + + targets = requests.get("http://127.0.0.1:9222/json", timeout=3).json() + target = next(t for t in targets if t.get("type") == "page") + ws = websocket.create_connection(target["webSocketDebuggerUrl"], timeout=5) + ws.send(json.dumps({ + "id": 1, + "method": "Runtime.evaluate", + "params": { + "expression": "(() => { const c=document.getElementsByTagName('canvas')[0]; const r=c.getBoundingClientRect(); return {width:c.width,height:c.height,clientWidth:c.clientWidth,clientHeight:c.clientHeight,rectWidth:r.width,rectHeight:r.height,transform:getComputedStyle(c).transform}; })()", + "returnByValue": True, + }, + })) + while True: + message = json.loads(ws.recv()) + if message.get("id") == 1: + print(json.dumps(message["result"]["result"]["value"])) + break + """ + ) + canvas = json.loads(raw) + self.assertEqual((canvas["width"], canvas["height"]), (312, 416)) + self.assertEqual((canvas["clientWidth"], canvas["clientHeight"]), (312, 416)) + self.assertAlmostEqual(canvas["rectWidth"], 416, delta=1) + self.assertAlmostEqual(canvas["rectHeight"], 312, delta=1) + self.assertEqual(canvas["transform"], "matrix(0, 1, -1, 0, 0, 0)") + + def test_novastar_output_contains_mapped_artwork(self): + raw = run_remote_python( + """ + import json + import os + import subprocess + import tempfile + import time + from PIL import Image + import requests + import websocket + + deadline = time.time() + 15 + while True: + targets = requests.get("http://127.0.0.1:9222/json", timeout=3).json() + target = next(t for t in targets if t.get("type") == "page") + ws = websocket.create_connection(target["webSocketDebuggerUrl"], timeout=5) + ws.send(json.dumps({ + "id": 1, + "method": "Runtime.evaluate", + "params": { + "expression": "getComputedStyle(document.getElementById('loading-overlay')).display", + "returnByValue": True, + }, + })) + display = None + while True: + message = json.loads(ws.recv()) + if message.get("id") == 1: + display = message["result"]["result"]["value"] + break + ws.close() + if display == "none": + break + if time.time() >= deadline: + raise RuntimeError(f"loading overlay remained {display!r}") + time.sleep(0.25) + + with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as handle: + path = handle.name + try: + environment = os.environ | { + "XDG_RUNTIME_DIR": "/run/user/1000", + "WAYLAND_DISPLAY": "wayland-0", + } + subprocess.run( + ["grim", "-o", "HDMI-A-1", path], + check=True, + env=environment, + timeout=5, + ) + image = Image.open(path).convert("RGB") + bounds = image.getbbox() + colors = image.getcolors(maxcolors=image.width * image.height) or [] + print(json.dumps({ + "size": image.size, + "bounds": bounds, + "color_count": len(colors), + })) + finally: + os.unlink(path) + """ + ) + output = json.loads(raw) + self.assertEqual(output["size"], [1920, 1080]) + self.assertGreater(output["color_count"], 100) + left, top, right, bottom = output["bounds"] + self.assertGreater(right - left, 100) + self.assertGreater(bottom - top, 100) + self.assertGreaterEqual(left, 0) + self.assertGreaterEqual(top, 0) + self.assertLessEqual(right, 418) + self.assertLessEqual(bottom, 314) + + def test_installation_contract_is_durable(self): + state = json.loads( + run_remote_python( + """ + import json + import os + import subprocess + + def systemctl(*arguments): + return subprocess.check_output( + ["systemctl", *arguments], text=True + ).strip() + + properties = {} + for line in systemctl( + "show", + "matrix-led.service", + "--property=User", + "--property=Group", + "--property=WorkingDirectory", + "--property=ExecStart", + ).splitlines(): + key, value = line.split("=", 1) + properties[key] = value + + print(json.dumps({ + "matrix_led_active": systemctl("is-active", "matrix-led.service"), + "matrix_controller_enabled": systemctl("is-enabled", "matrix-controller.service"), + "health_active": systemctl("is-active", "conway-health.timer"), + "health_enabled": systemctl("is-enabled", "conway-health.timer"), + "ssh_active": systemctl("is-active", "ssh.service"), + "tailscale_active": systemctl("is-active", "tailscaled.service"), + "properties": properties, + "runtime_app": os.path.isdir("/home/reid/Desktop/conway.pointcloud.garden"), + "runtime_launcher": os.access("/home/reid/Desktop/matrix-led-start.sh", os.X_OK), + "controller_config": os.path.isfile("/etc/matrix-controller/controller.yaml"), + })) + """ + ) + ) + self.assertEqual(state["matrix_led_active"], "active") + self.assertEqual(state["matrix_controller_enabled"], "enabled") + self.assertEqual(state["health_active"], "active") + self.assertEqual(state["health_enabled"], "enabled") + self.assertEqual(state["ssh_active"], "active") + self.assertEqual(state["tailscale_active"], "active") + self.assertEqual(state["properties"]["User"], "reid") + self.assertEqual(state["properties"]["Group"], "reid") + self.assertEqual( + state["properties"]["WorkingDirectory"], + "/home/reid/Desktop/conway.pointcloud.garden", + ) + self.assertIn("/home/reid/Desktop/matrix-led-start.sh", state["properties"]["ExecStart"]) + self.assertTrue(state["runtime_app"]) + self.assertTrue(state["runtime_launcher"]) + self.assertTrue(state["controller_config"]) + + def test_controller_enters_safe_idle_and_owns_gpio(self): + state = json.loads( + run_remote_python( + """ + import json + import subprocess + import time + import urllib.request + + def run(*arguments, check=True): + return subprocess.run( + arguments, + check=check, + capture_output=True, + text=True, + timeout=15, + ) + + observed = {} + try: + run("sudo", "systemctl", "start", "--no-block", "matrix-controller.service") + time.sleep(4) + observed["controller"] = run( + "systemctl", "is-active", "matrix-controller.service", check=False + ).stdout.strip() + observed["kiosk"] = run( + "systemctl", "is-active", "matrix-led.service", check=False + ).stdout.strip() + observed["gpio"] = { + str(pin): run("sudo", "pinctrl", "get", str(pin)).stdout.strip() + for pin in (6, 18, 19, 20) + } + observed["journal"] = run( + "journalctl", + "-u", + "matrix-controller.service", + "--since", + "-2 minutes", + "--no-pager", + ).stdout + finally: + run("sudo", "systemctl", "stop", "matrix-controller.service", check=False) + run("sudo", "systemctl", "start", "matrix-led.service", check=False) + run("sudo", "pinctrl", "set", "20", "op", "dh", check=False) + deadline = time.time() + 12 + while time.time() < deadline: + try: + targets = json.load(urllib.request.urlopen( + "http://127.0.0.1:9222/json", timeout=1 + )) + if any( + target.get("title") == "Conway Pointcloud Garden" + for target in targets + ): + break + except Exception: + pass + time.sleep(0.25) + print(json.dumps(observed)) + """ + ) + ) + self.assertEqual(state["controller"], "active", state["journal"]) + self.assertEqual(state["kiosk"], "inactive") + self.assertIn("GPIO18 = input", state["gpio"]["18"]) + self.assertIn("GPIO19 = input", state["gpio"]["19"]) + self.assertIn("GPIO20 = output", state["gpio"]["20"]) + self.assertIn(" lo ", state["gpio"]["20"]) + self.assertNotIn("[ERROR]", state["journal"]) + self.assertNotIn("[CRITICAL]", state["journal"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_repository_contract.py b/tests/test_repository_contract.py new file mode 100644 index 0000000..a36c159 --- /dev/null +++ b/tests/test_repository_contract.py @@ -0,0 +1,160 @@ +import subprocess +import sys +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + + +class RepositoryContractTests(unittest.TestCase): + def test_current_display_chain_is_distinct_from_historical_firmware(self) -> None: + context = (ROOT / "CONTEXT.md").read_text(encoding="utf-8") + decision = ( + ROOT / "docs" / "adr" / "0001-preserve-receiver-firmware-as-history.md" + ).read_text(encoding="utf-8") + firmware_readme_path = ROOT / "screen_config" / "README.md" + decision = " ".join(decision.split()) + + self.assertIn("Display chain", context) + self.assertIn("NovaStar NV3210", context) + self.assertIn("Historical Receiver Firmware", context) + self.assertIn("screen_config/", decision) + self.assertIn("does not identify the installed receiver", decision) + self.assertIn("must not be deployed", decision) + self.assertTrue(firmware_readme_path.is_file()) + firmware_readme = firmware_readme_path.read_text(encoding="utf-8") + self.assertIn("Historical Receiver Firmware", firmware_readme) + self.assertIn("NovaStar NV3210", firmware_readme) + self.assertIn("must not be flashed", firmware_readme) + + def test_project_documentation_contract_is_resumable(self) -> None: + for relative_path in ["README.md", "PROJECT.md", "AGENTS.md", "CONTEXT.md"]: + with self.subTest(path=relative_path): + self.assertGreater( + (ROOT / relative_path).stat().st_size, + 100, + ) + + project = (ROOT / "PROJECT.md").read_text(encoding="utf-8") + for heading in [ + "## Goal", + "## Current objective", + "## Confirmed working", + "## Failed approaches", + "## Decisions", + "## Blockers", + "## Next action", + "## Last verified", + ]: + with self.subTest(heading=heading): + self.assertIn(heading, project) + + agents = (ROOT / "AGENTS.md").read_text(encoding="utf-8") + self.assertIn("docs/agents/issue-tracker.md", agents) + self.assertIn("docs/agents/triage-labels.md", agents) + self.assertIn("docs/agents/domain.md", agents) + + def test_readme_distinguishes_original_and_point2_installations(self) -> None: + readme = (ROOT / "README.md").read_text(encoding="utf-8") + profile_decision_path = ( + ROOT / "docs" / "adr" / "0002-explicit-installation-profiles.md" + ) + + self.assertIn("Original Installation", readme) + self.assertIn("Point2 Replacement Installation", readme) + self.assertIn("last live-verified on 2026-07-21", readme) + self.assertIn("Point2 is currently offline", readme) + self.assertIn("[PROJECT.md](PROJECT.md)", readme) + self.assertIn( + "CONWAY_USER=reid CONWAY_HOSTNAME=point2", + readme, + ) + self.assertTrue(profile_decision_path.is_file()) + profile_decision = profile_decision_path.read_text(encoding="utf-8") + self.assertIn("defaults remain `pi` and `conway-garden-1`", profile_decision) + self.assertIn("does not prove a live deployment", profile_decision) + + def test_kiosk_launcher_supports_point2_chromium(self) -> None: + launcher = (ROOT / "kiosk" / "matrix-led-start.sh").read_text( + encoding="utf-8" + ) + + self.assertIn("--password-store=basic", launcher) + self.assertIn("command -v chromium-browser", launcher) + self.assertIn("command -v chromium", launcher) + self.assertNotIn("\nchromium-browser \\\n", launcher) + + def test_kiosk_service_profile_preserves_pi_and_supports_point2(self) -> None: + renderer = ROOT / "scripts" / "render_kiosk_service.py" + template = ROOT / "kiosk" / "matrix-led.service.in" + checked_in_pi_service = (ROOT / "kiosk" / "matrix-led.service").read_text( + encoding="utf-8" + ) + + self.assertTrue(renderer.is_file()) + self.assertTrue(template.is_file()) + + default_result = subprocess.run( + [sys.executable, str(renderer)], + check=True, + capture_output=True, + text=True, + ) + self.assertEqual(default_result.stdout, checked_in_pi_service) + + point2_result = subprocess.run( + [ + sys.executable, + str(renderer), + "--user", + "reid", + "--group", + "reid", + "--home", + "/home/reid", + ], + check=True, + capture_output=True, + text=True, + ) + point2_service = point2_result.stdout + self.assertIn("User=reid", point2_service) + self.assertIn("Group=reid", point2_service) + self.assertIn("WorkingDirectory=/home/reid/Desktop/", point2_service) + self.assertNotIn("/home/pi", point2_service) + + bootstrap = (ROOT / "scripts" / "bootstrap.sh").read_text(encoding="utf-8") + self.assertIn('CONWAY_USER="${CONWAY_USER:-pi}"', bootstrap) + self.assertIn("render_kiosk_service.py", bootstrap) + + def test_ci_validates_local_contracts_without_contacting_point2(self) -> None: + workflow_path = ROOT / ".github" / "workflows" / "validate.yml" + self.assertTrue(workflow_path.is_file()) + workflow = workflow_path.read_text(encoding="utf-8") + + self.assertIn("python-version: \"3.12\"", workflow) + self.assertIn("python3 -m unittest discover -s tests -v", workflow) + self.assertIn( + "python3 -m unittest discover -s docs/wiring -p 'test_*.py' -v", + workflow, + ) + self.assertIn("python3 -m compileall -q", workflow) + self.assertIn("bash -n kiosk/matrix-led-start.sh", workflow) + self.assertIn("bash -n scripts/bootstrap.sh", workflow) + self.assertIn("scripts/render_kiosk_service.py", workflow) + self.assertNotIn("CONWAY_RUN_LIVE_TESTS", workflow) + self.assertNotIn("ssh ", workflow) + + def test_generated_bom_preserves_its_empty_final_tsv_field(self) -> None: + attributes_path = ROOT / ".gitattributes" + self.assertTrue(attributes_path.is_file()) + attributes = attributes_path.read_text(encoding="utf-8") + self.assertIn( + "docs/wiring/out/*.bom.tsv -whitespace", + attributes, + ) + + +if __name__ == "__main__": + unittest.main()