Skip to main content

Programmatically generate Raspberry Pi GPIO connection diagrams

Project description

PinViz

PinViz Logo

CI Documentation License: MIT Python 3.12+ PyPI version PyPI Downloads

Programmatically generate beautiful Raspberry Pi GPIO connection diagrams in SVG format.

PinViz makes it easy to create clear, professional wiring diagrams for your Raspberry Pi projects. Define your connections using simple YAML/JSON files or Python code, and automatically generate publication-ready SVG diagrams.

PinViz Quick Demo

๐Ÿ“š Table of Contents


โœจ Features

๐Ÿ“ฆ PinViz Package

Core capabilities for creating wiring diagrams:

  • Declarative Configuration: Define diagrams using YAML or JSON files
  • Programmatic API: Create diagrams with Python code
  • Automatic Wire Routing: Smart wire routing with configurable styles (orthogonal, curved, mixed)
  • Inline Components: Add resistors, capacitors, and diodes directly on wires
  • Color-Coded Wires: Automatic color assignment based on pin function (I2C, SPI, power, ground, etc.)
  • Built-in Templates: Pre-configured boards (Raspberry Pi 5, Pi Zero) and common devices
  • GPIO Pin Reference: Optional GPIO pinout diagram for easy reference
  • SVG Output: Scalable, high-quality vector graphics
๐Ÿ‘‰ View Python API example (click to expand)
from pinviz import boards, devices, Connection, Diagram, SVGRenderer

board = boards.raspberry_pi_5()
sensor = devices.bh1750_light_sensor()

connections = [
    Connection(1, "BH1750", "VCC"),  # 3V3 to VCC
    Connection(6, "BH1750", "GND"),  # GND to GND
    Connection(5, "BH1750", "SCL"),  # GPIO3/SCL to SCL
    Connection(3, "BH1750", "SDA"),  # GPIO2/SDA to SDA
]

diagram = Diagram(
    title="BH1750 Light Sensor",
    board=board,
    devices=[sensor],
    connections=connections
)

renderer = SVGRenderer()
renderer.render(diagram, "output.svg")

โ†’ Full CLI documentation | โ†’ Python API reference

๐Ÿค– MCP Server (AI-Powered)

Generate diagrams from natural language with AI assistants:

  • Natural Language: "Connect BME280 and LED to my Raspberry Pi"
  • Intelligent Pin Assignment: Automatic I2C bus sharing, SPI chip select allocation, and conflict detection
  • 25+ Device Database: Sensors, displays, HATs, components with automatic pin mapping
  • URL-Based Discovery: Add new devices by parsing datasheets from manufacturer websites
  • AI Integration: Works with Claude Desktop, GitHub Copilot, and other MCP-compatible clients

โ†’ MCP Server documentation

๐Ÿ“ฅ Installation

For CLI Usage (Recommended)

Install as a standalone tool with global access to the CLI:

uv tool install pinviz

After installation, pinviz will be available globally in your terminal. See Quick Start below to generate your first diagram.

As a Project Dependency

If you want to use PinViz as a library in your Python project:

# Using uv
uv add pinviz

# Using pip
pip install pinviz

Note: If you install with uv add, the CLI tool will only be available via uv run pinviz. For direct CLI access, use uv tool install instead.

๐Ÿš€ Quick Start

1. Try a Built-in Example

The fastest way to get started is to generate one of the built-in examples:

# Generate a BH1750 light sensor wiring diagram
pinviz example bh1750 -o bh1750.svg

# See all available examples
pinviz list

This creates an SVG file you can open in any web browser or vector graphics editor.

Note: If you installed with uv add instead of uv tool install, prefix commands with uv run:

uv run pinviz example bh1750 -o bh1750.svg

2. Create Your Own Diagram

Once you've seen what PinViz can do, create your own configuration file using YAML or JSON format.

YAML format (my-diagram.yaml):

title: "BH1750 Light Sensor Wiring"
board: "raspberry_pi_5"  # or "raspberry_pi_zero_2w" for Pi Zero

devices:
  - type: "bh1750"
    name: "BH1750"

connections:
  - board_pin: 1     # 3V3
    device: "BH1750"
    device_pin: "VCC"

  - board_pin: 6     # GND
    device: "BH1750"
    device_pin: "GND"

  - board_pin: 5     # GPIO3 (I2C SCL)
    device: "BH1750"
    device_pin: "SCL"

  - board_pin: 3     # GPIO2 (I2C SDA)
    device: "BH1750"
    device_pin: "SDA"

show_gpio_diagram: true  # Optional: include GPIO pin reference

JSON format (my-diagram.json):

{
  "title": "BH1750 Light Sensor Wiring",
  "board": "raspberry_pi_5",
  "devices": [
    {
      "type": "bh1750",
      "name": "BH1750"
    }
  ],
  "connections": [
    {"board_pin": 1, "device": "BH1750", "device_pin": "VCC"},
    {"board_pin": 6, "device": "BH1750", "device_pin": "GND"},
    {"board_pin": 5, "device": "BH1750", "device_pin": "SCL"},
    {"board_pin": 3, "device": "BH1750", "device_pin": "SDA"}
  ],
  "show_gpio_diagram": true
}

Generate your diagram (works with both YAML and JSON):

pinviz render my-diagram.yaml -o output.svg

3. Using Python API

For programmatic diagram generation in your Python projects:

from pinviz import boards, devices, Connection, Diagram, SVGRenderer

# Create board and device
board = boards.raspberry_pi_5()  # or boards.raspberry_pi_zero_2w()
sensor = devices.bh1750_light_sensor()

# Define connections
connections = [
    Connection(1, "BH1750", "VCC"),  # 3V3 to VCC
    Connection(6, "BH1750", "GND"),  # GND to GND
    Connection(5, "BH1750", "SCL"),  # GPIO3/SCL to SCL
    Connection(3, "BH1750", "SDA"),  # GPIO2/SDA to SDA
]

# Create and render diagram
diagram = Diagram(
    title="BH1750 Light Sensor Wiring",
    board=board,
    devices=[sensor],
    connections=connections,
    show_gpio_diagram=True  # Optional: include GPIO pin reference
)

renderer = SVGRenderer()
renderer.render(diagram, "output.svg")
๐Ÿ‘‰ Custom Wire Colors (click to expand)

Use the WireColor enum for standard electronics wire colors:

from pinviz import (
    boards, devices, Connection, Diagram, SVGRenderer, WireColor
)

# Define connections with custom colors
connections = [
    Connection(1, "BH1750", "VCC", color=WireColor.RED),
    Connection(6, "BH1750", "GND", color=WireColor.BLACK),
    Connection(5, "BH1750", "SCL", color=WireColor.BLUE),
    Connection(3, "BH1750", "SDA", color=WireColor.GREEN),
]

# Or use hex colors directly
connections = [
    Connection(1, "BH1750", "VCC", color="#FF0000"),  # Red
]

Available colors: RED, BLACK, WHITE, GREEN, BLUE, YELLOW, ORANGE, PURPLE, GRAY, BROWN, PINK, CYAN, MAGENTA, LIME, TURQUOISE

๐Ÿ’ป CLI Commands

See the Quick Start section for basic usage. All examples below assume you installed with uv tool install pinviz or pip install pinviz. If you installed with uv add, prefix all commands with uv run.

Rendering Custom Diagrams

# From YAML/JSON file with specified output
pinviz render my-diagram.yaml -o output.svg

# Short form (output defaults to <config-name>.svg)
pinviz render my-diagram.yaml

Working with Built-in Examples

# List all available built-in examples
pinviz list

# Generate a specific example
pinviz example bh1750 -o bh1750.svg
pinviz example ir_led -o ir_led.svg
pinviz example i2c_spi -o i2c_spi.svg

โ†’ Full CLI documentation

๐Ÿค– MCP Server (AI-Powered)

PinViz includes an MCP (Model Context Protocol) server that enables natural language diagram generation through AI assistants like Claude Desktop.

Generate diagrams with prompts like:

  • "Connect a BME280 temperature sensor to my Raspberry Pi 5"
  • "Wire a BH1750 light sensor and LED on GPIO 17"
  • "Set up environmental monitoring with BME280 and DHT22"
๐Ÿ‘‰ ๐Ÿ“– Quick Start with Claude Desktop (click to expand)

Installation

Easiest Method (using Claude CLI):

# Using uv (recommended)
uv tool install pinviz
claude mcp add pinviz pinviz-mcp

# OR using pip
pip install pinviz
claude mcp add pinviz pinviz-mcp

# Restart Claude Desktop

Manual Method (edit config file):

  1. Install PinViz:

    # Using uv (recommended)
    uv tool install pinviz
    
    # OR using pip
    pip install pinviz
    
  2. Configure Claude Desktop:

    Edit ~/.config/claude/claude_desktop_config.json (macOS/Linux) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

    {
      "mcpServers": {
        "pinviz": {
          "command": "pinviz-mcp"
        }
      }
    }
    
  3. Restart Claude Desktop

Start generating diagrams:

"Connect a BME280 temperature sensor to my Raspberry Pi 5"
๐Ÿ‘‰ ๐Ÿ”ง GitHub Copilot (VS Code) (click to expand)
  1. Install PinViz:

    # Using uv (recommended)
    uv tool install pinviz
    
    # OR using pip
    pip install pinviz
    
  2. Add to your VS Code settings.json:

    {
      "github.copilot.chat.mcp.servers": {
        "pinviz": {
          "command": "pinviz-mcp"
        }
      }
    }
    
  3. Reload VS Code and use @pinviz in Copilot Chat:

    @pinviz Connect BME280 and LED to Raspberry Pi 5
    
