This repository has been archived on 2026-06-01. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Roundtable-plugins/ups/migrations/versions/ups_001_initial.py
T
bvandeusen ad4fcd1cfd feat: initial release — traefik, unifi, ups plugins
First-party plugins for Fabled Scryer (https://github.com/bvandeusen/fabledscryer).

traefik: Prometheus metrics scraping, stats history, access log parsing (GeoIP optional)
unifi:   UniFi controller integration — WAN health, devices, clients, DPI, events
ups:     UPS monitoring via NUT (Network UPS Tools), Ansible shutdown automation

Each plugin follows the Fabled Scryer plugin contract:
  setup(app), get_scheduled_tasks(), get_blueprint()

index.yaml lists all three plugins in the catalog format. Populate
checksum_sha256 entries once release zips are published via GitHub Releases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 18:28:43 -04:00

41 lines
1.6 KiB
Python

"""UPS plugin initial tables
Revision ID: ups_001_initial
Revises: (none — branch off core via depends_on)
Create Date: 2026-03-21
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
revision: str = "ups_001_initial"
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = "ups"
depends_on: Union[str, Sequence[str], None] = ("0004_app_settings",)
def upgrade() -> None:
op.create_table(
"ups_status",
sa.Column("id", sa.String(36), primary_key=True),
sa.Column("scraped_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("raw_status", sa.String(64), nullable=False, server_default=""),
sa.Column("on_battery", sa.Boolean, nullable=False, server_default="false"),
sa.Column("low_battery", sa.Boolean, nullable=False, server_default="false"),
sa.Column("battery_charge_pct", sa.Float, nullable=True),
sa.Column("battery_runtime_secs", sa.Integer, nullable=True),
sa.Column("battery_voltage", sa.Float, nullable=True),
sa.Column("load_pct", sa.Float, nullable=True),
sa.Column("input_voltage", sa.Float, nullable=True),
sa.Column("output_voltage", sa.Float, nullable=True),
sa.Column("temperature", sa.Float, nullable=True),
sa.Column("model", sa.String(128), nullable=True),
sa.Column("manufacturer", sa.String(128), nullable=True),
)
op.create_index("ix_ups_status_scraped", "ups_status", ["scraped_at"])
def downgrade() -> None:
op.drop_index("ix_ups_status_scraped", "ups_status")
op.drop_table("ups_status")