You are browsing as a guest. Sign up (or log in) to start making projects!

RoomOps Zero

Hardware
  • 4 Devlogs
  • 5 Total hours

RoomOps Zero is a standalone, compact room management and surveillance system, based on the Raspberry Pi Zero W. It combines the aesthetics of a retro-tech desktop assistant with the functionality of a central dashboard, transforming the desk and TV into a unified control station.

Open comments for this post

2h 15m 52s logged

Devlog #4: Retro Robot Enclosure, LED Matrix & Security Backend Integration

🛠️ Summary & Overview

Transitioned RoomOps Zero from a software dashboard into a fully physical retro-tech robot assistant. The physical chassis has been built—featuring an acrylic robot enclosure complete with an integrated LED Matrix display that serves as an expressive face/visual telemetry hub.

On the software side, fully deployed the core security engine in main.py. The backend now supports dynamic system arming/disarming, security PIN verification, automated motion monitoring loops, and immediate smart home alert triggers (escalating room volume, dispatching notifications, and turning Tapo L900 smart light strips red upon motion detection).


⚙️ Key Technical Updates

1. Hardware Assembly & Visual LED Matrix (Chassis & Enclosure)

  • Robot Frame Assembly: Constructed the physical retro robot enclosure housing the Raspberry Pi Zero W board, internal wiring, and top mounting antenna accent.
  • LED Matrix Expression Display: Mounted the bright yellow LED matrix module into the mouth/screen cutout. Configured visual feedback routines to render dynamic waveforms and active telemetry states.
  • Hardware Prep: Prepared structural mounting slots for future physical USB camera integration directly alongside the chassis.

2. Security State Management & PIN Logic (main.py)

  • State Control: Implemented global state flags (armed = False) to track real-time security modes across all REST endpoints.
  • PIN Verification Endpoint: Configured POST /api/verify-pin utilizing Pydantic validation (PinModel) against environment parameters (SECURITY_PIN).
  • Direct Action Routes: Added dual-method action endpoints (/api/arm & /api/disarm) for rapid arming/disarming from web controls and action blocks.

3. Automated Threat Detection & Action Escalation (services/camera.py)

  • Motion Detection Loop: Built the /api/camera/check-motion endpoint to continuously poll motion sensors when the system is armed.
  • Automated Escalation Sequence: Linked motion events to a multi-layered alert workflow:
    1. Triggers desktop notification dispatch via utils.notifier.
    2. Escalates audio volume to maximum (100%) via utils.volume.
    3. Switches room lighting via tapo_control.DeviceFactory by powering on the Tapo L900 light strip and setting its colour directly to Red.
  • Snapshot Cache: Serves capture snapshots dynamically at /static/last_motion.jpg for active monitoring logging.

📡 Active Routes & API Reference

  1. Security State Management

    • Endpoint: GET / POST /api/arm → Sets system status to armed: true.
    • Endpoint: GET / POST /api/disarm → Sets system status to armed: false.
    • Endpoint: GET /api/status → Returns current system state ({"system_armed": armed}).
  2. Security PIN Verification

    • Endpoint: POST /api/verify-pin
    • Payload Example:
      {
        "pin": "1234"
      }
      
    • Response Example:
      {
        "status": "success",
        "correct": true,
        "system_armed": false
      }
      
  3. Motion Detection Polling Endpoint

    • Endpoint: GET /api/camera/check-motion
    • Response Example (Motion Detected):
      {
        "motion": true,
        "system_armed": true,
        "timestamp": "2026-08-26T15:56:00",
        "image_url": "/static/last_motion.jpg"
      }
      
0
0
34
Open comments for this post

43m 28s logged

Devlog #3: Live RSS News Telemetry & TV Dashboard Optimization

🛠️ Summary & Overview

Elevated the RoomOps Zero ecosystem into a 24/7 ambient TV control station by integrating a real-time RSS news telemetry service.

This update includes:

  • A dedicated Google News RSS parsing module for the FastAPI backend.
  • In-memory response caching to reduce CPU and RAM usage on the Raspberry Pi Zero W.
  • A high-visibility, auto-rotating news widget optimized for lean-back TV dashboard viewing.

⚙️ Key Technical Updates

1. Google News RSS Integration & In-Memory Caching

Files: services/news.py · main.py

  • Integrated feedparser to extract and process localized Google News RSS feeds.
  • Added dynamic location-based news queries through:
    GET /api/news/{city}
  • Implemented server-side in-memory caching with a 900-second (15-minute) cache duration.
  • Reduced redundant external network requests and unnecessary CPU usage on the Raspberry Pi Zero W.
  • Added a non-blocking asynchronous API route returning sanitized headlines as JSON.

2. TV Dashboard UI & Headline Rotator

File: templates/index.html

  • Designed a dark-themed, high-contrast TV news card optimized for long-distance readability.
  • Added an asynchronous JavaScript headline rotator.
  • Headlines automatically change every 12 seconds.
  • Added smooth CSS opacity transitions using fade-in and fade-out effects.
  • Configured automatic background synchronization every 20 minutes to retrieve updated headlines without interrupting the active UI state.

3. 24/7 TV Display Safeguards

  • Optimized DOM rendering by displaying only the currently active headline instead of rendering a large vertical list.
  • Added fallback status handling with the “Εκτός σύνδεσης” message.
  • Improved resilience during temporary local network outages.
  • Kept the dashboard lightweight for continuous 24/7 operation.
0
0
24
Open comments for this post

42m 28s logged

Devlog #2: Frontend Dashboard Interface & Asset Orchestration


🛠️ Summary & Overview

Elevated the RoomOps Zero ecosystem by transitioning from a headless microservice layer to an interactive web dashboard. Resolved Starlette/FastAPI ASGI rendering exceptions, eliminated recursive 404 image load loops, and consolidated CSS styling alongside asynchronous JavaScript directly into the template architecture. The dashboard now renders real-time telemetry, handles local clock synchronization, and triggers remote hardware states directly through non-blocking API requests.


⚙️ Key Technical Updates

1. Template Engine & Middleware Refactoring (main.py)

  • Resolved a breaking TypeError: unhashable type: 'dict' caused by Starlette context signature updates in newer FastAPI releases.
  • Standardized Jinja2Templates rendering by explicitly passing keyword parameters (request=request).
  • Updated UI endpoints to serve templates/index.html seamlessly alongside existing JSON routes.

2. Dashboard UI & Self-Contained Assets (templates/index.html)

  • Built a dark-themed CSS interface featuring custom Flexbox dashboard layouts, action controls, and responsive widget containers.
  • Embedded styling and frontend execution logic directly inside <style> and <script> blocks to bypass static pathing overhead and network latency.
  • Implemented live client-side date/time formatting with automated per-second ticker loops.

3. Asynchronous Fetch Integration & Network Handling

  • Abstracted API routing using window.location.origin to allow dynamic REST execution across varying local IPs and ports.
  • Linked hardware action triggers (turn_on / turn_off) to POST /api/tapo/control payloads.
  • Built automatic polling loops for environmental telemetry (GET /api/weather/{city}) with fallback status handlers.
  • Fixed an infinite recursive onerror fallback loop by decoupling broken image streams and nullifying error handlers.

📡 Active Routes & UI Bindings

1. Served Web Interface

  • Endpoint: GET /
  • Response: Rendered Jinja2 HTML Dashboard (index.html)

2. Hardware & Telemetry Action Bindings

  • Telemetry Trigger: fetch('${API_BASE_URL}/api/weather/kavala')
  • Control Payload: POST /api/tapo/control with {"device_name": "l900", "action": "turn_on"}
0
0
32
Open comments for this post

1h 25m 14s logged

Devlog #1: RoomOps Zero Core API & Smart Device Integration

Date: August 23, 2026
Project: RoomOps Zero
Status: In Progress (Backend Microservice Layer)


🛠️ Summary & Overview

Implemented the foundational REST API layer for RoomOps Zero using FastAPI to handle local hardware control and environmental telemetry. Integrated Tapo smart devices (L900 Light Strip & L535 Smart Bulb) using an asynchronous client library (tapo), structured via the Factory Design Pattern for modularity. Added an asynchronous weather integration module to feed current climate data directly to the central dashboard.


⚙️ Key Technical Updates

1. Asynchronous REST API (main.py)

  • Configured a FastAPI application running on 0.0.0.0:8080 via Uvicorn.
  • Defined explicit request validation models using Pydantic (TapoBaseModel).
  • Created non-blocking asynchronous routes for weather retrieval (GET) and smart device state management (POST).

2. Smart Lighting Integration (tapo_control.py)

  • Created async device wrappers (L900, L535) leveraging ApiClient from the tapo library.
  • Externalized hardware credentials (IPs, usernames, passwords) into a local .env file using python-dotenv.
  • Implemented a Singleton pattern for L535 to avoid redundant object instantiation.
  • Designed a DeviceFactory class to standardize turn_on and turn_off operations across varying hardware models based on incoming payloads.

3. Weather Telemetry Module (weather.py)

  • Integrated python_weather using metric units ($^\circ\text{C}$).
  • Structured as an async utility (get_temperature) to prevent blocking the primary event loop during HTTP requests.

📡 API Endpoints Reference

1. Get Current Weather

  • URL: GET /api/weather/{city}
  • Parameters: city (path parameter, string)
  • Response: Current metric temperature integer/float.

2. Control Tapo Device

  • URL: POST /api/tapo/control
  • Headers: Content-Type: application/json
  • Payload Example:
    {
      "device_name": "l900",
      "action": "turn_on"
    }
0
0
12

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…