Source code for panoptes.pocs.utils.cli.sensor
"""Typer CLI for monitoring remote sensors exposed via HTTP endpoints."""
import time
import typer
from rich import print
from panoptes.pocs.sensor.remote import RemoteMonitor
from panoptes.pocs.utils.logger import get_logger
app = typer.Typer(no_args_is_help=True)
logger = get_logger(stderr_log_level="ERROR")
[docs]
@app.callback()
def main(context: typer.Context):
"""Common options setup for all sensor CLI commands.
Args:
context: Typer context used to access shared options.
Returns:
None
"""
context.params.update(context.parent.params)
verbose = context.params["verbose"]
if verbose:
print(f"Command options from power: {context.params!r}")
[docs]
@app.command()
def monitor(
sensor_name: str,
endpoint: str | None = typer.Option(
None,
help="The remote endpoint to read. "
"If not provided, use the config key "
'"environment.<sensor_name>.url".',
),
store: bool = typer.Option(True, help="If result should be stored in file database."),
read_frequency: int = typer.Option(60, help="Read frequency in seconds."),
verbose: bool = False,
):
"""Continuously read a remote sensor, optionally storing results.
Args:
sensor_name: Name of the sensor (used for looking up default endpoint in config).
endpoint: Optional override for the sensor endpoint URL.
store: If True, persist readings to the local JSON database.
read_frequency: Polling interval in seconds between readings.
verbose: If True, echo readings to the console.
Returns:
None
"""
remote_monitor = RemoteMonitor(endpoint_url=endpoint, sensor_name=sensor_name)
try:
while True:
result = remote_monitor.capture(store_result=store)
if verbose:
print(result)
time.sleep(read_frequency)
except KeyboardInterrupt:
print(f"[red]Shutting down monitor script for {sensor_name}")
if __name__ == "__main__":
app()