Async local client for Harbor Sleep Cameras
Project description
Harbor Python
Async Python client for connecting locally to Harbor Sleep Cameras.
harbor-python speaks directly to Harbor devices on your local network over MQTT, using the camera certificate material issued for your setup. It provides typed event parsing, device state tracking, command publishing, and helpers for configuring local WHIP streaming targets.
Installation
pip install harbor-python
Python 3.11 or newer is required.
Quick Start
import asyncio
from harbor import Harbor, HarborCamera, HarborCameraConfig, HeartbeatUpdate
async def main() -> None:
config = HarborCameraConfig(
serial="CAMERA_SERIAL",
ip_address="192.168.1.50",
cert_path="/path/to/cert.pem",
key_path="/path/to/key.pem",
)
harbor = Harbor()
camera = HarborCamera(config)
camera.subscribe_updates(
lambda state: print(f"{state.serial} values: {state.values}")
)
camera.subscribe(
HeartbeatUpdate,
lambda event: print(f"temperature: {event.payload.temperature}"),
)
harbor.add_device(camera)
harbor.add_camera_connection(config)
try:
await harbor.start()
await asyncio.Event().wait()
finally:
await harbor.stop()
asyncio.run(main())
On Windows, aiomqtt works best with the selector event loop policy:
import asyncio
import sys
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
Certificate Configuration
HarborCameraConfig accepts certificate material in either form:
HarborCameraConfig(
serial="CAMERA_SERIAL",
ip_address="192.168.1.50",
cert_pem="<certificate PEM contents>",
key_pem="<private key PEM contents>",
)
or:
HarborCameraConfig(
serial="CAMERA_SERIAL",
ip_address="192.168.1.50",
cert_path="/path/to/cert.pem",
key_path="/path/to/key.pem",
cert_dir="/path/to/ca-directory",
)
When both PEM strings and file paths are provided, the in-memory PEM values are used.
Commands
Camera commands can be published directly:
await harbor.publish_camera_command("CAMERA_SERIAL", "some-command", {"value": True})
For request/response commands, use request_camera_command or the settings helper:
settings = await harbor.get_camera_settings("CAMERA_SERIAL")
print(settings.settings)
WHIP Endpoint
Harbor cameras allow custom WHIP endpoints. This tells the camera where to stream and works with tools that support WHIP, including go2rtc and Frigate.
Setting up WHIP Ingestion (go2rtc)
You can self-host go2rtc in many ways; see the go2rtc installation guide. If you use Home Assistant, the easiest option is the go2rtc add-on.
Once go2rtc is running, add a stream keyed by your camera serial number:
api:
listen: ":1984" # Change this if you use a non-default port.
streams:
"CAMERA_SERIAL":
Setting up WHIP Ingestion (Frigate)
Frigate runs an instance of go2rtc under the hood. Add the following to your Frigate config:
go2rtc:
api:
listen: ":1984"
streams:
"CAMERA_SERIAL":
Setting the Endpoint
- Open your Harbor app
- Go to Live
- Open Camera Settings
- Scroll down and click on Advanced Settings
- Enter the WHIP endpoint, for example:
http://192.168.1.10:1984/api/webrtc?dst=CAMERA_SERIAL
Replace CAMERA_SERIAL with your camera serial number and 192.168.1.10 with the IP address of your go2rtc or Frigate server.
Development
uv sync
uv run pytest
License
Licensed under the Apache License 2.0.
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
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 harbor_python-1.3.0.tar.gz.
File metadata
- Download URL: harbor_python-1.3.0.tar.gz
- Upload date:
- Size: 21.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a709642e0df27a03f45dc6f24767be98aa42e83e8d8656c620239932aa1ec692
|
|
| MD5 |
874ca9b18f4c4c5eb49d81201530ea89
|
|
| BLAKE2b-256 |
df93f06e086a5b943a3b2f855b0d9e492ab9c3858aeb34857bcceaccde61aa14
|
Provenance
The following attestation bundles were made for harbor_python-1.3.0.tar.gz:
Publisher:
ci.yml on Harbor-Systems/harbor-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harbor_python-1.3.0.tar.gz -
Subject digest:
a709642e0df27a03f45dc6f24767be98aa42e83e8d8656c620239932aa1ec692 - Sigstore transparency entry: 2133644395
- Sigstore integration time:
-
Permalink:
Harbor-Systems/harbor-python@d83bf6bb298d2e9f8f30bc73e92c45925bca7c88 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Harbor-Systems
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@d83bf6bb298d2e9f8f30bc73e92c45925bca7c88 -
Trigger Event:
push
-
Statement type:
File details
Details for the file harbor_python-1.3.0-py3-none-any.whl.
File metadata
- Download URL: harbor_python-1.3.0-py3-none-any.whl
- Upload date:
- Size: 26.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bc515d98dfa7144813faaf6e66f3357b96e921f124488a046efd2a7782b7c06
|
|
| MD5 |
123d3c785ba761d18a94692514ef11a7
|
|
| BLAKE2b-256 |
095ccec5175f5c738b5c3be5438dbbd58edbb0548028a16a45ef3b3f6015e347
|
Provenance
The following attestation bundles were made for harbor_python-1.3.0-py3-none-any.whl:
Publisher:
ci.yml on Harbor-Systems/harbor-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harbor_python-1.3.0-py3-none-any.whl -
Subject digest:
1bc515d98dfa7144813faaf6e66f3357b96e921f124488a046efd2a7782b7c06 - Sigstore transparency entry: 2133644421
- Sigstore integration time:
-
Permalink:
Harbor-Systems/harbor-python@d83bf6bb298d2e9f8f30bc73e92c45925bca7c88 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Harbor-Systems
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@d83bf6bb298d2e9f8f30bc73e92c45925bca7c88 -
Trigger Event:
push
-
Statement type: