{"id":50330283,"url":"https://github.com/themactep/thingino-hub","last_synced_at":"2026-05-29T09:02:32.011Z","repository":{"id":356831324,"uuid":"1207612574","full_name":"themactep/thingino-hub","owner":"themactep","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-09T23:42:34.000Z","size":1016,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-23T19:31:14.424Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/themactep.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-11T06:46:54.000Z","updated_at":"2026-05-09T23:42:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/themactep/thingino-hub","commit_stats":null,"previous_names":["themactep/thingino-hub"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/themactep/thingino-hub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themactep%2Fthingino-hub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themactep%2Fthingino-hub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themactep%2Fthingino-hub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themactep%2Fthingino-hub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/themactep","download_url":"https://codeload.github.com/themactep/thingino-hub/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themactep%2Fthingino-hub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33644313,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-29T09:02:26.092Z","updated_at":"2026-05-29T09:02:31.998Z","avatar_url":"https://github.com/themactep.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Thingino Hub\n\n## What is Thingino Hub?\n\nThingino Hub is a **central control panel for your Thingino cameras**. If you have multiple security cameras around your home or property, this hub lets you:\n\n- **See live previews** of all cameras in one place\n- **Check camera settings** and status without visiting each camera's web interface\n- **Send commands** to cameras (take a snapshot, arm/disarm, record a clip)\n- **Get snapshots in Telegram** when you ask for them\n- **Manage everything** through a simple web dashboard\n\nThink of it as the \"nerve center\" for all your cameras — one place to monitor, control, and configure everything.\n\n---\n\n## Why Use Thingino Hub?\n\n**Without a hub:** You have to log into each camera individually, remember different IP addresses, and manually trigger actions.\n\n**With Thingino Hub:**\n- One dashboard shows all cameras at once\n- Control cameras via Telegram (no need to open a web browser)\n- Automatic camera discovery — new cameras appear in the roster as they come online\n- Secure pairing so cameras can talk to the hub without manual configuration\n- View camera health, firmware version, and other metadata in one place\n\n---\n\n## Key Features\n\n- **Web Dashboard** – Live camera roster with preview snapshots, status, and quick actions\n- **Multi-Camera Support** – Handle dozens of cameras with automatic discovery\n- **Telegram Integration** – Send commands and receive snapshots via Telegram bot\n- **Camera Enrollment** – Easy connect/pair workflows with built-in credential validation\n- **Snapshot Preview** – View the latest image from each camera (cached for fast loading)\n- **Native API Support** – For cameras with Thingino's native API, get direct API control\n- **History Tracking** – Local database of actions and camera state changes\n- **Optional Web UI Auth** – Restrict dashboard access with username/password\n- **MQTT-Based** – All camera communication happens over MQTT (secure, reliable)\n\n---\n\n## Quick Start\n\n### Before You Start\n\nYou'll need:\n- An MQTT broker running somewhere on your network (or this machine)\n- A Telegram bot token (optional, but recommended for remote access)\n- At least one Thingino camera on the same network\n\n### 1. Create a Telegram Bot (Optional)\n\nIf you want to control cameras via Telegram:\n\n1. Open Telegram and find `@BotFather`\n2. Send `/newbot`\n3. Choose a bot name and username\n4. Copy the bot token\n\n### 2. Set Up Configuration\n\n```sh\ncp config.example.yaml config.yaml\n```\n\nEdit `config.yaml` and set:\n\n- **`telegram.token`** – paste your bot token (or leave empty to skip Telegram)\n- **`mqtt.host`** – your MQTT broker's IP address (e.g., `192.168.1.10`)\n\nIf your MQTT broker is on the **same machine** as the hub:\n\n```yaml\nmqtt:\n  host: \"host.containers.internal\"\n```\n\n### 3. Start the Hub\n\n```sh\nsh run-podman.sh\n```\n\nThe hub will:\n- Build a Docker container\n- Start running in the background\n- Expose the web dashboard on `http://127.0.0.1:8080`\n\n### 4. Open the Dashboard\n\nGo to `http://127.0.0.1:8080` in your browser.\n\nYou should see:\n- Status of the Telegram bot and MQTT broker\n- A roster of discovered cameras (if any are online)\n\n### Optional: Enable FastAPI API v2 teaser\n\nThe hub now includes an optional FastAPI-powered teaser API that runs alongside the existing Flask UI with minimal disruption.\n\nSet:\n\n```sh\nexport HUB_API_V2_ENABLED=1\nexport HUB_API_V2_PORT=8090\n```\n\nThen restart the hub and open:\n\n- `http://127.0.0.1:8090/api/v2/docs`\n- `http://127.0.0.1:8090/api/v2/health`\n- `http://127.0.0.1:8090/api/v2/cameras`\n\nWhen this flag is enabled, selected dashboard and camera-detail UI actions are routed through API v2 first, with automatic fallback to the existing Flask handler if API v2 is unavailable.\n\nPractical teaser use case: quickly identify cameras that need operator attention:\n\n```sh\ncurl -s \"http://127.0.0.1:8090/api/v2/cameras/attention?minimum_severity=high\u0026limit=10\"\n```\n\nThis endpoint surfaces cameras with actionable issues (offline state, API failures, incomplete setup, MQTT visibility/command problems) and returns suggested next actions.\n\nMigration progress teaser: a first set of action endpoints is now available in API v2:\n\n- `POST /api/v2/cameras/{camera_id}/hydrate`\n- `POST /api/v2/cameras/{camera_id}/refresh/api`\n- `POST /api/v2/cameras/{camera_id}/refresh/onvif`\n- `POST /api/v2/cameras/{camera_id}/refresh/snapshot`\n- `POST /api/v2/cameras/{camera_id}/service/{service_name}/{operation}`\n- `POST /api/v2/cameras/{camera_id}/streaming/start`\n- `POST /api/v2/cameras/{camera_id}/streaming/stop`\n- `POST /api/v2/cameras/{camera_id}/streaming/restart`\n- `POST /api/v2/cameras/{camera_id}/rescan`\n- `POST /api/v2/cameras/{camera_id}/privacy`\n- `POST /api/v2/cameras/{camera_id}/daynight`\n- `POST /api/v2/cameras/{camera_id}/record`\n- `POST /api/v2/cameras/{camera_id}/config/patch`\n- `POST /api/v2/cameras/{camera_id}/apply-supported-config`\n- `POST /api/v2/cameras/{camera_id}/send2-test/{service_name}`\n- `POST /api/v2/enroll`\n- `POST /api/v2/cameras/{camera_id}/connect`\n- `POST /api/v2/bulk-action`\n- `POST /api/v2/enroll/probe`\n- `POST /api/v2/enroll/pairing-bundle`\n- `POST /api/v2/enroll/pairing-install`\n- `POST /api/v2/cameras/{camera_id}/pair`\n- `POST /api/v2/cameras/{camera_id}/delete`\n\nExample:\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/refresh/api\"\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/service/streaming/restart\"\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/daynight\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"mode\":\"night\"}'\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/send2-test/telegram\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"verbose\":true,\"send_type\":\"photo\"}'\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/pair\"\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/enroll\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"camera_id\":\"cam1\",\"ip\":\"192.168.1.10\",\"onvif_username\":\"thingino\",\"onvif_password\":\"thingino\"}'\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/cameras/cam1/connect\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"onvif_username\":\"thingino\",\"onvif_password\":\"thingino\"}'\n```\n\n```sh\ncurl -sX POST \"http://127.0.0.1:8090/api/v2/bulk-action\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"camera_ids\":[\"cam1\",\"cam2\"],\"action\":\"refresh-api\"}'\n```\n\nLive validation checklist for newly started agents:\n\n```sh\ncurl -s \"http://127.0.0.1:8090/api/v2/cameras/cam1/payload\"\n```\n\nLook for:\n- `mqtt_command_capable: true`\n- `present_on_mqtt_broker: true`\n- `setup_status: pair` (before pair) or `setup_status: paired` (after pair)\n\n### 5. Connect Your First Camera\n\n1. Open the `/enroll` page in the dashboard\n2. Enter your camera's IP address\n3. Enter valid ONVIF credentials (usually `thingino` / `thingino`)\n4. Click \"Connect\"\n\nThe hub will pair with the camera and add it to your roster.\n\n---\n\n## Next Steps\n\n- **Learn about configuration:** [docs/configuration.md](docs/configuration.md)\n- **Understand the web dashboard:** [docs/web-ui.md](docs/web-ui.md)\n- **Set up cameras for pairing:** [docs/camera-setup-and-pairing.md](docs/camera-setup-and-pairing.md)\n- **Deploy to production:** [docs/deployment-and-runtime.md](docs/deployment-and-runtime.md)\n- **Troubleshoot issues:** [docs/operations.md](docs/operations.md)\n\n---\n\n## Full Documentation\n\n- [quickstart-home.md](docs/quickstart-home.md) – Detailed home setup\n- [configuration.md](docs/configuration.md) – All config options explained\n- [deployment-and-runtime.md](docs/deployment-and-runtime.md) – Running in production, using Podman, env variables\n- [web-ui.md](docs/web-ui.md) – Dashboard features and behavior\n- [camera-setup-and-pairing.md](docs/camera-setup-and-pairing.md) – How camera pairing works\n- [mqtt-protocol.md](docs/mqtt-protocol.md) – MQTT message format (for developers)\n- [operations.md](docs/operations.md) – Running tests, troubleshooting, access control\n- [ai-session-onboarding.md](docs/ai-session-onboarding.md) – For developers working on the hub itself\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemactep%2Fthingino-hub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthemactep%2Fthingino-hub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemactep%2Fthingino-hub/lists"}