๐Ÿ‘‰ โœจ Key Features (click to expand)

Intelligent Pin Assignment:

  • Automatic I2C bus sharing (multiple devices on SDA/SCL)
  • SPI chip select allocation (CE0, CE1)
  • Power distribution (cycles through 3.3V and 5V pins)
  • Conflict detection and resolution

Device Database:

  • 25+ devices covering sensors, displays, HATs, and components
  • Categories: sensor, display, hat, component, actuator, breakout
  • Protocols: I2C, SPI, UART, GPIO, 1-Wire, PWM

Hybrid Parsing:

  • Regex patterns for common prompts (80% of cases, instant)
  • Claude API fallback for complex prompts (20% of cases)
๐Ÿ‘‰ ๐Ÿ› ๏ธ Available MCP Tools (click to expand)
  • generate_diagram - Convert natural language to wiring diagrams (YAML/JSON/summary)
  • list_devices - Browse 25+ devices by category/protocol
  • get_device_info - Get detailed device specifications
  • search_devices_by_tags - Find devices by tags
  • parse_device_from_url - Add new devices from datasheet URLs
  • get_database_summary - View database statistics

๐Ÿ“– Full MCP Documentation:

๐Ÿ–ผ๏ธ Example Diagrams

๐Ÿ’ก Click any example below to view the code and diagram!

๐Ÿ‘‰ LED with Resistor - Simple circuit with inline component (click to expand)
pinviz render examples/led_with_resistor.yaml -o led_with_resistor.svg

LED with Resistor

๐Ÿ‘‰ Multi-Device Setup - BH1750 + IR LED Ring (click to expand)
pinviz render examples/bh1750_ir_led.yaml -o bh1750_ir_led.svg

BH1750 + IR LED Ring

๐Ÿ‘‰ Traffic Light - Three LEDs with resistors (click to expand)
pinviz render examples/traffic_light.yaml -o traffic_light.svg

Traffic Light

๐Ÿ‘‰ Raspberry Pi Zero 2 W - Compact board layout (click to expand)
pinviz render examples/pi_zero_bh1750.yaml --no-gpio -o pi_zero_bh1750.svg

Pi Zero BH1750

๐Ÿ‘‰ GPIO Reference Comparison - With vs Without GPIO details (click to expand)

With GPIO Details

Shows complete GPIO pinout reference for easy wiring verification (--gpio, ~130KB).

pinviz example bh1750 --gpio -o diagram.svg

BH1750 with GPIO

Without GPIO Details

Cleaner, more compact diagram - 35% smaller file size (--no-gpio, ~85KB).

pinviz example bh1750 --no-gpio -o diagram.svg

BH1750 without GPIO

๐Ÿ“ธ More Examples:

โš™๏ธ Configuration Reference

๐Ÿ’ก Click any section below to see detailed configuration options!

๐Ÿ‘‰ ๐Ÿ“‹ Diagram Options (click to expand)

GPIO Pin Reference

Control whether to show the GPIO pin reference diagram on the right side. This displays all 40 GPIO pins with their functions and color-coded roles.

In YAML config:

show_gpio_diagram: true  # Include GPIO pin reference (default: false)

Via CLI:

# Show GPIO details (larger file, more complete reference)
pinviz example bh1750 --gpio -o diagram.svg

# Hide GPIO details (smaller file, cleaner look)
pinviz example bh1750 --no-gpio -o diagram.svg

# For config files (CLI flag overrides config value)
pinviz render diagram.yaml --gpio -o output.svg

Comparison:

  • With GPIO (--gpio): ~130KB SVG, includes full pinout reference
  • Without GPIO (--no-gpio): ~85KB SVG, 35% smaller, cleaner diagram
๐Ÿ‘‰ ๐ŸŽ›๏ธ Board Selection (click to expand)

Currently supported boards:

  • raspberry_pi_5 (aliases: rpi5, rpi) - Raspberry Pi 5 with 40-pin GPIO header
  • raspberry_pi_zero_2w (aliases: raspberry_pi_zero, pizero, zero2w, zero, rpizero) - Raspberry Pi Zero / Zero 2 W with 40-pin GPIO header
๐Ÿ‘‰ ๐Ÿ”Œ Built-in Device Types (click to expand)

Sensors:

  • bh1750 - BH1750 I2C ambient light sensor (datasheet)
  • ds18b20 - DS18B20 waterproof 1-Wire temperature sensor (datasheet)

LEDs:

  • led - Simple LED with anode/cathode pins (docs)
  • ir_led_ring - IR LED ring module with control pin (product page)

I/O:

  • button - Push button or switch with pull-up/pull-down configuration (docs)

