2 Commits

Author SHA1 Message Date
Jason Michalski b19b51d6a6 hack 2024-06-28 21:20:48 -07:00
Jason Michalski 414beaaab0 Add traceroute times. 2024-06-11 21:00:57 -07:00
253 changed files with 14353 additions and 23125 deletions
View File
-10
View File
@@ -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
-54
View File
@@ -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
-39
View File
@@ -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
View File
@@ -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
View File
@@ -1 +0,0 @@
-8
View File
@@ -1,8 +0,0 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.13.3 # pin the latest youre comfortable with
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix] # fail if it had to change files
- id: ruff-format
-204
View File
@@ -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
View File
@@ -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 dont have time to contribute code, thats fine! You can still support Meshview by:
> - ⭐ Starring the repo on GitHub
> - Talking about Meshview on social media
> - Referencing Meshview in your own projects 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 projects license.
---
### Reporting Bugs
Before submitting a bug report:
- Make sure youre 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 doesnt already exist.
- Search for prior suggestions.
- Check that it fits Meshviews scope (mesh packet analysis, visualization, telemetry, etc.).
When submitting:
- Use a **clear and descriptive title**.
- Describe the current behavior and what youd 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 youd 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), wed love to invite you as a maintainer.
Start by contributing regularly, engaging in issues/PRs, and helping others.
---
✨ Thats it! Thanks again for being part of Meshview. Every contribution matters.
-79
View File
@@ -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
View File
@@ -1 +0,0 @@
Containerfile
+19
View File
@@ -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/
-247
View File
@@ -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
-683
View File
@@ -1,683 +0,0 @@
# Meshview
![Start Page](screenshots/animated.gif)
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 (LongleyRice 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: multiDB support, PostgreSQL scripts, WAL config for SQLite, cleanup query timing fixes, removal of import time columns, and various timehandling 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 12hour window.
- API/logic: weekly mesh query fix, node list performance improvement, backwardscompatibility and other bug fixes.
- MQTT reader: configurable skipnode 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
View File
@@ -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
View File
@@ -1 +0,0 @@
Generic single-database configuration.
-102
View File
@@ -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()
-26
View File
@@ -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,
)
-57
View File
@@ -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}"
-90
View File
@@ -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
-37
View File
@@ -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
-52
View File
@@ -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)
-58
View File
@@ -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)
-361
View File
@@ -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)
-435
View File
@@ -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"
}
```
-37
View File
@@ -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.
-146
View File
@@ -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.
-14
View File
@@ -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.
-193
View File
@@ -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
View File
@@ -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
+31 -3
View File
@@ -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))
+39
View File
@@ -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)
+28
View File
@@ -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)
+40
View File
@@ -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)
+26
View File
@@ -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)
+34
View File
@@ -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)
+27
View File
@@ -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
+36
View File
@@ -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)
+30
View File
@@ -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
+30
View File
@@ -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)
+26
View File
@@ -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)
+26
View File
@@ -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
View File
@@ -1 +0,0 @@
9ab4a1d08cb833d897aee2367013318718391f2f
View File
File diff suppressed because one or more lines are too long
-313
View File
@@ -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__ = []
-28
View File
@@ -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)
-16
View File
@@ -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
-748
View File
@@ -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__ = []
-26
View File
@@ -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: ...
-34
View File
@@ -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)
-47
View File
@@ -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: ...
-28
View File
@@ -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)
-27
View File
@@ -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
-395
View File
@@ -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: ...
-42
View File
@@ -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)
-146
View File
@@ -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__ = []
-52
View File
@@ -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)
-130
View File
@@ -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: ...
-30
View File
@@ -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)
-39
View File
@@ -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__ = []
-30
View File
@@ -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)
-67
View File
@@ -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
-875
View File
@@ -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
-411
View File
@@ -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__ = []
-30
View File
@@ -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)
-49
View File
@@ -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: ...
-39
View File
@@ -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)
-110
View File
@@ -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__ = []
-26
View File
@@ -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)
-15
View File
@@ -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: ...
-26
View File
@@ -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)
-46
View File
@@ -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__ = []
-32
View File
@@ -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)
-55
View File
@@ -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