SpiderWire — SpiderFarmer GSS Modbus protocol library + gss-ctrl CLI
Project description
SpiderWire
Open Modbus RTU library and gss-ctrl CLI for the SpiderFarmer GSS
peripheral bus (inline fans, CO₂ sensor, sensor hub, light driver). The
OEM GSS hub is a Modbus RTU master over a proprietary RJ12 wire layout;
SpiderWire replaces that hub so you can drive the bus from any host —
locally, no cloud account.
Unofficial and experimental. This is an independent project with no affiliation, endorsement, or relationship with SpiderFarmer. It works on my hardware, but the GSS ecosystem ships in many hardware and firmware revisions — yours may behave differently or not work at all. Expect rough edges and verify behavior on your own bus before relying on it.
Two surfaces, one library:
| Surface | Role | What ships with it |
|---|---|---|
spiderwire Python package |
Transport, register map, tiered bus master | bus.py, protocol.py, registers.py, transport.py |
gss-ctrl CLI |
Test / ops / manual control over USB-RS485 | gss-ctrl scan / poll / read / write / fan / blower / light |
A companion Home Assistant integration is planned — it will depend on
the published spiderwire wheel and expose the bus as HA entities.
Install
From PyPI (recommended):
pip install spiderwire
From source (for development):
git clone https://github.com/1am/spiderwire.git
cd spiderwire
pip install -e ".[dev]" # or: uv sync --extra dev
Requires Python 3.10+ and a USB-RS485 adapter (pyserial is the only
runtime dependency).
CLI quickstart
make scan PORT=/dev/ttyUSB0 # discover devices on the bus
make poll PORT=/dev/ttyUSB0 # master mode: tiered poll + heartbeat
make read PORT=... ADDR=0x0A QTY=28
make fan PORT=... ADDR=0x04 SPEED=15
make light PORT=... PCT=50
make blower PORT=... PCT=40
Without the OEM GSS hub on the bus, gss-ctrl poll takes over
master duties: tiered polling (~1 s fast, ~2.5 s actuators, ~7 s scan)
plus the setpoint heartbeat broadcast (~3.5 s), matching the OEM
cadence peripherals expect.
Full CLI: gss-ctrl --help. Commands: scan, poll, read, write,
fan, blower, light.
Library use
from spiderwire import BusMaster, RS485Transport
with RS485Transport("/dev/ttyUSB0", baudrate=115200) as tx:
bus = BusMaster(tx)
bus.poll_loop(interval=1.0, callback=print)
See src/spiderwire/bus.py for the tiered scheduler,
src/spiderwire/registers.py for the per-device register map, and
src/spiderwire/transport.py for the RS-485 framer.
Layout
spiderwire/
├── src/
│ ├── spiderwire/ Python package (lib)
│ │ ├── bus.py tiered master + heartbeat scheduler
│ │ ├── protocol.py Modbus RTU framing + CRC
│ │ ├── registers.py per-device register map + decoders
│ │ └── transport.py RS-485 framer over pyserial
│ └── gss_ctrl_pc/ gss-ctrl CLI (stand-in for the OEM master)
├── tests/ pytest suite (no hardware required)
├── docs/ protocol + device map reference
├── pyproject.toml builds the `spiderwire` wheel + `gss-ctrl` script
└── Makefile dev shortcuts
Docs
docs/device-map.md— per-device register map for every address observed on the bus.docs/protocol-analysis.md— protocol reference: physical layer, function codes, tiered polling, heartbeat.docs/hw-notes.md— OEM hub board notes and RJ12 pinout.
License
Copyright (c) 2026 1AM
Released under the MIT License — free to use, modify, and distribute, including in commercial and closed-source products. The only requirement is that the copyright notice and license text are preserved in copies or substantial portions of the software.
Disclaimer
This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement.
This project interacts with mains-powered grow equipment over an RS-485 bus. Incorrect wiring, miswired connectors, unsupported devices, or misuse of the protocol can damage hardware, void manufacturer warranties, cause fire, or result in personal injury. You are solely responsible for verifying the correctness of your wiring, your device configuration, and the commands you send.
In no event shall the author or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages — including but not limited to damage to equipment, crops, property, or persons — arising from the use of, or inability to use, this software.
Use at your own risk.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spiderwire-0.1.0a1.tar.gz.
File metadata
- Download URL: spiderwire-0.1.0a1.tar.gz
- Upload date:
- Size: 31.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b99c93aa45c8cc3a468d5e2437b630d77c94530ecdf5ebf00753d87822d0ca2
|
|
| MD5 |
1061f410041210acbbf066e3a980464a
|
|
| BLAKE2b-256 |
73420799a82b69ec5c94499f1525e6248658aa0a93befa5540750bcab06491f7
|
File details
Details for the file spiderwire-0.1.0a1-py3-none-any.whl.
File metadata
- Download URL: spiderwire-0.1.0a1-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e24d637922fcd7577fbb9d558c285412a37f4df66c3f6940c11682b32ce25cd
|
|
| MD5 |
0cc285c1933aab39fb46e0d3703bd6cc
|
|
| BLAKE2b-256 |
b49cc2dda5f1effef1e40e48d800e81f5f34b35e45a0e0b12918b2a15b36fda9
|