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
281 changed files with 14346 additions and 26806 deletions

No files matched your search

View File
Whitespace-only changes.
-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 you’re 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
-130
View File
@@ -1,130 +0,0 @@
# Contributing to Meshview
First off, thanks for taking the time to contribute! ❤️
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for ways to help and details about how this project handles contributions. Please read the relevant section before getting started — it will make things smoother for both you and the maintainers.
The Meshview community looks forward to your contributions. 🎉
> And if you like the project but don’t have time to contribute code, that’s fine! You can still support Meshview by:
> - ⭐ Starring the repo on GitHub
> - Talking about Meshview on social media
> - Referencing Meshview in your own project’s README
> - Mentioning Meshview at local meetups or to colleagues/friends
---
## Table of Contents
- [Code of Conduct](#code-of-conduct)
- [I Have a Question](#i-have-a-question)
- [I Want to Contribute](#i-want-to-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Your First Code Contribution](#your-first-code-contribution)
- [Improving the Documentation](#improving-the-documentation)
- [Styleguides](#styleguides)
- [Commit Messages](#commit-messages)
- [Join the Project Team](#join-the-project-team)
---
## Code of Conduct
Meshview is an open and welcoming community. We want everyone to feel safe, respected, and valued.
### Our Standards
- Be respectful and considerate in all interactions.
- Welcome new contributors and help them learn.
- Provide constructive feedback, not personal attacks.
- Focus on collaboration and what benefits the community.
Unacceptable behavior includes harassment, insults, hate speech, personal attacks, or publishing others’ private information without permission.
---
## I Have a Question
> Before asking, please read the [documentation](docs/README.md) if available.
1. Search the [issues list](../../issues) to see if your question has already been asked.
2. If not, open a [new issue](../../issues/new) with the **question** label.
3. Provide as much context as possible (OS, Python version, database type, etc.).
---
## I Want to Contribute!
### Legal Notice
By contributing to Meshview, you agree that:
- You authored the content yourself.
- You have the necessary rights to the content.
- Your contribution can be provided under the project’s license.
---
### Reporting Bugs
Before submitting a bug report:
- Make sure you’re using the latest Meshview version.
- Verify the issue is not due to a misconfigured environment (SQLite/MySQL, Python version, etc.).
- Search existing [bug reports](../../issues?q=label%3Abug).
- Collect relevant information:
- Steps to reproduce
- Error messages / stack traces
- OS, Python version, and database backend
- Any logs (`meshview-db.service`, `mqtt_reader.py`, etc.)
How to report:
- Open a [new issue](../../issues/new).
- Use a **clear and descriptive title**.
- Include reproduction steps and expected vs. actual behavior.
---
### Suggesting Enhancements
Enhancements are tracked as [issues](../../issues). Before suggesting:
- Make sure the feature doesn’t already exist.
- Search for prior suggestions.
- Check that it fits Meshview’s scope (mesh packet analysis, visualization, telemetry, etc.).
When submitting:
- Use a **clear and descriptive title**.
- Describe the current behavior and what you’d like to see instead.
- Include examples, screenshots, or mockups if relevant.
- Explain why it would be useful to most Meshview users.
---
### Your First Code Contribution
We love first-time contributors! 🚀
If you’d like to start coding:
1. Fork the repository and clone it locally.
2. Set up the development environment:
3. Run the app locally
4. Create a new branch from `develop`, make your changes, commit, and push.
5. Open a pull request against the `develop` branch.
---
### Improving the Documentation
Docs are just as important as code. You can help by:
- Fixing typos or broken links.
- Clarifying confusing instructions.
- Adding examples (e.g., setting up Nginx as a reverse proxy, SQLite vs. MySQL setup).
- Writing or updating tutorials.
---
## Join the Project Team
Meshview is a community-driven project. If you consistently contribute (code, documentation, or community help), we’d love to invite you as a maintainer.
Start by contributing regularly, engaging in issues/PRs, and helping others.
---
✨ That’s it! Thanks again for being part of Meshview. Every contribution matters.
-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/
-262
View File
@@ -1,262 +0,0 @@
# Running MeshView with Docker
MeshView container images are built automatically and published to GitHub Container Registry.
The examples below use a Bash-compatible shell and Docker Compose v2 (`docker compose`).
## Quick Start
Prepare the configuration and persistent directories before starting the container:
```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
mkdir -p meshview/{config,data,logs,backups}
# First-time setup only: extract the image's bundled configuration.
# --entrypoint bypasses the normal MeshView startup command.
docker run --rm --entrypoint cat \
ghcr.io/pablorevilla-meshtastic/meshview:latest \
/etc/meshview/config.ini > meshview/config/config.ini
# Edit MQTT settings, site settings, and backup options before starting.
nano meshview/config/config.ini
# On Linux, give the container user (UID 10001) ownership of writable data.
sudo chown -R 10001 meshview/data meshview/logs meshview/backups
sudo chmod -R u+rwX meshview/data meshview/logs meshview/backups
# The configuration stays owned by you and must be readable by the container.
chmod 755 meshview/config
chmod 644 meshview/config/config.ini
docker run -d \
--name meshview \
--restart unless-stopped \
-p 8081:8081 \
-v "$(pwd)/meshview/config:/etc/meshview:ro" \
-v "$(pwd)/meshview/data:/var/lib/meshview" \
-v "$(pwd)/meshview/logs:/var/log/meshview" \
-v "$(pwd)/meshview/backups:/var/lib/meshview/backups" \
ghcr.io/pablorevilla-meshtastic/meshview:latest
```
Run the config extraction only for a new installation: the redirection overwrites any
existing `config.ini`. On Docker Desktop, host file permissions may be managed differently;
the requirement is that UID 10001 can read the configuration and write data, logs, and backups.
Access the web interface at http://localhost:8081. Check startup with `docker logs -f meshview`.
Database migrations run automatically when MeshView starts.
## Volume Mounts
| Container path | Purpose | Host directory in the examples |
|----------------|---------|--------------------------------|
| `/etc/meshview` | Read-only configuration containing `config.ini` | `meshview/config` |
| `/var/lib/meshview` | SQLite database storage | `meshview/data` |
| `/var/log/meshview` | File logs, when enabled | `meshview/logs` |
| `/var/lib/meshview/backups` | Database backups, when enabled | `meshview/backups` |
An empty host configuration directory hides the image's bundled `config.ini` and prevents
startup. There is no fallback when a mounted configuration directory lacks that file.
If you omit the configuration mount entirely, the image's bundled configuration is used.
Stopping or restarting a container does not delete the database. Explicit host mounts make
it straightforward to preserve and reuse data when removing or recreating containers.
Without explicit mounts, the image declares anonymous volumes; do not rely on those being
automatically reused by a replacement container, and do not delete them if you need their data.
## Docker Compose
Use the preparation steps from Quick Start, but skip its `docker run -d` command.
Create `compose.yaml` **inside the `meshview` directory**, alongside `config`, `data`,
`logs`, and `backups`:
```yaml
services:
meshview:
image: ghcr.io/pablorevilla-meshtastic/meshview:latest
container_name: meshview
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- ./config:/etc/meshview:ro
- ./data:/var/lib/meshview
- ./logs:/var/log/meshview
- ./backups:/var/lib/meshview/backups
environment:
TZ: America/Los_Angeles
```
Start from that directory:
```bash
cd meshview
docker compose up -d
docker compose logs -f
```
Choose either Compose or `docker run` to manage the installation. If switching from the
Quick Start container to Compose, stop and remove the old container first, keeping its
host directories: `docker stop meshview` followed by `docker rm meshview`.
## Configuration
Edit the extracted `config.ini` rather than replacing it with a partial configuration.
Keep the container server listening on all interfaces:
```ini
[server]
bind = 0.0.0.0
port = 8081
```
Set your MQTT broker, topics, and credentials in the existing `[mqtt]` section. The broker
must be reachable from the container; `localhost` refers to the container itself.
Keep the database path inside the mounted data directory:
```ini
[database]
connection_string = sqlite+aiosqlite:////var/lib/meshview/packets.db
```
The four slashes after `sqlite+aiosqlite:` specify an absolute Linux path. PostgreSQL
is also supported with a connection string such as
`postgresql+asyncpg://user:pass@host:5432/meshview`.
After configuration changes, restart the application with `docker restart meshview`, or
`docker compose restart meshview` for a Compose installation.
### Database Backups
Enable backups in the existing `[cleanup]` section:
```ini
[cleanup]
backup_enabled = True
backup_dir = /var/lib/meshview/backups
backup_hour = 2
backup_minute = 00
```
Both startup examples mount this directory to `meshview/backups` on the host. Backups
remain disabled until you enable them in the configuration.
## Available Tags
| Tag | Description |
|-----|-------------|
| `latest` | Latest build from the repository's default branch |
| Branch name | Builds published for that branch |
| `3.0.6` | Example version tag; use a version published in the registry |
## Updating
For a Compose installation, run from the directory containing `compose.yaml`:
```bash
docker compose pull
docker compose up -d
```
For a `docker run` installation, run from the same parent directory used in Quick Start:
```bash
docker pull ghcr.io/pablorevilla-meshtastic/meshview:latest
docker stop meshview
docker rm meshview
docker run -d \
--name meshview \
--restart unless-stopped \
-p 8081:8081 \
-v "$(pwd)/meshview/config:/etc/meshview:ro" \
-v "$(pwd)/meshview/data:/var/lib/meshview" \
-v "$(pwd)/meshview/logs:/var/log/meshview" \
-v "$(pwd)/meshview/backups:/var/lib/meshview/backups" \
ghcr.io/pablorevilla-meshtastic/meshview:latest
```
Preserve any custom ports, mounts, or environment settings when recreating the container.
Do not repeat the first-time configuration extraction during updates. Pulling an image
and merely restarting an existing container does not switch it to the new image.
## Logs
```bash
docker logs meshview
docker logs -f meshview
docker logs --tail 100 meshview
```
For Compose installations, `docker compose logs -f meshview` also works.
## Troubleshooting
### Container won't start
Check `docker logs meshview`. Verify that the mounted `config` directory contains a
readable `config.ini`, and that the database and log directories are writable by UID 10001.
### Docker Desktop reports mounts denied
Make sure the installation directory is shared with Docker Desktop under Settings →
Resources → File Sharing. Bind-mount source paths must exist on the Docker daemon's
host; a remote daemon cannot mount directories that exist only on your client.
### Database permission issues
From the parent directory containing `meshview`, repair writable directory ownership:
```bash
sudo chown -R 10001 meshview/data meshview/logs meshview/backups
sudo chmod -R u+rwX meshview/data meshview/logs meshview/backups
```
Setting permissions to `755` alone does not let UID 10001 write to directories owned
by another user. SQLite also needs to create journal/WAL files beside the database.
### Can't connect to MQTT
Check the broker hostname, port, credentials, and topics in `config.ini`.
Test DNS resolution and a TCP connection using Python, which is included in the image:
```bash
# Replace the hostname and port with your configured broker.
docker exec meshview /opt/venv/bin/python -c \
'import socket; s = socket.create_connection(("mqtt.meshtastic.org", 1883), timeout=10); print("TCP connection successful"); s.close()'
```
This checks network connectivity, not MQTT authentication or topic permissions.
The image does not include `ping`.
### Port already in use
Change the host port (left side) to `8082`, keeping the container port at `8081`:
```bash
-p 8082:8081
```
For Compose, use `"8082:8081"` under `ports`. Access http://localhost:8082.
## Building Your Own Image
```bash
git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview
docker build -f Containerfile -t meshview:local .
```
Use `meshview:local` instead of the registry image in the setup and run commands.
## Security Notes
- The container runs as a non-root user (`app`, UID 10001).
- No privileged access is required.
- The examples publish port 8081 on the host; configuration is mounted read-only.
- Database, file logs, and backups use the mounted directories shown above.
## Support
- GitHub Issues: https://github.com/pablorevilla-meshtastic/meshview/issues
- Documentation: https://github.com/pablorevilla-meshtastic/meshview
-706
View File
@@ -1,706 +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.9 — October 2026
- Protobufs: refreshed Meshtastic schemas and Python type stubs to upstream commit `569a2b3ae7b6bda1a7ab177463a55d8ede3bef53`; updated the refresh script to handle custom metadata options.
- Live map: added animated packet traces from senders to reporting gateways and configurable channel colors through the optional `[map_channel_colors]` section in `config.ini`.
- Daily snapshots: new snapshots report activity for the previous complete UTC day, including newly imported packets, unique packet senders observed that day, and gateways that reported packets that day. Existing historical snapshots keep their original counts.
- Node tracking: record nodes from packet activity before their node information arrives, and preserve known positions when map reports have missing or invalid coordinates.
- Neighbor SNR chart: show the last seven days and the 15 neighbors with the most data points, distinguish neighbors with identical short names, and fix CSV export.
- MQTT reliability: skip malformed messages and invalid node IDs without stopping packet ingestion.
- Security and privacy: escape mesh-provided text in web pages, restrict language and static file requests to their intended directories, and prevent payload searches from matching redacted direct messages.
- Coverage API: validate and bound request parameters, and run coverage calculations off the event loop to keep the web server responsive.
- Contributors: thanks to [nullrouten0](https://github.com/nullrouten0) and Nathan for the neighbor SNR chart, MQTT reliability, security, privacy, and coverage API fixes; Manuel Villaverde for improving map channel color visibility; and [Pablo Revilla](https://github.com/pablorevilla-meshtastic) for the live map, node tracking, and daily snapshot updates.
### Version 3.0.8 — September 2026
- Map updates: added OpenTopoMap as a selectable base map, improved map controls, and fixed several map/node display edge cases.
- Traceroute: added a dedicated traceroute page, corrected route path orientation in graph edges, and improved traceroute API/documentation support.
- Routing display: show ROUTING ACK/NAK packets clearly instead of reporting misleading `error_reason: NONE` values.
- MQTT/decryption: expanded Meshtastic one-byte PSK shorthand support in `mqtt.secondary_keys`.
- Health/maintenance: added cleanup status reporting to the health page and fixed timezone handling in health reporting.
- UI/API fixes: improved Firehose, Node, and Top channel handling, including showing all channels where expected.
- Contributors: thanks to [giannoug](https://github.com/giannoug) for fixes to ROUTING ACK/NAK display, `mqtt.secondary_keys` PSK shorthand handling, and traceroute path orientation, plus jschrempp and the Meshview community for testing and feedback included in this release.
### 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.
Each new snapshot stores packets imported during the previous complete UTC day,
labeled with that day's date. Node and gateway counts are database totals at capture
time. Existing historical snapshots retain their previously stored packet totals.
- Stats/UI: expanded stats views with snapshot data and added channel filters to Chat and Firehose.
- Map/node fixes: corrected node location handling, map popup behavior, packet page display, and node list sorting.
- Ingestion/API reliability: improved duplicate `PacketSeen` handling, guarded invalid node info packets, and made traceroute/edge APIs more tolerant of decode failures.
- Language support: added Russian translations.
### Version 3.0.5 — February 2026
- **IMPORTANT:** the predicted coverage feature requires the extra `pyitm` dependency. If it is not installed, the coverage API will return 503.
- Ubuntu install (inside the venv): `./env/bin/pip install pyitm`
- Coverage: predicted coverage overlay (Longley‑Rice area mode) with perimeter rendering and documentation.
- UI: added QR code display for quick node/app access.
- Gateways: persistent gateway tracking (`is_mqtt_gateway`) and UI indicators in nodes, map popups, and stats.
- Map UX: deterministic jitter for overlapping nodes; edges follow jittered positions.
- Tooling: Meshtastic protobuf updater script with `--check` and `UPSTREAM_REV.txt` tracking.
### Version 3.0.4 — Late January 2026
- Database: multi‑DB support, PostgreSQL scripts, WAL config for SQLite, cleanup query timing fixes, removal of import time columns, and various time‑handling fixes.
- UI/UX: extensive updates to node.html, nodelist.html, top.html, and packet.html (paging, stats, distance, status/favorites), plus net view changes to 12‑hour window.
- API/logic: weekly mesh query fix, node list performance improvement, backwards‑compatibility and other bug fixes.
- MQTT reader: configurable skip‑node list and secondary decryption keys.
- Docs/ops: multiple documentation updates, updated site list, container workflow fixes/tests, README updates.
### Version 3.0.2 — January 2026
- Changes to the Database to will make it so that there is a need for space when updating to the latest. SQlite requires to rebuild the database when droping a column. ( we are droping some of the old columns) so make sure you have 1.2x the size of the db of space in your environment. Depending on how big your db is it would take a long time.
### Version 3.0.1 — December 2025
#### 🌐 Multi-Language Support (i18n)
- New `/api/lang` endpoint for serving translations
- Section-based translation loading (e.g., `?section=firehose`)
- Default language controlled via config file language section
- JSON-based translation files for easy expansion
- Core pages updated to support `data-translate-lang` attributes
### 🛠 Improvements
- Updated UI elements across multiple templates for localization readiness
- General cleanup to support future language additions
### Version 3.0.0 update - November 2025
**Major Infrastructure Improvements:**
* **Database Migrations**: Alembic integration for safe schema upgrades and database versioning
* **Automated Backups**: Independent database backup system with gzip compression (separate from cleanup)
* **Development Tools**: Quick setup script (`setup-dev.sh`) with pre-commit hooks for code quality
* **Docker Support**: Pre-built containers now available on GitHub Container Registry with automatic builds - ogarcia
**New Features:**
* **Traceroute Return Path**: Log and display return path data for traceroute packets - jschrempp
* **Microsecond Timestamps**: Added `import_time_us` columns for higher precision time tracking
**Technical Improvements:**
* Migration from manual SQL to Alembic-managed schema
* Container images use `uv` for faster dependency installation
* Python 3.13 support with slim Debian-based images
* Documentation collection in `docs/` directory
* API routes moved to separate modules for better organization
* /version and /health endpoints added for monitoring
See [README-Docker.md](README-Docker.md) for container deployment and [docs/](docs/) for technical documentation.
### Version 2.0.7 update - September 2025
* New database maintenance capability to automatically keep a specific number of days of data.
* Added configuration for update intervals for both the Live Map and the Firehose pages.
### Version 2.0.6 update - August 2025
* New Live Map (Shows packet feed live)
* New API /api/config (See API documentation)
* New API /api/edges (See API documentation)
* Adds edges to the map (click to see traceroute and neighbours)
### Version 2.0.4 update - August 2025
* New statistic page with more data.
* New API /api/stats (See API documentation).
* Inprovement on "See Everything" and "Conversation" pages.
* Tracking of replies with links to original message.
### Version 2.0.3 update - June 2025
* Moved more graphs to eCharts.
* Addedd smooth updating for "Conversations" and "See everything" sections.
* Now you can turn on and off "Quick Links".
* Network graphs are now dynamically generated depending on your mesh and the presets in use.
* Download node's packet information for the last 3 days to .csv file.
* Display distance traveled by packet.
### Key Features
* **Live Data Visualization**: Users can view real-time data from the mesh network, including text messages, GPS positions, and node information.
* **Interactive Map**: The site offers an interactive map displaying the locations of active nodes, helping users identify network coverage areas.
* **Mesh Graphs**: Visual representations of the network's structure and connectivity are available, illustrating how nodes are interconnected.
* **Packet Analysis**: Detailed information on individual data packets transmitted within the network can be accessed, including payload content and transmission paths.
* **Node Statistics**: Users can explore statistics related to network traffic, such as top contributors and message volumes.
Samples of currently running instances:
| Area | URL | Version | Nodes | Last Updated |
| --- | --- | --- | ---: | --- |
| Polski Mesh | https://meshview.format.ovh | 3.0.6 (65386be) | 4,827 | 4/1/2026, 12:12:25 PM |
| Poland | https://meshview.szastan.pl | 3.0.5 (unknown) | 4,194 | 4/1/2026, 12:12:39 PM |
| Spain | https://meshview.meshtastic.es | 3.0.5 (unknown) | 2,466 | 4/1/2026, 12:11:17 PM |
| San Francisco Bay Area | https://meshview.bayme.sh | 3.0.5 (bdf70da) | 1,983 | 4/1/2026, 12:11:08 PM |
| Southern California | https://meshview.socalmesh.org | 3.0.5 (unknown) | 1,205 | 4/1/2026, 12:11:50 PM |
| Oregon (USA) | https://meshview.meshoregon.com | 3.0.5 (bdf70da) | 1,167 | 4/1/2026, 12:11:41 PM |
| Australia/ New Zeland | https://my.meshview.world/anz | plus 1.0.0 | 1,165 | 4/1/2026, 12:11:59 PM |
| Hessen - Germany | https://meshview.lsinfra.de | 3.0.5 (unknown) | 1,082 | 4/1/2026, 12:11:30 PM |
| New York City | https://meshview.nyme.sh | 3.0.5 (bdf70da) | 984 | 4/1/2026, 12:11:26 PM |
| Salt Lake City (USA) | https://meshview.freq51.net | — | 801 | 4/1/2026, 12:11:36 PM |
| Salzburg / Austria | https://meshview-salzburg.jmt.gr | — | 748 | 4/1/2026, 12:11:21 PM |
| North Georgia / East Tennessee - USA | https://view.mtnme.sh | 3.0.3 (ff30623) | 730 | 4/1/2026, 12:11:33 PM |
| Canada | https://mv.canadaverse.org | 3.0.1 (unknown) | 674 | 4/1/2026, 12:12:06 PM |
| Pioneer Valley, Massachusetts (USA) | https://meshview.pvmesh.org | 3.0.4 (018e16e) | 560 | 4/1/2026, 12:11:44 PM |
| Western Pennsylvania (USA) | https://map.wpamesh.net | 3.0.5 (unknown) | 447 | 4/1/2026, 12:11:38 PM |
| Great Britan | https://my.meshview.world/gb | plus 1.0.0 | 421 | 4/1/2026, 12:12:03 PM |
| Chicago (USA) | https://meshview.chicagolandmesh.org | 3.0.5 (unknown) | 420 | 4/1/2026, 12:12:41 PM |
| Georgia (USA) | https://meshview.gamesh.net | 3.0.1 (unknown) | 384 | 4/1/2026, 12:11:45 PM |
| Brazil | https://my.meshview.world/brazil | plus 1.0.0 | 364 | 4/1/2026, 12:12:01 PM |
| Mexico | https://my.meshview.world/mexico | plus 1.0.0 | 268 | 4/1/2026, 12:11:59 PM |
| Northeast Ohio | https://meshview.neomesh.org | 3.0.5 (unknown) | 264 | 4/1/2026, 12:11:52 PM |
| South Africa | https://my.meshview.world/za | plus 1.0.0 | 263 | 4/1/2026, 12:12:07 PM |
| Argentina | https://my.meshview.world/argentina | plus 1.0.0 | 258 | 4/1/2026, 12:12:00 PM |
| Northwest Indiana (USA) | https://meshview.nwimesh.net | 3.0.5 (2cc53dc) | 219 | 4/1/2026, 12:12:08 PM |
| Louisiana (USA) | https://meshview.louisianamesh.org | — | 78 | 4/1/2026, 12:11:51 PM |
| Chile | https://my.meshview.world/chile | plus 1.0.0 | 58 | 4/1/2026, 12:12:06 PM |
| Colombia | https://meshview.meshcolombia.co | 3.0.5 (2cc53dc) | 55 | 4/1/2026, 12:11:46 PM |
| Croatia | https://map.cromesh.eu | — | 0 | 4/1/2026, 12:11:45 PM |
| Saint Louis (USA) | https://meshview.meshstl.org | 3.0.5 (2cc53dc) | 0 | 4/1/2026, 12:11:51 PM |
| Southwest Louisiana (USA) | https://www.swlamesh.com | — | 0 | 4/1/2026, 12:11:46 PM |
---
### Updating from 2.x to 3.x
We are adding the use of Alembic. If using GitHub
Update your codebase by running the pull command
```bash
cd meshview
git pull origin master
```
Install Alembic in your environment
```bash
./env/bin/pip install alembic
```
Start your scripts or services. This process will update your database with the latest schema.
## Installing
### Using Docker (Recommended)
The easiest way to run MeshView is using Docker. Pre-built images are available from GitHub Container Registry.
See **[README-Docker.md](README-Docker.md)** for complete Docker installation and usage instructions.
### Manual Installation
Requires **`python3.13`** or above.
Clone the repo from GitHub:
```bash
git clone https://github.com/pablorevilla-meshtastic/meshview.git
cd meshview
```
#### Quick Setup (Recommended)
Run the development setup script:
```bash
./setup-dev.sh
```
This will:
- Create Python virtual environment
- Install all requirements
- Install development tools (pre-commit, pytest)
- Set up pre-commit hooks for code formatting
- Create config.ini from sample
#### Manual Setup
Create a Python virtual environment:
```bash
python3 -m venv env
```
Install the environment requirements:
```bash
./env/bin/pip install -r requirements.txt
```
Install `graphviz` on MacOS or Debian/Ubuntu Linux:
```bash
sudo apt-get install graphviz
```
Copy `sample.config.ini` to `config.ini`:
```bash
cp sample.config.ini config.ini
```
Edit `config.ini` to match your MQTT and web server settings:
```bash
nano config.ini
```
> **NOTE**
> On MacOS set the bind configuration line to
> ```
> bind = 127.0.0.1
> ```
Example:
```ini
# -------------------------
# Server Configuration
# -------------------------
[server]
# The address to bind the server to. Use * to listen on all interfaces.
bind = *
# Port to run the web server on.
port = 8081
# Path to TLS certificate (leave blank to disable HTTPS).
tls_cert =
# Path for the ACME challenge if using Let's Encrypt.
acme_challenge =
# -------------------------
# Site Appearance & Behavior
# -------------------------
[site]
# The domain name of your site.
domain =
# Select language (this represents the name of the json file in the /lang directory)
language = es
# Site title to show in the browser title bar and headers.
title = Bay Area Mesh
# A brief message shown on the homepage.
message = Real time data from around the bay area and beyond.
# 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
# Show the API documentation link in the navigation bar (default: True).
api = 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,29 +0,0 @@
"""add last altitude to node
Revision ID: 44612e74a798
Revises: 4d2a7c9e1b30
Create Date: 2026-10-28 10:37:11.340792
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = '44612e74a798'
down_revision: str | None = '4d2a7c9e1b30'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
with op.batch_alter_table("node") as batch_op:
batch_op.add_column(sa.Column("last_altitude", sa.BigInteger(), nullable=True))
def downgrade() -> None:
with op.batch_alter_table("node") as batch_op:
batch_op.drop_column("last_altitude")
@@ -1,37 +0,0 @@
"""Add packet index on from_node_id, portnum and import_time_us
Revision ID: 4d2a7c9e1b30
Revises: e8f2c4b6d9a1
Create Date: 2026-10-26 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "4d2a7c9e1b30"
down_revision: str | None = "e8f2c4b6d9a1"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
INDEX_NAME = "idx_packet_from_node_portnum_time_us"
def upgrade() -> None:
# Lets the node QR endpoint read a node's NODEINFO packets without scanning all its packets.
inspector = sa.inspect(op.get_bind())
if INDEX_NAME not in {index["name"] for index in inspector.get_indexes("packet")}:
op.create_index(
INDEX_NAME,
"packet",
["from_node_id", "portnum", sa.text("import_time_us DESC")],
unique=False,
)
def downgrade() -> None:
op.drop_index(INDEX_NAME, table_name="packet")
@@ -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)
-753
View File
@@ -1,753 +0,0 @@
# API Documentation
Base URL: `http(s)://<host>`
This reference covers all 16 GET routes registered in `meshview/web_api/api.py`,
including `/health` and `/version`. The browser version is served at `/api.html`.
Responses below are illustrative examples; actual values depend on stored data.
Regenerate the browser reference after editing this file with
`node scripts/build-api-docs.mjs`.
## Conventions
- Successful API responses are JSON. Explicit validation errors usually return JSON
with an `error` field. Some unhandled errors return HTTP 500 with a plain-text
body; check HTTP status and Content-Type before parsing an error response.
- All routes are read-only. The application does not require an API token; a reverse
proxy may impose authentication. There are no application-level write endpoints.
- `*_us` timestamps and `since` use microseconds since the Unix epoch. Snapshot dates
and statistics buckets use UTC. Node latitude/longitude integers must be divided
by 10,000,000 to obtain degrees; coverage coordinates are already degrees.
- Packet `id` and `storage_id` are database row IDs. Use these for the `packet_id`
query/path parameters on packet, observation, count, and traceroute endpoints.
A response field named `packet_id` on a packet object is instead its over-the-air
Meshtastic ID. `reply_id`, when present, is also an over-the-air ID. These ID types
are not interchangeable. Node IDs are numeric Meshtastic node numbers; the node
object's `id` is a separate string identifier.
- Use decimal node IDs throughout. The packet sender/recipient filters and the QR
and coverage paths also accept Python-style `0x` hexadecimal numbers. This is
not supported consistently by the other routes.
- Public broadcast text is readable. Direct text messages on port 1 are returned as
`<redacted>`. Request chat with `/api/packets?portnum=1`; there is no `/api/chat`
route. Do not treat a decoded `payload` string as trusted HTML.
## Quick examples
```sh
curl 'http://localhost:8081/api/nodes?days_active=3'
curl 'http://localhost:8081/api/packets?portnum=1&limit=100'
curl 'http://localhost:8081/api/stats/count'
curl 'http://localhost:8081/api/coverage/1234?mode=perimeter&radius_km=20'
```
## 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. Omit for all
nodes with a non-null last-seen timestamp; invalid integers are ignored.
Nodes are sorted by `short_name` ascending. `role` is normalized to uppercase;
channel and hardware filters are exact matches. No pagination is implemented.
Errors: HTTP 500 with `{"error":"Failed to fetch nodes"}` for handler failures;
the storage helper may return an empty list for database failures.
Response Example
```json
{
"nodes": [
{
"id": "!000004d2",
"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,
"last_altitude": 125,
"channel": "main",
"is_mqtt_gateway": true,
"first_seen_us": 1736283723456789,
"last_seen_us": 1736370123456789
}
]
}
```
`last_altitude` is the latest reported altitude in meters above sea level, or `null`
when unknown. It updates with valid node locations from position packets and map reports.
Position packets without altitude preserve the previous value. Map reports lack altitude
field presence, so zero values in map reports also preserve the previous value.
Existing nodes receive altitude as new reports arrive.
---
## 2. Packets API
### GET `/api/packets`
Returns packets with optional filters.
Query Parameters
- `packet_id` (optional, decimal int): Return one packet by database row ID (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.
- `channel` (optional, string): Filter by exact channel name before applying the packet limit.
- `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,
"storage_id": 123,
"packet_id": 3314808102,
"import_time_us": 1736370123456789,
"channel": "main",
"from_node_id": 5678,
"to_node_id": 4294967295,
"portnum": 1,
"long_name": "Alice",
"payload": "Hello, mesh!",
"to_long_name": null,
"reply_id": 122
}
],
"latest_import_time": 1736370123456789
}
```
Notes
- For `portnum=1` (text messages), packets are filtered to remove sequence-only payloads.
- Results are newest first. `since` is strictly greater than the supplied timestamp.
Store `latest_import_time` for the next poll and deduplicate by `id`. A bounded
result can omit older records if more packets arrive than the requested limit;
this endpoint is not a durable cursor or backfill API.
- `latest_import_time` is returned only when the list response has a positive import
timestamp; it is absent for empty results and single-packet lookups.
- `packet_id` lookup returns `{"packets":[]}` with HTTP 200 when missing. Its objects
omit `to_long_name` and `reply_id`; nullable `portnum` is possible in this mode.
- `contains` is case-insensitive. With `portnum=1`, matching is performed on decoded
displayed payload text (including redaction placeholders) after the database limit is applied, so fewer than `limit` results
may be returned. For other requests, it searches stored payload bytes cast to text;
this is not a general search over decoded protobuf fields.
- Invalid `limit` falls back to 50. Invalid `since`, `portnum`, and node filters are
logged and ignored. Invalid single-packet IDs return HTTP 400; handler failures
return HTTP 500 with `{"error":"Failed to fetch packets"}`.
---
## 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"]
}
```
---
Errors: storage/period failures return HTTP 200 with `channels: []` and an `error`
field. Non-integer `length` is parsed outside that handler and can return HTTP 500.
Use a positive integer length and the literal `hour` or `day`.
## 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": 0,
"seen": 0
}
```
---
The series response contains only buckets with records, ordered oldest first;
missing hours/days are not filled with zeroes. Periods are UTC strings.
Current `node`-mode limitation: the handler reads a `total` key that the statistics
helper does not provide, so `sent` and `seen` currently return zero. It also uses
recipient filtering for the second query, rather than gateway observations. This
mode ignores the other filters. For usable sent/observation totals, request
`/api/stats/count?from_node=1234&period_type=day&length=1` instead.
Errors: HTTP 400 for an unsupported `period_type`, non-integer `length`, `node`,
`portnum`, `from_node`, or `to_node`. Storage failures can return HTTP 500.
Use a positive `length`; the handler does not impose a positive lower bound.
### 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
}
```
---
Without filters, counts cover the whole retained database. With time, channel,
or direction filters, omitted time settings default to `period_type=day&length=1`.
`total_seen` counts observation rows for packets matching the packet import-time
window, not distinct gateways. Channel matching is case-insensitive.
`packet_id` applies only to `total_seen` and overrides its other filters: it counts
all observations of that database packet ID. It does not narrow `total_packets`.
In particular, `packet_id` alone leaves `total_packets` as the global packet total.
Errors: HTTP 400 for non-integer ID/length filters. Unsupported `period_type` or
storage failures can return HTTP 500; use `hour` or `day` and a positive length.
### 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
}
]
}
```
---
`sent` counts packet records from each node; `seen` counts observation records for
that sender's packets. `avg` is `round(seen / max(sent, 1), 2)`, not a distinct-gateway
count. Windows are anchored to the newest packet and newest observation in the
respective tables, not wall-clock time. Nodes with zero activity are included;
`total` counts nodes matching the channel filter, not just active nodes.
Channel matching is exact. Use positive `length` and `limit`, and a nonnegative
`offset`. Only the upper limit of 100 is enforced. Invalid numeric strings can
return HTTP 500; any `period_type` other than the literal `hour` is treated as days.
## 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.
A completed traceroute is observed as a response packet, whose `from`/`to` are reversed
with respect to the traced path, so edges are built as `to -> route[] -> from`. `route[]`
may contain `0xFFFFFFFF` placeholders for hops the mesh could not identify; the edges on
either side of such a placeholder are omitted, because the nodes around an unknown hop
are not neighbours.
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" }
]
}
```
---
Unknown `type` values return an empty edge list. Invalid `node_id` returns HTTP 400;
storage failures can return HTTP 500. A missing node is not an error and normally
returns an empty list. Neighbor edges come from the latest stored port-71 sample
(the storage helper defaults to 50 packets), not the traceroute 12-hour window.
## 6. Daily Snapshots and Configuration
### GET `/api/snapshots/daily`
Returns stored daily snapshots. For new snapshots, `packet_count` is the number of
packet records imported during `date` (00:00 UTC inclusive to the next midnight
exclusive). The scheduled capture records the previous complete UTC day. Repeated
observations of the same packet are not counted separately. `node_count` counts distinct
packet senders whose packets were imported or observed during that UTC day (including
observations of previously imported packets). `gateway_count` counts distinct MQTT
gateways with packet observations imported during that day. These are activity counts,
not database totals; recipients alone do not count as active nodes. Activity uses local
import timestamps, not device timestamps. Older snapshots retain their originally stored
counts and are not automatically converted. Counts depend on the packet and observation
history still retained at capture time.
Query Parameters
- `length` (optional, int): Return the latest N snapshot records, clamped to 1-3650.
Omit for all stored snapshots. Results are always ordered by date ascending.
This is a record limit, not a guarantee of consecutive calendar dates.
Response Example
```json
{"data":[{"date":"2026-10-24","node_count":143,"packet_count":28465,"gateway_count":17,"captured_at_us":1792886400000000}]}
```
No stored snapshots returns `{"data":[]}`. Invalid `length` returns HTTP 400;
storage failures return HTTP 500. `captured_at_us` is the capture time, which may
be later than the day summarized by `date`.
### GET `/api/config`
Returns a safe subset of server configuration.
`site.map_channel_colors` contains channel color overrides from the optional
`[map_channel_colors]` INI section. Each entry is `channel = #RRGGBB`; invalid colors
are omitted. Channel matching on the map ignores case, spaces, hyphens, and underscores.
Unlisted channels use generated colors. For example:
```ini
[map_channel_colors]
LongFast = #4363d8
LocalChat = #18aa18
```
No query parameters are supported. Only the `site`, MQTT server/topics, and cleanup
fields shown here are exposed; credentials and the database connection string are
not returned. Feature flags and cleanup booleans are lowercase strings (`"true"` /
`"false"`), not JSON booleans. Cleanup scheduling values are strings; map bounds are
numbers and refresh intervals are integers. The removed `starting` option is not
returned: `/` always serves the dashboard. `site.api` controls visibility of the API
documentation link in the navigation bar, defaults to `"true"`, and can be disabled
with `api = False` in `[site]`. This setting does not disable documentation or API
routes. Restart the web server and reload the page after changing it. Handler
failures return HTTP 500.
Restart the web server and reload the map after changing these settings. Omitting
the section uses generated colors for every channel.
Response Example
```json
{
"site": {
"domain": "example.com",
"language": "en",
"title": "Meshview",
"message": "",
"nodes": "true",
"chat": "true",
"everything": "true",
"graphs": "true",
"stats": "true",
"net": "true",
"map": "true",
"top": "true",
"api": "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,
"map_channel_colors": {"LongFast":"#4363d8"},
"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..."
}
```
---
Unknown or invalid language codes fall back to the English file. An unknown section
returns HTTP 404. The response has no wrapper: it is either the full translation
object or the requested section. Translation-file failures can return HTTP 500.
## 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": 1753188300,
"hop_limit": 7,
"hop_start": 0,
"channel": "main",
"rx_snr": 5.0,
"rx_rssi": -90,
"topic": "msh/region/#",
"import_time_us": 1736370123456789
}
]
}
```
---
`node_id` identifies the observing MQTT gateway. `rx_time` is the device-provided
receive time in Unix seconds, while `import_time_us` is local import time
in microseconds. Signal fields can be null. Multiple rows can describe the same
gateway; consumers wanting unique gateways must deduplicate them. Hop count is
usually `max(0, hop_start - hop_limit)` when both values are known. Observations
do not by themselves prove a direct radio link from the sender to that gateway.
No observations, including for an unknown packet, returns `{"seen":[]}` with HTTP
200. Invalid path IDs return HTTP 400; handler failures return HTTP 500.
## 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.
A completed traceroute is observed as a response packet, whose `from`/`to` are reversed
with respect to the traced path. `initiator` and `target` resolve this: the forward path
runs `initiator -> forward_hops -> target` and the return path runs
`target -> reverse_hops -> initiator`, in both directions of travel. `forward_hops` and
`reverse_hops` contain only the intermediate hops, never the endpoints.
A gateway usually reports a response that is still travelling home, so `reverse_hops` is
often incomplete. `reverse_complete` says whether that observation had reached the
initiator; only then does the corresponding `winning_paths.reverse` entry end at the
initiator.
`winning_paths` is built from response observations, since a response proves the request
reached the target. `complete` on a `unique_forward_paths` entry says whether some
response reported that hop list, and so whether it is known to end at the target.
Response Example
```json
{
"packet": {
"id": 123,
"from": 222,
"to": 111,
"initiator": 111,
"target": 222,
"channel": "main"
},
"traceroute_packets": [
{
"index": 0,
"gateway_node_id": 333,
"done": true,
"forward_hops": [444, 555],
"reverse_hops": [555, 444],
"reverse_complete": true
}
],
"unique_forward_paths": [
{ "path": [444, 555], "count": 2, "complete": true }
],
"unique_reverse_paths": [
[555, 444]
],
"winning_paths": {
"forward": [[111, 444, 555, 222]],
"reverse": [[222, 555, 444, 111]]
}
}
```
---
`traceroute_packets` can be empty even when the packet exists. Unknown database
packet IDs return HTTP 404. Invalid integer IDs and storage failures can return
HTTP 500; this handler does not implement a separate HTTP 400 validation branch.
## 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
}
```
---
No query parameters. HTTP 200 reports `status: "healthy"` with database connectivity.
A database failure returns HTTP 503 with `status: "unhealthy"` and
`database: "disconnected"`. `seconds_since_last_message` is included only when a
latest imported packet exists; SQLite size fields appear only when available.
Cleanup and backup reports include configured schedules and status-file contents
when present. Their status may be `disabled`, `unknown`, `error`, or the last job's
recorded status; a failed backup/cleanup does not itself change the top-level HTTP
status. The optional `last_run` objects depend on the job's stored report.
## 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"
}
```
No query parameters. HTTP 500 with an `error` field if version metadata cannot be
retrieved. A revision may be `unknown` if Git metadata is unavailable.
## 12. Node Contact URL
### GET `/api/node/{node_id}/qr`
Returns a Meshtastic shared-contact URL as JSON, not a PNG or SVG image. The client
can encode `meshtastic_url` in a QR code. No query parameters are supported.
Path Parameters
- `node_id` (required, int): Node number in decimal or `0x` hexadecimal form.
Response Example
```json
{
"node_id":1234,
"long_name":"Alice",
"short_name":"A",
"role":"CLIENT",
"meshtastic_url":"https://meshtastic.org/v/#BASE64URL_CONTACT"
}
```
The example contact payload is a placeholder, not an importable contact. The URL
encodes node identity and available user metadata as a base64url SharedContact
protobuf, with `manually_verified` false. Metadata can be null.
Errors: HTTP 400 for invalid IDs; HTTP 404 when the node is absent; HTTP 500 for
contact serialization failures or unhandled storage errors.
## 13. Predicted Radio Coverage
### GET `/api/coverage/{node_id}`
Computes an ITM area-model prediction centered on the node's last stored position.
This is a model prediction, not a measured coverage boundary or terrain profile.
The optional `pyitm` dependency is required. Calculations run off the event loop
and reuse cached model results. All parameters are optional except the node ID.
Path Parameters
- `node_id` (required, int): Node number in decimal or `0x` hexadecimal form.
Query Parameters
- `mode` (string, default `perimeter`): `perimeter` or `heatmap`. Currently every
value other than the exact string `perimeter` selects the heatmap branch.
- `freq_mhz` (number, default `907`): Frequency in MHz; range 1-10000.
- `tx_dbm` (number, default `20`): Transmit power in dBm; range -50 to 60.
- `tx_height_m` (number, default `5`): Transmit antenna height in meters; range 0-1000.
- `rx_height_m` (number, default `1.5`): Receive antenna height in meters; range 0-1000.
- `radius_km` (number, default `40`): Maximum distance in kilometers; range 1-200.
- `step_km` (number, default `0.25`): Radial sample spacing in kilometers; range 0.05-50.
- `reliability` (number, default `0.5`): ITM time fraction; range 0.01-0.99.
- `threshold_dbm` (number, default `-120`): Perimeter received-power threshold in dBm;
range -200 to 0. Ignored by heatmap computation, although still validated.
Numeric bounds are inclusive, values must be finite, and `radius_km / step_km`
must not exceed 4000. Smaller steps increase computation cost.
Response Example (`mode=perimeter`)
```json
{
"mode":"perimeter",
"threshold_dbm":-120.0,
"perimeter":[[30.21,-93.20],[30.209,-93.198]]
}
```
`perimeter` contains `[latitude, longitude]` degree pairs for the furthest qualifying
sample on each modeled bearing. Bearings with no qualifying sample are omitted;
the list is not necessarily a closed GeoJSON polygon.
Response Example (`mode=heatmap`)
```json
{
"mode":"heatmap",
"min_dbm":-130.0,
"max_dbm":-80.0,
"points":[[30.21,-93.20,-110.5]]
}
```
`points` contains `[latitude, longitude, received_power_dbm]` triples. Min/max values
provide a color-scale range, extended from the defaults to include computed values.
An empty perimeter or point list is a valid result when no samples qualify.
Errors: HTTP 400 for invalid IDs, nonnumeric/nonfinite/out-of-range parameters, or
an excessive radius/step ratio; HTTP 404 for an unknown node or missing/zero-valued
stored coordinates; HTTP 503 when `pyitm` is unavailable. Dependency availability is checked
before numeric query validation and node lookup. Unexpected model/storage failures
can return HTTP 500.
-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)
+70
View File
@@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/config.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\x17meshtastic/config.proto\x12\nmeshtastic\"\xc2\x1f\n\x06\x43onfig\x12\x31\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfigH\x00\x12\x35\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfigH\x00\x12/\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfigH\x00\x12\x33\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfigH\x00\x12\x33\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfigH\x00\x12-\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigH\x00\x12\x37\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfigH\x00\x1a\x91\x05\n\x0c\x44\x65viceConfig\x12\x32\n\x04role\x18\x01 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eserial_enabled\x18\x02 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x03 \x01(\x08\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12I\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32/.meshtastic.Config.DeviceConfig.RebroadcastMode\x12 \n\x18node_info_broadcast_secs\x18\x07 \x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x12\x12\n\nis_managed\x18\t \x01(\x08\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xaa\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x11\n\rROUTER_CLIENT\x10\x03\x12\x0c\n\x08REPEATER\x10\x04\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\"Q\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x1a\x91\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_update_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 \x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t \x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n \x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12;\n\x08gps_mode\x18\r \x01(\x0e\x32).meshtastic.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10 \x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\xea\x01\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01 \x01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 \x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t \x01(\r\x1a\xfe\x02\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 \x01(\t\x12\x12\n\nntp_server\x18\x05 \x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x12\x42\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32,.meshtastic.Config.NetworkConfig.AddressMode\x12@\n\x0bipv4_config\x18\x08 \x01(\x0b\x32+.meshtastic.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x1a\x46\n\nIpV4Config\x12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 \x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 \x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\x1a\xbe\x05\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12H\n\ngps_format\x18\x02 \x01(\x0e\x32\x34.meshtastic.Config.DisplayConfig.GpsCoordinateFormat\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x19\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x12\x13\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x12<\n\x05units\x18\x06 \x01(\x0e\x32-.meshtastic.Config.DisplayConfig.DisplayUnits\x12\x37\n\x04oled\x18\x07 \x01(\x0e\x32).meshtastic.Config.DisplayConfig.OledType\x12\x41\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32,.meshtastic.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\"M\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001'
_CONFIG._serialized_start=40
_CONFIG._serialized_end=4074
_CONFIG_DEVICECONFIG._serialized_start=416
_CONFIG_DEVICECONFIG._serialized_end=1073
_CONFIG_DEVICECONFIG_ROLE._serialized_start=820
_CONFIG_DEVICECONFIG_ROLE._serialized_end=990
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=992
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=1073
_CONFIG_POSITIONCONFIG._serialized_start=1076
_CONFIG_POSITIONCONFIG._serialized_end=1733
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=1507
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=1678
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=1680
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=1733
_CONFIG_POWERCONFIG._serialized_start=1736
_CONFIG_POWERCONFIG._serialized_end=1970
_CONFIG_NETWORKCONFIG._serialized_start=1973
_CONFIG_NETWORKCONFIG._serialized_end=2355
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=2248
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=2318
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=2320
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=2355
_CONFIG_DISPLAYCONFIG._serialized_start=2358
_CONFIG_DISPLAYCONFIG._serialized_end=3060
_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_start=2795
_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_end=2872
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=2874
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=2914
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=2916
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=2993
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=2995
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=3060
_CONFIG_LORACONFIG._serialized_start=3063
_CONFIG_LORACONFIG._serialized_end=3879
_CONFIG_LORACONFIG_REGIONCODE._serialized_start=3523
_CONFIG_LORACONFIG_REGIONCODE._serialized_end=3728
_CONFIG_LORACONFIG_MODEMPRESET._serialized_start=3731
_CONFIG_LORACONFIG_MODEMPRESET._serialized_end=3879
_CONFIG_BLUETOOTHCONFIG._serialized_start=3882
_CONFIG_BLUETOOTHCONFIG._serialized_end=4055
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=3999
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=4055
# @@protoc_insertion_point(module_scope)
+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)
+92
View File
@@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/mesh.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 module_config_pb2 as meshtastic_dot_module__config__pb2
from meshtastic import portnums_pb2 as meshtastic_dot_portnums__pb2
from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2
from meshtastic import xmodem_pb2 as meshtastic_dot_xmodem__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\xe5\x05\n\x08Position\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\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\t \x01(\x11\x12#\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x14\n\x0cground_speed\x18\x0f \x01(\r\x12\x14\n\x0cground_track\x18\x10 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\"\xc4\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\"\xfc\x02\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\"\xca\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"\xa7\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\"\x93\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x12\n\nlatitude_i\x18\x02 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x03 \x01(\x0f\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\x95\x04\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\x42\x11\n\x0fpayload_variant\"\xfe\x01\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x0Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mesh_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_USER.fields_by_name['macaddr']._options = None
_USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
_MESHPACKET.fields_by_name['delayed']._options = None
_MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
_HARDWAREMODEL._serialized_start=4737
_HARDWAREMODEL._serialized_end=5819
_CONSTANTS._serialized_start=5821
_CONSTANTS._serialized_end=5865
_CRITICALERRORCODE._serialized_start=5868
_CRITICALERRORCODE._serialized_end=6106
_POSITION._serialized_start=201
_POSITION._serialized_end=942
_POSITION_LOCSOURCE._serialized_start=764
_POSITION_LOCSOURCE._serialized_end=842
_POSITION_ALTSOURCE._serialized_start=844
_POSITION_ALTSOURCE._serialized_end=942
_USER._serialized_start=945
_USER._serialized_end=1141
_ROUTEDISCOVERY._serialized_start=1143
_ROUTEDISCOVERY._serialized_end=1174
_ROUTING._serialized_start=1177
_ROUTING._serialized_end=1557
_ROUTING_ERROR._serialized_start=1344
_ROUTING_ERROR._serialized_end=1546
_DATA._serialized_start=1560
_DATA._serialized_end=1727
_WAYPOINT._serialized_start=1730
_WAYPOINT._serialized_end=1877
_MQTTCLIENTPROXYMESSAGE._serialized_start=1879
_MQTTCLIENTPROXYMESSAGE._serialized_end=1987
_MESHPACKET._serialized_start=1990
_MESHPACKET._serialized_end=2523
_MESHPACKET_PRIORITY._serialized_start=2345
_MESHPACKET_PRIORITY._serialized_end=2436
_MESHPACKET_DELAYED._serialized_start=2438
_MESHPACKET_DELAYED._serialized_end=2504
_NODEINFO._serialized_start=2526
_NODEINFO._serialized_end=2780
_MYNODEINFO._serialized_start=2782
_MYNODEINFO._serialized_end=2862
_LOGRECORD._serialized_start=2865
_LOGRECORD._serialized_end=3057
_LOGRECORD_LEVEL._serialized_start=2969
_LOGRECORD_LEVEL._serialized_end=3057
_QUEUESTATUS._serialized_start=3059
_QUEUESTATUS._serialized_end=3139
_FROMRADIO._serialized_start=3142
_FROMRADIO._serialized_end=3745
_TORADIO._serialized_start=3748
_TORADIO._serialized_end=4024
_COMPRESSED._serialized_start=4026
_COMPRESSED._serialized_end=4090
_NEIGHBORINFO._serialized_start=4093
_NEIGHBORINFO._serialized_end=4228
_NEIGHBOR._serialized_start=4230
_NEIGHBOR._serialized_end=4330
_DEVICEMETADATA._serialized_start=4333
_DEVICEMETADATA._serialized_end=4634
_HEARTBEAT._serialized_start=4636
_HEARTBEAT._serialized_end=4647
_NODEREMOTEHARDWAREPIN._serialized_start=4649
_NODEREMOTEHARDWAREPIN._serialized_end=4734
# @@protoc_insertion_point(module_scope)
+66
View File
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/module_config.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\x1emeshtastic/module_config.proto\x12\nmeshtastic\"\xd3\"\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x1a\xb0\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x14\n\x0cjson_enabled\x18\x06 \x01(\x08\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x0c\n\x04root\x18\x08 \x01(\t\x12\x1f\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x12\x1d\n\x15map_reporting_enabled\x18\n \x01(\x08\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1aN\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a>\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x1a\xd2\x01\n\x15\x44\x65tectionSensorConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16minimum_broadcast_secs\x18\x02 \x01(\r\x12\x1c\n\x14state_broadcast_secs\x18\x03 \x01(\r\x12\x11\n\tsend_bell\x18\x04 \x01(\x08\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0bmonitor_pin\x18\x06 \x01(\r\x12 \n\x18\x64\x65tection_triggered_high\x18\x07 \x01(\x08\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\x1a\xe4\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12@\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_Baud\x12\x0e\n\x06i2s_ws\x18\x04 \x01(\r\x12\x0e\n\x06i2s_sd\x18\x05 \x01(\r\x12\x0f\n\x07i2s_din\x18\x06 \x01(\r\x12\x0f\n\x07i2s_sck\x18\x07 \x01(\r\"\xa7\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x0e\n\nCODEC2_700\x10\x07\x12\x0f\n\x0b\x43ODEC2_700B\x10\x08\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\xe4\x04\n\x0cSerialConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04\x65\x63ho\x18\x02 \x01(\x08\x12\x0b\n\x03rxd\x18\x03 \x01(\r\x12\x0b\n\x03txd\x18\x04 \x01(\r\x12?\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12?\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\x8a\x02\n\x0bSerial_Baud\x12\x10\n\x0c\x42\x41UD_DEFAULT\x10\x00\x12\x0c\n\x08\x42\x41UD_110\x10\x01\x12\x0c\n\x08\x42\x41UD_300\x10\x02\x12\x0c\n\x08\x42\x41UD_600\x10\x03\x12\r\n\tBAUD_1200\x10\x04\x12\r\n\tBAUD_2400\x10\x05\x12\r\n\tBAUD_4800\x10\x06\x12\r\n\tBAUD_9600\x10\x07\x12\x0e\n\nBAUD_19200\x10\x08\x12\x0e\n\nBAUD_38400\x10\t\x12\x0e\n\nBAUD_57600\x10\n\x12\x0f\n\x0b\x42\x41UD_115200\x10\x0b\x12\x0f\n\x0b\x42\x41UD_230400\x10\x0c\x12\x0f\n\x0b\x42\x41UD_460800\x10\r\x12\x0f\n\x0b\x42\x41UD_576000\x10\x0e\x12\x0f\n\x0b\x42\x41UD_921600\x10\x0f\"U\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\n\n\x06SIMPLE\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\x0b\n\x07TEXTMSG\x10\x03\x12\x08\n\x04NMEA\x10\x04\x12\x0b\n\x07\x43\x41LTOPO\x10\x05\x1a\xe9\x02\n\x1a\x45xternalNotificationConfig\x12\x0f\n\x0Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.module_config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_REMOTEHARDWAREPINTYPE._serialized_start=4586
_REMOTEHARDWAREPINTYPE._serialized_end=4659
_MODULECONFIG._serialized_start=47
_MODULECONFIG._serialized_end=4482
_MODULECONFIG_MQTTCONFIG._serialized_start=945
_MODULECONFIG_MQTTCONFIG._serialized_end=1249
_MODULECONFIG_MAPREPORTSETTINGS._serialized_start=1251
_MODULECONFIG_MAPREPORTSETTINGS._serialized_end=1329
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=1332
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=1462
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=1464
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=1526
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=1529
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=1739
_MODULECONFIG_AUDIOCONFIG._serialized_start=1742
_MODULECONFIG_AUDIOCONFIG._serialized_end=2098
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=1931
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=2098
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=2100
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=2218
_MODULECONFIG_SERIALCONFIG._serialized_start=2221
_MODULECONFIG_SERIALCONFIG._serialized_end=2833
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=2480
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=2746
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=2748
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=2833
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=2836
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=3197
_MODULECONFIG_STOREFORWARDCONFIG._serialized_start=3200
_MODULECONFIG_STOREFORWARDCONFIG._serialized_end=3332
_MODULECONFIG_RANGETESTCONFIG._serialized_start=3334
_MODULECONFIG_RANGETESTCONFIG._serialized_end=3398
_MODULECONFIG_TELEMETRYCONFIG._serialized_start=3401
_MODULECONFIG_TELEMETRYCONFIG._serialized_end=3759
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=3762
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=4360
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=4261
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=4360
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=4362
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=4463
_REMOTEHARDWAREPIN._serialized_start=4484
_REMOTEHARDWAREPIN._serialized_end=4584
# @@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/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 @@
569a2b3ae7b6bda1a7ab177463a55d8ede3bef53
View File
Whitespace-only changes.
-74
View File
@@ -1,74 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/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.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 connection_status_pb2 as meshtastic_dot_protobuf_dot_connection__status__pb2
from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xb5\x1d\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.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\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.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\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.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\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12H\n\x10send_input_event\x18\x1b \x01(\x0b\x32,.meshtastic.protobuf.AdminMessage.InputEventH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.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;\n\x12set_fixed_position\x18) \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\x00\x12\x1b\n\x11toggle_muted_node\x18\x31 \x01(\rH\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\x39\n\x0b\x61\x64\x64_contact\x18\x42 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x43 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\x00\x12 \n\x12reboot_ota_seconds\x18_ \x01(\x05\x42\x02\x18\x01H\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\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x08H\x00\x12\x41\n\x0bota_request\x18\x66 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18g \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18h \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1aS\n\nInputEvent\x12\x12\n\nevent_code\x18\x01 \x01(\r\x12\x0f\n\x07kb_char\x18\x02 \x01(\r\x12\x0f\n\x07touch_x\x18\x03 \x01(\r\x12\x0f\n\x07touch_y\x18\x04 \x01(\r\x1aS\n\x08OTAEvent\x12\x35\n\x0freboot_ota_mode\x18\x01 \x01(\x0e\x32\xLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.admin_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._options = None
_ADMINMESSAGE.fields_by_name['reboot_ota_seconds']._serialized_options = b'\030\001'
_OTAMODE._serialized_start=6748
_OTAMODE._serialized_end=6803
_ADMINMESSAGE._serialized_start=281
_ADMINMESSAGE._serialized_end=4046
_ADMINMESSAGE_INPUTEVENT._serialized_start=3192
_ADMINMESSAGE_INPUTEVENT._serialized_end=3275
_ADMINMESSAGE_OTAEVENT._serialized_start=3277
_ADMINMESSAGE_OTAEVENT._serialized_end=3360
_ADMINMESSAGE_CONFIGTYPE._serialized_start=3363
_ADMINMESSAGE_CONFIGTYPE._serialized_end=3577
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=3580
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=3990
_ADMINMESSAGE_BACKUPLOCATION._serialized_start=3992
_ADMINMESSAGE_BACKUPLOCATION._serialized_end=4027
_LOCKDOWNAUTH._serialized_start=4049
_LOCKDOWNAUTH._serialized_end=4199
_HAMPARAMETERS._serialized_start=4201
_HAMPARAMETERS._serialized_end=4311
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=4313
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=4424
_SHAREDCONTACT._serialized_start=4426
_SHAREDCONTACT._serialized_end=4550
_KEYVERIFICATIONADMIN._serialized_start=4553
_KEYVERIFICATIONADMIN._serialized_end=4846
_KEYVERIFICATIONADMIN_MESSAGETYPE._serialized_start=4723
_KEYVERIFICATIONADMIN_MESSAGETYPE._serialized_end=4826
_SENSORCONFIG._serialized_start=4849
_SENSORCONFIG._serialized_end=5266
_SCD4X_CONFIG._serialized_start=5269
_SCD4X_CONFIG._serialized_end=5623
_SEN5X_CONFIG._serialized_start=5626
_SEN5X_CONFIG._serialized_end=5800
_SEN6X_CONFIG._serialized_start=5803
_SEN6X_CONFIG._serialized_end=6219
_SCD30_CONFIG._serialized_start=6222
_SCD30_CONFIG._serialized_end=6530
_SHTXX_CONFIG._serialized_start=6532
_SHTXX_CONFIG._serialized_end=6590
_DS248X_CONFIG._serialized_start=6592
_DS248X_CONFIG._serialized_end=6675
_AS3935_CONFIG._serialized_start=6677
_AS3935_CONFIG._serialized_end=6746
# @@protoc_insertion_point(module_scope)
-360
View File
@@ -1,360 +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 AS3935_config(_message.Message):
__slots__ = ["set_tuning_cap_pf"]
SET_TUNING_CAP_PF_FIELD_NUMBER: _ClassVar[int]
set_tuning_cap_pf: int
def __init__(self, set_tuning_cap_pf: _Optional[int] = ...) -> None: ...
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
MESHBEACON_CONFIG: AdminMessage.ModuleConfigType
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 DS248X_config(_message.Message):
__slots__ = ["main_temperature_channel"]
MAIN_TEMPERATURE_CHANNEL_FIELD_NUMBER: _ClassVar[int]
main_temperature_channel: int
def __init__(self, main_temperature_channel: _Optional[int] = ...) -> None: ...
class HamParameters(_message.Message):
__slots__ = ["call_sign", "frequency", "long_name", "short_name", "tx_power"]
CALL_SIGN_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
TX_POWER_FIELD_NUMBER: _ClassVar[int]
call_sign: str
frequency: float
long_name: str
short_name: str
tx_power: int
def __init__(self, call_sign: _Optional[str] = ..., tx_power: _Optional[int] = ..., frequency: _Optional[float] = ..., short_name: _Optional[str] = ..., long_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", "disable", "lock_now", "max_session_seconds", "passphrase", "valid_until_epoch"]
BOOTS_REMAINING_FIELD_NUMBER: _ClassVar[int]
DISABLE_FIELD_NUMBER: _ClassVar[int]
LOCK_NOW_FIELD_NUMBER: _ClassVar[int]
MAX_SESSION_SECONDS_FIELD_NUMBER: _ClassVar[int]
PASSPHRASE_FIELD_NUMBER: _ClassVar[int]
VALID_UNTIL_EPOCH_FIELD_NUMBER: _ClassVar[int]
boots_remaining: int
disable: bool
lock_now: bool
max_session_seconds: int
passphrase: bytes
valid_until_epoch: int
def __init__(self, passphrase: _Optional[bytes] = ..., boots_remaining: _Optional[int] = ..., valid_until_epoch: _Optional[int] = ..., lock_now: bool = ..., max_session_seconds: _Optional[int] = ..., disable: 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", "start_fan_cleaning"]
SET_ONE_SHOT_MODE_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
START_FAN_CLEANING_FIELD_NUMBER: _ClassVar[int]
set_one_shot_mode: bool
set_temperature: float
start_fan_cleaning: bool
def __init__(self, set_temperature: _Optional[float] = ..., set_one_shot_mode: bool = ..., start_fan_cleaning: bool = ...) -> None: ...
class SEN6X_config(_message.Message):
__slots__ = ["factory_reset", "set_altitude", "set_ambient_pressure", "set_asc", "set_one_shot_mode", "set_target_co2_conc", "set_temperature", "start_fan_cleaning"]
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_ONE_SHOT_MODE_FIELD_NUMBER: _ClassVar[int]
SET_TARGET_CO2_CONC_FIELD_NUMBER: _ClassVar[int]
SET_TEMPERATURE_FIELD_NUMBER: _ClassVar[int]
START_FAN_CLEANING_FIELD_NUMBER: _ClassVar[int]
factory_reset: bool
set_altitude: int
set_ambient_pressure: int
set_asc: bool
set_one_shot_mode: bool
set_target_co2_conc: int
set_temperature: float
start_fan_cleaning: bool
def __init__(self, set_temperature: _Optional[float] = ..., set_one_shot_mode: bool = ..., start_fan_cleaning: bool = ..., set_asc: bool = ..., set_target_co2_conc: _Optional[int] = ..., set_altitude: _Optional[int] = ..., set_ambient_pressure: _Optional[int] = ..., factory_reset: 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__ = ["as3935_config", "ds248x_config", "scd30_config", "scd4x_config", "sen5x_config", "sen6x_config", "shtxx_config"]
AS3935_CONFIG_FIELD_NUMBER: _ClassVar[int]
DS248X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SCD30_CONFIG_FIELD_NUMBER: _ClassVar[int]
SCD4X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SEN5X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SEN6X_CONFIG_FIELD_NUMBER: _ClassVar[int]
SHTXX_CONFIG_FIELD_NUMBER: _ClassVar[int]
as3935_config: AS3935_config
ds248x_config: DS248X_config
scd30_config: SCD30_config
scd4x_config: SCD4X_config
sen5x_config: SEN5X_config
sen6x_config: SEN6X_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]] = ..., ds248x_config: _Optional[_Union[DS248X_config, _Mapping]] = ..., sen6x_config: _Optional[_Union[SEN6X_config, _Mapping]] = ..., as3935_config: _Optional[_Union[AS3935_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: ...
-157
View File
@@ -1,157 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/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()
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/atak.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\"\xa5\x02\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12-\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.Contact\x12)\n\x05group\x18\x03 \x01(\x0b\x32\x1a.meshtastic.protobuf.Group\x12+\n\x06status\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.Status\x12\'\n\x03pli\x18\x05 \x01(\x0b\x32\x18.meshtastic.protobuf.PLIH\x00\x12,\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x10\n\x06\x64\x65tail\x18\x07 \x01(\x0cH\x00\x42\x11\n\x0fpayload_variant\"\xfd\x02\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0bto_callsign\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x17\n\x0freceipt_for_uid\x18\x04 \x01(\t\x12>\n\x0creceipt_type\x18\x05 \x01(\x0e\x32(.meshtastic.protobuf.GeoChat.ReceiptType\x12\x11\n\x04lang\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07room_id\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10voice_profile_id\x18\x08 \x01(\tH\x04\x88\x01\x01\"T\n\x0bReceiptType\x12\x14\n\x10ReceiptType_None\x10\x00\x12\x19\n\x15ReceiptType_Delivered\x10\x01\x12\x14\n\x10ReceiptType_Read\x10\x02\x42\x05\n\x03_toB\x0e\n\x0c_to_callsignB\x07\n\x05_langB\n\n\x08_room_idB\x13\n\x11_voice_profile_id\"_\n\x05Group\x12-\n\x04role\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\'\n\x04team\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.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\"\xb0\x01\n\rAircraftTrack\x12\x0c\n\x04icao\x18\x01 \x01(\t\x12\x14\n\x0cregistration\x18\x02 \x01(\t\x12\x0e\n\x06\x66light\x18\x03 \x01(\t\x12\x15\n\raircraft_type\x18\x04 \x01(\t\x12\x0e\n\x06squawk\x18\x05 \x01(\r\x12\x10\n\x08\x63\x61tegory\x18\x06 \x01(\t\x12\x10\n\x08rssi_x10\x18\x07 \x01(\x11\x12\x0b\n\x03gps\x18\x08 \x01(\x08\x12\x13\n\x0b\x63ot_host_id\x18\t \x01(\t\"7\n\x0b\x43otGeoPoint\x12\x13\n\x0blat_delta_i\x18\x01 \x01(\x11\x12\x13\n\x0blon_delta_i\x18\x02 \x01(\x11\"\x80\x07\n\nDrawnShape\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.meshtastic.protobuf.DrawnShape.Kind\x12\x38\n\x05style\x18\x02 \x01(\x0e\x32).meshtastic.protobuf.DrawnShape.StyleMode\x12\x10\n\x08major_cm\x18\x03 \x01(\r\x12\x10\n\x08minor_cm\x18\x04 \x01(\r\x12\x11\n\tangle_deg\x18\x05 \x01(\r\x12/\n\x0cstroke_color\x18\x06 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x07 \x01(\x07\x12\x19\n\x11stroke_weight_x10\x18\x08 \x01(\r\x12-\n\nfill_color\x18\t \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x11\n\tfill_argb\x18\n \x01(\x07\x12\x11\n\tlabels_on\x18\x0b \x01(\x08\x12\x19\n\x11vertex_lat_deltas\x18\x12 \x03(\x11\x12\x19\n\x11vertex_lon_deltas\x18\x13 \x03(\x11\x12\x11\n\ttruncated\x18\r \x01(\x08\x12\x1c\n\x14\x62ullseye_distance_dm\x18\x0e \x01(\r\x12\x1c\n\x14\x62ullseye_bearing_ref\x18\x0f \x01(\r\x12\x16\n\x0e\x62ullseye_flags\x18\x10 \x01(\r\x12\x18\n\x10\x62ullseye_uid_ref\x18\x11 \x01(\t\"\xe2\x01\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\x0f\n\x0bKind_Circle\x10\x01\x12\x12\n\x0eKind_Rectangle\x10\x02\x12\x11\n\rKind_Freeform\x10\x03\x12\x15\n\x11Kind_Telestration\x10\x04\x12\x10\n\x0cKind_Polygon\x10\x05\x12\x16\n\x12Kind_RangingCircle\x10\x06\x12\x11\n\rKind_Bullseye\x10\x07\x12\x10\n\x0cKind_Ellipse\x10\x08\x12\x12\n\x0eKind_Vehicle2D\x10\t\x12\x12\n\x0eKind_Vehicle3D\x10\n\"u\n\tStyleMode\x12\x19\n\x15StyleMode_Unspecified\x10\x00\x12\x18\n\x14StyleMode_StrokeOnly\x10\x01\x12\x16\n\x12StyleMode_FillOnly\x10\x02\x12\x1b\n\x17StyleMode_StrokeAndFill\x10\x03J\x04\x08\x0c\x10\r\"\xf7\x03\n\x06Marker\x12.\n\x04kind\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.Marker.Kind\x12(\n\x05\x63olor\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x12\n\ncolor_argb\x18\x03 \x01(\x07\x12\x11\n\treadiness\x18\x04 \x01(\x08\x12\x12\n\nparent_uid\x18\x05 \x01(\t\x12\x13\n\x0bparent_type\x18\x06 \x01(\t\x12\x17\n\x0fparent_callsign\x18\x07 \x01(\t\x12\x0f\n\x07iconset\x18\x08 \x01(\t\"\x98\x02\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\r\n\tKind_Spot\x10\x01\x12\x11\n\rKind_Waypoint\x10\x02\x12\x13\n\x0fKind_Checkpoint\x10\x03\x12\x15\n\x11Kind_SelfPosition\x10\x04\x12\x13\n\x0fKind_Symbol2525\x10\x05\x12\x10\n\x0cKind_SpotMap\x10\x06\x12\x13\n\x0fKind_CustomIcon\x10\x07\x12\x12\n\x0eKind_GoToPoint\x10\x08\x12\x15\n\x11Kind_InitialPoint\x10\t\x12\x15\n\x11Kind_ContactPoint\x10\n\x12\x18\n\x14Kind_ObservationPost\x10\x0b\x12\x14\n\x10Kind_ImageMarker\x10\x0c\"\xe0\x01\n\x0fRangeAndBearing\x12\x30\n\x06\x61nchor\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x12\n\nanchor_uid\x18\x02 \x01(Line truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.atak_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_TEAM.values_by_name["Unspecifed_Color"]._options = None
_TEAM.values_by_name["Unspecifed_Color"]._serialized_options = b'\312\363\030\020:\016Default (Cyan)'
_TEAM.values_by_name["White"]._options = None
_TEAM.values_by_name["White"]._serialized_options = b'\312\363\030\007:\005White'
_TEAM.values_by_name["Yellow"]._options = None
_TEAM.values_by_name["Yellow"]._serialized_options = b'\312\363\030\010:\006Yellow'
_TEAM.values_by_name["Orange"]._options = None
_TEAM.values_by_name["Orange"]._serialized_options = b'\312\363\030\010:\006Orange'
_TEAM.values_by_name["Magenta"]._options = None
_TEAM.values_by_name["Magenta"]._serialized_options = b'\312\363\030\t:\007Magenta'
_TEAM.values_by_name["Red"]._options = None
_TEAM.values_by_name["Red"]._serialized_options = b'\312\363\030\005:\003Red'
_TEAM.values_by_name["Maroon"]._options = None
_TEAM.values_by_name["Maroon"]._serialized_options = b'\312\363\030\010:\006Maroon'
_TEAM.values_by_name["Purple"]._options = None
_TEAM.values_by_name["Purple"]._serialized_options = b'\312\363\030\010:\006Purple'
_TEAM.values_by_name["Dark_Blue"]._options = None
_TEAM.values_by_name["Dark_Blue"]._serialized_options = b'\312\363\030\013:\tDark Blue'
_TEAM.values_by_name["Blue"]._options = None
_TEAM.values_by_name["Blue"]._serialized_options = b'\312\363\030\006:\004Blue'
_TEAM.values_by_name["Cyan"]._options = None
_TEAM.values_by_name["Cyan"]._serialized_options = b'\312\363\030\006:\004Cyan'
_TEAM.values_by_name["Teal"]._options = None
_TEAM.values_by_name["Teal"]._serialized_options = b'\312\363\030\006:\004Teal'
_TEAM.values_by_name["Green"]._options = None
_TEAM.values_by_name["Green"]._serialized_options = b'\312\363\030\007:\005Green'
_TEAM.values_by_name["Dark_Green"]._options = None
_TEAM.values_by_name["Dark_Green"]._serialized_options = b'\312\363\030\014:\nDark Green'
_TEAM.values_by_name["Brown"]._options = None
_TEAM.values_by_name["Brown"]._serialized_options = b'\312\363\030\007:\005Brown'
_MEMBERROLE.values_by_name["Unspecifed"]._options = None
_MEMBERROLE.values_by_name["Unspecifed"]._serialized_options = b'\312\363\030\027:\025Default (Team Member)'
_MEMBERROLE.values_by_name["TeamMember"]._options = None
_MEMBERROLE.values_by_name["TeamMember"]._serialized_options = b'\312\363\030\r:\013Team Member'
_MEMBERROLE.values_by_name["TeamLead"]._options = None
_MEMBERROLE.values_by_name["TeamLead"]._serialized_options = b'\312\363\030\013:\tTeam Lead'
_MEMBERROLE.values_by_name["HQ"]._options = None
_MEMBERROLE.values_by_name["HQ"]._serialized_options = b'\312\363\030\004:\002HQ'
_MEMBERROLE.values_by_name["Sniper"]._options = None
_MEMBERROLE.values_by_name["Sniper"]._serialized_options = b'\312\363\030\010:\006Sniper'
_MEMBERROLE.values_by_name["Medic"]._options = None
_MEMBERROLE.values_by_name["Medic"]._serialized_options = b'\312\363\030\007:\005Medic'
_MEMBERROLE.values_by_name["ForwardObserver"]._options = None
_MEMBERROLE.values_by_name["ForwardObserver"]._serialized_options = b'\312\363\030\022:\020Forward Observer'
_MEMBERROLE.values_by_name["RTO"]._options = None
_MEMBERROLE.values_by_name["RTO"]._serialized_options = b'\312\363\030\005:\003RTO'
_MEMBERROLE.values_by_name["K9"]._options = None
_MEMBERROLE.values_by_name["K9"]._serialized_options = b'\312\363\030\004:\002K9'
_TAKTALKROOMDATA.fields_by_name['sender_callsign']._options = None
_TAKTALKROOMDATA.fields_by_name['sender_callsign']._serialized_options = b'\030\001'
_TEAM._serialized_start=7941
_TEAM._serialized_end=8347
_MEMBERROLE._serialized_start=8350
_MEMBERROLE._serialized_end=8624
_COTHOW._serialized_start=8627
_COTHOW._serialized_end=8777
_COTTYPE._serialized_start=8780
_COTTYPE._serialized_end=11727
_GEOPOINTSOURCE._serialized_start=11729
_GEOPOINTSOURCE._serialized_end=11854
_TAKPACKET._serialized_start=98
_TAKPACKET._serialized_end=391
_GEOCHAT._serialized_start=394
_GEOCHAT._serialized_end=775
_GEOCHAT_RECEIPTTYPE._serialized_start=626
_GEOCHAT_RECEIPTTYPE._serialized_end=710
_GROUP._serialized_start=777
_GROUP._serialized_end=872
_STATUS._serialized_start=874
_STATUS._serialized_end=899
_CONTACT._serialized_start=901
_CONTACT._serialized_end=953
_PLI._serialized_start=955
_PLI._serialized_end=1050
_AIRCRAFTTRACK._serialized_start=1053
_AIRCRAFTTRACK._serialized_end=1229
_COTGEOPOINT._serialized_start=1231
_COTGEOPOINT._serialized_end=1286
_DRAWNSHAPE._serialized_start=1289
_DRAWNSHAPE._serialized_end=2185
_DRAWNSHAPE_KIND._serialized_start=1834
_DRAWNSHAPE_KIND._serialized_end=2060
_DRAWNSHAPE_STYLEMODE._serialized_start=2062
_DRAWNSHAPE_STYLEMODE._serialized_end=2179
_MARKER._serialized_start=2188
_MARKER._serialized_end=2691
_MARKER_KIND._serialized_start=2411
_MARKER_KIND._serialized_end=2691
_RANGEANDBEARING._serialized_start=2694
_RANGEANDBEARING._serialized_end=2918
_ROUTE._serialized_start=2921
_ROUTE._serialized_end=3473
_ROUTE_LINK._serialized_start=3148
_ROUTE_LINK._serialized_end=3253
_ROUTE_METHOD._serialized_start=3256
_ROUTE_METHOD._serialized_end=3391
_ROUTE_DIRECTION._serialized_start=3393
_ROUTE_DIRECTION._serialized_end=3473
_CASEVACREPORT._serialized_start=3476
_CASEVACREPORT._serialized_end=4878
_CASEVACREPORT_PRECEDENCE._serialized_start=4400
_CASEVACREPORT_PRECEDENCE._serialized_end=4571
_CASEVACREPORT_HLZMARKING._serialized_start=4574
_CASEVACREPORT_HLZMARKING._serialized_end=4729
_CASEVACREPORT_SECURITY._serialized_start=4732
_CASEVACREPORT_SECURITY._serialized_end=4878
_ZMISTENTRY._serialized_start=4880
_ZMISTENTRY._serialized_end=4962
_EMERGENCYALERT._serialized_start=4965
_EMERGENCYALERT._serialized_end=5243
_EMERGENCYALERT_TYPE._serialized_start=5093
_EMERGENCYALERT_TYPE._serialized_end=5243
_TASKREQUEST._serialized_start=5246
_TASKREQUEST._serialized_end=5718
_TASKREQUEST_PRIORITY._serialized_start=5454
_TASKREQUEST_PRIORITY._serialized_end=5571
_TASKREQUEST_STATUS._serialized_start=5574
_TASKREQUEST_STATUS._serialized_end=5718
_TAKENVIRONMENT._serialized_start=5720
_TAKENVIRONMENT._serialized_end=5816
_SENSORFOV._serialized_start=5819
_SENSORFOV._serialized_end=6225
_SENSORFOV_SENSORTYPE._serialized_start=6043
_SENSORFOV_SENSORTYPE._serialized_end=6213
_TAKTALKMESSAGE._serialized_start=6227
_TAKTALKMESSAGE._serialized_end=6312
_TAKTALKROOMDATA._serialized_start=6314
_TAKTALKROOMDATA._serialized_end=6418
_MARTI._serialized_start=6420
_MARTI._serialized_end=6450
_TAKPACKETV2._serialized_start=6453
_TAKPACKETV2._serialized_end=7938
# @@protoc_insertion_point(module_scope)
-757
View File
@@ -1,757 +0,0 @@
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_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
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", "vertex_lat_deltas", "vertex_lon_deltas"]
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]
VERTEX_LAT_DELTAS_FIELD_NUMBER: _ClassVar[int]
VERTEX_LON_DELTAS_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
vertex_lat_deltas: _containers.RepeatedScalarFieldContainer[int]
vertex_lon_deltas: _containers.RepeatedScalarFieldContainer[int]
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 = ..., vertex_lat_deltas: _Optional[_Iterable[int]] = ..., vertex_lon_deltas: _Optional[_Iterable[int]] = ..., 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 Marti(_message.Message):
__slots__ = ["dest_callsign"]
DEST_CALLSIGN_FIELD_NUMBER: _ClassVar[int]
dest_callsign: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, dest_callsign: _Optional[_Iterable[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", "marti", "phone", "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]
MARTI_FIELD_NUMBER: _ClassVar[int]
PHONE_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
marti: Marti
phone: str
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]] = ..., marti: _Optional[_Union[Marti, _Mapping]] = ..., 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\"\xd3\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\x12\x10\n\x08use_aead\x18\x08 \x01(\x08\">\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=270
_MODULESETTINGS._serialized_start=272
_MODULESETTINGS._serialized_end=334
_CHANNEL._serialized_start=337
_CHANNEL._serialized_end=516
_CHANNEL_ROLE._serialized_start=468
_CHANNEL_ROLE._serialized_end=516
# @@protoc_insertion_point(module_scope)
-49
View File
@@ -1,49 +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", "use_aead"]
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]
USE_AEAD_FIELD_NUMBER: _ClassVar[int]
channel_num: int
downlink_enabled: bool
id: int
module_settings: ModuleSettings
name: str
psk: bytes
uplink_enabled: bool
use_aead: 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]] = ..., use_aead: bool = ...) -> 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\"\xa0\x04\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\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x08\x88\x01\x01\x12\x18\n\x0bis_licensed\x18\n \x01(\x08H\t\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_messagesB\x12\n\x10_is_unmessagableB\x0e\n\x0c_is_licensedBf\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=675
# @@protoc_insertion_point(module_scope)
-31
View File
@@ -1,31 +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", "is_licensed", "is_unmessagable", "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]
IS_LICENSED_FIELD_NUMBER: _ClassVar[int]
IS_UNMESSAGABLE_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
is_licensed: bool
is_unmessagable: bool
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] = ..., is_unmessagable: bool = ..., is_licensed: bool = ...) -> None: ...
-484
View File
@@ -1,484 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/config.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 device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\x1a(meshtastic/protobuf/field_metadata.proto\"\x93\x86\x01\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\x80\x1f\n\x0c\x44\x65viceConfig\x12N\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12u\n\x0b\x62utton_gpio\x18\x04 \x01(\rB`\xca\xf3\x18\\:\x0b\x42utton GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons\x12\x43\n\x0b\x62uzzer_gpio\x18\x05 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12j\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.Config.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x9a\x01\n\x18node_info_broadcast_secs\x18\x07 \x01(\rBx\xca\xf3\x18t\x19\x00\x00\x00\x00\x00 \xac@*\x01s:\x1cNode Info Broadcast IntervalBHHow often node information is sent. Defaults to 3 hours, minimum 1 hour.\x12\x84\x01\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x42`\xca\xf3\x18\\:\x14\x44ouble Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.\x12\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12i\n\x14\x64isable_triple_click\x18\n \x01(\x08\x42K\xca\xf3\x18G:\x14\x44isable Triple ClickB/Disables the user button triple-press shortcut.\x12@\n\x05tzdef\x18\x0b \x01(\tB1\xca\xf3\x18-:\tTime ZoneB POSIX timezone definition string\x12\xc5\x01\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\x42\xa4\x01\xca\xf3\x18\x9f\x01:\x15\x44isable LED HeartbeatB\x85\x01Turns off the blinking LED on the device. On most devices this is one of up to 4 LEDs; the charger and GPS LEDs are not controllable.\x12U\n\x0b\x62uzzer_mode\x18\r \x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerModeB\x0b\xca\xf3\x18\x07R\x05\x32.7.0\"\xef\x0b\n\x04Role\x12G\n\x06\x43LIENT\x10\x00\x1a;\xca\xf3\x18\x37:\x06\x43lientB-App connected or standalone messaging device.\x12\\\n\x0b\x43LIENT_MUTE\x10\x01\x1aK\xca\xf3\x18G:\x0b\x43lient MuteB8Device that does not forward packets from other devices.\x12\xae\x01\n\x06ROUTER\x10\x02\x1a\xa1\x01\xca\xf3\x18\x9c\x01:\x06RouterB\x91\x01Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.\x12(\n\rROUTER_CLIENT\x10\x03\x1a\x15\x08\x01\xca\xf3\x18\x0f:\rRouter Client\x12\xb3\x01\n\x08REPEATER\x10\x04\x1a\xa4\x01\x08\x01\xca\xf3\x18\x9d\x01:\x08RepeaterB\x90\x01\x44\x65precated infrastructure role that creates gaps in the mesh rebroadcast chain. Switch this node to a Router-based role (Router or Router Late).\x12H\n\x07TRACKER\x10\x05\x1a;\xca\xf3\x18\x37:\x07TrackerB,Broadcasts GPS position packets as priority.\x12\x43\n\x06SENSOR\x10\x06\x1a\x37\xca\xf3\x18\x33:\x06SensorB)Broadcasts telemetry packets as priority.\x12X\n\x03TAK\x10\x07\x1aO\xca\xf3\x18K:\x03TAKBDOptimized for ATAK system communication, reduces routine broadcasts.\x12k\n\rCLIENT_HIDDEN\x10\x08\x1aX\xca\xf3\x18T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.\x12\x85\x01\n\x0eLOST_AND_FOUND\x10\t\x1aq\xca\xf3\x18m:\x0eLost and FoundB[Broadcasts location as message to default channel regularly to assist with device recovery.\x12h\n\x0bTAK_TRACKER\x10\n\x1aW\xca\xf3\x18S:\x0bTAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.\x12\xbc\x01\n\x0bROUTER_LATE\x10\x0b\x1a\xaa\x01\xca\xf3\x18\xa5\x01:\x0bRouter LateB\x95\x01Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.\x12\xa7\x01\n\x0b\x43LIENT_BASE\x10\x0c\x1a\x95\x01\xca\xf3\x18\x90\x01:\x0b\x43lient BaseB\x80\x01Rooftop or attic node that rebroadcasts like Router Late for packets from or to favorited nodes, and like Client for all others.\"\xf6\x08\n\x0fRebroadcastMode\x12\x8c\x01\n\x03\x41LL\x10\x00\x1a\x82\x01\xca\xf3\x18~:\x03\x41llBwRebroadcast anLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._serialized_options = b'\312\363\0307:\006ClientB-App connected or standalone messaging device.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._serialized_options = b'\312\363\030G:\013Client MuteB8Device that does not forward packets from other devices.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._serialized_options = b'\312\363\030\234\001:\006RouterB\221\001Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._serialized_options = b'\010\001\312\363\030\017:\rRouter Client'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._serialized_options = b'\010\001\312\363\030\235\001:\010RepeaterB\220\001Deprecated infrastructure role that creates gaps in the mesh rebroadcast chain. Switch this node to a Router-based role (Router or Router Late).'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._serialized_options = b'\312\363\0307:\007TrackerB,Broadcasts GPS position packets as priority.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._serialized_options = b'\312\363\0303:\006SensorB)Broadcasts telemetry packets as priority.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._serialized_options = b'\312\363\030K:\003TAKBDOptimized for ATAK system communication, reduces routine broadcasts.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._serialized_options = b'\312\363\030T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._serialized_options = b'\312\363\030m:\016Lost and FoundB[Broadcasts location as message to default channel regularly to assist with device recovery.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._serialized_options = b'\312\363\030S:\013TAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._serialized_options = b'\312\363\030\245\001:\013Router LateB\225\001Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.'
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._options = None
_CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._serialized_options = b'\312\363\030\220\001:\013Client BaseB\200\001Rooftop or attic node that rebroadcasts like Router Late for packets from or to favorited nodes, and like Client for all others.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._serialized_options = b'\312\363\030~:\003AllBwRebroadcast any observed message, if it was on our private channel or from another channel with the same LoRa settings.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._serialized_options = b'\312\363\030~:\021All Skip DecodingBiBehaves as All. Skipping packet decoding applied only to the Repeater role, which is no longer supported.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._serialized_options = b'\312\363\030\271\001:\nLocal OnlyB\252\001Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts messages on the node\'s local primary / secondary channels.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._serialized_options = b'\312\363\030\264\001:\nKnown OnlyB\245\001Ignores observed messages from foreign meshes like Local Only, but takes it a step further by also ignoring messages from nodes not already in the node\'s known list.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._serialized_options = b'\312\363\030n:\004NoneBfInhibits all rebroadcasts, like the Client Mute role. Not allowed on the Router and Router Late roles.'
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._options = None
_CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._serialized_options = b'\312\363\030\373\001:\022Core Portnums OnlyB\344\001Ignores packets on non-core portnums such as Range Test, PAX Counter and ATAK, and does not rebroadcast them. Core portnums include Text, Position, NodeInfo, Telemetry, Routing, Admin, Waypoint, Traceroute and Store and Forward.'
_CONFIG_DEVICECONFIG.fields_by_name['role']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\r:\013Device Role'
_CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._serialized_options = b'\030\001'
_CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._serialized_options = b'\312\363\030\\:\013Button GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons'
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._serialized_options = b'\312\363\030*:\013Buzzer GPIOB\033GPIO pin for the PWM buzzer'
_CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._serialized_options = b'\312\363\030\022:\020Rebroadcast Mode'
_CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._serialized_options = b'\312\363\030t\031\000\000\000\000\000 \254@*\001s:\034Node Info Broadcast IntervalBHHow often node information is sent. Defaults to 3 hours, minimum 1 hour.'
_CONFIG_DEVICECONFIG.fields_by_name['double_tap_as_button_press']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['double_tap_as_button_press']._serialized_options = b'\312\363\030\\:\024Double Tap as ButtonBDTreat double tap on supported accelerometers as a user button press.'
_CONFIG_DEVICECONFIG.fields_by_name['is_managed']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['is_managed']._serialized_options = b'\030\001'
_CONFIG_DEVICECONFIG.fields_by_name['disable_triple_click']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['disable_triple_click']._serialized_options = b'\312\363\030G:\024Disable Triple ClickB/Disables the user button triple-press shortcut.'
_CONFIG_DEVICECONFIG.fields_by_name['tzdef']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['tzdef']._serialized_options = b'\312\363\030-:\tTime ZoneB POSIX timezone definition string'
_CONFIG_DEVICECONFIG.fields_by_name['led_heartbeat_disabled']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['led_heartbeat_disabled']._serialized_options = b'\312\363\030\237\001:\025Disable LED HeartbeatB\205\001Turns off the blinking LED on the device. On most devices this is one of up to 4 LEDs; the charger and GPS LEDs are not controllable.'
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_mode']._options = None
_CONFIG_DEVICECONFIG.fields_by_name['buzzer_mode']._serialized_options = b'\312\363\030\007R\0052.7.0'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE"]._serialized_options = b'\312\363\030Q:\010AltitudeBEInclude an altitude value in position reports, when one is available.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE_MSL"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["ALTITUDE_MSL"]._serialized_options = b'\312\363\030\034:\032Altitude is Mean Sea Level'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["GEOIDAL_SEPARATION"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["GEOIDAL_SEPARATION"]._serialized_options = b'\312\363\030\035:\033Altitude Geoidal Separation'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["DOP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["DOP"]._serialized_options = b'\312\363\030H:\003DOPBAInclude the dilution of precision value. PDOP is used by default.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HVDOP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HVDOP"]._serialized_options = b'\312\363\030Q:\013HDOP / VDOPBBIf DOP is set, send separate HDOP and VDOP values instead of PDOP.'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SATINVIEW"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SATINVIEW"]._serialized_options = b'\312\363\030\026:\024Number of satellites'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SEQ_NO"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SEQ_NO"]._serialized_options = b'\312\363\030\021:\017Sequence number'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["TIMESTAMP"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["TIMESTAMP"]._serialized_options = b'\312\363\030\013:\tTimestamp'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HEADING"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["HEADING"]._serialized_options = b'\312\363\030\021:\017Vehicle heading'
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SPEED"]._options = None
_CONFIG_POSITIONCONFIG_POSITIONFLAGS.values_by_name["SPEED"]._serialized_options = b'\312\363\030\017:\rVehicle speed'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["DISABLED"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["DISABLED"]._serialized_options = b'\312\363\030\n:\010Disabled'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["ENABLED"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["ENABLED"]._serialized_options = b'\312\363\030\t:\007Enabled'
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["NOT_PRESENT"]._options = None
_CONFIG_POSITIONCONFIG_GPSMODE.values_by_name["NOT_PRESENT"]._serialized_options = b'\312\363\030\r:\013Not Present'
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_secs']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_secs']._serialized_options = b'\312\363\030T*\001s:\022Broadcast IntervalB;The longest a node will go without broadcasting a position.'
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_smart_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_broadcast_smart_enabled']._serialized_options = b'\312\363\030\020:\016Smart Position'
_CONFIG_POSITIONCONFIG.fields_by_name['fixed_position']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['fixed_position']._serialized_options = b'\312\363\030\224\001:\016Fixed PositionB\201\001The last known latitude, longitude and altitude are broadcast over the mesh on the position interval, rather than a live GPS fix.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_update_interval']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_update_interval']._serialized_options = b'\312\363\030=*\001s:\017Update IntervalB\'How often to try to get a GPS position.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['position_flags']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['position_flags']._serialized_options = b'\312\363\030N:\016Position FlagsB<Optional fields to include when assembling position messages'
_CONFIG_POSITIONCONFIG.fields_by_name['rx_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['rx_gpio']._serialized_options = b'\312\363\030)\010\001:\020GPS Receive GPIOB\023GPIO pin for GPS RX'
_CONFIG_POSITIONCONFIG.fields_by_name['tx_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['tx_gpio']._serialized_options = b'\312\363\030*\010\001:\021GPS Transmit GPIOB\023GPIO pin for GPS TX'
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_distance']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_distance']._serialized_options = b'\312\363\030f*\001m:\020Minimum DistanceBOThe minimum change in distance before a smart position broadcast is considered.'
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_interval_secs']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['broadcast_smart_minimum_interval_secs']._serialized_options = b'\312\363\030m*\001s:\020Minimum IntervalBVThe shortest interval between position updates once the minimum distance has been met.'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_en_gpio']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_en_gpio']._serialized_options = b'\312\363\030,\010\001:\017GPS Enable GPIOB\027GPIO pin for GPS enable'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_mode']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_mode']._serialized_options = b'\312\363\030\n:\010GPS Mode'
_CONFIG_POWERCONFIG.fields_by_name['is_power_saving']._options = None
_CONFIG_POWERCONFIG.fields_by_name['is_power_saving']._serialized_options = b'\312\363\030\366\001:\014Power SavingB\345\001Will sleep everything as much as possible, for the Tracker and Sensor roles this also includes the LoRa radio. Don\'t use this setting if you want to use your device with the phone apps or are using a device without a user button.'
_CONFIG_POWERCONFIG.fields_by_name['on_battery_shutdown_after_secs']._options = None
_CONFIG_POWERCONFIG.fields_by_name['on_battery_shutdown_after_secs']._serialized_options = b'\312\363\030\237\001*\001s:\026Shutdown on Power LossB\201\001How long after external power is removed before the device powers off. Zero to disable; values under 30 seconds are raised to 30.'
_CONFIG_POWERCONFIG.fields_by_name['adc_multiplier_override']._options = None
_CONFIG_POWERCONFIG.fields_by_name['adc_multiplier_override']._serialized_options = b'\312\363\030\016:\014ADC Override'
_CONFIG_POWERCONFIG.fields_by_name['wait_bluetooth_secs']._options = None
_CONFIG_POWERCONFIG.fields_by_name['wait_bluetooth_secs']._serialized_options = b'\312\363\030 *\001s:\033Wait for Bluetooth Duration'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['ip']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['ip']._serialized_options = b'\312\363\030\004:\002IP'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['gateway']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['gateway']._serialized_options = b'\312\363\030\t:\007Gateway'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['subnet']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['subnet']._serialized_options = b'\312\363\030\010:\006Subnet'
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['dns']._options = None
_CONFIG_NETWORKCONFIG_IPV4CONFIG.fields_by_name['dns']._serialized_options = b'\312\363\030\005:\003DNS'
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["DHCP"]._options = None
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["DHCP"]._serialized_options = b'\312\363\030\006:\004DHCP'
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["STATIC"]._options = None
_CONFIG_NETWORKCONFIG_ADDRESSMODE.values_by_name["STATIC"]._serialized_options = b'\312\363\030\010:\006Static'
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["NO_BROADCAST"]._options = None
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["NO_BROADCAST"]._serialized_options = b'\312\363\030\006:\004None'
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["UDP_BROADCAST"]._options = None
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS.values_by_name["UDP_BROADCAST"]._serialized_options = b'\312\363\030\017:\rUDP Broadcast'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_enabled']._serialized_options = b'\312\363\030O:\014WiFi EnabledB?Enabling WiFi will disable the Bluetooth connection to the app.'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_ssid']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_ssid']._serialized_options = b'\312\363\030\':\004SSIDB\037WiFi network name to connect to'
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_psk']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['wifi_psk']._serialized_options = b'\312\363\030,:\010PasswordB WiFi password for authentication'
_CONFIG_NETWORKCONFIG.fields_by_name['ntp_server']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['ntp_server']._serialized_options = b'\312\363\030E:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org'
_CONFIG_NETWORKCONFIG.fields_by_name['eth_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['eth_enabled']._serialized_options = b'\312\363\030h:\020Ethernet EnabledBTOn ESP32 boards, enabling Ethernet will disable the Bluetooth connection to the app.'
_CONFIG_NETWORKCONFIG.fields_by_name['address_mode']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['address_mode']._serialized_options = b'\312\363\030\016:\014Address Mode'
_CONFIG_NETWORKCONFIG.fields_by_name['rsyslog_server']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['rsyslog_server']._serialized_options = b'\312\363\030\020:\016Rsyslog Server'
_CONFIG_NETWORKCONFIG.fields_by_name['enabled_protocols']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['enabled_protocols']._serialized_options = b'\312\363\030W:\021Enabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\0052.6.0'
_CONFIG_NETWORKCONFIG.fields_by_name['ipv6_enabled']._options = None
_CONFIG_NETWORKCONFIG.fields_by_name['ipv6_enabled']._serialized_options = b'\312\363\030\010R\0062.7.16'
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["METRIC"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["METRIC"]._serialized_options = b'\312\363\030\010:\006Metric'
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["IMPERIAL"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS.values_by_name["IMPERIAL"]._serialized_options = b'\312\363\030\n:\010Imperial'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_AUTO"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_AUTO"]._serialized_options = b'\312\363\030\026:\024Detect Automatically'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SSD1306"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SSD1306"]._serialized_options = b'\312\363\030\t:\007SSD1306'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1106"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1106"]._serialized_options = b'\312\363\030\010:\006SH1106'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107"]._serialized_options = b'\312\363\030\010:\006SH1107'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_128_128"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_128_128"]._serialized_options = b'\312\363\030\020:\016SH1107 128x128'
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_ROTATED"]._options = None
_CONFIG_DISPLAYCONFIG_OLEDTYPE.values_by_name["OLED_SH1107_ROTATED"]._serialized_options = b'\312\363\030\020:\016SH1107 Rotated'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["DEFAULT"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\036:\034Default 128x64 screen layout'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["TWOCOLOR"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["TWOCOLOR"]._serialized_options = b'\312\363\030 :\036Optimized for 2 color displays'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["INVERTED"]._serialized_options = b'\312\363\030\':%Inverted top bar for 2 color displays'
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["COLOR"]._options = None
_CONFIG_DISPLAYCONFIG_DISPLAYMODE.values_by_name["COLOR"]._serialized_options = b'\312\363\030\031:\027TFT Full Color Displays'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0"]._serialized_options = b'\312\363\030\005:\0030\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90"]._serialized_options = b'\312\363\030\006:\00490\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180"]._serialized_options = b'\312\363\030\007:\005180\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270"]._serialized_options = b'\312\363\030\007:\005270\302\260'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_0_INVERTED"]._serialized_options = b'\312\363\030\016:\0140\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_90_INVERTED"]._serialized_options = b'\312\363\030\017:\r90\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_180_INVERTED"]._serialized_options = b'\312\363\030\020:\016180\302\260 Inverted'
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270_INVERTED"]._options = None
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION.values_by_name["DEGREES_270_INVERTED"]._serialized_options = b'\312\363\030\020:\016270\302\260 Inverted'
_CONFIG_DISPLAYCONFIG.fields_by_name['screen_on_secs']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['screen_on_secs']._serialized_options = b'\312\363\030m*\001s:\rScreen on forBYHow long the screen remains on after the user button is pressed or messages are received.'
_CONFIG_DISPLAYCONFIG.fields_by_name['gps_format']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['gps_format']._serialized_options = b'\030\001\312\363\030\010Z\0062.7.10'
_CONFIG_DISPLAYCONFIG.fields_by_name['auto_screen_carousel_secs']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['auto_screen_carousel_secs']._serialized_options = b'\312\363\030g*\001s:\021Carousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.'
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_north_top']._serialized_options = b'\030\001\312\363\030m:\022Always point northBPThe compass heading on the screen outside of the circle will always point north.Z\0052.7.1'
_CONFIG_DISPLAYCONFIG.fields_by_name['flip_screen']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['flip_screen']._serialized_options = b'\312\363\030%:\013Flip ScreenB\026Flip screen vertically'
_CONFIG_DISPLAYCONFIG.fields_by_name['units']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['units']._serialized_options = b'\312\363\0302:\rDisplay UnitsB!Units shown on the device screen.'
_CONFIG_DISPLAYCONFIG.fields_by_name['oled']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['oled']._serialized_options = b'\312\363\0306:\tOLED TypeB)Override automatic OLED screen detection.'
_CONFIG_DISPLAYCONFIG.fields_by_name['displaymode']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['displaymode']._serialized_options = b'\312\363\030/:\014Display ModeB\037Override default screen layout.'
_CONFIG_DISPLAYCONFIG.fields_by_name['heading_bold']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['heading_bold']._serialized_options = b'\312\363\0304:\014Bold HeadingB$Bold the heading text on the screen.'
_CONFIG_DISPLAYCONFIG.fields_by_name['wake_on_tap_or_motion']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['wake_on_tap_or_motion']._serialized_options = b'\312\363\030W:\034Wake Screen on tap or motionB7Requires that there be an accelerometer on your device.'
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_orientation']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['compass_orientation']._serialized_options = b'\312\363\030a:\023Compass OrientationBJIndicates how to rotate or invert the compass output for accurate display.'
_CONFIG_DISPLAYCONFIG.fields_by_name['use_12h_clock']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['use_12h_clock']._serialized_options = b'\312\363\030A:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\0062.5.22'
_CONFIG_DISPLAYCONFIG.fields_by_name['use_long_node_name']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['use_long_node_name']._serialized_options = b'\312\363\030\010R\0062.7.13'
_CONFIG_DISPLAYCONFIG.fields_by_name['enable_message_bubbles']._options = None
_CONFIG_DISPLAYCONFIG.fields_by_name['enable_message_bubbles']._serialized_options = b'\312\363\030\010R\0062.7.19'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UNSET"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UNSET"]._serialized_options = b'\312\363\030\025:\023Please set a region'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["US"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["US"]._serialized_options = b'\312\363\030\017:\rUnited States'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_433"]._serialized_options = b'\312\363\030\027:\025European Union 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_868"]._serialized_options = b'\312\363\030\027:\025European Union 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["CN"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["CN"]._serialized_options = b'\312\363\030\007:\005China'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["JP"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["JP"]._serialized_options = b'\312\363\030\007:\005Japan'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ"]._serialized_options = b'\312\363\030\031:\027Australia / New Zealand'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KR"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KR"]._serialized_options = b'\312\363\030\007:\005Korea'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TW"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TW"]._serialized_options = b'\312\363\030\010:\006Taiwan'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["RU"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["RU"]._serialized_options = b'\312\363\030\010:\006Russia'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["IN"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["IN"]._serialized_options = b'\312\363\030\007:\005India'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NZ_865"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NZ_865"]._serialized_options = b'\312\363\030\024:\022New Zealand 865MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TH"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["TH"]._serialized_options = b'\312\363\030\n:\010Thailand'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["LORA_24"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["LORA_24"]._serialized_options = b'\312\363\030\t:\0072.4 GHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_433"]._serialized_options = b'\312\363\030\020:\016Ukraine 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["UA_868"]._serialized_options = b'\010\001\312\363\030\020:\016Ukraine 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_433"]._serialized_options = b'\312\363\030\021:\017Malaysia 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_919"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["MY_919"]._serialized_options = b'\312\363\030\021:\017Malaysia 919MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["SG_923"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["SG_923"]._serialized_options = b'\312\363\030\022:\020Singapore 923MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_433"]._serialized_options = b'\312\363\030\024:\022Philippines 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_868"]._serialized_options = b'\312\363\030\024:\022Philippines 868MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_915"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["PH_915"]._serialized_options = b'\312\363\030\024:\022Philippines 915MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ANZ_433"]._serialized_options = b'\312\363\030 :\036Australia / New Zealand 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_433"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_433"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 433MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_863"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["KZ_863"]._serialized_options = b'\312\363\030\023:\021Kazakhstan 863MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NP_865"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["NP_865"]._serialized_options = b'\312\363\030\016:\014Nepal 865MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["BR_902"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["BR_902"]._serialized_options = b'\312\363\030\017:\rBrazil 902MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 1 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 2 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_866"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_866"]._serialized_options = b'\312\363\030\027:\025European Union 866MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_874"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_874"]._serialized_options = b'\312\363\030\027:\025European Union 874MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_917"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_917"]._serialized_options = b'\312\363\030\027:\025European Union 917MHz'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_N_868"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["EU_N_868"]._serialized_options = b'\312\363\030 :\036European Union 868MHz (Narrow)'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_2M"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_2M"]._serialized_options = b'\312\363\030\033:\031ITU Region 3 / Amateur 2m'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU1_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 1 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 2 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_70CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU3_70CM"]._serialized_options = b'\312\363\030\035:\033ITU Region 3 / Amateur 70cm'
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_125CM"]._options = None
_CONFIG_LORACONFIG_REGIONCODE.values_by_name["ITU2_125CM"]._serialized_options = b'\312\363\030\036:\034ITU Region 2 / Amateur 1.25m'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_FAST"]._serialized_options = b'\312\363\030%:\021Long Range - FastJ\020longfast|default'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_SLOW"]._serialized_options = b'\010\001\312\363\030\023:\021Long Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options = b'\010\001\312\363\030\030:\026Very Long Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_SLOW"]._serialized_options = b'\312\363\030\025:\023Medium Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_FAST"]._serialized_options = b'\312\363\030\025:\023Medium Range - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_SLOW"]._serialized_options = b'\312\363\030\024:\022Short Range - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_FAST"]._serialized_options = b'\312\363\030\024:\022Short Range - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_MODERATE"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_MODERATE"]._serialized_options = b'\312\363\030\027:\025Long Range - Moderate'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["SHORT_TURBO"]._serialized_options = b'\312\363\030\025:\023Short Range - Turbo'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LONG_TURBO"]._serialized_options = b'\312\363\030\024:\022Long Range - Turbo'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_FAST"]._serialized_options = b'\312\363\030\r:\013Lite - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["LITE_SLOW"]._serialized_options = b'\312\363\030\r:\013Lite - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_FAST"]._serialized_options = b'\312\363\030\017:\rNarrow - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["NARROW_SLOW"]._serialized_options = b'\312\363\030\017:\rNarrow - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_FAST"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_FAST"]._serialized_options = b'\312\363\030\r:\013Tiny - Fast'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_SLOW"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["TINY_SLOW"]._serialized_options = b'\312\363\030\r:\013Tiny - Slow'
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_TURBO"]._options = None
_CONFIG_LORACONFIG_MODEMPRESET.values_by_name["MEDIUM_TURBO"]._serialized_options = b'\312\363\030\026:\024Medium Range - Turbo'
_CONFIG_LORACONFIG.fields_by_name['use_preset']._options = None
_CONFIG_LORACONFIG.fields_by_name['use_preset']._serialized_options = b'\312\363\030h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate'
_CONFIG_LORACONFIG.fields_by_name['modem_preset']._options = None
_CONFIG_LORACONFIG.fields_by_name['modem_preset']._serialized_options = b'\312\363\030\t:\007Presets'
_CONFIG_LORACONFIG.fields_by_name['bandwidth']._options = None
_CONFIG_LORACONFIG.fields_by_name['bandwidth']._serialized_options = b'\312\363\030\020*\003kHz:\tBandwidth'
_CONFIG_LORACONFIG.fields_by_name['spread_factor']._options = None
_CONFIG_LORACONFIG.fields_by_name['spread_factor']._serialized_options = b'\312\363\030Z\031\000\000\000\000\000\000\024@!\000\000\000\000\000\000(@:\rSpread FactorB7Number of chirps per symbol, as 2 raised to this value.'
_CONFIG_LORACONFIG.fields_by_name['coding_rate']._options = None
_CONFIG_LORACONFIG.fields_by_name['coding_rate']._serialized_options = b'\312\363\030\210\001:\013Coding RateByError-correction redundancy, as the denominator of 4/n. Higher values survive noisier links but make every packet longer.'
_CONFIG_LORACONFIG.fields_by_name['region']._options = None
_CONFIG_LORACONFIG.fields_by_name['region']._serialized_options = b'\312\363\0309:\006RegionB/The region where you will be using your radios.'
_CONFIG_LORACONFIG.fields_by_name['hop_limit']._options = None
_CONFIG_LORACONFIG.fields_by_name['hop_limit']._serialized_options = b'\312\363\030\204\001\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000\034@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\032hops|ttl|range|rebroadcast'
_CONFIG_LORACONFIG.fields_by_name['tx_enabled']._options = None
_CONFIG_LORACONFIG.fields_by_name['tx_enabled']._serialized_options = b'\312\363\030l:\020Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.'
_CONFIG_LORACONFIG.fields_by_name['tx_power']._options = None
_CONFIG_LORACONFIG.fields_by_name['tx_power']._serialized_options = b'\312\363\030\266\001\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000B@*\003dBm:\016Transmit PowerBxRadio transmit power. Leave at zero to use the highest level legal for the region, which is what most radios should use.J\023tx|power|dbm|output'
_CONFIG_LORACONFIG.fields_by_name['channel_num']._options = None
_CONFIG_LORACONFIG.fields_by_name['channel_num']._serialized_options = b'\312\363\030\275\001:\016Frequency SlotB\252\001Your node\'s operating frequency is calculated based on the region, modem preset, and this field. When 0, the region picks the slot, usually from the primary channel name.'
_CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._options = None
_CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._serialized_options = b'\312\363\030\025:\023Override Duty Cycle'
_CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._options = None
_CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._serialized_options = b'\312\363\030F:\017RX Boosted GainB3Enable RX boosted gain mode on SX126x-based radios.'
_CONFIG_LORACONFIG.fields_by_name['override_frequency']._options = None
_CONFIG_LORACONFIG.fields_by_name['override_frequency']._serialized_options = b'\312\363\030\031*\003MHz:\022Frequency Override'
_CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._options = None
_CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._serialized_options = b'\312\363\030\021:\017PA Fan Disabled'
_CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._options = None
_CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._serialized_options = b'\312\363\030\021:\017Ignore Incoming'
_CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._options = None
_CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._serialized_options = b'\312\363\030`:\013Ignore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.'
_CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._options = None
_CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._serialized_options = b'\312\363\030\014:\nOK to MQTT'
_CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._options = None
_CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._serialized_options = b'\312\363\030\010R\0062.7.20'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._serialized_options = b'\312\363\030\014:\nRandom PIN'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._serialized_options = b'\312\363\030\013:\tFixed PIN'
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._options = None
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._serialized_options = b'\312\363\030\025:\023No PIN (Just Works)'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\0303:\021Bluetooth EnabledB\036Enable Bluetooth on the device'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030*:\014Pairing ModeB\032Bluetooth pairing strategy'
_CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._options = None
_CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._serialized_options = b'\312\363\030X:\tFixed PinBKFixed PIN for Bluetooth pairing. Used when pairing mode is set to fixed PIN'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._serialized_options = b'\312\363\030\227\001:\034Compatible - Accept UnsignedBwAccept unsigned traffic for maximum compatibility. A signature that can be checked and is wrong still drops the packet.'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._serialized_options = b'\312\363\030\200\001:\037Balanced - Prefer AuthenticatedB]Prefer authenticated packets, but still accept unsigned traffic from nodes not known to sign.'
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._options = None
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._serialized_options = b'\312\363\030\227\001:\037Strict - Require AuthenticationBtAccept only packets with a verified signature or successful PKI decryption. Packets from older nodes may be ignored.'
_CONFIG_SECURITYCONFIG.fields_by_name['public_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['public_key']._serialized_options = b'\312\363\030\202\001:\nPublic KeyBtGenerated from your private key and sent out to other nodes on the mesh to allow them to compute a shared secret key'
_CONFIG_SECURITYCONFIG.fields_by_name['private_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['private_key']._serialized_options = b'\312\363\030?:\013Private KeyB0Used to create a shared key with a remote device'
_CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._serialized_options = b'\312\363\030V:\tAdmin KeyBIPublic keys (up to three) authorized to send admin messages to this node.'
_CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._serialized_options = b'\312\363\030\210\001:\016Managed DeviceBvSettings are changed by a mesh administrator using an admin key, not from the local app. Needs at least one admin key.'
_CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._serialized_options = b'\312\363\0305:\016Serial ConsoleB#Serial Console over the Stream API.'
_CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._serialized_options = b'\312\363\030r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.'
_CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._options = None
_CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._serialized_options = b'\312\363\030\007R\0052.8.0'
_CONFIG._serialized_start=138
_CONFIG._serialized_end=17309
_CONFIG_DEVICECONFIG._serialized_start=767
_CONFIG_DEVICECONFIG._serialized_end=4735
_CONFIG_DEVICECONFIG_ROLE._serialized_start=1964
_CONFIG_DEVICECONFIG_ROLE._serialized_end=3483
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=3486
_CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=4628
_CONFIG_DEVICECONFIG_BUZZERMODE._serialized_start=4630
_CONFIG_DEVICECONFIG_BUZZERMODE._serialized_end=4735
_CONFIG_POSITIONCONFIG._serialized_start=4738
_CONFIG_POSITIONCONFIG._serialized_end=6693
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=5984
_CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=6588
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=6590
_CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=6693
_CONFIG_POWERCONFIG._serialized_start=6696
_CONFIG_POWERCONFIG._serialized_end=7437
_CONFIG_NETWORKCONFIG._serialized_start=7440
_CONFIG_NETWORKCONFIG._serialized_end=8567
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=8297
_CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=8417
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=8419
_CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=8480
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS._serialized_start=8482
_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS._serialized_end=8567
_CONFIG_DISPLAYCONFIG._serialized_start=8570
_CONFIG_DISPLAYCONFIG._serialized_end=11054
_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT._serialized_start=10153
_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT._serialized_end=10196
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=10198
_CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=10268
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=10271
_CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=10513
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=10516
_CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=10731
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_start=10734
_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_end=11054
_CONFIG_LORACONFIG._serialized_start=11057
_CONFIG_LORACONFIG._serialized_end=15305
_CONFIG_LORACONFIG_REGIONCODE._serialized_start=13099
_CONFIG_LORACONFIG_REGIONCODE._serialized_end=14513
_CONFIG_LORACONFIG_MODEMPRESET._serialized_start=14516
_CONFIG_LORACONFIG_MODEMPRESET._serialized_end=15245
_CONFIG_LORACONFIG_FEM_LNA_MODE._serialized_start=15247
_CONFIG_LORACONFIG_FEM_LNA_MODE._serialized_end=15305
_CONFIG_BLUETOOTHCONFIG._serialized_start=15308
_CONFIG_BLUETOOTHCONFIG._serialized_end=15751
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=15633
_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=15751
_CONFIG_SECURITYCONFIG._serialized_start=15754
_CONFIG_SECURITYCONFIG._serialized_end=17270
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY._serialized_start=16676
_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY._serialized_end=17270
_CONFIG_SESSIONKEYCONFIG._serialized_start=17272
_CONFIG_SESSIONKEYCONFIG._serialized_end=17290
# @@protoc_insertion_point(module_scope)
-410
View File
@@ -1,410 +0,0 @@
from meshtastic.protobuf import device_ui_pb2 as _device_ui_pb2
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_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
ITU1_70CM: Config.LoRaConfig.RegionCode
ITU2_125CM: Config.LoRaConfig.RegionCode
ITU2_2M: Config.LoRaConfig.RegionCode
ITU2_70CM: Config.LoRaConfig.RegionCode
ITU3_2M: Config.LoRaConfig.RegionCode
ITU3_70CM: 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
MEDIUM_TURBO: 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
TINY_FAST: Config.LoRaConfig.ModemPreset
TINY_SLOW: Config.LoRaConfig.ModemPreset
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", "packet_signature_policy", "private_key", "public_key", "serial_enabled"]
class PacketSignaturePolicy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
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]
PACKET_SIGNATURE_POLICY_BALANCED: Config.SecurityConfig.PacketSignaturePolicy
PACKET_SIGNATURE_POLICY_COMPATIBLE: Config.SecurityConfig.PacketSignaturePolicy
PACKET_SIGNATURE_POLICY_FIELD_NUMBER: _ClassVar[int]
PACKET_SIGNATURE_POLICY_STRICT: Config.SecurityConfig.PacketSignaturePolicy
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
packet_signature_policy: Config.SecurityConfig.PacketSignaturePolicy
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 = ..., packet_signature_policy: _Optional[_Union[Config.SecurityConfig.PacketSignaturePolicy, str]] = ...) -> 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*\xe0\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\r\n\tHUNGARIAN\x10\x14\x12\x0f\n\x0b\x41ZERBAIJANI\x10\x15\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=1734
_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)
-148
View File
@@ -1,148 +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
AZERBAIJANI: Language
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
HUNGARIAN: Language
ITALIAN: Language
LIGHT: Theme
NORWEGIAN: Language
POLISH: Language
PORTUGUESE: Language
RED: Theme
RUSSIAN: Language
SERBIAN: Language
SIMPLIFIED_CHINESE: Language
SLOVENIAN: Language
SPANISH: Language
SWEDISH: Language
TRADITIONAL_CHINESE: Language
TURKISH: Language
UKRAINIAN: Language
class DeviceUIConfig(_message.Message):
__slots__ = ["alert_enabled", "banner_enabled", "calibration_data", "compass_mode", "gps_format", "is_clockface_analog", "language", "map_data", "node_filter", "node_highlight", "pin_code", "ring_tone_id", "screen_brightness", "screen_lock", "screen_rgb_color", "screen_timeout", "settings_lock", "theme", "version"]
class GpsCoordinateFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ALERT_ENABLED_FIELD_NUMBER: _ClassVar[int]
BANNER_ENABLED_FIELD_NUMBER: _ClassVar[int]
CALIBRATION_DATA_FIELD_NUMBER: _ClassVar[int]
COMPASS_MODE_FIELD_NUMBER: _ClassVar[int]
DEC: DeviceUIConfig.GpsCoordinateFormat
DMS: DeviceUIConfig.GpsCoordinateFormat
GPS_FORMAT_FIELD_NUMBER: _ClassVar[int]
IS_CLOCKFACE_ANALOG_FIELD_NUMBER: _ClassVar[int]
LANGUAGE_FIELD_NUMBER: _ClassVar[int]
MAP_DATA_FIELD_NUMBER: _ClassVar[int]
MGRS: DeviceUIConfig.GpsCoordinateFormat
MLS: DeviceUIConfig.GpsCoordinateFormat
NODE_FILTER_FIELD_NUMBER: _ClassVar[int]
NODE_HIGHLIGHT_FIELD_NUMBER: _ClassVar[int]
OLC: DeviceUIConfig.GpsCoordinateFormat
OSGR: DeviceUIConfig.GpsCoordinateFormat
PIN_CODE_FIELD_NUMBER: _ClassVar[int]
RING_TONE_ID_FIELD_NUMBER: _ClassVar[int]
SCREEN_BRIGHTNESS_FIELD_NUMBER: _ClassVar[int]
SCREEN_LOCK_FIELD_NUMBER: _ClassVar[int]
SCREEN_RGB_COLOR_FIELD_NUMBER: _ClassVar[int]
SCREEN_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
SETTINGS_LOCK_FIELD_NUMBER: _ClassVar[int]
THEME_FIELD_NUMBER: _ClassVar[int]
UTM: DeviceUIConfig.GpsCoordinateFormat
VERSION_FIELD_NUMBER: _ClassVar[int]
alert_enabled: bool
banner_enabled: bool
calibration_data: bytes
compass_mode: CompassMode
gps_format: DeviceUIConfig.GpsCoordinateFormat
is_clockface_analog: bool
language: Language
map_data: Map
node_filter: NodeFilter
node_highlight: NodeHighlight
pin_code: int
ring_tone_id: int
screen_brightness: int
screen_lock: bool
screen_rgb_color: int
screen_timeout: int
settings_lock: bool
theme: Theme
version: int
def __init__(self, version: _Optional[int] = ..., screen_brightness: _Optional[int] = ..., screen_timeout: _Optional[int] = ..., screen_lock: bool = ..., settings_lock: bool = ..., pin_code: _Optional[int] = ..., theme: _Optional[_Union[Theme, str]] = ..., alert_enabled: bool = ..., banner_enabled: bool = ..., ring_tone_id: _Optional[int] = ..., language: _Optional[_Union[Language, str]] = ..., node_filter: _Optional[_Union[NodeFilter, _Mapping]] = ..., node_highlight: _Optional[_Union[NodeHighlight, _Mapping]] = ..., calibration_data: _Optional[bytes] = ..., map_data: _Optional[_Union[Map, _Mapping]] = ..., compass_mode: _Optional[_Union[CompassMode, str]] = ..., screen_rgb_color: _Optional[int] = ..., is_clockface_analog: bool = ..., gps_format: _Optional[_Union[DeviceUIConfig.GpsCoordinateFormat, str]] = ...) -> None: ...
class GeoPoint(_message.Message):
__slots__ = ["latitude", "longitude", "zoom"]
LATITUDE_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_FIELD_NUMBER: _ClassVar[int]
ZOOM_FIELD_NUMBER: _ClassVar[int]
latitude: int
longitude: int
zoom: int
def __init__(self, zoom: _Optional[int] = ..., latitude: _Optional[int] = ..., longitude: _Optional[int] = ...) -> None: ...
class Map(_message.Message):
__slots__ = ["follow_gps", "home", "style"]
FOLLOW_GPS_FIELD_NUMBER: _ClassVar[int]
HOME_FIELD_NUMBER: _ClassVar[int]
STYLE_FIELD_NUMBER: _ClassVar[int]
follow_gps: bool
home: GeoPoint
style: str
def __init__(self, home: _Optional[_Union[GeoPoint, _Mapping]] = ..., style: _Optional[str] = ..., follow_gps: bool = ...) -> None: ...
class NodeFilter(_message.Message):
__slots__ = ["channel", "hops_away", "node_name", "offline_switch", "position_switch", "public_key_switch", "unknown_switch"]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
OFFLINE_SWITCH_FIELD_NUMBER: _ClassVar[int]
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_SWITCH_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_SWITCH_FIELD_NUMBER: _ClassVar[int]
channel: int
hops_away: int
node_name: str
offline_switch: bool
position_switch: bool
public_key_switch: bool
unknown_switch: bool
def __init__(self, unknown_switch: bool = ..., offline_switch: bool = ..., public_key_switch: bool = ..., hops_away: _Optional[int] = ..., position_switch: bool = ..., node_name: _Optional[str] = ..., channel: _Optional[int] = ...) -> None: ...
class NodeHighlight(_message.Message):
__slots__ = ["chat_switch", "iaq_switch", "node_name", "position_switch", "telemetry_switch"]
CHAT_SWITCH_FIELD_NUMBER: _ClassVar[int]
IAQ_SWITCH_FIELD_NUMBER: _ClassVar[int]
NODE_NAME_FIELD_NUMBER: _ClassVar[int]
POSITION_SWITCH_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_SWITCH_FIELD_NUMBER: _ClassVar[int]
chat_switch: bool
iaq_switch: bool
node_name: str
position_switch: bool
telemetry_switch: bool
def __init__(self, chat_switch: bool = ..., position_switch: bool = ..., telemetry_switch: bool = ..., iaq_switch: bool = ..., node_name: _Optional[str] = ...) -> None: ...
class CompassMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Theme(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Language(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
@@ -1,33 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/deviceonly_legacy.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 deviceonly_pb2 as meshtastic_dot_protobuf_dot_deviceonly__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_legacy.proto\x12\x13meshtastic.protobuf\x1a$meshtastic/protobuf/deviceonly.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\xf7\x02\n\x13NodeInfoLite_Legacy\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\"\x92\x01\n\x13NodeDatabase_Legacy\x12\x0f\n\x07version\x18\x01 \x01(\r\x12j\n\x05nodes\x18\x02 \x03(\x0b\x32(.meshtastic.protobuf.NodeInfoLite_LegacyB1\x92?.\x92\x01+std::vector<meshtastic_NodeInfoLite_Legacy>Bt\n\x14org.meshtastic.protoB\x10\x44\x65viceOnlyLegacyZ\"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_legacy_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020DeviceOnlyLegacyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_NODEDATABASE_LEGACY.fields_by_name['nodes']._options = None
_NODEDATABASE_LEGACY.fields_by_name['nodes']._serialized_options = b'\222?.\222\001+std::vector<meshtastic_NodeInfoLite_Legacy>'
_NODEINFOLITE_LEGACY._serialized_start=178
_NODEINFOLITE_LEGACY._serialized_end=553
_NODEDATABASE_LEGACY._serialized_start=556
_NODEDATABASE_LEGACY._serialized_end=702
# @@protoc_insertion_point(module_scope)
@@ -1,47 +0,0 @@
from meshtastic.protobuf import deviceonly_pb2 as _deviceonly_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 NodeDatabase_Legacy(_message.Message):
__slots__ = ["nodes", "version"]
NODES_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
nodes: _containers.RepeatedCompositeFieldContainer[NodeInfoLite_Legacy]
version: int
def __init__(self, version: _Optional[int] = ..., nodes: _Optional[_Iterable[_Union[NodeInfoLite_Legacy, _Mapping]]] = ...) -> None: ...
class NodeInfoLite_Legacy(_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: _deviceonly_pb2.PositionLite
snr: float
user: _deviceonly_pb2.UserLite
via_mqtt: bool
def __init__(self, num: _Optional[int] = ..., user: _Optional[_Union[_deviceonly_pb2.UserLite, _Mapping]] = ..., position: _Optional[_Union[_deviceonly_pb2.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: ...
-68
View File
@@ -1,68 +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\"\xb1\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\x12\x16\n\x0eprecision_bits\x18\x06 \x01(\r\"\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\"\xbc\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\r\x12\x11\n\tlong_name\x18\x0e \x01(\t\x12\x12\n\nshort_name\x18\x0f \x01(\t\x12\x34\n\x08hw_model\x18\x10 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12;\n\x04role\x18\x11 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x12 \x01(\x0c\x12\x0e\n\x06snr_q4\x18\x13 \x01(\x11\x42\x0c\n\n_hops_awayJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\n\x10\x0bJ\x04\x08\x0b\x10\x0cR\x04userR\x08positionR\x0e\x64\x65vice_metricsR\x08via_mqttR\x0bis_favoriteR\nis_ignored\"\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\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"i\n\x14NodeEnvironmentEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x44\n\x13\x65nvironment_metrics\x18\x02 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetrics\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xb0\x04\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>\x12j\n\tpositions\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.NodePositionEntryB/\x92?,\x92\x01)std::vector<meshtastic_NodePositionEntry>\x12l\n\ttelemetry\x18\x04 \x03(\x0b\x32\'.meshtastic.protobuf.NodeTelemetryEntryB0\x92?-\x92\x01*std::vector<meshtastic_NodeTelemetryEntry>\x12\x63\n\x06status\x18\x05 \x03(\x0b\x32$.meshtastic.protobuf.NodeStatusEntryB-\x92?*\x92\x01\'std::vector<meshtastic_NodeStatusEntry>\x12r\n\x0b\x65nvironment\x18\x06 \x03(\x0b\x32).meshtastic.protobuf.NodeEnvironmentEntryB2\x92?/\x92\x01,std::vector<meshtastic_NodeEnvironmentEntry>\"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>'
_NODEDATABASE.fields_by_name['positions']._options = None
_NODEDATABASE.fields_by_name['positions']._serialized_options = b'\222?,\222\001)std::vector<meshtastic_NodePositionEntry>'
_NODEDATABASE.fields_by_name['telemetry']._options = None
_NODEDATABASE.fields_by_name['telemetry']._serialized_options = b'\222?-\222\001*std::vector<meshtastic_NodeTelemetryEntry>'
_NODEDATABASE.fields_by_name['status']._options = None
_NODEDATABASE.fields_by_name['status']._serialized_options = b'\222?*\222\001\'std::vector<meshtastic_NodeStatusEntry>'
_NODEDATABASE.fields_by_name['environment']._options = None
_NODEDATABASE.fields_by_name['environment']._serialized_options = b'\222?/\222\001,std::vector<meshtastic_NodeEnvironmentEntry>'
_POSITIONLITE._serialized_start=271
_POSITIONLITE._serialized_end=448
_USERLITE._serialized_start=451
_USERLITE._serialized_end=727
_NODEINFOLITE._serialized_start=730
_NODEINFOLITE._serialized_end=1174
_DEVICESTATE._serialized_start=1177
_DEVICESTATE._serialized_end=1594
_NODEPOSITIONENTRY._serialized_start=1596
_NODEPOSITIONENTRY._serialized_end=1681
_NODETELEMETRYENTRY._serialized_start=1683
_NODETELEMETRYENTRY._serialized_end=1776
_NODEENVIRONMENTENTRY._serialized_start=1778
_NODEENVIRONMENTENTRY._serialized_end=1883
_NODESTATUSENTRY._serialized_start=1885
_NODESTATUSENTRY._serialized_end=1967
_NODEDATABASE._serialized_start=1970
_NODEDATABASE._serialized_end=2530
_CHANNELFILE._serialized_start=2532
_CHANNELFILE._serialized_end=2610
_BACKUPPREFERENCES._serialized_start=2613
_BACKUPPREFERENCES._serialized_end=2875
# @@protoc_insertion_point(module_scope)
-172
View File
@@ -1,172 +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__ = ["environment", "nodes", "positions", "status", "telemetry", "version"]
ENVIRONMENT_FIELD_NUMBER: _ClassVar[int]
NODES_FIELD_NUMBER: _ClassVar[int]
POSITIONS_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TELEMETRY_FIELD_NUMBER: _ClassVar[int]
VERSION_FIELD_NUMBER: _ClassVar[int]
environment: _containers.RepeatedCompositeFieldContainer[NodeEnvironmentEntry]
nodes: _containers.RepeatedCompositeFieldContainer[NodeInfoLite]
positions: _containers.RepeatedCompositeFieldContainer[NodePositionEntry]
status: _containers.RepeatedCompositeFieldContainer[NodeStatusEntry]
telemetry: _containers.RepeatedCompositeFieldContainer[NodeTelemetryEntry]
version: int
def __init__(self, version: _Optional[int] = ..., nodes: _Optional[_Iterable[_Union[NodeInfoLite, _Mapping]]] = ..., positions: _Optional[_Iterable[_Union[NodePositionEntry, _Mapping]]] = ..., telemetry: _Optional[_Iterable[_Union[NodeTelemetryEntry, _Mapping]]] = ..., status: _Optional[_Iterable[_Union[NodeStatusEntry, _Mapping]]] = ..., environment: _Optional[_Iterable[_Union[NodeEnvironmentEntry, _Mapping]]] = ...) -> None: ...
class NodeEnvironmentEntry(_message.Message):
__slots__ = ["environment_metrics", "num"]
ENVIRONMENT_METRICS_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
environment_metrics: _telemetry_pb2.EnvironmentMetrics
num: int
def __init__(self, num: _Optional[int] = ..., environment_metrics: _Optional[_Union[_telemetry_pb2.EnvironmentMetrics, _Mapping]] = ...) -> None: ...
class NodeInfoLite(_message.Message):
__slots__ = ["bitfield", "channel", "hops_away", "hw_model", "last_heard", "long_name", "next_hop", "num", "public_key", "role", "short_name", "snr", "snr_q4"]
BITFIELD_FIELD_NUMBER: _ClassVar[int]
CHANNEL_FIELD_NUMBER: _ClassVar[int]
HOPS_AWAY_FIELD_NUMBER: _ClassVar[int]
HW_MODEL_FIELD_NUMBER: _ClassVar[int]
LAST_HEARD_FIELD_NUMBER: _ClassVar[int]
LONG_NAME_FIELD_NUMBER: _ClassVar[int]
NEXT_HOP_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
ROLE_FIELD_NUMBER: _ClassVar[int]
SHORT_NAME_FIELD_NUMBER: _ClassVar[int]
SNR_FIELD_NUMBER: _ClassVar[int]
SNR_Q4_FIELD_NUMBER: _ClassVar[int]
bitfield: int
channel: int
hops_away: int
hw_model: _mesh_pb2.HardwareModel
last_heard: int
long_name: str
next_hop: int
num: int
public_key: bytes
role: _config_pb2.Config.DeviceConfig.Role
short_name: str
snr: float
snr_q4: int
def __init__(self, num: _Optional[int] = ..., snr: _Optional[float] = ..., last_heard: _Optional[int] = ..., channel: _Optional[int] = ..., hops_away: _Optional[int] = ..., next_hop: _Optional[int] = ..., bitfield: _Optional[int] = ..., long_name: _Optional[str] = ..., short_name: _Optional[str] = ..., hw_model: _Optional[_Union[_mesh_pb2.HardwareModel, str]] = ..., role: _Optional[_Union[_config_pb2.Config.DeviceConfig.Role, str]] = ..., public_key: _Optional[bytes] = ..., snr_q4: _Optional[int] = ...) -> None: ...
class NodePositionEntry(_message.Message):
__slots__ = ["num", "position"]
NUM_FIELD_NUMBER: _ClassVar[int]
POSITION_FIELD_NUMBER: _ClassVar[int]
num: int
position: PositionLite
def __init__(self, num: _Optional[int] = ..., position: _Optional[_Union[PositionLite, _Mapping]] = ...) -> None: ...
class NodeStatusEntry(_message.Message):
__slots__ = ["num", "status"]
NUM_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
num: int
status: _mesh_pb2.StatusMessage
def __init__(self, num: _Optional[int] = ..., status: _Optional[_Union[_mesh_pb2.StatusMessage, _Mapping]] = ...) -> None: ...
class NodeTelemetryEntry(_message.Message):
__slots__ = ["device_metrics", "num"]
DEVICE_METRICS_FIELD_NUMBER: _ClassVar[int]
NUM_FIELD_NUMBER: _ClassVar[int]
device_metrics: _telemetry_pb2.DeviceMetrics
num: int
def __init__(self, num: _Optional[int] = ..., device_metrics: _Optional[_Union[_telemetry_pb2.DeviceMetrics, _Mapping]] = ...) -> None: ...
class PositionLite(_message.Message):
__slots__ = ["altitude", "latitude_i", "location_source", "longitude_i", "precision_bits", "time"]
ALTITUDE_FIELD_NUMBER: _ClassVar[int]
LATITUDE_I_FIELD_NUMBER: _ClassVar[int]
LOCATION_SOURCE_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_I_FIELD_NUMBER: _ClassVar[int]
PRECISION_BITS_FIELD_NUMBER: _ClassVar[int]
TIME_FIELD_NUMBER: _ClassVar[int]
altitude: int
latitude_i: int
location_source: _mesh_pb2.Position.LocSource
longitude_i: int
precision_bits: 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]] = ..., precision_bits: _Optional[int] = ...) -> 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: ...
-29
View File
@@ -1,29 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/field_metadata.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/field_metadata.proto\x12\x13meshtastic.protobuf\x1a google/protobuf/descriptor.proto\"\xfc\x01\n\rFieldMetadata\x12\x10\n\x08\x64iy_only\x18\x01 \x01(\x08\x12\x12\n\nadmin_only\x18\x02 \x01(\x08\x12\x11\n\tmin_value\x18\x03 \x01(\x01\x12\x11\n\tmax_value\x18\x04 \x01(\x01\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x12\n\ndeprecated\x18\x06 \x01(\x08\x12\r\n\x05label\x18\x07 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x10\n\x08keywords\x18\t \x01(\t\x12\x16\n\x0esince_firmware\x18\n \x01(\t\x12\x18\n\x10\x64\x65precated_since\x18\x0b \x01(\t\x12\x15\n\roem_fixed_gps\x18\x0c \x01(\x08:[\n\x0e\x66ield_metadata\x12\x1d.google.protobuf.FieldOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadata:d\n\x13\x65num_value_metadata\x12!.google.protobuf.EnumValueOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadataBi\n\x14org.meshtastic.protoB\x13\x46ieldMetadataProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.field_metadata_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(field_metadata)
google_dot_protobuf_dot_descriptor__pb2.EnumValueOptions.RegisterExtension(enum_value_metadata)
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023FieldMetadataProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_FIELDMETADATA._serialized_start=100
_FIELDMETADATA._serialized_end=352
# @@protoc_insertion_point(module_scope)
@@ -1,38 +0,0 @@
from google.protobuf import descriptor_pb2 as _descriptor_pb2
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
ENUM_VALUE_METADATA_FIELD_NUMBER: _ClassVar[int]
FIELD_METADATA_FIELD_NUMBER: _ClassVar[int]
enum_value_metadata: _descriptor.FieldDescriptor
field_metadata: _descriptor.FieldDescriptor
class FieldMetadata(_message.Message):
__slots__ = ["admin_only", "deprecated", "deprecated_since", "description", "diy_only", "keywords", "label", "max_value", "min_value", "oem_fixed_gps", "since_firmware", "unit"]
ADMIN_ONLY_FIELD_NUMBER: _ClassVar[int]
DEPRECATED_FIELD_NUMBER: _ClassVar[int]
DEPRECATED_SINCE_FIELD_NUMBER: _ClassVar[int]
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
DIY_ONLY_FIELD_NUMBER: _ClassVar[int]
KEYWORDS_FIELD_NUMBER: _ClassVar[int]
LABEL_FIELD_NUMBER: _ClassVar[int]
MAX_VALUE_FIELD_NUMBER: _ClassVar[int]
MIN_VALUE_FIELD_NUMBER: _ClassVar[int]
OEM_FIXED_GPS_FIELD_NUMBER: _ClassVar[int]
SINCE_FIRMWARE_FIELD_NUMBER: _ClassVar[int]
UNIT_FIELD_NUMBER: _ClassVar[int]
admin_only: bool
deprecated: bool
deprecated_since: str
description: str
diy_only: bool
keywords: str
label: str
max_value: float
min_value: float
oem_fixed_gps: bool
since_firmware: str
unit: str
def __init__(self, diy_only: bool = ..., admin_only: bool = ..., min_value: _Optional[float] = ..., max_value: _Optional[float] = ..., unit: _Optional[str] = ..., deprecated: bool = ..., label: _Optional[str] = ..., description: _Optional[str] = ..., keywords: _Optional[str] = ..., since_firmware: _Optional[str] = ..., deprecated_since: _Optional[str] = ..., oem_fixed_gps: bool = ...) -> None: ...
-50
View File
@@ -1,50 +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\"\xde\x01\n\x0c\x46ileTransfer\x12\x35\n\toperation\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.FileOperation\x12\x10\n\x08\x66ilepath\x18\x02 \x01(\t\x12\x10\n\x08\x66iledata\x18\x03 \x01(\x0c\x12/\n\x06status\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x0f\n\x07message\x18\x05 \x01(\t\x12\x0e\n\x06offset\x18\x06 \x01(\x04\x12\x0e\n\x06length\x18\x07 \x01(\r\x12\x11\n\tfile_size\x18\x08 \x01(\x04\"\x9f\x01\n\x10\x44irectoryListing\x12\x11\n\tdirectory\x18\x01 \x01(\t\x12\x11\n\tfilenames\x18\x02 \x03(\t\x12/\n\x06status\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x0e\n\x06offset\x18\x05 \x01(\r\x12\x13\n\x0btotal_count\x18\x06 \x01(\r\"G\n\x0eI2CTransaction\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\r\x12\x12\n\nwrite_data\x18\x02 \x01(\x0c\x12\x10\n\x08read_len\x18\x03 \x01(\r\"\x92\x03\n\nSdCardInfo\x12\x0f\n\x07present\x18\x01 \x01(\x08\x12;\n\tcard_type\x18\x02 \x01(\x0e\x32(.meshtastic.protobuf.SdCardInfo.CardType\x12\x39\n\x08\x66\x61t_type\x18\x03 \x01(\x0e\x32\'.meshtastic.protobuf.SdCardInfo.FatType\x12\x11\n\tcard_size\x18\x04 \x01(\x04\x12\x12\n\nused_bytes\x18\x05 \x01(\x04\x12\x12\n\nfree_bytes\x18\x06 \x01(\x04\x12\x13\n\x0bstats_valid\x18\x07 \x01(\x08\x12\x0c\n\x04\x62usy\x18\x08 \x01(\x08\x12\x13\n\x0bunformatted\x18\t \x01(\x08\"K\n\x08\x43\x61rdType\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03MMC\x10\x01\x12\x06\n\x02SD\x10\x02\x12\x08\n\x04SDHC\x10\x03\x12\x08\n\x04SDXC\x10\x04\x12\x10\n\x0cUNKNOWN_CARD\x10\x05\";\n\x07\x46\x61tType\x12\x0f\n\x0bUNKNOWN_FAT\x10\x00\x12\t\n\x05\x46\x41T16\x10\x01\x12\t\n\x05\x46\x41T32\x10\x02\x12\t\n\x05\x45XFAT\x10\x03\"\xa4\x01\n\tI2CResult\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.I2CResult.Status\x12\x11\n\tread_data\x18\x02 \x01(\x0c\"M\n\x06Status\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x10\n\x0cNACK_ADDRESS\x10\x02\x12\r\n\tNACK_DATA\x10\x03\x12\t\n\x05\x45RROR\x10\x04\"\xf0\x04\n\x12InterdeviceMessage\x12\n\n\x02id\x18\x0f \x01(\r\x12\x0e\n\x04nmea\x18\x01 \x01(\tH\x00\x12\x0e\n\x04\x62\x65\x65p\x18\x02 \x01(\rH\x00\x12>\n\x0fi2c_transaction\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.I2CTransactionH\x00\x12\x34\n\ni2c_result\x18\x04 \x01(\x0b\x32\x1e.meshtastic.protobuf.I2CResultH\x00\x12\x12\n\x08i2c_scan\x18\x05 \x01(\x08H\x00\x12\x19\n\x0fi2c_scan_result\x18\x06 \x01(\x0cH\x00\x12:\n\rfile_transfer\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.FileTransferH\x00\x12\x42\n\x11\x64irectory_listing\x18\x08 \x01(\x0b\x32%.meshtastic.protobuf.DirectoryListingH\x00\x12\x15\n\x0bget_sd_info\x18\t \x01(\x08H\x00\x12\x32\n\x07sd_info\x18\n \x01(\x0b\x32\x1f.meshtastic.protobuf.SdCardInfoH\x00\x12\x37\n\x04ping\x18\x0b \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x37\n\x04pong\x18\x0c \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x0e\n\x04nack\x18\r \x01(\x08H\x00\x12\x34\n\nsd_command\x18\x0e \x01(\x0e\x32\x1e.meshtastic.protobuf.SdCommandH\x00\x42\x06\n\x04\x64\x61ta*Z\n\x12InterdeviceVersion\x12#\n\x1fINTERDEVICE_VERSION_UNSPECIFIED\x10\x00\x12\x1f\n\x1bINTERDEVICE_VERSION_CURRENT\x10\x02*7\n\rFileOperation\x12\x07\n\x03GET\x10\x00\x12\x08\n\x04POST\x10\x01\x12\x07\n\x03PUT\x10\x02\x12\n\n\x06\x44\x45LETE\x10\x03*\xa6\x01\n\nFileStatus\x12\x14\n\x10\x46ILE_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46ILE_OK\x10\x01\x12\r\n\tFILE_BUSY\x10\x02\x12\x10\n\x0c\x46ILE_NO_CARD\x10\x03\x12\x12\n\x0e\x46ILE_NOT_FOUND\x10\x04\x12\x18\n\x14\x46ILE_OFFSET_CONFLICT\x10\x05\x12\x11\n\rFILE_IO_ERROR\x10\x06\x12\x13\n\x0f\x46ILE_NOT_A_FILE\x10\x07*R\n\tSdCommand\x12\x1a\n\x16SD_COMMAND_UNSPECIFIED\x10\x00\x12\x0c\n\x08SD_MOUNT\x10\x01\x12\x0c\n\x08SD_EJECT\x10\x02\x12\r\n\tSD_FORMAT\x10\x03\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'
_INTERDEVICEVERSION._serialized_start=1721
_INTERDEVICEVERSION._serialized_end=1811
_FILEOPERATION._serialized_start=1813
_FILEOPERATION._serialized_end=1868
_FILESTATUS._serialized_start=1871
_FILESTATUS._serialized_end=2037
_SDCOMMAND._serialized_start=2039
_SDCOMMAND._serialized_end=2121
_FILETRANSFER._serialized_start=63
_FILETRANSFER._serialized_end=285
_DIRECTORYLISTING._serialized_start=288
_DIRECTORYLISTING._serialized_end=447
_I2CTRANSACTION._serialized_start=449
_I2CTRANSACTION._serialized_end=520
_SDCARDINFO._serialized_start=523
_SDCARDINFO._serialized_end=925
_SDCARDINFO_CARDTYPE._serialized_start=789
_SDCARDINFO_CARDTYPE._serialized_end=864
_SDCARDINFO_FATTYPE._serialized_start=866
_SDCARDINFO_FATTYPE._serialized_end=925
_I2CRESULT._serialized_start=928
_I2CRESULT._serialized_end=1092
_I2CRESULT_STATUS._serialized_start=1015
_I2CRESULT_STATUS._serialized_end=1092
_INTERDEVICEMESSAGE._serialized_start=1095
_INTERDEVICEMESSAGE._serialized_end=1719
# @@protoc_insertion_point(module_scope)
-168
View File
@@ -1,168 +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
DELETE: FileOperation
DESCRIPTOR: _descriptor.FileDescriptor
FILE_BUSY: FileStatus
FILE_IO_ERROR: FileStatus
FILE_NOT_A_FILE: FileStatus
FILE_NOT_FOUND: FileStatus
FILE_NO_CARD: FileStatus
FILE_OFFSET_CONFLICT: FileStatus
FILE_OK: FileStatus
FILE_UNSPECIFIED: FileStatus
GET: FileOperation
INTERDEVICE_VERSION_CURRENT: InterdeviceVersion
INTERDEVICE_VERSION_UNSPECIFIED: InterdeviceVersion
POST: FileOperation
PUT: FileOperation
SD_COMMAND_UNSPECIFIED: SdCommand
SD_EJECT: SdCommand
SD_FORMAT: SdCommand
SD_MOUNT: SdCommand
class DirectoryListing(_message.Message):
__slots__ = ["directory", "filenames", "message", "offset", "status", "total_count"]
DIRECTORY_FIELD_NUMBER: _ClassVar[int]
FILENAMES_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
directory: str
filenames: _containers.RepeatedScalarFieldContainer[str]
message: str
offset: int
status: FileStatus
total_count: int
def __init__(self, directory: _Optional[str] = ..., filenames: _Optional[_Iterable[str]] = ..., status: _Optional[_Union[FileStatus, str]] = ..., message: _Optional[str] = ..., offset: _Optional[int] = ..., total_count: _Optional[int] = ...) -> None: ...
class FileTransfer(_message.Message):
__slots__ = ["file_size", "filedata", "filepath", "length", "message", "offset", "operation", "status"]
FILEDATA_FIELD_NUMBER: _ClassVar[int]
FILEPATH_FIELD_NUMBER: _ClassVar[int]
FILE_SIZE_FIELD_NUMBER: _ClassVar[int]
LENGTH_FIELD_NUMBER: _ClassVar[int]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFSET_FIELD_NUMBER: _ClassVar[int]
OPERATION_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
file_size: int
filedata: bytes
filepath: str
length: int
message: str
offset: int
operation: FileOperation
status: FileStatus
def __init__(self, operation: _Optional[_Union[FileOperation, str]] = ..., filepath: _Optional[str] = ..., filedata: _Optional[bytes] = ..., status: _Optional[_Union[FileStatus, str]] = ..., message: _Optional[str] = ..., offset: _Optional[int] = ..., length: _Optional[int] = ..., file_size: _Optional[int] = ...) -> None: ...
class I2CResult(_message.Message):
__slots__ = ["read_data", "status"]
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ERROR: I2CResult.Status
NACK_ADDRESS: I2CResult.Status
NACK_DATA: I2CResult.Status
OK: I2CResult.Status
READ_DATA_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
UNSPECIFIED: I2CResult.Status
read_data: bytes
status: I2CResult.Status
def __init__(self, status: _Optional[_Union[I2CResult.Status, str]] = ..., read_data: _Optional[bytes] = ...) -> None: ...
class I2CTransaction(_message.Message):
__slots__ = ["address", "read_len", "write_data"]
ADDRESS_FIELD_NUMBER: _ClassVar[int]
READ_LEN_FIELD_NUMBER: _ClassVar[int]
WRITE_DATA_FIELD_NUMBER: _ClassVar[int]
address: int
read_len: int
write_data: bytes
def __init__(self, address: _Optional[int] = ..., write_data: _Optional[bytes] = ..., read_len: _Optional[int] = ...) -> None: ...
class InterdeviceMessage(_message.Message):
__slots__ = ["beep", "directory_listing", "file_transfer", "get_sd_info", "i2c_result", "i2c_scan", "i2c_scan_result", "i2c_transaction", "id", "nack", "nmea", "ping", "pong", "sd_command", "sd_info"]
BEEP_FIELD_NUMBER: _ClassVar[int]
DIRECTORY_LISTING_FIELD_NUMBER: _ClassVar[int]
FILE_TRANSFER_FIELD_NUMBER: _ClassVar[int]
GET_SD_INFO_FIELD_NUMBER: _ClassVar[int]
I2C_RESULT_FIELD_NUMBER: _ClassVar[int]
I2C_SCAN_FIELD_NUMBER: _ClassVar[int]
I2C_SCAN_RESULT_FIELD_NUMBER: _ClassVar[int]
I2C_TRANSACTION_FIELD_NUMBER: _ClassVar[int]
ID_FIELD_NUMBER: _ClassVar[int]
NACK_FIELD_NUMBER: _ClassVar[int]
NMEA_FIELD_NUMBER: _ClassVar[int]
PING_FIELD_NUMBER: _ClassVar[int]
PONG_FIELD_NUMBER: _ClassVar[int]
SD_COMMAND_FIELD_NUMBER: _ClassVar[int]
SD_INFO_FIELD_NUMBER: _ClassVar[int]
beep: int
directory_listing: DirectoryListing
file_transfer: FileTransfer
get_sd_info: bool
i2c_result: I2CResult
i2c_scan: bool
i2c_scan_result: bytes
i2c_transaction: I2CTransaction
id: int
nack: bool
nmea: str
ping: InterdeviceVersion
pong: InterdeviceVersion
sd_command: SdCommand
sd_info: SdCardInfo
def __init__(self, id: _Optional[int] = ..., nmea: _Optional[str] = ..., beep: _Optional[int] = ..., i2c_transaction: _Optional[_Union[I2CTransaction, _Mapping]] = ..., i2c_result: _Optional[_Union[I2CResult, _Mapping]] = ..., i2c_scan: bool = ..., i2c_scan_result: _Optional[bytes] = ..., file_transfer: _Optional[_Union[FileTransfer, _Mapping]] = ..., directory_listing: _Optional[_Union[DirectoryListing, _Mapping]] = ..., get_sd_info: bool = ..., sd_info: _Optional[_Union[SdCardInfo, _Mapping]] = ..., ping: _Optional[_Union[InterdeviceVersion, str]] = ..., pong: _Optional[_Union[InterdeviceVersion, str]] = ..., nack: bool = ..., sd_command: _Optional[_Union[SdCommand, str]] = ...) -> None: ...
class SdCardInfo(_message.Message):
__slots__ = ["busy", "card_size", "card_type", "fat_type", "free_bytes", "present", "stats_valid", "unformatted", "used_bytes"]
class CardType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FatType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
BUSY_FIELD_NUMBER: _ClassVar[int]
CARD_SIZE_FIELD_NUMBER: _ClassVar[int]
CARD_TYPE_FIELD_NUMBER: _ClassVar[int]
EXFAT: SdCardInfo.FatType
FAT16: SdCardInfo.FatType
FAT32: SdCardInfo.FatType
FAT_TYPE_FIELD_NUMBER: _ClassVar[int]
FREE_BYTES_FIELD_NUMBER: _ClassVar[int]
MMC: SdCardInfo.CardType
NONE: SdCardInfo.CardType
PRESENT_FIELD_NUMBER: _ClassVar[int]
SD: SdCardInfo.CardType
SDHC: SdCardInfo.CardType
SDXC: SdCardInfo.CardType
STATS_VALID_FIELD_NUMBER: _ClassVar[int]
UNFORMATTED_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_CARD: SdCardInfo.CardType
UNKNOWN_FAT: SdCardInfo.FatType
USED_BYTES_FIELD_NUMBER: _ClassVar[int]
busy: bool
card_size: int
card_type: SdCardInfo.CardType
fat_type: SdCardInfo.FatType
free_bytes: int
present: bool
stats_valid: bool
unformatted: bool
used_bytes: int
def __init__(self, present: bool = ..., card_type: _Optional[_Union[SdCardInfo.CardType, str]] = ..., fat_type: _Optional[_Union[SdCardInfo.FatType, str]] = ..., card_size: _Optional[int] = ..., used_bytes: _Optional[int] = ..., free_bytes: _Optional[int] = ..., stats_valid: bool = ..., busy: bool = ..., unformatted: bool = ...) -> None: ...
class InterdeviceVersion(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FileOperation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class FileStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class SdCommand(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\"\x98\n\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\x12G\n\x0bmesh_beacon\x18\x12 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfig\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=1949
# @@protoc_insertion_point(module_scope)
-69
View File
@@ -1,69 +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", "mesh_beacon", "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]
MESH_BEACON_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
mesh_beacon: _module_config_pb2.ModuleConfig.MeshBeaconConfig
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]] = ..., mesh_beacon: _Optional[_Union[_module_config_pb2.ModuleConfig.MeshBeaconConfig, _Mapping]] = ..., version: _Optional[int] = ...) -> None: ...
-36
View File
@@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/lorawan_bridge.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/lorawan_bridge.proto\x12\x13meshtastic.protobuf\"\xa9\x08\n\rLoRaWANBridge\x12;\n\x06uplink\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.LoRaWANBridge.UplinkH\x00\x12?\n\x08\x64ownlink\x18\x02 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.DownlinkH\x00\x12@\n\ttx_result\x18\x03 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.TxResultH\x00\x12@\n\x05\x63hunk\x18\x04 \x01(\x0b\x32/.meshtastic.protobuf.LoRaWANBridge.PayloadChunkH\x00\x1a\xaf\x01\n\x06Uplink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x10\n\x08rssi_x10\x18\x03 \x01(\x11\x12\x0f\n\x07snr_x10\x18\x04 \x01(\x11\x12\x14\n\x0cradio_params\x18\x05 \x01(\r\x12\x13\n\x0b\x66sk_bitrate\x18\t \x01(\r\x12\x0f\n\x07payload\x18\x06 \x01(\x0c\x12\x12\n\npayload_id\x18\x07 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x08 \x01(\r\x1a\xef\x01\n\x08\x44ownlink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x14\n\x0cradio_params\x18\x03 \x01(\r\x12\x11\n\tpower_dbm\x18\x04 \x01(\r\x12\x11\n\timmediate\x18\x05 \x01(\x08\x12\x17\n\x0finvert_polarity\x18\x06 \x01(\x08\x12\x0e\n\x06no_crc\x18\x07 \x01(\x08\x12\x11\n\tmay_defer\x18\x08 \x01(\x08\x12\x12\n\nrequest_id\x18\x0c \x01(\r\x12\x0f\n\x07payload\x18\t \x01(\x0c\x12\x12\n\npayload_id\x18\n \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x0b \x01(\r\x1aN\n\x0cPayloadChunk\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x02 \x01(\r\x12\x15\n\rpayload_chunk\x18\x03 \x01(\x0c\x1a\x96\x02\n\x08TxResult\x12\x0c\n\x04tmst\x18\x01 \x01(\x07\x12\x42\n\x06status\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.LoRaWANBridge.TxResult.Status\x12\x12\n\nrequest_id\x18\x03 \x01(\r\"\xa3\x01\n\x06Status\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08TOO_LATE\x10\x01\x12\r\n\tTOO_EARLY\x10\x02\x12\x14\n\x10\x43OLLISION_PACKET\x10\x03\x12\x14\n\x10\x43OLLISION_BEACON\x10\x04\x12\x0b\n\x07TX_FREQ\x10\x05\x12\x0c\n\x08TX_POWER\x10\x06\x12\x10\n\x0cGPS_UNLOCKED\x10\x07\x12\x0c\n\x08\x44\x45\x46\x45RRED\x10\x08\x12\x0b\n\x07\x44ROPPED\x10\tB\t\n\x07variantBi\n\x14org.meshtastic.protoB\x13LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.lorawan_bridge_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_LORAWANBRIDGE._serialized_start=66
_LORAWANBRIDGE._serialized_end=1131
_LORAWANBRIDGE_UPLINK._serialized_start=342
_LORAWANBRIDGE_UPLINK._serialized_end=517
_LORAWANBRIDGE_DOWNLINK._serialized_start=520
_LORAWANBRIDGE_DOWNLINK._serialized_end=759
_LORAWANBRIDGE_PAYLOADCHUNK._serialized_start=761
_LORAWANBRIDGE_PAYLOADCHUNK._serialized_end=839
_LORAWANBRIDGE_TXRESULT._serialized_start=842
_LORAWANBRIDGE_TXRESULT._serialized_end=1120
_LORAWANBRIDGE_TXRESULT_STATUS._serialized_start=957
_LORAWANBRIDGE_TXRESULT_STATUS._serialized_end=1120
# @@protoc_insertion_point(module_scope)
@@ -1,96 +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 LoRaWANBridge(_message.Message):
__slots__ = ["chunk", "downlink", "tx_result", "uplink"]
class Downlink(_message.Message):
__slots__ = ["chunk_count", "freq_hz", "immediate", "invert_polarity", "may_defer", "no_crc", "payload", "payload_id", "power_dbm", "radio_params", "request_id", "tmst"]
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
FREQ_HZ_FIELD_NUMBER: _ClassVar[int]
IMMEDIATE_FIELD_NUMBER: _ClassVar[int]
INVERT_POLARITY_FIELD_NUMBER: _ClassVar[int]
MAY_DEFER_FIELD_NUMBER: _ClassVar[int]
NO_CRC_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
POWER_DBM_FIELD_NUMBER: _ClassVar[int]
RADIO_PARAMS_FIELD_NUMBER: _ClassVar[int]
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
chunk_count: int
freq_hz: int
immediate: bool
invert_polarity: bool
may_defer: bool
no_crc: bool
payload: bytes
payload_id: int
power_dbm: int
radio_params: int
request_id: int
tmst: int
def __init__(self, freq_hz: _Optional[int] = ..., tmst: _Optional[int] = ..., radio_params: _Optional[int] = ..., power_dbm: _Optional[int] = ..., immediate: bool = ..., invert_polarity: bool = ..., no_crc: bool = ..., may_defer: bool = ..., request_id: _Optional[int] = ..., payload: _Optional[bytes] = ..., payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ...) -> None: ...
class PayloadChunk(_message.Message):
__slots__ = ["chunk_index", "payload_chunk", "payload_id"]
CHUNK_INDEX_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_CHUNK_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
chunk_index: int
payload_chunk: bytes
payload_id: int
def __init__(self, payload_id: _Optional[int] = ..., chunk_index: _Optional[int] = ..., payload_chunk: _Optional[bytes] = ...) -> None: ...
class TxResult(_message.Message):
__slots__ = ["request_id", "status", "tmst"]
class Status(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
COLLISION_BEACON: LoRaWANBridge.TxResult.Status
COLLISION_PACKET: LoRaWANBridge.TxResult.Status
DEFERRED: LoRaWANBridge.TxResult.Status
DROPPED: LoRaWANBridge.TxResult.Status
GPS_UNLOCKED: LoRaWANBridge.TxResult.Status
NONE: LoRaWANBridge.TxResult.Status
REQUEST_ID_FIELD_NUMBER: _ClassVar[int]
STATUS_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
TOO_EARLY: LoRaWANBridge.TxResult.Status
TOO_LATE: LoRaWANBridge.TxResult.Status
TX_FREQ: LoRaWANBridge.TxResult.Status
TX_POWER: LoRaWANBridge.TxResult.Status
request_id: int
status: LoRaWANBridge.TxResult.Status
tmst: int
def __init__(self, tmst: _Optional[int] = ..., status: _Optional[_Union[LoRaWANBridge.TxResult.Status, str]] = ..., request_id: _Optional[int] = ...) -> None: ...
class Uplink(_message.Message):
__slots__ = ["chunk_count", "freq_hz", "fsk_bitrate", "payload", "payload_id", "radio_params", "rssi_x10", "snr_x10", "tmst"]
CHUNK_COUNT_FIELD_NUMBER: _ClassVar[int]
FREQ_HZ_FIELD_NUMBER: _ClassVar[int]
FSK_BITRATE_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_FIELD_NUMBER: _ClassVar[int]
PAYLOAD_ID_FIELD_NUMBER: _ClassVar[int]
RADIO_PARAMS_FIELD_NUMBER: _ClassVar[int]
RSSI_X10_FIELD_NUMBER: _ClassVar[int]
SNR_X10_FIELD_NUMBER: _ClassVar[int]
TMST_FIELD_NUMBER: _ClassVar[int]
chunk_count: int
freq_hz: int
fsk_bitrate: int
payload: bytes
payload_id: int
radio_params: int
rssi_x10: int
snr_x10: int
tmst: int
def __init__(self, freq_hz: _Optional[int] = ..., tmst: _Optional[int] = ..., rssi_x10: _Optional[int] = ..., snr_x10: _Optional[int] = ..., radio_params: _Optional[int] = ..., fsk_bitrate: _Optional[int] = ..., payload: _Optional[bytes] = ..., payload_id: _Optional[int] = ..., chunk_count: _Optional[int] = ...) -> None: ...
CHUNK_FIELD_NUMBER: _ClassVar[int]
DOWNLINK_FIELD_NUMBER: _ClassVar[int]
TX_RESULT_FIELD_NUMBER: _ClassVar[int]
UPLINK_FIELD_NUMBER: _ClassVar[int]
chunk: LoRaWANBridge.PayloadChunk
downlink: LoRaWANBridge.Downlink
tx_result: LoRaWANBridge.TxResult
uplink: LoRaWANBridge.Uplink
def __init__(self, uplink: _Optional[_Union[LoRaWANBridge.Uplink, _Mapping]] = ..., downlink: _Optional[_Union[LoRaWANBridge.Downlink, _Mapping]] = ..., tx_result: _Optional[_Union[LoRaWANBridge.TxResult, _Mapping]] = ..., chunk: _Optional[_Union[LoRaWANBridge.PayloadChunk, _Mapping]] = ...) -> None: ...
-28
View File
@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/mesh_beacon.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/mesh_beacon.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\"\xbf\x02\n\nMeshBeacon\x12\x0f\n\x07message\x18\x01 \x01(\t\x12;\n\roffer_channel\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12G\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12M\n\x0coffer_preset\x18\x04 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12!\n\x14offer_frequency_slot\x18\x05 \x01(\rH\x01\x88\x01\x01\x42\x0f\n\r_offer_presetB\x17\n\x15_offer_frequency_slotBf\n\x14org.meshtastic.protoB\x10MeshBeaconProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mesh_beacon_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020MeshBeaconProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_MESHBEACON._serialized_start=132
_MESHBEACON._serialized_end=451
# @@protoc_insertion_point(module_scope)
-21
View File
@@ -1,21 +0,0 @@
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _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 MeshBeacon(_message.Message):
__slots__ = ["message", "offer_channel", "offer_frequency_slot", "offer_preset", "offer_region"]
MESSAGE_FIELD_NUMBER: _ClassVar[int]
OFFER_CHANNEL_FIELD_NUMBER: _ClassVar[int]
OFFER_FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
OFFER_PRESET_FIELD_NUMBER: _ClassVar[int]
OFFER_REGION_FIELD_NUMBER: _ClassVar[int]
message: str
offer_channel: _channel_pb2.ChannelSettings
offer_frequency_slot: int
offer_preset: _config_pb2.Config.LoRaConfig.ModemPreset
offer_region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, message: _Optional[str] = ..., offer_channel: _Optional[_Union[_channel_pb2.ChannelSettings, _Mapping]] = ..., offer_region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., offer_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., offer_frequency_slot: _Optional[int] = ...) -> None: ...
-184
View File
@@ -1,184 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/mesh.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 device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2
from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
from meshtastic.protobuf import portnums_pb2 as meshtastic_dot_protobuf_dot_portnums__pb2
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/device_ui.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x9c\x02\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xc7\x04\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\x12\x11\n\tack_proof\x18\x04 \x01(\x0c\"\xe7\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\xee\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x12\x18\n\x10xeddsa_signature\x18\n \x01(\x0c\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 \x01(\x0c\"\xd4\x03\n\x14StoreForwardPlusPlus\x12V\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32;.meshtastic.protobuf.StoreForwardPlusPlus.SFPP_message_type\x12\x14\n\x0cmessage_hash\x18\x02 \x01(\x0c\x12\x13\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x12\x11\n\troot_hash\x18\x04 \x01(\x0c\x12\x0f\n\x07message\x18\x05 \x01(\x0c\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\nLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.mesh_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_HARDWAREMODEL.values_by_name["TBEAM"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_ECHO"]._options = None
_HARDWAREMODEL.values_by_name["T_ECHO"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["LILYGO_TBEAM_S3_CORE"]._options = None
_HARDWAREMODEL.values_by_name["LILYGO_TBEAM_S3_CORE"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["WIO_WM1110"]._options = None
_HARDWAREMODEL.values_by_name["WIO_WM1110"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["CANARYONE"]._options = None
_HARDWAREMODEL.values_by_name["CANARYONE"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_ECHO_PLUS"]._options = None
_HARDWAREMODEL.values_by_name["T_ECHO_PLUS"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER"]._options = None
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TRACKER_T1000_E"]._options = None
_HARDWAREMODEL.values_by_name["TRACKER_T1000_E"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["THINKNODE_M1"]._options = None
_HARDWAREMODEL.values_by_name["THINKNODE_M1"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1"]._options = None
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1_EINK"]._options = None
_HARDWAREMODEL.values_by_name["SEEED_WIO_TRACKER_L1_EINK"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_DECK_PRO"]._options = None
_HARDWAREMODEL.values_by_name["T_DECK_PRO"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["T_LORA_PAGER"]._options = None
_HARDWAREMODEL.values_by_name["T_LORA_PAGER"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["WISMESH_TAG"]._options = None
_HARDWAREMODEL.values_by_name["WISMESH_TAG"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER_V2"]._options = None
_HARDWAREMODEL.values_by_name["HELTEC_WIRELESS_TRACKER_V2"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TBEAM_1_WATT"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM_1_WATT"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["TBEAM_BPF"]._options = None
_HARDWAREMODEL.values_by_name["TBEAM_BPF"]._serialized_options = b'\312\363\030\002`\001'
_HARDWAREMODEL.values_by_name["MESH_TRACKER_X1"]._options = None
_HARDWAREMODEL.values_by_name["MESH_TRACKER_X1"]._serialized_options = b'\312\363\030\002`\001'
_USER.fields_by_name['macaddr']._options = None
_USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
_MESHPACKET.fields_by_name['delayed']._options = None
_MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
_HARDWAREMODEL._serialized_start=10490
_HARDWAREMODEL._serialized_end=13636
_CONSTANTS._serialized_start=13638
_CONSTANTS._serialized_end=13682
_CRITICALERRORCODE._serialized_start=13685
_CRITICALERRORCODE._serialized_end=13993
_FIRMWAREEDITION._serialized_start=13996
_FIRMWAREEDITION._serialized_end=14157
_EXCLUDEDMODULES._serialized_start=14160
_EXCLUDEDMODULES._serialized_end=14647
_POSITION._serialized_start=352
_POSITION._serialized_end=1273
_POSITION_LOCSOURCE._serialized_start=968
_POSITION_LOCSOURCE._serialized_end=1046
_POSITION_ALTSOURCE._serialized_start=1048
_POSITION_ALTSOURCE._serialized_end=1146
_USER._serialized_start=1276
_USER._serialized_end=1560
_ROUTEDISCOVERY._serialized_start=1562
_ROUTEDISCOVERY._serialized_end=1652
_ROUTING._serialized_start=1655
_ROUTING._serialized_end=2238
_ROUTING_ERROR._serialized_start=1868
_ROUTING_ERROR._serialized_end=2227
_DATA._serialized_start=2241
_DATA._serialized_end=2479
_KEYVERIFICATION._serialized_start=2481
_KEYVERIFICATION._serialized_end=2543
_STOREFORWARDPLUSPLUS._serialized_start=2546
_STOREFORWARDPLUSPLUS._serialized_end=3014
_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE._serialized_start=2865
_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE._serialized_end=3014
_REMOTESHELL._serialized_start=3017
_REMOTESHELL._serialized_end=3381
_REMOTESHELL_OPCODE._serialized_start=3238
_REMOTESHELL_OPCODE._serialized_end=3381
_BOUNDINGBOX._serialized_start=3383
_BOUNDINGBOX._serialized_end=3500
_WAYPOINT._serialized_start=3503
_WAYPOINT._serialized_end=3874
_STATUSMESSAGE._serialized_start=3876
_STATUSMESSAGE._serialized_end=3907
_MQTTCLIENTPROXYMESSAGE._serialized_start=3909
_MQTTCLIENTPROXYMESSAGE._serialized_end=4017
_MESHPACKET._serialized_start=4020
_MESHPACKET._serialized_end=5414
_MESHPACKET_PRIORITY._serialized_start=4754
_MESHPACKET_PRIORITY._serialized_end=4880
_MESHPACKET_DELAYED._serialized_start=4882
_MESHPACKET_DELAYED._serialized_end=4948
_MESHPACKET_TRANSPORTMECHANISM._serialized_start=4951
_MESHPACKET_TRANSPORTMECHANISM._serialized_end=5185
_MESHPACKET_ACKPROOFSTATUS._serialized_start=5187
_MESHPACKET_ACKPROOFSTATUS._serialized_end=5291
_MESHPACKET_SLOTPARITY._serialized_start=5293
_MESHPACKET_SLOTPARITY._serialized_end=5371
_NODEINFO._serialized_start=5417
_NODEINFO._serialized_end=5847
_MYNODEINFO._serialized_start=5850
_MYNODEINFO._serialized_end=6052
_LOGRECORD._serialized_start=6055
_LOGRECORD._serialized_end=6256
_LOGRECORD_LEVEL._serialized_start=6168
_LOGRECORD_LEVEL._serialized_end=6256
_QUEUESTATUS._serialized_start=6258
_QUEUESTATUS._serialized_end=6338
_FROMRADIO._serialized_start=6341
_FROMRADIO._serialized_end=7360
_LOCKDOWNSTATUS._serialized_start=7363
_LOCKDOWNSTATUS._serialized_end=7647
_LOCKDOWNSTATUS_STATE._serialized_start=7537
_LOCKDOWNSTATUS_STATE._serialized_end=7647
_CLIENTNOTIFICATION._serialized_start=7650
_CLIENTNOTIFICATION._serialized_end=8210
_KEYVERIFICATIONNUMBERINFORM._serialized_start=8212
_KEYVERIFICATIONNUMBERINFORM._serialized_end=8306
_KEYVERIFICATIONNUMBERREQUEST._serialized_start=8308
_KEYVERIFICATIONNUMBERREQUEST._serialized_end=8378
_KEYVERIFICATIONFINAL._serialized_start=8380
_KEYVERIFICATIONFINAL._serialized_end=8493
_DUPLICATEDPUBLICKEY._serialized_start=8495
_DUPLICATEDPUBLICKEY._serialized_end=8516
_LOWENTROPYKEY._serialized_start=8518
_LOWENTROPYKEY._serialized_end=8533
_FILEINFO._serialized_start=8535
_FILEINFO._serialized_end=8584
_TORADIO._serialized_start=8587
_TORADIO._serialized_end=8899
_COMPRESSED._serialized_start=8901
_COMPRESSED._serialized_end=8974
_NEIGHBORINFO._serialized_start=8977
_NEIGHBORINFO._serialized_end=9121
_NEIGHBOR._serialized_start=9123
_NEIGHBOR._serialized_end=9223
_DEVICEMETADATA._serialized_start=9226
_DEVICEMETADATA._serialized_end=9607
_LORAPRESETGROUP._serialized_start=9610
_LORAPRESETGROUP._serialized_end=9795
_LORAREGIONPRESETS._serialized_start=9797
_LORAREGIONPRESETS._serialized_end=9904
_LORAREGIONPRESETMAP._serialized_start=9907
_LORAREGIONPRESETMAP._serialized_end=10045
_HEARTBEAT._serialized_start=10047
_HEARTBEAT._serialized_end=10073
_NODEREMOTEHARDWAREPIN._serialized_start=10075
_NODEREMOTEHARDWAREPIN._serialized_end=10169
_CHUNKEDPAYLOAD._serialized_start=10171
_CHUNKEDPAYLOAD._serialized_end=10272
_RESEND_CHUNKS._serialized_start=10274
_RESEND_CHUNKS._serialized_end=10305
_CHUNKEDPAYLOADRESPONSE._serialized_start=10308
_CHUNKEDPAYLOADRESPONSE._serialized_end=10487
# @@protoc_insertion_point(module_scope)
-978
View File
@@ -1,978 +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 field_metadata_pb2 as _field_metadata_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
AXIOMETA_GENESIS_MINI: HardwareModel
BETAFPV_2400_TX: HardwareModel
BETAFPV_900_NANO_TX: HardwareModel
BLUETOOTH_CONFIG: ExcludedModules
BROWNOUT: CriticalErrorCode
BURNING_MAN: FirmwareEdition
CANARYONE: HardwareModel
CANNEDMSG_CONFIG: ExcludedModules
CCC: FirmwareEdition
CDEBYTE_EORA_S3: HardwareModel
CHATTER_2: HardwareModel
CROWPANEL: HardwareModel
CROWPANEL_P4: HardwareModel
DATA_PAYLOAD_LEN: Constants
DEFCON: FirmwareEdition
DESCRIPTOR: _descriptor.FileDescriptor
DETECTIONSENSOR_CONFIG: ExcludedModules
DIY_EDITION: FirmwareEdition
DIY_V1: HardwareModel
DRAGON_CON: FirmwareEdition
DR_DEV: HardwareModel
EBYTE_ESP32_S3: HardwareModel
ESP32_S3_PICO: HardwareModel
EXCLUDED_NONE: ExcludedModules
EXTNOTIF_CONFIG: ExcludedModules
FAB: FirmwareEdition
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_POCKET_V2: HardwareModel
HELTEC_MESH_SOLAR: HardwareModel
HELTEC_MESH_TOWER_V2: HardwareModel
HELTEC_RC32: HardwareModel
HELTEC_RC52: HardwareModel
HELTEC_RCC6: 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
MAKERFABS_NOMAD_TERMINAL: HardwareModel
MAKERFABS_RESERVED: HardwareModel
MAKERFABS_TRACKER: HardwareModel
ME25LS01_4Y10TD: HardwareModel
MESHBEACON_CONFIG: ExcludedModules
MESHLINK: HardwareModel
MESHNOLOGY_W10: HardwareModel
MESHNOLOGY_W12: HardwareModel
MESHPAGER_X2: HardwareModel
MESHSTICK_1262: HardwareModel
MESH_TAB: HardwareModel
MESH_TRACKER_X1: 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
NODARA: HardwareModel
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_WIO_TRACKER_L1_PRO_1W: HardwareModel
SEEED_WIO_TRACKER_L2: HardwareModel
SEEED_XIAO_S3: HardwareModel
SENSECAP_INDICATOR: HardwareModel
SERIAL_CONFIG: ExcludedModules
SLEEP_ENTER_WAIT: CriticalErrorCode
SMART_CITIZEN: FirmwareEdition
STATION_G1: HardwareModel
STATION_G2: HardwareModel
STATION_G3: HardwareModel
STATUSMESSAGE_CONFIG: ExcludedModules
STOREFORWARD_CONFIG: ExcludedModules
SX1262_FAILURE: CriticalErrorCode
T5_S3_EPAPER_PRO: HardwareModel
TAK_CONFIG: ExcludedModules
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
THINKNODE_MX: 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
TRAFFICMANAGEMENT_CONFIG: ExcludedModules
TRANSMIT_FAILED: CriticalErrorCode
TWC_MESH_V4: HardwareModel
TX_WATCHDOG: CriticalErrorCode
T_CONNECT_PRO: HardwareModel
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 BoundingBox(_message.Message):
__slots__ = ["latitude_north_i", "latitude_south_i", "longitude_east_i", "longitude_west_i"]
LATITUDE_NORTH_I_FIELD_NUMBER: _ClassVar[int]
LATITUDE_SOUTH_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_EAST_I_FIELD_NUMBER: _ClassVar[int]
LONGITUDE_WEST_I_FIELD_NUMBER: _ClassVar[int]
latitude_north_i: int
latitude_south_i: int
longitude_east_i: int
longitude_west_i: int
def __init__(self, longitude_west_i: _Optional[int] = ..., latitude_south_i: _Optional[int] = ..., longitude_east_i: _Optional[int] = ..., latitude_north_i: _Optional[int] = ...) -> None: ...
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", "xeddsa_signature"]
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]
XEDDSA_SIGNATURE_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
xeddsa_signature: bytes
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] = ..., xeddsa_signature: _Optional[bytes] = ...) -> None: ...
class DeviceMetadata(_message.Message):
__slots__ = ["canShutdown", "device_state_version", "excluded_modules", "firmware_version", "hasBluetooth", "hasEthernet", "hasPKC", "hasRemoteHardware", "hasWifi", "has_xeddsa", "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]
HAS_XEDDSA_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
has_xeddsa: 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] = ..., has_xeddsa: bool = ...) -> 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", "region_presets", "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]
REGION_PRESETS_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
region_presets: LoRaRegionPresetMap
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]] = ..., region_presets: _Optional[_Union[LoRaRegionPresetMap, _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 LoRaPresetGroup(_message.Message):
__slots__ = ["default_preset", "licensed_only", "presets"]
DEFAULT_PRESET_FIELD_NUMBER: _ClassVar[int]
LICENSED_ONLY_FIELD_NUMBER: _ClassVar[int]
PRESETS_FIELD_NUMBER: _ClassVar[int]
default_preset: _config_pb2.Config.LoRaConfig.ModemPreset
licensed_only: bool
presets: _containers.RepeatedScalarFieldContainer[_config_pb2.Config.LoRaConfig.ModemPreset]
def __init__(self, presets: _Optional[_Iterable[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]]] = ..., default_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., licensed_only: bool = ...) -> None: ...
class LoRaRegionPresetMap(_message.Message):
__slots__ = ["groups", "region_groups"]
GROUPS_FIELD_NUMBER: _ClassVar[int]
REGION_GROUPS_FIELD_NUMBER: _ClassVar[int]
groups: _containers.RepeatedCompositeFieldContainer[LoRaPresetGroup]
region_groups: _containers.RepeatedCompositeFieldContainer[LoRaRegionPresets]
def __init__(self, groups: _Optional[_Iterable[_Union[LoRaPresetGroup, _Mapping]]] = ..., region_groups: _Optional[_Iterable[_Union[LoRaRegionPresets, _Mapping]]] = ...) -> None: ...
class LoRaRegionPresets(_message.Message):
__slots__ = ["group_index", "region"]
GROUP_INDEX_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
group_index: int
region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., group_index: _Optional[int] = ...) -> 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]
DISABLED: LockdownStatus.State
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__ = ["ack_proof_status", "channel", "decoded", "delayed", "encrypted", "hop_limit", "hop_start", "id", "next_hop", "pki_encrypted", "priority", "public_key", "relay_node", "rx_rssi", "rx_snr", "rx_time", "slot_parity", "to", "transport_mechanism", "tx_after", "via_mqtt", "want_ack", "xeddsa_signed"]
class AckProofStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Delayed(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class SlotParity(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class TransportMechanism(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ACK: MeshPacket.Priority
ACK_PROOF_ABSENT: MeshPacket.AckProofStatus
ACK_PROOF_INVALID: MeshPacket.AckProofStatus
ACK_PROOF_NO_KEY: MeshPacket.AckProofStatus
ACK_PROOF_STATUS_FIELD_NUMBER: _ClassVar[int]
ACK_PROOF_VALID: MeshPacket.AckProofStatus
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]
SLOT_PARITY_EVEN: MeshPacket.SlotParity
SLOT_PARITY_FIELD_NUMBER: _ClassVar[int]
SLOT_PARITY_ODD: MeshPacket.SlotParity
SLOT_PARITY_UNSET: MeshPacket.SlotParity
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
TRANSPORT_UNICAST_UDP: MeshPacket.TransportMechanism
TX_AFTER_FIELD_NUMBER: _ClassVar[int]
UNSET: MeshPacket.Priority
VIA_MQTT_FIELD_NUMBER: _ClassVar[int]
WANT_ACK_FIELD_NUMBER: _ClassVar[int]
XEDDSA_SIGNED_FIELD_NUMBER: _ClassVar[int]
ack_proof_status: MeshPacket.AckProofStatus
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
slot_parity: MeshPacket.SlotParity
to: int
transport_mechanism: MeshPacket.TransportMechanism
tx_after: int
via_mqtt: bool
want_ack: bool
xeddsa_signed: 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]] = ..., xeddsa_signed: bool = ..., ack_proof_status: _Optional[_Union[MeshPacket.AckProofStatus, str]] = ..., slot_parity: _Optional[_Union[MeshPacket.SlotParity, 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", "has_xeddsa_signed", "heard_on_current_lora", "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]
HAS_XEDDSA_SIGNED_FIELD_NUMBER: _ClassVar[int]
HEARD_ON_CURRENT_LORA_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
has_xeddsa_signed: bool
heard_on_current_lora: bool
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 = ..., has_xeddsa_signed: bool = ..., heard_on_current_lora: 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__ = ["ack_proof", "error_reason", "route_reply", "route_request"]
class Error(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
ACK_PROOF_FIELD_NUMBER: _ClassVar[int]
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
ack_proof: bytes
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]] = ..., ack_proof: _Optional[bytes] = ...) -> 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__ = ["bounding_box", "description", "expire", "geofence_radius", "icon", "id", "latitude_i", "locked_to", "longitude_i", "name", "notify_favorites_only", "notify_on_enter", "notify_on_exit"]
BOUNDING_BOX_FIELD_NUMBER: _ClassVar[int]
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
EXPIRE_FIELD_NUMBER: _ClassVar[int]
GEOFENCE_RADIUS_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]
NOTIFY_FAVORITES_ONLY_FIELD_NUMBER: _ClassVar[int]
NOTIFY_ON_ENTER_FIELD_NUMBER: _ClassVar[int]
NOTIFY_ON_EXIT_FIELD_NUMBER: _ClassVar[int]
bounding_box: BoundingBox
description: str
expire: int
geofence_radius: int
icon: int
id: int
latitude_i: int
locked_to: int
longitude_i: int
name: str
notify_favorites_only: bool
notify_on_enter: bool
notify_on_exit: bool
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] = ..., geofence_radius: _Optional[int] = ..., bounding_box: _Optional[_Union[BoundingBox, _Mapping]] = ..., notify_on_enter: bool = ..., notify_on_exit: bool = ..., notify_favorites_only: bool = ...) -> 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__ = []
-392
View File
@@ -1,392 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/module_config.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 atak_pb2 as meshtastic_dot_protobuf_dot_atak__pb2
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 field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a(meshtastic/protobuf/field_metadata.proto\"\xfd~\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x12\\\n\rstatusmessage\x18\x0e \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12\x64\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12G\n\x03tak\x18\x10 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12V\n\x0bmesh_beacon\x18\x11 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x1a\xd9\x07\n\nMQTTConfig\x12\x38\n\x07\x65nabled\x18\x01 \x01(\x08\x42\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12\x33\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\"\xca\xf3\x18\x1e:\x07\x41\x64\x64ressB\x13MQTT server address\x12/\n\x08username\x18\x03 \x01(\tB\x1d\xca\xf3\x18\x19:\x08UsernameB\rMQTT username\x12/\n\x08password\x18\x04 \x01(\tB\x1d\xca\xf3\x18\x19:\x08PasswordB\rMQTT password\x12T\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x42\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12#\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.8.0\x12L\n\x0btls_enabled\x18\x07 \x01(\x08\x42\x37\xca\xf3\x18\x33:\x0bTLS EnabledB$Connect to the MQTT server over TLS.\x12/\n\x04root\x18\x08 \x01(\tB!\xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12{\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x42Z\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xb0\x02\n\x15map_reporting_enabled\x18\n \x01(\x08\x42\x90\x02\xca\xf3\x18\x8b\x02:\rMap ReportingB\xf9\x01Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.ModuleConfig.MapReportSettings\x1a\xea\x02\n\x11MapReportSettings\x12{\n\x15publish_interval_secs\x18\x01 \x01(\rB\\\xca\xf3\x18X\x19\x00\x00\x00\x00\x00 \xac@*\x01s:\x14Map Publish IntervalB4How often a map report is published. Minimum 1 hour.\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\xbb\x01\n\x16should_report_location\x18\x03 \x01(\x08\x42\x9a\x01\xca\xf3\x18\x95\x01:\x0cShare on MapB~Consent to publish this node\'s details and approximate location unencrypted to the MQTT map. No map report is sent without it.R\x05\x32.6.8\x1a\x8b\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12>\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\x1a\x84\x04\n\x12NeighborInfoConfig\x12\xb2\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xa0\x01\xca\xf3\x18\x9b\x01:\x15Neighbor Info EnabledB\x81\x01\x45nable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.\x12r\n\x0fupdate_interval\x18\x02 \x01(\rBY\xca\xf3\x18U\x19\x00\x00\x00\x00\x00 \xcc@*\x01s:\x0fUpdate IntervalB6How often to broadcast neighbor info. Minimum 4 hours.\x12\xc4\x01\n\x12transmit_over_lora\x18\x03 \x01(\x08\x42\xa7\x01\xca\xf3\x18\xa2\x01:\x12Transmit over LoRaB\x8b\x01Whether to traLine truncated
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.module_config_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030#:\014MQTT EnabledB\023Enable MQTT gateway'
_MODULECONFIG_MQTTCONFIG.fields_by_name['address']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['address']._serialized_options = b'\312\363\030\036:\007AddressB\023MQTT server address'
_MODULECONFIG_MQTTCONFIG.fields_by_name['username']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['username']._serialized_options = b'\312\363\030\031:\010UsernameB\rMQTT username'
_MODULECONFIG_MQTTCONFIG.fields_by_name['password']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['password']._serialized_options = b'\312\363\030\031:\010PasswordB\rMQTT password'
_MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._serialized_options = b'\312\363\0304:\022Encryption EnabledB\036Send encrypted packets to MQTT'
_MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.8.0'
_MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._serialized_options = b'\312\363\0303:\013TLS EnabledB$Connect to the MQTT server over TLS.'
_MODULECONFIG_MQTTCONFIG.fields_by_name['root']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['root']._serialized_options = b'\312\363\030\035:\nRoot TopicB\017MQTT root topic'
_MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._serialized_options = b'\312\363\030V:\021MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.'
_MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._options = None
_MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._serialized_options = b'\312\363\030\213\002:\rMap ReportingB\371\001Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.'
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._options = None
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._serialized_options = b'\312\363\030X\031\000\000\000\000\000 \254@*\001s:\024Map Publish IntervalB4How often a map report is published. Minimum 1 hour.'
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._options = None
_MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._serialized_options = b'\312\363\030\225\001:\014Share on MapB~Consent to publish this node\'s details and approximate location unencrypted to the MQTT map. No map report is sent without it.R\0052.6.8'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\233\001:\025Neighbor Info EnabledB\201\001Enable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._serialized_options = b'\312\363\030U\031\000\000\000\000\000 \314@*\001s:\017Update IntervalB6How often to broadcast neighbor info. Minimum 4 hours.'
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._options = None
_MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._serialized_options = b'\312\363\030\242\001:\022Transmit over LoRaB\213\001Whether to transmit neighbor info over LoRa in addition to MQTT and the connected app. Not available on channels with default key and name.'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._serialized_options = b'\312\363\030\005:\003Low'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._serialized_options = b'\312\363\030\006:\004High'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._serialized_options = b'\312\363\030\016:\014Falling Edge'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._serialized_options = b'\312\363\030\r:\013Rising Edge'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._serialized_options = b'\312\363\030\021:\017Either Edge Low'
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._serialized_options = b'\312\363\030\022:\020Either Edge High'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\354\001:\030Detection Sensor EnabledB\317\001Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._serialized_options = b'\312\363\030Z*\001s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._serialized_options = b'\312\363\030\231\001*\001s:\030State Broadcast IntervalBzHow often to send the detection sensor state to the mesh, whether or not anything was detected. 0 sends only on detection.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030e:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._serialized_options = b'\312\363\030%:\004NameB\035Sensor name for mesh messages'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._serialized_options = b'\312\363\030Q:\023GPIO Pin to monitorB:GPIO pin watched for state changes. 0 disables the module.'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._serialized_options = b'\312\363\030%:\014Trigger TypeB\025Type of trigger event'
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._options = None
_MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._serialized_options = b'\312\363\030P:\024Use Internal Pull-upB8Enable the internal pull-up resistor on the monitor pin.'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._serialized_options = b'\312\363\030\n:\0103200 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._serialized_options = b'\312\363\030\n:\0102400 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._serialized_options = b'\312\363\030\n:\0101600 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._serialized_options = b'\312\363\030\n:\0101400 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._serialized_options = b'\312\363\030\n:\0101300 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._serialized_options = b'\312\363\030\n:\0101200 bps'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._serialized_options = b'\010\001'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._serialized_options = b'\010\001'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._serialized_options = b'\312\363\030\020:\016700 bps (700C)'
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._options = None
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._serialized_options = b'\312\363\030\t:\007450 bps'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._serialized_options = b'\312\363\030^:\016Codec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._serialized_options = b'\312\363\0308:\007PTT PinB-Push-to-talk GPIO pin number. 0 uses GPIO 39.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._serialized_options = b'\312\363\030\202\001:\007BitrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._serialized_options = b'\312\363\030\025:\023I2S Word Select Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._serialized_options = b'\312\363\030\021:\017I2S Data In Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._serialized_options = b'\312\363\030\022:\020I2S Data Out Pin'
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._options = None
_MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._serialized_options = b'\312\363\030\017:\rI2S Clock Pin'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\250\001:\023PAX Counter EnabledB\220\001When enabled, the PAX Counter module counts nearby WiFi and Bluetooth devices. Both WiFi and Bluetooth must be disabled for PAX counter to work.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._serialized_options = b'\312\363\030F*\001s:\017Update IntervalB0How often to send the device counts to the mesh.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._serialized_options = b'\312\363\030@*\003dBm:\016WiFi ThresholdB)RSSI threshold for counting WiFi devices.'
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._options = None
_MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._serialized_options = b'\312\363\030>*\003dBm:\rBLE ThresholdB(RSSI threshold for counting BLE devices.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._serialized_options = b'\312\363\030c*\001s:\031Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._serialized_options = b'\312\363\030\261\001!\000\000\000\000\000\000\010@:\030Direct NodeInfo Max HopsB\213\001Answer NodeInfo requests from cache for requestors within this many hops. Capped at 3 on routers; other roles answer direct neighbors only.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._serialized_options = b'\312\363\030A*\001s:\021Rate Limit WindowB)The time window packets are counted over.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._serialized_options = b'\312\363\030Q!\000\000\000\000\000\000N@:\026Rate Limit Max PacketsB.The most packets one node may send per window.'
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._options = None
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._serialized_options = b'\312\363\030o!\000\000\000\000\000\000N@:\030Unknown Packet ThresholdBJUndecryptable packets one node may send in 5 minutes before it is dropped.'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._serialized_options = b'\312\363\030\n:\010110 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._serialized_options = b'\312\363\030\n:\010300 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._serialized_options = b'\312\363\030\n:\010600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._serialized_options = b'\312\363\030\013:\t1200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._serialized_options = b'\312\363\030\013:\t2400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._serialized_options = b'\312\363\030\013:\t4800 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._serialized_options = b'\312\363\030\013:\t9600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._serialized_options = b'\312\363\030\014:\n19200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._serialized_options = b'\312\363\030\014:\n38400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._serialized_options = b'\312\363\030\014:\n57600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._serialized_options = b'\312\363\030\r:\013115200 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._serialized_options = b'\312\363\030\r:\013230400 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._serialized_options = b'\312\363\030\r:\013460800 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._serialized_options = b'\312\363\030\r:\013576000 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._serialized_options = b'\312\363\030\r:\013921600 Baud'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._serialized_options = b'\312\363\030\010:\006Simple'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._serialized_options = b'\312\363\030\013:\tProtobufs'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._serialized_options = b'\312\363\030\016:\014Text Message'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._serialized_options = b'\312\363\030\020:\016NMEA Positions'
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._options = None
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._serialized_options = b'\312\363\030\t:\007CalTopo'
_MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030&:\016Serial EnabledB\024Enable serial module'
_MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._serialized_options = b'\312\363\030N:\004EchoBFIf set, any packets you send will be echoed back over the serial port.'
_MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._serialized_options = b'\312\363\030,:\033Receive data (rxd) GPIO pinB\rRX pin number'
_MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._serialized_options = b'\312\363\030-:\034Transmit data (txd) GPIO pinB\rTX pin number'
_MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._serialized_options = b'\312\363\030\030:\004BaudB\020Serial baud rate'
_MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._serialized_options = b'\312\363\030i*\002ms:\007TimeoutBZHow long to wait before treating received serial data as a complete packet. 0 uses 250 ms.'
_MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._options = None
_MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030$:\004ModeB\034Serial module operation mode'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030>:\035External Notification EnabledB\035Enable external notifications'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._serialized_options = b'\312\363\030I*\002ms:\024GPIO Output DurationB-In GPIO mode, how long to keep the output on.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._serialized_options = b'\312\363\030_:\017Output pin GPIOBLGPIO pin driven on notification. Defaults to the board\'s EXT_NOTIFY_OUT pin.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._serialized_options = b'\312\363\0303:\025Output pin vibra GPIOB\032Vibration motor output pin'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._serialized_options = b'\312\363\030+:\026Output pin buzzer GPIOB\021Buzzer output pin'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._serialized_options = b'\312\363\030]:\006ActiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._serialized_options = b'\312\363\030;:\036Alert when receiving a messageB\031Alert on incoming message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._serialized_options = b'\312\363\030D:\021Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._serialized_options = b'\312\363\030F:*Alert GPIO buzzer when receiving a messageB\030Buzz on incoming message'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._serialized_options = b'\312\363\0306:\033Alert when receiving a bellB\027Alert on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._serialized_options = b'\312\363\030I:,Alert GPIO vibra motor when receiving a bellB\031Vibrate on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._serialized_options = b'\312\363\030A:\'Alert GPIO buzzer when receiving a bellB\026Buzz on bell character'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._serialized_options = b'\312\363\030\327\001:\016Use PWM BuzzerB\304\001Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._serialized_options = b'\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.'
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._options = None
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._serialized_options = b'\312\363\030\247\001:\021Use I2S As BuzzerB\221\001Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030B:\031Store and Forward EnabledB%Enables the store and forward module.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._serialized_options = b'\312\363\030F:\016Send HeartbeatB4Send a heartbeat to advertise the server\'s presence.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._serialized_options = b'\312\363\030^:\021Number of recordsBIMaximum number of messages to store. 0 uses three quarters of free PSRAM.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._serialized_options = b'\312\363\030X:\022History Return MaxBBMaximum number of stored messages returned per request. 0 uses 25.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._serialized_options = b'\312\363\030\\:\025History Return WindowBCHow far back, in minutes, stored messages are returned. 0 uses 240.'
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._options = None
_MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._serialized_options = b'\312\363\030`:\006ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030.:\022Range Test EnabledB\030Enable range test module'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._serialized_options = b'\312\363\030q*\001s:\017Sender IntervalB[This device will send out range test messages on the selected interval. 0 disables sending.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._serialized_options = b'\312\363\030u:\004SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.'
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._options = None
_MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._serialized_options = b'\312\363\030\010R\0062.7.11'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._serialized_options = b'\312\363\030N*\001s:\027Device Metrics IntervalB0How often device metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._serialized_options = b'\312\363\030X*\001s:\034Environment Metrics IntervalB5How often environment metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._serialized_options = b'\312\363\030?:\033Environment Metrics EnabledB Collect environment measurements'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._serialized_options = b'\312\363\030C:\025Show on device screenB*Display environment measurements on device'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._serialized_options = b'\312\363\0307:\022Display FahrenheitB!Display environment in Fahrenheit'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._serialized_options = b'\312\363\030::\033Air Quality Metrics EnabledB\033Collect air quality metrics'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._serialized_options = b'\312\363\030X*\001s:\034Air Quality Metrics IntervalB5How often air quality metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._serialized_options = b'\312\363\0302:\031Power Measurement EnabledB\025Collect power metrics'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._serialized_options = b'\312\363\030L*\001s:\026Power Metrics IntervalB/How often power metrics are sent over the mesh.'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._serialized_options = b'\312\363\030/:\014Power ScreenB\037Display power metrics on device'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._serialized_options = b'\312\363\030\226\001:\030Broadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.R\0062.7.13'
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._options = None
_MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._serialized_options = b'\312\363\030\010R\0062.7.18'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._serialized_options = b'\312\363\030\006:\004None'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._serialized_options = b'\312\363\030\004:\002Up'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._serialized_options = b'\312\363\030\006:\004Down'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._serialized_options = b'\312\363\030\006:\004Left'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._serialized_options = b'\312\363\030\007:\005Right'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._serialized_options = b'\312\363\030\010:\006Select'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._serialized_options = b'\312\363\030\006:\004Back'
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._serialized_options = b'\312\363\030\010:\006Cancel'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._serialized_options = b'\312\363\030\':\016Rotary EncoderB\025Enable rotary encoder'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._serialized_options = b'\312\363\030,:\005Pin AB#GPIO pin for rotary encoder A port.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._serialized_options = b'\312\363\030,:\005Pin BB#GPIO pin for rotary encoder B port.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._serialized_options = b'\312\363\0303:\tPress PinB&GPIO pin for the encoder press button.'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._serialized_options = b'\312\363\030<:\026Clockwise Rotary EventB\"Input event for clockwise rotation'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._serialized_options = b'\312\363\030K:\035Counterclockwise Rotary EventB*Input event for counter-clockwise rotation'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._serialized_options = b'\312\363\0304:\023Encoder Press EventB\035Input event for encoder press'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._serialized_options = b'\312\363\0303:\024Up/Down/Select InputB\033Enable up/down/select input'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.7.0'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._serialized_options = b'\030\001\312\363\030\007Z\0052.7.0'
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._options = None
_MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030.:\tSend BellB!Send bell character with messages'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._serialized_options = b'\312\363\030*:\tLED StateB\035The state of the LED (on/off)'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._serialized_options = b'\312\363\030_\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000?@:\007CurrentB!Drive current for the LED output.J\037led|brightness|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._serialized_options = b'\312\363\030j\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\003RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._serialized_options = b'\312\363\030n\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\005GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._options = None
_MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._serialized_options = b'\312\363\030l\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\004BlueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting'
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._options = None
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._serialized_options = b'\312\363\0309:\007MessageB.Message for beacon broadcasts, up to 60 bytes.'
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._options = None
_MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._serialized_options = b'\312\363\030H\031\000\000\000\000\000 \254@*\001s:\010IntervalB0How often a beacon is broadcast. Minimum 1 hour.'
_MODULECONFIG_TAKCONFIG.fields_by_name['team']._options = None
_MODULECONFIG_TAKCONFIG.fields_by_name['team']._serialized_options = b'\312\363\030\026:\004TeamB\016TAK team color'
_MODULECONFIG_TAKCONFIG.fields_by_name['role']._options = None
_MODULECONFIG_TAKCONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\027:\004RoleB\017TAK member role'
_MODULECONFIG.fields_by_name['statusmessage']._options = None
_MODULECONFIG.fields_by_name['statusmessage']._serialized_options = b'\312\363\030\010R\0062.7.20'
_MODULECONFIG.fields_by_name['traffic_management']._options = None
_MODULECONFIG.fields_by_name['traffic_management']._serialized_options = b'\312\363\030\007R\0052.8.0'
_MODULECONFIG.fields_by_name['tak']._options = None
_MODULECONFIG.fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0'
_MODULECONFIG.fields_by_name['mesh_beacon']._options = None
_MODULECONFIG.fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0'
_REMOTEHARDWAREPINTYPE._serialized_start=16574
_REMOTEHARDWAREPINTYPE._serialized_end=16647
_MODULECONFIG._serialized_start=208
_MODULECONFIG._serialized_end=16461
_MODULECONFIG_MQTTCONFIG._serialized_start=1580
_MODULECONFIG_MQTTCONFIG._serialized_end=2565
_MODULECONFIG_MAPREPORTSETTINGS._serialized_start=2568
_MODULECONFIG_MAPREPORTSETTINGS._serialized_end=2930
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=2933
_MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=3072
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=3075
_MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=3591
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=3594
_MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=4989
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE._serialized_start=4744
_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE._serialized_end=4989
_MODULECONFIG_AUDIOCONFIG._serialized_start=4992
_MODULECONFIG_AUDIOCONFIG._serialized_end=5942
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=5586
_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=5942
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=5945
_MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=6454
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG._serialized_start=6457
_MODULECONFIG_TRAFFICMANAGEMENTCONFIG._serialized_end=7474
_MODULECONFIG_SERIALCONFIG._serialized_start=7477
_MODULECONFIG_SERIALCONFIG._serialized_end=8977
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=8166
_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=8712
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=8715
_MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=8977
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=8980
_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=10675
_MODULECONFIG_STOREFORWARDCONFIG._serialized_start=10678
_MODULECONFIG_STOREFORWARDCONFIG._serialized_end=11371
_MODULECONFIG_RANGETESTCONFIG._serialized_start=11374
_MODULECONFIG_RANGETESTCONFIG._serialized_end=11773
_MODULECONFIG_TELEMETRYCONFIG._serialized_start=11776
_MODULECONFIG_TELEMETRYCONFIG._serialized_end=13207
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=13210
_MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=14484
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=14286
_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=14484
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=14487
_MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=15080
_MODULECONFIG_STATUSMESSAGECONFIG._serialized_start=15082
_MODULECONFIG_STATUSMESSAGECONFIG._serialized_end=15124
_MODULECONFIG_MESHBEACONCONFIG._serialized_start=15127
_MODULECONFIG_MESHBEACONCONFIG._serialized_end=16283
_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET._serialized_start=15747
_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET._serialized_end=16009
_MODULECONFIG_MESHBEACONCONFIG_FLAGS._serialized_start=16011
_MODULECONFIG_MESHBEACONCONFIG_FLAGS._serialized_end=16109
_MODULECONFIG_TAKCONFIG._serialized_start=16286
_MODULECONFIG_TAKCONFIG._serialized_end=16442
_REMOTEHARDWAREPIN._serialized_start=16463
_REMOTEHARDWAREPIN._serialized_end=16572
# @@protoc_insertion_point(module_scope)
-437
View File
@@ -1,437 +0,0 @@
from meshtastic.protobuf import atak_pb2 as _atak_pb2
from meshtastic.protobuf import channel_pb2 as _channel_pb2
from meshtastic.protobuf import config_pb2 as _config_pb2
from meshtastic.protobuf import field_metadata_pb2 as _field_metadata_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", "mesh_beacon", "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_450: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700B: ModuleConfig.AudioConfig.Audio_Baud
CODEC2_700C: 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 MeshBeaconConfig(_message.Message):
__slots__ = ["broadcast_interval_secs", "broadcast_message", "broadcast_offer_channel", "broadcast_offer_frequency_slot", "broadcast_offer_preset", "broadcast_offer_region", "broadcast_targets", "flags"]
class Flags(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
__slots__ = []
class BroadcastTarget(_message.Message):
__slots__ = ["channel_index", "frequency_slot", "preset", "region"]
CHANNEL_INDEX_FIELD_NUMBER: _ClassVar[int]
FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
PRESET_FIELD_NUMBER: _ClassVar[int]
REGION_FIELD_NUMBER: _ClassVar[int]
channel_index: int
frequency_slot: int
preset: _config_pb2.Config.LoRaConfig.ModemPreset
region: _config_pb2.Config.LoRaConfig.RegionCode
def __init__(self, preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., channel_index: _Optional[int] = ..., frequency_slot: _Optional[int] = ...) -> None: ...
BROADCAST_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
BROADCAST_MESSAGE_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_CHANNEL_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_FREQUENCY_SLOT_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_PRESET_FIELD_NUMBER: _ClassVar[int]
BROADCAST_OFFER_REGION_FIELD_NUMBER: _ClassVar[int]
BROADCAST_TARGETS_FIELD_NUMBER: _ClassVar[int]
FLAGS_FIELD_NUMBER: _ClassVar[int]
FLAG_BROADCAST_ENABLED: ModuleConfig.MeshBeaconConfig.Flags
FLAG_LEGACY_SPLIT: ModuleConfig.MeshBeaconConfig.Flags
FLAG_LISTEN_ENABLED: ModuleConfig.MeshBeaconConfig.Flags
FLAG_NONE: ModuleConfig.MeshBeaconConfig.Flags
broadcast_interval_secs: int
broadcast_message: str
broadcast_offer_channel: _channel_pb2.ChannelSettings
broadcast_offer_frequency_slot: int
broadcast_offer_preset: _config_pb2.Config.LoRaConfig.ModemPreset
broadcast_offer_region: _config_pb2.Config.LoRaConfig.RegionCode
broadcast_targets: _containers.RepeatedCompositeFieldContainer[ModuleConfig.MeshBeaconConfig.BroadcastTarget]
flags: int
def __init__(self, flags: _Optional[int] = ..., broadcast_offer_frequency_slot: _Optional[int] = ..., broadcast_message: _Optional[str] = ..., broadcast_offer_channel: _Optional[_Union[_channel_pb2.ChannelSettings, _Mapping]] = ..., broadcast_offer_region: _Optional[_Union[_config_pb2.Config.LoRaConfig.RegionCode, str]] = ..., broadcast_offer_preset: _Optional[_Union[_config_pb2.Config.LoRaConfig.ModemPreset, str]] = ..., broadcast_interval_secs: _Optional[int] = ..., broadcast_targets: _Optional[_Iterable[_Union[ModuleConfig.MeshBeaconConfig.BroadcastTarget, _Mapping]]] = ...) -> 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
MODBUS: 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__ = ["nodeinfo_direct_response_max_hops", "position_min_interval_secs", "rate_limit_max_packets", "rate_limit_window_secs", "unknown_packet_threshold"]
NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: _ClassVar[int]
POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: _ClassVar[int]
RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: _ClassVar[int]
RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: _ClassVar[int]
UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: _ClassVar[int]
nodeinfo_direct_response_max_hops: int
position_min_interval_secs: int
rate_limit_max_packets: int
rate_limit_window_secs: int
unknown_packet_threshold: int
def __init__(self, position_min_interval_secs: _Optional[int] = ..., nodeinfo_direct_response_max_hops: _Optional[int] = ..., rate_limit_window_secs: _Optional[int] = ..., rate_limit_max_packets: _Optional[int] = ..., unknown_packet_threshold: _Optional[int] = ...) -> 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]
MESH_BEACON_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
mesh_beacon: ModuleConfig.MeshBeaconConfig
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]] = ..., mesh_beacon: _Optional[_Union[ModuleConfig.MeshBeaconConfig, _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: ...
Loaded 100 of 281 files, more files were not shown because too many files have changed in this diff. Show more