mirror of
https://github.com/pablorevilla-meshtastic/meshview.git
synced 2026-07-07 18:30:58 +02:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b19b51d6a6 | |||
| 414beaaab0 |
@@ -1,10 +0,0 @@
|
||||
# This keeps Docker from including hostOS virtual environment folders
|
||||
env/
|
||||
.venv/
|
||||
|
||||
# Database files and backups
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
backups/
|
||||
*.db.gz
|
||||
@@ -1,54 +0,0 @@
|
||||
name: Build container
|
||||
|
||||
on:
|
||||
push:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
# list of Docker images to use as base name for tags
|
||||
images: |
|
||||
ghcr.io/${{ github.repository }}
|
||||
# generate Docker tags based on the following events/attributes
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
# publish :latest from the default branch
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
- name: Login to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ./Containerfile
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
# optional cache (speeds up rebuilds)
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
@@ -1,39 +0,0 @@
|
||||
name: Ruff
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "**/*.py"
|
||||
- "pyproject.toml"
|
||||
- "ruff.toml"
|
||||
- ".pre-commit-config.yaml"
|
||||
|
||||
jobs:
|
||||
ruff:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.13"
|
||||
|
||||
- name: Cache Ruff
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/ruff
|
||||
key: ruff-${{ runner.os }}-${{ hashFiles('**/pyproject.toml', '**/ruff.toml') }}
|
||||
|
||||
- name: Install Ruff
|
||||
run: pip install "ruff==0.13.3"
|
||||
|
||||
# Lint (with GitHub annotation format for inline PR messages)
|
||||
- name: Ruff check
|
||||
run: ruff check --output-format=github .
|
||||
|
||||
# Fail PR if formatting is needed
|
||||
- name: Ruff format (check-only)
|
||||
run: ruff format --check .
|
||||
|
||||
# TODO: Investigate only applying to changed files and possibly apply fixes
|
||||
-45
@@ -1,48 +1,3 @@
|
||||
env/*
|
||||
__pycache__/*
|
||||
meshview/__pycache__/*
|
||||
alembic/__pycache__/*
|
||||
|
||||
# Database files
|
||||
packets.db
|
||||
packets*.db
|
||||
*.db
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
|
||||
# Database backups
|
||||
backups/
|
||||
*.db.gz
|
||||
|
||||
# Process files
|
||||
meshview-db.pid
|
||||
meshview-web.pid
|
||||
|
||||
# Config and logs
|
||||
/table_details.py
|
||||
config.ini
|
||||
*.log
|
||||
*.status.json
|
||||
|
||||
# Screenshots
|
||||
screenshots/*
|
||||
|
||||
# Python
|
||||
python/nanopb
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
.Python
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
packets.db-journal
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
repos:
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.13.3 # pin the latest you’re comfortable with
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix, --exit-non-zero-on-fix] # fail if it had to change files
|
||||
- id: ruff-format
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
# AI Agent Guidelines for Meshview
|
||||
|
||||
This document provides context and guidelines for AI coding assistants working on the Meshview project.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Meshview is a real-time monitoring and diagnostic tool for Meshtastic mesh networks. It provides web-based visualization and analysis of network activity, including:
|
||||
|
||||
- Real-time packet monitoring from MQTT streams
|
||||
- Interactive map visualization of node locations
|
||||
- Network topology graphs showing connectivity
|
||||
- Message traffic analysis and conversation tracking
|
||||
- Node statistics and telemetry data
|
||||
- Packet inspection and traceroute analysis
|
||||
|
||||
## Architecture
|
||||
|
||||
### Core Components
|
||||
|
||||
1. **MQTT Reader** (`meshview/mqtt_reader.py`) - Subscribes to MQTT topics and receives mesh packets
|
||||
2. **Database Manager** (`meshview/database.py`, `startdb.py`) - Handles database initialization and migrations
|
||||
3. **MQTT Store** (`meshview/mqtt_store.py`) - Processes and stores packets in the database
|
||||
4. **Web Server** (`meshview/web.py`, `main.py`) - Serves the web interface and API endpoints
|
||||
5. **API Layer** (`meshview/web_api/api.py`) - REST API endpoints for data access
|
||||
6. **Models** (`meshview/models.py`) - SQLAlchemy database models
|
||||
7. **Decode Payload** (`meshview/decode_payload.py`) - Protobuf message decoding
|
||||
|
||||
### Technology Stack
|
||||
|
||||
- **Python 3.13+** - Main language
|
||||
- **aiohttp** - Async web framework
|
||||
- **aiomqtt** - Async MQTT client
|
||||
- **SQLAlchemy (async)** - ORM with async support
|
||||
- **Alembic** - Database migrations
|
||||
- **Jinja2** - Template engine
|
||||
- **Protobuf** - Message serialization (Meshtastic protocol)
|
||||
- **SQLite/PostgreSQL** - Database backends (SQLite default, PostgreSQL via asyncpg)
|
||||
|
||||
### Key Patterns
|
||||
|
||||
- **Async/Await** - All I/O operations are asynchronous
|
||||
- **Database Migrations** - Use Alembic for schema changes (see `docs/Database-Changes-With-Alembic.md`)
|
||||
- **Configuration** - INI file-based config (`config.ini`, see `sample.config.ini`)
|
||||
- **Modular API** - API routes separated into `meshview/web_api/` module
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
meshview/
|
||||
├── alembic/ # Database migration scripts
|
||||
├── docs/ # Technical documentation
|
||||
├── meshview/ # Main application package
|
||||
│ ├── static/ # Static web assets (HTML, JS, CSS)
|
||||
│ ├── templates/ # Jinja2 HTML templates
|
||||
│ ├── web_api/ # API route handlers
|
||||
│ └── *.py # Core modules
|
||||
├── main.py # Web server entry point
|
||||
├── startdb.py # Database manager entry point
|
||||
├── mvrun.py # Combined runner (starts both services)
|
||||
├── config.ini # Runtime configuration
|
||||
└── requirements.txt # Python dependencies
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Setup
|
||||
|
||||
1. Use Python 3.13+ virtual environment
|
||||
|
||||
### Running
|
||||
|
||||
- **Database**: `./env/bin/python startdb.py`
|
||||
- **Web Server**: `./env/bin/python main.py`
|
||||
- **Both**: `./env/bin/python mvrun.py`
|
||||
|
||||
|
||||
## Code Style
|
||||
|
||||
- **Line length**: 100 characters (see `pyproject.toml`)
|
||||
- **Linting**: Ruff (configured in `pyproject.toml`)
|
||||
- **Formatting**: Ruff formatter
|
||||
- **Type hints**: Preferred but not strictly required
|
||||
- **Async**: Use `async def` and `await` for I/O operations
|
||||
|
||||
## Important Files
|
||||
|
||||
### Configuration
|
||||
- `config.ini` - Runtime configuration (server, MQTT, database, cleanup)
|
||||
- `sample.config.ini` - Template configuration file
|
||||
- `alembic.ini` - Alembic migration configuration
|
||||
|
||||
### Database
|
||||
- `meshview/models.py` - SQLAlchemy models (Packet, Node, Traceroute, etc.)
|
||||
- `meshview/database.py` - Database initialization and session management
|
||||
- `alembic/versions/` - Migration scripts
|
||||
|
||||
### Core Logic
|
||||
- `meshview/mqtt_reader.py` - MQTT subscription and message reception
|
||||
- `meshview/mqtt_store.py` - Packet processing and storage
|
||||
- `meshview/decode_payload.py` - Protobuf decoding
|
||||
- `meshview/web.py` - Web server routes and handlers
|
||||
- `meshview/web_api/api.py` - REST API endpoints
|
||||
|
||||
### Templates
|
||||
- `meshview/templates/` - Jinja2 HTML templates
|
||||
- `meshview/static/` - Static files (HTML pages, JS, CSS)
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Adding a New API Endpoint
|
||||
|
||||
1. Add route handler in `meshview/web_api/api.py`
|
||||
2. Register route in `meshview/web.py` (if needed)
|
||||
3. Update `docs/API_Documentation.md` if public API
|
||||
|
||||
### Database Schema Changes
|
||||
|
||||
1. Modify models in `meshview/models.py`
|
||||
2. Create migration: `alembic revision --autogenerate -m "description"`
|
||||
3. Review generated migration in `alembic/versions/`
|
||||
4. Test migration: `alembic upgrade head`
|
||||
5. **Never** modify existing migration files after they've been applied
|
||||
|
||||
### Adding a New Web Page
|
||||
|
||||
1. Create template in `meshview/templates/`
|
||||
2. Add route in `meshview/web.py`
|
||||
3. Add navigation link if needed (check existing templates for pattern)
|
||||
4. Add static assets if needed in `meshview/static/`
|
||||
|
||||
### Processing New Packet Types
|
||||
|
||||
1. Check `meshview/decode_payload.py` for existing decoders
|
||||
2. Add decoder function if new type
|
||||
3. Update `meshview/mqtt_store.py` to handle new packet type
|
||||
4. Update database models if new data needs storage
|
||||
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Meshtastic Protocol
|
||||
- Uses Protobuf for message serialization
|
||||
- Packets contain various message types (text, position, telemetry, etc.)
|
||||
- MQTT topics follow pattern: `msh/{region}/{subregion}/#`
|
||||
|
||||
### Database Schema
|
||||
- **packet** - Raw packet data
|
||||
- **node** - Mesh node information
|
||||
- **traceroute** - Network path information
|
||||
- **packet_seen** - Packet observation records
|
||||
|
||||
### Real-time Updates
|
||||
- Web pages use Server-Sent Events (SSE) for live updates
|
||||
- Map and firehose pages auto-refresh based on config intervals
|
||||
- API endpoints return JSON for programmatic access
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always use async/await** for database and network operations
|
||||
2. **Use Alembic** for all database schema changes
|
||||
3. **Follow existing patterns** - check similar code before adding new features
|
||||
4. **Update documentation** - keep `docs/` and README current
|
||||
5. **Test migrations** - verify migrations work both up and down
|
||||
6. **Handle errors gracefully** - log errors, don't crash on bad packets
|
||||
7. **Respect configuration** - use `config.ini` values, don't hardcode
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
- **Don't modify applied migrations** - create new ones instead
|
||||
- **Don't block the event loop** - use async I/O, not sync
|
||||
- **Don't forget timezone handling** - timestamps are stored in UTC
|
||||
- **Don't hardcode paths** - use configuration values
|
||||
- **Don't ignore MQTT reconnection** - handle connection failures gracefully
|
||||
|
||||
## Resources
|
||||
|
||||
- **Main README**: `README.md` - Installation and basic usage
|
||||
- **Docker Guide**: `README-Docker.md` - Container deployment
|
||||
- **API Docs**: `docs/API_Documentation.md` - API endpoint reference
|
||||
- **Migration Guide**: `docs/Database-Changes-With-Alembic.md` - Database workflow
|
||||
- **Contributing**: `CONTRIBUTING.md` - Contribution guidelines
|
||||
|
||||
## Version Information
|
||||
|
||||
- **Current Version**: 3.0.0 (November 2025)
|
||||
- **Python Requirement**: 3.13+
|
||||
- **Key Features**: Alembic migrations, automated backups, Docker support, traceroute return paths
|
||||
|
||||
|
||||
## Rules for robots
|
||||
- Always run ruff check and ruff format after making changes (only on python changes)
|
||||
|
||||
|
||||
---
|
||||
|
||||
When working on this project, prioritize:
|
||||
1. Maintaining async patterns
|
||||
2. Following existing code structure
|
||||
3. Using proper database migrations
|
||||
4. Keeping documentation updated
|
||||
5. Testing changes thoroughly
|
||||
|
||||
|
||||
|
||||
-133
@@ -1,133 +0,0 @@
|
||||
# Contributing to Meshview
|
||||
|
||||
First off, thanks for taking the time to contribute! ❤️
|
||||
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for ways to help and details about how this project handles contributions. Please read the relevant section before getting started — it will make things smoother for both you and the maintainers.
|
||||
|
||||
The Meshview community looks forward to your contributions. 🎉
|
||||
|
||||
> And if you like the project but don’t have time to contribute code, that’s fine! You can still support Meshview by:
|
||||
> - ⭐ Starring the repo on GitHub
|
||||
> - Talking about Meshview on social media
|
||||
> - Referencing Meshview in your own project’s README
|
||||
> - Mentioning Meshview at local meetups or to colleagues/friends
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Code of Conduct](#code-of-conduct)
|
||||
- [I Have a Question](#i-have-a-question)
|
||||
- [I Want to Contribute](#i-want-to-contribute)
|
||||
- [Reporting Bugs](#reporting-bugs)
|
||||
- [Suggesting Enhancements](#suggesting-enhancements)
|
||||
- [Your First Code Contribution](#your-first-code-contribution)
|
||||
- [Improving the Documentation](#improving-the-documentation)
|
||||
- [Styleguides](#styleguides)
|
||||
- [Commit Messages](#commit-messages)
|
||||
- [Join the Project Team](#join-the-project-team)
|
||||
|
||||
---
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
Meshview is an open and welcoming community. We want everyone to feel safe, respected, and valued.
|
||||
|
||||
### Our Standards
|
||||
- Be respectful and considerate in all interactions.
|
||||
- Welcome new contributors and help them learn.
|
||||
- Provide constructive feedback, not personal attacks.
|
||||
- Focus on collaboration and what benefits the community.
|
||||
|
||||
Unacceptable behavior includes harassment, insults, hate speech, personal attacks, or publishing others’ private information without permission.
|
||||
|
||||
---
|
||||
|
||||
## I Have a Question
|
||||
|
||||
> Before asking, please read the [documentation](docs/README.md) if available.
|
||||
|
||||
1. Search the [issues list](../../issues) to see if your question has already been asked.
|
||||
2. If not, open a [new issue](../../issues/new) with the **question** label.
|
||||
3. Provide as much context as possible (OS, Python version, database type, etc.).
|
||||
|
||||
---
|
||||
|
||||
## I Want to Contribute!
|
||||
|
||||
### Legal Notice
|
||||
By contributing to Meshview, you agree that:
|
||||
- You authored the content yourself.
|
||||
- You have the necessary rights to the content.
|
||||
- Your contribution can be provided under the project’s license.
|
||||
|
||||
---
|
||||
|
||||
### Reporting Bugs
|
||||
|
||||
Before submitting a bug report:
|
||||
- Make sure you’re using the latest Meshview version.
|
||||
- Verify the issue is not due to a misconfigured environment (SQLite/MySQL, Python version, etc.).
|
||||
- Search existing [bug reports](../../issues?q=label%3Abug).
|
||||
- Collect relevant information:
|
||||
- Steps to reproduce
|
||||
- Error messages / stack traces
|
||||
- OS, Python version, and database backend
|
||||
- Any logs (`meshview-db.service`, `mqtt_reader.py`, etc.)
|
||||
|
||||
How to report:
|
||||
- Open a [new issue](../../issues/new).
|
||||
- Use a **clear and descriptive title**.
|
||||
- Include reproduction steps and expected vs. actual behavior.
|
||||
|
||||
⚠️ Security issues should **not** be reported in public issues. Instead, email us at **meshview-maintainers@proton.me**.
|
||||
|
||||
---
|
||||
|
||||
### Suggesting Enhancements
|
||||
|
||||
Enhancements are tracked as [issues](../../issues). Before suggesting:
|
||||
- Make sure the feature doesn’t already exist.
|
||||
- Search for prior suggestions.
|
||||
- Check that it fits Meshview’s scope (mesh packet analysis, visualization, telemetry, etc.).
|
||||
|
||||
When submitting:
|
||||
- Use a **clear and descriptive title**.
|
||||
- Describe the current behavior and what you’d like to see instead.
|
||||
- Include examples, screenshots, or mockups if relevant.
|
||||
- Explain why it would be useful to most Meshview users.
|
||||
|
||||
---
|
||||
|
||||
### Your First Code Contribution
|
||||
|
||||
We love first-time contributors! 🚀
|
||||
|
||||
If you’d like to start coding:
|
||||
1. Look for issues tagged with [good first issue](../../issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).
|
||||
2. Fork the repository and clone it locally.
|
||||
3. Set up the development environment:
|
||||
4. Run the app locally
|
||||
5. Create a new branch, make your changes, commit, and push.
|
||||
6. Open a pull request!
|
||||
|
||||
---
|
||||
|
||||
### Improving the Documentation
|
||||
|
||||
Docs are just as important as code. You can help by:
|
||||
- Fixing typos or broken links.
|
||||
- Clarifying confusing instructions.
|
||||
- Adding examples (e.g., setting up Nginx as a reverse proxy, SQLite vs. MySQL setup).
|
||||
- Writing or updating tutorials.
|
||||
|
||||
---
|
||||
|
||||
## Join the Project Team
|
||||
|
||||
Meshview is a community-driven project. If you consistently contribute (code, documentation, or community help), we’d love to invite you as a maintainer.
|
||||
|
||||
Start by contributing regularly, engaging in issues/PRs, and helping others.
|
||||
|
||||
---
|
||||
|
||||
✨ That’s it! Thanks again for being part of Meshview. Every contribution matters.
|
||||
@@ -1,79 +0,0 @@
|
||||
# Build Image
|
||||
# Uses python:3.13-slim because no native dependencies are needed for meshview itself
|
||||
# (everything is available as a wheel)
|
||||
|
||||
FROM docker.io/python:3.13-slim AS meshview-build
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends curl patch && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Add a non-root user/group
|
||||
ARG APP_USER=app
|
||||
RUN useradd -m -u 10001 -s /bin/bash ${APP_USER}
|
||||
|
||||
# Install uv and put it on PATH system-wide
|
||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
|
||||
&& install -m 0755 /root/.local/bin/uv /usr/local/bin/uv
|
||||
|
||||
WORKDIR /app
|
||||
RUN chown -R ${APP_USER}:${APP_USER} /app
|
||||
|
||||
# Copy deps first for caching
|
||||
COPY --chown=${APP_USER}:${APP_USER} pyproject.toml uv.lock* requirements*.txt ./
|
||||
|
||||
# Optional: wheels-only to avoid slow source builds
|
||||
ENV UV_NO_BUILD=1
|
||||
RUN uv venv /opt/venv
|
||||
# RUN uv sync --frozen
|
||||
ENV VIRTUAL_ENV=/opt/venv
|
||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||
|
||||
RUN uv pip install --no-cache-dir --upgrade pip \
|
||||
&& if [ -f requirements.txt ]; then uv pip install --only-binary=:all: -r requirements.txt; fi
|
||||
|
||||
# Copy app code
|
||||
COPY --chown=${APP_USER}:${APP_USER} . .
|
||||
|
||||
# Patch config
|
||||
COPY --chown=${APP_USER}:${APP_USER} container/config.ini /app/sample.config.ini
|
||||
|
||||
# Clean
|
||||
RUN rm -rf /app/.git* && \
|
||||
rm -rf /app/.pre-commit-config.yaml && \
|
||||
rm -rf /app/*.md && \
|
||||
rm -rf /app/COPYING && \
|
||||
rm -rf /app/Containerfile && \
|
||||
rm -rf /app/Dockerfile && \
|
||||
rm -rf /app/container && \
|
||||
rm -rf /app/docker && \
|
||||
rm -rf /app/docs && \
|
||||
rm -rf /app/pyproject.toml && \
|
||||
rm -rf /app/requirements.txt && \
|
||||
rm -rf /app/screenshots
|
||||
|
||||
# Prepare /app and /opt to copy
|
||||
RUN mkdir -p /meshview && \
|
||||
mv /app /opt /meshview
|
||||
|
||||
# Use a clean container for install
|
||||
FROM docker.io/python:3.13-slim
|
||||
ARG APP_USER=app
|
||||
COPY --from=meshview-build /meshview /
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends graphviz && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
useradd -m -u 10001 -s /bin/bash ${APP_USER} && \
|
||||
mkdir -p /etc/meshview /var/lib/meshview /var/log/meshview && \
|
||||
mv /app/sample.config.ini /etc/meshview/config.ini && \
|
||||
chown -R ${APP_USER}:${APP_USER} /var/lib/meshview /var/log/meshview
|
||||
|
||||
# Drop privileges
|
||||
USER ${APP_USER}
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENTRYPOINT [ "/opt/venv/bin/python", "mvrun.py"]
|
||||
CMD ["--pid_dir", "/tmp", "--py_exec", "/opt/venv/bin/python", "--config", "/etc/meshview/config.ini" ]
|
||||
|
||||
EXPOSE 8081
|
||||
VOLUME [ "/etc/meshview", "/var/lib/meshview", "/var/log/meshview" ]
|
||||
@@ -1 +0,0 @@
|
||||
Containerfile
|
||||
@@ -0,0 +1,19 @@
|
||||
Meshview
|
||||
========
|
||||
|
||||
This project watches a MQTT topic for meshtastic messages, imports them to a
|
||||
database and has a web UI to view them.
|
||||
|
||||
Example
|
||||
-------
|
||||
An example instance, https://meshview.armooo.net, is running with with data
|
||||
from the MQTT topic msh/US/bayarea/#.
|
||||
|
||||
|
||||
Running
|
||||
-------
|
||||
$ python3 -m venv env
|
||||
$ ./env/bin/pip install -r requirements.txt
|
||||
$ ./env/bin/python main.py
|
||||
|
||||
Now you can hit http://localhost:8080/
|
||||
@@ -1,247 +0,0 @@
|
||||
# Running MeshView with Docker
|
||||
|
||||
MeshView container images are built automatically and published to GitHub Container Registry.
|
||||
|
||||
## Quick Start
|
||||
|
||||
Pull and run the latest image:
|
||||
|
||||
```bash
|
||||
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
|
||||
|
||||
docker run -d \
|
||||
--name meshview \
|
||||
-p 8081:8081 \
|
||||
-v ./config:/etc/meshview \
|
||||
-v ./data:/var/lib/meshview \
|
||||
-v ./logs:/var/log/meshview \
|
||||
ghcr.io/pablorevilla-meshtastic/meshview:latest
|
||||
```
|
||||
|
||||
Access the web interface at: http://localhost:8081
|
||||
|
||||
## Volume Mounts
|
||||
|
||||
The container uses three volumes for persistent data:
|
||||
|
||||
| Volume | Purpose | Required |
|
||||
|--------|---------|----------|
|
||||
| `/etc/meshview` | Configuration files | Yes |
|
||||
| `/var/lib/meshview` | Database storage | Recommended |
|
||||
| `/var/log/meshview` | Log files | Optional |
|
||||
|
||||
### Configuration Volume
|
||||
|
||||
Mount a directory containing your `config.ini` file:
|
||||
|
||||
```bash
|
||||
-v /path/to/your/config:/etc/meshview
|
||||
```
|
||||
|
||||
If no config is provided, the container will use the default `sample.config.ini`.
|
||||
|
||||
### Database Volume
|
||||
|
||||
Mount a directory to persist the SQLite database:
|
||||
|
||||
```bash
|
||||
-v /path/to/your/data:/var/lib/meshview
|
||||
```
|
||||
|
||||
**Important:** Without this mount, your database will be lost when the container stops.
|
||||
|
||||
### Logs Volume
|
||||
|
||||
Mount a directory to access logs from the host:
|
||||
|
||||
```bash
|
||||
-v /path/to/your/logs:/var/log/meshview
|
||||
```
|
||||
|
||||
## Complete Example
|
||||
|
||||
Create a directory structure and run:
|
||||
|
||||
```bash
|
||||
# Create directories
|
||||
mkdir -p meshview/{config,data,logs,backups}
|
||||
|
||||
# Copy sample config (first time only)
|
||||
docker run --rm ghcr.io/pablorevilla-meshtastic/meshview:latest \
|
||||
cat /etc/meshview/config.ini > meshview/config/config.ini
|
||||
|
||||
# Edit config.ini with your MQTT settings
|
||||
nano meshview/config/config.ini
|
||||
|
||||
# Run the container
|
||||
docker run -d \
|
||||
--name meshview \
|
||||
--restart unless-stopped \
|
||||
-p 8081:8081 \
|
||||
-v $(pwd)/meshview/config:/etc/meshview \
|
||||
-v $(pwd)/meshview/data:/var/lib/meshview \
|
||||
-v $(pwd)/meshview/logs:/var/log/meshview \
|
||||
ghcr.io/pablorevilla-meshtastic/meshview:latest
|
||||
```
|
||||
|
||||
## Docker Compose
|
||||
|
||||
Create a `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
meshview:
|
||||
image: ghcr.io/pablorevilla-meshtastic/meshview:latest
|
||||
container_name: meshview
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8081:8081"
|
||||
volumes:
|
||||
- ./config:/etc/meshview
|
||||
- ./data:/var/lib/meshview
|
||||
- ./logs:/var/log/meshview
|
||||
- ./backups:/var/lib/meshview/backups # For database backups
|
||||
environment:
|
||||
- TZ=America/Los_Angeles # Set your timezone
|
||||
```
|
||||
|
||||
Run with:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Minimum Configuration
|
||||
|
||||
Edit your `config.ini` to configure MQTT connection:
|
||||
|
||||
```ini
|
||||
[mqtt]
|
||||
server = mqtt.meshtastic.org
|
||||
topics = ["msh/US/#"]
|
||||
port = 1883
|
||||
username =
|
||||
password =
|
||||
|
||||
[database]
|
||||
# SQLAlchemy async connection string.
|
||||
# Examples:
|
||||
# sqlite+aiosqlite:///var/lib/meshview/packets.db
|
||||
# postgresql+asyncpg://user:pass@host:5432/meshview
|
||||
connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
|
||||
```
|
||||
|
||||
### Database Backups
|
||||
|
||||
To enable automatic daily backups inside the container:
|
||||
|
||||
```ini
|
||||
[cleanup]
|
||||
backup_enabled = True
|
||||
backup_dir = /var/lib/meshview/backups
|
||||
backup_hour = 2
|
||||
backup_minute = 00
|
||||
```
|
||||
|
||||
Then mount the backups directory:
|
||||
|
||||
```bash
|
||||
-v $(pwd)/meshview/backups:/var/lib/meshview/backups
|
||||
```
|
||||
|
||||
## Available Tags
|
||||
|
||||
| Tag | Description |
|
||||
|-----|-------------|
|
||||
| `latest` | Latest build from the main branch |
|
||||
| `dev-v3` | Development branch |
|
||||
| `v1.2.3` | Specific version tags |
|
||||
|
||||
## Updating
|
||||
|
||||
Pull the latest image and restart:
|
||||
|
||||
```bash
|
||||
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
|
||||
docker restart meshview
|
||||
```
|
||||
|
||||
Or with docker-compose:
|
||||
|
||||
```bash
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Logs
|
||||
|
||||
View container logs:
|
||||
|
||||
```bash
|
||||
docker logs meshview
|
||||
|
||||
# Follow logs
|
||||
docker logs -f meshview
|
||||
|
||||
# Last 100 lines
|
||||
docker logs --tail 100 meshview
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container won't start
|
||||
|
||||
Check logs:
|
||||
```bash
|
||||
docker logs meshview
|
||||
```
|
||||
|
||||
### Database permission issues
|
||||
|
||||
Ensure the data directory is writable:
|
||||
```bash
|
||||
chmod -R 755 meshview/data
|
||||
```
|
||||
|
||||
### Can't connect to MQTT
|
||||
|
||||
1. Check your MQTT configuration in `config.ini`
|
||||
2. Verify network connectivity from the container:
|
||||
```bash
|
||||
docker exec meshview ping mqtt.meshtastic.org
|
||||
```
|
||||
|
||||
### Port already in use
|
||||
|
||||
Change the host port (left side):
|
||||
```bash
|
||||
-p 8082:8081
|
||||
```
|
||||
|
||||
Then access at: http://localhost:8082
|
||||
|
||||
## Building Your Own Image
|
||||
|
||||
If you want to build from source:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/pablorevilla-meshtastic/meshview.git
|
||||
cd meshview
|
||||
docker build -f Containerfile -t meshview:local .
|
||||
```
|
||||
|
||||
## Security Notes
|
||||
|
||||
- The container runs as a non-root user (`app`, UID 10001)
|
||||
- No privileged access required
|
||||
- Only port 8081 is exposed
|
||||
- All data stored in mounted volumes
|
||||
|
||||
## Support
|
||||
|
||||
- GitHub Issues: https://github.com/pablorevilla-meshtastic/meshview/issues
|
||||
- Documentation: https://github.com/pablorevilla-meshtastic/meshview
|
||||
@@ -1,683 +0,0 @@
|
||||
|
||||
# Meshview
|
||||

|
||||
|
||||
The project serves as a real-time monitoring and diagnostic tool for the Meshtastic mesh network. It provides detailed insights into network activity, including message traffic, node positions, and telemetry data.
|
||||
|
||||
### Version 3.0.7 — May 2026
|
||||
- Reliability report: added a dedicated reliability page for checking how well a selected node is heard across the mesh, including heard/missed status, packet counts, hop counts, gateway tables, and a map view.
|
||||
- Node list/map UX: added node list filtering for wider active-node ranges, included all database nodes where appropriate, and made map node colors persistent across reboots.
|
||||
- QR/API fixes: corrected QR code generation when a node role is missing or unavailable.
|
||||
- Database cleanup: removed stored node public key data and added the Alembic migration to drop `node.public_key`.
|
||||
- Protobufs: refreshed Meshtastic protobuf Python modules to upstream commit
|
||||
- Tooling: improved the protobuf updater so it supports raw commit SHAs, the newer upstream `meshtastic/*.proto` layout, generated `.pyi` stubs, and the vendored `nanopb`/`serial_hal` outputs.
|
||||
|
||||
### Version 3.0.6 — March 2026
|
||||
- Daily snapshots: added the `daily_snapshot` table, scheduled snapshot capture, and `/api/snapshots/daily` for historical node, packet, and gateway counts.
|
||||
- Stats/UI: expanded stats views with snapshot data and added channel filters to Chat and Firehose.
|
||||
- Map/node fixes: corrected node location handling, map popup behavior, packet page display, and node list sorting.
|
||||
- Ingestion/API reliability: improved duplicate `PacketSeen` handling, guarded invalid node info packets, and made traceroute/edge APIs more tolerant of decode failures.
|
||||
- Language support: added Russian translations.
|
||||
|
||||
### Version 3.0.5 — February 2026
|
||||
- **IMPORTANT:** the predicted coverage feature requires the extra `pyitm` dependency. If it is not installed, the coverage API will return 503.
|
||||
- Ubuntu install (inside the venv): `./env/bin/pip install pyitm`
|
||||
- Coverage: predicted coverage overlay (Longley‑Rice area mode) with perimeter rendering and documentation.
|
||||
- UI: added QR code display for quick node/app access.
|
||||
- Gateways: persistent gateway tracking (`is_mqtt_gateway`) and UI indicators in nodes, map popups, and stats.
|
||||
- Map UX: deterministic jitter for overlapping nodes; edges follow jittered positions.
|
||||
- Tooling: Meshtastic protobuf updater script with `--check` and `UPSTREAM_REV.txt` tracking.
|
||||
|
||||
|
||||
### Version 3.0.4 — Late January 2026
|
||||
- Database: multi‑DB support, PostgreSQL scripts, WAL config for SQLite, cleanup query timing fixes, removal of import time columns, and various time‑handling fixes.
|
||||
- UI/UX: extensive updates to node.html, nodelist.html, top.html, and packet.html (paging, stats, distance, status/favorites), plus net view changes to 12‑hour window.
|
||||
- API/logic: weekly mesh query fix, node list performance improvement, backwards‑compatibility and other bug fixes.
|
||||
- MQTT reader: configurable skip‑node list and secondary decryption keys.
|
||||
- Docs/ops: multiple documentation updates, updated site list, container workflow fixes/tests, README updates.
|
||||
|
||||
### Version 3.0.2 — January 2026
|
||||
- Changes to the Database to will make it so that there is a need for space when updating to the latest. SQlite requires to rebuild the database when droping a column. ( we are droping some of the old columns) so make sure you have 1.2x the size of the db of space in your environment. Depending on how big your db is it would take a long time.
|
||||
|
||||
### Version 3.0.1 — December 2025
|
||||
|
||||
#### 🌐 Multi-Language Support (i18n)
|
||||
- New `/api/lang` endpoint for serving translations
|
||||
- Section-based translation loading (e.g., `?section=firehose`)
|
||||
- Default language controlled via config file language section
|
||||
- JSON-based translation files for easy expansion
|
||||
- Core pages updated to support `data-translate-lang` attributes
|
||||
|
||||
### 🛠 Improvements
|
||||
- Updated UI elements across multiple templates for localization readiness
|
||||
- General cleanup to support future language additions
|
||||
|
||||
### Version 3.0.0 update - November 2025
|
||||
|
||||
**Major Infrastructure Improvements:**
|
||||
|
||||
* **Database Migrations**: Alembic integration for safe schema upgrades and database versioning
|
||||
* **Automated Backups**: Independent database backup system with gzip compression (separate from cleanup)
|
||||
* **Development Tools**: Quick setup script (`setup-dev.sh`) with pre-commit hooks for code quality
|
||||
* **Docker Support**: Pre-built containers now available on GitHub Container Registry with automatic builds - ogarcia
|
||||
|
||||
**New Features:**
|
||||
|
||||
* **Traceroute Return Path**: Log and display return path data for traceroute packets - jschrempp
|
||||
* **Microsecond Timestamps**: Added `import_time_us` columns for higher precision time tracking
|
||||
|
||||
**Technical Improvements:**
|
||||
|
||||
* Migration from manual SQL to Alembic-managed schema
|
||||
* Container images use `uv` for faster dependency installation
|
||||
* Python 3.13 support with slim Debian-based images
|
||||
* Documentation collection in `docs/` directory
|
||||
* API routes moved to separate modules for better organization
|
||||
* /version and /health endpoints added for monitoring
|
||||
|
||||
See [README-Docker.md](README-Docker.md) for container deployment and [docs/](docs/) for technical documentation.
|
||||
|
||||
### Version 2.0.7 update - September 2025
|
||||
* New database maintenance capability to automatically keep a specific number of days of data.
|
||||
* Added configuration for update intervals for both the Live Map and the Firehose pages.
|
||||
|
||||
### Version 2.0.6 update - August 2025
|
||||
* New Live Map (Shows packet feed live)
|
||||
* New API /api/config (See API documentation)
|
||||
* New API /api/edges (See API documentation)
|
||||
* Adds edges to the map (click to see traceroute and neighbours)
|
||||
|
||||
|
||||
### Version 2.0.4 update - August 2025
|
||||
* New statistic page with more data.
|
||||
* New API /api/stats (See API documentation).
|
||||
* Inprovement on "See Everything" and "Conversation" pages.
|
||||
* Tracking of replies with links to original message.
|
||||
|
||||
### Version 2.0.3 update - June 2025
|
||||
* Moved more graphs to eCharts.
|
||||
* Addedd smooth updating for "Conversations" and "See everything" sections.
|
||||
* Now you can turn on and off "Quick Links".
|
||||
* Network graphs are now dynamically generated depending on your mesh and the presets in use.
|
||||
* Download node's packet information for the last 3 days to .csv file.
|
||||
* Display distance traveled by packet.
|
||||
### Key Features
|
||||
|
||||
* **Live Data Visualization**: Users can view real-time data from the mesh network, including text messages, GPS positions, and node information.
|
||||
|
||||
* **Interactive Map**: The site offers an interactive map displaying the locations of active nodes, helping users identify network coverage areas.
|
||||
|
||||
* **Mesh Graphs**: Visual representations of the network's structure and connectivity are available, illustrating how nodes are interconnected.
|
||||
|
||||
* **Packet Analysis**: Detailed information on individual data packets transmitted within the network can be accessed, including payload content and transmission paths.
|
||||
|
||||
* **Node Statistics**: Users can explore statistics related to network traffic, such as top contributors and message volumes.
|
||||
|
||||
Samples of currently running instances:
|
||||
|
||||
| Area | URL | Version | Nodes | Last Updated |
|
||||
| --- | --- | --- | ---: | --- |
|
||||
| Polski Mesh | https://meshview.format.ovh | 3.0.6 (65386be) | 4,827 | 4/1/2026, 12:12:25 PM |
|
||||
| Poland | https://meshview.szastan.pl | 3.0.5 (unknown) | 4,194 | 4/1/2026, 12:12:39 PM |
|
||||
| Spain | https://meshview.meshtastic.es | 3.0.5 (unknown) | 2,466 | 4/1/2026, 12:11:17 PM |
|
||||
| San Francisco Bay Area | https://meshview.bayme.sh | 3.0.5 (bdf70da) | 1,983 | 4/1/2026, 12:11:08 PM |
|
||||
| Southern California | https://meshview.socalmesh.org | 3.0.5 (unknown) | 1,205 | 4/1/2026, 12:11:50 PM |
|
||||
| Oregon (USA) | https://meshview.meshoregon.com | 3.0.5 (bdf70da) | 1,167 | 4/1/2026, 12:11:41 PM |
|
||||
| Australia/ New Zeland | https://my.meshview.world/anz | plus 1.0.0 | 1,165 | 4/1/2026, 12:11:59 PM |
|
||||
| Hessen - Germany | https://meshview.lsinfra.de | 3.0.5 (unknown) | 1,082 | 4/1/2026, 12:11:30 PM |
|
||||
| New York City | https://meshview.nyme.sh | 3.0.5 (bdf70da) | 984 | 4/1/2026, 12:11:26 PM |
|
||||
| Salt Lake City (USA) | https://meshview.freq51.net | — | 801 | 4/1/2026, 12:11:36 PM |
|
||||
| Salzburg / Austria | https://meshview-salzburg.jmt.gr | — | 748 | 4/1/2026, 12:11:21 PM |
|
||||
| North Georgia / East Tennessee - USA | https://view.mtnme.sh | 3.0.3 (ff30623) | 730 | 4/1/2026, 12:11:33 PM |
|
||||
| Canada | https://mv.canadaverse.org | 3.0.1 (unknown) | 674 | 4/1/2026, 12:12:06 PM |
|
||||
| Pioneer Valley, Massachusetts (USA) | https://meshview.pvmesh.org | 3.0.4 (018e16e) | 560 | 4/1/2026, 12:11:44 PM |
|
||||
| Western Pennsylvania (USA) | https://map.wpamesh.net | 3.0.5 (unknown) | 447 | 4/1/2026, 12:11:38 PM |
|
||||
| Great Britan | https://my.meshview.world/gb | plus 1.0.0 | 421 | 4/1/2026, 12:12:03 PM |
|
||||
| Chicago (USA) | https://meshview.chicagolandmesh.org | 3.0.5 (unknown) | 420 | 4/1/2026, 12:12:41 PM |
|
||||
| Georgia (USA) | https://meshview.gamesh.net | 3.0.1 (unknown) | 384 | 4/1/2026, 12:11:45 PM |
|
||||
| Brazil | https://my.meshview.world/brazil | plus 1.0.0 | 364 | 4/1/2026, 12:12:01 PM |
|
||||
| Mexico | https://my.meshview.world/mexico | plus 1.0.0 | 268 | 4/1/2026, 12:11:59 PM |
|
||||
| Northeast Ohio | https://meshview.neomesh.org | 3.0.5 (unknown) | 264 | 4/1/2026, 12:11:52 PM |
|
||||
| South Africa | https://my.meshview.world/za | plus 1.0.0 | 263 | 4/1/2026, 12:12:07 PM |
|
||||
| Argentina | https://my.meshview.world/argentina | plus 1.0.0 | 258 | 4/1/2026, 12:12:00 PM |
|
||||
| Northwest Indiana (USA) | https://meshview.nwimesh.net | 3.0.5 (2cc53dc) | 219 | 4/1/2026, 12:12:08 PM |
|
||||
| Louisiana (USA) | https://meshview.louisianamesh.org | — | 78 | 4/1/2026, 12:11:51 PM |
|
||||
| Chile | https://my.meshview.world/chile | plus 1.0.0 | 58 | 4/1/2026, 12:12:06 PM |
|
||||
| Colombia | https://meshview.meshcolombia.co | 3.0.5 (2cc53dc) | 55 | 4/1/2026, 12:11:46 PM |
|
||||
| Croatia | https://map.cromesh.eu | — | 0 | 4/1/2026, 12:11:45 PM |
|
||||
| Saint Louis (USA) | https://meshview.meshstl.org | 3.0.5 (2cc53dc) | 0 | 4/1/2026, 12:11:51 PM |
|
||||
| Southwest Louisiana (USA) | https://www.swlamesh.com | — | 0 | 4/1/2026, 12:11:46 PM |
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
### Updating from 2.x to 3.x
|
||||
We are adding the use of Alembic. If using GitHub
|
||||
Update your codebase by running the pull command
|
||||
```bash
|
||||
cd meshview
|
||||
git pull origin master
|
||||
```
|
||||
Install Alembic in your environment
|
||||
```bash
|
||||
./env/bin/pip install alembic
|
||||
```
|
||||
Start your scripts or services. This process will update your database with the latest schema.
|
||||
|
||||
## Installing
|
||||
|
||||
### Using Docker (Recommended)
|
||||
|
||||
The easiest way to run MeshView is using Docker. Pre-built images are available from GitHub Container Registry.
|
||||
|
||||
See **[README-Docker.md](README-Docker.md)** for complete Docker installation and usage instructions.
|
||||
|
||||
### Manual Installation
|
||||
|
||||
Requires **`python3.13`** or above.
|
||||
|
||||
Clone the repo from GitHub:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/pablorevilla-meshtastic/meshview.git
|
||||
cd meshview
|
||||
```
|
||||
|
||||
#### Quick Setup (Recommended)
|
||||
|
||||
Run the development setup script:
|
||||
|
||||
```bash
|
||||
./setup-dev.sh
|
||||
```
|
||||
|
||||
This will:
|
||||
- Create Python virtual environment
|
||||
- Install all requirements
|
||||
- Install development tools (pre-commit, pytest)
|
||||
- Set up pre-commit hooks for code formatting
|
||||
- Create config.ini from sample
|
||||
|
||||
#### Manual Setup
|
||||
|
||||
Create a Python virtual environment:
|
||||
|
||||
```bash
|
||||
python3 -m venv env
|
||||
```
|
||||
|
||||
Install the environment requirements:
|
||||
|
||||
```bash
|
||||
./env/bin/pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Install `graphviz` on MacOS or Debian/Ubuntu Linux:
|
||||
|
||||
```bash
|
||||
sudo apt-get install graphviz
|
||||
```
|
||||
|
||||
Copy `sample.config.ini` to `config.ini`:
|
||||
|
||||
```bash
|
||||
cp sample.config.ini config.ini
|
||||
```
|
||||
|
||||
Edit `config.ini` to match your MQTT and web server settings:
|
||||
|
||||
|
||||
```bash
|
||||
nano config.ini
|
||||
```
|
||||
|
||||
> **NOTE**
|
||||
> On MacOS set the bind configuration line to
|
||||
> ```
|
||||
> bind = 127.0.0.1
|
||||
> ```
|
||||
|
||||
Example:
|
||||
|
||||
```ini
|
||||
# -------------------------
|
||||
# Server Configuration
|
||||
# -------------------------
|
||||
[server]
|
||||
# The address to bind the server to. Use * to listen on all interfaces.
|
||||
bind = *
|
||||
|
||||
# Port to run the web server on.
|
||||
port = 8081
|
||||
|
||||
# Path to TLS certificate (leave blank to disable HTTPS).
|
||||
tls_cert =
|
||||
|
||||
# Path for the ACME challenge if using Let's Encrypt.
|
||||
acme_challenge =
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Site Appearance & Behavior
|
||||
# -------------------------
|
||||
[site]
|
||||
# The domain name of your site.
|
||||
domain =
|
||||
|
||||
# Select language (this represents the name of the json file in the /lang directory)
|
||||
language = es
|
||||
|
||||
# Site title to show in the browser title bar and headers.
|
||||
title = Bay Area Mesh
|
||||
|
||||
# A brief message shown on the homepage.
|
||||
message = Real time data from around the bay area and beyond.
|
||||
|
||||
# Starting URL when loading the index page.
|
||||
starting = /chat
|
||||
|
||||
# Enable or disable site features (as strings: "True" or "False").
|
||||
nodes = True
|
||||
conversations = True
|
||||
everything = True
|
||||
graphs = True
|
||||
stats = True
|
||||
net = True
|
||||
map = True
|
||||
top = True
|
||||
|
||||
# Map boundaries (used for the map view).
|
||||
# Defaults will show the San Francisco Bay Area
|
||||
map_top_left_lat = 39
|
||||
map_top_left_lon = -123
|
||||
map_bottom_right_lat = 36
|
||||
map_bottom_right_lon = -121
|
||||
|
||||
# Updates intervals in seconds, zero or negative number means no updates
|
||||
# defaults will be 3 seconds
|
||||
map_interval=3
|
||||
firehose_interval=3
|
||||
|
||||
# Weekly net details
|
||||
weekly_net_message = Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins. The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.
|
||||
net_tag = #BayMeshNet
|
||||
|
||||
# -------------------------
|
||||
# MQTT Broker Configuration
|
||||
# -------------------------
|
||||
[mqtt]
|
||||
# MQTT server hostname or IP.
|
||||
server = mqtt.bayme.sh
|
||||
|
||||
# Topics to subscribe to (as JSON-like list, but still a string).
|
||||
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
|
||||
|
||||
# Port used by MQTT (typically 1883 for unencrypted).
|
||||
port = 1883
|
||||
|
||||
# MQTT username and password.
|
||||
username = meshdev
|
||||
password = large4cats
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Database Configuration
|
||||
# -------------------------
|
||||
[database]
|
||||
# SQLAlchemy async connection string.
|
||||
# Examples:
|
||||
# sqlite+aiosqlite:///packets.db
|
||||
# postgresql+asyncpg://user:pass@host:5432/meshview
|
||||
connection_string = sqlite+aiosqlite:///packets.db
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Database Cleanup Configuration
|
||||
# -------------------------
|
||||
[cleanup]
|
||||
# Enable or disable daily cleanup
|
||||
enabled = False
|
||||
# Number of days to keep records in the database
|
||||
days_to_keep = 14
|
||||
# Time to run daily cleanup (24-hour format)
|
||||
hour = 2
|
||||
minute = 00
|
||||
# Run VACUUM after cleanup
|
||||
vacuum = False
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Logging Configuration
|
||||
# -------------------------
|
||||
[logging]
|
||||
# Enable or disable HTTP access logs from the web server
|
||||
# When disabled, request logs like "GET /api/chat" will not appear
|
||||
# Application logs (errors, startup messages, etc.) are unaffected
|
||||
# Set to True to enable, False to disable (default: False)
|
||||
access_log = False
|
||||
# Database cleanup logfile location
|
||||
db_cleanup_logfile = dbcleanup.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NOTE (PostgreSQL setup)**
|
||||
If you want to use PostgreSQL instead of SQLite:
|
||||
|
||||
Install PostgreSQL for your OS.
|
||||
Create a user and database:
|
||||
```
|
||||
`CREATE USER meshview WITH PASSWORD 'change_me';`
|
||||
`CREATE DATABASE meshview OWNER meshview;`
|
||||
```
|
||||
Update `config.ini` example:
|
||||
```
|
||||
`connection_string = postgresql+asyncpg://meshview:change_me@localhost:5432/meshview`
|
||||
```
|
||||
|
||||
## Running Meshview
|
||||
|
||||
Start the database manager:
|
||||
|
||||
```bash
|
||||
./env/bin/python startdb.py
|
||||
```
|
||||
|
||||
Start the web server:
|
||||
|
||||
```bash
|
||||
./env/bin/python main.py
|
||||
```
|
||||
|
||||
> **NOTE**
|
||||
> You can specify a custom config file with the `--config` flag:
|
||||
>
|
||||
> ```bash
|
||||
> ./env/bin/python startdb.py --config /path/to/config.ini
|
||||
> ./env/bin/python main.py --config /path/to/config.ini
|
||||
> ```
|
||||
|
||||
Open in your browser: http://localhost:8081/
|
||||
|
||||
---
|
||||
|
||||
## Running Meshview with `mvrun.py`
|
||||
|
||||
- `mvrun.py` starts both `startdb.py` and `main.py` in separate threads and merges the output.
|
||||
- It accepts several command-line arguments for flexible deployment.
|
||||
|
||||
```bash
|
||||
./env/bin/python mvrun.py
|
||||
```
|
||||
|
||||
**Command-line options:**
|
||||
- `--config CONFIG` - Path to the configuration file (default: `config.ini`)
|
||||
- `--pid_dir PID_DIR` - Directory for PID files (default: `.`)
|
||||
- `--py_exec PY_EXEC` - Path to the Python executable (default: `./env/bin/python`)
|
||||
|
||||
**Examples:**
|
||||
```bash
|
||||
# Use a specific config file
|
||||
./env/bin/python mvrun.py --config /etc/meshview/config.ini
|
||||
|
||||
# Store PID files in a specific directory
|
||||
./env/bin/python mvrun.py --pid_dir /var/run/meshview
|
||||
|
||||
# Use a different Python executable
|
||||
./env/bin/python mvrun.py --py_exec /usr/bin/python3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Setting Up Systemd Services (Ubuntu)
|
||||
|
||||
To run Meshview automatically on boot, create systemd services for `startdb.py` and `main.py`.
|
||||
> **NOTE**
|
||||
> You need to change the "User" and "/path/to/meshview" for your instance of the code on each service.
|
||||
|
||||
### 1. Service for `startdb.py`
|
||||
|
||||
Create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/meshview-db.service
|
||||
```
|
||||
|
||||
Paste:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Meshview Database Initializer
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/path/to/meshview
|
||||
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/startdb.py --config /path/to/meshview/config.ini
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
User=yourusername
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
### 2. Service for `main.py`
|
||||
|
||||
Create:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/meshview-web.service
|
||||
```
|
||||
|
||||
Paste:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Meshview Web Server
|
||||
After=network.target meshview-db.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/path/to/meshview
|
||||
ExecStart=/path/to/meshview/env/bin/python /path/to/meshview/main.py --config /path/to/meshview/config.ini
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
User=yourusername
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
### 3. Enable and start the services
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reexec
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable meshview-db
|
||||
sudo systemctl enable meshview-web
|
||||
sudo systemctl start meshview-db
|
||||
sudo systemctl start meshview-web
|
||||
```
|
||||
|
||||
### 4. Check status
|
||||
|
||||
```bash
|
||||
systemctl status meshview-db
|
||||
systemctl status meshview-web
|
||||
```
|
||||
|
||||
**TIP**
|
||||
After editing `.service` files, always run:
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
## 5. Database Maintenance
|
||||
### Database maintnance can now be done via the script itself here is the section from the configuration file.
|
||||
- Simple to setup
|
||||
- It will not drop any packets
|
||||
```
|
||||
# -------------------------
|
||||
# Database Cleanup Configuration
|
||||
# -------------------------
|
||||
[cleanup]
|
||||
# Enable or disable daily cleanup
|
||||
enabled = False
|
||||
# Number of days to keep records in the database
|
||||
days_to_keep = 14
|
||||
# Time to run daily cleanup (24-hour format)
|
||||
hour = 2
|
||||
minute = 00
|
||||
# Run VACUUM after cleanup
|
||||
vacuum = False
|
||||
|
||||
# -------------------------
|
||||
# Logging Configuration
|
||||
# -------------------------
|
||||
[logging]
|
||||
# Enable or disable HTTP access logs from the web server
|
||||
access_log = False
|
||||
# Database cleanup logfile location
|
||||
db_cleanup_logfile = dbcleanup.log
|
||||
```
|
||||
Once changes are done you need to restart the script for changes to load.
|
||||
|
||||
### Alternatively we can do it via your OS (This example is Ubuntu like OS)
|
||||
- Create and save bash script below. (Modify /path/to/file/ to the correct path)
|
||||
- Name it cleanup.sh
|
||||
- Make it executable.
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
DB_FILE="/path/to/file/packets.db"
|
||||
|
||||
# Stop DB service
|
||||
sudo systemctl stop meshview-db.service
|
||||
sudo systemctl stop meshview-web.service
|
||||
|
||||
sleep 5
|
||||
echo "Run cleanup..."
|
||||
# Run cleanup queries
|
||||
sqlite3 "$DB_FILE" <<EOF
|
||||
DELETE FROM packet
|
||||
WHERE import_time_us IS NOT NULL
|
||||
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
|
||||
SELECT 'packet deleted: ' || changes();
|
||||
DELETE FROM packet_seen
|
||||
WHERE import_time_us IS NOT NULL
|
||||
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
|
||||
SELECT 'packet_seen deleted: ' || changes();
|
||||
DELETE FROM traceroute
|
||||
WHERE import_time_us IS NOT NULL
|
||||
AND import_time_us < (strftime('%s','now','-14 days') * 1000000);
|
||||
SELECT 'traceroute deleted: ' || changes();
|
||||
DELETE FROM node
|
||||
WHERE last_seen_us IS NULL
|
||||
OR last_seen_us < (strftime('%s','now','-14 days') * 1000000);
|
||||
SELECT 'node deleted: ' || changes();
|
||||
VACUUM;
|
||||
EOF
|
||||
|
||||
# Start DB service
|
||||
sudo systemctl start meshview-db.service
|
||||
sudo systemctl start meshview-web.service
|
||||
|
||||
echo "Database cleanup completed on $(date)"
|
||||
|
||||
```
|
||||
- If you are using PostgreSQL, use this version instead (adjust credentials/DB name):
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
DB="postgresql://meshview@localhost:5432/meshview"
|
||||
RETENTION_DAYS=14
|
||||
BATCH_SIZE=100
|
||||
|
||||
PSQL="/usr/bin/psql"
|
||||
|
||||
echo "[$(date)] Starting batched cleanup..."
|
||||
|
||||
while true; do
|
||||
DELETED=$(
|
||||
$PSQL "$DB" -At -v ON_ERROR_STOP=1 <<EOF
|
||||
WITH cutoff AS (
|
||||
SELECT (EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000)::bigint AS ts
|
||||
),
|
||||
old_packets AS (
|
||||
SELECT id
|
||||
FROM packet, cutoff
|
||||
WHERE import_time_us IS NOT NULL
|
||||
AND import_time_us < cutoff.ts
|
||||
ORDER BY id
|
||||
LIMIT ${BATCH_SIZE}
|
||||
),
|
||||
ps_del AS (
|
||||
DELETE FROM packet_seen
|
||||
WHERE packet_id IN (SELECT id FROM old_packets)
|
||||
RETURNING 1
|
||||
),
|
||||
tr_del AS (
|
||||
DELETE FROM traceroute
|
||||
WHERE packet_id IN (SELECT id FROM old_packets)
|
||||
RETURNING 1
|
||||
),
|
||||
p_del AS (
|
||||
DELETE FROM packet
|
||||
WHERE id IN (SELECT id FROM old_packets)
|
||||
RETURNING 1
|
||||
)
|
||||
SELECT COUNT(*) FROM p_del;
|
||||
EOF
|
||||
)
|
||||
|
||||
if [[ "$DELETED" -eq 0 ]]; then
|
||||
break
|
||||
fi
|
||||
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
echo "[$(date)] Packet cleanup complete"
|
||||
|
||||
echo "[$(date)] Cleaning old nodes..."
|
||||
|
||||
$PSQL "$DB" -v ON_ERROR_STOP=1 <<EOF
|
||||
DELETE FROM node
|
||||
WHERE last_seen_us IS NOT NULL
|
||||
AND last_seen_us < (
|
||||
EXTRACT(EPOCH FROM (NOW() - INTERVAL '${RETENTION_DAYS} days')) * 1000000
|
||||
);
|
||||
EOF
|
||||
|
||||
echo "[$(date)] Node cleanup complete"
|
||||
|
||||
$PSQL "$DB" -c "VACUUM (ANALYZE) packet_seen;"
|
||||
$PSQL "$DB" -c "VACUUM (ANALYZE) traceroute;"
|
||||
$PSQL "$DB" -c "VACUUM (ANALYZE) packet;"
|
||||
$PSQL "$DB" -c "VACUUM (ANALYZE) node;"
|
||||
|
||||
echo "[$(date)] Cleanup finished"
|
||||
```
|
||||
- Schedule running the script on a regular basis.
|
||||
- In this example it runs every night at 2:00am.
|
||||
|
||||
Open scheduler:
|
||||
```bash
|
||||
sudo crontab -e
|
||||
```
|
||||
Add schedule to the bottom of the file (modify /path/to/file/ to the correct path):
|
||||
```bash
|
||||
0 2 * * * /path/to/file/cleanup.sh >> /path/to/file/cleanup.log 2>&1
|
||||
```
|
||||
|
||||
Check the log file to see it the script run at the specific time.
|
||||
|
||||
---
|
||||
|
||||
## Technical Documentation
|
||||
|
||||
For more detailed technical documentation including database migrations, architecture details, and advanced topics, see the [docs/](docs/) directory.
|
||||
-120
@@ -1,120 +0,0 @@
|
||||
# A generic, single database configuration.
|
||||
|
||||
[alembic]
|
||||
# path to migration scripts
|
||||
# Use forward slashes (/) also on windows to provide an os agnostic path
|
||||
script_location = alembic
|
||||
|
||||
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
|
||||
# Uncomment the line below if you want the files to be prepended with date and time
|
||||
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
|
||||
# for all available tokens
|
||||
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
|
||||
|
||||
# sys.path path, will be prepended to sys.path if present.
|
||||
# defaults to the current working directory.
|
||||
prepend_sys_path = .
|
||||
|
||||
# timezone to use when rendering the date within the migration file
|
||||
# as well as the filename.
|
||||
# If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library.
|
||||
# Any required deps can installed by adding `alembic[tz]` to the pip requirements
|
||||
# string value is passed to ZoneInfo()
|
||||
# leave blank for localtime
|
||||
# timezone =
|
||||
|
||||
# max length of characters to apply to the "slug" field
|
||||
# truncate_slug_length = 40
|
||||
|
||||
# set to 'true' to run the environment during
|
||||
# the 'revision' command, regardless of autogenerate
|
||||
# revision_environment = false
|
||||
|
||||
# set to 'true' to allow .pyc and .pyo files without
|
||||
# a source .py file to be detected as revisions in the
|
||||
# versions/ directory
|
||||
# sourceless = false
|
||||
|
||||
# version location specification; This defaults
|
||||
# to alembic/versions. When using multiple version
|
||||
# directories, initial revisions must be specified with --version-path.
|
||||
# The path separator used here should be the separator specified by "version_path_separator" below.
|
||||
# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions
|
||||
|
||||
# version path separator; As mentioned above, this is the character used to split
|
||||
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
|
||||
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
|
||||
# Valid values for version_path_separator are:
|
||||
#
|
||||
# version_path_separator = :
|
||||
# version_path_separator = ;
|
||||
# version_path_separator = space
|
||||
# version_path_separator = newline
|
||||
#
|
||||
# Use os.pathsep. Default configuration used for new projects.
|
||||
version_path_separator = os
|
||||
|
||||
# set to 'true' to search source files recursively
|
||||
# in each "version_locations" directory
|
||||
# new in Alembic version 1.10
|
||||
# recursive_version_locations = false
|
||||
|
||||
# the output encoding used when revision files
|
||||
# are written from script.py.mako
|
||||
# output_encoding = utf-8
|
||||
|
||||
# sqlalchemy.url will be set programmatically from meshview config
|
||||
# sqlalchemy.url = driver://user:pass@localhost/dbname
|
||||
|
||||
|
||||
[post_write_hooks]
|
||||
# post_write_hooks defines scripts or Python functions that are run
|
||||
# on newly generated revision scripts. See the documentation for further
|
||||
# detail and examples
|
||||
|
||||
# format using "black" - use the console_scripts runner, against the "black" entrypoint
|
||||
# hooks = black
|
||||
# black.type = console_scripts
|
||||
# black.entrypoint = black
|
||||
# black.options = -l 79 REVISION_SCRIPT_FILENAME
|
||||
|
||||
# lint with attempts to fix using "ruff" - use the exec runner, execute a binary
|
||||
# hooks = ruff
|
||||
# ruff.type = exec
|
||||
# ruff.executable = %(here)s/.venv/bin/ruff
|
||||
# ruff.options = --fix REVISION_SCRIPT_FILENAME
|
||||
|
||||
# Logging configuration
|
||||
[loggers]
|
||||
keys = root,sqlalchemy,alembic
|
||||
|
||||
[handlers]
|
||||
keys = console
|
||||
|
||||
[formatters]
|
||||
keys = generic
|
||||
|
||||
[logger_root]
|
||||
level = INFO
|
||||
handlers = console
|
||||
qualname =
|
||||
|
||||
[logger_sqlalchemy]
|
||||
level = WARNING
|
||||
handlers =
|
||||
qualname = sqlalchemy.engine
|
||||
|
||||
[logger_alembic]
|
||||
level = INFO
|
||||
handlers =
|
||||
qualname = alembic
|
||||
|
||||
[handler_console]
|
||||
class = StreamHandler
|
||||
args = (sys.stderr,)
|
||||
level = NOTSET
|
||||
formatter = generic
|
||||
|
||||
[formatter_generic]
|
||||
format = %(asctime)s %(filename)s:%(lineno)d [pid:%(process)d] %(levelname)s - %(message)s
|
||||
datefmt = %Y-%m-%d %H:%M:%S
|
||||
@@ -1 +0,0 @@
|
||||
Generic single-database configuration.
|
||||
-102
@@ -1,102 +0,0 @@
|
||||
import asyncio
|
||||
from logging.config import fileConfig
|
||||
|
||||
from sqlalchemy import pool
|
||||
from sqlalchemy.engine import Connection
|
||||
from sqlalchemy.ext.asyncio import async_engine_from_config
|
||||
|
||||
from alembic import context
|
||||
|
||||
# Import models metadata for autogenerate support
|
||||
from meshview.models import Base
|
||||
|
||||
# this is the Alembic Config object, which provides
|
||||
# access to the values within the .ini file in use.
|
||||
config = context.config
|
||||
|
||||
# Interpret the config file for Python logging.
|
||||
# This line sets up loggers basically.
|
||||
# Use disable_existing_loggers=False to preserve app logging configuration
|
||||
if config.config_file_name is not None:
|
||||
fileConfig(config.config_file_name, disable_existing_loggers=False)
|
||||
|
||||
# Add your model's MetaData object here for 'autogenerate' support
|
||||
target_metadata = Base.metadata
|
||||
|
||||
|
||||
def run_migrations_offline() -> None:
|
||||
"""Run migrations in 'offline' mode.
|
||||
|
||||
This configures the context with just a URL
|
||||
and not an Engine, though an Engine is acceptable
|
||||
here as well. By skipping the Engine creation
|
||||
we don't even need a DBAPI to be available.
|
||||
|
||||
Calls to context.execute() here emit the given string to the
|
||||
script output.
|
||||
|
||||
"""
|
||||
url = config.get_main_option("sqlalchemy.url")
|
||||
context.configure(
|
||||
url=url,
|
||||
target_metadata=target_metadata,
|
||||
literal_binds=True,
|
||||
dialect_opts={"paramstyle": "named"},
|
||||
)
|
||||
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
|
||||
|
||||
def do_run_migrations(connection: Connection) -> None:
|
||||
"""Run migrations with the given connection."""
|
||||
context.configure(connection=connection, target_metadata=target_metadata)
|
||||
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
|
||||
|
||||
async def run_async_migrations() -> None:
|
||||
"""Run migrations in async mode."""
|
||||
# Get configuration section
|
||||
configuration = config.get_section(config.config_ini_section, {})
|
||||
|
||||
# If sqlalchemy.url is not set in alembic.ini, try to get it from meshview config
|
||||
if "sqlalchemy.url" not in configuration:
|
||||
try:
|
||||
from meshview.config import CONFIG
|
||||
|
||||
configuration["sqlalchemy.url"] = CONFIG["database"]["connection_string"]
|
||||
except Exception:
|
||||
# Fallback to a default for initial migration creation
|
||||
configuration["sqlalchemy.url"] = "sqlite+aiosqlite:///packets.db"
|
||||
|
||||
connectable = async_engine_from_config(
|
||||
configuration,
|
||||
prefix="sqlalchemy.",
|
||||
poolclass=pool.NullPool,
|
||||
)
|
||||
|
||||
async with connectable.connect() as connection:
|
||||
await connection.run_sync(do_run_migrations)
|
||||
|
||||
await connectable.dispose()
|
||||
|
||||
|
||||
def run_migrations_online() -> None:
|
||||
"""Run migrations in 'online' mode with async support."""
|
||||
try:
|
||||
# Event loop is already running, schedule and run the coroutine
|
||||
import concurrent.futures
|
||||
|
||||
with concurrent.futures.ThreadPoolExecutor() as pool:
|
||||
pool.submit(lambda: asyncio.run(run_async_migrations())).result()
|
||||
except RuntimeError:
|
||||
# No event loop running, create one
|
||||
asyncio.run(run_async_migrations())
|
||||
|
||||
|
||||
if context.is_offline_mode():
|
||||
run_migrations_offline()
|
||||
else:
|
||||
run_migrations_online()
|
||||
@@ -1,26 +0,0 @@
|
||||
"""${message}
|
||||
|
||||
Revision ID: ${up_revision}
|
||||
Revises: ${down_revision | comma,n}
|
||||
Create Date: ${create_date}
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
${imports if imports else ""}
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = ${repr(up_revision)}
|
||||
down_revision: Union[str, None] = ${repr(down_revision)}
|
||||
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
|
||||
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
${upgrades if upgrades else "pass"}
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
${downgrades if downgrades else "pass"}
|
||||
@@ -1,45 +0,0 @@
|
||||
"""Add example table
|
||||
|
||||
Revision ID: 1717fa5c6545
|
||||
Revises: c88468b7ab0b
|
||||
Create Date: 2025-10-26 20:59:04.347066
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '1717fa5c6545'
|
||||
down_revision: str | None = 'add_time_us_cols'
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Create example table with sample columns."""
|
||||
op.create_table(
|
||||
'example',
|
||||
sa.Column('id', sa.Integer(), nullable=False, primary_key=True, autoincrement=True),
|
||||
sa.Column('name', sa.String(length=100), nullable=False),
|
||||
sa.Column('description', sa.Text(), nullable=True),
|
||||
sa.Column('value', sa.Float(), nullable=True),
|
||||
sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'),
|
||||
sa.Column(
|
||||
'created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')
|
||||
),
|
||||
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
)
|
||||
|
||||
# Create an index on the name column for faster lookups
|
||||
op.create_index('idx_example_name', 'example', ['name'])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Remove example table."""
|
||||
op.drop_index('idx_example_name', table_name='example')
|
||||
op.drop_table('example')
|
||||
@@ -1,27 +0,0 @@
|
||||
"""Add is_mqtt_gateway to node
|
||||
|
||||
Revision ID: 23dad03d2e42
|
||||
Revises: a0c9c13e118f
|
||||
Create Date: 2026-02-13 00:00:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "23dad03d2e42"
|
||||
down_revision: str | None = "a0c9c13e118f"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.add_column("node", sa.Column("is_mqtt_gateway", sa.Boolean(), nullable=True))
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_column("node", "is_mqtt_gateway")
|
||||
@@ -1,35 +0,0 @@
|
||||
"""Add first_seen_us and last_seen_us to node table
|
||||
|
||||
Revision ID: 2b5a61bb2b75
|
||||
Revises: ac311b3782a1
|
||||
Create Date: 2025-11-05 15:19:13.446724
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '2b5a61bb2b75'
|
||||
down_revision: str | None = 'ac311b3782a1'
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# Add microsecond epoch timestamp columns for first and last seen times
|
||||
op.add_column('node', sa.Column('first_seen_us', sa.BigInteger(), nullable=True))
|
||||
op.add_column('node', sa.Column('last_seen_us', sa.BigInteger(), nullable=True))
|
||||
op.create_index('idx_node_first_seen_us', 'node', ['first_seen_us'], unique=False)
|
||||
op.create_index('idx_node_last_seen_us', 'node', ['last_seen_us'], unique=False)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# Remove the microsecond epoch timestamp columns and their indexes
|
||||
op.drop_index('idx_node_last_seen_us', table_name='node')
|
||||
op.drop_index('idx_node_first_seen_us', table_name='node')
|
||||
op.drop_column('node', 'last_seen_us')
|
||||
op.drop_column('node', 'first_seen_us')
|
||||
@@ -1,35 +0,0 @@
|
||||
"""Add daily_snapshot table
|
||||
|
||||
Revision ID: 4f1d2a9c8b71
|
||||
Revises: 23dad03d2e42
|
||||
Create Date: 2026-03-05 00:00:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "4f1d2a9c8b71"
|
||||
down_revision: str | None = "23dad03d2e42"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.create_table(
|
||||
"daily_snapshot",
|
||||
sa.Column("snapshot_date", sa.Date(), nullable=False),
|
||||
sa.Column("node_count", sa.BigInteger(), nullable=False),
|
||||
sa.Column("packet_count", sa.BigInteger(), nullable=False),
|
||||
sa.Column("gateway_count", sa.BigInteger(), nullable=False),
|
||||
sa.Column("captured_at_us", sa.BigInteger(), nullable=False),
|
||||
sa.PrimaryKeyConstraint("snapshot_date"),
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table("daily_snapshot")
|
||||
@@ -1,65 +0,0 @@
|
||||
"""Drop import_time columns.
|
||||
|
||||
Revision ID: 9f3b1a8d2c4f
|
||||
Revises: 2b5a61bb2b75
|
||||
Create Date: 2026-01-09 09:55:00.000000
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "9f3b1a8d2c4f"
|
||||
down_revision: str | None = "2b5a61bb2b75"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
inspector = sa.inspect(conn)
|
||||
|
||||
packet_indexes = {idx["name"] for idx in inspector.get_indexes("packet")}
|
||||
packet_columns = {col["name"] for col in inspector.get_columns("packet")}
|
||||
|
||||
with op.batch_alter_table("packet", schema=None) as batch_op:
|
||||
if "idx_packet_import_time" in packet_indexes:
|
||||
batch_op.drop_index("idx_packet_import_time")
|
||||
if "idx_packet_from_node_time" in packet_indexes:
|
||||
batch_op.drop_index("idx_packet_from_node_time")
|
||||
if "import_time" in packet_columns:
|
||||
batch_op.drop_column("import_time")
|
||||
|
||||
packet_seen_columns = {col["name"] for col in inspector.get_columns("packet_seen")}
|
||||
with op.batch_alter_table("packet_seen", schema=None) as batch_op:
|
||||
if "import_time" in packet_seen_columns:
|
||||
batch_op.drop_column("import_time")
|
||||
|
||||
traceroute_indexes = {idx["name"] for idx in inspector.get_indexes("traceroute")}
|
||||
traceroute_columns = {col["name"] for col in inspector.get_columns("traceroute")}
|
||||
with op.batch_alter_table("traceroute", schema=None) as batch_op:
|
||||
if "idx_traceroute_import_time" in traceroute_indexes:
|
||||
batch_op.drop_index("idx_traceroute_import_time")
|
||||
if "import_time" in traceroute_columns:
|
||||
batch_op.drop_column("import_time")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
with op.batch_alter_table("traceroute", schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
|
||||
batch_op.create_index("idx_traceroute_import_time", ["import_time"], unique=False)
|
||||
|
||||
with op.batch_alter_table("packet_seen", schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
|
||||
|
||||
with op.batch_alter_table("packet", schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column("import_time", sa.DateTime(), nullable=True))
|
||||
batch_op.create_index("idx_packet_import_time", [sa.text("import_time DESC")], unique=False)
|
||||
batch_op.create_index(
|
||||
"idx_packet_from_node_time",
|
||||
["from_node_id", sa.text("import_time DESC")],
|
||||
unique=False,
|
||||
)
|
||||
@@ -1,43 +0,0 @@
|
||||
"""Add node_public_key table
|
||||
|
||||
Revision ID: a0c9c13e118f
|
||||
Revises: d4d7b0c2e1a4
|
||||
Create Date: 2026-02-06 00:00:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "a0c9c13e118f"
|
||||
down_revision: str | None = "d4d7b0c2e1a4"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.create_table(
|
||||
"node_public_key",
|
||||
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
|
||||
sa.Column("node_id", sa.BigInteger(), nullable=False),
|
||||
sa.Column("public_key", sa.String(), nullable=False),
|
||||
sa.Column("first_seen_us", sa.BigInteger(), nullable=True),
|
||||
sa.Column("last_seen_us", sa.BigInteger(), nullable=True),
|
||||
)
|
||||
op.create_index("idx_node_public_key_node_id", "node_public_key", ["node_id"], unique=False)
|
||||
op.create_index(
|
||||
"idx_node_public_key_public_key",
|
||||
"node_public_key",
|
||||
["public_key"],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_index("idx_node_public_key_public_key", table_name="node_public_key")
|
||||
op.drop_index("idx_node_public_key_node_id", table_name="node_public_key")
|
||||
op.drop_table("node_public_key")
|
||||
@@ -1,31 +0,0 @@
|
||||
"""add route_return to traceroute
|
||||
|
||||
Revision ID: ac311b3782a1
|
||||
Revises: 1717fa5c6545
|
||||
Create Date: 2025-11-04 20:28:33.174137
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = 'ac311b3782a1'
|
||||
down_revision: str | None = '1717fa5c6545'
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# Add route_return column to traceroute table
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column('route_return', sa.LargeBinary(), nullable=True))
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# Remove route_return column from traceroute table
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.drop_column('route_return')
|
||||
@@ -1,74 +0,0 @@
|
||||
"""add import_time_us columns
|
||||
|
||||
Revision ID: add_time_us_cols
|
||||
Revises: c88468b7ab0b
|
||||
Create Date: 2025-11-03 14:10:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = 'add_time_us_cols'
|
||||
down_revision: str | None = 'c88468b7ab0b'
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# Check if columns already exist, add them if they don't
|
||||
conn = op.get_bind()
|
||||
inspector = sa.inspect(conn)
|
||||
|
||||
# Add import_time_us to packet table
|
||||
packet_columns = [col['name'] for col in inspector.get_columns('packet')]
|
||||
if 'import_time_us' not in packet_columns:
|
||||
with op.batch_alter_table('packet', schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
|
||||
op.create_index(
|
||||
'idx_packet_import_time_us', 'packet', [sa.text('import_time_us DESC')], unique=False
|
||||
)
|
||||
op.create_index(
|
||||
'idx_packet_from_node_time_us',
|
||||
'packet',
|
||||
['from_node_id', sa.text('import_time_us DESC')],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
# Add import_time_us to packet_seen table
|
||||
packet_seen_columns = [col['name'] for col in inspector.get_columns('packet_seen')]
|
||||
if 'import_time_us' not in packet_seen_columns:
|
||||
with op.batch_alter_table('packet_seen', schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
|
||||
op.create_index(
|
||||
'idx_packet_seen_import_time_us', 'packet_seen', ['import_time_us'], unique=False
|
||||
)
|
||||
|
||||
# Add import_time_us to traceroute table
|
||||
traceroute_columns = [col['name'] for col in inspector.get_columns('traceroute')]
|
||||
if 'import_time_us' not in traceroute_columns:
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column('import_time_us', sa.BigInteger(), nullable=True))
|
||||
op.create_index(
|
||||
'idx_traceroute_import_time_us', 'traceroute', ['import_time_us'], unique=False
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# Drop indexes and columns
|
||||
op.drop_index('idx_traceroute_import_time_us', table_name='traceroute')
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.drop_column('import_time_us')
|
||||
|
||||
op.drop_index('idx_packet_seen_import_time_us', table_name='packet_seen')
|
||||
with op.batch_alter_table('packet_seen', schema=None) as batch_op:
|
||||
batch_op.drop_column('import_time_us')
|
||||
|
||||
op.drop_index('idx_packet_from_node_time_us', table_name='packet')
|
||||
op.drop_index('idx_packet_import_time_us', table_name='packet')
|
||||
with op.batch_alter_table('packet', schema=None) as batch_op:
|
||||
batch_op.drop_column('import_time_us')
|
||||
@@ -1,94 +0,0 @@
|
||||
"""Add last_update_us to node and migrate data.
|
||||
|
||||
Revision ID: b7c3c2e3a1f0
|
||||
Revises: 9f3b1a8d2c4f
|
||||
Create Date: 2026-01-12 10:12:00.000000
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
from datetime import UTC, datetime
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "b7c3c2e3a1f0"
|
||||
down_revision: str | None = "9f3b1a8d2c4f"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def _parse_datetime(value):
|
||||
if value is None:
|
||||
return None
|
||||
if isinstance(value, datetime):
|
||||
dt = value
|
||||
elif isinstance(value, str):
|
||||
text = value.replace("Z", "+00:00")
|
||||
try:
|
||||
dt = datetime.fromisoformat(text)
|
||||
except ValueError:
|
||||
return None
|
||||
else:
|
||||
return None
|
||||
|
||||
if dt.tzinfo is None:
|
||||
return dt.replace(tzinfo=UTC)
|
||||
return dt.astimezone(UTC)
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
op.add_column("node", sa.Column("last_update_us", sa.BigInteger(), nullable=True))
|
||||
op.create_index("idx_node_last_update_us", "node", ["last_update_us"], unique=False)
|
||||
|
||||
node = sa.table(
|
||||
"node",
|
||||
sa.column("id", sa.String()),
|
||||
sa.column("last_update", sa.DateTime()),
|
||||
sa.column("last_update_us", sa.BigInteger()),
|
||||
)
|
||||
|
||||
rows = conn.execute(sa.select(node.c.id, node.c.last_update)).all()
|
||||
for node_id, last_update in rows:
|
||||
dt = _parse_datetime(last_update)
|
||||
if dt is None:
|
||||
continue
|
||||
last_update_us = int(dt.timestamp() * 1_000_000)
|
||||
conn.execute(
|
||||
sa.update(node).where(node.c.id == node_id).values(last_update_us=last_update_us)
|
||||
)
|
||||
|
||||
if conn.dialect.name == "sqlite":
|
||||
with op.batch_alter_table("node", schema=None) as batch_op:
|
||||
batch_op.drop_column("last_update")
|
||||
else:
|
||||
op.drop_column("node", "last_update")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
op.add_column("node", sa.Column("last_update", sa.DateTime(), nullable=True))
|
||||
|
||||
node = sa.table(
|
||||
"node",
|
||||
sa.column("id", sa.String()),
|
||||
sa.column("last_update", sa.DateTime()),
|
||||
sa.column("last_update_us", sa.BigInteger()),
|
||||
)
|
||||
|
||||
rows = conn.execute(sa.select(node.c.id, node.c.last_update_us)).all()
|
||||
for node_id, last_update_us in rows:
|
||||
if last_update_us is None:
|
||||
continue
|
||||
dt = datetime.fromtimestamp(last_update_us / 1_000_000, tz=UTC).replace(tzinfo=None)
|
||||
conn.execute(sa.update(node).where(node.c.id == node_id).values(last_update=dt))
|
||||
|
||||
if conn.dialect.name == "sqlite":
|
||||
with op.batch_alter_table("node", schema=None) as batch_op:
|
||||
batch_op.drop_index("idx_node_last_update_us")
|
||||
batch_op.drop_column("last_update_us")
|
||||
else:
|
||||
op.drop_index("idx_node_last_update_us", table_name="node")
|
||||
op.drop_column("node", "last_update_us")
|
||||
@@ -1,22 +0,0 @@
|
||||
"""Compatibility placeholder for removed revision c6b1d8f2a9e3.
|
||||
|
||||
Revision ID: c6b1d8f2a9e3
|
||||
Revises: 4f1d2a9c8b71
|
||||
Create Date: 2026-03-05 00:00:00.000000
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "c6b1d8f2a9e3"
|
||||
down_revision: str | None = "4f1d2a9c8b71"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
pass
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
pass
|
||||
@@ -1,160 +0,0 @@
|
||||
"""Initial migration
|
||||
|
||||
Revision ID: c88468b7ab0b
|
||||
Revises:
|
||||
Create Date: 2025-10-26 20:56:50.285200
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = 'c88468b7ab0b'
|
||||
down_revision: str | None = None
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
# Get connection and inspector to check what exists
|
||||
conn = op.get_bind()
|
||||
inspector = sa.inspect(conn)
|
||||
existing_tables = inspector.get_table_names()
|
||||
|
||||
# Create node table if it doesn't exist
|
||||
if 'node' not in existing_tables:
|
||||
op.create_table(
|
||||
'node',
|
||||
sa.Column('id', sa.String(), nullable=False),
|
||||
sa.Column('node_id', sa.BigInteger(), nullable=True),
|
||||
sa.Column('long_name', sa.String(), nullable=True),
|
||||
sa.Column('short_name', sa.String(), nullable=True),
|
||||
sa.Column('hw_model', sa.String(), nullable=True),
|
||||
sa.Column('firmware', sa.String(), nullable=True),
|
||||
sa.Column('role', sa.String(), nullable=True),
|
||||
sa.Column('last_lat', sa.BigInteger(), nullable=True),
|
||||
sa.Column('last_long', sa.BigInteger(), nullable=True),
|
||||
sa.Column('channel', sa.String(), nullable=True),
|
||||
sa.Column('last_update', sa.DateTime(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.UniqueConstraint('node_id'),
|
||||
)
|
||||
op.create_index('idx_node_node_id', 'node', ['node_id'], unique=False)
|
||||
|
||||
# Create packet table if it doesn't exist
|
||||
if 'packet' not in existing_tables:
|
||||
op.create_table(
|
||||
'packet',
|
||||
sa.Column('id', sa.BigInteger(), nullable=False),
|
||||
sa.Column('portnum', sa.Integer(), nullable=True),
|
||||
sa.Column('from_node_id', sa.BigInteger(), nullable=True),
|
||||
sa.Column('to_node_id', sa.BigInteger(), nullable=True),
|
||||
sa.Column('payload', sa.LargeBinary(), nullable=True),
|
||||
sa.Column('import_time', sa.DateTime(), nullable=True),
|
||||
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
|
||||
sa.Column('channel', sa.String(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
)
|
||||
op.create_index('idx_packet_from_node_id', 'packet', ['from_node_id'], unique=False)
|
||||
op.create_index('idx_packet_to_node_id', 'packet', ['to_node_id'], unique=False)
|
||||
op.create_index(
|
||||
'idx_packet_import_time', 'packet', [sa.text('import_time DESC')], unique=False
|
||||
)
|
||||
op.create_index(
|
||||
'idx_packet_import_time_us', 'packet', [sa.text('import_time_us DESC')], unique=False
|
||||
)
|
||||
op.create_index(
|
||||
'idx_packet_from_node_time',
|
||||
'packet',
|
||||
['from_node_id', sa.text('import_time DESC')],
|
||||
unique=False,
|
||||
)
|
||||
op.create_index(
|
||||
'idx_packet_from_node_time_us',
|
||||
'packet',
|
||||
['from_node_id', sa.text('import_time_us DESC')],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
# Create packet_seen table if it doesn't exist
|
||||
if 'packet_seen' not in existing_tables:
|
||||
op.create_table(
|
||||
'packet_seen',
|
||||
sa.Column('packet_id', sa.BigInteger(), nullable=False),
|
||||
sa.Column('node_id', sa.BigInteger(), nullable=False),
|
||||
sa.Column('rx_time', sa.BigInteger(), nullable=False),
|
||||
sa.Column('hop_limit', sa.Integer(), nullable=True),
|
||||
sa.Column('hop_start', sa.Integer(), nullable=True),
|
||||
sa.Column('channel', sa.String(), nullable=True),
|
||||
sa.Column('rx_snr', sa.Float(), nullable=True),
|
||||
sa.Column('rx_rssi', sa.Integer(), nullable=True),
|
||||
sa.Column('topic', sa.String(), nullable=True),
|
||||
sa.Column('import_time', sa.DateTime(), nullable=True),
|
||||
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
|
||||
sa.ForeignKeyConstraint(
|
||||
['packet_id'],
|
||||
['packet.id'],
|
||||
),
|
||||
sa.PrimaryKeyConstraint('packet_id', 'node_id', 'rx_time'),
|
||||
)
|
||||
op.create_index('idx_packet_seen_node_id', 'packet_seen', ['node_id'], unique=False)
|
||||
op.create_index('idx_packet_seen_packet_id', 'packet_seen', ['packet_id'], unique=False)
|
||||
op.create_index(
|
||||
'idx_packet_seen_import_time_us', 'packet_seen', ['import_time_us'], unique=False
|
||||
)
|
||||
|
||||
# Create traceroute table if it doesn't exist
|
||||
if 'traceroute' not in existing_tables:
|
||||
op.create_table(
|
||||
'traceroute',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('packet_id', sa.BigInteger(), nullable=True),
|
||||
sa.Column('gateway_node_id', sa.BigInteger(), nullable=True),
|
||||
sa.Column('done', sa.Boolean(), nullable=True),
|
||||
sa.Column('route', sa.LargeBinary(), nullable=True),
|
||||
sa.Column('import_time', sa.DateTime(), nullable=True),
|
||||
sa.Column('import_time_us', sa.BigInteger(), nullable=True),
|
||||
sa.ForeignKeyConstraint(
|
||||
['packet_id'],
|
||||
['packet.id'],
|
||||
),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
)
|
||||
op.create_index('idx_traceroute_import_time', 'traceroute', ['import_time'], unique=False)
|
||||
op.create_index(
|
||||
'idx_traceroute_import_time_us', 'traceroute', ['import_time_us'], unique=False
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
# Drop traceroute table and indexes
|
||||
op.drop_index('idx_traceroute_import_time_us', table_name='traceroute')
|
||||
op.drop_index('idx_traceroute_import_time', table_name='traceroute')
|
||||
op.drop_table('traceroute')
|
||||
|
||||
# Drop packet_seen table and indexes
|
||||
op.drop_index('idx_packet_seen_import_time_us', table_name='packet_seen')
|
||||
op.drop_index('idx_packet_seen_packet_id', table_name='packet_seen')
|
||||
op.drop_index('idx_packet_seen_node_id', table_name='packet_seen')
|
||||
op.drop_table('packet_seen')
|
||||
|
||||
# Drop packet table and indexes
|
||||
op.drop_index('idx_packet_from_node_time_us', table_name='packet')
|
||||
op.drop_index('idx_packet_from_node_time', table_name='packet')
|
||||
op.drop_index('idx_packet_import_time_us', table_name='packet')
|
||||
op.drop_index('idx_packet_import_time', table_name='packet')
|
||||
op.drop_index('idx_packet_to_node_id', table_name='packet')
|
||||
op.drop_index('idx_packet_from_node_id', table_name='packet')
|
||||
op.drop_table('packet')
|
||||
|
||||
# Drop node table and indexes
|
||||
op.drop_index('idx_node_node_id', table_name='node')
|
||||
op.drop_table('node')
|
||||
# ### end Alembic commands ###
|
||||
@@ -1,34 +0,0 @@
|
||||
"""Drop last_update_us from node.
|
||||
|
||||
Revision ID: d4d7b0c2e1a4
|
||||
Revises: b7c3c2e3a1f0
|
||||
Create Date: 2026-01-12 10:20:00.000000
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "d4d7b0c2e1a4"
|
||||
down_revision: str | None = "b7c3c2e3a1f0"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
if conn.dialect.name == "sqlite":
|
||||
with op.batch_alter_table("node", schema=None) as batch_op:
|
||||
batch_op.drop_index("idx_node_last_update_us")
|
||||
batch_op.drop_column("last_update_us")
|
||||
else:
|
||||
op.drop_index("idx_node_last_update_us", table_name="node")
|
||||
op.drop_column("node", "last_update_us")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.add_column("node", sa.Column("last_update_us", sa.BigInteger(), nullable=True))
|
||||
op.create_index("idx_node_last_update_us", "node", ["last_update_us"], unique=False)
|
||||
@@ -1,43 +0,0 @@
|
||||
"""Drop node_public_key table
|
||||
|
||||
Revision ID: e8f2c4b6d9a1
|
||||
Revises: c6b1d8f2a9e3
|
||||
Create Date: 2026-05-25 00:00:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "e8f2c4b6d9a1"
|
||||
down_revision: str | None = "c6b1d8f2a9e3"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.drop_index("idx_node_public_key_public_key", table_name="node_public_key")
|
||||
op.drop_index("idx_node_public_key_node_id", table_name="node_public_key")
|
||||
op.drop_table("node_public_key")
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.create_table(
|
||||
"node_public_key",
|
||||
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
|
||||
sa.Column("node_id", sa.BigInteger(), nullable=False),
|
||||
sa.Column("public_key", sa.String(), nullable=False),
|
||||
sa.Column("first_seen_us", sa.BigInteger(), nullable=True),
|
||||
sa.Column("last_seen_us", sa.BigInteger(), nullable=True),
|
||||
)
|
||||
op.create_index("idx_node_public_key_node_id", "node_public_key", ["node_id"], unique=False)
|
||||
op.create_index(
|
||||
"idx_node_public_key_public_key",
|
||||
"node_public_key",
|
||||
["public_key"],
|
||||
unique=False,
|
||||
)
|
||||
@@ -1,57 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# build-container.sh
|
||||
#
|
||||
# Script to build MeshView container images
|
||||
|
||||
set -e
|
||||
|
||||
# Default values
|
||||
IMAGE_NAME="meshview"
|
||||
TAG="latest"
|
||||
CONTAINERFILE="Containerfile"
|
||||
|
||||
# Parse arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--tag|-t)
|
||||
TAG="$2"
|
||||
shift 2
|
||||
;;
|
||||
--name|-n)
|
||||
IMAGE_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
--file|-f)
|
||||
CONTAINERFILE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--help|-h)
|
||||
echo "Usage: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -t, --tag TAG Tag for the image (default: latest)"
|
||||
echo " -n, --name NAME Image name (default: meshview)"
|
||||
echo " -f, --file FILE Containerfile path (default: Containerfile)"
|
||||
echo " -h, --help Show this help"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
echo "Use --help for usage information"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo "Building MeshView container image..."
|
||||
echo " Image: ${IMAGE_NAME}:${TAG}"
|
||||
echo " Containerfile: ${CONTAINERFILE}"
|
||||
echo ""
|
||||
|
||||
# Build the container
|
||||
docker build -f "${CONTAINERFILE}" -t "${IMAGE_NAME}:${TAG}" .
|
||||
|
||||
echo ""
|
||||
echo "Build complete!"
|
||||
echo "Run with: docker run --rm -p 8081:8081 ${IMAGE_NAME}:${TAG}"
|
||||
@@ -1,90 +0,0 @@
|
||||
# -------------------------
|
||||
# Server Configuration
|
||||
# -------------------------
|
||||
[server]
|
||||
# The address to bind the server to. Use * to listen on all interfaces.
|
||||
bind = 0.0.0.0
|
||||
|
||||
# Port to run the web server on.
|
||||
port = 8081
|
||||
|
||||
# Path to TLS certificate (leave blank to disable HTTPS).
|
||||
tls_cert =
|
||||
|
||||
# Path for the ACME challenge if using Let's Encrypt.
|
||||
acme_challenge =
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Site Appearance & Behavior
|
||||
# -------------------------
|
||||
[site]
|
||||
domain =
|
||||
language = en
|
||||
title = Bay Area Mesh
|
||||
message = Real time data from around the bay area and beyond.
|
||||
starting = /chat
|
||||
|
||||
nodes = True
|
||||
conversations = True
|
||||
everything = True
|
||||
graphs = True
|
||||
stats = True
|
||||
net = True
|
||||
map = True
|
||||
top = True
|
||||
|
||||
map_top_left_lat = 39
|
||||
map_top_left_lon = -123
|
||||
map_bottom_right_lat = 36
|
||||
map_bottom_right_lon = -121
|
||||
|
||||
map_interval = 3
|
||||
firehose_interal = 3
|
||||
|
||||
weekly_net_message = Weekly Mesh check-in. We will keep it open on every Wednesday from 5:00pm for checkins. The message format should be (LONG NAME) - (CITY YOU ARE IN) #BayMeshNet.
|
||||
net_tag = #BayMeshNet
|
||||
|
||||
|
||||
# -------------------------
|
||||
# MQTT Broker Configuration
|
||||
# -------------------------
|
||||
[mqtt]
|
||||
server = mqtt.meshtastic.org
|
||||
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
|
||||
port = 1883
|
||||
username = meshdev
|
||||
password = large4cats
|
||||
skip_node_ids =
|
||||
secondary_keys =
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Database Configuration
|
||||
# -------------------------
|
||||
[database]
|
||||
connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Database Cleanup Configuration
|
||||
# -------------------------
|
||||
[cleanup]
|
||||
enabled = False
|
||||
days_to_keep = 14
|
||||
hour = 2
|
||||
minute = 00
|
||||
vacuum = False
|
||||
|
||||
backup_enabled = False
|
||||
backup_dir = ./backups
|
||||
backup_hour = 2
|
||||
backup_minute = 00
|
||||
|
||||
|
||||
# -------------------------
|
||||
# Logging Configuration
|
||||
# -------------------------
|
||||
[logging]
|
||||
access_log = False
|
||||
db_cleanup_logfile = /var/log/meshview/dbcleanup.log
|
||||
@@ -1,37 +0,0 @@
|
||||
diff --git a/sample.config.ini b/sample.config.ini
|
||||
index 0e64980..494685c 100644
|
||||
--- a/sample.config.ini
|
||||
+++ b/sample.config.ini
|
||||
@@ -3,7 +3,7 @@
|
||||
# -------------------------
|
||||
[server]
|
||||
# The address to bind the server to. Use * to listen on all interfaces.
|
||||
-bind = *
|
||||
+bind = 0.0.0.0
|
||||
|
||||
# Port to run the web server on.
|
||||
port = 8081
|
||||
@@ -64,7 +64,7 @@ net_tag = #BayMeshNet
|
||||
# -------------------------
|
||||
[mqtt]
|
||||
# MQTT server hostname or IP.
|
||||
-server = mqtt.bayme.sh
|
||||
+server = mqtt.meshtastic.org
|
||||
|
||||
# Topics to subscribe to (as JSON-like list, but still a string).
|
||||
topics = ["msh/US/bayarea/#", "msh/US/CA/mrymesh/#", "msh/US/CA/sacvalley"]
|
||||
@@ -82,7 +82,7 @@ password = large4cats
|
||||
# -------------------------
|
||||
[database]
|
||||
# SQLAlchemy connection string. This one uses SQLite with asyncio support.
|
||||
-connection_string = sqlite+aiosqlite:///packets.db
|
||||
+connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
|
||||
|
||||
|
||||
# -------------------------
|
||||
@@ -110,4 +110,4 @@ vacuum = False
|
||||
# Set to True to enable, False to disable (default: False)
|
||||
access_log = False
|
||||
# Database cleanup logfile
|
||||
-db_cleanup_logfile = dbcleanup.log
|
||||
+db_cleanup_logfile = /var/log/meshview/dbcleanup.log
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to create a blank migration for manual editing.
|
||||
|
||||
Usage:
|
||||
./env/bin/python create_example_migration.py
|
||||
|
||||
This creates an empty migration file that you can manually edit to add
|
||||
custom migration logic (data migrations, complex schema changes, etc.)
|
||||
|
||||
Unlike create_migration.py which auto-generates from model changes,
|
||||
this creates a blank template for you to fill in.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Add current directory to path
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from alembic.config import Config
|
||||
|
||||
from alembic import command
|
||||
|
||||
# Create Alembic config
|
||||
alembic_cfg = Config("alembic.ini")
|
||||
|
||||
# Set database URL from meshview config
|
||||
try:
|
||||
from meshview.config import CONFIG
|
||||
|
||||
database_url = CONFIG["database"]["connection_string"]
|
||||
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
|
||||
print(f"Using database URL from config: {database_url}")
|
||||
except Exception as e:
|
||||
print(f"Warning: Could not load meshview config: {e}")
|
||||
print("Using default database URL")
|
||||
alembic_cfg.set_main_option("sqlalchemy.url", "sqlite+aiosqlite:///packets.db")
|
||||
|
||||
# Generate blank migration
|
||||
try:
|
||||
print("Creating blank migration for manual editing...")
|
||||
command.revision(alembic_cfg, autogenerate=False, message="Manual migration")
|
||||
print("✓ Successfully created blank migration!")
|
||||
print("\nNow edit the generated file in alembic/versions/")
|
||||
print("Add your custom upgrade() and downgrade() logic")
|
||||
except Exception as e:
|
||||
print(f"✗ Error creating migration: {e}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Helper script to create Alembic migrations from SQLAlchemy model changes.
|
||||
|
||||
Usage:
|
||||
./env/bin/python create_migration.py
|
||||
|
||||
This will:
|
||||
1. Load your current models from meshview/models.py
|
||||
2. Compare them to the current database schema
|
||||
3. Auto-generate a migration with the detected changes
|
||||
4. Save the migration to alembic/versions/
|
||||
|
||||
After running this, review the generated migration file before committing!
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Add current directory to path
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from alembic.config import Config
|
||||
|
||||
from alembic import command
|
||||
|
||||
# Create Alembic config
|
||||
alembic_cfg = Config("alembic.ini")
|
||||
|
||||
# Set database URL from meshview config
|
||||
try:
|
||||
from meshview.config import CONFIG
|
||||
|
||||
database_url = CONFIG["database"]["connection_string"]
|
||||
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
|
||||
print(f"Using database URL from config: {database_url}")
|
||||
except Exception as e:
|
||||
print(f"Warning: Could not load meshview config: {e}")
|
||||
print("Using default database URL")
|
||||
alembic_cfg.set_main_option("sqlalchemy.url", "sqlite+aiosqlite:///packets.db")
|
||||
|
||||
# Generate migration
|
||||
try:
|
||||
print("\nComparing models to current database schema...")
|
||||
print("Generating migration...\n")
|
||||
command.revision(alembic_cfg, autogenerate=True, message="Auto-generated migration")
|
||||
print("\n✓ Successfully created migration!")
|
||||
print("\nNext steps:")
|
||||
print("1. Review the generated file in alembic/versions/")
|
||||
print("2. Edit the migration message/logic if needed")
|
||||
print("3. Test the migration: ./env/bin/alembic upgrade head")
|
||||
print("4. Commit the migration file to version control")
|
||||
except Exception as e:
|
||||
print(f"\n✗ Error creating migration: {e}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
@@ -1,361 +0,0 @@
|
||||
# Alembic Database Migration Setup
|
||||
|
||||
This document describes the automatic database migration system implemented for MeshView using Alembic.
|
||||
|
||||
## Overview
|
||||
|
||||
The system provides automatic database schema migrations with coordination between the writer app (startdb.py) and reader app (web.py):
|
||||
|
||||
- **Writer App**: Automatically runs pending migrations on startup
|
||||
- **Reader App**: Waits for migrations to complete before starting
|
||||
|
||||
## Architecture
|
||||
|
||||
### Key Components
|
||||
|
||||
1. **`meshview/migrations.py`** - Migration management utilities
|
||||
- `run_migrations()` - Runs pending migrations (writer app)
|
||||
- `wait_for_migrations()` - Waits for schema to be current (reader app)
|
||||
- `is_database_up_to_date()` - Checks schema version
|
||||
- Migration status tracking table
|
||||
|
||||
2. **`alembic/`** - Alembic migration directory
|
||||
- `env.py` - Configured for async SQLAlchemy support
|
||||
- `versions/` - Migration scripts directory
|
||||
- `alembic.ini` - Alembic configuration
|
||||
|
||||
3. **Modified Apps**:
|
||||
- `startdb.py` - Writer app that runs migrations before MQTT ingestion
|
||||
- `meshview/web.py` - Reader app that waits for schema updates
|
||||
|
||||
## How It Works - Automatic In-Place Updates
|
||||
|
||||
### ✨ Fully Automatic Operation
|
||||
|
||||
**No manual migration commands needed!** The database schema updates automatically when you:
|
||||
1. Deploy new code with migration files
|
||||
2. Restart the applications
|
||||
|
||||
### Writer App (startdb.py) Startup Sequence
|
||||
|
||||
1. Initialize database connection
|
||||
2. Create migration status tracking table
|
||||
3. Set "migration in progress" flag
|
||||
4. **🔄 Automatically run any pending Alembic migrations** (synchronously)
|
||||
- Detects current schema version
|
||||
- Compares to latest available migration
|
||||
- Runs all pending migrations in sequence
|
||||
- Updates database schema in place
|
||||
5. Clear "migration in progress" flag
|
||||
6. Start MQTT ingestion and other tasks
|
||||
|
||||
### Reader App (web.py) Startup Sequence
|
||||
|
||||
1. Initialize database connection
|
||||
2. **Check database schema version**
|
||||
3. If not up to date:
|
||||
- Wait up to 60 seconds (30 retries × 2 seconds)
|
||||
- Check every 2 seconds for schema updates
|
||||
- Automatically proceeds once writer completes migrations
|
||||
4. Once schema is current, start web server
|
||||
|
||||
### 🎯 Key Point: Zero Manual Steps
|
||||
|
||||
When you deploy new code with migrations:
|
||||
```bash
|
||||
# Just start the apps - migrations happen automatically!
|
||||
./env/bin/python startdb.py # Migrations run here automatically
|
||||
./env/bin/python main.py # Waits for migrations, then starts
|
||||
```
|
||||
|
||||
**The database updates itself!** No need to run `alembic upgrade` manually.
|
||||
|
||||
### Coordination
|
||||
|
||||
The apps coordinate using:
|
||||
- **Alembic version table** (`alembic_version`) - Tracks current schema version
|
||||
- **Migration status table** (`migration_status`) - Optional flag for "in progress" state
|
||||
|
||||
## Creating New Migrations
|
||||
|
||||
### Using the helper script:
|
||||
|
||||
```bash
|
||||
./env/bin/python create_migration.py
|
||||
```
|
||||
|
||||
### Manual creation:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic revision --autogenerate -m "Description of changes"
|
||||
```
|
||||
|
||||
This will:
|
||||
1. Compare current database schema with SQLAlchemy models
|
||||
2. Generate a migration script in `alembic/versions/`
|
||||
3. Automatically detect most schema changes
|
||||
|
||||
### Manual migration (advanced):
|
||||
|
||||
```bash
|
||||
./env/bin/alembic revision -m "Manual migration"
|
||||
```
|
||||
|
||||
Then edit the generated file to add custom migration logic.
|
||||
|
||||
## Running Migrations
|
||||
|
||||
### Automatic (Recommended)
|
||||
|
||||
Migrations run automatically when the writer app starts:
|
||||
|
||||
```bash
|
||||
./env/bin/python startdb.py
|
||||
```
|
||||
|
||||
### Manual
|
||||
|
||||
To run migrations manually:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic upgrade head
|
||||
```
|
||||
|
||||
To downgrade:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic downgrade -1 # Go back one version
|
||||
./env/bin/alembic downgrade base # Go back to beginning
|
||||
```
|
||||
|
||||
## Checking Migration Status
|
||||
|
||||
Check current database version:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic current
|
||||
```
|
||||
|
||||
View migration history:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic history
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **Zero Manual Intervention**: Migrations run automatically on startup
|
||||
2. **Safe Coordination**: Reader won't connect to incompatible schema
|
||||
3. **Version Control**: All schema changes tracked in git
|
||||
4. **Rollback Capability**: Can downgrade if needed
|
||||
5. **Auto-generation**: Most migrations created automatically from model changes
|
||||
|
||||
## Migration Workflow
|
||||
|
||||
### Development Process
|
||||
|
||||
1. **Modify SQLAlchemy models** in `meshview/models.py`
|
||||
2. **Create migration**:
|
||||
```bash
|
||||
./env/bin/python create_migration.py
|
||||
```
|
||||
3. **Review generated migration** in `alembic/versions/`
|
||||
4. **Test migration**:
|
||||
- Stop all apps
|
||||
- Start writer app (migrations run automatically)
|
||||
- Start reader app (waits for schema to be current)
|
||||
5. **Commit migration** to version control
|
||||
|
||||
### Production Deployment
|
||||
|
||||
1. **Deploy new code** with migration scripts
|
||||
2. **Start writer app** - Migrations run automatically
|
||||
3. **Start reader app** - Waits for migrations, then starts
|
||||
4. **Monitor logs** for migration success
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Migration fails
|
||||
|
||||
Check logs in writer app for error details. To manually fix:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic current # Check current version
|
||||
./env/bin/alembic history # View available versions
|
||||
./env/bin/alembic upgrade head # Try manual upgrade
|
||||
```
|
||||
|
||||
### Reader app won't start (timeout)
|
||||
|
||||
Check if writer app is running and has completed migrations:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic current
|
||||
```
|
||||
|
||||
### Reset to clean state
|
||||
|
||||
⚠️ **Warning: This will lose all data**
|
||||
|
||||
```bash
|
||||
rm packets.db # Or your database file
|
||||
./env/bin/alembic upgrade head # Create fresh schema
|
||||
```
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
meshview/
|
||||
├── alembic.ini # Alembic configuration
|
||||
├── alembic/
|
||||
│ ├── env.py # Async-enabled migration runner
|
||||
│ ├── script.py.mako # Migration template
|
||||
│ └── versions/ # Migration scripts
|
||||
│ └── c88468b7ab0b_initial_migration.py
|
||||
├── meshview/
|
||||
│ ├── models.py # SQLAlchemy models (source of truth)
|
||||
│ ├── migrations.py # Migration utilities
|
||||
│ ├── mqtt_database.py # Writer database connection
|
||||
│ └── database.py # Reader database connection
|
||||
├── startdb.py # Writer app (runs migrations)
|
||||
├── main.py # Entry point for reader app
|
||||
└── create_migration.py # Helper script for creating migrations
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Database URL is read from `config.ini`:
|
||||
|
||||
```ini
|
||||
[database]
|
||||
connection_string = sqlite+aiosqlite:///packets.db
|
||||
```
|
||||
|
||||
Alembic automatically uses this configuration through `meshview/migrations.py`.
|
||||
|
||||
## Important Notes
|
||||
|
||||
1. **Always test migrations** in development before deploying to production
|
||||
2. **Backup database** before running migrations in production
|
||||
3. **Check for data loss** - Some migrations may require data migration logic
|
||||
4. **Coordinate deployments** - Start writer before readers in multi-instance setups
|
||||
5. **Monitor logs** during first startup after deployment
|
||||
|
||||
## Example Migrations
|
||||
|
||||
### Example 1: Generated Initial Migration
|
||||
|
||||
Here's what an auto-generated migration looks like (from comparing models to database):
|
||||
|
||||
```python
|
||||
"""Initial migration
|
||||
|
||||
Revision ID: c88468b7ab0b
|
||||
Revises:
|
||||
Create Date: 2025-01-26 20:56:50.123456
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
# revision identifiers
|
||||
revision = 'c88468b7ab0b'
|
||||
down_revision = None
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
def upgrade() -> None:
|
||||
# Upgrade operations
|
||||
op.create_table('node',
|
||||
sa.Column('id', sa.String(), nullable=False),
|
||||
sa.Column('node_id', sa.BigInteger(), nullable=True),
|
||||
# ... more columns
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
|
||||
def downgrade() -> None:
|
||||
# Downgrade operations
|
||||
op.drop_table('node')
|
||||
```
|
||||
|
||||
### Example 2: Manual Migration Adding a New Table
|
||||
|
||||
We've included an example migration (`1717fa5c6545_add_example_table.py`) that demonstrates how to manually create a new table:
|
||||
|
||||
```python
|
||||
"""Add example table
|
||||
|
||||
Revision ID: 1717fa5c6545
|
||||
Revises: c88468b7ab0b
|
||||
Create Date: 2025-10-26 20:59:04.347066
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Create example table with sample columns."""
|
||||
op.create_table(
|
||||
'example',
|
||||
sa.Column('id', sa.Integer(), nullable=False, primary_key=True, autoincrement=True),
|
||||
sa.Column('name', sa.String(length=100), nullable=False),
|
||||
sa.Column('description', sa.Text(), nullable=True),
|
||||
sa.Column('value', sa.Float(), nullable=True),
|
||||
sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'),
|
||||
sa.Column('created_at', sa.DateTime(), nullable=False,
|
||||
server_default=sa.text('CURRENT_TIMESTAMP')),
|
||||
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
||||
sa.PrimaryKeyConstraint('id')
|
||||
)
|
||||
|
||||
# Create an index on the name column for faster lookups
|
||||
op.create_index('idx_example_name', 'example', ['name'])
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Remove example table."""
|
||||
op.drop_index('idx_example_name', table_name='example')
|
||||
op.drop_table('example')
|
||||
```
|
||||
|
||||
**Key features demonstrated:**
|
||||
- Various column types (Integer, String, Text, Float, Boolean, DateTime)
|
||||
- Primary key with autoincrement
|
||||
- Nullable and non-nullable columns
|
||||
- Server defaults (for timestamps and booleans)
|
||||
- Creating indexes
|
||||
- Proper downgrade that reverses all changes
|
||||
|
||||
**To test this migration:**
|
||||
|
||||
```bash
|
||||
# Apply the migration
|
||||
./env/bin/alembic upgrade head
|
||||
|
||||
# Check it was applied
|
||||
./env/bin/alembic current
|
||||
|
||||
# Verify table was created
|
||||
sqlite3 packetsPL.db "SELECT sql FROM sqlite_master WHERE type='table' AND name='example';"
|
||||
|
||||
# Roll back the migration
|
||||
./env/bin/alembic downgrade -1
|
||||
|
||||
# Verify table was removed
|
||||
sqlite3 packetsPL.db "SELECT name FROM sqlite_master WHERE type='table' AND name='example';"
|
||||
```
|
||||
|
||||
**To remove this example migration** (after testing):
|
||||
|
||||
```bash
|
||||
# First make sure you're not on this revision
|
||||
./env/bin/alembic downgrade c88468b7ab0b
|
||||
|
||||
# Then delete the migration file
|
||||
rm alembic/versions/1717fa5c6545_add_example_table.py
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
- [Alembic Documentation](https://alembic.sqlalchemy.org/)
|
||||
- [SQLAlchemy Documentation](https://docs.sqlalchemy.org/)
|
||||
- [Async SQLAlchemy](https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html)
|
||||
@@ -1,435 +0,0 @@
|
||||
# API Documentation
|
||||
|
||||
Base URL: `http(s)://<host>`
|
||||
|
||||
All endpoints return JSON. Timestamps are either ISO 8601 strings or `*_us` values in
|
||||
microseconds since epoch.
|
||||
|
||||
## 1. Nodes API
|
||||
|
||||
### GET `/api/nodes`
|
||||
Returns a list of nodes, with optional filtering.
|
||||
|
||||
Query Parameters
|
||||
- `node_id` (optional, int): Exact node ID.
|
||||
- `role` (optional, string): Node role.
|
||||
- `channel` (optional, string): Channel name.
|
||||
- `hw_model` (optional, string): Hardware model.
|
||||
- `days_active` (optional, int): Nodes seen within the last N days.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"nodes": [
|
||||
{
|
||||
"id": 42,
|
||||
"node_id": 1234,
|
||||
"long_name": "Alice",
|
||||
"short_name": "A",
|
||||
"hw_model": "T-Beam",
|
||||
"firmware": "1.2.3",
|
||||
"role": "client",
|
||||
"last_lat": 377749000,
|
||||
"last_long": -1224194000,
|
||||
"channel": "main",
|
||||
"last_seen_us": 1736370123456789
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Packets API
|
||||
|
||||
### GET `/api/packets`
|
||||
Returns packets with optional filters.
|
||||
|
||||
Query Parameters
|
||||
- `packet_id` (optional, int): Return exactly one packet (overrides other filters).
|
||||
- `limit` (optional, int): Max packets to return, clamped 1-1000. Default: `50`.
|
||||
- `since` (optional, int): Only packets imported after this microsecond timestamp.
|
||||
- `portnum` (optional, int): Filter by port number.
|
||||
- `contains` (optional, string): Payload substring filter.
|
||||
- `from_node_id` (optional, int): Filter by sender node ID.
|
||||
- `to_node_id` (optional, int): Filter by recipient node ID.
|
||||
- `node_id` (optional, int): Legacy filter matching either from or to node ID.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"packets": [
|
||||
{
|
||||
"id": 123,
|
||||
"import_time_us": 1736370123456789,
|
||||
"channel": "main",
|
||||
"from_node_id": 5678,
|
||||
"to_node_id": 91011,
|
||||
"portnum": 1,
|
||||
"long_name": "Alice",
|
||||
"payload": "Hello, Bob!",
|
||||
"to_long_name": "Bob",
|
||||
"reply_id": 122
|
||||
}
|
||||
],
|
||||
"latest_import_time": 1736370123456789
|
||||
}
|
||||
```
|
||||
|
||||
Notes
|
||||
- For `portnum=1` (text messages), packets are filtered to remove sequence-only payloads.
|
||||
- `latest_import_time` is returned when available for incremental polling (microseconds).
|
||||
|
||||
---
|
||||
|
||||
## 3. Channels API
|
||||
|
||||
### GET `/api/channels`
|
||||
Returns channels seen in a time period.
|
||||
|
||||
Query Parameters
|
||||
- `period_type` (optional, string): `hour` or `day`. Default: `hour`.
|
||||
- `length` (optional, int): Number of periods to look back. Default: `24`.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"channels": ["LongFast", "MediumFast", "ShortFast"]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Stats API
|
||||
|
||||
### GET `/api/stats`
|
||||
Returns packet statistics aggregated by time periods, with optional filtering.
|
||||
|
||||
Query Parameters
|
||||
- `period_type` (optional, string): `hour` or `day`. Default: `hour`.
|
||||
- `length` (optional, int): Number of periods to include. Default: `24`.
|
||||
- `channel` (optional, string): Filter by channel (case-insensitive).
|
||||
- `portnum` (optional, int): Filter by port number.
|
||||
- `to_node` (optional, int): Filter by destination node ID.
|
||||
- `from_node` (optional, int): Filter by source node ID.
|
||||
- `node` (optional, int): If provided, return combined `sent` and `seen` totals for that node.
|
||||
|
||||
Response Example (series)
|
||||
```json
|
||||
{
|
||||
"period_type": "hour",
|
||||
"length": 24,
|
||||
"channel": "LongFast",
|
||||
"portnum": 1,
|
||||
"to_node": 12345678,
|
||||
"from_node": 87654321,
|
||||
"data": [
|
||||
{ "period": "2025-08-08 14:00", "count": 10 },
|
||||
{ "period": "2025-08-08 15:00", "count": 7 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Response Example (`node` totals)
|
||||
```json
|
||||
{
|
||||
"node_id": 12345678,
|
||||
"period_type": "hour",
|
||||
"length": 24,
|
||||
"sent": 42,
|
||||
"seen": 58
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### GET `/api/stats/count`
|
||||
Returns total packet counts, optionally filtered.
|
||||
|
||||
Query Parameters
|
||||
- `packet_id` (optional, int): Filter packet_seen by packet ID.
|
||||
- `period_type` (optional, string): `hour` or `day`.
|
||||
- `length` (optional, int): Number of periods to include.
|
||||
- `channel` (optional, string): Filter by channel.
|
||||
- `from_node` (optional, int): Filter by source node ID.
|
||||
- `to_node` (optional, int): Filter by destination node ID.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"total_packets": 12345,
|
||||
"total_seen": 67890
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### GET `/api/stats/top`
|
||||
Returns nodes sorted by packets seen, with pagination.
|
||||
|
||||
Query Parameters
|
||||
- `period_type` (optional, string): `hour` or `day`. Default: `day`.
|
||||
- `length` (optional, int): Number of periods to include. Default: `1`.
|
||||
- `channel` (optional, string): Filter by channel.
|
||||
- `limit` (optional, int): Max nodes to return. Default: `20`, max `100`.
|
||||
- `offset` (optional, int): Pagination offset. Default: `0`.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"total": 250,
|
||||
"limit": 20,
|
||||
"offset": 0,
|
||||
"nodes": [
|
||||
{
|
||||
"node_id": 1234,
|
||||
"long_name": "Alice",
|
||||
"short_name": "A",
|
||||
"channel": "main",
|
||||
"sent": 100,
|
||||
"seen": 240,
|
||||
"avg": 2.4
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Edges API
|
||||
|
||||
### GET `/api/edges`
|
||||
Returns network edges (connections between nodes) based on traceroutes and neighbor info.
|
||||
Traceroute edges are collected over the last 12 hours. Neighbor edges are based on
|
||||
port 71 packets.
|
||||
|
||||
Query Parameters
|
||||
- `type` (optional, string): `traceroute` or `neighbor`. If omitted, returns both.
|
||||
- `node_id` (optional, int): Filter edges to only those touching a node.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"edges": [
|
||||
{ "from": 12345678, "to": 87654321, "type": "traceroute" },
|
||||
{ "from": 11111111, "to": 22222222, "type": "neighbor" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Config API
|
||||
|
||||
### GET `/api/config`
|
||||
Returns a safe subset of server configuration.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"site": {
|
||||
"domain": "example.com",
|
||||
"language": "en",
|
||||
"title": "Meshview",
|
||||
"message": "",
|
||||
"starting": "/chat",
|
||||
"nodes": "true",
|
||||
"chat": "true",
|
||||
"everything": "true",
|
||||
"graphs": "true",
|
||||
"stats": "true",
|
||||
"net": "true",
|
||||
"map": "true",
|
||||
"top": "true",
|
||||
"map_top_left_lat": 39.0,
|
||||
"map_top_left_lon": -123.0,
|
||||
"map_bottom_right_lat": 36.0,
|
||||
"map_bottom_right_lon": -121.0,
|
||||
"map_interval": 3,
|
||||
"firehose_interval": 3,
|
||||
"weekly_net_message": "Weekly Mesh check-in message.",
|
||||
"net_tag": "#BayMeshNet",
|
||||
"version": "3.0.0"
|
||||
},
|
||||
"mqtt": {
|
||||
"server": "mqtt.example.com",
|
||||
"topics": ["msh/region/#"]
|
||||
},
|
||||
"cleanup": {
|
||||
"enabled": "false",
|
||||
"days_to_keep": "14",
|
||||
"hour": "2",
|
||||
"minute": "0",
|
||||
"vacuum": "false"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Language API
|
||||
|
||||
### GET `/api/lang`
|
||||
Returns translation strings.
|
||||
|
||||
Query Parameters
|
||||
- `lang` (optional, string): Language code (e.g., `en`, `es`). Default from config or `en`.
|
||||
- `section` (optional, string): Return only one section (e.g., `nodelist`, `firehose`).
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"title": "Meshview",
|
||||
"search_placeholder": "Search..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Packets Seen API
|
||||
|
||||
### GET `/api/packets_seen/{packet_id}`
|
||||
Returns packet_seen entries for a packet.
|
||||
|
||||
Path Parameters
|
||||
- `packet_id` (required, int): Packet ID.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"seen": [
|
||||
{
|
||||
"packet_id": 123,
|
||||
"node_id": 456,
|
||||
"rx_time": "2025-07-22T12:45:00",
|
||||
"hop_limit": 7,
|
||||
"hop_start": 0,
|
||||
"channel": "main",
|
||||
"rx_snr": 5.0,
|
||||
"rx_rssi": -90,
|
||||
"topic": "msh/region/#",
|
||||
"import_time_us": 1736370123456789
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Traceroute API
|
||||
|
||||
### GET `/api/traceroute/{packet_id}`
|
||||
Returns traceroute details and derived paths for a packet.
|
||||
|
||||
Path Parameters
|
||||
- `packet_id` (required, int): Packet ID.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"packet": {
|
||||
"id": 123,
|
||||
"from": 111,
|
||||
"to": 222,
|
||||
"channel": "main"
|
||||
},
|
||||
"traceroute_packets": [
|
||||
{
|
||||
"index": 0,
|
||||
"gateway_node_id": 333,
|
||||
"done": true,
|
||||
"forward_hops": [111, 444, 222],
|
||||
"reverse_hops": [222, 444, 111]
|
||||
}
|
||||
],
|
||||
"unique_forward_paths": [
|
||||
{ "path": [111, 444, 222], "count": 2 }
|
||||
],
|
||||
"unique_reverse_paths": [
|
||||
[222, 444, 111]
|
||||
],
|
||||
"winning_paths": [
|
||||
[111, 444, 222]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. Health API
|
||||
|
||||
### GET `/health`
|
||||
Returns service health and database status.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"status": "healthy",
|
||||
"timestamp": "2025-07-22T12:45:00+00:00",
|
||||
"version": "3.0.3",
|
||||
"git_revision": "abc1234",
|
||||
"cleanup": {
|
||||
"enabled": true,
|
||||
"days_to_keep": 14,
|
||||
"scheduled_time": "02:00",
|
||||
"vacuum": false,
|
||||
"status": "ok",
|
||||
"status_file": "dbcleanup.status.json",
|
||||
"last_run": {
|
||||
"status": "ok",
|
||||
"started_at": "2026-06-04T09:00:00+00:00",
|
||||
"completed_at": "2026-06-04T09:00:03+00:00",
|
||||
"cutoff_at": "2026-05-21T09:00:00+00:00",
|
||||
"days_to_keep": 14,
|
||||
"vacuum_requested": false,
|
||||
"vacuum_completed": false,
|
||||
"rows_deleted": {
|
||||
"packet": 1200,
|
||||
"packet_seen": 3400,
|
||||
"traceroute": 42,
|
||||
"node": 3
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
},
|
||||
"backup": {
|
||||
"enabled": true,
|
||||
"backup_dir": "./backups",
|
||||
"scheduled_time": "02:00",
|
||||
"status": "ok",
|
||||
"status_file": "dbbackup.status.json",
|
||||
"last_run": {
|
||||
"status": "ok",
|
||||
"started_at": "2026-06-04T09:00:00+00:00",
|
||||
"completed_at": "2026-06-04T09:00:02+00:00",
|
||||
"backup_dir": "./backups",
|
||||
"database_path": "packets.db",
|
||||
"backup_file": "backups/packets_backup_20260604_090000.db.gz",
|
||||
"original_size_bytes": 12939444,
|
||||
"compressed_size_bytes": 4211560,
|
||||
"compression_percent": 67.5,
|
||||
"error": null
|
||||
}
|
||||
},
|
||||
"database": "connected",
|
||||
"database_size": "12.34 MB",
|
||||
"database_size_bytes": 12939444
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Version API
|
||||
|
||||
### GET `/version`
|
||||
Returns version metadata.
|
||||
|
||||
Response Example
|
||||
```json
|
||||
{
|
||||
"version": "3.0.3",
|
||||
"release_date": "2026-1-15",
|
||||
"git_revision": "abc1234",
|
||||
"git_revision_short": "abc1234"
|
||||
}
|
||||
```
|
||||
@@ -1,37 +0,0 @@
|
||||
# Coverage
|
||||
|
||||
## Predicted coverage
|
||||
|
||||
Meshview can display a predicted coverage boundary for a node. This is a **model**
|
||||
estimate, not a guarantee of real-world performance.
|
||||
|
||||
### How it works
|
||||
|
||||
The coverage boundary is computed using the Longley-Rice / ITM **area mode**
|
||||
propagation model. Area mode estimates average path loss over generic terrain
|
||||
and does not use a terrain profile. This means it captures general distance
|
||||
effects, but **does not** account for terrain shadows, buildings, or foliage.
|
||||
|
||||
### What you are seeing
|
||||
|
||||
The UI draws a **perimeter** (not a heatmap) that represents the furthest
|
||||
distance where predicted signal strength is above a threshold (default
|
||||
`-120 dBm`). The model is run radially from the node in multiple directions,
|
||||
and the last point above the threshold forms the outline.
|
||||
|
||||
### Key parameters
|
||||
|
||||
- **Frequency**: default `907 MHz`
|
||||
- **Transmit power**: default `20 dBm`
|
||||
- **Antenna heights**: default `5 m` (TX) and `1.5 m` (RX)
|
||||
- **Reliability**: default `0.5` (median)
|
||||
- **Terrain irregularity**: default `90 m` (average terrain)
|
||||
|
||||
### Limitations
|
||||
|
||||
- No terrain or building data is used (area mode only).
|
||||
- Results are sensitive to power, height, and threshold.
|
||||
- Environmental factors can cause large real-world deviations.
|
||||
|
||||
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
# Database Changes With Alembic
|
||||
|
||||
This guide explains how to make database schema changes in MeshView using Alembic migrations.
|
||||
|
||||
## Overview
|
||||
|
||||
When you need to add, modify, or remove columns from database tables, you must:
|
||||
1. Update the SQLAlchemy model
|
||||
2. Create an Alembic migration
|
||||
3. Let the system automatically apply the migration
|
||||
|
||||
## Step-by-Step Process
|
||||
|
||||
### 1. Update the Model
|
||||
|
||||
Edit `meshview/models.py` to add/modify the column in the appropriate model class:
|
||||
|
||||
```python
|
||||
class Traceroute(Base):
|
||||
__tablename__ = "traceroute"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
||||
# ... existing columns ...
|
||||
route_return: Mapped[bytes] = mapped_column(nullable=True) # New column
|
||||
```
|
||||
|
||||
### 2. Create an Alembic Migration
|
||||
|
||||
Generate a new migration file with a descriptive message:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic revision -m "add route_return to traceroute"
|
||||
```
|
||||
|
||||
This creates a new file in `alembic/versions/` with a unique revision ID.
|
||||
|
||||
### 3. Fill in the Migration
|
||||
|
||||
Edit the generated migration file to implement the actual database changes:
|
||||
|
||||
```python
|
||||
def upgrade() -> None:
|
||||
# Add route_return column to traceroute table
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.add_column(sa.Column('route_return', sa.LargeBinary(), nullable=True))
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# Remove route_return column from traceroute table
|
||||
with op.batch_alter_table('traceroute', schema=None) as batch_op:
|
||||
batch_op.drop_column('route_return')
|
||||
```
|
||||
|
||||
### 4. Migration Runs Automatically
|
||||
|
||||
When you restart the application with `mvrun.py`:
|
||||
|
||||
1. The writer process (`startdb.py`) starts up
|
||||
2. It checks if the database schema is up to date
|
||||
3. If new migrations are pending, it runs them automatically
|
||||
4. The reader process (web server) waits for migrations to complete before starting
|
||||
|
||||
**No manual migration command is needed** - the application handles this automatically on startup.
|
||||
|
||||
### 5. Commit Both Files
|
||||
|
||||
Add both files to git:
|
||||
|
||||
```bash
|
||||
git add meshview/models.py
|
||||
git add alembic/versions/ac311b3782a1_add_route_return_to_traceroute.py
|
||||
git commit -m "Add route_return column to traceroute table"
|
||||
```
|
||||
|
||||
## Important Notes
|
||||
|
||||
### SQLite Compatibility
|
||||
|
||||
Always use `batch_alter_table` for SQLite compatibility:
|
||||
|
||||
```python
|
||||
with op.batch_alter_table('table_name', schema=None) as batch_op:
|
||||
batch_op.add_column(...)
|
||||
```
|
||||
|
||||
SQLite has limited ALTER TABLE support, and `batch_alter_table` works around these limitations.
|
||||
|
||||
### Migration Process
|
||||
|
||||
- **Writer process** (`startdb.py`): Runs migrations on startup
|
||||
- **Reader process** (web server in `main.py`): Waits for migrations to complete
|
||||
- Migrations are checked and applied every time the application starts
|
||||
- The system uses a migration status table to coordinate between processes
|
||||
|
||||
### Common Column Types
|
||||
|
||||
```python
|
||||
# Integer
|
||||
column: Mapped[int] = mapped_column(BigInteger, nullable=True)
|
||||
|
||||
# String
|
||||
column: Mapped[str] = mapped_column(nullable=True)
|
||||
|
||||
# Bytes/Binary
|
||||
column: Mapped[bytes] = mapped_column(nullable=True)
|
||||
|
||||
# DateTime
|
||||
column: Mapped[datetime] = mapped_column(nullable=True)
|
||||
|
||||
# Boolean
|
||||
column: Mapped[bool] = mapped_column(nullable=True)
|
||||
|
||||
# Float
|
||||
column: Mapped[float] = mapped_column(nullable=True)
|
||||
```
|
||||
|
||||
### Migration File Location
|
||||
|
||||
Migrations are stored in: `alembic/versions/`
|
||||
|
||||
Each migration file includes:
|
||||
- Revision ID (unique identifier)
|
||||
- Down revision (previous migration in chain)
|
||||
- Create date
|
||||
- `upgrade()` function (applies changes)
|
||||
- `downgrade()` function (reverts changes)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Migration Not Running
|
||||
|
||||
If migrations don't run automatically:
|
||||
|
||||
1. Check that the database is writable
|
||||
2. Look for errors in the startup logs
|
||||
3. Verify the migration chain is correct (each migration references the previous one)
|
||||
|
||||
### Manual Migration (Not Recommended)
|
||||
|
||||
If you need to manually run migrations for debugging:
|
||||
|
||||
```bash
|
||||
./env/bin/alembic upgrade head
|
||||
```
|
||||
|
||||
However, the application normally handles this automatically.
|
||||
@@ -1,14 +0,0 @@
|
||||
# Technical Documentation
|
||||
|
||||
This directory contains technical documentation for MeshView that goes beyond initial setup and basic usage.
|
||||
|
||||
These documents are intended for developers, contributors, and advanced users who need deeper insight into the system's architecture, database migrations, API endpoints, and internal workings.
|
||||
|
||||
## Contents
|
||||
|
||||
- [ALEMBIC_SETUP.md](ALEMBIC_SETUP.md) - Database migration setup and management
|
||||
- [TIMESTAMP_MIGRATION.md](TIMESTAMP_MIGRATION.md) - Details on timestamp schema changes
|
||||
- [API_Documentation.md](API_Documentation.md) - REST API endpoints and usage
|
||||
- [CODE_IMPROVEMENTS.md](CODE_IMPROVEMENTS.md) - Suggested code improvements and refactoring ideas
|
||||
|
||||
For initial setup and basic usage instructions, please see the main [README.md](../README.md) in the root directory.
|
||||
@@ -1,193 +0,0 @@
|
||||
# High-Resolution Timestamp Migration
|
||||
|
||||
This document describes the implementation of GitHub issue #55: storing high-resolution timestamps as integers in the database for improved performance and query efficiency.
|
||||
|
||||
## Overview
|
||||
|
||||
The meshview database now stores timestamps in two formats:
|
||||
1. **TEXT format** (`import_time`): Human-readable ISO8601 format with microseconds (e.g., `2025-03-12 04:15:56.058038`)
|
||||
2. **INTEGER format** (`import_time_us`): Microseconds since Unix epoch (1970-01-01 00:00:00 UTC)
|
||||
|
||||
The dual format approach provides:
|
||||
- **Backward compatibility**: Existing `import_time` TEXT columns remain unchanged
|
||||
- **Performance**: Fast integer comparisons and math operations
|
||||
- **Precision**: Microsecond resolution for accurate timing
|
||||
- **Efficiency**: Compact storage and fast indexed lookups
|
||||
|
||||
## Database Changes
|
||||
|
||||
### New Columns Added
|
||||
|
||||
Three tables have new `import_time_us` columns:
|
||||
|
||||
1. **packet.import_time_us** (INTEGER)
|
||||
- Stores when the packet was imported into the database
|
||||
- Indexed for fast queries
|
||||
|
||||
2. **packet_seen.import_time_us** (INTEGER)
|
||||
- Stores when the packet_seen record was imported
|
||||
- Indexed for performance
|
||||
|
||||
3. **traceroute.import_time_us** (INTEGER)
|
||||
- Stores when the traceroute was imported
|
||||
- Indexed for fast lookups
|
||||
|
||||
### New Indexes
|
||||
|
||||
The following indexes were created for optimal query performance:
|
||||
|
||||
```sql
|
||||
CREATE INDEX idx_packet_import_time_us ON packet(import_time_us DESC);
|
||||
CREATE INDEX idx_packet_from_node_time_us ON packet(from_node_id, import_time_us DESC);
|
||||
CREATE INDEX idx_packet_seen_import_time_us ON packet_seen(import_time_us);
|
||||
CREATE INDEX idx_traceroute_import_time_us ON traceroute(import_time_us);
|
||||
```
|
||||
|
||||
## Migration Process
|
||||
|
||||
### For Existing Databases
|
||||
|
||||
Run the migration script to add the new columns and populate them from existing data:
|
||||
|
||||
```bash
|
||||
python migrate_add_timestamp_us.py [database_path]
|
||||
```
|
||||
|
||||
If no path is provided, it defaults to `packets.db` in the current directory.
|
||||
|
||||
The migration script:
|
||||
1. Checks if migration is needed (idempotent)
|
||||
2. Adds `import_time_us` columns to the three tables
|
||||
3. Populates the new columns from existing `import_time` values
|
||||
4. Creates indexes for optimal performance
|
||||
5. Verifies the migration completed successfully
|
||||
|
||||
### For New Databases
|
||||
|
||||
New databases created with the updated schema will automatically include the `import_time_us` columns. The MQTT store module populates both columns when inserting new records.
|
||||
|
||||
## Code Changes
|
||||
|
||||
### Models (meshview/models.py)
|
||||
|
||||
The ORM models now include the new `import_time_us` fields:
|
||||
|
||||
```python
|
||||
class Packet(Base):
|
||||
import_time: Mapped[datetime] = mapped_column(nullable=True)
|
||||
import_time_us: Mapped[int] = mapped_column(BigInteger, nullable=True)
|
||||
```
|
||||
|
||||
### MQTT Store (meshview/mqtt_store.py)
|
||||
|
||||
The data ingestion logic now populates both timestamp columns using UTC time:
|
||||
|
||||
```python
|
||||
now = datetime.datetime.now(datetime.timezone.utc)
|
||||
now_us = int(now.timestamp() * 1_000_000)
|
||||
|
||||
# Both columns are populated
|
||||
import_time=now,
|
||||
import_time_us=now_us,
|
||||
```
|
||||
|
||||
**Important**: All new timestamps use UTC (Coordinated Universal Time) for consistency across time zones.
|
||||
|
||||
## Using the New Timestamps
|
||||
|
||||
### Example Queries
|
||||
|
||||
**Query packets from the last 7 days:**
|
||||
|
||||
```sql
|
||||
-- Old way (slower)
|
||||
SELECT * FROM packet
|
||||
WHERE import_time >= datetime('now', '-7 days');
|
||||
|
||||
-- New way (faster)
|
||||
SELECT * FROM packet
|
||||
WHERE import_time_us >= (strftime('%s', 'now', '-7 days') * 1000000);
|
||||
```
|
||||
|
||||
**Query packets in a specific time range:**
|
||||
|
||||
```sql
|
||||
SELECT * FROM packet
|
||||
WHERE import_time_us BETWEEN 1759254380000000 AND 1759254390000000;
|
||||
```
|
||||
|
||||
**Calculate time differences (in microseconds):**
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
id,
|
||||
(import_time_us - LAG(import_time_us) OVER (ORDER BY import_time_us)) / 1000000.0 as seconds_since_last
|
||||
FROM packet
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
### Converting Timestamps
|
||||
|
||||
**From datetime to microseconds (UTC):**
|
||||
```python
|
||||
import datetime
|
||||
now = datetime.datetime.now(datetime.timezone.utc)
|
||||
now_us = int(now.timestamp() * 1_000_000)
|
||||
```
|
||||
|
||||
**From microseconds to datetime:**
|
||||
```python
|
||||
import datetime
|
||||
timestamp_us = 1759254380813451
|
||||
dt = datetime.datetime.fromtimestamp(timestamp_us / 1_000_000)
|
||||
```
|
||||
|
||||
**In SQL queries:**
|
||||
```sql
|
||||
-- Datetime to microseconds
|
||||
SELECT CAST((strftime('%s', import_time) || substr(import_time, 21, 6)) AS INTEGER);
|
||||
|
||||
-- Microseconds to datetime (approximate)
|
||||
SELECT datetime(import_time_us / 1000000, 'unixepoch');
|
||||
```
|
||||
|
||||
## Performance Benefits
|
||||
|
||||
The integer timestamp columns provide significant performance improvements:
|
||||
|
||||
1. **Faster comparisons**: Integer comparisons are much faster than string/datetime comparisons
|
||||
2. **Smaller index size**: Integer indexes are more compact than datetime indexes
|
||||
3. **Range queries**: BETWEEN operations on integers are highly optimized
|
||||
4. **Math operations**: Easy to calculate time differences, averages, etc.
|
||||
5. **Sorting**: Integer sorting is faster than datetime sorting
|
||||
|
||||
## Backward Compatibility
|
||||
|
||||
The original `import_time` TEXT columns remain unchanged:
|
||||
- Existing code continues to work
|
||||
- Human-readable timestamps still available
|
||||
- Gradual migration to new columns possible
|
||||
- No breaking changes for existing queries
|
||||
|
||||
## Future Work
|
||||
|
||||
Future improvements could include:
|
||||
- Migrating queries to use `import_time_us` columns
|
||||
- Deprecating the TEXT `import_time` columns (after transition period)
|
||||
- Adding helper functions for timestamp conversion
|
||||
- Creating views that expose both formats
|
||||
|
||||
## Testing
|
||||
|
||||
The migration was tested on a production database with:
|
||||
- 132,466 packet records
|
||||
- 1,385,659 packet_seen records
|
||||
- 28,414 traceroute records
|
||||
|
||||
All records were successfully migrated with microsecond precision preserved.
|
||||
|
||||
## References
|
||||
|
||||
- GitHub Issue: #55 - Storing High-Resolution Timestamps in SQLite
|
||||
- SQLite datetime functions: https://www.sqlite.org/lang_datefunc.html
|
||||
- Python datetime module: https://docs.python.org/3/library/datetime.html
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
protoc \
|
||||
-Iproto_def \
|
||||
--python_out=. \
|
||||
proto_def/meshtastic/admin.proto \
|
||||
proto_def/meshtastic/apponly.proto \
|
||||
proto_def/meshtastic/atak.proto \
|
||||
proto_def/meshtastic/cannedmessages.proto \
|
||||
proto_def/meshtastic/channel.proto \
|
||||
proto_def/meshtastic/clientonly.proto \
|
||||
proto_def/meshtastic/config.proto \
|
||||
proto_def/meshtastic/connection_status.proto \
|
||||
proto_def/meshtastic/localonly.proto \
|
||||
proto_def/meshtastic/mesh.proto \
|
||||
proto_def/meshtastic/module_config.proto \
|
||||
proto_def/meshtastic/mqtt.proto \
|
||||
proto_def/meshtastic/paxcount.proto \
|
||||
proto_def/meshtastic/portnums.proto \
|
||||
proto_def/meshtastic/remote_hardware.proto \
|
||||
proto_def/meshtastic/rtttl.proto \
|
||||
proto_def/meshtastic/storeforward.proto \
|
||||
proto_def/meshtastic/telemetry.proto \
|
||||
proto_def/meshtastic/xmodem.proto
|
||||
@@ -1,12 +1,40 @@
|
||||
import asyncio
|
||||
import argparse
|
||||
|
||||
from meshview import mqtt_reader
|
||||
from meshview import database
|
||||
from meshview import store
|
||||
from meshview import web
|
||||
from meshview import http
|
||||
|
||||
|
||||
async def main():
|
||||
async def load_database_from_mqtt(topic):
|
||||
async for topic, env in mqtt_reader.get_topic_envelopes(topic):
|
||||
await store.process_envelope(topic, env)
|
||||
|
||||
|
||||
async def main(args):
|
||||
database.init_database(args.database)
|
||||
|
||||
await database.create_tables()
|
||||
async with asyncio.TaskGroup() as tg:
|
||||
tg.create_task(web.run_server())
|
||||
tg.create_task(load_database_from_mqtt(args.topic))
|
||||
tg.create_task(web.run_server(args.bind, args.port, args.tls_cert))
|
||||
if args.acme_challenge:
|
||||
tg.create_task(http.run_server(args.bind, args.acme_challenge))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(main())
|
||||
parser = argparse.ArgumentParser('meshview')
|
||||
parser.add_argument('--bind', nargs='*', default=['::1'])
|
||||
parser.add_argument('--acme-challenge')
|
||||
parser.add_argument('--port', default=8080, type=int)
|
||||
parser.add_argument('--tls-cert')
|
||||
|
||||
parser.add_argument('--topic', nargs='*', default=['msh/US/bayarea/#'])
|
||||
|
||||
parser.add_argument('--database', default='sqlite+aiosqlite:///packets.db')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
asyncio.run(main(args))
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/admin.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2
|
||||
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
|
||||
from meshtastic import connection_status_pb2 as meshtastic_dot_connection__status__pb2
|
||||
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
|
||||
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xce\x11\n\x0c\x41\x64minMessage\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12\x33\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12.\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12\x41\n\x12get_config_request\x18\x05 \x01(\x0e\x32#.meshtastic.AdminMessage.ConfigTypeH\x00\x12\x31\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12N\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32).meshtastic.AdminMessage.ModuleConfigTypeH\x00\x12>\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b \x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c \x01(\x08H\x00\x12\x42\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f \x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 \x01(\x08H\x00\x12S\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\".meshtastic.DeviceConnectionStatusH\x00\x12\x31\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x19.meshtastic.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\\\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32*.meshtastic.NodeRemoteHardwarePinsResponseH\x00\x12 \n\x16\x65nter_dfu_mode_request\x18\x15 \x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tH\x00\x12%\n\tset_owner\x18 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12*\n\x0bset_channel\x18! \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12(\n\nset_config\x18\" \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12\x35\n\x11set_module_config\x18# \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& \x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' \x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( \x01(\rH\x00\x12\x32\n\x12set_fixed_position\x18) \x01(\x0b\x32\x14.meshtastic.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\x00\x12\x1c\n\x12reboot_ota_seconds\x18_ \x01(\x05H\x00\x12\x18\n\x0e\x65xit_simulator\x18` \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 \x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 \x01(\x05H\x00\x12\x17\n\rfactory_reset\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\x95\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x12\n\nshort_name\x18\x04 \x01(\t\"f\n\x1eNodeRemoteHardwarePinsResponse\x12\x44\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32!.meshtastic.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.admin_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_ADMINMESSAGE._serialized_start=181
|
||||
_ADMINMESSAGE._serialized_end=2435
|
||||
_ADMINMESSAGE_CONFIGTYPE._serialized_start=1949
|
||||
_ADMINMESSAGE_CONFIGTYPE._serialized_end=2098
|
||||
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=2101
|
||||
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2416
|
||||
_HAMPARAMETERS._serialized_start=2437
|
||||
_HAMPARAMETERS._serialized_end=2528
|
||||
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2530
|
||||
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2632
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/apponly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2
|
||||
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"o\n\nChannelSet\x12-\n\x08settings\x18\x01 \x03(\x0b\x32\x1b.meshtastic.ChannelSettings\x12\x32\n\x0blora_config\x18\x02 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.apponly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CHANNELSET._serialized_start=91
|
||||
_CHANNELSET._serialized_end=202
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,40 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/atak.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/atak.proto\x12\nmeshtastic\"\xe6\x01\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12$\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x13.meshtastic.Contact\x12 \n\x05group\x18\x03 \x01(\x0b\x32\x11.meshtastic.Group\x12\"\n\x06status\x18\x04 \x01(\x0b\x32\x12.meshtastic.Status\x12\x1e\n\x03pli\x18\x05 \x01(\x0b\x32\x0f.meshtastic.PLIH\x00\x12#\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x13.meshtastic.GeoChatH\x00\x42\x11\n\x0fpayload_variant\"2\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x05\n\x03_to\"M\n\x05Group\x12$\n\x04role\x18\x01 \x01(\x0e\x32\x16.meshtastic.MemberRole\x12\x1e\n\x04team\x18\x02 \x01(\x0e\x32\x10.meshtastic.Team\"\x19\n\x06Status\x12\x0f\n\x07\x62\x61ttery\x18\x01 \x01(\r\"4\n\x07\x43ontact\x12\x10\n\x08\x63\x61llsign\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\t\"_\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x0e\n\x06\x63ourse\x18\x05 \x01(\r*\xc0\x01\n\x04Team\x12\x14\n\x10Unspecifed_Color\x10\x00\x12\t\n\x05White\x10\x01\x12\n\n\x06Yellow\x10\x02\x12\n\n\x06Orange\x10\x03\x12\x0b\n\x07Magenta\x10\x04\x12\x07\n\x03Red\x10\x05\x12\n\n\x06Maroon\x10\x06\x12\n\n\x06Purple\x10\x07\x12\r\n\tDark_Blue\x10\x08\x12\x08\n\x04\x42lue\x10\t\x12\x08\n\x04\x43yan\x10\n\x12\x08\n\x04Teal\x10\x0b\x12\t\n\x05Green\x10\x0c\x12\x0e\n\nDark_Green\x10\r\x12\t\n\x05\x42rown\x10\x0e*\x7f\n\nMemberRole\x12\x0e\n\nUnspecifed\x10\x00\x12\x0e\n\nTeamMember\x10\x01\x12\x0c\n\x08TeamLead\x10\x02\x12\x06\n\x02HQ\x10\x03\x12\n\n\x06Sniper\x10\x04\x12\t\n\x05Medic\x10\x05\x12\x13\n\x0f\x46orwardObserver\x10\x06\x12\x07\n\x03RTO\x10\x07\x12\x06\n\x02K9\x10\x08\x42_\n\x13\x63om.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.atak_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_TEAM._serialized_start=580
|
||||
_TEAM._serialized_end=772
|
||||
_MEMBERROLE._serialized_start=774
|
||||
_MEMBERROLE._serialized_end=901
|
||||
_TAKPACKET._serialized_start=38
|
||||
_TAKPACKET._serialized_end=268
|
||||
_GEOCHAT._serialized_start=270
|
||||
_GEOCHAT._serialized_end=320
|
||||
_GROUP._serialized_start=322
|
||||
_GROUP._serialized_end=399
|
||||
_STATUS._serialized_start=401
|
||||
_STATUS._serialized_end=426
|
||||
_CONTACT._serialized_start=428
|
||||
_CONTACT._serialized_end=480
|
||||
_PLI._serialized_start=482
|
||||
_PLI._serialized_end=577
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/cannedmessages.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\x12\nmeshtastic\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBn\n\x13\x63om.geeksville.meshB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CANNEDMESSAGEMODULECONFIG._serialized_start=47
|
||||
_CANNEDMESSAGEMODULECONFIG._serialized_end=92
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,34 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/channel.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\x12\nmeshtastic\"\xb8\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12\x33\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32\x1a.meshtastic.ModuleSettings\"E\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x17\n\x0fis_client_muted\x18\x02 \x01(\x08\"\xa1\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12-\n\x08settings\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12&\n\x04role\x18\x03 \x01(\x0e\x32\x18.meshtastic.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.channel_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None
|
||||
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
|
||||
_CHANNELSETTINGS._serialized_start=41
|
||||
_CHANNELSETTINGS._serialized_end=225
|
||||
_MODULESETTINGS._serialized_start=227
|
||||
_MODULESETTINGS._serialized_end=296
|
||||
_CHANNEL._serialized_start=299
|
||||
_CHANNEL._serialized_end=460
|
||||
_CHANNEL_ROLE._serialized_start=412
|
||||
_CHANNEL_ROLE._serialized_end=460
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/clientonly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x12\nmeshtastic\x1a\x1ameshtastic/localonly.proto\"\x8d\x02\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12,\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x17.meshtastic.LocalConfigH\x03\x88\x01\x01\x12\x39\n\rmodule_config\x18\x05 \x01(\x0b\x32\x1d.meshtastic.LocalModuleConfigH\x04\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configBe\n\x13\x63om.geeksville.meshB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.clientonly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_DEVICEPROFILE._serialized_start=72
|
||||
_DEVICEPROFILE._serialized_end=341
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/connection_status.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\x12\nmeshtastic\"\xb1\x02\n\x16\x44\x65viceConnectionStatus\x12\x33\n\x04wifi\x18\x01 \x01(\x0b\x32 .meshtastic.WifiConnectionStatusH\x00\x88\x01\x01\x12;\n\x08\x65thernet\x18\x02 \x01(\x0b\x32$.meshtastic.EthernetConnectionStatusH\x01\x88\x01\x01\x12=\n\tbluetooth\x18\x03 \x01(\x0b\x32%.meshtastic.BluetoothConnectionStatusH\x02\x88\x01\x01\x12\x37\n\x06serial\x18\x04 \x01(\x0b\x32\".meshtastic.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"g\n\x14WifiConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"O\n\x18\x45thernetConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x65\n\x13\x63om.geeksville.meshB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.connection_status_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_DEVICECONNECTIONSTATUS._serialized_start=51
|
||||
_DEVICECONNECTIONSTATUS._serialized_end=356
|
||||
_WIFICONNECTIONSTATUS._serialized_start=358
|
||||
_WIFICONNECTIONSTATUS._serialized_end=461
|
||||
_ETHERNETCONNECTIONSTATUS._serialized_start=463
|
||||
_ETHERNETCONNECTIONSTATUS._serialized_end=542
|
||||
_NETWORKCONNECTIONSTATUS._serialized_start=544
|
||||
_NETWORKCONNECTIONSTATUS._serialized_end=667
|
||||
_BLUETOOTHCONNECTIONSTATUS._serialized_start=669
|
||||
_BLUETOOTHCONNECTIONSTATUS._serialized_end=745
|
||||
_SERIALCONNECTIONSTATUS._serialized_start=747
|
||||
_SERIALCONNECTIONSTATUS._serialized_end=807
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,30 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/localonly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
|
||||
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x12\nmeshtastic\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xfd\x02\n\x0bLocalConfig\x12/\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfig\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfig\x12-\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfig\x12\x31\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfig\x12\x31\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfig\x12+\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfig\x12\x35\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\"\xfb\x06\n\x11LocalModuleConfig\x12\x31\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfig\x12\x35\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfig\x12R\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfig\x12\x42\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfig\x12<\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfig\x12;\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfig\x12\x44\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfig\x12\x33\n\x05\x61udio\x18\t \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfig\x12\x46\n\x0fremote_hardware\x18\n \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfig\x12\x42\n\rneighbor_info\x18\x0b \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfig\x12H\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfig\x12H\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfig\x12=\n\npaxcounter\x18\x0e \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBd\n\x13\x63om.geeksville.meshB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.localonly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_LOCALCONFIG._serialized_start=100
|
||||
_LOCALCONFIG._serialized_end=481
|
||||
_LOCALMODULECONFIG._serialized_start=484
|
||||
_LOCALMODULECONFIG._serialized_end=1375
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/mqtt.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
|
||||
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x12\nmeshtastic\x1a\x17meshtastic/config.proto\x1a\x15meshtastic/mesh.proto\"a\n\x0fServiceEnvelope\x12&\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\xbc\x03\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12\x32\n\x04role\x18\x03 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12+\n\x08hw_model\x18\x04 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x38\n\x06region\x18\x06 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12?\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\rB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mqtt_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_SERVICEENVELOPE._serialized_start=85
|
||||
_SERVICEENVELOPE._serialized_end=182
|
||||
_MAPREPORT._serialized_start=185
|
||||
_MAPREPORT._serialized_end=629
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/paxcount.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\x12\nmeshtastic\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBc\n\x13\x63om.geeksville.meshB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_PAXCOUNT._serialized_start=41
|
||||
_PAXCOUNT._serialized_end=94
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/portnums.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto\x12\nmeshtastic*\x8d\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.portnums_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_PORTNUM._serialized_start=42
|
||||
_PORTNUM._serialized_end=567
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1 +0,0 @@
|
||||
9ab4a1d08cb833d897aee2367013318718391f2f
|
||||
File diff suppressed because one or more lines are too long
@@ -1,313 +0,0 @@
|
||||
from meshtastic.protobuf import channel_pb2 as _channel_pb2
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from meshtastic.protobuf import connection_status_pb2 as _connection_status_pb2
|
||||
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
|
||||
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
NO_REBOOT_OTA: OTAMode
|
||||
OTA_BLE: OTAMode
|
||||
OTA_WIFI: OTAMode
|
||||
|
||||
class AdminMessage(_message.Message):
|
||||
__slots__ = ["add_contact", "backup_preferences", "begin_edit_settings", "commit_edit_settings", "delete_file_request", "enter_dfu_mode_request", "exit_simulator", "factory_reset_config", "factory_reset_device", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_channel_request", "get_channel_response", "get_config_request", "get_config_response", "get_device_connection_status_request", "get_device_connection_status_response", "get_device_metadata_request", "get_device_metadata_response", "get_module_config_request", "get_module_config_response", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "get_owner_request", "get_owner_response", "get_ringtone_request", "get_ringtone_response", "get_ui_config_request", "get_ui_config_response", "key_verification", "lockdown_auth", "nodedb_reset", "ota_request", "reboot_ota_seconds", "reboot_seconds", "remove_backup_preferences", "remove_by_nodenum", "remove_favorite_node", "remove_fixed_position", "remove_ignored_node", "restore_preferences", "send_input_event", "sensor_config", "session_passkey", "set_canned_message_module_messages", "set_channel", "set_config", "set_favorite_node", "set_fixed_position", "set_ham_mode", "set_ignored_node", "set_module_config", "set_owner", "set_ringtone_message", "set_scale", "set_time_only", "shutdown_seconds", "store_ui_config", "toggle_muted_node"]
|
||||
class BackupLocation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class ConfigType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class ModuleConfigType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class InputEvent(_message.Message):
|
||||
__slots__ = ["event_code", "kb_char", "touch_x", "touch_y"]
|
||||
EVENT_CODE_FIELD_NUMBER: _ClassVar[int]
|
||||
KB_CHAR_FIELD_NUMBER: _ClassVar[int]
|
||||
TOUCH_X_FIELD_NUMBER: _ClassVar[int]
|
||||
TOUCH_Y_FIELD_NUMBER: _ClassVar[int]
|
||||
event_code: int
|
||||
kb_char: int
|
||||
touch_x: int
|
||||
touch_y: int
|
||||
def __init__(self, event_code: _Optional[int] = ..., kb_char: _Optional[int] = ..., touch_x: _Optional[int] = ..., touch_y: _Optional[int] = ...) -> None: ...
|
||||
class OTAEvent(_message.Message):
|
||||
__slots__ = ["ota_hash", "reboot_ota_mode"]
|
||||
OTA_HASH_FIELD_NUMBER: _ClassVar[int]
|
||||
REBOOT_OTA_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
ota_hash: bytes
|
||||
reboot_ota_mode: OTAMode
|
||||
def __init__(self, reboot_ota_mode: _Optional[_Union[OTAMode, str]] = ..., ota_hash: _Optional[bytes] = ...) -> None: ...
|
||||
ADD_CONTACT_FIELD_NUMBER: _ClassVar[int]
|
||||
AMBIENTLIGHTING_CONFIG: AdminMessage.ModuleConfigType
|
||||
AUDIO_CONFIG: AdminMessage.ModuleConfigType
|
||||
BACKUP_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
|
||||
BEGIN_EDIT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
BLUETOOTH_CONFIG: AdminMessage.ConfigType
|
||||
CANNEDMSG_CONFIG: AdminMessage.ModuleConfigType
|
||||
COMMIT_EDIT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
DELETE_FILE_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
DETECTIONSENSOR_CONFIG: AdminMessage.ModuleConfigType
|
||||
DEVICEUI_CONFIG: AdminMessage.ConfigType
|
||||
DEVICE_CONFIG: AdminMessage.ConfigType
|
||||
DISPLAY_CONFIG: AdminMessage.ConfigType
|
||||
ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
EXIT_SIMULATOR_FIELD_NUMBER: _ClassVar[int]
|
||||
EXTNOTIF_CONFIG: AdminMessage.ModuleConfigType
|
||||
FACTORY_RESET_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
FACTORY_RESET_DEVICE_FIELD_NUMBER: _ClassVar[int]
|
||||
FLASH: AdminMessage.BackupLocation
|
||||
GET_CANNED_MESSAGE_MODULE_MESSAGES_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_CANNED_MESSAGE_MODULE_MESSAGES_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_CHANNEL_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_CHANNEL_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_DEVICE_CONNECTION_STATUS_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_DEVICE_CONNECTION_STATUS_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_DEVICE_METADATA_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_DEVICE_METADATA_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_MODULE_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_MODULE_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_NODE_REMOTE_HARDWARE_PINS_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_OWNER_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_OWNER_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_RINGTONE_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_RINGTONE_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_UI_CONFIG_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
GET_UI_CONFIG_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
KEY_VERIFICATION_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCKDOWN_AUTH_FIELD_NUMBER: _ClassVar[int]
|
||||
LORA_CONFIG: AdminMessage.ConfigType
|
||||
MQTT_CONFIG: AdminMessage.ModuleConfigType
|
||||
NEIGHBORINFO_CONFIG: AdminMessage.ModuleConfigType
|
||||
NETWORK_CONFIG: AdminMessage.ConfigType
|
||||
NODEDB_RESET_FIELD_NUMBER: _ClassVar[int]
|
||||
OTA_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
PAXCOUNTER_CONFIG: AdminMessage.ModuleConfigType
|
||||
POSITION_CONFIG: AdminMessage.ConfigType
|
||||
POWER_CONFIG: AdminMessage.ConfigType
|
||||
RANGETEST_CONFIG: AdminMessage.ModuleConfigType
|
||||
REBOOT_OTA_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
REBOOT_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTEHARDWARE_CONFIG: AdminMessage.ModuleConfigType
|
||||
REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOVE_BY_NODENUM_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOVE_FAVORITE_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOVE_FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOVE_IGNORED_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
RESTORE_PREFERENCES_FIELD_NUMBER: _ClassVar[int]
|
||||
SD: AdminMessage.BackupLocation
|
||||
SECURITY_CONFIG: AdminMessage.ConfigType
|
||||
SEND_INPUT_EVENT_FIELD_NUMBER: _ClassVar[int]
|
||||
SENSOR_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SERIAL_CONFIG: AdminMessage.ModuleConfigType
|
||||
SESSIONKEY_CONFIG: AdminMessage.ConfigType
|
||||
SESSION_PASSKEY_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_CANNED_MESSAGE_MODULE_MESSAGES_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_FAVORITE_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_HAM_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_IGNORED_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_OWNER_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_RINGTONE_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_SCALE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TIME_ONLY_FIELD_NUMBER: _ClassVar[int]
|
||||
SHUTDOWN_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
STATUSMESSAGE_CONFIG: AdminMessage.ModuleConfigType
|
||||
STOREFORWARD_CONFIG: AdminMessage.ModuleConfigType
|
||||
STORE_UI_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_CONFIG: AdminMessage.ModuleConfigType
|
||||
TELEMETRY_CONFIG: AdminMessage.ModuleConfigType
|
||||
TOGGLE_MUTED_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
TRAFFICMANAGEMENT_CONFIG: AdminMessage.ModuleConfigType
|
||||
add_contact: SharedContact
|
||||
backup_preferences: AdminMessage.BackupLocation
|
||||
begin_edit_settings: bool
|
||||
commit_edit_settings: bool
|
||||
delete_file_request: str
|
||||
enter_dfu_mode_request: bool
|
||||
exit_simulator: bool
|
||||
factory_reset_config: int
|
||||
factory_reset_device: int
|
||||
get_canned_message_module_messages_request: bool
|
||||
get_canned_message_module_messages_response: str
|
||||
get_channel_request: int
|
||||
get_channel_response: _channel_pb2.Channel
|
||||
get_config_request: AdminMessage.ConfigType
|
||||
get_config_response: _config_pb2.Config
|
||||
get_device_connection_status_request: bool
|
||||
get_device_connection_status_response: _connection_status_pb2.DeviceConnectionStatus
|
||||
get_device_metadata_request: bool
|
||||
get_device_metadata_response: _mesh_pb2.DeviceMetadata
|
||||
get_module_config_request: AdminMessage.ModuleConfigType
|
||||
get_module_config_response: _module_config_pb2.ModuleConfig
|
||||
get_node_remote_hardware_pins_request: bool
|
||||
get_node_remote_hardware_pins_response: NodeRemoteHardwarePinsResponse
|
||||
get_owner_request: bool
|
||||
get_owner_response: _mesh_pb2.User
|
||||
get_ringtone_request: bool
|
||||
get_ringtone_response: str
|
||||
get_ui_config_request: bool
|
||||
get_ui_config_response: _device_ui_pb2.DeviceUIConfig
|
||||
key_verification: KeyVerificationAdmin
|
||||
lockdown_auth: LockdownAuth
|
||||
nodedb_reset: bool
|
||||
ota_request: AdminMessage.OTAEvent
|
||||
reboot_ota_seconds: int
|
||||
reboot_seconds: int
|
||||
remove_backup_preferences: AdminMessage.BackupLocation
|
||||
remove_by_nodenum: int
|
||||
remove_favorite_node: int
|
||||
remove_fixed_position: bool
|
||||
remove_ignored_node: int
|
||||
restore_preferences: AdminMessage.BackupLocation
|
||||
send_input_event: AdminMessage.InputEvent
|
||||
sensor_config: SensorConfig
|
||||
session_passkey: bytes
|
||||
set_canned_message_module_messages: str
|
||||
set_channel: _channel_pb2.Channel
|
||||
set_config: _config_pb2.Config
|
||||
set_favorite_node: int
|
||||
set_fixed_position: _mesh_pb2.Position
|
||||
set_ham_mode: HamParameters
|
||||
set_ignored_node: int
|
||||
set_module_config: _module_config_pb2.ModuleConfig
|
||||
set_owner: _mesh_pb2.User
|
||||
set_ringtone_message: str
|
||||
set_scale: int
|
||||
set_time_only: int
|
||||
shutdown_seconds: int
|
||||
store_ui_config: _device_ui_pb2.DeviceUIConfig
|
||||
toggle_muted_node: int
|
||||
def __init__(self, session_passkey: _Optional[bytes] = ..., get_channel_request: _Optional[int] = ..., get_channel_response: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., get_owner_request: bool = ..., get_owner_response: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., get_config_request: _Optional[_Union[AdminMessage.ConfigType, str]] = ..., get_config_response: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., get_module_config_request: _Optional[_Union[AdminMessage.ModuleConfigType, str]] = ..., get_module_config_response: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., get_canned_message_module_messages_request: bool = ..., get_canned_message_module_messages_response: _Optional[str] = ..., get_device_metadata_request: bool = ..., get_device_metadata_response: _Optional[_Union[_mesh_pb2.DeviceMetadata, _Mapping]] = ..., get_ringtone_request: bool = ..., get_ringtone_response: _Optional[str] = ..., get_device_connection_status_request: bool = ..., get_device_connection_status_response: _Optional[_Union[_connection_status_pb2.DeviceConnectionStatus, _Mapping]] = ..., set_ham_mode: _Optional[_Union[HamParameters, _Mapping]] = ..., get_node_remote_hardware_pins_request: bool = ..., get_node_remote_hardware_pins_response: _Optional[_Union[NodeRemoteHardwarePinsResponse, _Mapping]] = ..., enter_dfu_mode_request: bool = ..., delete_file_request: _Optional[str] = ..., set_scale: _Optional[int] = ..., backup_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., restore_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., remove_backup_preferences: _Optional[_Union[AdminMessage.BackupLocation, str]] = ..., send_input_event: _Optional[_Union[AdminMessage.InputEvent, _Mapping]] = ..., set_owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., set_channel: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., set_config: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., set_module_config: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., set_canned_message_module_messages: _Optional[str] = ..., set_ringtone_message: _Optional[str] = ..., remove_by_nodenum: _Optional[int] = ..., set_favorite_node: _Optional[int] = ..., remove_favorite_node: _Optional[int] = ..., set_fixed_position: _Optional[_Union[_mesh_pb2.Position, _Mapping]] = ..., remove_fixed_position: bool = ..., set_time_only: _Optional[int] = ..., get_ui_config_request: bool = ..., get_ui_config_response: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., store_ui_config: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., set_ignored_node: _Optional[int] = ..., remove_ignored_node: _Optional[int] = ..., toggle_muted_node: _Optional[int] = ..., begin_edit_settings: bool = ..., commit_edit_settings: bool = ..., add_contact: _Optional[_Union[SharedContact, _Mapping]] = ..., key_verification: _Optional[_Union[KeyVerificationAdmin, _Mapping]] = ..., factory_reset_device: _Optional[int] = ..., reboot_ota_seconds: _Optional[int] = ..., exit_simulator: bool = ..., reboot_seconds: _Optional[int] = ..., shutdown_seconds: _Optional[int] = ..., factory_reset_config: _Optional[int] = ..., nodedb_reset: bool = ..., ota_request: _Optional[_Union[AdminMessage.OTAEvent, _Mapping]] = ..., sensor_config: _Optional[_Union[SensorConfig, _Mapping]] = ..., lockdown_auth: _Optional[_Union[LockdownAuth, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class HamParameters(_message.Message):
|
||||
__slots__ = ["call_sign", "frequency", "short_name", "tx_power"]
|
||||
CALL_SIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
|
||||
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
TX_POWER_FIELD_NUMBER: _ClassVar[int]
|
||||
call_sign: str
|
||||
frequency: float
|
||||
short_name: str
|
||||
tx_power: int
|
||||
def __init__(self, call_sign: _Optional[str] = ..., tx_power: _Optional[int] = ..., frequency: _Optional[float] = ..., short_name: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class KeyVerificationAdmin(_message.Message):
|
||||
__slots__ = ["message_type", "nonce", "remote_nodenum", "security_number"]
|
||||
class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
DO_NOT_VERIFY: KeyVerificationAdmin.MessageType
|
||||
DO_VERIFY: KeyVerificationAdmin.MessageType
|
||||
INITIATE_VERIFICATION: KeyVerificationAdmin.MessageType
|
||||
MESSAGE_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
PROVIDE_SECURITY_NUMBER: KeyVerificationAdmin.MessageType
|
||||
REMOTE_NODENUM_FIELD_NUMBER: _ClassVar[int]
|
||||
SECURITY_NUMBER_FIELD_NUMBER: _ClassVar[int]
|
||||
message_type: KeyVerificationAdmin.MessageType
|
||||
nonce: int
|
||||
remote_nodenum: int
|
||||
security_number: int
|
||||
def __init__(self, message_type: _Optional[_Union[KeyVerificationAdmin.MessageType, str]] = ..., remote_nodenum: _Optional[int] = ..., nonce: _Optional[int] = ..., security_number: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class LockdownAuth(_message.Message):
|
||||
__slots__ = ["boots_remaining", "lock_now", "passphrase", "valid_until_epoch"]
|
||||
BOOTS_REMAINING_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCK_NOW_FIELD_NUMBER: _ClassVar[int]
|
||||
PASSPHRASE_FIELD_NUMBER: _ClassVar[int]
|
||||
VALID_UNTIL_EPOCH_FIELD_NUMBER: _ClassVar[int]
|
||||
boots_remaining: int
|
||||
lock_now: bool
|
||||
passphrase: bytes
|
||||
valid_until_epoch: int
|
||||
def __init__(self, passphrase: _Optional[bytes] = ..., boots_remaining: _Optional[int] = ..., valid_until_epoch: _Optional[int] = ..., lock_now: bool = ...) -> None: ...
|
||||
|
||||
class NodeRemoteHardwarePinsResponse(_message.Message):
|
||||
__slots__ = ["node_remote_hardware_pins"]
|
||||
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _ClassVar[int]
|
||||
node_remote_hardware_pins: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.NodeRemoteHardwarePin]
|
||||
def __init__(self, node_remote_hardware_pins: _Optional[_Iterable[_Union[_mesh_pb2.NodeRemoteHardwarePin, _Mapping]]] = ...) -> None: ...
|
||||
|
||||
class SCD30_config(_message.Message):
|
||||
__slots__ = ["set_altitude", "set_asc", "set_measurement_interval", "set_target_co2_conc", "set_temperature", "soft_reset"]
|
||||
SET_ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_ASC_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_MEASUREMENT_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
|
||||
SOFT_RESET_FIELD_NUMBER: _ClassVar[int]
|
||||
set_altitude: int
|
||||
set_asc: bool
|
||||
set_measurement_interval: int
|
||||
set_target_co2_conc: int
|
||||
set_temperature: float
|
||||
soft_reset: bool
|
||||
def __init__(self, set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_temperature: _Optional[float] = ..., set_altitude: _Optional[int] = ..., set_measurement_interval: _Optional[int] = ..., soft_reset: bool = ...) -> None: ...
|
||||
|
||||
class SCD4X_config(_message.Message):
|
||||
__slots__ = ["factory_reset", "set_altitude", "set_ambient_pressure", "set_asc", "set_power_mode", "set_target_co2_conc", "set_temperature"]
|
||||
FACTORY_RESET_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_AMBIENT_PRESSURE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_ASC_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_POWER_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
|
||||
factory_reset: bool
|
||||
set_altitude: int
|
||||
set_ambient_pressure: int
|
||||
set_asc: bool
|
||||
set_power_mode: bool
|
||||
set_target_co2_conc: int
|
||||
set_temperature: float
|
||||
def __init__(self, set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_temperature: _Optional[float] = ..., set_altitude: _Optional[int] = ..., set_ambient_pressure: _Optional[int] = ..., factory_reset: bool = ..., set_power_mode: bool = ...) -> None: ...
|
||||
|
||||
class SEN5X_config(_message.Message):
|
||||
__slots__ = ["set_one_shot_mode", "set_temperature"]
|
||||
SET_ONE_SHOT_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
|
||||
set_one_shot_mode: bool
|
||||
set_temperature: float
|
||||
def __init__(self, set_temperature: _Optional[float] = ..., set_one_shot_mode: bool = ...) -> None: ...
|
||||
|
||||
class SHTXX_config(_message.Message):
|
||||
__slots__ = ["set_accuracy"]
|
||||
SET_ACCURACY_FIELD_NUMBER: _ClassVar[int]
|
||||
set_accuracy: int
|
||||
def __init__(self, set_accuracy: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class SensorConfig(_message.Message):
|
||||
__slots__ = ["scd30_config", "scd4x_config", "sen5x_config", "shtxx_config"]
|
||||
SCD30_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SCD4X_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SEN5X_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SHTXX_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
scd30_config: SCD30_config
|
||||
scd4x_config: SCD4X_config
|
||||
sen5x_config: SEN5X_config
|
||||
shtxx_config: SHTXX_config
|
||||
def __init__(self, scd4x_config: _Optional[_Union[SCD4X_config, _Mapping]] = ..., sen5x_config: _Optional[_Union[SEN5X_config, _Mapping]] = ..., scd30_config: _Optional[_Union[SCD30_config, _Mapping]] = ..., shtxx_config: _Optional[_Union[SHTXX_config, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class SharedContact(_message.Message):
|
||||
__slots__ = ["manually_verified", "node_num", "should_ignore", "user"]
|
||||
MANUALLY_VERIFIED_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
SHOULD_IGNORE_FIELD_NUMBER: _ClassVar[int]
|
||||
USER_FIELD_NUMBER: _ClassVar[int]
|
||||
manually_verified: bool
|
||||
node_num: int
|
||||
should_ignore: bool
|
||||
user: _mesh_pb2.User
|
||||
def __init__(self, node_num: _Optional[int] = ..., user: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., should_ignore: bool = ..., manually_verified: bool = ...) -> None: ...
|
||||
|
||||
class OTAMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,28 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/apponly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
|
||||
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/apponly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\"\x81\x01\n\nChannelSet\x12\x36\n\x08settings\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12;\n\x0blora_config\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigBc\n\x14org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.apponly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CHANNELSET._serialized_start=128
|
||||
_CHANNELSET._serialized_end=257
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,16 +0,0 @@
|
||||
from meshtastic.protobuf import channel_pb2 as _channel_pb2
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class ChannelSet(_message.Message):
|
||||
__slots__ = ["lora_config", "settings"]
|
||||
LORA_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
lora_config: _config_pb2.Config.LoRaConfig
|
||||
settings: _containers.RepeatedCompositeFieldContainer[_channel_pb2.ChannelSettings]
|
||||
def __init__(self, settings: _Optional[_Iterable[_Union[_channel_pb2.ChannelSettings, _Mapping]]] = ..., lora_config: _Optional[_Union[_config_pb2.Config.LoRaConfig, _Mapping]] = ...) -> None: ...
|
||||
File diff suppressed because one or more lines are too long
@@ -1,748 +0,0 @@
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
Blue: Team
|
||||
Brown: Team
|
||||
CotHow_Unspecified: CotHow
|
||||
CotHow_h_e: CotHow
|
||||
CotHow_h_g_i_g_o: CotHow
|
||||
CotHow_m_f: CotHow
|
||||
CotHow_m_g: CotHow
|
||||
CotHow_m_p: CotHow
|
||||
CotHow_m_r: CotHow
|
||||
CotHow_m_s: CotHow
|
||||
CotType_Other: CotType
|
||||
CotType_a_f_A: CotType
|
||||
CotType_a_f_A_C: CotType
|
||||
CotType_a_f_A_C_F: CotType
|
||||
CotType_a_f_A_C_H: CotType
|
||||
CotType_a_f_A_C_L: CotType
|
||||
CotType_a_f_A_M: CotType
|
||||
CotType_a_f_A_M_F: CotType
|
||||
CotType_a_f_A_M_F_C_H: CotType
|
||||
CotType_a_f_A_M_F_F: CotType
|
||||
CotType_a_f_A_M_F_L: CotType
|
||||
CotType_a_f_A_M_F_P: CotType
|
||||
CotType_a_f_A_M_F_U_L: CotType
|
||||
CotType_a_f_A_M_H: CotType
|
||||
CotType_a_f_A_M_H_A: CotType
|
||||
CotType_a_f_A_M_H_C: CotType
|
||||
CotType_a_f_A_M_H_Q: CotType
|
||||
CotType_a_f_A_M_H_U_M: CotType
|
||||
CotType_a_f_F_B: CotType
|
||||
CotType_a_f_G: CotType
|
||||
CotType_a_f_G_E: CotType
|
||||
CotType_a_f_G_E_S: CotType
|
||||
CotType_a_f_G_E_S_E: CotType
|
||||
CotType_a_f_G_E_V: CotType
|
||||
CotType_a_f_G_E_V_A: CotType
|
||||
CotType_a_f_G_E_V_A_T: CotType
|
||||
CotType_a_f_G_E_V_C: CotType
|
||||
CotType_a_f_G_E_V_C_U: CotType
|
||||
CotType_a_f_G_E_V_C_ps: CotType
|
||||
CotType_a_f_G_E_X_M: CotType
|
||||
CotType_a_f_G_I: CotType
|
||||
CotType_a_f_G_U: CotType
|
||||
CotType_a_f_G_U_C: CotType
|
||||
CotType_a_f_G_U_C_E_C_W: CotType
|
||||
CotType_a_f_G_U_C_F: CotType
|
||||
CotType_a_f_G_U_C_F_T_A: CotType
|
||||
CotType_a_f_G_U_C_I: CotType
|
||||
CotType_a_f_G_U_C_I_L: CotType
|
||||
CotType_a_f_G_U_C_I_Z: CotType
|
||||
CotType_a_f_G_U_C_I_d: CotType
|
||||
CotType_a_f_G_U_C_R_O: CotType
|
||||
CotType_a_f_G_U_C_R_V: CotType
|
||||
CotType_a_f_G_U_C_R_X: CotType
|
||||
CotType_a_f_G_U_C_V_S: CotType
|
||||
CotType_a_f_G_U_H: CotType
|
||||
CotType_a_f_G_U_S_M_C: CotType
|
||||
CotType_a_f_G_U_U_M_S_E: CotType
|
||||
CotType_a_f_S: CotType
|
||||
CotType_a_f_S_N_N_R: CotType
|
||||
CotType_a_h_A: CotType
|
||||
CotType_a_h_A_M_F_F: CotType
|
||||
CotType_a_h_A_M_H_A: CotType
|
||||
CotType_a_h_G: CotType
|
||||
CotType_a_h_G_E_V: CotType
|
||||
CotType_a_h_G_E_V_A_T: CotType
|
||||
CotType_a_h_G_E_X_M: CotType
|
||||
CotType_a_h_G_I: CotType
|
||||
CotType_a_h_G_U_C_F: CotType
|
||||
CotType_a_h_G_U_C_I: CotType
|
||||
CotType_a_h_G_U_C_I_d: CotType
|
||||
CotType_a_h_S: CotType
|
||||
CotType_a_n_A: CotType
|
||||
CotType_a_n_A_C: CotType
|
||||
CotType_a_n_A_C_F: CotType
|
||||
CotType_a_n_A_C_H: CotType
|
||||
CotType_a_n_A_M_F_F: CotType
|
||||
CotType_a_n_A_M_F_Q: CotType
|
||||
CotType_a_n_G: CotType
|
||||
CotType_a_n_G_E_V: CotType
|
||||
CotType_a_n_G_E_V_A_T: CotType
|
||||
CotType_a_n_G_E_X_M: CotType
|
||||
CotType_a_n_G_I: CotType
|
||||
CotType_a_n_G_U_C_F: CotType
|
||||
CotType_a_n_G_U_C_I: CotType
|
||||
CotType_a_n_G_U_C_I_d: CotType
|
||||
CotType_a_n_S: CotType
|
||||
CotType_a_u_A: CotType
|
||||
CotType_a_u_A_C: CotType
|
||||
CotType_a_u_A_C_F: CotType
|
||||
CotType_a_u_G: CotType
|
||||
CotType_a_u_G_E_V: CotType
|
||||
CotType_a_u_G_E_V_A_T: CotType
|
||||
CotType_a_u_G_E_X_M: CotType
|
||||
CotType_a_u_G_I: CotType
|
||||
CotType_a_u_G_U_C_F: CotType
|
||||
CotType_a_u_G_U_C_I: CotType
|
||||
CotType_a_u_G_U_C_I_d: CotType
|
||||
CotType_a_u_S: CotType
|
||||
CotType_b_a_g: CotType
|
||||
CotType_b_a_o_c: CotType
|
||||
CotType_b_a_o_can: CotType
|
||||
CotType_b_a_o_opn: CotType
|
||||
CotType_b_a_o_pan: CotType
|
||||
CotType_b_a_o_tbl: CotType
|
||||
CotType_b_f_t_a: CotType
|
||||
CotType_b_f_t_r: CotType
|
||||
CotType_b_i_v: CotType
|
||||
CotType_b_i_x_i: CotType
|
||||
CotType_b_m_p_c: CotType
|
||||
CotType_b_m_p_c_cp: CotType
|
||||
CotType_b_m_p_c_ip: CotType
|
||||
CotType_b_m_p_s_m: CotType
|
||||
CotType_b_m_p_s_p_i: CotType
|
||||
CotType_b_m_p_s_p_loc: CotType
|
||||
CotType_b_m_p_s_p_op: CotType
|
||||
CotType_b_m_p_w: CotType
|
||||
CotType_b_m_p_w_GOTO: CotType
|
||||
CotType_b_m_r: CotType
|
||||
CotType_b_r_f_h_c: CotType
|
||||
CotType_b_t_f: CotType
|
||||
CotType_b_t_f_d: CotType
|
||||
CotType_b_t_f_r: CotType
|
||||
CotType_m_t_t: CotType
|
||||
CotType_t_s: CotType
|
||||
CotType_t_x_d_d: CotType
|
||||
CotType_u_d_c_c: CotType
|
||||
CotType_u_d_c_e: CotType
|
||||
CotType_u_d_f: CotType
|
||||
CotType_u_d_f_m: CotType
|
||||
CotType_u_d_p: CotType
|
||||
CotType_u_d_r: CotType
|
||||
CotType_u_d_v: CotType
|
||||
CotType_u_d_v_m: CotType
|
||||
CotType_u_r_b_bullseye: CotType
|
||||
CotType_u_r_b_c_c: CotType
|
||||
CotType_u_rb_a: CotType
|
||||
CotType_y: CotType
|
||||
Cyan: Team
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
Dark_Blue: Team
|
||||
Dark_Green: Team
|
||||
ForwardObserver: MemberRole
|
||||
GeoPointSource_GPS: GeoPointSource
|
||||
GeoPointSource_NETWORK: GeoPointSource
|
||||
GeoPointSource_USER: GeoPointSource
|
||||
GeoPointSource_Unspecified: GeoPointSource
|
||||
Green: Team
|
||||
HQ: MemberRole
|
||||
K9: MemberRole
|
||||
Magenta: Team
|
||||
Maroon: Team
|
||||
Medic: MemberRole
|
||||
Orange: Team
|
||||
Purple: Team
|
||||
RTO: MemberRole
|
||||
Red: Team
|
||||
Sniper: MemberRole
|
||||
Teal: Team
|
||||
TeamLead: MemberRole
|
||||
TeamMember: MemberRole
|
||||
Unspecifed: MemberRole
|
||||
Unspecifed_Color: Team
|
||||
White: Team
|
||||
Yellow: Team
|
||||
|
||||
class AircraftTrack(_message.Message):
|
||||
__slots__ = ["aircraft_type", "category", "cot_host_id", "flight", "gps", "icao", "registration", "rssi_x10", "squawk"]
|
||||
AIRCRAFT_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
CATEGORY_FIELD_NUMBER: _ClassVar[int]
|
||||
COT_HOST_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
FLIGHT_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_FIELD_NUMBER: _ClassVar[int]
|
||||
ICAO_FIELD_NUMBER: _ClassVar[int]
|
||||
REGISTRATION_FIELD_NUMBER: _ClassVar[int]
|
||||
RSSI_X10_FIELD_NUMBER: _ClassVar[int]
|
||||
SQUAWK_FIELD_NUMBER: _ClassVar[int]
|
||||
aircraft_type: str
|
||||
category: str
|
||||
cot_host_id: str
|
||||
flight: str
|
||||
gps: bool
|
||||
icao: str
|
||||
registration: str
|
||||
rssi_x10: int
|
||||
squawk: int
|
||||
def __init__(self, icao: _Optional[str] = ..., registration: _Optional[str] = ..., flight: _Optional[str] = ..., aircraft_type: _Optional[str] = ..., squawk: _Optional[int] = ..., category: _Optional[str] = ..., rssi_x10: _Optional[int] = ..., gps: bool = ..., cot_host_id: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class CasevacReport(_message.Message):
|
||||
__slots__ = ["ambulatory_patients", "child", "convenience_count", "enemy", "epw", "equipment_detail", "equipment_flags", "frequency", "friendlies", "hlz_marking", "hlz_remarks", "litter_patients", "marked_by", "medline_remarks", "non_us_civilian", "non_us_military", "obstacles", "precedence", "priority_count", "routine_count", "security", "terrain_flags", "terrain_other_detail", "terrain_slope_dir", "title", "urgent_count", "urgent_surgical_count", "us_civilian", "us_military", "winds_are_from", "zmist", "zone_marker", "zone_protected_coord"]
|
||||
class HlzMarking(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Precedence(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Security(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
AMBULATORY_PATIENTS_FIELD_NUMBER: _ClassVar[int]
|
||||
CHILD_FIELD_NUMBER: _ClassVar[int]
|
||||
CONVENIENCE_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
ENEMY_FIELD_NUMBER: _ClassVar[int]
|
||||
EPW_FIELD_NUMBER: _ClassVar[int]
|
||||
EQUIPMENT_DETAIL_FIELD_NUMBER: _ClassVar[int]
|
||||
EQUIPMENT_FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
|
||||
FRIENDLIES_FIELD_NUMBER: _ClassVar[int]
|
||||
HLZ_MARKING_FIELD_NUMBER: _ClassVar[int]
|
||||
HLZ_REMARKS_FIELD_NUMBER: _ClassVar[int]
|
||||
HlzMarking_None: CasevacReport.HlzMarking
|
||||
HlzMarking_Other: CasevacReport.HlzMarking
|
||||
HlzMarking_Panels: CasevacReport.HlzMarking
|
||||
HlzMarking_PyroSignal: CasevacReport.HlzMarking
|
||||
HlzMarking_Smoke: CasevacReport.HlzMarking
|
||||
HlzMarking_Unspecified: CasevacReport.HlzMarking
|
||||
LITTER_PATIENTS_FIELD_NUMBER: _ClassVar[int]
|
||||
MARKED_BY_FIELD_NUMBER: _ClassVar[int]
|
||||
MEDLINE_REMARKS_FIELD_NUMBER: _ClassVar[int]
|
||||
NON_US_CIVILIAN_FIELD_NUMBER: _ClassVar[int]
|
||||
NON_US_MILITARY_FIELD_NUMBER: _ClassVar[int]
|
||||
OBSTACLES_FIELD_NUMBER: _ClassVar[int]
|
||||
PRECEDENCE_FIELD_NUMBER: _ClassVar[int]
|
||||
PRIORITY_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
Precedence_Convenience: CasevacReport.Precedence
|
||||
Precedence_Priority: CasevacReport.Precedence
|
||||
Precedence_Routine: CasevacReport.Precedence
|
||||
Precedence_Unspecified: CasevacReport.Precedence
|
||||
Precedence_Urgent: CasevacReport.Precedence
|
||||
Precedence_UrgentSurgical: CasevacReport.Precedence
|
||||
ROUTINE_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
SECURITY_FIELD_NUMBER: _ClassVar[int]
|
||||
Security_EnemyInArea: CasevacReport.Security
|
||||
Security_EnemyInArmedContact: CasevacReport.Security
|
||||
Security_NoEnemy: CasevacReport.Security
|
||||
Security_PossibleEnemy: CasevacReport.Security
|
||||
Security_Unspecified: CasevacReport.Security
|
||||
TERRAIN_FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
TERRAIN_OTHER_DETAIL_FIELD_NUMBER: _ClassVar[int]
|
||||
TERRAIN_SLOPE_DIR_FIELD_NUMBER: _ClassVar[int]
|
||||
TITLE_FIELD_NUMBER: _ClassVar[int]
|
||||
URGENT_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
URGENT_SURGICAL_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
US_CIVILIAN_FIELD_NUMBER: _ClassVar[int]
|
||||
US_MILITARY_FIELD_NUMBER: _ClassVar[int]
|
||||
WINDS_ARE_FROM_FIELD_NUMBER: _ClassVar[int]
|
||||
ZMIST_FIELD_NUMBER: _ClassVar[int]
|
||||
ZONE_MARKER_FIELD_NUMBER: _ClassVar[int]
|
||||
ZONE_PROTECTED_COORD_FIELD_NUMBER: _ClassVar[int]
|
||||
ambulatory_patients: int
|
||||
child: int
|
||||
convenience_count: int
|
||||
enemy: str
|
||||
epw: int
|
||||
equipment_detail: str
|
||||
equipment_flags: int
|
||||
frequency: str
|
||||
friendlies: str
|
||||
hlz_marking: CasevacReport.HlzMarking
|
||||
hlz_remarks: str
|
||||
litter_patients: int
|
||||
marked_by: str
|
||||
medline_remarks: str
|
||||
non_us_civilian: int
|
||||
non_us_military: int
|
||||
obstacles: str
|
||||
precedence: CasevacReport.Precedence
|
||||
priority_count: int
|
||||
routine_count: int
|
||||
security: CasevacReport.Security
|
||||
terrain_flags: int
|
||||
terrain_other_detail: str
|
||||
terrain_slope_dir: str
|
||||
title: str
|
||||
urgent_count: int
|
||||
urgent_surgical_count: int
|
||||
us_civilian: int
|
||||
us_military: int
|
||||
winds_are_from: str
|
||||
zmist: _containers.RepeatedCompositeFieldContainer[ZMistEntry]
|
||||
zone_marker: str
|
||||
zone_protected_coord: str
|
||||
def __init__(self, precedence: _Optional[_Union[CasevacReport.Precedence, str]] = ..., equipment_flags: _Optional[int] = ..., litter_patients: _Optional[int] = ..., ambulatory_patients: _Optional[int] = ..., security: _Optional[_Union[CasevacReport.Security, str]] = ..., hlz_marking: _Optional[_Union[CasevacReport.HlzMarking, str]] = ..., zone_marker: _Optional[str] = ..., us_military: _Optional[int] = ..., us_civilian: _Optional[int] = ..., non_us_military: _Optional[int] = ..., non_us_civilian: _Optional[int] = ..., epw: _Optional[int] = ..., child: _Optional[int] = ..., terrain_flags: _Optional[int] = ..., frequency: _Optional[str] = ..., title: _Optional[str] = ..., medline_remarks: _Optional[str] = ..., urgent_count: _Optional[int] = ..., urgent_surgical_count: _Optional[int] = ..., priority_count: _Optional[int] = ..., routine_count: _Optional[int] = ..., convenience_count: _Optional[int] = ..., equipment_detail: _Optional[str] = ..., zone_protected_coord: _Optional[str] = ..., terrain_slope_dir: _Optional[str] = ..., terrain_other_detail: _Optional[str] = ..., marked_by: _Optional[str] = ..., obstacles: _Optional[str] = ..., winds_are_from: _Optional[str] = ..., friendlies: _Optional[str] = ..., enemy: _Optional[str] = ..., hlz_remarks: _Optional[str] = ..., zmist: _Optional[_Iterable[_Union[ZMistEntry, _Mapping]]] = ...) -> None: ...
|
||||
|
||||
class Contact(_message.Message):
|
||||
__slots__ = ["callsign", "device_callsign"]
|
||||
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
callsign: str
|
||||
device_callsign: str
|
||||
def __init__(self, callsign: _Optional[str] = ..., device_callsign: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class CotGeoPoint(_message.Message):
|
||||
__slots__ = ["lat_delta_i", "lon_delta_i"]
|
||||
LAT_DELTA_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LON_DELTA_I_FIELD_NUMBER: _ClassVar[int]
|
||||
lat_delta_i: int
|
||||
lon_delta_i: int
|
||||
def __init__(self, lat_delta_i: _Optional[int] = ..., lon_delta_i: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class DrawnShape(_message.Message):
|
||||
__slots__ = ["angle_deg", "bullseye_bearing_ref", "bullseye_distance_dm", "bullseye_flags", "bullseye_uid_ref", "fill_argb", "fill_color", "kind", "labels_on", "major_cm", "minor_cm", "stroke_argb", "stroke_color", "stroke_weight_x10", "style", "truncated", "vertices"]
|
||||
class Kind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class StyleMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ANGLE_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
BULLSEYE_BEARING_REF_FIELD_NUMBER: _ClassVar[int]
|
||||
BULLSEYE_DISTANCE_DM_FIELD_NUMBER: _ClassVar[int]
|
||||
BULLSEYE_FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
BULLSEYE_UID_REF_FIELD_NUMBER: _ClassVar[int]
|
||||
FILL_ARGB_FIELD_NUMBER: _ClassVar[int]
|
||||
FILL_COLOR_FIELD_NUMBER: _ClassVar[int]
|
||||
KIND_FIELD_NUMBER: _ClassVar[int]
|
||||
Kind_Bullseye: DrawnShape.Kind
|
||||
Kind_Circle: DrawnShape.Kind
|
||||
Kind_Ellipse: DrawnShape.Kind
|
||||
Kind_Freeform: DrawnShape.Kind
|
||||
Kind_Polygon: DrawnShape.Kind
|
||||
Kind_RangingCircle: DrawnShape.Kind
|
||||
Kind_Rectangle: DrawnShape.Kind
|
||||
Kind_Telestration: DrawnShape.Kind
|
||||
Kind_Unspecified: DrawnShape.Kind
|
||||
Kind_Vehicle2D: DrawnShape.Kind
|
||||
Kind_Vehicle3D: DrawnShape.Kind
|
||||
LABELS_ON_FIELD_NUMBER: _ClassVar[int]
|
||||
MAJOR_CM_FIELD_NUMBER: _ClassVar[int]
|
||||
MINOR_CM_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_ARGB_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_COLOR_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
|
||||
STYLE_FIELD_NUMBER: _ClassVar[int]
|
||||
StyleMode_FillOnly: DrawnShape.StyleMode
|
||||
StyleMode_StrokeAndFill: DrawnShape.StyleMode
|
||||
StyleMode_StrokeOnly: DrawnShape.StyleMode
|
||||
StyleMode_Unspecified: DrawnShape.StyleMode
|
||||
TRUNCATED_FIELD_NUMBER: _ClassVar[int]
|
||||
VERTICES_FIELD_NUMBER: _ClassVar[int]
|
||||
angle_deg: int
|
||||
bullseye_bearing_ref: int
|
||||
bullseye_distance_dm: int
|
||||
bullseye_flags: int
|
||||
bullseye_uid_ref: str
|
||||
fill_argb: int
|
||||
fill_color: Team
|
||||
kind: DrawnShape.Kind
|
||||
labels_on: bool
|
||||
major_cm: int
|
||||
minor_cm: int
|
||||
stroke_argb: int
|
||||
stroke_color: Team
|
||||
stroke_weight_x10: int
|
||||
style: DrawnShape.StyleMode
|
||||
truncated: bool
|
||||
vertices: _containers.RepeatedCompositeFieldContainer[CotGeoPoint]
|
||||
def __init__(self, kind: _Optional[_Union[DrawnShape.Kind, str]] = ..., style: _Optional[_Union[DrawnShape.StyleMode, str]] = ..., major_cm: _Optional[int] = ..., minor_cm: _Optional[int] = ..., angle_deg: _Optional[int] = ..., stroke_color: _Optional[_Union[Team, str]] = ..., stroke_argb: _Optional[int] = ..., stroke_weight_x10: _Optional[int] = ..., fill_color: _Optional[_Union[Team, str]] = ..., fill_argb: _Optional[int] = ..., labels_on: bool = ..., vertices: _Optional[_Iterable[_Union[CotGeoPoint, _Mapping]]] = ..., truncated: bool = ..., bullseye_distance_dm: _Optional[int] = ..., bullseye_bearing_ref: _Optional[int] = ..., bullseye_flags: _Optional[int] = ..., bullseye_uid_ref: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class EmergencyAlert(_message.Message):
|
||||
__slots__ = ["authoring_uid", "cancel_reference_uid", "type"]
|
||||
class Type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
AUTHORING_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
CANCEL_REFERENCE_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
Type_Alert911: EmergencyAlert.Type
|
||||
Type_Cancel: EmergencyAlert.Type
|
||||
Type_Custom: EmergencyAlert.Type
|
||||
Type_GeoFenceBreached: EmergencyAlert.Type
|
||||
Type_InContact: EmergencyAlert.Type
|
||||
Type_RingTheBell: EmergencyAlert.Type
|
||||
Type_Unspecified: EmergencyAlert.Type
|
||||
authoring_uid: str
|
||||
cancel_reference_uid: str
|
||||
type: EmergencyAlert.Type
|
||||
def __init__(self, type: _Optional[_Union[EmergencyAlert.Type, str]] = ..., authoring_uid: _Optional[str] = ..., cancel_reference_uid: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class GeoChat(_message.Message):
|
||||
__slots__ = ["lang", "message", "receipt_for_uid", "receipt_type", "room_id", "to", "to_callsign", "voice_profile_id"]
|
||||
class ReceiptType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
LANG_FIELD_NUMBER: _ClassVar[int]
|
||||
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
RECEIPT_FOR_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
RECEIPT_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
ROOM_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
ReceiptType_Delivered: GeoChat.ReceiptType
|
||||
ReceiptType_None: GeoChat.ReceiptType
|
||||
ReceiptType_Read: GeoChat.ReceiptType
|
||||
TO_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
TO_FIELD_NUMBER: _ClassVar[int]
|
||||
VOICE_PROFILE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
lang: str
|
||||
message: str
|
||||
receipt_for_uid: str
|
||||
receipt_type: GeoChat.ReceiptType
|
||||
room_id: str
|
||||
to: str
|
||||
to_callsign: str
|
||||
voice_profile_id: str
|
||||
def __init__(self, message: _Optional[str] = ..., to: _Optional[str] = ..., to_callsign: _Optional[str] = ..., receipt_for_uid: _Optional[str] = ..., receipt_type: _Optional[_Union[GeoChat.ReceiptType, str]] = ..., lang: _Optional[str] = ..., room_id: _Optional[str] = ..., voice_profile_id: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class Group(_message.Message):
|
||||
__slots__ = ["role", "team"]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
TEAM_FIELD_NUMBER: _ClassVar[int]
|
||||
role: MemberRole
|
||||
team: Team
|
||||
def __init__(self, role: _Optional[_Union[MemberRole, str]] = ..., team: _Optional[_Union[Team, str]] = ...) -> None: ...
|
||||
|
||||
class Marker(_message.Message):
|
||||
__slots__ = ["color", "color_argb", "iconset", "kind", "parent_callsign", "parent_type", "parent_uid", "readiness"]
|
||||
class Kind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
COLOR_ARGB_FIELD_NUMBER: _ClassVar[int]
|
||||
COLOR_FIELD_NUMBER: _ClassVar[int]
|
||||
ICONSET_FIELD_NUMBER: _ClassVar[int]
|
||||
KIND_FIELD_NUMBER: _ClassVar[int]
|
||||
Kind_Checkpoint: Marker.Kind
|
||||
Kind_ContactPoint: Marker.Kind
|
||||
Kind_CustomIcon: Marker.Kind
|
||||
Kind_GoToPoint: Marker.Kind
|
||||
Kind_ImageMarker: Marker.Kind
|
||||
Kind_InitialPoint: Marker.Kind
|
||||
Kind_ObservationPost: Marker.Kind
|
||||
Kind_SelfPosition: Marker.Kind
|
||||
Kind_Spot: Marker.Kind
|
||||
Kind_SpotMap: Marker.Kind
|
||||
Kind_Symbol2525: Marker.Kind
|
||||
Kind_Unspecified: Marker.Kind
|
||||
Kind_Waypoint: Marker.Kind
|
||||
PARENT_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
PARENT_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
PARENT_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
READINESS_FIELD_NUMBER: _ClassVar[int]
|
||||
color: Team
|
||||
color_argb: int
|
||||
iconset: str
|
||||
kind: Marker.Kind
|
||||
parent_callsign: str
|
||||
parent_type: str
|
||||
parent_uid: str
|
||||
readiness: bool
|
||||
def __init__(self, kind: _Optional[_Union[Marker.Kind, str]] = ..., color: _Optional[_Union[Team, str]] = ..., color_argb: _Optional[int] = ..., readiness: bool = ..., parent_uid: _Optional[str] = ..., parent_type: _Optional[str] = ..., parent_callsign: _Optional[str] = ..., iconset: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class PLI(_message.Message):
|
||||
__slots__ = ["altitude", "course", "latitude_i", "longitude_i", "speed"]
|
||||
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
COURSE_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
SPEED_FIELD_NUMBER: _ClassVar[int]
|
||||
altitude: int
|
||||
course: int
|
||||
latitude_i: int
|
||||
longitude_i: int
|
||||
speed: int
|
||||
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., speed: _Optional[int] = ..., course: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class RangeAndBearing(_message.Message):
|
||||
__slots__ = ["anchor", "anchor_uid", "bearing_cdeg", "range_cm", "stroke_argb", "stroke_color", "stroke_weight_x10"]
|
||||
ANCHOR_FIELD_NUMBER: _ClassVar[int]
|
||||
ANCHOR_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
BEARING_CDEG_FIELD_NUMBER: _ClassVar[int]
|
||||
RANGE_CM_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_ARGB_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_COLOR_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
|
||||
anchor: CotGeoPoint
|
||||
anchor_uid: str
|
||||
bearing_cdeg: int
|
||||
range_cm: int
|
||||
stroke_argb: int
|
||||
stroke_color: Team
|
||||
stroke_weight_x10: int
|
||||
def __init__(self, anchor: _Optional[_Union[CotGeoPoint, _Mapping]] = ..., anchor_uid: _Optional[str] = ..., range_cm: _Optional[int] = ..., bearing_cdeg: _Optional[int] = ..., stroke_color: _Optional[_Union[Team, str]] = ..., stroke_argb: _Optional[int] = ..., stroke_weight_x10: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class Route(_message.Message):
|
||||
__slots__ = ["direction", "links", "method", "prefix", "stroke_weight_x10", "truncated"]
|
||||
class Direction(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Method(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Link(_message.Message):
|
||||
__slots__ = ["callsign", "link_type", "point", "uid"]
|
||||
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
LINK_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
POINT_FIELD_NUMBER: _ClassVar[int]
|
||||
UID_FIELD_NUMBER: _ClassVar[int]
|
||||
callsign: str
|
||||
link_type: int
|
||||
point: CotGeoPoint
|
||||
uid: str
|
||||
def __init__(self, point: _Optional[_Union[CotGeoPoint, _Mapping]] = ..., uid: _Optional[str] = ..., callsign: _Optional[str] = ..., link_type: _Optional[int] = ...) -> None: ...
|
||||
DIRECTION_FIELD_NUMBER: _ClassVar[int]
|
||||
Direction_Exfil: Route.Direction
|
||||
Direction_Infil: Route.Direction
|
||||
Direction_Unspecified: Route.Direction
|
||||
LINKS_FIELD_NUMBER: _ClassVar[int]
|
||||
METHOD_FIELD_NUMBER: _ClassVar[int]
|
||||
Method_Driving: Route.Method
|
||||
Method_Flying: Route.Method
|
||||
Method_Swimming: Route.Method
|
||||
Method_Unspecified: Route.Method
|
||||
Method_Walking: Route.Method
|
||||
Method_Watercraft: Route.Method
|
||||
PREFIX_FIELD_NUMBER: _ClassVar[int]
|
||||
STROKE_WEIGHT_X10_FIELD_NUMBER: _ClassVar[int]
|
||||
TRUNCATED_FIELD_NUMBER: _ClassVar[int]
|
||||
direction: Route.Direction
|
||||
links: _containers.RepeatedCompositeFieldContainer[Route.Link]
|
||||
method: Route.Method
|
||||
prefix: str
|
||||
stroke_weight_x10: int
|
||||
truncated: bool
|
||||
def __init__(self, method: _Optional[_Union[Route.Method, str]] = ..., direction: _Optional[_Union[Route.Direction, str]] = ..., prefix: _Optional[str] = ..., stroke_weight_x10: _Optional[int] = ..., links: _Optional[_Iterable[_Union[Route.Link, _Mapping]]] = ..., truncated: bool = ...) -> None: ...
|
||||
|
||||
class SensorFov(_message.Message):
|
||||
__slots__ = ["azimuth_deg", "elevation_deg", "fov_horizontal_deg", "fov_vertical_deg", "model", "range_m", "roll_deg", "type"]
|
||||
class SensorType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
AZIMUTH_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
ELEVATION_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
FOV_HORIZONTAL_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
FOV_VERTICAL_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
MODEL_FIELD_NUMBER: _ClassVar[int]
|
||||
RANGE_M_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLL_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
SensorType_Camera: SensorFov.SensorType
|
||||
SensorType_Laser: SensorFov.SensorType
|
||||
SensorType_Nvg: SensorFov.SensorType
|
||||
SensorType_Other: SensorFov.SensorType
|
||||
SensorType_Rf: SensorFov.SensorType
|
||||
SensorType_Thermal: SensorFov.SensorType
|
||||
SensorType_Unspecified: SensorFov.SensorType
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
azimuth_deg: int
|
||||
elevation_deg: int
|
||||
fov_horizontal_deg: int
|
||||
fov_vertical_deg: int
|
||||
model: str
|
||||
range_m: int
|
||||
roll_deg: int
|
||||
type: SensorFov.SensorType
|
||||
def __init__(self, type: _Optional[_Union[SensorFov.SensorType, str]] = ..., azimuth_deg: _Optional[int] = ..., range_m: _Optional[int] = ..., fov_horizontal_deg: _Optional[int] = ..., fov_vertical_deg: _Optional[int] = ..., elevation_deg: _Optional[int] = ..., roll_deg: _Optional[int] = ..., model: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class Status(_message.Message):
|
||||
__slots__ = ["battery"]
|
||||
BATTERY_FIELD_NUMBER: _ClassVar[int]
|
||||
battery: int
|
||||
def __init__(self, battery: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class TAKEnvironment(_message.Message):
|
||||
__slots__ = ["temperature_c_x10", "wind_direction_deg", "wind_speed_cm_s"]
|
||||
TEMPERATURE_C_X10_FIELD_NUMBER: _ClassVar[int]
|
||||
WIND_DIRECTION_DEG_FIELD_NUMBER: _ClassVar[int]
|
||||
WIND_SPEED_CM_S_FIELD_NUMBER: _ClassVar[int]
|
||||
temperature_c_x10: int
|
||||
wind_direction_deg: int
|
||||
wind_speed_cm_s: int
|
||||
def __init__(self, temperature_c_x10: _Optional[int] = ..., wind_direction_deg: _Optional[int] = ..., wind_speed_cm_s: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class TAKPacket(_message.Message):
|
||||
__slots__ = ["chat", "contact", "detail", "group", "is_compressed", "pli", "status"]
|
||||
CHAT_FIELD_NUMBER: _ClassVar[int]
|
||||
CONTACT_FIELD_NUMBER: _ClassVar[int]
|
||||
DETAIL_FIELD_NUMBER: _ClassVar[int]
|
||||
GROUP_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_COMPRESSED_FIELD_NUMBER: _ClassVar[int]
|
||||
PLI_FIELD_NUMBER: _ClassVar[int]
|
||||
STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
chat: GeoChat
|
||||
contact: Contact
|
||||
detail: bytes
|
||||
group: Group
|
||||
is_compressed: bool
|
||||
pli: PLI
|
||||
status: Status
|
||||
def __init__(self, is_compressed: bool = ..., contact: _Optional[_Union[Contact, _Mapping]] = ..., group: _Optional[_Union[Group, _Mapping]] = ..., status: _Optional[_Union[Status, _Mapping]] = ..., pli: _Optional[_Union[PLI, _Mapping]] = ..., chat: _Optional[_Union[GeoChat, _Mapping]] = ..., detail: _Optional[bytes] = ...) -> None: ...
|
||||
|
||||
class TAKPacketV2(_message.Message):
|
||||
__slots__ = ["aircraft", "alt_src", "altitude", "battery", "callsign", "casevac", "chat", "cot_type_id", "cot_type_str", "course", "device_callsign", "emergency", "endpoint", "environment", "geo_src", "how", "latitude_i", "longitude_i", "marker", "phone", "pli", "rab", "raw_detail", "remarks", "role", "route", "sensor_fov", "shape", "speed", "stale_seconds", "tak_device", "tak_os", "tak_platform", "tak_version", "taktalk", "taktalk_room", "task", "team", "uid"]
|
||||
AIRCRAFT_FIELD_NUMBER: _ClassVar[int]
|
||||
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALT_SRC_FIELD_NUMBER: _ClassVar[int]
|
||||
BATTERY_FIELD_NUMBER: _ClassVar[int]
|
||||
CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
CASEVAC_FIELD_NUMBER: _ClassVar[int]
|
||||
CHAT_FIELD_NUMBER: _ClassVar[int]
|
||||
COT_TYPE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
COT_TYPE_STR_FIELD_NUMBER: _ClassVar[int]
|
||||
COURSE_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
EMERGENCY_FIELD_NUMBER: _ClassVar[int]
|
||||
ENDPOINT_FIELD_NUMBER: _ClassVar[int]
|
||||
ENVIRONMENT_FIELD_NUMBER: _ClassVar[int]
|
||||
GEO_SRC_FIELD_NUMBER: _ClassVar[int]
|
||||
HOW_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
MARKER_FIELD_NUMBER: _ClassVar[int]
|
||||
PHONE_FIELD_NUMBER: _ClassVar[int]
|
||||
PLI_FIELD_NUMBER: _ClassVar[int]
|
||||
RAB_FIELD_NUMBER: _ClassVar[int]
|
||||
RAW_DETAIL_FIELD_NUMBER: _ClassVar[int]
|
||||
REMARKS_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
ROUTE_FIELD_NUMBER: _ClassVar[int]
|
||||
SENSOR_FOV_FIELD_NUMBER: _ClassVar[int]
|
||||
SHAPE_FIELD_NUMBER: _ClassVar[int]
|
||||
SPEED_FIELD_NUMBER: _ClassVar[int]
|
||||
STALE_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
TAKTALK_FIELD_NUMBER: _ClassVar[int]
|
||||
TAKTALK_ROOM_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_DEVICE_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_OS_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_PLATFORM_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
TASK_FIELD_NUMBER: _ClassVar[int]
|
||||
TEAM_FIELD_NUMBER: _ClassVar[int]
|
||||
UID_FIELD_NUMBER: _ClassVar[int]
|
||||
aircraft: AircraftTrack
|
||||
alt_src: GeoPointSource
|
||||
altitude: int
|
||||
battery: int
|
||||
callsign: str
|
||||
casevac: CasevacReport
|
||||
chat: GeoChat
|
||||
cot_type_id: CotType
|
||||
cot_type_str: str
|
||||
course: int
|
||||
device_callsign: str
|
||||
emergency: EmergencyAlert
|
||||
endpoint: str
|
||||
environment: TAKEnvironment
|
||||
geo_src: GeoPointSource
|
||||
how: CotHow
|
||||
latitude_i: int
|
||||
longitude_i: int
|
||||
marker: Marker
|
||||
phone: str
|
||||
pli: bool
|
||||
rab: RangeAndBearing
|
||||
raw_detail: bytes
|
||||
remarks: str
|
||||
role: MemberRole
|
||||
route: Route
|
||||
sensor_fov: SensorFov
|
||||
shape: DrawnShape
|
||||
speed: int
|
||||
stale_seconds: int
|
||||
tak_device: str
|
||||
tak_os: str
|
||||
tak_platform: str
|
||||
tak_version: str
|
||||
taktalk: TakTalkMessage
|
||||
taktalk_room: TakTalkRoomData
|
||||
task: TaskRequest
|
||||
team: Team
|
||||
uid: str
|
||||
def __init__(self, cot_type_id: _Optional[_Union[CotType, str]] = ..., how: _Optional[_Union[CotHow, str]] = ..., callsign: _Optional[str] = ..., team: _Optional[_Union[Team, str]] = ..., role: _Optional[_Union[MemberRole, str]] = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., speed: _Optional[int] = ..., course: _Optional[int] = ..., battery: _Optional[int] = ..., geo_src: _Optional[_Union[GeoPointSource, str]] = ..., alt_src: _Optional[_Union[GeoPointSource, str]] = ..., uid: _Optional[str] = ..., device_callsign: _Optional[str] = ..., stale_seconds: _Optional[int] = ..., tak_version: _Optional[str] = ..., tak_device: _Optional[str] = ..., tak_platform: _Optional[str] = ..., tak_os: _Optional[str] = ..., endpoint: _Optional[str] = ..., phone: _Optional[str] = ..., cot_type_str: _Optional[str] = ..., remarks: _Optional[str] = ..., environment: _Optional[_Union[TAKEnvironment, _Mapping]] = ..., sensor_fov: _Optional[_Union[SensorFov, _Mapping]] = ..., pli: bool = ..., chat: _Optional[_Union[GeoChat, _Mapping]] = ..., aircraft: _Optional[_Union[AircraftTrack, _Mapping]] = ..., raw_detail: _Optional[bytes] = ..., shape: _Optional[_Union[DrawnShape, _Mapping]] = ..., marker: _Optional[_Union[Marker, _Mapping]] = ..., rab: _Optional[_Union[RangeAndBearing, _Mapping]] = ..., route: _Optional[_Union[Route, _Mapping]] = ..., casevac: _Optional[_Union[CasevacReport, _Mapping]] = ..., emergency: _Optional[_Union[EmergencyAlert, _Mapping]] = ..., task: _Optional[_Union[TaskRequest, _Mapping]] = ..., taktalk: _Optional[_Union[TakTalkMessage, _Mapping]] = ..., taktalk_room: _Optional[_Union[TakTalkRoomData, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class TakTalkMessage(_message.Message):
|
||||
__slots__ = ["chatroom_id", "from_voice", "lang", "text"]
|
||||
CHATROOM_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
FROM_VOICE_FIELD_NUMBER: _ClassVar[int]
|
||||
LANG_FIELD_NUMBER: _ClassVar[int]
|
||||
TEXT_FIELD_NUMBER: _ClassVar[int]
|
||||
chatroom_id: str
|
||||
from_voice: bool
|
||||
lang: str
|
||||
text: str
|
||||
def __init__(self, text: _Optional[str] = ..., chatroom_id: _Optional[str] = ..., lang: _Optional[str] = ..., from_voice: bool = ...) -> None: ...
|
||||
|
||||
class TakTalkRoomData(_message.Message):
|
||||
__slots__ = ["participants", "room_id", "room_name", "sender_callsign"]
|
||||
PARTICIPANTS_FIELD_NUMBER: _ClassVar[int]
|
||||
ROOM_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
ROOM_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
SENDER_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
|
||||
participants: _containers.RepeatedScalarFieldContainer[str]
|
||||
room_id: str
|
||||
room_name: str
|
||||
sender_callsign: str
|
||||
def __init__(self, sender_callsign: _Optional[str] = ..., room_id: _Optional[str] = ..., room_name: _Optional[str] = ..., participants: _Optional[_Iterable[str]] = ...) -> None: ...
|
||||
|
||||
class TaskRequest(_message.Message):
|
||||
__slots__ = ["assignee_uid", "note", "priority", "status", "target_uid", "task_type"]
|
||||
class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ASSIGNEE_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
NOTE_FIELD_NUMBER: _ClassVar[int]
|
||||
PRIORITY_FIELD_NUMBER: _ClassVar[int]
|
||||
Priority_Critical: TaskRequest.Priority
|
||||
Priority_High: TaskRequest.Priority
|
||||
Priority_Low: TaskRequest.Priority
|
||||
Priority_Normal: TaskRequest.Priority
|
||||
Priority_Unspecified: TaskRequest.Priority
|
||||
STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
Status_Acknowledged: TaskRequest.Status
|
||||
Status_Cancelled: TaskRequest.Status
|
||||
Status_Completed: TaskRequest.Status
|
||||
Status_InProgress: TaskRequest.Status
|
||||
Status_Pending: TaskRequest.Status
|
||||
Status_Unspecified: TaskRequest.Status
|
||||
TARGET_UID_FIELD_NUMBER: _ClassVar[int]
|
||||
TASK_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
assignee_uid: str
|
||||
note: str
|
||||
priority: TaskRequest.Priority
|
||||
status: TaskRequest.Status
|
||||
target_uid: str
|
||||
task_type: str
|
||||
def __init__(self, task_type: _Optional[str] = ..., target_uid: _Optional[str] = ..., assignee_uid: _Optional[str] = ..., priority: _Optional[_Union[TaskRequest.Priority, str]] = ..., status: _Optional[_Union[TaskRequest.Status, str]] = ..., note: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class ZMistEntry(_message.Message):
|
||||
__slots__ = ["i", "m", "s", "t", "title", "z"]
|
||||
I_FIELD_NUMBER: _ClassVar[int]
|
||||
M_FIELD_NUMBER: _ClassVar[int]
|
||||
S_FIELD_NUMBER: _ClassVar[int]
|
||||
TITLE_FIELD_NUMBER: _ClassVar[int]
|
||||
T_FIELD_NUMBER: _ClassVar[int]
|
||||
Z_FIELD_NUMBER: _ClassVar[int]
|
||||
i: str
|
||||
m: str
|
||||
s: str
|
||||
t: str
|
||||
title: str
|
||||
z: str
|
||||
def __init__(self, title: _Optional[str] = ..., z: _Optional[str] = ..., m: _Optional[str] = ..., i: _Optional[str] = ..., s: _Optional[str] = ..., t: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class Team(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class MemberRole(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class CotHow(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class CotType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class GeoPointSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/cannedmessages.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/cannedmessages.proto\x12\x13meshtastic.protobuf\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBo\n\x14org.meshtastic.protoB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.cannedmessages_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CANNEDMESSAGEMODULECONFIG._serialized_start=65
|
||||
_CANNEDMESSAGEMODULECONFIG._serialized_end=110
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,11 +0,0 @@
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Optional as _Optional
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class CannedMessageModuleConfig(_message.Message):
|
||||
__slots__ = ["messages"]
|
||||
MESSAGES_FIELD_NUMBER: _ClassVar[int]
|
||||
messages: str
|
||||
def __init__(self, messages: _Optional[str] = ...) -> None: ...
|
||||
@@ -1,34 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/channel.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\"\xc1\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12<\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"\xb3\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12/\n\x04role\x18\x03 \x01(\x0e\x32!.meshtastic.protobuf.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x63\n\x14org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.channel_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None
|
||||
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
|
||||
_CHANNELSETTINGS._serialized_start=59
|
||||
_CHANNELSETTINGS._serialized_end=252
|
||||
_MODULESETTINGS._serialized_start=254
|
||||
_MODULESETTINGS._serialized_end=316
|
||||
_CHANNEL._serialized_start=319
|
||||
_CHANNEL._serialized_end=498
|
||||
_CHANNEL_ROLE._serialized_start=450
|
||||
_CHANNEL_ROLE._serialized_end=498
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,47 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class Channel(_message.Message):
|
||||
__slots__ = ["index", "role", "settings"]
|
||||
class Role(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
DISABLED: Channel.Role
|
||||
INDEX_FIELD_NUMBER: _ClassVar[int]
|
||||
PRIMARY: Channel.Role
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
SECONDARY: Channel.Role
|
||||
SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
index: int
|
||||
role: Channel.Role
|
||||
settings: ChannelSettings
|
||||
def __init__(self, index: _Optional[int] = ..., settings: _Optional[_Union[ChannelSettings, _Mapping]] = ..., role: _Optional[_Union[Channel.Role, str]] = ...) -> None: ...
|
||||
|
||||
class ChannelSettings(_message.Message):
|
||||
__slots__ = ["channel_num", "downlink_enabled", "id", "module_settings", "name", "psk", "uplink_enabled"]
|
||||
CHANNEL_NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
DOWNLINK_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ID_FIELD_NUMBER: _ClassVar[int]
|
||||
MODULE_SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
PSK_FIELD_NUMBER: _ClassVar[int]
|
||||
UPLINK_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
channel_num: int
|
||||
downlink_enabled: bool
|
||||
id: int
|
||||
module_settings: ModuleSettings
|
||||
name: str
|
||||
psk: bytes
|
||||
uplink_enabled: bool
|
||||
def __init__(self, channel_num: _Optional[int] = ..., psk: _Optional[bytes] = ..., name: _Optional[str] = ..., id: _Optional[int] = ..., uplink_enabled: bool = ..., downlink_enabled: bool = ..., module_settings: _Optional[_Union[ModuleSettings, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class ModuleSettings(_message.Message):
|
||||
__slots__ = ["is_muted", "position_precision"]
|
||||
IS_MUTED_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
|
||||
is_muted: bool
|
||||
position_precision: int
|
||||
def __init__(self, position_precision: _Optional[int] = ..., is_muted: bool = ...) -> None: ...
|
||||
@@ -1,28 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/clientonly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"\xc4\x03\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x06\x63onfig\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfigH\x03\x88\x01\x01\x12\x42\n\rmodule_config\x18\x05 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfigH\x04\x88\x01\x01\x12:\n\x0e\x66ixed_position\x18\x06 \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x05\x88\x01\x01\x12\x15\n\x08ringtone\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1c\n\x0f\x63\x61nned_messages\x18\x08 \x01(\tH\x07\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configB\x11\n\x0f_fixed_positionB\x0b\n\t_ringtoneB\x12\n\x10_canned_messagesBf\n\x14org.meshtastic.protoB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.clientonly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_DEVICEPROFILE._serialized_start=131
|
||||
_DEVICEPROFILE._serialized_end=583
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,27 +0,0 @@
|
||||
from meshtastic.protobuf import localonly_pb2 as _localonly_pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class DeviceProfile(_message.Message):
|
||||
__slots__ = ["canned_messages", "channel_url", "config", "fixed_position", "long_name", "module_config", "ringtone", "short_name"]
|
||||
CANNED_MESSAGES_FIELD_NUMBER: _ClassVar[int]
|
||||
CHANNEL_URL_FIELD_NUMBER: _ClassVar[int]
|
||||
CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
RINGTONE_FIELD_NUMBER: _ClassVar[int]
|
||||
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
canned_messages: str
|
||||
channel_url: str
|
||||
config: _localonly_pb2.LocalConfig
|
||||
fixed_position: _mesh_pb2.Position
|
||||
long_name: str
|
||||
module_config: _localonly_pb2.LocalModuleConfig
|
||||
ringtone: str
|
||||
short_name: str
|
||||
def __init__(self, long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., channel_url: _Optional[str] = ..., config: _Optional[_Union[_localonly_pb2.LocalConfig, _Mapping]] = ..., module_config: _Optional[_Union[_localonly_pb2.LocalModuleConfig, _Mapping]] = ..., fixed_position: _Optional[_Union[_mesh_pb2.Position, _Mapping]] = ..., ringtone: _Optional[str] = ..., canned_messages: _Optional[str] = ...) -> None: ...
|
||||
File diff suppressed because one or more lines are too long
@@ -1,395 +0,0 @@
|
||||
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class Config(_message.Message):
|
||||
__slots__ = ["bluetooth", "device", "device_ui", "display", "lora", "network", "position", "power", "security", "sessionkey"]
|
||||
class BluetoothConfig(_message.Message):
|
||||
__slots__ = ["enabled", "fixed_pin", "mode"]
|
||||
class PairingMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
FIXED_PIN: Config.BluetoothConfig.PairingMode
|
||||
FIXED_PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
NO_PIN: Config.BluetoothConfig.PairingMode
|
||||
RANDOM_PIN: Config.BluetoothConfig.PairingMode
|
||||
enabled: bool
|
||||
fixed_pin: int
|
||||
mode: Config.BluetoothConfig.PairingMode
|
||||
def __init__(self, enabled: bool = ..., mode: _Optional[_Union[Config.BluetoothConfig.PairingMode, str]] = ..., fixed_pin: _Optional[int] = ...) -> None: ...
|
||||
class DeviceConfig(_message.Message):
|
||||
__slots__ = ["button_gpio", "buzzer_gpio", "buzzer_mode", "disable_triple_click", "double_tap_as_button_press", "is_managed", "led_heartbeat_disabled", "node_info_broadcast_secs", "rebroadcast_mode", "role", "serial_enabled", "tzdef"]
|
||||
class BuzzerMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class RebroadcastMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Role(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ALL: Config.DeviceConfig.RebroadcastMode
|
||||
ALL_ENABLED: Config.DeviceConfig.BuzzerMode
|
||||
ALL_SKIP_DECODING: Config.DeviceConfig.RebroadcastMode
|
||||
BUTTON_GPIO_FIELD_NUMBER: _ClassVar[int]
|
||||
BUZZER_GPIO_FIELD_NUMBER: _ClassVar[int]
|
||||
BUZZER_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
CLIENT: Config.DeviceConfig.Role
|
||||
CLIENT_BASE: Config.DeviceConfig.Role
|
||||
CLIENT_HIDDEN: Config.DeviceConfig.Role
|
||||
CLIENT_MUTE: Config.DeviceConfig.Role
|
||||
CORE_PORTNUMS_ONLY: Config.DeviceConfig.RebroadcastMode
|
||||
DIRECT_MSG_ONLY: Config.DeviceConfig.BuzzerMode
|
||||
DISABLED: Config.DeviceConfig.BuzzerMode
|
||||
DISABLE_TRIPLE_CLICK_FIELD_NUMBER: _ClassVar[int]
|
||||
DOUBLE_TAP_AS_BUTTON_PRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_MANAGED_FIELD_NUMBER: _ClassVar[int]
|
||||
KNOWN_ONLY: Config.DeviceConfig.RebroadcastMode
|
||||
LED_HEARTBEAT_DISABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCAL_ONLY: Config.DeviceConfig.RebroadcastMode
|
||||
LOST_AND_FOUND: Config.DeviceConfig.Role
|
||||
NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
NONE: Config.DeviceConfig.RebroadcastMode
|
||||
NOTIFICATIONS_ONLY: Config.DeviceConfig.BuzzerMode
|
||||
REBROADCAST_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
REPEATER: Config.DeviceConfig.Role
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
ROUTER: Config.DeviceConfig.Role
|
||||
ROUTER_CLIENT: Config.DeviceConfig.Role
|
||||
ROUTER_LATE: Config.DeviceConfig.Role
|
||||
SENSOR: Config.DeviceConfig.Role
|
||||
SERIAL_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
SYSTEM_ONLY: Config.DeviceConfig.BuzzerMode
|
||||
TAK: Config.DeviceConfig.Role
|
||||
TAK_TRACKER: Config.DeviceConfig.Role
|
||||
TRACKER: Config.DeviceConfig.Role
|
||||
TZDEF_FIELD_NUMBER: _ClassVar[int]
|
||||
button_gpio: int
|
||||
buzzer_gpio: int
|
||||
buzzer_mode: Config.DeviceConfig.BuzzerMode
|
||||
disable_triple_click: bool
|
||||
double_tap_as_button_press: bool
|
||||
is_managed: bool
|
||||
led_heartbeat_disabled: bool
|
||||
node_info_broadcast_secs: int
|
||||
rebroadcast_mode: Config.DeviceConfig.RebroadcastMode
|
||||
role: Config.DeviceConfig.Role
|
||||
serial_enabled: bool
|
||||
tzdef: str
|
||||
def __init__(self, role: _Optional[_Union[Config.DeviceConfig.Role, str]] = ..., serial_enabled: bool = ..., button_gpio: _Optional[int] = ..., buzzer_gpio: _Optional[int] = ..., rebroadcast_mode: _Optional[_Union[Config.DeviceConfig.RebroadcastMode, str]] = ..., node_info_broadcast_secs: _Optional[int] = ..., double_tap_as_button_press: bool = ..., is_managed: bool = ..., disable_triple_click: bool = ..., tzdef: _Optional[str] = ..., led_heartbeat_disabled: bool = ..., buzzer_mode: _Optional[_Union[Config.DeviceConfig.BuzzerMode, str]] = ...) -> None: ...
|
||||
class DisplayConfig(_message.Message):
|
||||
__slots__ = ["auto_screen_carousel_secs", "compass_north_top", "compass_orientation", "displaymode", "enable_message_bubbles", "flip_screen", "gps_format", "heading_bold", "oled", "screen_on_secs", "units", "use_12h_clock", "use_long_node_name", "wake_on_tap_or_motion"]
|
||||
class CompassOrientation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class DeprecatedGpsCoordinateFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class DisplayMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class DisplayUnits(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class OledType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
COLOR: Config.DisplayConfig.DisplayMode
|
||||
COMPASS_NORTH_TOP_FIELD_NUMBER: _ClassVar[int]
|
||||
COMPASS_ORIENTATION_FIELD_NUMBER: _ClassVar[int]
|
||||
DEFAULT: Config.DisplayConfig.DisplayMode
|
||||
DEGREES_0: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_0_INVERTED: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_180: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_180_INVERTED: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_270: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_270_INVERTED: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_90: Config.DisplayConfig.CompassOrientation
|
||||
DEGREES_90_INVERTED: Config.DisplayConfig.CompassOrientation
|
||||
DISPLAYMODE_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLE_MESSAGE_BUBBLES_FIELD_NUMBER: _ClassVar[int]
|
||||
FLIP_SCREEN_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_FORMAT_FIELD_NUMBER: _ClassVar[int]
|
||||
HEADING_BOLD_FIELD_NUMBER: _ClassVar[int]
|
||||
IMPERIAL: Config.DisplayConfig.DisplayUnits
|
||||
INVERTED: Config.DisplayConfig.DisplayMode
|
||||
METRIC: Config.DisplayConfig.DisplayUnits
|
||||
OLED_AUTO: Config.DisplayConfig.OledType
|
||||
OLED_FIELD_NUMBER: _ClassVar[int]
|
||||
OLED_SH1106: Config.DisplayConfig.OledType
|
||||
OLED_SH1107: Config.DisplayConfig.OledType
|
||||
OLED_SH1107_128_128: Config.DisplayConfig.OledType
|
||||
OLED_SH1107_ROTATED: Config.DisplayConfig.OledType
|
||||
OLED_SSD1306: Config.DisplayConfig.OledType
|
||||
SCREEN_ON_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
TWOCOLOR: Config.DisplayConfig.DisplayMode
|
||||
UNITS_FIELD_NUMBER: _ClassVar[int]
|
||||
UNUSED: Config.DisplayConfig.DeprecatedGpsCoordinateFormat
|
||||
USE_12H_CLOCK_FIELD_NUMBER: _ClassVar[int]
|
||||
USE_LONG_NODE_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: _ClassVar[int]
|
||||
auto_screen_carousel_secs: int
|
||||
compass_north_top: bool
|
||||
compass_orientation: Config.DisplayConfig.CompassOrientation
|
||||
displaymode: Config.DisplayConfig.DisplayMode
|
||||
enable_message_bubbles: bool
|
||||
flip_screen: bool
|
||||
gps_format: Config.DisplayConfig.DeprecatedGpsCoordinateFormat
|
||||
heading_bold: bool
|
||||
oled: Config.DisplayConfig.OledType
|
||||
screen_on_secs: int
|
||||
units: Config.DisplayConfig.DisplayUnits
|
||||
use_12h_clock: bool
|
||||
use_long_node_name: bool
|
||||
wake_on_tap_or_motion: bool
|
||||
def __init__(self, screen_on_secs: _Optional[int] = ..., gps_format: _Optional[_Union[Config.DisplayConfig.DeprecatedGpsCoordinateFormat, str]] = ..., auto_screen_carousel_secs: _Optional[int] = ..., compass_north_top: bool = ..., flip_screen: bool = ..., units: _Optional[_Union[Config.DisplayConfig.DisplayUnits, str]] = ..., oled: _Optional[_Union[Config.DisplayConfig.OledType, str]] = ..., displaymode: _Optional[_Union[Config.DisplayConfig.DisplayMode, str]] = ..., heading_bold: bool = ..., wake_on_tap_or_motion: bool = ..., compass_orientation: _Optional[_Union[Config.DisplayConfig.CompassOrientation, str]] = ..., use_12h_clock: bool = ..., use_long_node_name: bool = ..., enable_message_bubbles: bool = ...) -> None: ...
|
||||
class LoRaConfig(_message.Message):
|
||||
__slots__ = ["bandwidth", "channel_num", "coding_rate", "config_ok_to_mqtt", "fem_lna_mode", "frequency_offset", "hop_limit", "ignore_incoming", "ignore_mqtt", "modem_preset", "override_duty_cycle", "override_frequency", "pa_fan_disabled", "region", "serial_hal_only", "spread_factor", "sx126x_rx_boosted_gain", "tx_enabled", "tx_power", "use_preset"]
|
||||
class FEM_LNA_Mode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class ModemPreset(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class RegionCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ANZ: Config.LoRaConfig.RegionCode
|
||||
ANZ_433: Config.LoRaConfig.RegionCode
|
||||
BANDWIDTH_FIELD_NUMBER: _ClassVar[int]
|
||||
BR_902: Config.LoRaConfig.RegionCode
|
||||
CHANNEL_NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
CN: Config.LoRaConfig.RegionCode
|
||||
CODING_RATE_FIELD_NUMBER: _ClassVar[int]
|
||||
CONFIG_OK_TO_MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
DISABLED: Config.LoRaConfig.FEM_LNA_Mode
|
||||
ENABLED: Config.LoRaConfig.FEM_LNA_Mode
|
||||
EU_433: Config.LoRaConfig.RegionCode
|
||||
EU_866: Config.LoRaConfig.RegionCode
|
||||
EU_868: Config.LoRaConfig.RegionCode
|
||||
EU_874: Config.LoRaConfig.RegionCode
|
||||
EU_917: Config.LoRaConfig.RegionCode
|
||||
EU_N_868: Config.LoRaConfig.RegionCode
|
||||
FEM_LNA_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
FREQUENCY_OFFSET_FIELD_NUMBER: _ClassVar[int]
|
||||
HOP_LIMIT_FIELD_NUMBER: _ClassVar[int]
|
||||
IGNORE_INCOMING_FIELD_NUMBER: _ClassVar[int]
|
||||
IGNORE_MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
IN: Config.LoRaConfig.RegionCode
|
||||
ITU1_2M: Config.LoRaConfig.RegionCode
|
||||
ITU2_2M: Config.LoRaConfig.RegionCode
|
||||
ITU3_2M: Config.LoRaConfig.RegionCode
|
||||
JP: Config.LoRaConfig.RegionCode
|
||||
KR: Config.LoRaConfig.RegionCode
|
||||
KZ_433: Config.LoRaConfig.RegionCode
|
||||
KZ_863: Config.LoRaConfig.RegionCode
|
||||
LITE_FAST: Config.LoRaConfig.ModemPreset
|
||||
LITE_SLOW: Config.LoRaConfig.ModemPreset
|
||||
LONG_FAST: Config.LoRaConfig.ModemPreset
|
||||
LONG_MODERATE: Config.LoRaConfig.ModemPreset
|
||||
LONG_SLOW: Config.LoRaConfig.ModemPreset
|
||||
LONG_TURBO: Config.LoRaConfig.ModemPreset
|
||||
LORA_24: Config.LoRaConfig.RegionCode
|
||||
MEDIUM_FAST: Config.LoRaConfig.ModemPreset
|
||||
MEDIUM_SLOW: Config.LoRaConfig.ModemPreset
|
||||
MODEM_PRESET_FIELD_NUMBER: _ClassVar[int]
|
||||
MY_433: Config.LoRaConfig.RegionCode
|
||||
MY_919: Config.LoRaConfig.RegionCode
|
||||
NARROW_FAST: Config.LoRaConfig.ModemPreset
|
||||
NARROW_SLOW: Config.LoRaConfig.ModemPreset
|
||||
NOT_PRESENT: Config.LoRaConfig.FEM_LNA_Mode
|
||||
NP_865: Config.LoRaConfig.RegionCode
|
||||
NZ_865: Config.LoRaConfig.RegionCode
|
||||
OVERRIDE_DUTY_CYCLE_FIELD_NUMBER: _ClassVar[int]
|
||||
OVERRIDE_FREQUENCY_FIELD_NUMBER: _ClassVar[int]
|
||||
PA_FAN_DISABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
PH_433: Config.LoRaConfig.RegionCode
|
||||
PH_868: Config.LoRaConfig.RegionCode
|
||||
PH_915: Config.LoRaConfig.RegionCode
|
||||
REGION_FIELD_NUMBER: _ClassVar[int]
|
||||
RU: Config.LoRaConfig.RegionCode
|
||||
SERIAL_HAL_ONLY_FIELD_NUMBER: _ClassVar[int]
|
||||
SG_923: Config.LoRaConfig.RegionCode
|
||||
SHORT_FAST: Config.LoRaConfig.ModemPreset
|
||||
SHORT_SLOW: Config.LoRaConfig.ModemPreset
|
||||
SHORT_TURBO: Config.LoRaConfig.ModemPreset
|
||||
SPREAD_FACTOR_FIELD_NUMBER: _ClassVar[int]
|
||||
SX126X_RX_BOOSTED_GAIN_FIELD_NUMBER: _ClassVar[int]
|
||||
TH: Config.LoRaConfig.RegionCode
|
||||
TW: Config.LoRaConfig.RegionCode
|
||||
TX_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
TX_POWER_FIELD_NUMBER: _ClassVar[int]
|
||||
UA_433: Config.LoRaConfig.RegionCode
|
||||
UA_868: Config.LoRaConfig.RegionCode
|
||||
UNSET: Config.LoRaConfig.RegionCode
|
||||
US: Config.LoRaConfig.RegionCode
|
||||
USE_PRESET_FIELD_NUMBER: _ClassVar[int]
|
||||
VERY_LONG_SLOW: Config.LoRaConfig.ModemPreset
|
||||
bandwidth: int
|
||||
channel_num: int
|
||||
coding_rate: int
|
||||
config_ok_to_mqtt: bool
|
||||
fem_lna_mode: Config.LoRaConfig.FEM_LNA_Mode
|
||||
frequency_offset: float
|
||||
hop_limit: int
|
||||
ignore_incoming: _containers.RepeatedScalarFieldContainer[int]
|
||||
ignore_mqtt: bool
|
||||
modem_preset: Config.LoRaConfig.ModemPreset
|
||||
override_duty_cycle: bool
|
||||
override_frequency: float
|
||||
pa_fan_disabled: bool
|
||||
region: Config.LoRaConfig.RegionCode
|
||||
serial_hal_only: bool
|
||||
spread_factor: int
|
||||
sx126x_rx_boosted_gain: bool
|
||||
tx_enabled: bool
|
||||
tx_power: int
|
||||
use_preset: bool
|
||||
def __init__(self, use_preset: bool = ..., modem_preset: _Optional[_Union[Config.LoRaConfig.ModemPreset, str]] = ..., bandwidth: _Optional[int] = ..., spread_factor: _Optional[int] = ..., coding_rate: _Optional[int] = ..., frequency_offset: _Optional[float] = ..., region: _Optional[_Union[Config.LoRaConfig.RegionCode, str]] = ..., hop_limit: _Optional[int] = ..., tx_enabled: bool = ..., tx_power: _Optional[int] = ..., channel_num: _Optional[int] = ..., override_duty_cycle: bool = ..., sx126x_rx_boosted_gain: bool = ..., override_frequency: _Optional[float] = ..., pa_fan_disabled: bool = ..., ignore_incoming: _Optional[_Iterable[int]] = ..., ignore_mqtt: bool = ..., config_ok_to_mqtt: bool = ..., fem_lna_mode: _Optional[_Union[Config.LoRaConfig.FEM_LNA_Mode, str]] = ..., serial_hal_only: bool = ...) -> None: ...
|
||||
class NetworkConfig(_message.Message):
|
||||
__slots__ = ["address_mode", "enabled_protocols", "eth_enabled", "ipv4_config", "ipv6_enabled", "ntp_server", "rsyslog_server", "wifi_enabled", "wifi_psk", "wifi_ssid"]
|
||||
class AddressMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class ProtocolFlags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class IpV4Config(_message.Message):
|
||||
__slots__ = ["dns", "gateway", "ip", "subnet"]
|
||||
DNS_FIELD_NUMBER: _ClassVar[int]
|
||||
GATEWAY_FIELD_NUMBER: _ClassVar[int]
|
||||
IP_FIELD_NUMBER: _ClassVar[int]
|
||||
SUBNET_FIELD_NUMBER: _ClassVar[int]
|
||||
dns: int
|
||||
gateway: int
|
||||
ip: int
|
||||
subnet: int
|
||||
def __init__(self, ip: _Optional[int] = ..., gateway: _Optional[int] = ..., subnet: _Optional[int] = ..., dns: _Optional[int] = ...) -> None: ...
|
||||
ADDRESS_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
DHCP: Config.NetworkConfig.AddressMode
|
||||
ENABLED_PROTOCOLS_FIELD_NUMBER: _ClassVar[int]
|
||||
ETH_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
IPV4_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
IPV6_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
NO_BROADCAST: Config.NetworkConfig.ProtocolFlags
|
||||
NTP_SERVER_FIELD_NUMBER: _ClassVar[int]
|
||||
RSYSLOG_SERVER_FIELD_NUMBER: _ClassVar[int]
|
||||
STATIC: Config.NetworkConfig.AddressMode
|
||||
UDP_BROADCAST: Config.NetworkConfig.ProtocolFlags
|
||||
WIFI_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
WIFI_PSK_FIELD_NUMBER: _ClassVar[int]
|
||||
WIFI_SSID_FIELD_NUMBER: _ClassVar[int]
|
||||
address_mode: Config.NetworkConfig.AddressMode
|
||||
enabled_protocols: int
|
||||
eth_enabled: bool
|
||||
ipv4_config: Config.NetworkConfig.IpV4Config
|
||||
ipv6_enabled: bool
|
||||
ntp_server: str
|
||||
rsyslog_server: str
|
||||
wifi_enabled: bool
|
||||
wifi_psk: str
|
||||
wifi_ssid: str
|
||||
def __init__(self, wifi_enabled: bool = ..., wifi_ssid: _Optional[str] = ..., wifi_psk: _Optional[str] = ..., ntp_server: _Optional[str] = ..., eth_enabled: bool = ..., address_mode: _Optional[_Union[Config.NetworkConfig.AddressMode, str]] = ..., ipv4_config: _Optional[_Union[Config.NetworkConfig.IpV4Config, _Mapping]] = ..., rsyslog_server: _Optional[str] = ..., enabled_protocols: _Optional[int] = ..., ipv6_enabled: bool = ...) -> None: ...
|
||||
class PositionConfig(_message.Message):
|
||||
__slots__ = ["broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", "fixed_position", "gps_attempt_time", "gps_en_gpio", "gps_enabled", "gps_mode", "gps_update_interval", "position_broadcast_secs", "position_broadcast_smart_enabled", "position_flags", "rx_gpio", "tx_gpio"]
|
||||
class GpsMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class PositionFlags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ALTITUDE: Config.PositionConfig.PositionFlags
|
||||
ALTITUDE_MSL: Config.PositionConfig.PositionFlags
|
||||
BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: _ClassVar[int]
|
||||
BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
DISABLED: Config.PositionConfig.GpsMode
|
||||
DOP: Config.PositionConfig.PositionFlags
|
||||
ENABLED: Config.PositionConfig.GpsMode
|
||||
FIXED_POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
GEOIDAL_SEPARATION: Config.PositionConfig.PositionFlags
|
||||
GPS_ATTEMPT_TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_EN_GPIO_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
HEADING: Config.PositionConfig.PositionFlags
|
||||
HVDOP: Config.PositionConfig.PositionFlags
|
||||
NOT_PRESENT: Config.PositionConfig.GpsMode
|
||||
POSITION_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
RX_GPIO_FIELD_NUMBER: _ClassVar[int]
|
||||
SATINVIEW: Config.PositionConfig.PositionFlags
|
||||
SEQ_NO: Config.PositionConfig.PositionFlags
|
||||
SPEED: Config.PositionConfig.PositionFlags
|
||||
TIMESTAMP: Config.PositionConfig.PositionFlags
|
||||
TX_GPIO_FIELD_NUMBER: _ClassVar[int]
|
||||
UNSET: Config.PositionConfig.PositionFlags
|
||||
broadcast_smart_minimum_distance: int
|
||||
broadcast_smart_minimum_interval_secs: int
|
||||
fixed_position: bool
|
||||
gps_attempt_time: int
|
||||
gps_en_gpio: int
|
||||
gps_enabled: bool
|
||||
gps_mode: Config.PositionConfig.GpsMode
|
||||
gps_update_interval: int
|
||||
position_broadcast_secs: int
|
||||
position_broadcast_smart_enabled: bool
|
||||
position_flags: int
|
||||
rx_gpio: int
|
||||
tx_gpio: int
|
||||
def __init__(self, position_broadcast_secs: _Optional[int] = ..., position_broadcast_smart_enabled: bool = ..., fixed_position: bool = ..., gps_enabled: bool = ..., gps_update_interval: _Optional[int] = ..., gps_attempt_time: _Optional[int] = ..., position_flags: _Optional[int] = ..., rx_gpio: _Optional[int] = ..., tx_gpio: _Optional[int] = ..., broadcast_smart_minimum_distance: _Optional[int] = ..., broadcast_smart_minimum_interval_secs: _Optional[int] = ..., gps_en_gpio: _Optional[int] = ..., gps_mode: _Optional[_Union[Config.PositionConfig.GpsMode, str]] = ...) -> None: ...
|
||||
class PowerConfig(_message.Message):
|
||||
__slots__ = ["adc_multiplier_override", "device_battery_ina_address", "is_power_saving", "ls_secs", "min_wake_secs", "on_battery_shutdown_after_secs", "powermon_enables", "sds_secs", "wait_bluetooth_secs"]
|
||||
ADC_MULTIPLIER_OVERRIDE_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_BATTERY_INA_ADDRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_POWER_SAVING_FIELD_NUMBER: _ClassVar[int]
|
||||
LS_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
MIN_WAKE_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
ON_BATTERY_SHUTDOWN_AFTER_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
POWERMON_ENABLES_FIELD_NUMBER: _ClassVar[int]
|
||||
SDS_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
WAIT_BLUETOOTH_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
adc_multiplier_override: float
|
||||
device_battery_ina_address: int
|
||||
is_power_saving: bool
|
||||
ls_secs: int
|
||||
min_wake_secs: int
|
||||
on_battery_shutdown_after_secs: int
|
||||
powermon_enables: int
|
||||
sds_secs: int
|
||||
wait_bluetooth_secs: int
|
||||
def __init__(self, is_power_saving: bool = ..., on_battery_shutdown_after_secs: _Optional[int] = ..., adc_multiplier_override: _Optional[float] = ..., wait_bluetooth_secs: _Optional[int] = ..., sds_secs: _Optional[int] = ..., ls_secs: _Optional[int] = ..., min_wake_secs: _Optional[int] = ..., device_battery_ina_address: _Optional[int] = ..., powermon_enables: _Optional[int] = ...) -> None: ...
|
||||
class SecurityConfig(_message.Message):
|
||||
__slots__ = ["admin_channel_enabled", "admin_key", "debug_log_api_enabled", "is_managed", "private_key", "public_key", "serial_enabled"]
|
||||
ADMIN_CHANNEL_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ADMIN_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
DEBUG_LOG_API_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_MANAGED_FIELD_NUMBER: _ClassVar[int]
|
||||
PRIVATE_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
SERIAL_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
admin_channel_enabled: bool
|
||||
admin_key: _containers.RepeatedScalarFieldContainer[bytes]
|
||||
debug_log_api_enabled: bool
|
||||
is_managed: bool
|
||||
private_key: bytes
|
||||
public_key: bytes
|
||||
serial_enabled: bool
|
||||
def __init__(self, public_key: _Optional[bytes] = ..., private_key: _Optional[bytes] = ..., admin_key: _Optional[_Iterable[bytes]] = ..., is_managed: bool = ..., serial_enabled: bool = ..., debug_log_api_enabled: bool = ..., admin_channel_enabled: bool = ...) -> None: ...
|
||||
class SessionkeyConfig(_message.Message):
|
||||
__slots__ = []
|
||||
def __init__(self) -> None: ...
|
||||
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_UI_FIELD_NUMBER: _ClassVar[int]
|
||||
DISPLAY_FIELD_NUMBER: _ClassVar[int]
|
||||
LORA_FIELD_NUMBER: _ClassVar[int]
|
||||
NETWORK_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
POWER_FIELD_NUMBER: _ClassVar[int]
|
||||
SECURITY_FIELD_NUMBER: _ClassVar[int]
|
||||
SESSIONKEY_FIELD_NUMBER: _ClassVar[int]
|
||||
bluetooth: Config.BluetoothConfig
|
||||
device: Config.DeviceConfig
|
||||
device_ui: _device_ui_pb2.DeviceUIConfig
|
||||
display: Config.DisplayConfig
|
||||
lora: Config.LoRaConfig
|
||||
network: Config.NetworkConfig
|
||||
position: Config.PositionConfig
|
||||
power: Config.PowerConfig
|
||||
security: Config.SecurityConfig
|
||||
sessionkey: Config.SessionkeyConfig
|
||||
def __init__(self, device: _Optional[_Union[Config.DeviceConfig, _Mapping]] = ..., position: _Optional[_Union[Config.PositionConfig, _Mapping]] = ..., power: _Optional[_Union[Config.PowerConfig, _Mapping]] = ..., network: _Optional[_Union[Config.NetworkConfig, _Mapping]] = ..., display: _Optional[_Union[Config.DisplayConfig, _Mapping]] = ..., lora: _Optional[_Union[Config.LoRaConfig, _Mapping]] = ..., bluetooth: _Optional[_Union[Config.BluetoothConfig, _Mapping]] = ..., security: _Optional[_Union[Config.SecurityConfig, _Mapping]] = ..., sessionkey: _Optional[_Union[Config.SessionkeyConfig, _Mapping]] = ..., device_ui: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ...) -> None: ...
|
||||
@@ -1,36 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/connection_status.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/connection_status.proto\x12\x13meshtastic.protobuf\"\xd5\x02\n\x16\x44\x65viceConnectionStatus\x12<\n\x04wifi\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.WifiConnectionStatusH\x00\x88\x01\x01\x12\x44\n\x08\x65thernet\x18\x02 \x01(\x0b\x32-.meshtastic.protobuf.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x46\n\tbluetooth\x18\x03 \x01(\x0b\x32..meshtastic.protobuf.BluetoothConnectionStatusH\x02\x88\x01\x01\x12@\n\x06serial\x18\x04 \x01(\x0b\x32+.meshtastic.protobuf.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"p\n\x14WifiConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"X\n\x18\x45thernetConnectionStatus\x12<\n\x06status\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x66\n\x14org.meshtastic.protoB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.connection_status_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_DEVICECONNECTIONSTATUS._serialized_start=69
|
||||
_DEVICECONNECTIONSTATUS._serialized_end=410
|
||||
_WIFICONNECTIONSTATUS._serialized_start=412
|
||||
_WIFICONNECTIONSTATUS._serialized_end=524
|
||||
_ETHERNETCONNECTIONSTATUS._serialized_start=526
|
||||
_ETHERNETCONNECTIONSTATUS._serialized_end=614
|
||||
_NETWORKCONNECTIONSTATUS._serialized_start=616
|
||||
_NETWORKCONNECTIONSTATUS._serialized_end=739
|
||||
_BLUETOOTHCONNECTIONSTATUS._serialized_start=741
|
||||
_BLUETOOTHCONNECTIONSTATUS._serialized_end=817
|
||||
_SERIALCONNECTIONSTATUS._serialized_start=819
|
||||
_SERIALCONNECTIONSTATUS._serialized_end=879
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,63 +0,0 @@
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class BluetoothConnectionStatus(_message.Message):
|
||||
__slots__ = ["is_connected", "pin", "rssi"]
|
||||
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
|
||||
PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
RSSI_FIELD_NUMBER: _ClassVar[int]
|
||||
is_connected: bool
|
||||
pin: int
|
||||
rssi: int
|
||||
def __init__(self, pin: _Optional[int] = ..., rssi: _Optional[int] = ..., is_connected: bool = ...) -> None: ...
|
||||
|
||||
class DeviceConnectionStatus(_message.Message):
|
||||
__slots__ = ["bluetooth", "ethernet", "serial", "wifi"]
|
||||
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
|
||||
ETHERNET_FIELD_NUMBER: _ClassVar[int]
|
||||
SERIAL_FIELD_NUMBER: _ClassVar[int]
|
||||
WIFI_FIELD_NUMBER: _ClassVar[int]
|
||||
bluetooth: BluetoothConnectionStatus
|
||||
ethernet: EthernetConnectionStatus
|
||||
serial: SerialConnectionStatus
|
||||
wifi: WifiConnectionStatus
|
||||
def __init__(self, wifi: _Optional[_Union[WifiConnectionStatus, _Mapping]] = ..., ethernet: _Optional[_Union[EthernetConnectionStatus, _Mapping]] = ..., bluetooth: _Optional[_Union[BluetoothConnectionStatus, _Mapping]] = ..., serial: _Optional[_Union[SerialConnectionStatus, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class EthernetConnectionStatus(_message.Message):
|
||||
__slots__ = ["status"]
|
||||
STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
status: NetworkConnectionStatus
|
||||
def __init__(self, status: _Optional[_Union[NetworkConnectionStatus, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class NetworkConnectionStatus(_message.Message):
|
||||
__slots__ = ["ip_address", "is_connected", "is_mqtt_connected", "is_syslog_connected"]
|
||||
IP_ADDRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_MQTT_CONNECTED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_SYSLOG_CONNECTED_FIELD_NUMBER: _ClassVar[int]
|
||||
ip_address: int
|
||||
is_connected: bool
|
||||
is_mqtt_connected: bool
|
||||
is_syslog_connected: bool
|
||||
def __init__(self, ip_address: _Optional[int] = ..., is_connected: bool = ..., is_mqtt_connected: bool = ..., is_syslog_connected: bool = ...) -> None: ...
|
||||
|
||||
class SerialConnectionStatus(_message.Message):
|
||||
__slots__ = ["baud", "is_connected"]
|
||||
BAUD_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_CONNECTED_FIELD_NUMBER: _ClassVar[int]
|
||||
baud: int
|
||||
is_connected: bool
|
||||
def __init__(self, baud: _Optional[int] = ..., is_connected: bool = ...) -> None: ...
|
||||
|
||||
class WifiConnectionStatus(_message.Message):
|
||||
__slots__ = ["rssi", "ssid", "status"]
|
||||
RSSI_FIELD_NUMBER: _ClassVar[int]
|
||||
SSID_FIELD_NUMBER: _ClassVar[int]
|
||||
STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
rssi: int
|
||||
ssid: str
|
||||
status: NetworkConnectionStatus
|
||||
def __init__(self, status: _Optional[_Union[NetworkConnectionStatus, _Mapping]] = ..., ssid: _Optional[str] = ..., rssi: _Optional[int] = ...) -> None: ...
|
||||
@@ -1,42 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/device_ui.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xff\x05\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12\x36\n\x0c\x63ompass_mode\x18\x10 \x01(\x0e\x32 .meshtastic.protobuf.CompassMode\x12\x18\n\x10screen_rgb_color\x18\x11 \x01(\r\x12\x1b\n\x13is_clockface_analog\x18\x12 \x01(\x08\x12K\n\ngps_format\x18\x13 \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormat\"V\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03UTM\x10\x02\x12\x08\n\x04MGRS\x10\x03\x12\x07\n\x03OLC\x10\x04\x12\x08\n\x04OSGR\x10\x05\x12\x07\n\x03MLS\x10\x06\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*>\n\x0b\x43ompassMode\x12\x0b\n\x07\x44YNAMIC\x10\x00\x12\x0e\n\nFIXED_RING\x10\x01\x12\x12\n\x0e\x46REEZE_HEADING\x10\x02*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xc0\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\r\n\tBULGARIAN\x10\x11\x12\t\n\x05\x43ZECH\x10\x12\x12\n\n\x06\x44\x41NISH\x10\x13\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x64\n\x14org.meshtastic.protoB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.device_ui_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_COMPASSMODE._serialized_start=1278
|
||||
_COMPASSMODE._serialized_end=1340
|
||||
_THEME._serialized_start=1342
|
||||
_THEME._serialized_end=1379
|
||||
_LANGUAGE._serialized_start=1382
|
||||
_LANGUAGE._serialized_end=1702
|
||||
_DEVICEUICONFIG._serialized_start=61
|
||||
_DEVICEUICONFIG._serialized_end=828
|
||||
_DEVICEUICONFIG_GPSCOORDINATEFORMAT._serialized_start=742
|
||||
_DEVICEUICONFIG_GPSCOORDINATEFORMAT._serialized_end=828
|
||||
_NODEFILTER._serialized_start=831
|
||||
_NODEFILTER._serialized_end=998
|
||||
_NODEHIGHLIGHT._serialized_start=1000
|
||||
_NODEHIGHLIGHT._serialized_end=1126
|
||||
_GEOPOINT._serialized_start=1128
|
||||
_GEOPOINT._serialized_end=1189
|
||||
_MAP._serialized_start=1191
|
||||
_MAP._serialized_end=1276
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,146 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
BULGARIAN: Language
|
||||
CZECH: Language
|
||||
DANISH: Language
|
||||
DARK: Theme
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
DUTCH: Language
|
||||
DYNAMIC: CompassMode
|
||||
ENGLISH: Language
|
||||
FINNISH: Language
|
||||
FIXED_RING: CompassMode
|
||||
FREEZE_HEADING: CompassMode
|
||||
FRENCH: Language
|
||||
GERMAN: Language
|
||||
GREEK: Language
|
||||
ITALIAN: Language
|
||||
LIGHT: Theme
|
||||
NORWEGIAN: Language
|
||||
POLISH: Language
|
||||
PORTUGUESE: Language
|
||||
RED: Theme
|
||||
RUSSIAN: Language
|
||||
SERBIAN: Language
|
||||
SIMPLIFIED_CHINESE: Language
|
||||
SLOVENIAN: Language
|
||||
SPANISH: Language
|
||||
SWEDISH: Language
|
||||
TRADITIONAL_CHINESE: Language
|
||||
TURKISH: Language
|
||||
UKRAINIAN: Language
|
||||
|
||||
class DeviceUIConfig(_message.Message):
|
||||
__slots__ = ["alert_enabled", "banner_enabled", "calibration_data", "compass_mode", "gps_format", "is_clockface_analog", "language", "map_data", "node_filter", "node_highlight", "pin_code", "ring_tone_id", "screen_brightness", "screen_lock", "screen_rgb_color", "screen_timeout", "settings_lock", "theme", "version"]
|
||||
class GpsCoordinateFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ALERT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
BANNER_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
CALIBRATION_DATA_FIELD_NUMBER: _ClassVar[int]
|
||||
COMPASS_MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
DEC: DeviceUIConfig.GpsCoordinateFormat
|
||||
DMS: DeviceUIConfig.GpsCoordinateFormat
|
||||
GPS_FORMAT_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_CLOCKFACE_ANALOG_FIELD_NUMBER: _ClassVar[int]
|
||||
LANGUAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
MAP_DATA_FIELD_NUMBER: _ClassVar[int]
|
||||
MGRS: DeviceUIConfig.GpsCoordinateFormat
|
||||
MLS: DeviceUIConfig.GpsCoordinateFormat
|
||||
NODE_FILTER_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_HIGHLIGHT_FIELD_NUMBER: _ClassVar[int]
|
||||
OLC: DeviceUIConfig.GpsCoordinateFormat
|
||||
OSGR: DeviceUIConfig.GpsCoordinateFormat
|
||||
PIN_CODE_FIELD_NUMBER: _ClassVar[int]
|
||||
RING_TONE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
SCREEN_BRIGHTNESS_FIELD_NUMBER: _ClassVar[int]
|
||||
SCREEN_LOCK_FIELD_NUMBER: _ClassVar[int]
|
||||
SCREEN_RGB_COLOR_FIELD_NUMBER: _ClassVar[int]
|
||||
SCREEN_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
|
||||
SETTINGS_LOCK_FIELD_NUMBER: _ClassVar[int]
|
||||
THEME_FIELD_NUMBER: _ClassVar[int]
|
||||
UTM: DeviceUIConfig.GpsCoordinateFormat
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
alert_enabled: bool
|
||||
banner_enabled: bool
|
||||
calibration_data: bytes
|
||||
compass_mode: CompassMode
|
||||
gps_format: DeviceUIConfig.GpsCoordinateFormat
|
||||
is_clockface_analog: bool
|
||||
language: Language
|
||||
map_data: Map
|
||||
node_filter: NodeFilter
|
||||
node_highlight: NodeHighlight
|
||||
pin_code: int
|
||||
ring_tone_id: int
|
||||
screen_brightness: int
|
||||
screen_lock: bool
|
||||
screen_rgb_color: int
|
||||
screen_timeout: int
|
||||
settings_lock: bool
|
||||
theme: Theme
|
||||
version: int
|
||||
def __init__(self, version: _Optional[int] = ..., screen_brightness: _Optional[int] = ..., screen_timeout: _Optional[int] = ..., screen_lock: bool = ..., settings_lock: bool = ..., pin_code: _Optional[int] = ..., theme: _Optional[_Union[Theme, str]] = ..., alert_enabled: bool = ..., banner_enabled: bool = ..., ring_tone_id: _Optional[int] = ..., language: _Optional[_Union[Language, str]] = ..., node_filter: _Optional[_Union[NodeFilter, _Mapping]] = ..., node_highlight: _Optional[_Union[NodeHighlight, _Mapping]] = ..., calibration_data: _Optional[bytes] = ..., map_data: _Optional[_Union[Map, _Mapping]] = ..., compass_mode: _Optional[_Union[CompassMode, str]] = ..., screen_rgb_color: _Optional[int] = ..., is_clockface_analog: bool = ..., gps_format: _Optional[_Union[DeviceUIConfig.GpsCoordinateFormat, str]] = ...) -> None: ...
|
||||
|
||||
class GeoPoint(_message.Message):
|
||||
__slots__ = ["latitude", "longitude", "zoom"]
|
||||
LATITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
ZOOM_FIELD_NUMBER: _ClassVar[int]
|
||||
latitude: int
|
||||
longitude: int
|
||||
zoom: int
|
||||
def __init__(self, zoom: _Optional[int] = ..., latitude: _Optional[int] = ..., longitude: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class Map(_message.Message):
|
||||
__slots__ = ["follow_gps", "home", "style"]
|
||||
FOLLOW_GPS_FIELD_NUMBER: _ClassVar[int]
|
||||
HOME_FIELD_NUMBER: _ClassVar[int]
|
||||
STYLE_FIELD_NUMBER: _ClassVar[int]
|
||||
follow_gps: bool
|
||||
home: GeoPoint
|
||||
style: str
|
||||
def __init__(self, home: _Optional[_Union[GeoPoint, _Mapping]] = ..., style: _Optional[str] = ..., follow_gps: bool = ...) -> None: ...
|
||||
|
||||
class NodeFilter(_message.Message):
|
||||
__slots__ = ["channel", "hops_away", "node_name", "offline_switch", "position_switch", "public_key_switch", "unknown_switch"]
|
||||
CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
OFFLINE_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLIC_KEY_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
UNKNOWN_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
channel: int
|
||||
hops_away: int
|
||||
node_name: str
|
||||
offline_switch: bool
|
||||
position_switch: bool
|
||||
public_key_switch: bool
|
||||
unknown_switch: bool
|
||||
def __init__(self, unknown_switch: bool = ..., offline_switch: bool = ..., public_key_switch: bool = ..., hops_away: _Optional[int] = ..., position_switch: bool = ..., node_name: _Optional[str] = ..., channel: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class NodeHighlight(_message.Message):
|
||||
__slots__ = ["chat_switch", "iaq_switch", "node_name", "position_switch", "telemetry_switch"]
|
||||
CHAT_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
IAQ_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
TELEMETRY_SWITCH_FIELD_NUMBER: _ClassVar[int]
|
||||
chat_switch: bool
|
||||
iaq_switch: bool
|
||||
node_name: str
|
||||
position_switch: bool
|
||||
telemetry_switch: bool
|
||||
def __init__(self, chat_switch: bool = ..., position_switch: bool = ..., telemetry_switch: bool = ..., iaq_switch: bool = ..., node_name: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class CompassMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class Theme(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class Language(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,52 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/deviceonly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2
|
||||
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
||||
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
|
||||
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
|
||||
from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\"\x94\x02\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xf0\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12:\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBn\n\x14org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.deviceonly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
|
||||
_USERLITE.fields_by_name['macaddr']._options = None
|
||||
_USERLITE.fields_by_name['macaddr']._serialized_options = b'\030\001'
|
||||
_DEVICESTATE.fields_by_name['no_save']._options = None
|
||||
_DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
|
||||
_DEVICESTATE.fields_by_name['did_gps_reset']._options = None
|
||||
_DEVICESTATE.fields_by_name['did_gps_reset']._serialized_options = b'\030\001'
|
||||
_NODEDATABASE.fields_by_name['nodes']._options = None
|
||||
_NODEDATABASE.fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector<meshtastic_NodeInfoLite>'
|
||||
_POSITIONLITE._serialized_start=271
|
||||
_POSITIONLITE._serialized_end=424
|
||||
_USERLITE._serialized_start=427
|
||||
_USERLITE._serialized_end=703
|
||||
_NODEINFOLITE._serialized_start=706
|
||||
_NODEINFOLITE._serialized_end=1074
|
||||
_DEVICESTATE._serialized_start=1077
|
||||
_DEVICESTATE._serialized_end=1494
|
||||
_NODEDATABASE._serialized_start=1496
|
||||
_NODEDATABASE._serialized_end=1621
|
||||
_CHANNELFILE._serialized_start=1623
|
||||
_CHANNELFILE._serialized_end=1701
|
||||
_BACKUPPREFERENCES._serialized_start=1704
|
||||
_BACKUPPREFERENCES._serialized_end=1966
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,130 +0,0 @@
|
||||
from meshtastic.protobuf import channel_pb2 as _channel_pb2
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from meshtastic.protobuf import localonly_pb2 as _localonly_pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
|
||||
from meshtastic.protobuf import telemetry_pb2 as _telemetry_pb2
|
||||
from meshtastic.protobuf import nanopb_pb2 as _nanopb_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class BackupPreferences(_message.Message):
|
||||
__slots__ = ["channels", "config", "module_config", "owner", "timestamp", "version"]
|
||||
CHANNELS_FIELD_NUMBER: _ClassVar[int]
|
||||
CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
MODULE_CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
OWNER_FIELD_NUMBER: _ClassVar[int]
|
||||
TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
channels: ChannelFile
|
||||
config: _localonly_pb2.LocalConfig
|
||||
module_config: _localonly_pb2.LocalModuleConfig
|
||||
owner: _mesh_pb2.User
|
||||
timestamp: int
|
||||
version: int
|
||||
def __init__(self, version: _Optional[int] = ..., timestamp: _Optional[int] = ..., config: _Optional[_Union[_localonly_pb2.LocalConfig, _Mapping]] = ..., module_config: _Optional[_Union[_localonly_pb2.LocalModuleConfig, _Mapping]] = ..., channels: _Optional[_Union[ChannelFile, _Mapping]] = ..., owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class ChannelFile(_message.Message):
|
||||
__slots__ = ["channels", "version"]
|
||||
CHANNELS_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
channels: _containers.RepeatedCompositeFieldContainer[_channel_pb2.Channel]
|
||||
version: int
|
||||
def __init__(self, channels: _Optional[_Iterable[_Union[_channel_pb2.Channel, _Mapping]]] = ..., version: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class DeviceState(_message.Message):
|
||||
__slots__ = ["did_gps_reset", "my_node", "no_save", "node_remote_hardware_pins", "owner", "receive_queue", "rx_text_message", "rx_waypoint", "version"]
|
||||
DID_GPS_RESET_FIELD_NUMBER: _ClassVar[int]
|
||||
MY_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: _ClassVar[int]
|
||||
NO_SAVE_FIELD_NUMBER: _ClassVar[int]
|
||||
OWNER_FIELD_NUMBER: _ClassVar[int]
|
||||
RECEIVE_QUEUE_FIELD_NUMBER: _ClassVar[int]
|
||||
RX_TEXT_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
RX_WAYPOINT_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
did_gps_reset: bool
|
||||
my_node: _mesh_pb2.MyNodeInfo
|
||||
no_save: bool
|
||||
node_remote_hardware_pins: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.NodeRemoteHardwarePin]
|
||||
owner: _mesh_pb2.User
|
||||
receive_queue: _containers.RepeatedCompositeFieldContainer[_mesh_pb2.MeshPacket]
|
||||
rx_text_message: _mesh_pb2.MeshPacket
|
||||
rx_waypoint: _mesh_pb2.MeshPacket
|
||||
version: int
|
||||
def __init__(self, my_node: _Optional[_Union[_mesh_pb2.MyNodeInfo, _Mapping]] = ..., owner: _Optional[_Union[_mesh_pb2.User, _Mapping]] = ..., receive_queue: _Optional[_Iterable[_Union[_mesh_pb2.MeshPacket, _Mapping]]] = ..., version: _Optional[int] = ..., rx_text_message: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., no_save: bool = ..., did_gps_reset: bool = ..., rx_waypoint: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., node_remote_hardware_pins: _Optional[_Iterable[_Union[_mesh_pb2.NodeRemoteHardwarePin, _Mapping]]] = ...) -> None: ...
|
||||
|
||||
class NodeDatabase(_message.Message):
|
||||
__slots__ = ["nodes", "version"]
|
||||
NODES_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
nodes: _containers.RepeatedCompositeFieldContainer[NodeInfoLite]
|
||||
version: int
|
||||
def __init__(self, version: _Optional[int] = ..., nodes: _Optional[_Iterable[_Union[NodeInfoLite, _Mapping]]] = ...) -> None: ...
|
||||
|
||||
class NodeInfoLite(_message.Message):
|
||||
__slots__ = ["bitfield", "channel", "device_metrics", "hops_away", "is_favorite", "is_ignored", "last_heard", "next_hop", "num", "position", "snr", "user", "via_mqtt"]
|
||||
BITFIELD_FIELD_NUMBER: _ClassVar[int]
|
||||
CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
|
||||
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_FAVORITE_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_IGNORED_FIELD_NUMBER: _ClassVar[int]
|
||||
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
|
||||
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
|
||||
NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
SNR_FIELD_NUMBER: _ClassVar[int]
|
||||
USER_FIELD_NUMBER: _ClassVar[int]
|
||||
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
bitfield: int
|
||||
channel: int
|
||||
device_metrics: _telemetry_pb2.DeviceMetrics
|
||||
hops_away: int
|
||||
is_favorite: bool
|
||||
is_ignored: bool
|
||||
last_heard: int
|
||||
next_hop: int
|
||||
num: int
|
||||
position: PositionLite
|
||||
snr: float
|
||||
user: UserLite
|
||||
via_mqtt: bool
|
||||
def __init__(self, num: _Optional[int] = ..., user: _Optional[_Union[UserLite, _Mapping]] = ..., position: _Optional[_Union[PositionLite, _Mapping]] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ..., channel: _Optional[int] = ..., via_mqtt: bool = ..., hops_away: _Optional[int] = ..., is_favorite: bool = ..., is_ignored: bool = ..., next_hop: _Optional[int] = ..., bitfield: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class PositionLite(_message.Message):
|
||||
__slots__ = ["altitude", "latitude_i", "location_source", "longitude_i", "time"]
|
||||
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCATION_SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
altitude: int
|
||||
latitude_i: int
|
||||
location_source: _mesh_pb2.Position.LocSource
|
||||
longitude_i: int
|
||||
time: int
|
||||
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., time: _Optional[int] = ..., location_source: _Optional[_Union[_mesh_pb2.Position.LocSource, str]] = ...) -> None: ...
|
||||
|
||||
class UserLite(_message.Message):
|
||||
__slots__ = ["hw_model", "is_licensed", "is_unmessagable", "long_name", "macaddr", "public_key", "role", "short_name"]
|
||||
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_UNMESSAGABLE_FIELD_NUMBER: _ClassVar[int]
|
||||
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
MACADDR_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
hw_model: _mesh_pb2.HardwareModel
|
||||
is_licensed: bool
|
||||
is_unmessagable: bool
|
||||
long_name: str
|
||||
macaddr: bytes
|
||||
public_key: bytes
|
||||
role: _config_pb2.Config.DeviceConfig.Role
|
||||
short_name: str
|
||||
def __init__(self, macaddr: _Optional[bytes] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., is_licensed: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., is_unmessagable: bool = ...) -> None: ...
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/interdevice.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/interdevice.proto\x12\x13meshtastic.protobuf\"s\n\nSensorData\x12.\n\x04type\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.MessageType\x12\x15\n\x0b\x66loat_value\x18\x02 \x01(\x02H\x00\x12\x16\n\x0cuint32_value\x18\x03 \x01(\rH\x00\x42\x06\n\x04\x64\x61ta\"_\n\x12InterdeviceMessage\x12\x0e\n\x04nmea\x18\x01 \x01(\tH\x00\x12\x31\n\x06sensor\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.SensorDataH\x00\x42\x06\n\x04\x64\x61ta*\xd5\x01\n\x0bMessageType\x12\x07\n\x03\x41\x43K\x10\x00\x12\x15\n\x10\x43OLLECT_INTERVAL\x10\xa0\x01\x12\x0c\n\x07\x42\x45\x45P_ON\x10\xa1\x01\x12\r\n\x08\x42\x45\x45P_OFF\x10\xa2\x01\x12\r\n\x08SHUTDOWN\x10\xa3\x01\x12\r\n\x08POWER_ON\x10\xa4\x01\x12\x0f\n\nSCD41_TEMP\x10\xb0\x01\x12\x13\n\x0eSCD41_HUMIDITY\x10\xb1\x01\x12\x0e\n\tSCD41_CO2\x10\xb2\x01\x12\x0f\n\nAHT20_TEMP\x10\xb3\x01\x12\x13\n\x0e\x41HT20_HUMIDITY\x10\xb4\x01\x12\x0f\n\nTVOC_INDEX\x10\xb5\x01\x42g\n\x14org.meshtastic.protoB\x11InterdeviceProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.interdevice_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\021InterdeviceProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_MESSAGETYPE._serialized_start=277
|
||||
_MESSAGETYPE._serialized_end=490
|
||||
_SENSORDATA._serialized_start=62
|
||||
_SENSORDATA._serialized_end=177
|
||||
_INTERDEVICEMESSAGE._serialized_start=179
|
||||
_INTERDEVICEMESSAGE._serialized_end=274
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,39 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
ACK: MessageType
|
||||
AHT20_HUMIDITY: MessageType
|
||||
AHT20_TEMP: MessageType
|
||||
BEEP_OFF: MessageType
|
||||
BEEP_ON: MessageType
|
||||
COLLECT_INTERVAL: MessageType
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
POWER_ON: MessageType
|
||||
SCD41_CO2: MessageType
|
||||
SCD41_HUMIDITY: MessageType
|
||||
SCD41_TEMP: MessageType
|
||||
SHUTDOWN: MessageType
|
||||
TVOC_INDEX: MessageType
|
||||
|
||||
class InterdeviceMessage(_message.Message):
|
||||
__slots__ = ["nmea", "sensor"]
|
||||
NMEA_FIELD_NUMBER: _ClassVar[int]
|
||||
SENSOR_FIELD_NUMBER: _ClassVar[int]
|
||||
nmea: str
|
||||
sensor: SensorData
|
||||
def __init__(self, nmea: _Optional[str] = ..., sensor: _Optional[_Union[SensorData, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class SensorData(_message.Message):
|
||||
__slots__ = ["float_value", "type", "uint32_value"]
|
||||
FLOAT_VALUE_FIELD_NUMBER: _ClassVar[int]
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
UINT32_VALUE_FIELD_NUMBER: _ClassVar[int]
|
||||
float_value: float
|
||||
type: MessageType
|
||||
uint32_value: int
|
||||
def __init__(self, type: _Optional[_Union[MessageType, str]] = ..., float_value: _Optional[float] = ..., uint32_value: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/localonly.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
||||
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/localonly.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xfa\x03\n\x0bLocalConfig\x12\x38\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfig\x12<\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfig\x12\x36\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfig\x12:\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfig\x12:\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfig\x12\x34\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfig\x12>\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\x12<\n\x08security\x18\t \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfig\"\xcf\t\n\x11LocalModuleConfig\x12:\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfig\x12>\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfig\x12[\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfig\x12K\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfig\x12\x45\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfig\x12\x44\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfig\x12M\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfig\x12<\n\x05\x61udio\x18\t \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfig\x12O\n\x0fremote_hardware\x18\n \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfig\x12K\n\rneighbor_info\x18\x0b \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfig\x12Q\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfig\x12Q\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig\x12\x46\n\npaxcounter\x18\x0e \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfig\x12L\n\rstatusmessage\x18\x0f \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfig\x12U\n\x12traffic_management\x18\x10 \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfig\x12\x38\n\x03tak\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBe\n\x14org.meshtastic.protoB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.localonly_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_LOCALCONFIG._serialized_start=136
|
||||
_LOCALCONFIG._serialized_end=642
|
||||
_LOCALMODULECONFIG._serialized_start=645
|
||||
_LOCALMODULECONFIG._serialized_end=1876
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,67 +0,0 @@
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class LocalConfig(_message.Message):
|
||||
__slots__ = ["bluetooth", "device", "display", "lora", "network", "position", "power", "security", "version"]
|
||||
BLUETOOTH_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_FIELD_NUMBER: _ClassVar[int]
|
||||
DISPLAY_FIELD_NUMBER: _ClassVar[int]
|
||||
LORA_FIELD_NUMBER: _ClassVar[int]
|
||||
NETWORK_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
POWER_FIELD_NUMBER: _ClassVar[int]
|
||||
SECURITY_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
bluetooth: _config_pb2.Config.BluetoothConfig
|
||||
device: _config_pb2.Config.DeviceConfig
|
||||
display: _config_pb2.Config.DisplayConfig
|
||||
lora: _config_pb2.Config.LoRaConfig
|
||||
network: _config_pb2.Config.NetworkConfig
|
||||
position: _config_pb2.Config.PositionConfig
|
||||
power: _config_pb2.Config.PowerConfig
|
||||
security: _config_pb2.Config.SecurityConfig
|
||||
version: int
|
||||
def __init__(self, device: _Optional[_Union[_config_pb2.Config.DeviceConfig, _Mapping]] = ..., position: _Optional[_Union[_config_pb2.Config.PositionConfig, _Mapping]] = ..., power: _Optional[_Union[_config_pb2.Config.PowerConfig, _Mapping]] = ..., network: _Optional[_Union[_config_pb2.Config.NetworkConfig, _Mapping]] = ..., display: _Optional[_Union[_config_pb2.Config.DisplayConfig, _Mapping]] = ..., lora: _Optional[_Union[_config_pb2.Config.LoRaConfig, _Mapping]] = ..., bluetooth: _Optional[_Union[_config_pb2.Config.BluetoothConfig, _Mapping]] = ..., version: _Optional[int] = ..., security: _Optional[_Union[_config_pb2.Config.SecurityConfig, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class LocalModuleConfig(_message.Message):
|
||||
__slots__ = ["ambient_lighting", "audio", "canned_message", "detection_sensor", "external_notification", "mqtt", "neighbor_info", "paxcounter", "range_test", "remote_hardware", "serial", "statusmessage", "store_forward", "tak", "telemetry", "traffic_management", "version"]
|
||||
AMBIENT_LIGHTING_FIELD_NUMBER: _ClassVar[int]
|
||||
AUDIO_FIELD_NUMBER: _ClassVar[int]
|
||||
CANNED_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
DETECTION_SENSOR_FIELD_NUMBER: _ClassVar[int]
|
||||
EXTERNAL_NOTIFICATION_FIELD_NUMBER: _ClassVar[int]
|
||||
MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
NEIGHBOR_INFO_FIELD_NUMBER: _ClassVar[int]
|
||||
PAXCOUNTER_FIELD_NUMBER: _ClassVar[int]
|
||||
RANGE_TEST_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTE_HARDWARE_FIELD_NUMBER: _ClassVar[int]
|
||||
SERIAL_FIELD_NUMBER: _ClassVar[int]
|
||||
STATUSMESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
STORE_FORWARD_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_FIELD_NUMBER: _ClassVar[int]
|
||||
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
|
||||
TRAFFIC_MANAGEMENT_FIELD_NUMBER: _ClassVar[int]
|
||||
VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
ambient_lighting: _module_config_pb2.ModuleConfig.AmbientLightingConfig
|
||||
audio: _module_config_pb2.ModuleConfig.AudioConfig
|
||||
canned_message: _module_config_pb2.ModuleConfig.CannedMessageConfig
|
||||
detection_sensor: _module_config_pb2.ModuleConfig.DetectionSensorConfig
|
||||
external_notification: _module_config_pb2.ModuleConfig.ExternalNotificationConfig
|
||||
mqtt: _module_config_pb2.ModuleConfig.MQTTConfig
|
||||
neighbor_info: _module_config_pb2.ModuleConfig.NeighborInfoConfig
|
||||
paxcounter: _module_config_pb2.ModuleConfig.PaxcounterConfig
|
||||
range_test: _module_config_pb2.ModuleConfig.RangeTestConfig
|
||||
remote_hardware: _module_config_pb2.ModuleConfig.RemoteHardwareConfig
|
||||
serial: _module_config_pb2.ModuleConfig.SerialConfig
|
||||
statusmessage: _module_config_pb2.ModuleConfig.StatusMessageConfig
|
||||
store_forward: _module_config_pb2.ModuleConfig.StoreForwardConfig
|
||||
tak: _module_config_pb2.ModuleConfig.TAKConfig
|
||||
telemetry: _module_config_pb2.ModuleConfig.TelemetryConfig
|
||||
traffic_management: _module_config_pb2.ModuleConfig.TrafficManagementConfig
|
||||
version: int
|
||||
def __init__(self, mqtt: _Optional[_Union[_module_config_pb2.ModuleConfig.MQTTConfig, _Mapping]] = ..., serial: _Optional[_Union[_module_config_pb2.ModuleConfig.SerialConfig, _Mapping]] = ..., external_notification: _Optional[_Union[_module_config_pb2.ModuleConfig.ExternalNotificationConfig, _Mapping]] = ..., store_forward: _Optional[_Union[_module_config_pb2.ModuleConfig.StoreForwardConfig, _Mapping]] = ..., range_test: _Optional[_Union[_module_config_pb2.ModuleConfig.RangeTestConfig, _Mapping]] = ..., telemetry: _Optional[_Union[_module_config_pb2.ModuleConfig.TelemetryConfig, _Mapping]] = ..., canned_message: _Optional[_Union[_module_config_pb2.ModuleConfig.CannedMessageConfig, _Mapping]] = ..., audio: _Optional[_Union[_module_config_pb2.ModuleConfig.AudioConfig, _Mapping]] = ..., remote_hardware: _Optional[_Union[_module_config_pb2.ModuleConfig.RemoteHardwareConfig, _Mapping]] = ..., neighbor_info: _Optional[_Union[_module_config_pb2.ModuleConfig.NeighborInfoConfig, _Mapping]] = ..., ambient_lighting: _Optional[_Union[_module_config_pb2.ModuleConfig.AmbientLightingConfig, _Mapping]] = ..., detection_sensor: _Optional[_Union[_module_config_pb2.ModuleConfig.DetectionSensorConfig, _Mapping]] = ..., paxcounter: _Optional[_Union[_module_config_pb2.ModuleConfig.PaxcounterConfig, _Mapping]] = ..., statusmessage: _Optional[_Union[_module_config_pb2.ModuleConfig.StatusMessageConfig, _Mapping]] = ..., traffic_management: _Optional[_Union[_module_config_pb2.ModuleConfig.TrafficManagementConfig, _Mapping]] = ..., tak: _Optional[_Union[_module_config_pb2.ModuleConfig.TAKConfig, _Mapping]] = ..., version: _Optional[int] = ...) -> None: ...
|
||||
File diff suppressed because one or more lines are too long
@@ -1,875 +0,0 @@
|
||||
from meshtastic.protobuf import channel_pb2 as _channel_pb2
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
|
||||
from meshtastic.protobuf import module_config_pb2 as _module_config_pb2
|
||||
from meshtastic.protobuf import portnums_pb2 as _portnums_pb2
|
||||
from meshtastic.protobuf import telemetry_pb2 as _telemetry_pb2
|
||||
from meshtastic.protobuf import xmodem_pb2 as _xmodem_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
AMBIENTLIGHTING_CONFIG: ExcludedModules
|
||||
ANDROID_SIM: HardwareModel
|
||||
AUDIO_CONFIG: ExcludedModules
|
||||
BETAFPV_2400_TX: HardwareModel
|
||||
BETAFPV_900_NANO_TX: HardwareModel
|
||||
BLUETOOTH_CONFIG: ExcludedModules
|
||||
BROWNOUT: CriticalErrorCode
|
||||
BURNING_MAN: FirmwareEdition
|
||||
CANARYONE: HardwareModel
|
||||
CANNEDMSG_CONFIG: ExcludedModules
|
||||
CDEBYTE_EORA_S3: HardwareModel
|
||||
CHATTER_2: HardwareModel
|
||||
CROWPANEL: HardwareModel
|
||||
DATA_PAYLOAD_LEN: Constants
|
||||
DEFCON: FirmwareEdition
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
DETECTIONSENSOR_CONFIG: ExcludedModules
|
||||
DIY_EDITION: FirmwareEdition
|
||||
DIY_V1: HardwareModel
|
||||
DR_DEV: HardwareModel
|
||||
EBYTE_ESP32_S3: HardwareModel
|
||||
ESP32_S3_PICO: HardwareModel
|
||||
EXCLUDED_NONE: ExcludedModules
|
||||
EXTNOTIF_CONFIG: ExcludedModules
|
||||
FLASH_CORRUPTION_RECOVERABLE: CriticalErrorCode
|
||||
FLASH_CORRUPTION_UNRECOVERABLE: CriticalErrorCode
|
||||
GENIEBLOCKS: HardwareModel
|
||||
HAMVENTION: FirmwareEdition
|
||||
HELTEC_CAPSULE_SENSOR_V3: HardwareModel
|
||||
HELTEC_HRU_3601: HardwareModel
|
||||
HELTEC_HT62: HardwareModel
|
||||
HELTEC_MESH_NODE_T096: HardwareModel
|
||||
HELTEC_MESH_NODE_T1: HardwareModel
|
||||
HELTEC_MESH_NODE_T114: HardwareModel
|
||||
HELTEC_MESH_POCKET: HardwareModel
|
||||
HELTEC_MESH_SOLAR: HardwareModel
|
||||
HELTEC_SENSOR_HUB: HardwareModel
|
||||
HELTEC_V1: HardwareModel
|
||||
HELTEC_V2_0: HardwareModel
|
||||
HELTEC_V2_1: HardwareModel
|
||||
HELTEC_V3: HardwareModel
|
||||
HELTEC_V4: HardwareModel
|
||||
HELTEC_V4_R8: HardwareModel
|
||||
HELTEC_VISION_MASTER_E213: HardwareModel
|
||||
HELTEC_VISION_MASTER_E290: HardwareModel
|
||||
HELTEC_VISION_MASTER_T190: HardwareModel
|
||||
HELTEC_WIRELESS_BRIDGE: HardwareModel
|
||||
HELTEC_WIRELESS_PAPER: HardwareModel
|
||||
HELTEC_WIRELESS_PAPER_V1_0: HardwareModel
|
||||
HELTEC_WIRELESS_TRACKER: HardwareModel
|
||||
HELTEC_WIRELESS_TRACKER_V1_0: HardwareModel
|
||||
HELTEC_WIRELESS_TRACKER_V2: HardwareModel
|
||||
HELTEC_WSL_V3: HardwareModel
|
||||
INVALID_RADIO_SETTING: CriticalErrorCode
|
||||
LILYGO_TBEAM_S3_CORE: HardwareModel
|
||||
LINK_32: HardwareModel
|
||||
LORA_RELAY_V1: HardwareModel
|
||||
LORA_TYPE: HardwareModel
|
||||
M5STACK: HardwareModel
|
||||
M5STACK_C6L: HardwareModel
|
||||
M5STACK_CARDPUTER_ADV: HardwareModel
|
||||
M5STACK_CORE2: HardwareModel
|
||||
M5STACK_COREBASIC: HardwareModel
|
||||
M5STACK_CORES3: HardwareModel
|
||||
M5STACK_RESERVED: HardwareModel
|
||||
ME25LS01_4Y10TD: HardwareModel
|
||||
MESHLINK: HardwareModel
|
||||
MESHSTICK_1262: HardwareModel
|
||||
MESH_TAB: HardwareModel
|
||||
MINI_EPAPER_S3: HardwareModel
|
||||
MQTT_CONFIG: ExcludedModules
|
||||
MS24SF1: HardwareModel
|
||||
MUZI_BASE: HardwareModel
|
||||
MUZI_R1_NEO: HardwareModel
|
||||
NANO_G1: HardwareModel
|
||||
NANO_G1_EXPLORER: HardwareModel
|
||||
NANO_G2_ULTRA: HardwareModel
|
||||
NEIGHBORINFO_CONFIG: ExcludedModules
|
||||
NETWORK_CONFIG: ExcludedModules
|
||||
NOMADSTAR_METEOR_PRO: HardwareModel
|
||||
NONE: CriticalErrorCode
|
||||
NO_AXP192: CriticalErrorCode
|
||||
NO_RADIO: CriticalErrorCode
|
||||
NRF52840_PCA10059: HardwareModel
|
||||
NRF52_PROMICRO_DIY: HardwareModel
|
||||
NRF52_UNKNOWN: HardwareModel
|
||||
OPEN_SAUCE: FirmwareEdition
|
||||
PAXCOUNTER_CONFIG: ExcludedModules
|
||||
PICOMPUTER_S3: HardwareModel
|
||||
PORTDUINO: HardwareModel
|
||||
PPR: HardwareModel
|
||||
PRIVATE_HW: HardwareModel
|
||||
RADIOMASTER_900_BANDIT: HardwareModel
|
||||
RADIOMASTER_900_BANDIT_NANO: HardwareModel
|
||||
RADIO_SPI_BUG: CriticalErrorCode
|
||||
RAK11200: HardwareModel
|
||||
RAK11310: HardwareModel
|
||||
RAK2560: HardwareModel
|
||||
RAK3172: HardwareModel
|
||||
RAK3312: HardwareModel
|
||||
RAK3401: HardwareModel
|
||||
RAK4631: HardwareModel
|
||||
RAK6421: HardwareModel
|
||||
RANGETEST_CONFIG: ExcludedModules
|
||||
REMOTEHARDWARE_CONFIG: ExcludedModules
|
||||
ROUTASTIC: HardwareModel
|
||||
RP2040_FEATHER_RFM95: HardwareModel
|
||||
RP2040_LORA: HardwareModel
|
||||
RPI_PICO: HardwareModel
|
||||
RPI_PICO2: HardwareModel
|
||||
SEEED_SOLAR_NODE: HardwareModel
|
||||
SEEED_WIO_TRACKER_L1: HardwareModel
|
||||
SEEED_WIO_TRACKER_L1_EINK: HardwareModel
|
||||
SEEED_XIAO_S3: HardwareModel
|
||||
SENSECAP_INDICATOR: HardwareModel
|
||||
SENSELORA_RP2040: HardwareModel
|
||||
SENSELORA_S3: HardwareModel
|
||||
SERIAL_CONFIG: ExcludedModules
|
||||
SLEEP_ENTER_WAIT: CriticalErrorCode
|
||||
SMART_CITIZEN: FirmwareEdition
|
||||
STATION_G1: HardwareModel
|
||||
STATION_G2: HardwareModel
|
||||
STATION_G3: HardwareModel
|
||||
STOREFORWARD_CONFIG: ExcludedModules
|
||||
SX1262_FAILURE: CriticalErrorCode
|
||||
T5_S3_EPAPER_PRO: HardwareModel
|
||||
TBEAM: HardwareModel
|
||||
TBEAM_1_WATT: HardwareModel
|
||||
TBEAM_BPF: HardwareModel
|
||||
TBEAM_V0P7: HardwareModel
|
||||
TDISPLAY_S3_PRO: HardwareModel
|
||||
TD_LORAC: HardwareModel
|
||||
TELEMETRY_CONFIG: ExcludedModules
|
||||
THINKNODE_M1: HardwareModel
|
||||
THINKNODE_M2: HardwareModel
|
||||
THINKNODE_M3: HardwareModel
|
||||
THINKNODE_M4: HardwareModel
|
||||
THINKNODE_M5: HardwareModel
|
||||
THINKNODE_M6: HardwareModel
|
||||
THINKNODE_M7: HardwareModel
|
||||
THINKNODE_M8: HardwareModel
|
||||
THINKNODE_M9: HardwareModel
|
||||
TLORA_C6: HardwareModel
|
||||
TLORA_T3_S3: HardwareModel
|
||||
TLORA_V1: HardwareModel
|
||||
TLORA_V1_1P3: HardwareModel
|
||||
TLORA_V2: HardwareModel
|
||||
TLORA_V2_1_1P6: HardwareModel
|
||||
TLORA_V2_1_1P8: HardwareModel
|
||||
TRACKER_T1000_E: HardwareModel
|
||||
TRACKER_T1000_E_PRO: HardwareModel
|
||||
TRANSMIT_FAILED: CriticalErrorCode
|
||||
TWC_MESH_V4: HardwareModel
|
||||
TX_WATCHDOG: CriticalErrorCode
|
||||
T_DECK: HardwareModel
|
||||
T_DECK_PRO: HardwareModel
|
||||
T_ECHO: HardwareModel
|
||||
T_ECHO_CARD: HardwareModel
|
||||
T_ECHO_LITE: HardwareModel
|
||||
T_ECHO_PLUS: HardwareModel
|
||||
T_ETH_ELITE: HardwareModel
|
||||
T_IMPULSE_PLUS: HardwareModel
|
||||
T_LORA_PAGER: HardwareModel
|
||||
T_WATCH_S3: HardwareModel
|
||||
T_WATCH_ULTRA: HardwareModel
|
||||
UBLOX_UNIT_FAILED: CriticalErrorCode
|
||||
UNPHONE: HardwareModel
|
||||
UNSET: HardwareModel
|
||||
UNSPECIFIED: CriticalErrorCode
|
||||
VANILLA: FirmwareEdition
|
||||
WIO_E5: HardwareModel
|
||||
WIO_WM1110: HardwareModel
|
||||
WIPHONE: HardwareModel
|
||||
WISMESH_TAG: HardwareModel
|
||||
WISMESH_TAP: HardwareModel
|
||||
WISMESH_TAP_V2: HardwareModel
|
||||
XIAO_NRF52_KIT: HardwareModel
|
||||
ZERO: Constants
|
||||
|
||||
class ChunkedPayload(_message.Message):
|
||||
__slots__ = ["chunk_count", "chunk_index", "payload_chunk", "payload_id"]
|
||||
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
CHUNK_INDEX_FIELD_NUMBER: _ClassVar[int]
|
||||
PAYLOAD_CHUNK_FIELD_NUMBER: _ClassVar[int]
|
||||
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
chunk_count: int
|
||||
chunk_index: int
|
||||
payload_chunk: bytes
|
||||
payload_id: int
|
||||
def __init__(self, payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ..., chunk_index: _Optional[int] = ..., payload_chunk: _Optional[bytes] = ...) -> None: ...
|
||||
|
||||
class ChunkedPayloadResponse(_message.Message):
|
||||
__slots__ = ["accept_transfer", "payload_id", "request_transfer", "resend_chunks"]
|
||||
ACCEPT_TRANSFER_FIELD_NUMBER: _ClassVar[int]
|
||||
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
REQUEST_TRANSFER_FIELD_NUMBER: _ClassVar[int]
|
||||
RESEND_CHUNKS_FIELD_NUMBER: _ClassVar[int]
|
||||
accept_transfer: bool
|
||||
payload_id: int
|
||||
request_transfer: bool
|
||||
resend_chunks: resend_chunks
|
||||
def __init__(self, payload_id: _Optional[int] = ..., request_transfer: bool = ..., accept_transfer: bool = ..., resend_chunks: _Optional[_Union[resend_chunks, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class ClientNotification(_message.Message):
|
||||
__slots__ = ["duplicated_public_key", "key_verification_final", "key_verification_number_inform", "key_verification_number_request", "level", "low_entropy_key", "message", "reply_id", "time"]
|
||||
DUPLICATED_PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
KEY_VERIFICATION_FINAL_FIELD_NUMBER: _ClassVar[int]
|
||||
KEY_VERIFICATION_NUMBER_INFORM_FIELD_NUMBER: _ClassVar[int]
|
||||
KEY_VERIFICATION_NUMBER_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
LEVEL_FIELD_NUMBER: _ClassVar[int]
|
||||
LOW_ENTROPY_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
REPLY_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
duplicated_public_key: DuplicatedPublicKey
|
||||
key_verification_final: KeyVerificationFinal
|
||||
key_verification_number_inform: KeyVerificationNumberInform
|
||||
key_verification_number_request: KeyVerificationNumberRequest
|
||||
level: LogRecord.Level
|
||||
low_entropy_key: LowEntropyKey
|
||||
message: str
|
||||
reply_id: int
|
||||
time: int
|
||||
def __init__(self, reply_id: _Optional[int] = ..., time: _Optional[int] = ..., level: _Optional[_Union[LogRecord.Level, str]] = ..., message: _Optional[str] = ..., key_verification_number_inform: _Optional[_Union[KeyVerificationNumberInform, _Mapping]] = ..., key_verification_number_request: _Optional[_Union[KeyVerificationNumberRequest, _Mapping]] = ..., key_verification_final: _Optional[_Union[KeyVerificationFinal, _Mapping]] = ..., duplicated_public_key: _Optional[_Union[DuplicatedPublicKey, _Mapping]] = ..., low_entropy_key: _Optional[_Union[LowEntropyKey, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class Compressed(_message.Message):
|
||||
__slots__ = ["data", "portnum"]
|
||||
DATA_FIELD_NUMBER: _ClassVar[int]
|
||||
PORTNUM_FIELD_NUMBER: _ClassVar[int]
|
||||
data: bytes
|
||||
portnum: _portnums_pb2.PortNum
|
||||
def __init__(self, portnum: _Optional[_Union[_portnums_pb2.PortNum, str]] = ..., data: _Optional[bytes] = ...) -> None: ...
|
||||
|
||||
class Data(_message.Message):
|
||||
__slots__ = ["bitfield", "dest", "emoji", "payload", "portnum", "reply_id", "request_id", "source", "want_response"]
|
||||
BITFIELD_FIELD_NUMBER: _ClassVar[int]
|
||||
DEST_FIELD_NUMBER: _ClassVar[int]
|
||||
EMOJI_FIELD_NUMBER: _ClassVar[int]
|
||||
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
|
||||
PORTNUM_FIELD_NUMBER: _ClassVar[int]
|
||||
REPLY_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
WANT_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
bitfield: int
|
||||
dest: int
|
||||
emoji: int
|
||||
payload: bytes
|
||||
portnum: _portnums_pb2.PortNum
|
||||
reply_id: int
|
||||
request_id: int
|
||||
source: int
|
||||
want_response: bool
|
||||
def __init__(self, portnum: _Optional[_Union[_portnums_pb2.PortNum, str]] = ..., payload: _Optional[bytes] = ..., want_response: bool = ..., dest: _Optional[int] = ..., source: _Optional[int] = ..., request_id: _Optional[int] = ..., reply_id: _Optional[int] = ..., emoji: _Optional[int] = ..., bitfield: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class DeviceMetadata(_message.Message):
|
||||
__slots__ = ["canShutdown", "device_state_version", "excluded_modules", "firmware_version", "hasBluetooth", "hasEthernet", "hasPKC", "hasRemoteHardware", "hasWifi", "hw_model", "position_flags", "role"]
|
||||
CANSHUTDOWN_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_STATE_VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
EXCLUDED_MODULES_FIELD_NUMBER: _ClassVar[int]
|
||||
FIRMWARE_VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
HASBLUETOOTH_FIELD_NUMBER: _ClassVar[int]
|
||||
HASETHERNET_FIELD_NUMBER: _ClassVar[int]
|
||||
HASPKC_FIELD_NUMBER: _ClassVar[int]
|
||||
HASREMOTEHARDWARE_FIELD_NUMBER: _ClassVar[int]
|
||||
HASWIFI_FIELD_NUMBER: _ClassVar[int]
|
||||
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
canShutdown: bool
|
||||
device_state_version: int
|
||||
excluded_modules: int
|
||||
firmware_version: str
|
||||
hasBluetooth: bool
|
||||
hasEthernet: bool
|
||||
hasPKC: bool
|
||||
hasRemoteHardware: bool
|
||||
hasWifi: bool
|
||||
hw_model: HardwareModel
|
||||
position_flags: int
|
||||
role: _config_pb2.Config.DeviceConfig.Role
|
||||
def __init__(self, firmware_version: _Optional[str] = ..., device_state_version: _Optional[int] = ..., canShutdown: bool = ..., hasWifi: bool = ..., hasBluetooth: bool = ..., hasEthernet: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., position_flags: _Optional[int] = ..., hw_model: _Optional[_Union[HardwareModel, str]] = ..., hasRemoteHardware: bool = ..., hasPKC: bool = ..., excluded_modules: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class DuplicatedPublicKey(_message.Message):
|
||||
__slots__ = []
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
class FileInfo(_message.Message):
|
||||
__slots__ = ["file_name", "size_bytes"]
|
||||
FILE_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
SIZE_BYTES_FIELD_NUMBER: _ClassVar[int]
|
||||
file_name: str
|
||||
size_bytes: int
|
||||
def __init__(self, file_name: _Optional[str] = ..., size_bytes: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class FromRadio(_message.Message):
|
||||
__slots__ = ["channel", "clientNotification", "config", "config_complete_id", "deviceuiConfig", "fileInfo", "id", "lockdown_status", "log_record", "metadata", "moduleConfig", "mqttClientProxyMessage", "my_info", "node_info", "packet", "queueStatus", "rebooted", "xmodemPacket"]
|
||||
CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
CLIENTNOTIFICATION_FIELD_NUMBER: _ClassVar[int]
|
||||
CONFIG_COMPLETE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
CONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICEUICONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
FILEINFO_FIELD_NUMBER: _ClassVar[int]
|
||||
ID_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCKDOWN_STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
LOG_RECORD_FIELD_NUMBER: _ClassVar[int]
|
||||
METADATA_FIELD_NUMBER: _ClassVar[int]
|
||||
MODULECONFIG_FIELD_NUMBER: _ClassVar[int]
|
||||
MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
MY_INFO_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_INFO_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKET_FIELD_NUMBER: _ClassVar[int]
|
||||
QUEUESTATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
REBOOTED_FIELD_NUMBER: _ClassVar[int]
|
||||
XMODEMPACKET_FIELD_NUMBER: _ClassVar[int]
|
||||
channel: _channel_pb2.Channel
|
||||
clientNotification: ClientNotification
|
||||
config: _config_pb2.Config
|
||||
config_complete_id: int
|
||||
deviceuiConfig: _device_ui_pb2.DeviceUIConfig
|
||||
fileInfo: FileInfo
|
||||
id: int
|
||||
lockdown_status: LockdownStatus
|
||||
log_record: LogRecord
|
||||
metadata: DeviceMetadata
|
||||
moduleConfig: _module_config_pb2.ModuleConfig
|
||||
mqttClientProxyMessage: MqttClientProxyMessage
|
||||
my_info: MyNodeInfo
|
||||
node_info: NodeInfo
|
||||
packet: MeshPacket
|
||||
queueStatus: QueueStatus
|
||||
rebooted: bool
|
||||
xmodemPacket: _xmodem_pb2.XModem
|
||||
def __init__(self, id: _Optional[int] = ..., packet: _Optional[_Union[MeshPacket, _Mapping]] = ..., my_info: _Optional[_Union[MyNodeInfo, _Mapping]] = ..., node_info: _Optional[_Union[NodeInfo, _Mapping]] = ..., config: _Optional[_Union[_config_pb2.Config, _Mapping]] = ..., log_record: _Optional[_Union[LogRecord, _Mapping]] = ..., config_complete_id: _Optional[int] = ..., rebooted: bool = ..., moduleConfig: _Optional[_Union[_module_config_pb2.ModuleConfig, _Mapping]] = ..., channel: _Optional[_Union[_channel_pb2.Channel, _Mapping]] = ..., queueStatus: _Optional[_Union[QueueStatus, _Mapping]] = ..., xmodemPacket: _Optional[_Union[_xmodem_pb2.XModem, _Mapping]] = ..., metadata: _Optional[_Union[DeviceMetadata, _Mapping]] = ..., mqttClientProxyMessage: _Optional[_Union[MqttClientProxyMessage, _Mapping]] = ..., fileInfo: _Optional[_Union[FileInfo, _Mapping]] = ..., clientNotification: _Optional[_Union[ClientNotification, _Mapping]] = ..., deviceuiConfig: _Optional[_Union[_device_ui_pb2.DeviceUIConfig, _Mapping]] = ..., lockdown_status: _Optional[_Union[LockdownStatus, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class Heartbeat(_message.Message):
|
||||
__slots__ = ["nonce"]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
nonce: int
|
||||
def __init__(self, nonce: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class KeyVerification(_message.Message):
|
||||
__slots__ = ["hash1", "hash2", "nonce"]
|
||||
HASH1_FIELD_NUMBER: _ClassVar[int]
|
||||
HASH2_FIELD_NUMBER: _ClassVar[int]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
hash1: bytes
|
||||
hash2: bytes
|
||||
nonce: int
|
||||
def __init__(self, nonce: _Optional[int] = ..., hash1: _Optional[bytes] = ..., hash2: _Optional[bytes] = ...) -> None: ...
|
||||
|
||||
class KeyVerificationFinal(_message.Message):
|
||||
__slots__ = ["isSender", "nonce", "remote_longname", "verification_characters"]
|
||||
ISSENDER_FIELD_NUMBER: _ClassVar[int]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
|
||||
VERIFICATION_CHARACTERS_FIELD_NUMBER: _ClassVar[int]
|
||||
isSender: bool
|
||||
nonce: int
|
||||
remote_longname: str
|
||||
verification_characters: str
|
||||
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ..., isSender: bool = ..., verification_characters: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class KeyVerificationNumberInform(_message.Message):
|
||||
__slots__ = ["nonce", "remote_longname", "security_number"]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
|
||||
SECURITY_NUMBER_FIELD_NUMBER: _ClassVar[int]
|
||||
nonce: int
|
||||
remote_longname: str
|
||||
security_number: int
|
||||
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ..., security_number: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class KeyVerificationNumberRequest(_message.Message):
|
||||
__slots__ = ["nonce", "remote_longname"]
|
||||
NONCE_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTE_LONGNAME_FIELD_NUMBER: _ClassVar[int]
|
||||
nonce: int
|
||||
remote_longname: str
|
||||
def __init__(self, nonce: _Optional[int] = ..., remote_longname: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class LockdownStatus(_message.Message):
|
||||
__slots__ = ["backoff_seconds", "boots_remaining", "lock_reason", "state", "valid_until_epoch"]
|
||||
class State(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
BACKOFF_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
BOOTS_REMAINING_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCKED: LockdownStatus.State
|
||||
LOCK_REASON_FIELD_NUMBER: _ClassVar[int]
|
||||
NEEDS_PROVISION: LockdownStatus.State
|
||||
STATE_FIELD_NUMBER: _ClassVar[int]
|
||||
STATE_UNSPECIFIED: LockdownStatus.State
|
||||
UNLOCKED: LockdownStatus.State
|
||||
UNLOCK_FAILED: LockdownStatus.State
|
||||
VALID_UNTIL_EPOCH_FIELD_NUMBER: _ClassVar[int]
|
||||
backoff_seconds: int
|
||||
boots_remaining: int
|
||||
lock_reason: str
|
||||
state: LockdownStatus.State
|
||||
valid_until_epoch: int
|
||||
def __init__(self, state: _Optional[_Union[LockdownStatus.State, str]] = ..., lock_reason: _Optional[str] = ..., boots_remaining: _Optional[int] = ..., valid_until_epoch: _Optional[int] = ..., backoff_seconds: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class LogRecord(_message.Message):
|
||||
__slots__ = ["level", "message", "source", "time"]
|
||||
class Level(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
CRITICAL: LogRecord.Level
|
||||
DEBUG: LogRecord.Level
|
||||
ERROR: LogRecord.Level
|
||||
INFO: LogRecord.Level
|
||||
LEVEL_FIELD_NUMBER: _ClassVar[int]
|
||||
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
TRACE: LogRecord.Level
|
||||
UNSET: LogRecord.Level
|
||||
WARNING: LogRecord.Level
|
||||
level: LogRecord.Level
|
||||
message: str
|
||||
source: str
|
||||
time: int
|
||||
def __init__(self, message: _Optional[str] = ..., time: _Optional[int] = ..., source: _Optional[str] = ..., level: _Optional[_Union[LogRecord.Level, str]] = ...) -> None: ...
|
||||
|
||||
class LowEntropyKey(_message.Message):
|
||||
__slots__ = []
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
class MeshPacket(_message.Message):
|
||||
__slots__ = ["channel", "decoded", "delayed", "encrypted", "hop_limit", "hop_start", "id", "next_hop", "pki_encrypted", "priority", "public_key", "relay_node", "rx_rssi", "rx_snr", "rx_time", "to", "transport_mechanism", "tx_after", "via_mqtt", "want_ack"]
|
||||
class Delayed(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class TransportMechanism(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ACK: MeshPacket.Priority
|
||||
ALERT: MeshPacket.Priority
|
||||
BACKGROUND: MeshPacket.Priority
|
||||
CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
DECODED_FIELD_NUMBER: _ClassVar[int]
|
||||
DEFAULT: MeshPacket.Priority
|
||||
DELAYED_BROADCAST: MeshPacket.Delayed
|
||||
DELAYED_DIRECT: MeshPacket.Delayed
|
||||
DELAYED_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCRYPTED_FIELD_NUMBER: _ClassVar[int]
|
||||
FROM_FIELD_NUMBER: _ClassVar[int]
|
||||
HIGH: MeshPacket.Priority
|
||||
HOP_LIMIT_FIELD_NUMBER: _ClassVar[int]
|
||||
HOP_START_FIELD_NUMBER: _ClassVar[int]
|
||||
ID_FIELD_NUMBER: _ClassVar[int]
|
||||
MAX: MeshPacket.Priority
|
||||
MIN: MeshPacket.Priority
|
||||
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
|
||||
NO_DELAY: MeshPacket.Delayed
|
||||
PKI_ENCRYPTED_FIELD_NUMBER: _ClassVar[int]
|
||||
PRIORITY_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
RELAY_NODE_FIELD_NUMBER: _ClassVar[int]
|
||||
RELIABLE: MeshPacket.Priority
|
||||
RESPONSE: MeshPacket.Priority
|
||||
RX_RSSI_FIELD_NUMBER: _ClassVar[int]
|
||||
RX_SNR_FIELD_NUMBER: _ClassVar[int]
|
||||
RX_TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
TO_FIELD_NUMBER: _ClassVar[int]
|
||||
TRANSPORT_API: MeshPacket.TransportMechanism
|
||||
TRANSPORT_INTERNAL: MeshPacket.TransportMechanism
|
||||
TRANSPORT_LORA: MeshPacket.TransportMechanism
|
||||
TRANSPORT_LORA_ALT1: MeshPacket.TransportMechanism
|
||||
TRANSPORT_LORA_ALT2: MeshPacket.TransportMechanism
|
||||
TRANSPORT_LORA_ALT3: MeshPacket.TransportMechanism
|
||||
TRANSPORT_MECHANISM_FIELD_NUMBER: _ClassVar[int]
|
||||
TRANSPORT_MQTT: MeshPacket.TransportMechanism
|
||||
TRANSPORT_MULTICAST_UDP: MeshPacket.TransportMechanism
|
||||
TX_AFTER_FIELD_NUMBER: _ClassVar[int]
|
||||
UNSET: MeshPacket.Priority
|
||||
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
WANT_ACK_FIELD_NUMBER: _ClassVar[int]
|
||||
channel: int
|
||||
decoded: Data
|
||||
delayed: MeshPacket.Delayed
|
||||
encrypted: bytes
|
||||
hop_limit: int
|
||||
hop_start: int
|
||||
id: int
|
||||
next_hop: int
|
||||
pki_encrypted: bool
|
||||
priority: MeshPacket.Priority
|
||||
public_key: bytes
|
||||
relay_node: int
|
||||
rx_rssi: int
|
||||
rx_snr: float
|
||||
rx_time: int
|
||||
to: int
|
||||
transport_mechanism: MeshPacket.TransportMechanism
|
||||
tx_after: int
|
||||
via_mqtt: bool
|
||||
want_ack: bool
|
||||
def __init__(self, to: _Optional[int] = ..., channel: _Optional[int] = ..., decoded: _Optional[_Union[Data, _Mapping]] = ..., encrypted: _Optional[bytes] = ..., id: _Optional[int] = ..., rx_time: _Optional[int] = ..., rx_snr: _Optional[float] = ..., hop_limit: _Optional[int] = ..., want_ack: bool = ..., priority: _Optional[_Union[MeshPacket.Priority, str]] = ..., rx_rssi: _Optional[int] = ..., delayed: _Optional[_Union[MeshPacket.Delayed, str]] = ..., via_mqtt: bool = ..., hop_start: _Optional[int] = ..., public_key: _Optional[bytes] = ..., pki_encrypted: bool = ..., next_hop: _Optional[int] = ..., relay_node: _Optional[int] = ..., tx_after: _Optional[int] = ..., transport_mechanism: _Optional[_Union[MeshPacket.TransportMechanism, str]] = ..., **kwargs) -> None: ...
|
||||
|
||||
class MqttClientProxyMessage(_message.Message):
|
||||
__slots__ = ["data", "retained", "text", "topic"]
|
||||
DATA_FIELD_NUMBER: _ClassVar[int]
|
||||
RETAINED_FIELD_NUMBER: _ClassVar[int]
|
||||
TEXT_FIELD_NUMBER: _ClassVar[int]
|
||||
TOPIC_FIELD_NUMBER: _ClassVar[int]
|
||||
data: bytes
|
||||
retained: bool
|
||||
text: str
|
||||
topic: str
|
||||
def __init__(self, topic: _Optional[str] = ..., data: _Optional[bytes] = ..., text: _Optional[str] = ..., retained: bool = ...) -> None: ...
|
||||
|
||||
class MyNodeInfo(_message.Message):
|
||||
__slots__ = ["device_id", "firmware_edition", "min_app_version", "my_node_num", "nodedb_count", "pio_env", "reboot_count"]
|
||||
DEVICE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
FIRMWARE_EDITION_FIELD_NUMBER: _ClassVar[int]
|
||||
MIN_APP_VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
MY_NODE_NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
NODEDB_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
PIO_ENV_FIELD_NUMBER: _ClassVar[int]
|
||||
REBOOT_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
device_id: bytes
|
||||
firmware_edition: FirmwareEdition
|
||||
min_app_version: int
|
||||
my_node_num: int
|
||||
nodedb_count: int
|
||||
pio_env: str
|
||||
reboot_count: int
|
||||
def __init__(self, my_node_num: _Optional[int] = ..., reboot_count: _Optional[int] = ..., min_app_version: _Optional[int] = ..., device_id: _Optional[bytes] = ..., pio_env: _Optional[str] = ..., firmware_edition: _Optional[_Union[FirmwareEdition, str]] = ..., nodedb_count: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class Neighbor(_message.Message):
|
||||
__slots__ = ["last_rx_time", "node_broadcast_interval_secs", "node_id", "snr"]
|
||||
LAST_RX_TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
SNR_FIELD_NUMBER: _ClassVar[int]
|
||||
last_rx_time: int
|
||||
node_broadcast_interval_secs: int
|
||||
node_id: int
|
||||
snr: float
|
||||
def __init__(self, node_id: _Optional[int] = ..., snr: _Optional[float] = ..., last_rx_time: _Optional[int] = ..., node_broadcast_interval_secs: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class NeighborInfo(_message.Message):
|
||||
__slots__ = ["last_sent_by_id", "neighbors", "node_broadcast_interval_secs", "node_id"]
|
||||
LAST_SENT_BY_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
NEIGHBORS_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
NODE_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
last_sent_by_id: int
|
||||
neighbors: _containers.RepeatedCompositeFieldContainer[Neighbor]
|
||||
node_broadcast_interval_secs: int
|
||||
node_id: int
|
||||
def __init__(self, node_id: _Optional[int] = ..., last_sent_by_id: _Optional[int] = ..., node_broadcast_interval_secs: _Optional[int] = ..., neighbors: _Optional[_Iterable[_Union[Neighbor, _Mapping]]] = ...) -> None: ...
|
||||
|
||||
class NodeInfo(_message.Message):
|
||||
__slots__ = ["channel", "device_metrics", "hops_away", "is_favorite", "is_ignored", "is_key_manually_verified", "is_muted", "last_heard", "num", "position", "snr", "user", "via_mqtt"]
|
||||
CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
|
||||
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_FAVORITE_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_IGNORED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_KEY_MANUALLY_VERIFIED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_MUTED_FIELD_NUMBER: _ClassVar[int]
|
||||
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
|
||||
NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
SNR_FIELD_NUMBER: _ClassVar[int]
|
||||
USER_FIELD_NUMBER: _ClassVar[int]
|
||||
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
channel: int
|
||||
device_metrics: _telemetry_pb2.DeviceMetrics
|
||||
hops_away: int
|
||||
is_favorite: bool
|
||||
is_ignored: bool
|
||||
is_key_manually_verified: bool
|
||||
is_muted: bool
|
||||
last_heard: int
|
||||
num: int
|
||||
position: Position
|
||||
snr: float
|
||||
user: User
|
||||
via_mqtt: bool
|
||||
def __init__(self, num: _Optional[int] = ..., user: _Optional[_Union[User, _Mapping]] = ..., position: _Optional[_Union[Position, _Mapping]] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ..., channel: _Optional[int] = ..., via_mqtt: bool = ..., hops_away: _Optional[int] = ..., is_favorite: bool = ..., is_ignored: bool = ..., is_key_manually_verified: bool = ..., is_muted: bool = ...) -> None: ...
|
||||
|
||||
class NodeRemoteHardwarePin(_message.Message):
|
||||
__slots__ = ["node_num", "pin"]
|
||||
NODE_NUM_FIELD_NUMBER: _ClassVar[int]
|
||||
PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
node_num: int
|
||||
pin: _module_config_pb2.RemoteHardwarePin
|
||||
def __init__(self, node_num: _Optional[int] = ..., pin: _Optional[_Union[_module_config_pb2.RemoteHardwarePin, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class Position(_message.Message):
|
||||
__slots__ = ["HDOP", "PDOP", "VDOP", "altitude", "altitude_geoidal_separation", "altitude_hae", "altitude_source", "fix_quality", "fix_type", "gps_accuracy", "ground_speed", "ground_track", "latitude_i", "location_source", "longitude_i", "next_update", "precision_bits", "sats_in_view", "sensor_id", "seq_number", "time", "timestamp", "timestamp_millis_adjust"]
|
||||
class AltSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class LocSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALTITUDE_GEOIDAL_SEPARATION_FIELD_NUMBER: _ClassVar[int]
|
||||
ALTITUDE_HAE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALTITUDE_SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALT_BAROMETRIC: Position.AltSource
|
||||
ALT_EXTERNAL: Position.AltSource
|
||||
ALT_INTERNAL: Position.AltSource
|
||||
ALT_MANUAL: Position.AltSource
|
||||
ALT_UNSET: Position.AltSource
|
||||
FIX_QUALITY_FIELD_NUMBER: _ClassVar[int]
|
||||
FIX_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
GPS_ACCURACY_FIELD_NUMBER: _ClassVar[int]
|
||||
GROUND_SPEED_FIELD_NUMBER: _ClassVar[int]
|
||||
GROUND_TRACK_FIELD_NUMBER: _ClassVar[int]
|
||||
HDOP: int
|
||||
HDOP_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCATION_SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
LOC_EXTERNAL: Position.LocSource
|
||||
LOC_INTERNAL: Position.LocSource
|
||||
LOC_MANUAL: Position.LocSource
|
||||
LOC_UNSET: Position.LocSource
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
NEXT_UPDATE_FIELD_NUMBER: _ClassVar[int]
|
||||
PDOP: int
|
||||
PDOP_FIELD_NUMBER: _ClassVar[int]
|
||||
PRECISION_BITS_FIELD_NUMBER: _ClassVar[int]
|
||||
SATS_IN_VIEW_FIELD_NUMBER: _ClassVar[int]
|
||||
SENSOR_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
SEQ_NUMBER_FIELD_NUMBER: _ClassVar[int]
|
||||
TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
|
||||
TIMESTAMP_MILLIS_ADJUST_FIELD_NUMBER: _ClassVar[int]
|
||||
TIME_FIELD_NUMBER: _ClassVar[int]
|
||||
VDOP: int
|
||||
VDOP_FIELD_NUMBER: _ClassVar[int]
|
||||
altitude: int
|
||||
altitude_geoidal_separation: int
|
||||
altitude_hae: int
|
||||
altitude_source: Position.AltSource
|
||||
fix_quality: int
|
||||
fix_type: int
|
||||
gps_accuracy: int
|
||||
ground_speed: int
|
||||
ground_track: int
|
||||
latitude_i: int
|
||||
location_source: Position.LocSource
|
||||
longitude_i: int
|
||||
next_update: int
|
||||
precision_bits: int
|
||||
sats_in_view: int
|
||||
sensor_id: int
|
||||
seq_number: int
|
||||
time: int
|
||||
timestamp: int
|
||||
timestamp_millis_adjust: int
|
||||
def __init__(self, latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., time: _Optional[int] = ..., location_source: _Optional[_Union[Position.LocSource, str]] = ..., altitude_source: _Optional[_Union[Position.AltSource, str]] = ..., timestamp: _Optional[int] = ..., timestamp_millis_adjust: _Optional[int] = ..., altitude_hae: _Optional[int] = ..., altitude_geoidal_separation: _Optional[int] = ..., PDOP: _Optional[int] = ..., HDOP: _Optional[int] = ..., VDOP: _Optional[int] = ..., gps_accuracy: _Optional[int] = ..., ground_speed: _Optional[int] = ..., ground_track: _Optional[int] = ..., fix_quality: _Optional[int] = ..., fix_type: _Optional[int] = ..., sats_in_view: _Optional[int] = ..., sensor_id: _Optional[int] = ..., next_update: _Optional[int] = ..., seq_number: _Optional[int] = ..., precision_bits: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class QueueStatus(_message.Message):
|
||||
__slots__ = ["free", "maxlen", "mesh_packet_id", "res"]
|
||||
FREE_FIELD_NUMBER: _ClassVar[int]
|
||||
MAXLEN_FIELD_NUMBER: _ClassVar[int]
|
||||
MESH_PACKET_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
RES_FIELD_NUMBER: _ClassVar[int]
|
||||
free: int
|
||||
maxlen: int
|
||||
mesh_packet_id: int
|
||||
res: int
|
||||
def __init__(self, res: _Optional[int] = ..., free: _Optional[int] = ..., maxlen: _Optional[int] = ..., mesh_packet_id: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class RemoteShell(_message.Message):
|
||||
__slots__ = ["ack_seq", "cols", "flags", "last_rx_seq", "last_tx_seq", "op", "payload", "rows", "seq", "session_id"]
|
||||
class OpCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ACK: RemoteShell.OpCode
|
||||
ACK_SEQ_FIELD_NUMBER: _ClassVar[int]
|
||||
CLOSE: RemoteShell.OpCode
|
||||
CLOSED: RemoteShell.OpCode
|
||||
COLS_FIELD_NUMBER: _ClassVar[int]
|
||||
ERROR: RemoteShell.OpCode
|
||||
FLAGS_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUT: RemoteShell.OpCode
|
||||
LAST_RX_SEQ_FIELD_NUMBER: _ClassVar[int]
|
||||
LAST_TX_SEQ_FIELD_NUMBER: _ClassVar[int]
|
||||
OPEN: RemoteShell.OpCode
|
||||
OPEN_OK: RemoteShell.OpCode
|
||||
OP_FIELD_NUMBER: _ClassVar[int]
|
||||
OP_UNSET: RemoteShell.OpCode
|
||||
OUTPUT: RemoteShell.OpCode
|
||||
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
|
||||
PING: RemoteShell.OpCode
|
||||
PONG: RemoteShell.OpCode
|
||||
RESIZE: RemoteShell.OpCode
|
||||
ROWS_FIELD_NUMBER: _ClassVar[int]
|
||||
SEQ_FIELD_NUMBER: _ClassVar[int]
|
||||
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
ack_seq: int
|
||||
cols: int
|
||||
flags: int
|
||||
last_rx_seq: int
|
||||
last_tx_seq: int
|
||||
op: RemoteShell.OpCode
|
||||
payload: bytes
|
||||
rows: int
|
||||
seq: int
|
||||
session_id: int
|
||||
def __init__(self, op: _Optional[_Union[RemoteShell.OpCode, str]] = ..., session_id: _Optional[int] = ..., seq: _Optional[int] = ..., ack_seq: _Optional[int] = ..., payload: _Optional[bytes] = ..., cols: _Optional[int] = ..., rows: _Optional[int] = ..., flags: _Optional[int] = ..., last_tx_seq: _Optional[int] = ..., last_rx_seq: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class RouteDiscovery(_message.Message):
|
||||
__slots__ = ["route", "route_back", "snr_back", "snr_towards"]
|
||||
ROUTE_BACK_FIELD_NUMBER: _ClassVar[int]
|
||||
ROUTE_FIELD_NUMBER: _ClassVar[int]
|
||||
SNR_BACK_FIELD_NUMBER: _ClassVar[int]
|
||||
SNR_TOWARDS_FIELD_NUMBER: _ClassVar[int]
|
||||
route: _containers.RepeatedScalarFieldContainer[int]
|
||||
route_back: _containers.RepeatedScalarFieldContainer[int]
|
||||
snr_back: _containers.RepeatedScalarFieldContainer[int]
|
||||
snr_towards: _containers.RepeatedScalarFieldContainer[int]
|
||||
def __init__(self, route: _Optional[_Iterable[int]] = ..., snr_towards: _Optional[_Iterable[int]] = ..., route_back: _Optional[_Iterable[int]] = ..., snr_back: _Optional[_Iterable[int]] = ...) -> None: ...
|
||||
|
||||
class Routing(_message.Message):
|
||||
__slots__ = ["error_reason", "route_reply", "route_request"]
|
||||
class Error(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ADMIN_BAD_SESSION_KEY: Routing.Error
|
||||
ADMIN_PUBLIC_KEY_UNAUTHORIZED: Routing.Error
|
||||
BAD_REQUEST: Routing.Error
|
||||
DUTY_CYCLE_LIMIT: Routing.Error
|
||||
ERROR_REASON_FIELD_NUMBER: _ClassVar[int]
|
||||
GOT_NAK: Routing.Error
|
||||
MAX_RETRANSMIT: Routing.Error
|
||||
NONE: Routing.Error
|
||||
NOT_AUTHORIZED: Routing.Error
|
||||
NO_CHANNEL: Routing.Error
|
||||
NO_INTERFACE: Routing.Error
|
||||
NO_RESPONSE: Routing.Error
|
||||
NO_ROUTE: Routing.Error
|
||||
PKI_FAILED: Routing.Error
|
||||
PKI_SEND_FAIL_PUBLIC_KEY: Routing.Error
|
||||
PKI_UNKNOWN_PUBKEY: Routing.Error
|
||||
RATE_LIMIT_EXCEEDED: Routing.Error
|
||||
ROUTE_REPLY_FIELD_NUMBER: _ClassVar[int]
|
||||
ROUTE_REQUEST_FIELD_NUMBER: _ClassVar[int]
|
||||
TIMEOUT: Routing.Error
|
||||
TOO_LARGE: Routing.Error
|
||||
error_reason: Routing.Error
|
||||
route_reply: RouteDiscovery
|
||||
route_request: RouteDiscovery
|
||||
def __init__(self, route_request: _Optional[_Union[RouteDiscovery, _Mapping]] = ..., route_reply: _Optional[_Union[RouteDiscovery, _Mapping]] = ..., error_reason: _Optional[_Union[Routing.Error, str]] = ...) -> None: ...
|
||||
|
||||
class StatusMessage(_message.Message):
|
||||
__slots__ = ["status"]
|
||||
STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
status: str
|
||||
def __init__(self, status: _Optional[str] = ...) -> None: ...
|
||||
|
||||
class StoreForwardPlusPlus(_message.Message):
|
||||
__slots__ = ["chain_count", "commit_hash", "encapsulated_from", "encapsulated_id", "encapsulated_rxtime", "encapsulated_to", "message", "message_hash", "root_hash", "sfpp_message_type"]
|
||||
class SFPP_message_type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
CANON_ANNOUNCE: StoreForwardPlusPlus.SFPP_message_type
|
||||
CHAIN_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
CHAIN_QUERY: StoreForwardPlusPlus.SFPP_message_type
|
||||
COMMIT_HASH_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCAPSULATED_FROM_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCAPSULATED_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCAPSULATED_RXTIME_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCAPSULATED_TO_FIELD_NUMBER: _ClassVar[int]
|
||||
LINK_PROVIDE: StoreForwardPlusPlus.SFPP_message_type
|
||||
LINK_PROVIDE_FIRSTHALF: StoreForwardPlusPlus.SFPP_message_type
|
||||
LINK_PROVIDE_SECONDHALF: StoreForwardPlusPlus.SFPP_message_type
|
||||
LINK_REQUEST: StoreForwardPlusPlus.SFPP_message_type
|
||||
MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
MESSAGE_HASH_FIELD_NUMBER: _ClassVar[int]
|
||||
ROOT_HASH_FIELD_NUMBER: _ClassVar[int]
|
||||
SFPP_MESSAGE_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
chain_count: int
|
||||
commit_hash: bytes
|
||||
encapsulated_from: int
|
||||
encapsulated_id: int
|
||||
encapsulated_rxtime: int
|
||||
encapsulated_to: int
|
||||
message: bytes
|
||||
message_hash: bytes
|
||||
root_hash: bytes
|
||||
sfpp_message_type: StoreForwardPlusPlus.SFPP_message_type
|
||||
def __init__(self, sfpp_message_type: _Optional[_Union[StoreForwardPlusPlus.SFPP_message_type, str]] = ..., message_hash: _Optional[bytes] = ..., commit_hash: _Optional[bytes] = ..., root_hash: _Optional[bytes] = ..., message: _Optional[bytes] = ..., encapsulated_id: _Optional[int] = ..., encapsulated_to: _Optional[int] = ..., encapsulated_from: _Optional[int] = ..., encapsulated_rxtime: _Optional[int] = ..., chain_count: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class ToRadio(_message.Message):
|
||||
__slots__ = ["disconnect", "heartbeat", "mqttClientProxyMessage", "packet", "want_config_id", "xmodemPacket"]
|
||||
DISCONNECT_FIELD_NUMBER: _ClassVar[int]
|
||||
HEARTBEAT_FIELD_NUMBER: _ClassVar[int]
|
||||
MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKET_FIELD_NUMBER: _ClassVar[int]
|
||||
WANT_CONFIG_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
XMODEMPACKET_FIELD_NUMBER: _ClassVar[int]
|
||||
disconnect: bool
|
||||
heartbeat: Heartbeat
|
||||
mqttClientProxyMessage: MqttClientProxyMessage
|
||||
packet: MeshPacket
|
||||
want_config_id: int
|
||||
xmodemPacket: _xmodem_pb2.XModem
|
||||
def __init__(self, packet: _Optional[_Union[MeshPacket, _Mapping]] = ..., want_config_id: _Optional[int] = ..., disconnect: bool = ..., xmodemPacket: _Optional[_Union[_xmodem_pb2.XModem, _Mapping]] = ..., mqttClientProxyMessage: _Optional[_Union[MqttClientProxyMessage, _Mapping]] = ..., heartbeat: _Optional[_Union[Heartbeat, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class User(_message.Message):
|
||||
__slots__ = ["hw_model", "id", "is_licensed", "is_unmessagable", "long_name", "macaddr", "public_key", "role", "short_name"]
|
||||
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
|
||||
ID_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_UNMESSAGABLE_FIELD_NUMBER: _ClassVar[int]
|
||||
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
MACADDR_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
hw_model: HardwareModel
|
||||
id: str
|
||||
is_licensed: bool
|
||||
is_unmessagable: bool
|
||||
long_name: str
|
||||
macaddr: bytes
|
||||
public_key: bytes
|
||||
role: _config_pb2.Config.DeviceConfig.Role
|
||||
short_name: str
|
||||
def __init__(self, id: _Optional[str] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., macaddr: _Optional[bytes] = ..., hw_model: _Optional[_Union[HardwareModel, str]] = ..., is_licensed: bool = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., is_unmessagable: bool = ...) -> None: ...
|
||||
|
||||
class Waypoint(_message.Message):
|
||||
__slots__ = ["description", "expire", "icon", "id", "latitude_i", "locked_to", "longitude_i", "name"]
|
||||
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
|
||||
EXPIRE_FIELD_NUMBER: _ClassVar[int]
|
||||
ICON_FIELD_NUMBER: _ClassVar[int]
|
||||
ID_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LOCKED_TO_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
description: str
|
||||
expire: int
|
||||
icon: int
|
||||
id: int
|
||||
latitude_i: int
|
||||
locked_to: int
|
||||
longitude_i: int
|
||||
name: str
|
||||
def __init__(self, id: _Optional[int] = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., expire: _Optional[int] = ..., locked_to: _Optional[int] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., icon: _Optional[int] = ...) -> None: ...
|
||||
|
||||
class resend_chunks(_message.Message):
|
||||
__slots__ = ["chunks"]
|
||||
CHUNKS_FIELD_NUMBER: _ClassVar[int]
|
||||
chunks: _containers.RepeatedScalarFieldContainer[int]
|
||||
def __init__(self, chunks: _Optional[_Iterable[int]] = ...) -> None: ...
|
||||
|
||||
class HardwareModel(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class Constants(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class CriticalErrorCode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class FirmwareEdition(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class ExcludedModules(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
File diff suppressed because one or more lines are too long
@@ -1,411 +0,0 @@
|
||||
from meshtastic.protobuf import atak_pb2 as _atak_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
DIGITAL_READ: RemoteHardwarePinType
|
||||
DIGITAL_WRITE: RemoteHardwarePinType
|
||||
UNKNOWN: RemoteHardwarePinType
|
||||
|
||||
class ModuleConfig(_message.Message):
|
||||
__slots__ = ["ambient_lighting", "audio", "canned_message", "detection_sensor", "external_notification", "mqtt", "neighbor_info", "paxcounter", "range_test", "remote_hardware", "serial", "statusmessage", "store_forward", "tak", "telemetry", "traffic_management"]
|
||||
class AmbientLightingConfig(_message.Message):
|
||||
__slots__ = ["blue", "current", "green", "led_state", "red"]
|
||||
BLUE_FIELD_NUMBER: _ClassVar[int]
|
||||
CURRENT_FIELD_NUMBER: _ClassVar[int]
|
||||
GREEN_FIELD_NUMBER: _ClassVar[int]
|
||||
LED_STATE_FIELD_NUMBER: _ClassVar[int]
|
||||
RED_FIELD_NUMBER: _ClassVar[int]
|
||||
blue: int
|
||||
current: int
|
||||
green: int
|
||||
led_state: bool
|
||||
red: int
|
||||
def __init__(self, led_state: bool = ..., current: _Optional[int] = ..., red: _Optional[int] = ..., green: _Optional[int] = ..., blue: _Optional[int] = ...) -> None: ...
|
||||
class AudioConfig(_message.Message):
|
||||
__slots__ = ["bitrate", "codec2_enabled", "i2s_din", "i2s_sck", "i2s_sd", "i2s_ws", "ptt_pin"]
|
||||
class Audio_Baud(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
BITRATE_FIELD_NUMBER: _ClassVar[int]
|
||||
CODEC2_1200: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_1300: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_1400: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_1600: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_2400: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_3200: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_700B: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_DEFAULT: ModuleConfig.AudioConfig.Audio_Baud
|
||||
CODEC2_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
I2S_DIN_FIELD_NUMBER: _ClassVar[int]
|
||||
I2S_SCK_FIELD_NUMBER: _ClassVar[int]
|
||||
I2S_SD_FIELD_NUMBER: _ClassVar[int]
|
||||
I2S_WS_FIELD_NUMBER: _ClassVar[int]
|
||||
PTT_PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
bitrate: ModuleConfig.AudioConfig.Audio_Baud
|
||||
codec2_enabled: bool
|
||||
i2s_din: int
|
||||
i2s_sck: int
|
||||
i2s_sd: int
|
||||
i2s_ws: int
|
||||
ptt_pin: int
|
||||
def __init__(self, codec2_enabled: bool = ..., ptt_pin: _Optional[int] = ..., bitrate: _Optional[_Union[ModuleConfig.AudioConfig.Audio_Baud, str]] = ..., i2s_ws: _Optional[int] = ..., i2s_sd: _Optional[int] = ..., i2s_din: _Optional[int] = ..., i2s_sck: _Optional[int] = ...) -> None: ...
|
||||
class CannedMessageConfig(_message.Message):
|
||||
__slots__ = ["allow_input_source", "enabled", "inputbroker_event_ccw", "inputbroker_event_cw", "inputbroker_event_press", "inputbroker_pin_a", "inputbroker_pin_b", "inputbroker_pin_press", "rotary1_enabled", "send_bell", "updown1_enabled"]
|
||||
class InputEventChar(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
ALLOW_INPUT_SOURCE_FIELD_NUMBER: _ClassVar[int]
|
||||
BACK: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
CANCEL: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
DOWN: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_EVENT_CCW_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_EVENT_CW_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_EVENT_PRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_PIN_A_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_PIN_B_FIELD_NUMBER: _ClassVar[int]
|
||||
INPUTBROKER_PIN_PRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
LEFT: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
NONE: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
RIGHT: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
ROTARY1_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
SELECT: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
SEND_BELL_FIELD_NUMBER: _ClassVar[int]
|
||||
UP: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
UPDOWN1_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
allow_input_source: str
|
||||
enabled: bool
|
||||
inputbroker_event_ccw: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
inputbroker_event_cw: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
inputbroker_event_press: ModuleConfig.CannedMessageConfig.InputEventChar
|
||||
inputbroker_pin_a: int
|
||||
inputbroker_pin_b: int
|
||||
inputbroker_pin_press: int
|
||||
rotary1_enabled: bool
|
||||
send_bell: bool
|
||||
updown1_enabled: bool
|
||||
def __init__(self, rotary1_enabled: bool = ..., inputbroker_pin_a: _Optional[int] = ..., inputbroker_pin_b: _Optional[int] = ..., inputbroker_pin_press: _Optional[int] = ..., inputbroker_event_cw: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., inputbroker_event_ccw: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., inputbroker_event_press: _Optional[_Union[ModuleConfig.CannedMessageConfig.InputEventChar, str]] = ..., updown1_enabled: bool = ..., enabled: bool = ..., allow_input_source: _Optional[str] = ..., send_bell: bool = ...) -> None: ...
|
||||
class DetectionSensorConfig(_message.Message):
|
||||
__slots__ = ["detection_trigger_type", "enabled", "minimum_broadcast_secs", "monitor_pin", "name", "send_bell", "state_broadcast_secs", "use_pullup"]
|
||||
class TriggerType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
DETECTION_TRIGGER_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
EITHER_EDGE_ACTIVE_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
EITHER_EDGE_ACTIVE_LOW: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
FALLING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
LOGIC_HIGH: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
LOGIC_LOW: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
MINIMUM_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
MONITOR_PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
RISING_EDGE: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
SEND_BELL_FIELD_NUMBER: _ClassVar[int]
|
||||
STATE_BROADCAST_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
USE_PULLUP_FIELD_NUMBER: _ClassVar[int]
|
||||
detection_trigger_type: ModuleConfig.DetectionSensorConfig.TriggerType
|
||||
enabled: bool
|
||||
minimum_broadcast_secs: int
|
||||
monitor_pin: int
|
||||
name: str
|
||||
send_bell: bool
|
||||
state_broadcast_secs: int
|
||||
use_pullup: bool
|
||||
def __init__(self, enabled: bool = ..., minimum_broadcast_secs: _Optional[int] = ..., state_broadcast_secs: _Optional[int] = ..., send_bell: bool = ..., name: _Optional[str] = ..., monitor_pin: _Optional[int] = ..., detection_trigger_type: _Optional[_Union[ModuleConfig.DetectionSensorConfig.TriggerType, str]] = ..., use_pullup: bool = ...) -> None: ...
|
||||
class ExternalNotificationConfig(_message.Message):
|
||||
__slots__ = ["active", "alert_bell", "alert_bell_buzzer", "alert_bell_vibra", "alert_message", "alert_message_buzzer", "alert_message_vibra", "enabled", "nag_timeout", "output", "output_buzzer", "output_ms", "output_vibra", "use_i2s_as_buzzer", "use_pwm"]
|
||||
ACTIVE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_BELL_BUZZER_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_BELL_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_BELL_VIBRA_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_MESSAGE_BUZZER_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
ALERT_MESSAGE_VIBRA_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
NAG_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
|
||||
OUTPUT_BUZZER_FIELD_NUMBER: _ClassVar[int]
|
||||
OUTPUT_FIELD_NUMBER: _ClassVar[int]
|
||||
OUTPUT_MS_FIELD_NUMBER: _ClassVar[int]
|
||||
OUTPUT_VIBRA_FIELD_NUMBER: _ClassVar[int]
|
||||
USE_I2S_AS_BUZZER_FIELD_NUMBER: _ClassVar[int]
|
||||
USE_PWM_FIELD_NUMBER: _ClassVar[int]
|
||||
active: bool
|
||||
alert_bell: bool
|
||||
alert_bell_buzzer: bool
|
||||
alert_bell_vibra: bool
|
||||
alert_message: bool
|
||||
alert_message_buzzer: bool
|
||||
alert_message_vibra: bool
|
||||
enabled: bool
|
||||
nag_timeout: int
|
||||
output: int
|
||||
output_buzzer: int
|
||||
output_ms: int
|
||||
output_vibra: int
|
||||
use_i2s_as_buzzer: bool
|
||||
use_pwm: bool
|
||||
def __init__(self, enabled: bool = ..., output_ms: _Optional[int] = ..., output: _Optional[int] = ..., output_vibra: _Optional[int] = ..., output_buzzer: _Optional[int] = ..., active: bool = ..., alert_message: bool = ..., alert_message_vibra: bool = ..., alert_message_buzzer: bool = ..., alert_bell: bool = ..., alert_bell_vibra: bool = ..., alert_bell_buzzer: bool = ..., use_pwm: bool = ..., nag_timeout: _Optional[int] = ..., use_i2s_as_buzzer: bool = ...) -> None: ...
|
||||
class MQTTConfig(_message.Message):
|
||||
__slots__ = ["address", "enabled", "encryption_enabled", "json_enabled", "map_report_settings", "map_reporting_enabled", "password", "proxy_to_client_enabled", "root", "tls_enabled", "username"]
|
||||
ADDRESS_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ENCRYPTION_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
JSON_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
MAP_REPORTING_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
MAP_REPORT_SETTINGS_FIELD_NUMBER: _ClassVar[int]
|
||||
PASSWORD_FIELD_NUMBER: _ClassVar[int]
|
||||
PROXY_TO_CLIENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ROOT_FIELD_NUMBER: _ClassVar[int]
|
||||
TLS_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
USERNAME_FIELD_NUMBER: _ClassVar[int]
|
||||
address: str
|
||||
enabled: bool
|
||||
encryption_enabled: bool
|
||||
json_enabled: bool
|
||||
map_report_settings: ModuleConfig.MapReportSettings
|
||||
map_reporting_enabled: bool
|
||||
password: str
|
||||
proxy_to_client_enabled: bool
|
||||
root: str
|
||||
tls_enabled: bool
|
||||
username: str
|
||||
def __init__(self, enabled: bool = ..., address: _Optional[str] = ..., username: _Optional[str] = ..., password: _Optional[str] = ..., encryption_enabled: bool = ..., json_enabled: bool = ..., tls_enabled: bool = ..., root: _Optional[str] = ..., proxy_to_client_enabled: bool = ..., map_reporting_enabled: bool = ..., map_report_settings: _Optional[_Union[ModuleConfig.MapReportSettings, _Mapping]] = ...) -> None: ...
|
||||
class MapReportSettings(_message.Message):
|
||||
__slots__ = ["position_precision", "publish_interval_secs", "should_report_location"]
|
||||
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
|
||||
PUBLISH_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
SHOULD_REPORT_LOCATION_FIELD_NUMBER: _ClassVar[int]
|
||||
position_precision: int
|
||||
publish_interval_secs: int
|
||||
should_report_location: bool
|
||||
def __init__(self, publish_interval_secs: _Optional[int] = ..., position_precision: _Optional[int] = ..., should_report_location: bool = ...) -> None: ...
|
||||
class NeighborInfoConfig(_message.Message):
|
||||
__slots__ = ["enabled", "transmit_over_lora", "update_interval"]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
TRANSMIT_OVER_LORA_FIELD_NUMBER: _ClassVar[int]
|
||||
UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
enabled: bool
|
||||
transmit_over_lora: bool
|
||||
update_interval: int
|
||||
def __init__(self, enabled: bool = ..., update_interval: _Optional[int] = ..., transmit_over_lora: bool = ...) -> None: ...
|
||||
class PaxcounterConfig(_message.Message):
|
||||
__slots__ = ["ble_threshold", "enabled", "paxcounter_update_interval", "wifi_threshold"]
|
||||
BLE_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
WIFI_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
|
||||
ble_threshold: int
|
||||
enabled: bool
|
||||
paxcounter_update_interval: int
|
||||
wifi_threshold: int
|
||||
def __init__(self, enabled: bool = ..., paxcounter_update_interval: _Optional[int] = ..., wifi_threshold: _Optional[int] = ..., ble_threshold: _Optional[int] = ...) -> None: ...
|
||||
class RangeTestConfig(_message.Message):
|
||||
__slots__ = ["clear_on_reboot", "enabled", "save", "sender"]
|
||||
CLEAR_ON_REBOOT_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
SAVE_FIELD_NUMBER: _ClassVar[int]
|
||||
SENDER_FIELD_NUMBER: _ClassVar[int]
|
||||
clear_on_reboot: bool
|
||||
enabled: bool
|
||||
save: bool
|
||||
sender: int
|
||||
def __init__(self, enabled: bool = ..., sender: _Optional[int] = ..., save: bool = ..., clear_on_reboot: bool = ...) -> None: ...
|
||||
class RemoteHardwareConfig(_message.Message):
|
||||
__slots__ = ["allow_undefined_pin_access", "available_pins", "enabled"]
|
||||
ALLOW_UNDEFINED_PIN_ACCESS_FIELD_NUMBER: _ClassVar[int]
|
||||
AVAILABLE_PINS_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
allow_undefined_pin_access: bool
|
||||
available_pins: _containers.RepeatedCompositeFieldContainer[RemoteHardwarePin]
|
||||
enabled: bool
|
||||
def __init__(self, enabled: bool = ..., allow_undefined_pin_access: bool = ..., available_pins: _Optional[_Iterable[_Union[RemoteHardwarePin, _Mapping]]] = ...) -> None: ...
|
||||
class SerialConfig(_message.Message):
|
||||
__slots__ = ["baud", "echo", "enabled", "mode", "override_console_serial_port", "rxd", "timeout", "txd"]
|
||||
class Serial_Baud(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
class Serial_Mode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
BAUD_110: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_115200: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_1200: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_19200: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_230400: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_2400: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_300: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_38400: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_460800: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_4800: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_57600: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_576000: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_600: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_921600: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_9600: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_DEFAULT: ModuleConfig.SerialConfig.Serial_Baud
|
||||
BAUD_FIELD_NUMBER: _ClassVar[int]
|
||||
CALTOPO: ModuleConfig.SerialConfig.Serial_Mode
|
||||
DEFAULT: ModuleConfig.SerialConfig.Serial_Mode
|
||||
ECHO_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
LOG: ModuleConfig.SerialConfig.Serial_Mode
|
||||
LOGTEXT: ModuleConfig.SerialConfig.Serial_Mode
|
||||
MODE_FIELD_NUMBER: _ClassVar[int]
|
||||
MS_CONFIG: ModuleConfig.SerialConfig.Serial_Mode
|
||||
NMEA: ModuleConfig.SerialConfig.Serial_Mode
|
||||
OVERRIDE_CONSOLE_SERIAL_PORT_FIELD_NUMBER: _ClassVar[int]
|
||||
PROTO: ModuleConfig.SerialConfig.Serial_Mode
|
||||
RXD_FIELD_NUMBER: _ClassVar[int]
|
||||
SIMPLE: ModuleConfig.SerialConfig.Serial_Mode
|
||||
TEXTMSG: ModuleConfig.SerialConfig.Serial_Mode
|
||||
TIMEOUT_FIELD_NUMBER: _ClassVar[int]
|
||||
TXD_FIELD_NUMBER: _ClassVar[int]
|
||||
VE_DIRECT: ModuleConfig.SerialConfig.Serial_Mode
|
||||
WS85: ModuleConfig.SerialConfig.Serial_Mode
|
||||
baud: ModuleConfig.SerialConfig.Serial_Baud
|
||||
echo: bool
|
||||
enabled: bool
|
||||
mode: ModuleConfig.SerialConfig.Serial_Mode
|
||||
override_console_serial_port: bool
|
||||
rxd: int
|
||||
timeout: int
|
||||
txd: int
|
||||
def __init__(self, enabled: bool = ..., echo: bool = ..., rxd: _Optional[int] = ..., txd: _Optional[int] = ..., baud: _Optional[_Union[ModuleConfig.SerialConfig.Serial_Baud, str]] = ..., timeout: _Optional[int] = ..., mode: _Optional[_Union[ModuleConfig.SerialConfig.Serial_Mode, str]] = ..., override_console_serial_port: bool = ...) -> None: ...
|
||||
class StatusMessageConfig(_message.Message):
|
||||
__slots__ = ["node_status"]
|
||||
NODE_STATUS_FIELD_NUMBER: _ClassVar[int]
|
||||
node_status: str
|
||||
def __init__(self, node_status: _Optional[str] = ...) -> None: ...
|
||||
class StoreForwardConfig(_message.Message):
|
||||
__slots__ = ["enabled", "heartbeat", "history_return_max", "history_return_window", "is_server", "records"]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
HEARTBEAT_FIELD_NUMBER: _ClassVar[int]
|
||||
HISTORY_RETURN_MAX_FIELD_NUMBER: _ClassVar[int]
|
||||
HISTORY_RETURN_WINDOW_FIELD_NUMBER: _ClassVar[int]
|
||||
IS_SERVER_FIELD_NUMBER: _ClassVar[int]
|
||||
RECORDS_FIELD_NUMBER: _ClassVar[int]
|
||||
enabled: bool
|
||||
heartbeat: bool
|
||||
history_return_max: int
|
||||
history_return_window: int
|
||||
is_server: bool
|
||||
records: int
|
||||
def __init__(self, enabled: bool = ..., heartbeat: bool = ..., records: _Optional[int] = ..., history_return_max: _Optional[int] = ..., history_return_window: _Optional[int] = ..., is_server: bool = ...) -> None: ...
|
||||
class TAKConfig(_message.Message):
|
||||
__slots__ = ["role", "team"]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
TEAM_FIELD_NUMBER: _ClassVar[int]
|
||||
role: _atak_pb2.MemberRole
|
||||
team: _atak_pb2.Team
|
||||
def __init__(self, team: _Optional[_Union[_atak_pb2.Team, str]] = ..., role: _Optional[_Union[_atak_pb2.MemberRole, str]] = ...) -> None: ...
|
||||
class TelemetryConfig(_message.Message):
|
||||
__slots__ = ["air_quality_enabled", "air_quality_interval", "air_quality_screen_enabled", "device_telemetry_enabled", "device_update_interval", "environment_display_fahrenheit", "environment_measurement_enabled", "environment_screen_enabled", "environment_update_interval", "health_measurement_enabled", "health_screen_enabled", "health_update_interval", "power_measurement_enabled", "power_screen_enabled", "power_update_interval"]
|
||||
AIR_QUALITY_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
AIR_QUALITY_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
AIR_QUALITY_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_TELEMETRY_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
ENVIRONMENT_DISPLAY_FAHRENHEIT_FIELD_NUMBER: _ClassVar[int]
|
||||
ENVIRONMENT_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ENVIRONMENT_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ENVIRONMENT_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
HEALTH_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
HEALTH_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
HEALTH_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
POWER_SCREEN_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
POWER_UPDATE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
|
||||
air_quality_enabled: bool
|
||||
air_quality_interval: int
|
||||
air_quality_screen_enabled: bool
|
||||
device_telemetry_enabled: bool
|
||||
device_update_interval: int
|
||||
environment_display_fahrenheit: bool
|
||||
environment_measurement_enabled: bool
|
||||
environment_screen_enabled: bool
|
||||
environment_update_interval: int
|
||||
health_measurement_enabled: bool
|
||||
health_screen_enabled: bool
|
||||
health_update_interval: int
|
||||
power_measurement_enabled: bool
|
||||
power_screen_enabled: bool
|
||||
power_update_interval: int
|
||||
def __init__(self, device_update_interval: _Optional[int] = ..., environment_update_interval: _Optional[int] = ..., environment_measurement_enabled: bool = ..., environment_screen_enabled: bool = ..., environment_display_fahrenheit: bool = ..., air_quality_enabled: bool = ..., air_quality_interval: _Optional[int] = ..., power_measurement_enabled: bool = ..., power_update_interval: _Optional[int] = ..., power_screen_enabled: bool = ..., health_measurement_enabled: bool = ..., health_update_interval: _Optional[int] = ..., health_screen_enabled: bool = ..., device_telemetry_enabled: bool = ..., air_quality_screen_enabled: bool = ...) -> None: ...
|
||||
class TrafficManagementConfig(_message.Message):
|
||||
__slots__ = ["drop_unknown_enabled", "enabled", "exhaust_hop_position", "exhaust_hop_telemetry", "nodeinfo_direct_response", "nodeinfo_direct_response_max_hops", "position_dedup_enabled", "position_min_interval_secs", "position_precision_bits", "rate_limit_enabled", "rate_limit_max_packets", "rate_limit_window_secs", "router_preserve_hops", "unknown_packet_threshold"]
|
||||
DROP_UNKNOWN_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
EXHAUST_HOP_POSITION_FIELD_NUMBER: _ClassVar[int]
|
||||
EXHAUST_HOP_TELEMETRY_FIELD_NUMBER: _ClassVar[int]
|
||||
NODEINFO_DIRECT_RESPONSE_FIELD_NUMBER: _ClassVar[int]
|
||||
NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_DEDUP_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_PRECISION_BITS_FIELD_NUMBER: _ClassVar[int]
|
||||
RATE_LIMIT_ENABLED_FIELD_NUMBER: _ClassVar[int]
|
||||
RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: _ClassVar[int]
|
||||
RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: _ClassVar[int]
|
||||
ROUTER_PRESERVE_HOPS_FIELD_NUMBER: _ClassVar[int]
|
||||
UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
|
||||
drop_unknown_enabled: bool
|
||||
enabled: bool
|
||||
exhaust_hop_position: bool
|
||||
exhaust_hop_telemetry: bool
|
||||
nodeinfo_direct_response: bool
|
||||
nodeinfo_direct_response_max_hops: int
|
||||
position_dedup_enabled: bool
|
||||
position_min_interval_secs: int
|
||||
position_precision_bits: int
|
||||
rate_limit_enabled: bool
|
||||
rate_limit_max_packets: int
|
||||
rate_limit_window_secs: int
|
||||
router_preserve_hops: bool
|
||||
unknown_packet_threshold: int
|
||||
def __init__(self, enabled: bool = ..., position_dedup_enabled: bool = ..., position_precision_bits: _Optional[int] = ..., position_min_interval_secs: _Optional[int] = ..., nodeinfo_direct_response: bool = ..., nodeinfo_direct_response_max_hops: _Optional[int] = ..., rate_limit_enabled: bool = ..., rate_limit_window_secs: _Optional[int] = ..., rate_limit_max_packets: _Optional[int] = ..., drop_unknown_enabled: bool = ..., unknown_packet_threshold: _Optional[int] = ..., exhaust_hop_telemetry: bool = ..., exhaust_hop_position: bool = ..., router_preserve_hops: bool = ...) -> None: ...
|
||||
AMBIENT_LIGHTING_FIELD_NUMBER: _ClassVar[int]
|
||||
AUDIO_FIELD_NUMBER: _ClassVar[int]
|
||||
CANNED_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
DETECTION_SENSOR_FIELD_NUMBER: _ClassVar[int]
|
||||
EXTERNAL_NOTIFICATION_FIELD_NUMBER: _ClassVar[int]
|
||||
MQTT_FIELD_NUMBER: _ClassVar[int]
|
||||
NEIGHBOR_INFO_FIELD_NUMBER: _ClassVar[int]
|
||||
PAXCOUNTER_FIELD_NUMBER: _ClassVar[int]
|
||||
RANGE_TEST_FIELD_NUMBER: _ClassVar[int]
|
||||
REMOTE_HARDWARE_FIELD_NUMBER: _ClassVar[int]
|
||||
SERIAL_FIELD_NUMBER: _ClassVar[int]
|
||||
STATUSMESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
STORE_FORWARD_FIELD_NUMBER: _ClassVar[int]
|
||||
TAK_FIELD_NUMBER: _ClassVar[int]
|
||||
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
|
||||
TRAFFIC_MANAGEMENT_FIELD_NUMBER: _ClassVar[int]
|
||||
ambient_lighting: ModuleConfig.AmbientLightingConfig
|
||||
audio: ModuleConfig.AudioConfig
|
||||
canned_message: ModuleConfig.CannedMessageConfig
|
||||
detection_sensor: ModuleConfig.DetectionSensorConfig
|
||||
external_notification: ModuleConfig.ExternalNotificationConfig
|
||||
mqtt: ModuleConfig.MQTTConfig
|
||||
neighbor_info: ModuleConfig.NeighborInfoConfig
|
||||
paxcounter: ModuleConfig.PaxcounterConfig
|
||||
range_test: ModuleConfig.RangeTestConfig
|
||||
remote_hardware: ModuleConfig.RemoteHardwareConfig
|
||||
serial: ModuleConfig.SerialConfig
|
||||
statusmessage: ModuleConfig.StatusMessageConfig
|
||||
store_forward: ModuleConfig.StoreForwardConfig
|
||||
tak: ModuleConfig.TAKConfig
|
||||
telemetry: ModuleConfig.TelemetryConfig
|
||||
traffic_management: ModuleConfig.TrafficManagementConfig
|
||||
def __init__(self, mqtt: _Optional[_Union[ModuleConfig.MQTTConfig, _Mapping]] = ..., serial: _Optional[_Union[ModuleConfig.SerialConfig, _Mapping]] = ..., external_notification: _Optional[_Union[ModuleConfig.ExternalNotificationConfig, _Mapping]] = ..., store_forward: _Optional[_Union[ModuleConfig.StoreForwardConfig, _Mapping]] = ..., range_test: _Optional[_Union[ModuleConfig.RangeTestConfig, _Mapping]] = ..., telemetry: _Optional[_Union[ModuleConfig.TelemetryConfig, _Mapping]] = ..., canned_message: _Optional[_Union[ModuleConfig.CannedMessageConfig, _Mapping]] = ..., audio: _Optional[_Union[ModuleConfig.AudioConfig, _Mapping]] = ..., remote_hardware: _Optional[_Union[ModuleConfig.RemoteHardwareConfig, _Mapping]] = ..., neighbor_info: _Optional[_Union[ModuleConfig.NeighborInfoConfig, _Mapping]] = ..., ambient_lighting: _Optional[_Union[ModuleConfig.AmbientLightingConfig, _Mapping]] = ..., detection_sensor: _Optional[_Union[ModuleConfig.DetectionSensorConfig, _Mapping]] = ..., paxcounter: _Optional[_Union[ModuleConfig.PaxcounterConfig, _Mapping]] = ..., statusmessage: _Optional[_Union[ModuleConfig.StatusMessageConfig, _Mapping]] = ..., traffic_management: _Optional[_Union[ModuleConfig.TrafficManagementConfig, _Mapping]] = ..., tak: _Optional[_Union[ModuleConfig.TAKConfig, _Mapping]] = ...) -> None: ...
|
||||
|
||||
class RemoteHardwarePin(_message.Message):
|
||||
__slots__ = ["gpio_pin", "name", "type"]
|
||||
GPIO_PIN_FIELD_NUMBER: _ClassVar[int]
|
||||
NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
gpio_pin: int
|
||||
name: str
|
||||
type: RemoteHardwarePinType
|
||||
def __init__(self, gpio_pin: _Optional[int] = ..., name: _Optional[str] = ..., type: _Optional[_Union[RemoteHardwarePinType, str]] = ...) -> None: ...
|
||||
|
||||
class RemoteHardwarePinType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,30 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/mqtt.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mqtt.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"j\n\x0fServiceEnvelope\x12/\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\x83\x04\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12;\n\x04role\x18\x03 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x41\n\x06region\x18\x06 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12H\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\r\x12!\n\x19has_opted_report_location\x18\x0e \x01(\x08\x42`\n\x14org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mqtt_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_SERVICEENVELOPE._serialized_start=121
|
||||
_SERVICEENVELOPE._serialized_end=227
|
||||
_MAPREPORT._serialized_start=230
|
||||
_MAPREPORT._serialized_end=745
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,49 +0,0 @@
|
||||
from meshtastic.protobuf import config_pb2 as _config_pb2
|
||||
from meshtastic.protobuf import mesh_pb2 as _mesh_pb2
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class MapReport(_message.Message):
|
||||
__slots__ = ["altitude", "firmware_version", "has_default_channel", "has_opted_report_location", "hw_model", "latitude_i", "long_name", "longitude_i", "modem_preset", "num_online_local_nodes", "position_precision", "region", "role", "short_name"]
|
||||
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
FIRMWARE_VERSION_FIELD_NUMBER: _ClassVar[int]
|
||||
HAS_DEFAULT_CHANNEL_FIELD_NUMBER: _ClassVar[int]
|
||||
HAS_OPTED_REPORT_LOCATION_FIELD_NUMBER: _ClassVar[int]
|
||||
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
|
||||
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
|
||||
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
MODEM_PRESET_FIELD_NUMBER: _ClassVar[int]
|
||||
NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: _ClassVar[int]
|
||||
POSITION_PRECISION_FIELD_NUMBER: _ClassVar[int]
|
||||
REGION_FIELD_NUMBER: _ClassVar[int]
|
||||
ROLE_FIELD_NUMBER: _ClassVar[int]
|
||||
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
|
||||
altitude: int
|
||||
firmware_version: str
|
||||
has_default_channel: bool
|
||||
has_opted_report_location: bool
|
||||
hw_model: _mesh_pb2.HardwareModel
|
||||
latitude_i: int
|
||||
long_name: str
|
||||
longitude_i: int
|
||||
modem_preset: _config_pb2.Config.LoRaConfig.ModemPreset
|
||||
num_online_local_nodes: int
|
||||
position_precision: int
|
||||
region: _config_pb2.Config.LoRaConfig.RegionCode
|
||||
role: _config_pb2.Config.DeviceConfig.Role
|
||||
short_name: str
|
||||
def __init__(self, long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., firmware_version: _Optional[str] = ..., region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., modem_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., has_default_channel: bool = ..., latitude_i: _Optional[int] = ..., longitude_i: _Optional[int] = ..., altitude: _Optional[int] = ..., position_precision: _Optional[int] = ..., num_online_local_nodes: _Optional[int] = ..., has_opted_report_location: bool = ...) -> None: ...
|
||||
|
||||
class ServiceEnvelope(_message.Message):
|
||||
__slots__ = ["channel_id", "gateway_id", "packet"]
|
||||
CHANNEL_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
GATEWAY_ID_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKET_FIELD_NUMBER: _ClassVar[int]
|
||||
channel_id: str
|
||||
gateway_id: str
|
||||
packet: _mesh_pb2.MeshPacket
|
||||
def __init__(self, packet: _Optional[_Union[_mesh_pb2.MeshPacket, _Mapping]] = ..., channel_id: _Optional[str] = ..., gateway_id: _Optional[str] = ...) -> None: ...
|
||||
@@ -1,39 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/nanopb.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/nanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB>\n\x18\x66i.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.nanopb_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(nanopb_fileopt)
|
||||
google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(nanopb_msgopt)
|
||||
google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(nanopb_enumopt)
|
||||
google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(nanopb)
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated'
|
||||
_FIELDTYPE._serialized_start=1005
|
||||
_FIELDTYPE._serialized_end=1110
|
||||
_INTSIZE._serialized_start=1112
|
||||
_INTSIZE._serialized_end=1180
|
||||
_TYPENAMEMANGLING._serialized_start=1182
|
||||
_TYPENAMEMANGLING._serialized_end=1272
|
||||
_DESCRIPTORSIZE._serialized_start=1274
|
||||
_DESCRIPTORSIZE._serialized_end=1343
|
||||
_NANOPBOPTIONS._serialized_start=71
|
||||
_NANOPBOPTIONS._serialized_end=1003
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,110 +0,0 @@
|
||||
from google.protobuf import descriptor_pb2 as _descriptor_pb2
|
||||
from google.protobuf.internal import containers as _containers
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
DS_1: DescriptorSize
|
||||
DS_2: DescriptorSize
|
||||
DS_4: DescriptorSize
|
||||
DS_8: DescriptorSize
|
||||
DS_AUTO: DescriptorSize
|
||||
FT_CALLBACK: FieldType
|
||||
FT_DEFAULT: FieldType
|
||||
FT_IGNORE: FieldType
|
||||
FT_INLINE: FieldType
|
||||
FT_POINTER: FieldType
|
||||
FT_STATIC: FieldType
|
||||
IS_16: IntSize
|
||||
IS_32: IntSize
|
||||
IS_64: IntSize
|
||||
IS_8: IntSize
|
||||
IS_DEFAULT: IntSize
|
||||
M_FLATTEN: TypenameMangling
|
||||
M_NONE: TypenameMangling
|
||||
M_PACKAGE_INITIALS: TypenameMangling
|
||||
M_STRIP_PACKAGE: TypenameMangling
|
||||
NANOPB_ENUMOPT_FIELD_NUMBER: _ClassVar[int]
|
||||
NANOPB_FIELD_NUMBER: _ClassVar[int]
|
||||
NANOPB_FILEOPT_FIELD_NUMBER: _ClassVar[int]
|
||||
NANOPB_MSGOPT_FIELD_NUMBER: _ClassVar[int]
|
||||
nanopb: _descriptor.FieldDescriptor
|
||||
nanopb_enumopt: _descriptor.FieldDescriptor
|
||||
nanopb_fileopt: _descriptor.FieldDescriptor
|
||||
nanopb_msgopt: _descriptor.FieldDescriptor
|
||||
|
||||
class NanoPBOptions(_message.Message):
|
||||
__slots__ = ["anonymous_oneof", "callback_datatype", "callback_function", "default_has", "descriptorsize", "enum_to_string", "exclude", "fallback_type", "fixed_count", "fixed_length", "include", "int_size", "long_names", "mangle_names", "max_count", "max_length", "max_size", "msgid", "no_unions", "package", "packed_enum", "packed_struct", "proto3", "proto3_singular_msgs", "skip_message", "sort_by_tag", "submsg_callback", "type", "type_override"]
|
||||
ANONYMOUS_ONEOF_FIELD_NUMBER: _ClassVar[int]
|
||||
CALLBACK_DATATYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
CALLBACK_FUNCTION_FIELD_NUMBER: _ClassVar[int]
|
||||
DEFAULT_HAS_FIELD_NUMBER: _ClassVar[int]
|
||||
DESCRIPTORSIZE_FIELD_NUMBER: _ClassVar[int]
|
||||
ENUM_TO_STRING_FIELD_NUMBER: _ClassVar[int]
|
||||
EXCLUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
FALLBACK_TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
FIXED_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
FIXED_LENGTH_FIELD_NUMBER: _ClassVar[int]
|
||||
INCLUDE_FIELD_NUMBER: _ClassVar[int]
|
||||
INT_SIZE_FIELD_NUMBER: _ClassVar[int]
|
||||
LONG_NAMES_FIELD_NUMBER: _ClassVar[int]
|
||||
MANGLE_NAMES_FIELD_NUMBER: _ClassVar[int]
|
||||
MAX_COUNT_FIELD_NUMBER: _ClassVar[int]
|
||||
MAX_LENGTH_FIELD_NUMBER: _ClassVar[int]
|
||||
MAX_SIZE_FIELD_NUMBER: _ClassVar[int]
|
||||
MSGID_FIELD_NUMBER: _ClassVar[int]
|
||||
NO_UNIONS_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKED_ENUM_FIELD_NUMBER: _ClassVar[int]
|
||||
PACKED_STRUCT_FIELD_NUMBER: _ClassVar[int]
|
||||
PROTO3_FIELD_NUMBER: _ClassVar[int]
|
||||
PROTO3_SINGULAR_MSGS_FIELD_NUMBER: _ClassVar[int]
|
||||
SKIP_MESSAGE_FIELD_NUMBER: _ClassVar[int]
|
||||
SORT_BY_TAG_FIELD_NUMBER: _ClassVar[int]
|
||||
SUBMSG_CALLBACK_FIELD_NUMBER: _ClassVar[int]
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
TYPE_OVERRIDE_FIELD_NUMBER: _ClassVar[int]
|
||||
anonymous_oneof: bool
|
||||
callback_datatype: str
|
||||
callback_function: str
|
||||
default_has: bool
|
||||
descriptorsize: DescriptorSize
|
||||
enum_to_string: bool
|
||||
exclude: _containers.RepeatedScalarFieldContainer[str]
|
||||
fallback_type: FieldType
|
||||
fixed_count: bool
|
||||
fixed_length: bool
|
||||
include: _containers.RepeatedScalarFieldContainer[str]
|
||||
int_size: IntSize
|
||||
long_names: bool
|
||||
mangle_names: TypenameMangling
|
||||
max_count: int
|
||||
max_length: int
|
||||
max_size: int
|
||||
msgid: int
|
||||
no_unions: bool
|
||||
package: str
|
||||
packed_enum: bool
|
||||
packed_struct: bool
|
||||
proto3: bool
|
||||
proto3_singular_msgs: bool
|
||||
skip_message: bool
|
||||
sort_by_tag: bool
|
||||
submsg_callback: bool
|
||||
type: FieldType
|
||||
type_override: _descriptor_pb2.FieldDescriptorProto.Type
|
||||
def __init__(self, max_size: _Optional[int] = ..., max_length: _Optional[int] = ..., max_count: _Optional[int] = ..., int_size: _Optional[_Union[IntSize, str]] = ..., type: _Optional[_Union[FieldType, str]] = ..., long_names: bool = ..., packed_struct: bool = ..., packed_enum: bool = ..., skip_message: bool = ..., no_unions: bool = ..., msgid: _Optional[int] = ..., anonymous_oneof: bool = ..., proto3: bool = ..., proto3_singular_msgs: bool = ..., enum_to_string: bool = ..., fixed_length: bool = ..., fixed_count: bool = ..., submsg_callback: bool = ..., mangle_names: _Optional[_Union[TypenameMangling, str]] = ..., callback_datatype: _Optional[str] = ..., callback_function: _Optional[str] = ..., descriptorsize: _Optional[_Union[DescriptorSize, str]] = ..., default_has: bool = ..., include: _Optional[_Iterable[str]] = ..., exclude: _Optional[_Iterable[str]] = ..., package: _Optional[str] = ..., type_override: _Optional[_Union[_descriptor_pb2.FieldDescriptorProto.Type, str]] = ..., sort_by_tag: bool = ..., fallback_type: _Optional[_Union[FieldType, str]] = ...) -> None: ...
|
||||
|
||||
class FieldType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class IntSize(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class TypenameMangling(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
|
||||
class DescriptorSize(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/paxcount.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/paxcount.proto\x12\x13meshtastic.protobuf\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBd\n\x14org.meshtastic.protoB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.paxcount_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_PAXCOUNT._serialized_start=59
|
||||
_PAXCOUNT._serialized_end=112
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,15 +0,0 @@
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Optional as _Optional
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class Paxcount(_message.Message):
|
||||
__slots__ = ["ble", "uptime", "wifi"]
|
||||
BLE_FIELD_NUMBER: _ClassVar[int]
|
||||
UPTIME_FIELD_NUMBER: _ClassVar[int]
|
||||
WIFI_FIELD_NUMBER: _ClassVar[int]
|
||||
ble: int
|
||||
uptime: int
|
||||
wifi: int
|
||||
def __init__(self, wifi: _Optional[int] = ..., ble: _Optional[int] = ..., uptime: _Optional[int] = ...) -> None: ...
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/portnums.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xfd\x05\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\x12\x14\n\x10REMOTE_SHELL_APP\x10\r\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x1e\n\x1aSTORE_FORWARD_PLUSPLUS_APP\x10#\x12\x13\n\x0fNODE_STATUS_APP\x10$\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x12\n\x0eLORAWAN_BRIDGE\x10K\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x12\n\x0e\x41TAK_PLUGIN_V2\x10N\x12\x12\n\x0eGROUPALARM_APP\x10p\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42^\n\x14org.meshtastic.protoB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.portnums_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_PORTNUM._serialized_start=60
|
||||
_PORTNUM._serialized_end=825
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,46 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from typing import ClassVar as _ClassVar
|
||||
|
||||
ADMIN_APP: PortNum
|
||||
ALERT_APP: PortNum
|
||||
ATAK_FORWARDER: PortNum
|
||||
ATAK_PLUGIN: PortNum
|
||||
ATAK_PLUGIN_V2: PortNum
|
||||
AUDIO_APP: PortNum
|
||||
CAYENNE_APP: PortNum
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
DETECTION_SENSOR_APP: PortNum
|
||||
GROUPALARM_APP: PortNum
|
||||
IP_TUNNEL_APP: PortNum
|
||||
KEY_VERIFICATION_APP: PortNum
|
||||
LORAWAN_BRIDGE: PortNum
|
||||
MAP_REPORT_APP: PortNum
|
||||
MAX: PortNum
|
||||
NEIGHBORINFO_APP: PortNum
|
||||
NODEINFO_APP: PortNum
|
||||
NODE_STATUS_APP: PortNum
|
||||
PAXCOUNTER_APP: PortNum
|
||||
POSITION_APP: PortNum
|
||||
POWERSTRESS_APP: PortNum
|
||||
PRIVATE_APP: PortNum
|
||||
RANGE_TEST_APP: PortNum
|
||||
REMOTE_HARDWARE_APP: PortNum
|
||||
REMOTE_SHELL_APP: PortNum
|
||||
REPLY_APP: PortNum
|
||||
RETICULUM_TUNNEL_APP: PortNum
|
||||
ROUTING_APP: PortNum
|
||||
SERIAL_APP: PortNum
|
||||
SIMULATOR_APP: PortNum
|
||||
STORE_FORWARD_APP: PortNum
|
||||
STORE_FORWARD_PLUSPLUS_APP: PortNum
|
||||
TELEMETRY_APP: PortNum
|
||||
TEXT_MESSAGE_APP: PortNum
|
||||
TEXT_MESSAGE_COMPRESSED_APP: PortNum
|
||||
TRACEROUTE_APP: PortNum
|
||||
UNKNOWN_APP: PortNum
|
||||
WAYPOINT_APP: PortNum
|
||||
ZPS_APP: PortNum
|
||||
|
||||
class PortNum(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
@@ -1,32 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/powermon.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/powermon.proto\x12\x13meshtastic.protobuf\"\xe0\x01\n\x08PowerMon\"\xd3\x01\n\x05State\x12\x08\n\x04None\x10\x00\x12\x11\n\rCPU_DeepSleep\x10\x01\x12\x12\n\x0e\x43PU_LightSleep\x10\x02\x12\x0c\n\x08Vext1_On\x10\x04\x12\r\n\tLora_RXOn\x10\x08\x12\r\n\tLora_TXOn\x10\x10\x12\x11\n\rLora_RXActive\x10 \x12\t\n\x05\x42T_On\x10@\x12\x0b\n\x06LED_On\x10\x80\x01\x12\x0e\n\tScreen_On\x10\x80\x02\x12\x13\n\x0eScreen_Drawing\x10\x80\x04\x12\x0c\n\x07Wifi_On\x10\x80\x08\x12\x0f\n\nGPS_Active\x10\x80\x10\"\x88\x03\n\x12PowerStressMessage\x12;\n\x03\x63md\x18\x01 \x01(\x0e\x32..meshtastic.protobuf.PowerStressMessage.Opcode\x12\x13\n\x0bnum_seconds\x18\x02 \x01(\x02\"\x9f\x02\n\x06Opcode\x12\t\n\x05UNSET\x10\x00\x12\x0e\n\nPRINT_INFO\x10\x01\x12\x0f\n\x0b\x46ORCE_QUIET\x10\x02\x12\r\n\tEND_QUIET\x10\x03\x12\r\n\tSCREEN_ON\x10\x10\x12\x0e\n\nSCREEN_OFF\x10\x11\x12\x0c\n\x08\x43PU_IDLE\x10 \x12\x11\n\rCPU_DEEPSLEEP\x10!\x12\x0e\n\nCPU_FULLON\x10\"\x12\n\n\x06LED_ON\x10\x30\x12\x0b\n\x07LED_OFF\x10\x31\x12\x0c\n\x08LORA_OFF\x10@\x12\x0b\n\x07LORA_TX\x10\x41\x12\x0b\n\x07LORA_RX\x10\x42\x12\n\n\x06\x42T_OFF\x10P\x12\t\n\x05\x42T_ON\x10Q\x12\x0c\n\x08WIFI_OFF\x10`\x12\x0b\n\x07WIFI_ON\x10\x61\x12\x0b\n\x07GPS_OFF\x10p\x12\n\n\x06GPS_ON\x10qBd\n\x14org.meshtastic.protoB\x0ePowerMonProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.powermon_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016PowerMonProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_POWERMON._serialized_start=60
|
||||
_POWERMON._serialized_end=284
|
||||
_POWERMON_STATE._serialized_start=73
|
||||
_POWERMON_STATE._serialized_end=284
|
||||
_POWERSTRESSMESSAGE._serialized_start=287
|
||||
_POWERSTRESSMESSAGE._serialized_end=679
|
||||
_POWERSTRESSMESSAGE_OPCODE._serialized_start=392
|
||||
_POWERSTRESSMESSAGE_OPCODE._serialized_end=679
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,55 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class PowerMon(_message.Message):
|
||||
__slots__ = []
|
||||
class State(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
BT_On: PowerMon.State
|
||||
CPU_DeepSleep: PowerMon.State
|
||||
CPU_LightSleep: PowerMon.State
|
||||
GPS_Active: PowerMon.State
|
||||
LED_On: PowerMon.State
|
||||
Lora_RXActive: PowerMon.State
|
||||
Lora_RXOn: PowerMon.State
|
||||
Lora_TXOn: PowerMon.State
|
||||
None: PowerMon.State
|
||||
Screen_Drawing: PowerMon.State
|
||||
Screen_On: PowerMon.State
|
||||
Vext1_On: PowerMon.State
|
||||
Wifi_On: PowerMon.State
|
||||
def __init__(self) -> None: ...
|
||||
|
||||
class PowerStressMessage(_message.Message):
|
||||
__slots__ = ["cmd", "num_seconds"]
|
||||
class Opcode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
BT_OFF: PowerStressMessage.Opcode
|
||||
BT_ON: PowerStressMessage.Opcode
|
||||
CMD_FIELD_NUMBER: _ClassVar[int]
|
||||
CPU_DEEPSLEEP: PowerStressMessage.Opcode
|
||||
CPU_FULLON: PowerStressMessage.Opcode
|
||||
CPU_IDLE: PowerStressMessage.Opcode
|
||||
END_QUIET: PowerStressMessage.Opcode
|
||||
FORCE_QUIET: PowerStressMessage.Opcode
|
||||
GPS_OFF: PowerStressMessage.Opcode
|
||||
GPS_ON: PowerStressMessage.Opcode
|
||||
LED_OFF: PowerStressMessage.Opcode
|
||||
LED_ON: PowerStressMessage.Opcode
|
||||
LORA_OFF: PowerStressMessage.Opcode
|
||||
LORA_RX: PowerStressMessage.Opcode
|
||||
LORA_TX: PowerStressMessage.Opcode
|
||||
NUM_SECONDS_FIELD_NUMBER: _ClassVar[int]
|
||||
PRINT_INFO: PowerStressMessage.Opcode
|
||||
SCREEN_OFF: PowerStressMessage.Opcode
|
||||
SCREEN_ON: PowerStressMessage.Opcode
|
||||
UNSET: PowerStressMessage.Opcode
|
||||
WIFI_OFF: PowerStressMessage.Opcode
|
||||
WIFI_ON: PowerStressMessage.Opcode
|
||||
cmd: PowerStressMessage.Opcode
|
||||
num_seconds: float
|
||||
def __init__(self, cmd: _Optional[_Union[PowerStressMessage.Opcode, str]] = ..., num_seconds: _Optional[float] = ...) -> None: ...
|
||||
@@ -1,28 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: meshtastic/protobuf/remote_hardware.proto
|
||||
"""Generated protocol buffer code."""
|
||||
from google.protobuf.internal import builder as _builder
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||
from google.protobuf import symbol_database as _symbol_database
|
||||
# @@protoc_insertion_point(imports)
|
||||
|
||||
_sym_db = _symbol_database.Default()
|
||||
|
||||
|
||||
|
||||
|
||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)meshtastic/protobuf/remote_hardware.proto\x12\x13meshtastic.protobuf\"\xdf\x01\n\x0fHardwareMessage\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x64\n\x14org.meshtastic.protoB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
|
||||
|
||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.remote_hardware_pb2', globals())
|
||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||
|
||||
DESCRIPTOR._options = None
|
||||
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
|
||||
_HARDWAREMESSAGE._serialized_start=67
|
||||
_HARDWAREMESSAGE._serialized_end=290
|
||||
_HARDWAREMESSAGE_TYPE._serialized_start=182
|
||||
_HARDWAREMESSAGE_TYPE._serialized_end=290
|
||||
# @@protoc_insertion_point(module_scope)
|
||||
@@ -1,24 +0,0 @@
|
||||
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||
from google.protobuf import descriptor as _descriptor
|
||||
from google.protobuf import message as _message
|
||||
from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
|
||||
|
||||
DESCRIPTOR: _descriptor.FileDescriptor
|
||||
|
||||
class HardwareMessage(_message.Message):
|
||||
__slots__ = ["gpio_mask", "gpio_value", "type"]
|
||||
class Type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||
__slots__ = []
|
||||
GPIOS_CHANGED: HardwareMessage.Type
|
||||
GPIO_MASK_FIELD_NUMBER: _ClassVar[int]
|
||||
GPIO_VALUE_FIELD_NUMBER: _ClassVar[int]
|
||||
READ_GPIOS: HardwareMessage.Type
|
||||
READ_GPIOS_REPLY: HardwareMessage.Type
|
||||
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||
UNSET: HardwareMessage.Type
|
||||
WATCH_GPIOS: HardwareMessage.Type
|
||||
WRITE_GPIOS: HardwareMessage.Type
|
||||
gpio_mask: int
|
||||
gpio_value: int
|
||||
type: HardwareMessage.Type
|
||||
def __init__(self, type: _Optional[_Union[HardwareMessage.Type, str]] = ..., gpio_mask: _Optional[int] = ..., gpio_value: _Optional[int] = ...) -> None: ...
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user