Generic:

  • i2c_device - Generic I2C device with standard pinout (docs)
  • spi_device - Generic SPI device with standard pinout (docs)

Run pinviz list to see all available devices with their documentation links.

๐Ÿ‘‰ ๐Ÿ”— Connection Configuration (click to expand)

Connections use physical pin numbers (1-40), not BCM GPIO numbers:

connections:
  - board_pin: 1           # Physical pin number (required)
    device: "Device Name"  # Device name (required)
    device_pin: "VCC"      # Device pin name (required)
    color: "#FF0000"       # Custom wire color (optional)
    style: "mixed"         # Wire style: orthogonal, curved, mixed (optional)
    components:            # Inline components (optional)
      - type: "resistor"
        value: "220ฮฉ"
        position: 0.55     # Position along wire (0.0-1.0, default: 0.55)
๐Ÿ‘‰ โšก Inline Components (click to expand)

Add resistors, capacitors, or diodes directly on wire connections:

YAML:

connections:
  - board_pin: 11
    device: "Red LED"
    device_pin: "+"
    color: "#FF0000"
    components:
      - type: "resistor"   # Component type: resistor, capacitor, diode
        value: "220ฮฉ"      # Display value (required)
        position: 0.55     # Position along wire path (0.0 = board, 1.0 = device)

Python API:

from pinviz import Component, ComponentType, Connection

connection = Connection(
    board_pin=11,
    device_name="Red LED",
    device_pin_name="+",
    color="#FF0000",
    components=[
        Component(
            type=ComponentType.RESISTOR,
            value="220ฮฉ",
            position=0.55
        )
    ]
)
๐Ÿ‘‰ ๐ŸŽจ Custom Devices (click to expand)

Define custom devices inline:

devices:
  - name: "My Custom Sensor"
    width: 80.0
    height: 50.0
    color: "#4A90E2"
    pins:
      - name: "VCC"
        role: "3V3"
        position: {x: 5.0, y: 10.0}
      - name: "GND"
        role: "GND"
        position: {x: 5.0, y: 20.0}
      - name: "SDA"
        role: "I2C_SDA"
        position: {x: 5.0, y: 30.0}
      - name: "SCL"
        role: "I2C_SCL"
        position: {x: 5.0, y: 40.0}
๐Ÿ‘‰ ๐ŸŽฏ Pin Roles (click to expand)

Supported pin roles (for automatic color assignment):

  • 3V3, 5V - Power rails
  • GND - Ground
  • GPIO - General purpose I/O
  • I2C_SDA, I2C_SCL - I2C bus
  • SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CE0, SPI_CE1 - SPI bus
  • UART_TX, UART_RX - UART serial
  • PWM - PWM output

๐Ÿ“– Full Configuration Guide:

๐Ÿ“– Documentation

Full documentation available at nordstad.github.io/PinViz

Getting Started

User Guides

MCP Server

API Reference

Development

๐Ÿ”ง Development

Setup

# Clone repository
git clone https://github.com/nordstad/PinViz.git
cd PinViz

# Install dependencies
uv sync --dev

Code Quality

# Lint and format
uv run ruff check .
uv run ruff format .

# Run tests
uv run pytest

Build Documentation

# Install docs dependencies
uv sync --group docs

# Build documentation
uv run mkdocs build

# Serve documentation locally
uv run mkdocs serve

โ†’ Full contributing guide

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

See our Contributing Guide for:

  • Code style guidelines
  • Development workflow
  • Testing requirements
  • Pull request process

๐Ÿ“„ License

MIT License - See LICENSE file for details

๐Ÿ™ Credits

Board and GPIO pin SVG assets courtesy of FreeSVG.org

๐Ÿ‘ค Author

Even Nordstad

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pinviz-0.6.1.tar.gz (353.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pinviz-0.6.1-py3-none-any.whl (363.0 kB view details)

Uploaded Python 3

File details

Details for the file pinviz-0.6.1.tar.gz.

File metadata

  • Download URL: pinviz-0.6.1.tar.gz
  • Upload date:
  • Size: 353.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pinviz-0.6.1.tar.gz
Algorithm Hash digest
SHA256 b20732a62096689bfd62c1926ae91dcc873115898c49093302bc9754087e16a1
MD5 16a958c895ae3df400db398019b15c1d
BLAKE2b-256 752b2cbc4cc97deb65b52ceb63926f624b29a2a78eacce5c803cbe07d5ae8837

See more details on using hashes here.

File details

Details for the file pinviz-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: pinviz-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 363.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pinviz-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d763d4d45fdbd55bad44b330768db19f9e0b5f18a059746f9c89579fdbdc8616
MD5 26b96962b854a65bf4f3f57f6169abc4
BLAKE2b-256 96d0e1c7fef2ad09e9921de3d329c2184d4d20afc10a356a82237f17b5ab3bcb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page