Metadata-Version: 2.4
Name: jumpstarter-driver-noyito-relay
Version: 0.8.2.dev113+gb19d6327f
Summary: Jumpstarter driver for the NOYITO 5V 2-Channel USB Relay Module
Project-URL: Homepage, https://jumpstarter.dev
Project-URL: source_archive, https://github.com/jumpstarter-dev/repo/archive/b19d6327fda749bdd72caf050a458788ab29375f.zip
Author-email: Kirk Brauer <kbrauer@hatci.com>
License-Expression: Apache-2.0
Requires-Python: >=3.11
Requires-Dist: hid>=1.0.4
Requires-Dist: jumpstarter
Requires-Dist: jumpstarter-driver-power
Requires-Dist: pyserial>=3.5
Description-Content-Type: text/markdown

# NoyitoPowerSerial / NoyitoPowerHID Driver

`jumpstarter-driver-noyito-relay` provides Jumpstarter power drivers for NOYITO
USB relay boards in 1, 2, 4, and 8-channel variants.

Two hardware series are supported:

- **`NoyitoPowerSerial`** — 1/2-channel boards using a CH340 USB-to-serial chip
  (serial port, supports status query)
- **`NoyitoPowerHID`** — 4/8-channel "HID Drive-free" boards presenting as a
  USB HID device (no serial port, supports all-channels status query)

Both use the same 4-byte binary command protocol (`A0` + channel + state +
checksum).

## Installation

```shell
pip3 install --extra-index-url https://pkg.jumpstarter.dev/simple/ jumpstarter-driver-noyito-relay
```

If you are using `NoyitoPowerHID`, the `hid` Python package requires the native
`hidapi` shared library. Install it for your OS before use:

| OS | Command |
|----|---------|
| macOS | `brew install hidapi` |
| Debian/Ubuntu | `sudo apt-get install libhidapi-hidraw0` |
| Fedora/RHEL | `sudo dnf install hidapi` |

## Board Detection

To determine which driver to use, check whether the board appears as a serial
port or a HID device:

- **Serial port** (`/dev/ttyUSB*`, `/dev/tty.usbserial-*`): Use `NoyitoPowerSerial`
  (1/2-channel CH340 board)
- **No serial port / HID only**: Use `NoyitoPowerHID` (4/8-channel HID
  Drive-free board). Confirm with `lsusb` — the NOYITO HID module appears with
  VID `0x1409` / PID `0x07D7` (decimal: 5131 / 2007).

## `NoyitoPowerSerial` (1/2-Channel Serial)

### Hardware Notes

- **Purchase**: [NOYITO 2-Channel USB Relay Module (Amazon)](https://www.amazon.com/NOYITO-2-Channel-Module-Control-Intelligent/dp/B081RM7PMY/)
- **Chip**: CH340 USB-to-serial
- **Baud rate**: 9600
- **Default port**: `/dev/ttyUSB0` (Linux) — may appear as `/dev/tty.usbserial-*` on macOS
- **Channels**: 1 or 2 independent relay channels on one USB port
- **Supply voltage**: 5 V via USB

### Configuration

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `port` | `str` | *(required)* | Serial port path, e.g. `/dev/ttyUSB0` |
| `channel` | `int` | `1` | Relay channel to control (`1` or `2`) |
| `all_channels` | `bool` | `false` | Switch both channels simultaneously |

Example configuration controlling both channels independently:

```yaml
export:
  relay1:
    type: jumpstarter_driver_noyito_relay.driver.NoyitoPowerSerial
    config:
      port: "/dev/ttyUSB0"
      channel: 1
  relay2:
    type: jumpstarter_driver_noyito_relay.driver.NoyitoPowerSerial
    config:
      port: "/dev/ttyUSB0"
      channel: 2
```

### API Reference

Implements `PowerInterface` (provides `on`, `off`, `read`, and `cycle` via
`PowerClient`).

| Method | Description |
|--------|-------------|
| `on()` | Energise the configured relay channel |
| `off()` | De-energise the configured relay channel |
| `read()` | Yields a single `PowerReading(voltage=0.0, current=0.0)` |
| `status()` | Returns the channel state string, e.g. `"on"`, `"off"`, or `"partial"` |

### CLI Usage

Inside a `jmp exporter shell`:

```shell
# Power on relay 1
j relay1 on

# Query state of relay 1
j relay1 status
# on

# Power cycle relay 2 with a 3-second wait
j relay2 cycle --wait 3

# Power off relay 1
j relay1 off
```

## `NoyitoPowerHID` (4/8-Channel HID Drive-free)

### Hardware Notes

- **Purchase (4-channel)**: [NOYITO 4-Channel HID Drive-free USB Relay (Amazon)](https://www.amazon.com/NOYITO-Drive-Free-Computer-2-Channel-Micro-USB/dp/B0B538N95Q)
- **Purchase (8-channel)**: [NOYITO 8-Channel HID Drive-free USB Relay (Amazon)](https://www.amazon.com/NOYITO-Drive-Free-Computer-2-Channel-Micro-USB/dp/B0B536M5MH)
- **Interface**: USB HID (no serial port)
- **Default VID/PID**: `5131` / `2007` (0x1409 / 0x07D7)
- **Channels**: 4 or 8 independent relay channels
- **Supply voltage**: 5 V via USB

### Configuration

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `num_channels` | `int` | `4` | Number of relay channels on the board (`4` or `8`) |
| `channel` | `int` | `1` | Relay channel to control (`1`..`num_channels`) |
| `all_channels` | `bool` | `false` | Fire every channel simultaneously |
| `vendor_id` | `int` | `5131` | USB vendor ID (override if needed) |
| `product_id` | `int` | `2007` | USB product ID (override if needed) |

Example configuration for a 4-channel board (channel 1) and an 8-channel board
(all channels simultaneously):

```yaml
export:
  relay_4ch_ch1:
    type: jumpstarter_driver_noyito_relay.driver.NoyitoPowerHID
    config:
      num_channels: 4
      channel: 1
  relay_8ch_all:
    type: jumpstarter_driver_noyito_relay.driver.NoyitoPowerHID
    config:
      num_channels: 8
      channel: 1
      all_channels: true
```

### API Reference

Implements `PowerInterface` (provides `on`, `off`, `read`, and `cycle` via
`PowerClient`).

| Method | Description |
|--------|-------------|
| `on()` | Energise the configured relay channel(s) |
| `off()` | De-energise the configured relay channel(s) |
| `read()` | Yields a single `PowerReading(voltage=0.0, current=0.0)` |
| `status()` | Returns the channel state string, e.g. `"on"`, `"off"`, or `"partial"` |

### CLI Usage

Inside a `jmp exporter shell`:

```shell
# Power on relay channel 1 of the 4-ch board
j relay_4ch_ch1 on

# Power cycle with a 1-second wait
j relay_4ch_ch1 cycle --wait 1

# Power off
j relay_4ch_ch1 off

# Power on all 8 channels simultaneously
j relay_8ch_all on
```
