Compare commits

...

104 Commits

Author SHA1 Message Date
Kevin Hester
5c2851db85 nargs='?' is awesome! get rid of ble_dest. 2024-06-30 06:46:39 -07:00
Kevin Hester
7e440693a3 Merge remote-tracking branch 'root/master' into ble-logging
# Conflicts:
#	poetry.lock
2024-06-30 06:36:11 -07:00
Ian McEwen
18c2d08bf0 protobufs: v2.3.13 2024-06-29 17:36:22 -07:00
Ian McEwen
a3afc2ae0a Ensure regen-protobufs works if there's no pre-existing directory to remove 2024-06-29 17:34:02 -07:00
Ian McEwen
f6d1b4bc39 Merge pull request #613 from geeksville/pr-moveproto
Move protobuf python glue from meshtastic to meshtastic.protobuf
2024-06-29 17:12:32 -07:00
Kevin Hester
9004f1ed57 fixes for type checker 2024-06-29 15:18:22 -07:00
Kevin Hester
bd767af485 A better way to ensure BLE disconnects:
It turns out that Bleak is kinda racey.  If we call disconnect()
and then immediately close() the disconnect may or may not actually happen
(probably because it was merely queued for dbus).
So instead: When we want to close the BLEInterface we call disconnect()
and then in a preregistered 'on disconnect' handler we actually close
down our interface/datastructures.
2024-06-29 15:08:50 -07:00
Kevin Hester
6194e41baf fix linter warnings 2024-06-29 14:37:50 -07:00
Kevin Hester
532ca54ba4 fix bug: we were never calling BLE.disconnect() which...
on linux breaks all but the first connection attempts.
Also remove unneeded event stuff and arbitrary timeouts, better just to
use thread.join()
2024-06-29 14:25:01 -07:00
Kevin Hester
898018ebf3 yay Bleak works again on Linux! 2024-06-29 13:52:46 -07:00
Kevin Hester
9f015f499a wow Bleak now seems pretty buggy to me (compared to 2 yrs ago) 2024-06-29 10:18:37 -07:00
Kevin Hester
dc50a60b01 BLE debugging 2024-06-29 09:35:42 -07:00
Kevin Hester
a24384cbe2 Merge remote-tracking branch 'root/ble-logging' into pr-fixbluetooth 2024-06-29 09:31:28 -07:00
Kevin Hester
adbfb328b2 threads should aways be named (for debugability) 2024-06-29 09:29:29 -07:00
Kevin Hester
6df89f54a7 fix BLE scan with latest Bleak 2024-06-29 09:10:20 -07:00
Ben Meadors
897adfb8c2 Adds support for ble logging characteristic 2024-06-29 09:41:06 -05:00
Kevin Hester
62ce8eaa77 fix code coverage CI false alarm? 2024-06-26 13:52:54 -07:00
Kevin Hester
3e8a807868 Update all libs to latest (in particular the mypy-protobuf tool) 2024-06-26 10:17:37 -07:00
Kevin Hester
6d846c3a63 manually rebuild the protobuf glue files for now... (see PR for info) 2024-06-26 10:12:24 -07:00
Kevin Hester
88b73611f0 Move protobufs to meshtastic.protobuf python namespace 2024-06-26 10:05:59 -07:00
Ian McEwen
f5febc566f comment out windows build for next release, we've been deleting it out of the releases anyway 2024-06-25 19:13:23 -07:00
github-actions
c3dcafb5ef bump version 2024-06-26 02:08:30 +00:00
Ian McEwen
96afa703ba output version number in correct format for github actions, hopefully 2024-06-25 19:07:35 -07:00
Kevin Hester
0b9af0dcba remove old protobufs (moving to meshtastic.protobuf) 2024-06-25 19:05:46 -07:00
Ian McEwen
1b14b1ef20 Use poetry version --short for a valid tag name 2024-06-25 18:58:27 -07:00
Ian McEwen
68836b1af1 Merge pull request #606 from geeksville/pr-poetry
Change build to use poetry
2024-06-25 18:24:27 -07:00
Ian McEwen
195f0c9d90 drop timeago dep, concurrent PR 2024-06-25 18:24:04 -07:00
Ian McEwen
1ff7334385 Merge branch 'master' into pr-poetry 2024-06-25 18:22:02 -07:00
Ian McEwen
b15e27c7b6 Merge pull request #587 from FedericoCeratto/drop-timeago 2024-06-25 18:14:27 -07:00
Ian McEwen
267923fdc5 Add hypothesis fuzzing test for _timeago 2024-06-25 18:14:07 -07:00
Ian McEwen
9ab1b32bdb make pylint happy with a docstring 2024-06-25 18:09:20 -07:00
Ian McEwen
3a4795d3b8 Merge pull request #605 from geeksville/pr-whitelist
Add a whitelist of known meshtastic USB VIDs to use a default serial …
2024-06-25 12:53:39 -07:00
Ian McEwen
c2a2d5a77c Merge pull request #611 from geeksville/pr-fixbitrot
fix bitrot in an old sanity test - use correct namespace
2024-06-25 12:52:21 -07:00
Kevin Hester
b30cde979c fix bitrot in an old sanity test - use correct namespace 2024-06-25 11:31:02 -07:00
Kevin Hester
8456f36c6b add NordicSemi Power Profiler Kit 2 device to the USB blacklist 2024-06-23 17:18:04 -07:00
Kevin Hester
81266e756b fixes to make Bleak (BLE) work better 2024-06-23 13:52:32 -07:00
Kevin Hester
62f16d34d4 fix BLE scan and connect to work with latest bleak 2024-06-23 11:56:44 -07:00
Kevin Hester
e6a88e055f fix #610: bump nanopb to 0.4.8
Including in the Poetry changes because it touches the same lines
and I want to avoid hand merging ;-)
2024-06-23 08:26:20 -07:00
Kevin Hester
7bea6f6120 For poetry change: need to put venv in our path so mypy protobuf plugin works 2024-06-22 23:25:42 -07:00
Kevin Hester
725de4c2f9 move mypy and type info into dev-time only dependencies thx @njh 2024-06-22 16:43:56 -07:00
geeksville
4203553a44 changes to (hopefully) make release CI actions work
add pyinstaller as a dev dep.  Use it to make "bin/build-bin.sh"
remove old version scripts (no longer needed with poetry)
2024-06-22 09:34:24 -07:00
geeksville
9e319f3c52 update CI scripts to allow running CI on the desktop (see below)
* add script to run 'act' local github actions tool (lets devs check github
actions on their local machine)
* Update various github actions to latest (so they can work with the 'act'
tool)
* change a few places where python version was not properly quoted as a
string (act yaml parser is more strict than the github version)
* update pylint min-version to work with recent github actions
* remove pandas/riden requirement (that's in my other branch for now)
2024-06-22 08:02:33 -07:00
geeksville
cd5913ae6d WIP switch to using Poetry for builds/dev usage. Looks pretty good
still need to update readme and pypi upload
2024-06-22 08:01:54 -07:00
geeksville
ccfb04720f Add a whitelist of known meshtastic USB VIDs to use a default serial ports.
Initially only RAK4631 and heltec tracker are listed
2024-06-21 14:42:29 -07:00
Federico Ceratto
c34d08b0e5 Refactor timeago and add tests
_timeago is not specialized for mesh interfaces so it is factored
out into a private function
2024-06-21 10:28:45 +02:00
Federico Ceratto
b5d1b7612f Replace timeago
Replace the timeago library with a simple function
2024-06-21 09:25:39 +02:00
Ian McEwen
b58094b9ce Merge pull request #602 from ianmcorvidae/improve-acks
Improve ACK handling: pass to `onAckNak` and on request in sendData
2024-06-20 17:16:36 -07:00
Ian McEwen
23f41bff0a Improve ACK handling: correctly pass them to onAckNak handlers, and add a mechanism for other handlers to request acks as well. 2024-06-20 16:52:01 -07:00
Ian McEwen
a1021c4f78 add dotmap back, that test file isn't in tests, it's in meshtastic.test, oops 2024-06-20 16:45:22 -07:00
Ian McEwen
b06329f47e Remove dotmap and pexpect from setup.py, they shouldn't be required 2024-06-20 16:40:46 -07:00
Ian McEwen
53b0e35b0c protobufs: v2.3.12 2024-06-09 19:30:11 -07:00
github-actions
9ac5aeeaf0 bump version 2024-06-08 15:10:49 +00:00
Ian McEwen
5c703aff1d Merge pull request #591 from ianmcorvidae/device-metadata-resp
Wait for response with --device-metadata. Fixes #527
2024-06-08 07:29:45 -07:00
Ian McEwen
5441266565 Wait for response with --device-metadata. Fixes #527 2024-06-08 07:26:20 -07:00
Ian McEwen
890557fa5d Merge branch 'more-tests' 2024-06-05 19:58:03 -07:00
Ian McEwen
e27d210a71 Test with --dest on setlat/remove-position for the error/exit case 2024-06-05 19:57:40 -07:00
Ian McEwen
16c08b8b47 Add simple --remove-position test 2024-06-05 19:54:12 -07:00
Ian McEwen
ebd3c7f5e8 Add test for fromStr base64 branch 2024-06-05 19:48:58 -07:00
Ian McEwen
da0312a5b0 more miscellaneous types 2024-06-05 19:44:18 -07:00
Ian McEwen
919ae8c40f make pylint happy, again 2024-06-05 19:32:45 -07:00
Ian McEwen
dd4fccbc77 Add a fairly simple property-based test as a starting point 2024-06-05 19:29:55 -07:00
Ian McEwen
32682b5230 Merge pull request #589 from ianmcorvidae/nodeless-startup
Allow a faster nodedb-less startup on 2.3.11+ with `--no-nodes`
2024-06-05 18:59:18 -07:00
Ian McEwen
9dab76bb64 quell pylint 2024-06-05 18:56:19 -07:00
Ian McEwen
e6d61c6603 Allow a faster nodedb-less startup on 2.3.11+ with --no-nodes and the magic value from meshtastic/firmware#3949 2024-06-05 18:52:35 -07:00
Ian McEwen
ee857c5128 Merge pull request #588 from nerdenator/quick-coverage
quick-coverage: simple test case just to cover uncovered code.
2024-06-03 23:22:33 -07:00
Nerdenator
87a4bb0888 quick-coverage: fixing linting issues. 2024-06-04 01:15:10 -05:00
Nerdenator
d72cc0e201 quick-coverage: simple test case just to cover uncovered code. 2024-06-04 01:01:32 -05:00
Ian McEwen
b350b9eab9 Update the main module docstring to be a bit more accurate, at least 2024-06-01 23:03:56 -07:00
Ian McEwen
dc112f2f3a protobufs: v2.3.11 2024-06-01 12:04:01 -07:00
github-actions
14ae4eeac1 bump version 2024-06-01 18:47:51 +00:00
Ian McEwen
bbc526d0a8 Merge pull request #584 from ianmcorvidae/improve-fixed-position
Use new fixed position admin messages and add `--remove-position` argument
2024-06-01 00:44:17 -07:00
Ian McEwen
abe98f5079 Merge pull request #585 from ianmcorvidae/position-rounding
Fix rounding of position values when converting from integer to float in _fixupPosition
2024-06-01 00:42:58 -07:00
Ian McEwen
e8dfee8454 Fix rounding of position values when converting from integer to float in _fixupPosition. Fixes #572 2024-05-31 18:57:30 -07:00
Ian McEwen
1746ad15d7 Use new fixed position admin messages and add --remove-position argument. Fixes #525 2024-05-31 18:44:33 -07:00
Ian McEwen
4d67e7fc76 Fix up/add some more types 2024-05-30 17:51:42 -07:00
Ian McEwen
3b112d2f49 Merge pull request #583 from ianmcorvidae/update-unknown-node-setup
Initialize unknown nodes more in line with meshtastic/design#16; show hardware in --nodes
2024-05-30 15:52:16 -07:00
Ian McEwen
93e9c1c66c Initialize unknown nodes more in line with meshtastic/design#16 2024-05-30 13:50:52 -07:00
Ian McEwen
8e641b3186 Merge pull request #581 from 868meshbot/868meshbot-fix-ignore-incoming
Fix the ignore_incoming management BUG 568
2024-05-26 00:03:11 -07:00
Ian McEwen
ed545cd9b4 Merge pull request #580 from todd-herbert/wait-to-disconnect
Add "wait to disconnect" argument
2024-05-26 00:02:08 -07:00
868meshbot
bcd60c9ef7 Update __main__.py
Simple patch to fix the ignore_incoming management aka
https://github.com/meshtastic/python/issues/568
2024-05-25 16:28:16 +01:00
Todd Herbert
c3d044e3f2 Optional pause before disconnecting 2024-05-24 17:10:07 +12:00
Ian McEwen
8d538e8f24 protobufs: v2.3.10 2024-05-18 12:56:41 -07:00
github-actions
fa1a3d7901 bump version 2024-05-18 00:15:11 +00:00
Ian McEwen
3adeb925dd tweak the roadmap in README a little 2024-05-14 16:05:21 -07:00
Ian McEwen
9de04a12e1 Merge pull request #574 from ianmcorvidae/warn-enable-disable
add a warning on --ch-enable and --ch-disable, which should usually be avoided
2024-05-13 21:30:01 -07:00
Ian McEwen
e01a1bb6e0 add a warning on --ch-enable and --ch-disable, which should usually be avoided 2024-05-13 21:27:53 -07:00
Ian McEwen
1ebea53703 make pylint happy with import order 2024-05-11 22:28:50 -07:00
Ian McEwen
ba2d6c9d93 continue progressively typing things (SerialInterface/BLEInterface initializations) 2024-05-11 22:27:31 -07:00
Ian McEwen
fef0e1b77f Remove an unuseful/inaccurate comment 2024-05-10 20:17:48 -07:00
Ian McEwen
dc1dec17b5 protobufs: v2.3.9 2024-05-10 14:56:07 -07:00
Ian McEwen
02ed17837b Improve FromRadio handling, publish messages for client proxy/xmodem stuff tentatively 2024-05-10 14:54:32 -07:00
Ian McEwen
8cf996a242 Merge pull request #564 from jhollowe-forks/fix-help-typo
Fix typo in __main__.py
2024-05-02 19:04:08 -07:00
John Hollowell
02189aae07 Fix typo in __main__.py 2024-05-02 21:51:09 -04:00
Ian McEwen
894581ce00 Merge pull request #563 from ianmcorvidae/show-channel-0
Print 0 for channel rather than N/A, since we should probably always have a channel
2024-05-02 18:29:00 -07:00
Ian McEwen
fb8db01427 Print 0 for channel rather than N/A, since we should probably always have a channel. Fixes #562 2024-05-02 18:22:39 -07:00
github-actions
fa5ede93ed bump version 2024-05-01 16:42:38 +00:00
Ian McEwen
022a8a1017 protobufs: v2.3.8 2024-05-01 09:40:04 -07:00
Ian McEwen
21f6e25ab0 Merge pull request #561 from ianmcorvidae/use-heartbeat
Use the new Heartbeat payload variant for the heartbeat instead of an empty ToRadio packet
2024-04-29 15:18:23 -07:00
Ian McEwen
243e297505 Use the new Heartbeat payload variant for the heartbeat instead of an empty ToRadio packet 2024-04-29 15:16:04 -07:00
Ian McEwen
9fc86f9450 Merge pull request #558 from geeksville/pr-fixjson
Pretty indent --info JSON output (see below for details)
2024-04-28 21:40:43 -07:00
Ian McEwen
e5999f5be6 Merge pull request #560 from geeksville/pr-fixchannel
(high-pri fix) Update python client to use the 'modern' meshtastic protocol init flow
2024-04-28 19:53:04 -07:00
geeksville
3886bc16d7 Update python client to use the 'modern' meshtastic protocol init flow
Some time ago I updated the protocol so that after sending NODEINFOs to
client devices (via fromRadio protobufs), it would proactively send the
channel definitions.  Prior to this the client had to ask for each channel
by sending an admin request.  This handshaking was really slow for mobile/
bluetooth clients.  So in the current device code (last couple of years)
the device automatically sends this info to the client during initial config
download.

Unfortunately I never updated the python client to expect this.  I assumed
(incorrectly) that it would just cope and keep sending the channel requests
the old way it always had (which is still supported by devices - and
required for remote administration of nodes).

This change removes sending channel requests (for the local node only)
from the python startup code.  It also now understands (no longer ignoring)
the channels which were sent proactively by the local device.

This makes connection/config/api operations from the python client 100%
reliable again.  Previously it would only work sometimes depending on how
quickly it was able to get the local node db downloaded.

Also this flow is much faster - which should help all users of the python
api.
2024-04-27 11:59:17 -07:00
geeksville
7fe98bc266 Pretty indent --info JSON output (see below for details)
Changes to make --info much more human readable (while still keeping
machine readabilty for anyone foolish enough to be parsing the existing
output as text)

* change message_to_json to optionally not strip the multiline JSON
* use multiline=True for the two places we are printing to the console
* make the node list JSON indented
2024-04-26 15:15:57 -07:00
github-actions
2f9307fd99 bump version 2024-04-25 18:33:55 +00:00
102 changed files with 4461 additions and 2431 deletions

View File

@@ -1,5 +1,5 @@
[run] [run]
omit = meshtastic/*_pb2.py,meshtastic/tests/*.py,meshtastic/test.py omit = meshtastic/protobuf/*_pb2.py,meshtastic/tests/*.py,meshtastic/test.py
[report] [report]
exclude_lines = exclude_lines =

View File

@@ -18,30 +18,29 @@ jobs:
- "3.10" - "3.10"
- "3.11" - "3.11"
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Install Python 3 - name: Install Python 3
uses: actions/setup-python@v1 uses: actions/setup-python@v5
- name: Uninstall meshtastic - name: Uninstall meshtastic
run: | run: |
pip3 uninstall meshtastic pip3 uninstall -y meshtastic
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip3 install -r requirements.txt pip3 install poetry
- name: Install meshtastic from local - name: Install meshtastic from local
run: | run: |
pip3 install . poetry install
which meshtastic poetry run meshtastic --version
meshtastic --version
- name: Run pylint - name: Run pylint
run: pylint meshtastic examples/ --ignore-patterns ".*_pb2.pyi?$" run: poetry run pylint meshtastic examples/ --ignore-patterns ".*_pb2.pyi?$"
- name: Check types with mypy - name: Check types with mypy
run: mypy meshtastic/ run: poetry run mypy meshtastic/
- name: Run tests with pytest - name: Run tests with pytest
run: pytest --cov=meshtastic run: poetry run pytest --cov=meshtastic
- name: Generate coverage report - name: Generate coverage report
run: | run: |
pytest --cov=meshtastic --cov-report=xml poetry run pytest --cov=meshtastic --cov-report=xml
- name: Upload coverage to Codecov - name: Upload coverage to Codecov
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v4
with: with:
@@ -62,11 +61,12 @@ jobs:
- "3.10" - "3.10"
- "3.11" - "3.11"
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Install Python 3 - name: Install Python 3
uses: actions/setup-python@v1 uses: actions/setup-python@v5
- name: Install meshtastic from local - name: Install meshtastic from local
run: | run: |
pip3 install . python -m pip install --upgrade pip
which meshtastic pip3 install poetry
meshtastic --version poetry install
poetry run meshtastic --version

View File

@@ -12,26 +12,36 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v4
- name: Set up Python 3.9
uses: actions/setup-python@v5
with:
python-version: "3.9"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip3 install poetry
- name: Bump version - name: Bump version
run: >- run: >-
bin/bump_version.py poetry version patch
- name: Commit updated version.py - name: Commit updated version.
id: commit_updated id: commit_updated
run: | run: |
git config --global user.name 'github-actions' git config --global user.name 'github-actions'
git config --global user.email 'bot@noreply.github.com' git config --global user.email 'bot@noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git add setup.py git add pyproject.toml
git commit -m "bump version" && git push || echo "No changes to commit" git commit -m "bump version" && git push || echo "No changes to commit"
git log -n 1 --pretty=format:"%H" | tail -n 1 | awk '{print "::set-output name=sha::"$0}' git log -n 1 --pretty=format:"%H" | tail -n 1 | awk '{print "::set-output name=sha::"$0}'
- name: Get version - name: Get version
id: get_version id: get_version
run: >- run: >-
bin/show_version.py poetry version --short | sed 's/^/::set-output name=version::/'
- name: Create GitHub release - name: Create GitHub release
uses: actions/create-release@v1 uses: actions/create-release@v1
@@ -47,26 +57,9 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install pypa/build
run: >-
python -m
pip install
build
--user
- name: Build a binary wheel and a source tarball - name: Build a binary wheel and a source tarball
run: >- run: >-
python -m poetry build
build
--sdist
--wheel
--outdir dist/
.
- name: Publish to PyPI - name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@master uses: pypa/gh-action-pypi-publish@master
@@ -79,14 +72,14 @@ jobs:
# needs: release_create # needs: release_create
# steps: # steps:
# - name: Checkout # - name: Checkout
# uses: actions/checkout@v3 # uses: actions/checkout@v4
# with: # with:
# ref: ${{ needs.release_create.outputs.new_sha }} # ref: ${{ needs.release_create.outputs.new_sha }}
# - name: Set up Python 3.9 # - name: Set up Python 3.9
# uses: actions/setup-python@v2 # uses: actions/setup-python@v5
# with: # with:
# python-version: 3.9 # python-version: "3.9"
# - name: Setup code signing # - name: Setup code signing
# env: # env:
@@ -125,21 +118,19 @@ jobs:
needs: release_create needs: release_create
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
ref: ${{ needs.release_create.outputs.new_sha }} ref: ${{ needs.release_create.outputs.new_sha }}
- name: Set up Python 3.9 - name: Set up Python 3.9
uses: actions/setup-python@v2 uses: actions/setup-python@v5
with: with:
python-version: 3.9 python-version: "3.9"
- name: Build - name: Build
run: | run: |
pip install pyinstaller pip install poetry
pip install -r requirements.txt bin/build-bin.sh
pip install .
pyinstaller -F -n meshtastic --collect-all meshtastic meshtastic/__main__.py
- name: Add ubuntu to release - name: Add ubuntu to release
uses: actions/upload-release-asset@v1 uses: actions/upload-release-asset@v1
@@ -161,33 +152,31 @@ jobs:
asset_name: readme.txt asset_name: readme.txt
asset_content_type: text/plain asset_content_type: text/plain
build-and-publish-windows: # build-and-publish-windows:
runs-on: windows-latest # runs-on: windows-latest
needs: release_create # needs: release_create
steps: # steps:
- name: Checkout # - name: Checkout
uses: actions/checkout@v3 # uses: actions/checkout@v4
with: # with:
ref: ${{ needs.release_create.outputs.new_sha }} # ref: ${{ needs.release_create.outputs.new_sha }}
- name: Set up Python 3.9 # - name: Set up Python 3.9
uses: actions/setup-python@v2 # uses: actions/setup-python@v5
with: # with:
python-version: 3.9 # python-version: "3.9"
- name: Build # - name: Build
run: | # run: |
pip install pyinstaller # pip install poetry
pip install -r requirements.txt # bin/build-bin.sh
pip install .
pyinstaller -F -n meshtastic --collect-all meshtastic meshtastic/__main__.py
- name: Add windows to release # - name: Add windows to release
uses: actions/upload-release-asset@v1 # uses: actions/upload-release-asset@v1
env: # env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: # with:
upload_url: ${{ needs.release_create.outputs.upload_url }} # upload_url: ${{ needs.release_create.outputs.upload_url }}
asset_path: dist/meshtastic.exe # asset_path: dist/meshtastic.exe
asset_name: meshtastic_windows # asset_name: meshtastic_windows
asset_content_type: application/zip # asset_content_type: application/zip

View File

@@ -7,7 +7,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v4
with: with:
submodules: true submodules: true
@@ -18,9 +18,14 @@ jobs:
- name: Download nanopb - name: Download nanopb
run: | run: |
wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.6-linux-x86.tar.gz wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8-linux-x86.tar.gz
tar xvzf nanopb-0.4.6-linux-x86.tar.gz tar xvzf nanopb-0.4.8-linux-x86.tar.gz
mv nanopb-0.4.6-linux-x86 nanopb-0.4.6 mv nanopb-0.4.8-linux-x86 nanopb-0.4.8
- name: Install poetry (needed by regen-protobufs.sh)
run: |
python -m pip install --upgrade pip
pip3 install poetry
- name: Re-generate protocol buffers - name: Re-generate protocol buffers
run: | run: |
@@ -32,5 +37,5 @@ jobs:
git config --global user.email 'bot@noreply.github.com' git config --global user.email 'bot@noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git add protobufs git add protobufs
git add meshtastic git add meshtastic/protobuf
git commit -m "Update protobuf submodule" && git push || echo "No changes to commit" git commit -m "Update protobuf submodule" && git push || echo "No changes to commit"

2
.gitignore vendored
View File

@@ -15,3 +15,5 @@ venv/
__pycache__ __pycache__
examples/__pycache__ examples/__pycache__
meshtastic.spec meshtastic.spec
.hypothesis/
coverage.xml

18
.vscode/launch.json vendored
View File

@@ -10,7 +10,15 @@
"request": "launch", "request": "launch",
"module": "meshtastic", "module": "meshtastic",
"justMyCode": false, "justMyCode": false,
"args": ["--debug", "--ble", "24:62:AB:DD:DF:3A"] "args": ["--ble", "Meshtastic_9f6e"]
},
{
"name": "meshtastic BLE scan",
"type": "python",
"request": "launch",
"module": "meshtastic",
"justMyCode": false,
"args": ["--debug", "--ble-scan"]
}, },
{ {
"name": "meshtastic admin", "name": "meshtastic admin",
@@ -76,6 +84,14 @@
"justMyCode": true, "justMyCode": true,
"args": ["--debug", "--info"] "args": ["--debug", "--info"]
}, },
{
"name": "meshtastic debug BLE",
"type": "python",
"request": "launch",
"module": "meshtastic",
"justMyCode": true,
"args": ["--debug", "--ble", "--info"]
},
{ {
"name": "meshtastic debug set region", "name": "meshtastic debug set region",
"type": "python", "type": "python",

View File

@@ -28,8 +28,7 @@ If you're interested in contributing but don't have specific things you'd like t
This should always be considered a list in progress and flux -- inclusion doesn't guarantee implementation, and exclusion doesn't mean something's not wanted. GitHub issues are a great place to discuss ideas. This should always be considered a list in progress and flux -- inclusion doesn't guarantee implementation, and exclusion doesn't mean something's not wanted. GitHub issues are a great place to discuss ideas.
* Types * Types
* type annotations throughout the codebase * type annotations throughout the codebase, and upgrading mypy running in CI to `--strict`
* mypy running in CI to type-check new code
* async-friendliness * async-friendliness
* CLI completeness & consistency * CLI completeness & consistency
* the CLI should support all features of the firmware * the CLI should support all features of the firmware
@@ -40,9 +39,9 @@ This should always be considered a list in progress and flux -- inclusion doesn'
* pubsub events should be documented clearly * pubsub events should be documented clearly
* helpers for third-party code * helpers for third-party code
* it should be easy to write a script that supports similar options to the CLI so many tools support the same ways of connecting to nodes * it should be easy to write a script that supports similar options to the CLI so many tools support the same ways of connecting to nodes
* interactive client
* data storage & processing * data storage & processing
* there should be a standardized way of recording packets for later use, debugging, etc. * there should be a standardized way of recording packets for later use, debugging, etc.
* a persistence layer could also keep track of nodes beyond nodedb, as the apps do
* a sqlite database schema and tools for writing to it may be a good starting point * a sqlite database schema and tools for writing to it may be a good starting point
* enable maps, charts, visualizations * enable maps, charts, visualizations

9
bin/build-bin.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
set -e
echo Building ubuntu binary
poetry install
source $(poetry env info --path)/bin/activate
pyinstaller -F -n meshtastic --collect-all meshtastic meshtastic/__main__.py

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env python
"""Bump the version number"""
import re
version_filename = "setup.py"
lines = None
with open(version_filename, "r", encoding="utf-8") as f:
lines = f.readlines()
with open(version_filename, "w", encoding="utf-8") as f:
for line in lines:
if line.lstrip().startswith("version="):
# get rid of quotes around the version
line = line.replace('"', "")
# get rid of trailing comma
line = line.replace(",", "")
# split on '='
words = line.split("=")
# split the version into parts (by period)
v = words[1].split(".")
build_num = re.findall(r"\d+", v[2])[0]
new_build_num = str(int(build_num) + 1)
ver = f"{v[0]}.{v[1]}.{v[2].replace(build_num, new_build_num)}".replace(
"\n", ""
)
f.write(f' version="{ver}",\n')
else:
f.write(line)

View File

@@ -3,20 +3,24 @@ set -e
# You may consider running: "pytest -m smoke1" instead of this test. # You may consider running: "pytest -m smoke1" instead of this test.
echo "Running (crude) prerelease tests to verify sanity" echo "Running (crude) prerelease tests to verify sanity"
# Use the python environment created by poetry
source $(poetry env info --path)/bin/activate
echo running hello echo running hello
python3 tests/hello_world.py python3 tests/hello_world.py
# bin/run.sh --help # meshtastic --help
echo toggling router echo toggling router
bin/run.sh --set is_router true meshtastic --set is_router true
bin/run.sh --set is_router false meshtastic --set is_router false
# TODO: This does not seem to work. # TODO: This does not seem to work.
echo setting channel echo setting channel
bin/run.sh --seturl "https://www.meshtastic.org/c/#GAMiENTxuzogKQdZ8Lz_q89Oab8qB0RlZmF1bHQ=" meshtastic --seturl "https://www.meshtastic.org/c/#GAMiENTxuzogKQdZ8Lz_q89Oab8qB0RlZmF1bHQ="
echo setting owner echo setting owner
bin/run.sh --set-owner "Test Build" meshtastic --set-owner "Test Build"
echo setting position echo setting position
bin/run.sh --setlat 32.7767 --setlon -96.7970 --setalt 1337 meshtastic --setlat 32.7767 --setlon -96.7970 --setalt 1337
echo dumping info echo dumping info
bin/run.sh --info meshtastic run meshtastic --info
echo sending closing message echo sending closing message
bin/run.sh --sendtext "Sanity complete" meshtastic --sendtext "Sanity complete"

View File

@@ -1,20 +1,53 @@
#!/bin/bash #!/bin/bash
set -e
#Uncomment to run hack #Uncomment to run hack
#gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/* #gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/*
#gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/* #gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/*
./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./ --mypy_out ./ ./protobufs/meshtastic/*.proto # protoc looks for mypy plugin in the python path
./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./meshtastic/ --mypy_out ./meshtastic/ ./protobufs/nanopb.proto source $(poetry env info --path)/bin/activate
# workaround for import bug in protoc https://github.com/protocolbuffers/protobuf/issues/1491#issuecomment-690618628 # Put our temp files in the poetry build directory
TMPDIR=./build/meshtastic/protofixup
echo "Fixing up protobuf paths in ${TMPDIR} temp directory"
# Ensure a clean build
[ -e "${TMPDIR}" ] && rm -r "${TMPDIR}"
INDIR=${TMPDIR}/in/meshtastic/protobuf
OUTDIR=${TMPDIR}/out
PYIDIR=${TMPDIR}/out
mkdir -p "${OUTDIR}" "${INDIR}" "${PYIDIR}"
cp ./protobufs/meshtastic/*.proto "${INDIR}"
# OS-X sed is apparently a little different and expects an arg for -i
if [[ $OSTYPE == 'darwin'* ]]; then if [[ $OSTYPE == 'darwin'* ]]; then
sed -i '' -E 's/^(import.*_pb2)/from . \1/' meshtastic/*.py SEDCMD="sed -i '' -E"
# automate the current workaround (may be related to Meshtastic-protobufs issue #27 https://github.com/meshtastic/protobufs/issues/27)
sed -i '' -E "s/^None = 0/globals()['None'] = 0/" meshtastic/mesh_pb2.py
else else
sed -i -e 's/^import.*_pb2/from . \0/' meshtastic/*.py SEDCMD="sed -i -E"
# automate the current workaround (may be related to Meshtastic-protobufs issue #27 https://github.com/meshtastic/protobufs/issues/27)
sed -i -e "s/^None = 0/globals()['None'] = 0/" meshtastic/mesh_pb2.py
fi fi
# change the package names to meshtastic.protobuf
$SEDCMD 's/^package meshtastic;/package meshtastic.protobuf;/' "${INDIR}/"*.proto
# fix the imports to match
$SEDCMD 's/^import "meshtastic\//import "meshtastic\/protobuf\//' "${INDIR}/"*.proto
# Generate the python files
./nanopb-0.4.8/generator-bin/protoc -I=$TMPDIR/in --python_out "${OUTDIR}" "--mypy_out=${PYIDIR}" $INDIR/*.proto
# Change "from meshtastic.protobuf import" to "from . import"
$SEDCMD 's/^from meshtastic.protobuf import/from . import/' "${OUTDIR}"/meshtastic/protobuf/*pb2*.py[i]
# Create a __init__.py in the out directory
touch "${OUTDIR}/meshtastic/protobuf/__init__.py"
# Copy to the source controlled tree
mkdir -p meshtastic/protobuf
rm -rf meshtastic/protobuf/*pb2*.py
cp "${OUTDIR}/meshtastic/protobuf"/* meshtastic/protobuf
exit 0

11
bin/run-ci-local.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
# This script lets you run github ci actions locally
# You need to have act installed. You can get it at https://nektosact.com/
# by default it simulates a push event
# other useful options
# -j build-and-publish-ubuntu
# also: we only run one of the 4 matrix tests, because otherwise it absolutely hammers the CPU (so many containers and threads)
act -P ubuntu-latest=-self-hosted --matrix "python-version:3.8" "$@"

View File

@@ -1,2 +0,0 @@
rm log_*
python3 -m meshtastic "$@"

View File

@@ -1,20 +0,0 @@
#!/usr/bin/env python
"""Show the version number"""
version_filename = "setup.py"
lines = None
with open(version_filename, "r", encoding="utf-8") as f:
lines = f.readlines()
for line in lines:
if line.lstrip().startswith("version="):
# get rid of quotes around the version
line2 = line.replace('"', "")
# get rid of the trailing comma
line2 = line2.replace(",", "")
# split on =
words = line2.split("=")
# Note: This format is for github actions
print(f"::set-output name=version::{words[1].strip()}")

View File

@@ -3,8 +3,6 @@ set -e
bin/regen-docs.sh bin/regen-docs.sh
pandoc --from=markdown --to=rst --output=README README.md pandoc --from=markdown --to=rst --output=README README.md
python3 setup.py sdist bdist_wheel
python3 -m twine check dist/* poetry publish -r test-pypi --build
# test the upload
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
echo "view the upload at https://test.pypi.org/ it it looks good upload for real" echo "view the upload at https://test.pypi.org/ it it looks good upload for real"

View File

@@ -1,5 +1,8 @@
rm dist/* rm dist/*
set -e set -e
python3 setup.py sdist bdist_wheel poetry build
python3 -m twine upload dist/* poetry run pytest
poetry publish
#python3 setup.py sdist bdist_wheel
#python3 -m twine upload dist/*

View File

@@ -1,18 +1,22 @@
""" """
# an API for Meshtastic devices # A library for the Meshtastic Client API
Primary class: SerialInterface Primary interfaces: SerialInterface, TCPInterface, BLEInterface
Install with pip: "[pip3 install meshtastic](https://pypi.org/project/meshtastic/)" Install with pip: "[pip3 install meshtastic](https://pypi.org/project/meshtastic/)"
Source code on [github](https://github.com/meshtastic/python) Source code on [github](https://github.com/meshtastic/python)
properties of SerialInterface: notable properties of interface classes:
- localConfig - Current radio configuration and device settings, if you write to this the new settings will be applied to
the device.
- nodes - The database of received nodes. Includes always up-to-date location and username information for each - nodes - The database of received nodes. Includes always up-to-date location and username information for each
node in the mesh. This is a read-only datastructure. node in the mesh. This is a read-only datastructure.
- nodesByNum - like "nodes" but keyed by nodeNum instead of nodeId - nodesByNum - like "nodes" but keyed by nodeNum instead of nodeId
- myInfo - Contains read-only information about the local radio device (software version, hardware version, etc) - myInfo & metadata - Contain read-only information about the local radio device (software version, hardware version, etc)
- localNode - Pointer to a node object for the local node
notable properties of nodes:
- localConfig - Current radio settings, can be written to the radio with the `writeConfig` method.
- moduleConfig - Current module settings, can be written to the radio with the `writeConfig` method.
- channels - The node's channels, keyed by index.
# Published PubSub topics # Published PubSub topics
@@ -72,13 +76,15 @@ from typing import *
import google.protobuf.json_format import google.protobuf.json_format
import serial # type: ignore[import-untyped] import serial # type: ignore[import-untyped]
import timeago # type: ignore[import-untyped]
from dotmap import DotMap # type: ignore[import-untyped] from dotmap import DotMap # type: ignore[import-untyped]
from google.protobuf.json_format import MessageToJson from google.protobuf.json_format import MessageToJson
from pubsub import pub # type: ignore[import-untyped] from pubsub import pub # type: ignore[import-untyped]
from tabulate import tabulate from tabulate import tabulate
from meshtastic import ( from meshtastic.node import Node
from meshtastic.util import DeferredExecution, Timeout, catchAndIgnore, fixme, stripnl
from .protobuf import (
admin_pb2, admin_pb2,
apponly_pb2, apponly_pb2,
channel_pb2, channel_pb2,
@@ -90,10 +96,10 @@ from meshtastic import (
remote_hardware_pb2, remote_hardware_pb2,
storeforward_pb2, storeforward_pb2,
telemetry_pb2, telemetry_pb2,
)
from . import (
util, util,
) )
from meshtastic.node import Node
from meshtastic.util import DeferredExecution, Timeout, catchAndIgnore, fixme, stripnl
# Note: To follow PEP224, comments should be after the module variable. # Note: To follow PEP224, comments should be after the module variable.
@@ -113,6 +119,9 @@ OUR_APP_VERSION = 20300
format is Mmmss (where M is 1+the numeric major number. i.e. 20120 means 1.1.20 format is Mmmss (where M is 1+the numeric major number. i.e. 20120 means 1.1.20
""" """
NODELESS_WANT_CONFIG_ID = 69420
"""A special thing to pass for want_config_id that instructs nodes to skip sending nodeinfos other than its own."""
publishingThread = DeferredExecution("publishing") publishingThread = DeferredExecution("publishing")
@@ -121,6 +130,7 @@ class ResponseHandler(NamedTuple):
# requestId: int - used only as a key # requestId: int - used only as a key
callback: Callable callback: Callable
ackPermitted: bool = False
# FIXME, add timestamp and age out old requests # FIXME, add timestamp and age out old requests

View File

@@ -17,7 +17,8 @@ from pubsub import pub # type: ignore[import-untyped]
import meshtastic.test import meshtastic.test
import meshtastic.util import meshtastic.util
from meshtastic import mt_config from meshtastic import mt_config
from meshtastic import channel_pb2, config_pb2, portnums_pb2, remote_hardware, BROADCAST_ADDR from meshtastic.protobuf import channel_pb2, config_pb2, portnums_pb2
from meshtastic import remote_hardware, BROADCAST_ADDR
from meshtastic.version import get_active_version from meshtastic.version import get_active_version
from meshtastic.ble_interface import BLEInterface from meshtastic.ble_interface import BLEInterface
from meshtastic.mesh_interface import MeshInterface from meshtastic.mesh_interface import MeshInterface
@@ -226,13 +227,14 @@ def setPref(config, comp_name, valStr) -> bool:
config_values = getattr(config_part, config_type.name) config_values = getattr(config_part, config_type.name)
setattr(config_values, pref.name, valStr) setattr(config_values, pref.name, valStr)
else: else:
config_values = getattr(config, config_type.name)
if val == 0: if val == 0:
# clear values # clear values
print("Clearing ignore_incoming list") print("Clearing ignore_incoming list")
del config_type.message_type.ignore_incoming[:] del config_values.ignore_incoming[:]
else: else:
print(f"Adding '{val}' to the ignore_incoming list") print(f"Adding '{val}' to the ignore_incoming list")
config_type.message_type.ignore_incoming.extend([val]) config_values.ignore_incoming.extend([int(valStr)])
prefix = f"{'.'.join(name[0:-1])}." if config_type.message_type is not None else "" prefix = f"{'.'.join(name[0:-1])}." if config_type.message_type is not None else ""
if mt_config.camel_case: if mt_config.camel_case:
@@ -256,34 +258,41 @@ def onConnected(interface):
if not args.export_config: if not args.export_config:
print("Connected to radio") print("Connected to radio")
if args.setlat or args.setlon or args.setalt: if args.remove_position:
if args.dest != BROADCAST_ADDR:
print("Setting positions of remote nodes is not supported.")
return
closeNow = True
print("Removing fixed position and disabling fixed position setting")
interface.localNode.removeFixedPosition()
elif args.setlat or args.setlon or args.setalt:
if args.dest != BROADCAST_ADDR: if args.dest != BROADCAST_ADDR:
print("Setting latitude, longitude, and altitude of remote nodes is not supported.") print("Setting latitude, longitude, and altitude of remote nodes is not supported.")
return return
closeNow = True closeNow = True
alt = 0 alt = 0
lat = 0.0 lat = 0
lon = 0.0 lon = 0
# TODO: use getNode(args.dest) to be able to set it for a remote node
localConfig = interface.localNode.localConfig
if args.setalt: if args.setalt:
alt = int(args.setalt) alt = int(args.setalt)
localConfig.position.fixed_position = True
print(f"Fixing altitude at {alt} meters") print(f"Fixing altitude at {alt} meters")
if args.setlat: if args.setlat:
lat = float(args.setlat) try:
localConfig.position.fixed_position = True lat = int(args.setlat)
except ValueError:
lat = float(args.setlat)
print(f"Fixing latitude at {lat} degrees") print(f"Fixing latitude at {lat} degrees")
if args.setlon: if args.setlon:
lon = float(args.setlon) try:
localConfig.position.fixed_position = True lon = int(args.setlon)
except ValueError:
lon = float(args.setlon)
print(f"Fixing longitude at {lon} degrees") print(f"Fixing longitude at {lon} degrees")
print("Setting device position") print("Setting device position and enabling fixed position setting")
# can include lat/long/alt etc: latitude = 37.5, longitude = -122.1 # can include lat/long/alt etc: latitude = 37.5, longitude = -122.1
interface.sendPosition(lat, lon, alt) interface.localNode.setFixedPosition(lat, lon, alt)
interface.localNode.writeConfig("position")
elif not args.no_time: elif not args.no_time:
# We normally provide a current time to the mesh when we connect # We normally provide a current time to the mesh when we connect
if interface.localNode.nodeNum in interface.nodesByNum and "position" in interface.nodesByNum[interface.localNode.nodeNum]: if interface.localNode.nodeNum in interface.nodesByNum and "position" in interface.nodesByNum[interface.localNode.nodeNum]:
@@ -722,6 +731,10 @@ def onConnected(interface):
ch = interface.getNode(args.dest).channels[channelIndex] ch = interface.getNode(args.dest).channels[channelIndex]
if args.ch_enable or args.ch_disable: if args.ch_enable or args.ch_disable:
print(
"Warning: --ch-enable and --ch-disable can produce noncontiguous channels, "
"which can cause errors in some clients. Whenever possible, use --ch-add and --ch-del instead."
)
if channelIndex == 0: if channelIndex == 0:
meshtastic.util.our_exit( meshtastic.util.our_exit(
"Warning: Cannot enable/disable PRIMARY channel." "Warning: Cannot enable/disable PRIMARY channel."
@@ -858,6 +871,10 @@ def onConnected(interface):
) )
interface.getNode(args.dest, False).iface.waitForAckNak() interface.getNode(args.dest, False).iface.waitForAckNak()
if args.wait_to_disconnect:
print(f"Waiting {args.wait_to_disconnect} seconds before disconnecting" )
time.sleep(int(args.wait_to_disconnect))
# if the user didn't ask for serial debugging output, we might want to exit after we've done our operation # if the user didn't ask for serial debugging output, we might want to exit after we've done our operation
if (not args.seriallog) and closeNow: if (not args.seriallog) and closeNow:
interface.close() # after running command then exit interface.close() # after running command then exit
@@ -1025,20 +1042,15 @@ def common():
subscribe() subscribe()
if args.ble_scan: if args.ble_scan:
logging.debug("BLE scan starting") logging.debug("BLE scan starting")
client = BLEInterface(None, debugOut=logfile, noProto=args.noproto) for x in BLEInterface.scan():
try: print(f"Found: name='{x.name}' address='{x.address}'")
for x in client.scan():
print(f"Found: name='{x[1].local_name}' address='{x[0].address}'")
finally:
client.close()
meshtastic.util.our_exit("BLE scan finished", 0) meshtastic.util.our_exit("BLE scan finished", 0)
return
elif args.ble: elif args.ble:
client = BLEInterface(args.ble, debugOut=logfile, noProto=args.noproto) client = BLEInterface(args.ble if args.ble != "any" else None, debugOut=logfile, noProto=args.noproto, noNodes=args.no_nodes)
elif args.host: elif args.host:
try: try:
client = meshtastic.tcp_interface.TCPInterface( client = meshtastic.tcp_interface.TCPInterface(
args.host, debugOut=logfile, noProto=args.noproto args.host, debugOut=logfile, noProto=args.noproto, noNodes=args.no_nodes
) )
except Exception as ex: except Exception as ex:
meshtastic.util.our_exit( meshtastic.util.our_exit(
@@ -1047,7 +1059,7 @@ def common():
else: else:
try: try:
client = meshtastic.serial_interface.SerialInterface( client = meshtastic.serial_interface.SerialInterface(
args.port, debugOut=logfile, noProto=args.noproto args.port, debugOut=logfile, noProto=args.noproto, noNodes=args.no_nodes
) )
except PermissionError as ex: except PermissionError as ex:
username = os.getlogin() username = os.getlogin()
@@ -1062,7 +1074,7 @@ def common():
if client.devPath is None: if client.devPath is None:
try: try:
client = meshtastic.tcp_interface.TCPInterface( client = meshtastic.tcp_interface.TCPInterface(
"localhost", debugOut=logfile, noProto=args.noproto "localhost", debugOut=logfile, noProto=args.noproto, noNodes=args.no_nodes
) )
except Exception as ex: except Exception as ex:
meshtastic.util.our_exit( meshtastic.util.our_exit(
@@ -1102,8 +1114,10 @@ def addConnectionArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParse
group.add_argument( group.add_argument(
"--ble", "--ble",
help="The BLE device address or name to connect to", help="Connect to a BLE device, optionally specifying a device name (defaults to 'any')",
nargs="?",
default=None, default=None,
const="any"
) )
return parser return parser
@@ -1351,7 +1365,7 @@ def initParser():
group.add_argument( group.add_argument(
"--request-position", "--request-position",
help="Request the position from a nade. " help="Request the position from a node. "
"You need to pass the destination ID as an argument with '--dest'. " "You need to pass the destination ID as an argument with '--dest'. "
"For repeaters, the nodeNum is required.", "For repeaters, the nodeNum is required.",
action="store_true", action="store_true",
@@ -1437,12 +1451,32 @@ def initParser():
action="store_true", action="store_true",
) )
group.add_argument("--setalt", help="Set device altitude in meters (allows use without GPS)") group.add_argument(
"--no-nodes",
group.add_argument("--setlat", help="Set device latitude (allows use without GPS)") help="Request that the node not send node info to the client. "
"Will break things that depend on the nodedb, but will speed up startup. Requires 2.3.11+ firmware.",
action="store_true",
)
group.add_argument( group.add_argument(
"--setlon", help="Set device longitude (allows use without GPS)" "--setalt",
help="Set device altitude in meters (allows use without GPS), and enable fixed position.",
)
group.add_argument(
"--setlat",
help="Set device latitude (allows use without GPS), and enable fixed position. Accepts a decimal value or an integer premultiplied by 1e7.",
)
group.add_argument(
"--setlon",
help="Set device longitude (allows use without GPS), and enable fixed position. Accepts a decimal value or an integer premultiplied by 1e7.",
)
group.add_argument(
"--remove-position",
help="Clear any existing fixed position and disable fixed position.",
action="store_true",
) )
group.add_argument( group.add_argument(
@@ -1470,6 +1504,14 @@ def initParser():
action="store_true", action="store_true",
) )
group.add_argument(
"--wait-to-disconnect",
help="How many seconds to wait before disconnecting from the device.",
const="5",
nargs="?",
action="store",
)
group.add_argument( group.add_argument(
"--noproto", "--noproto",
help="Don't start the API, just function as a dumb serial terminal.", help="Don't start the API, just function as a dumb serial terminal.",

View File

@@ -1,39 +0,0 @@
# -*- 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)

View File

@@ -1,28 +0,0 @@
# -*- 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)

View File

@@ -1,40 +0,0 @@
# -*- 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)

View File

@@ -1,139 +1,173 @@
"""Bluetooth interface """Bluetooth interface
""" """
import logging
import time
import struct
import asyncio import asyncio
from threading import Thread, Event import atexit
from bleak import BleakScanner, BleakClient import logging
import struct
import time
from threading import Thread
from typing import Optional
import print_color # type: ignore[import-untyped]
from bleak import BleakClient, BleakScanner, BLEDevice
from bleak.exc import BleakDBusError, BleakError
from meshtastic.mesh_interface import MeshInterface from meshtastic.mesh_interface import MeshInterface
from meshtastic.util import our_exit
SERVICE_UUID = "6ba1b218-15a8-461f-9fa8-5dcae273eafd" SERVICE_UUID = "6ba1b218-15a8-461f-9fa8-5dcae273eafd"
TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7" TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7"
FROMRADIO_UUID = "2c55e69e-4993-11ed-b878-0242ac120002" FROMRADIO_UUID = "2c55e69e-4993-11ed-b878-0242ac120002"
FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453" FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453"
LOGRADIO_UUID = "6c6fd238-78fa-436b-aacf-15c5be1ef2e2"
class BLEInterface(MeshInterface): class BLEInterface(MeshInterface):
"""MeshInterface using BLE to connect to devices""" """MeshInterface using BLE to connect to devices."""
class BLEError(Exception): class BLEError(Exception):
"""An exception class for BLE errors""" """An exception class for BLE errors."""
def __init__(self, message):
self.message = message
super().__init__(self.message)
class BLEState(): # pylint: disable=C0115 def __init__(
THREADS = False self,
BLE = False address: Optional[str],
MESH = False noProto: bool = False,
debugOut=None,
noNodes: bool = False,
def __init__(self, address, noProto = False, debugOut = None): ):
self.state = BLEInterface.BLEState() MeshInterface.__init__(
self, debugOut=debugOut, noProto=noProto, noNodes=noNodes
if not address: )
return
self.should_read = False self.should_read = False
logging.debug("Threads starting") logging.debug("Threads starting")
self._receiveThread = Thread(target = self._receiveFromRadioImpl) self._want_receive = True
self._receiveThread_started = Event() self._receiveThread: Optional[Thread] = Thread(
self._receiveThread_stopped = Event() target=self._receiveFromRadioImpl, name="BLEReceive", daemon=True
)
self._receiveThread.start() self._receiveThread.start()
self._receiveThread_started.wait(1)
self.state.THREADS = True
logging.debug("Threads running") logging.debug("Threads running")
try: try:
logging.debug(f"BLE connecting to: {address}") logging.debug(f"BLE connecting to: {address if address else 'any'}")
self.client = self.connect(address) self.client: Optional[BLEClient] = self.connect(address)
self.state.BLE = True
logging.debug("BLE connected") logging.debug("BLE connected")
except BLEInterface.BLEError as e: except BLEInterface.BLEError as e:
self.close() self.close()
our_exit(e.message, 1) raise e
return
logging.debug("Mesh init starting") self.client.start_notify(LOGRADIO_UUID, self.log_radio_handler)
MeshInterface.__init__(self, debugOut = debugOut, noProto = noProto)
logging.debug("Mesh configure starting")
self._startConfig() self._startConfig()
if not self.noProto: if not self.noProto:
self._waitConnected(timeout = 60.0) self._waitConnected(timeout=60.0)
self.waitForConfig() self.waitForConfig()
self.state.MESH = True
logging.debug("Mesh init finished")
logging.debug("Register FROMNUM notify callback") logging.debug("Register FROMNUM notify callback")
self.client.start_notify(FROMNUM_UUID, self.from_num_handler) self.client.start_notify(FROMNUM_UUID, self.from_num_handler)
# We MUST run atexit (if we can) because otherwise (at least on linux) the BLE device is not disconnected
# and future connection attempts will fail. (BlueZ kinda sucks)
# Note: the on disconnected callback will call our self.close which will make us nicely wait for threads to exit
self._exit_handler = atexit.register(self.client.disconnect)
async def from_num_handler(self, _, b): # pylint: disable=C0116 def from_num_handler(self, _, b): # pylint: disable=C0116
from_num = struct.unpack('<I', bytes(b))[0] """Handle callbacks for fromnum notify.
Note: this method does not need to be async because it is just setting a bool.
"""
from_num = struct.unpack("<I", bytes(b))[0]
logging.debug(f"FROMNUM notify: {from_num}") logging.debug(f"FROMNUM notify: {from_num}")
self.should_read = True self.should_read = True
async def log_radio_handler(self, _, b): # pylint: disable=C0116
log_radio = b.decode("utf-8").replace("\n", "")
if log_radio.startswith("DEBUG"):
print_color.print(log_radio, color="cyan", end=None)
elif log_radio.startswith("INFO"):
print_color.print(log_radio, color="white", end=None)
elif log_radio.startswith("WARN"):
print_color.print(log_radio, color="yellow", end=None)
elif log_radio.startswith("ERROR"):
print_color.print(log_radio, color="red", end=None)
else:
print_color.print(log_radio, end=None)
def scan(self): @staticmethod
"Scan for available BLE devices" def scan() -> list[BLEDevice]:
"""Scan for available BLE devices."""
with BLEClient() as client: with BLEClient() as client:
return [ logging.info("Scanning for BLE devices (takes 10 seconds)...")
(x[0], x[1]) for x in (client.discover( response = client.discover(
return_adv = True, timeout=10, return_adv=True, service_uuids=[SERVICE_UUID]
service_uuids = [ SERVICE_UUID ] )
)).values()
]
devices = response.values()
def find_device(self, address): # bleak sometimes returns devices we didn't ask for, so filter the response
"Find a device by address" # to only return true meshtastic devices
meshtastic_devices = self.scan() # d[0] is the device. d[1] is the advertisement data
devices = list(
filter(lambda d: SERVICE_UUID in d[1].service_uuids, devices)
)
return list(map(lambda d: d[0], devices))
addressed_devices = list(filter(lambda x: address in (x[1].local_name, x[0].name), meshtastic_devices)) def find_device(self, address: Optional[str]) -> BLEDevice:
# If nothing is found try on the address """Find a device by address."""
if len(addressed_devices) == 0:
addressed_devices = list(filter( addressed_devices = BLEInterface.scan()
lambda x: BLEInterface._sanitize_address(address) == BLEInterface._sanitize_address(x[0].address),
meshtastic_devices)) if address:
addressed_devices = list(
filter(
lambda x: address in (x.name, x.address),
addressed_devices,
)
)
if len(addressed_devices) == 0: if len(addressed_devices) == 0:
raise BLEInterface.BLEError(f"No Meshtastic BLE peripheral with identifier or address '{address}' found. Try --ble-scan to find it.") raise BLEInterface.BLEError(
f"No Meshtastic BLE peripheral with identifier or address '{address}' found. Try --ble-scan to find it."
)
if len(addressed_devices) > 1: if len(addressed_devices) > 1:
raise BLEInterface.BLEError(f"More than one Meshtastic BLE peripheral with identifier or address '{address}' found.") raise BLEInterface.BLEError(
return addressed_devices[0][0] f"More than one Meshtastic BLE peripheral with identifier or address '{address}' found."
)
return addressed_devices[0]
def _sanitize_address(address): # pylint: disable=E0213 def _sanitize_address(address): # pylint: disable=E0213
"Standardize BLE address by removing extraneous characters and lowercasing" "Standardize BLE address by removing extraneous characters and lowercasing."
return address \ return address.replace("-", "").replace("_", "").replace(":", "").lower()
.replace("-", "") \
.replace("_", "") \
.replace(":", "") \
.lower()
def connect(self, address): def connect(self, address: Optional[str] = None) -> "BLEClient":
"Connect to a device by address" "Connect to a device by address."
# Bleak docs recommend always doing a scan before connecting (even if we know addr)
device = self.find_device(address) device = self.find_device(address)
client = BLEClient(device.address) client = BLEClient(device.address, disconnected_callback=lambda _: self.close)
client.connect() client.connect()
try: client.discover()
client.pair()
except NotImplementedError:
# Some bluetooth backends do not require explicit pairing.
# See Bleak docs for details on this.
pass
return client return client
def _receiveFromRadioImpl(self): def _receiveFromRadioImpl(self):
self._receiveThread_started.set() while self._want_receive:
while self._receiveThread_started.is_set():
if self.should_read: if self.should_read:
self.should_read = False self.should_read = False
retries = 0 retries = 0
while True: while self._want_receive:
b = bytes(self.client.read_gatt_char(FROMRADIO_UUID)) try:
b = bytes(self.client.read_gatt_char(FROMRADIO_UUID))
except BleakDBusError as e:
# Device disconnected probably, so end our read loop immediately
logging.debug(f"Device disconnected, shutting down {e}")
self._want_receive = False
except BleakError as e:
# We were definitely disconnected
if "Not connected" in str(e):
logging.debug(f"Device disconnected, shutting down {e}")
self._want_receive = False
else:
raise BLEInterface.BLEError("Error reading BLE") from e
if not b: if not b:
if retries < 5: if retries < 5:
time.sleep(0.1) time.sleep(0.1)
@@ -143,40 +177,52 @@ class BLEInterface(MeshInterface):
logging.debug(f"FROMRADIO read: {b.hex()}") logging.debug(f"FROMRADIO read: {b.hex()}")
self._handleFromRadio(b) self._handleFromRadio(b)
else: else:
time.sleep(0.1) time.sleep(0.01)
self._receiveThread_stopped.set()
def _sendToRadioImpl(self, toRadio): def _sendToRadioImpl(self, toRadio):
b = toRadio.SerializeToString() b = toRadio.SerializeToString()
if b: if b:
logging.debug(f"TORADIO write: {b.hex()}") logging.debug(f"TORADIO write: {b.hex()}")
self.client.write_gatt_char(TORADIO_UUID, b, response = True) try:
self.client.write_gatt_char(
TORADIO_UUID, b, response=True
) # FIXME: or False?
# search Bleak src for org.bluez.Error.InProgress
except Exception as e:
raise BLEInterface.BLEError(
"Error writing BLE (are you in the 'bluetooth' user group? did you enter the pairing PIN on your computer?)"
) from e
# Allow to propagate and then make sure we read # Allow to propagate and then make sure we read
time.sleep(0.1) time.sleep(0.01)
self.should_read = True self.should_read = True
def close(self): def close(self):
if self.state.MESH: atexit.unregister(self._exit_handler)
try:
MeshInterface.close(self) MeshInterface.close(self)
except Exception as e:
logging.error(f"Error closing mesh interface: {e}")
if self.state.THREADS: if self._want_receive:
self._receiveThread_started.clear() self.want_receive = False # Tell the thread we want it to stop
self._receiveThread_stopped.wait(5) self._receiveThread.join()
self._receiveThread = None
if self.state.BLE: if self.client:
self.client.disconnect() self.client.disconnect()
self.client.close() self.client.close()
self.client = None
class BLEClient(): class BLEClient:
"""Client for managing connection to a BLE device""" """Client for managing connection to a BLE device"""
def __init__(self, address = None, **kwargs):
self._eventThread = Thread(target = self._run_event_loop) def __init__(self, address=None, **kwargs):
self._eventThread_started = Event() self._eventLoop = asyncio.new_event_loop()
self._eventThread_stopped = Event() self._eventThread = Thread(
target=self._run_event_loop, name="BLEClient", daemon=True
)
self._eventThread.start() self._eventThread.start()
self._eventThread_started.wait(1)
if not address: if not address:
logging.debug("No address provided - only discover method will work.") logging.debug("No address provided - only discover method will work.")
@@ -184,31 +230,30 @@ class BLEClient():
self.bleak_client = BleakClient(address, **kwargs) self.bleak_client = BleakClient(address, **kwargs)
def discover(self, **kwargs): # pylint: disable=C0116
def discover(self, **kwargs): # pylint: disable=C0116
return self.async_await(BleakScanner.discover(**kwargs)) return self.async_await(BleakScanner.discover(**kwargs))
def pair(self, **kwargs): # pylint: disable=C0116 def pair(self, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.pair(**kwargs)) return self.async_await(self.bleak_client.pair(**kwargs))
def connect(self, **kwargs): # pylint: disable=C0116 def connect(self, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.connect(**kwargs)) return self.async_await(self.bleak_client.connect(**kwargs))
def disconnect(self, **kwargs): # pylint: disable=C0116 def disconnect(self, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.disconnect(**kwargs)) self.async_await(self.bleak_client.disconnect(**kwargs))
def read_gatt_char(self, *args, **kwargs): # pylint: disable=C0116 def read_gatt_char(self, *args, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.read_gatt_char(*args, **kwargs)) return self.async_await(self.bleak_client.read_gatt_char(*args, **kwargs))
def write_gatt_char(self, *args, **kwargs): # pylint: disable=C0116 def write_gatt_char(self, *args, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.write_gatt_char(*args, **kwargs)) self.async_await(self.bleak_client.write_gatt_char(*args, **kwargs))
def start_notify(self, *args, **kwargs): # pylint: disable=C0116 def start_notify(self, *args, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.start_notify(*args, **kwargs)) self.async_await(self.bleak_client.start_notify(*args, **kwargs))
def close(self): # pylint: disable=C0116 def close(self): # pylint: disable=C0116
self.async_run(self._stop_event_loop()) self.async_run(self._stop_event_loop())
self._eventThread_stopped.wait(5) self._eventThread.join()
def __enter__(self): def __enter__(self):
return self return self
@@ -216,21 +261,17 @@ class BLEClient():
def __exit__(self, _type, _value, _traceback): def __exit__(self, _type, _value, _traceback):
self.close() self.close()
def async_await(self, coro, timeout = None): # pylint: disable=C0116 def async_await(self, coro, timeout=None): # pylint: disable=C0116
return self.async_run(coro).result(timeout) return self.async_run(coro).result(timeout)
def async_run(self, coro): # pylint: disable=C0116 def async_run(self, coro): # pylint: disable=C0116
return asyncio.run_coroutine_threadsafe(coro, self._eventLoop) return asyncio.run_coroutine_threadsafe(coro, self._eventLoop)
def _run_event_loop(self): def _run_event_loop(self):
# I don't know if the event loop can be initialized in __init__ so silencing pylint
self._eventLoop = asyncio.new_event_loop() # pylint: disable=W0201
self._eventThread_started.set()
try: try:
self._eventLoop.run_forever() self._eventLoop.run_forever()
finally: finally:
self._eventLoop.close() self._eventLoop.close()
self._eventThread_stopped.set()
async def _stop_event_loop(self): async def _stop_event_loop(self):
self._eventLoop.stop() self._eventLoop.stop()

View File

@@ -1,34 +0,0 @@
# -*- 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\",\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\"\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=271
_CHANNEL._serialized_start=274
_CHANNEL._serialized_end=435
_CHANNEL_ROLE._serialized_start=387
_CHANNEL_ROLE._serialized_end=435
# @@protoc_insertion_point(module_scope)

View File

@@ -1,27 +0,0 @@
# -*- 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)

View File

@@ -1,77 +0,0 @@
"""
@generated by mypy-protobuf. Do not edit manually!
isort:skip_file
"""
import builtins
import google.protobuf.descriptor
import google.protobuf.message
import meshtastic.localonly_pb2
import sys
import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final
class DeviceProfile(google.protobuf.message.Message):
"""
This abstraction is used to contain any configuration for provisioning a node on any client.
It is useful for importing and exporting configurations.
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
LONG_NAME_FIELD_NUMBER: builtins.int
SHORT_NAME_FIELD_NUMBER: builtins.int
CHANNEL_URL_FIELD_NUMBER: builtins.int
CONFIG_FIELD_NUMBER: builtins.int
MODULE_CONFIG_FIELD_NUMBER: builtins.int
long_name: builtins.str
"""
Long name for the node
"""
short_name: builtins.str
"""
Short name of the node
"""
channel_url: builtins.str
"""
The url of the channels from our node
"""
@property
def config(self) -> meshtastic.localonly_pb2.LocalConfig:
"""
The Config of the node
"""
@property
def module_config(self) -> meshtastic.localonly_pb2.LocalModuleConfig:
"""
The ModuleConfig of the node
"""
def __init__(
self,
*,
long_name: builtins.str | None = ...,
short_name: builtins.str | None = ...,
channel_url: builtins.str | None = ...,
config: meshtastic.localonly_pb2.LocalConfig | None = ...,
module_config: meshtastic.localonly_pb2.LocalModuleConfig | None = ...,
) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_channel_url", b"_channel_url"]) -> typing_extensions.Literal["channel_url"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_config", b"_config"]) -> typing_extensions.Literal["config"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_long_name", b"_long_name"]) -> typing_extensions.Literal["long_name"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_module_config", b"_module_config"]) -> typing_extensions.Literal["module_config"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_short_name", b"_short_name"]) -> typing_extensions.Literal["short_name"] | None: ...
global___DeviceProfile = DeviceProfile

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,36 +0,0 @@
# -*- 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)

View File

@@ -1,46 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/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 import channel_pb2 as meshtastic_dot_channel__pb2
from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2
from . import nanopb_pb2 as nanopb__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/deviceonly.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x1ameshtastic/localonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x0cnanopb.proto\"\x90\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\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\"\x86\x02\n\x0cNodeInfoLite\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 \x01(\x0b\x32\x18.meshtastic.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"\xc3\x03\n\x0b\x44\x65viceState\x12\'\n\x07my_node\x18\x02 \x01(\x0b\x32\x16.meshtastic.MyNodeInfo\x12\x1f\n\x05owner\x18\x03 \x01(\x0b\x32\x10.meshtastic.User\x12-\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x16.meshtastic.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12/\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\x12+\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x44\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32!.meshtastic.NodeRemoteHardwarePin\x12Z\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32\x18.meshtastic.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"E\n\x0b\x43hannelFile\x12%\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x13.meshtastic.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x97\x02\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12)\n\x08oem_font\x18\x04 \x01(\x0e\x32\x17.meshtastic.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12\x31\n\x10oem_local_config\x18\x07 \x01(\x0b\x32\x17.meshtastic.LocalConfig\x12>\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32\x1d.meshtastic.LocalModuleConfig*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42m\n\x13\x63om.geeksville.meshB\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.deviceonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_DEVICESTATE.fields_by_name['no_save']._options = None
_DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
_DEVICESTATE.fields_by_name['node_db_lite']._options = None
_DEVICESTATE.fields_by_name['node_db_lite']._serialized_options = b'\222?\'\222\001$std::vector<meshtastic_NodeInfoLite>'
_SCREENFONTS._serialized_start=1413
_SCREENFONTS._serialized_end=1475
_POSITIONLITE._serialized_start=195
_POSITIONLITE._serialized_end=339
_NODEINFOLITE._serialized_start=342
_NODEINFOLITE._serialized_end=604
_DEVICESTATE._serialized_start=607
_DEVICESTATE._serialized_end=1058
_CHANNELFILE._serialized_start=1060
_CHANNELFILE._serialized_end=1129
_OEMSTORE._serialized_start=1132
_OEMSTORE._serialized_end=1411
# @@protoc_insertion_point(module_scope)

View File

@@ -1,30 +0,0 @@
# -*- 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)

View File

@@ -1,204 +0,0 @@
"""
@generated by mypy-protobuf. Do not edit manually!
isort:skip_file
"""
import builtins
import google.protobuf.descriptor
import google.protobuf.message
import meshtastic.config_pb2
import meshtastic.module_config_pb2
import sys
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final
class LocalConfig(google.protobuf.message.Message):
"""
Protobuf structures common to apponly.proto and deviceonly.proto
This is never sent over the wire, only for local use
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
DEVICE_FIELD_NUMBER: builtins.int
POSITION_FIELD_NUMBER: builtins.int
POWER_FIELD_NUMBER: builtins.int
NETWORK_FIELD_NUMBER: builtins.int
DISPLAY_FIELD_NUMBER: builtins.int
LORA_FIELD_NUMBER: builtins.int
BLUETOOTH_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
@property
def device(self) -> meshtastic.config_pb2.Config.DeviceConfig:
"""
The part of the config that is specific to the Device
"""
@property
def position(self) -> meshtastic.config_pb2.Config.PositionConfig:
"""
The part of the config that is specific to the GPS Position
"""
@property
def power(self) -> meshtastic.config_pb2.Config.PowerConfig:
"""
The part of the config that is specific to the Power settings
"""
@property
def network(self) -> meshtastic.config_pb2.Config.NetworkConfig:
"""
The part of the config that is specific to the Wifi Settings
"""
@property
def display(self) -> meshtastic.config_pb2.Config.DisplayConfig:
"""
The part of the config that is specific to the Display
"""
@property
def lora(self) -> meshtastic.config_pb2.Config.LoRaConfig:
"""
The part of the config that is specific to the Lora Radio
"""
@property
def bluetooth(self) -> meshtastic.config_pb2.Config.BluetoothConfig:
"""
The part of the config that is specific to the Bluetooth settings
"""
version: builtins.int
"""
A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code.
"""
def __init__(
self,
*,
device: meshtastic.config_pb2.Config.DeviceConfig | None = ...,
position: meshtastic.config_pb2.Config.PositionConfig | None = ...,
power: meshtastic.config_pb2.Config.PowerConfig | None = ...,
network: meshtastic.config_pb2.Config.NetworkConfig | None = ...,
display: meshtastic.config_pb2.Config.DisplayConfig | None = ...,
lora: meshtastic.config_pb2.Config.LoRaConfig | None = ...,
bluetooth: meshtastic.config_pb2.Config.BluetoothConfig | None = ...,
version: builtins.int = ...,
) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "version", b"version"]) -> None: ...
global___LocalConfig = LocalConfig
@typing_extensions.final
class LocalModuleConfig(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor
MQTT_FIELD_NUMBER: builtins.int
SERIAL_FIELD_NUMBER: builtins.int
EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int
STORE_FORWARD_FIELD_NUMBER: builtins.int
RANGE_TEST_FIELD_NUMBER: builtins.int
TELEMETRY_FIELD_NUMBER: builtins.int
CANNED_MESSAGE_FIELD_NUMBER: builtins.int
AUDIO_FIELD_NUMBER: builtins.int
REMOTE_HARDWARE_FIELD_NUMBER: builtins.int
NEIGHBOR_INFO_FIELD_NUMBER: builtins.int
AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int
DETECTION_SENSOR_FIELD_NUMBER: builtins.int
PAXCOUNTER_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
@property
def mqtt(self) -> meshtastic.module_config_pb2.ModuleConfig.MQTTConfig:
"""
The part of the config that is specific to the MQTT module
"""
@property
def serial(self) -> meshtastic.module_config_pb2.ModuleConfig.SerialConfig:
"""
The part of the config that is specific to the Serial module
"""
@property
def external_notification(self) -> meshtastic.module_config_pb2.ModuleConfig.ExternalNotificationConfig:
"""
The part of the config that is specific to the ExternalNotification module
"""
@property
def store_forward(self) -> meshtastic.module_config_pb2.ModuleConfig.StoreForwardConfig:
"""
The part of the config that is specific to the Store & Forward module
"""
@property
def range_test(self) -> meshtastic.module_config_pb2.ModuleConfig.RangeTestConfig:
"""
The part of the config that is specific to the RangeTest module
"""
@property
def telemetry(self) -> meshtastic.module_config_pb2.ModuleConfig.TelemetryConfig:
"""
The part of the config that is specific to the Telemetry module
"""
@property
def canned_message(self) -> meshtastic.module_config_pb2.ModuleConfig.CannedMessageConfig:
"""
The part of the config that is specific to the Canned Message module
"""
@property
def audio(self) -> meshtastic.module_config_pb2.ModuleConfig.AudioConfig:
"""
The part of the config that is specific to the Audio module
"""
@property
def remote_hardware(self) -> meshtastic.module_config_pb2.ModuleConfig.RemoteHardwareConfig:
"""
The part of the config that is specific to the Remote Hardware module
"""
@property
def neighbor_info(self) -> meshtastic.module_config_pb2.ModuleConfig.NeighborInfoConfig:
"""
The part of the config that is specific to the Neighbor Info module
"""
@property
def ambient_lighting(self) -> meshtastic.module_config_pb2.ModuleConfig.AmbientLightingConfig:
"""
The part of the config that is specific to the Ambient Lighting module
"""
@property
def detection_sensor(self) -> meshtastic.module_config_pb2.ModuleConfig.DetectionSensorConfig:
"""
The part of the config that is specific to the Detection Sensor module
"""
@property
def paxcounter(self) -> meshtastic.module_config_pb2.ModuleConfig.PaxcounterConfig:
"""
Paxcounter Config
"""
version: builtins.int
"""
A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code.
"""
def __init__(
self,
*,
mqtt: meshtastic.module_config_pb2.ModuleConfig.MQTTConfig | None = ...,
serial: meshtastic.module_config_pb2.ModuleConfig.SerialConfig | None = ...,
external_notification: meshtastic.module_config_pb2.ModuleConfig.ExternalNotificationConfig | None = ...,
store_forward: meshtastic.module_config_pb2.ModuleConfig.StoreForwardConfig | None = ...,
range_test: meshtastic.module_config_pb2.ModuleConfig.RangeTestConfig | None = ...,
telemetry: meshtastic.module_config_pb2.ModuleConfig.TelemetryConfig | None = ...,
canned_message: meshtastic.module_config_pb2.ModuleConfig.CannedMessageConfig | None = ...,
audio: meshtastic.module_config_pb2.ModuleConfig.AudioConfig | None = ...,
remote_hardware: meshtastic.module_config_pb2.ModuleConfig.RemoteHardwareConfig | None = ...,
neighbor_info: meshtastic.module_config_pb2.ModuleConfig.NeighborInfoConfig | None = ...,
ambient_lighting: meshtastic.module_config_pb2.ModuleConfig.AmbientLightingConfig | None = ...,
detection_sensor: meshtastic.module_config_pb2.ModuleConfig.DetectionSensorConfig | None = ...,
paxcounter: meshtastic.module_config_pb2.ModuleConfig.PaxcounterConfig | None = ...,
version: builtins.int = ...,
) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry", "version", b"version"]) -> None: ...
global___LocalModuleConfig = LocalModuleConfig

View File

@@ -9,22 +9,26 @@ import sys
import threading import threading
import time import time
from datetime import datetime from datetime import datetime
from decimal import Decimal
from typing import Any, Callable, Dict, List, Optional, Union from typing import Any, Callable, Dict, List, Optional, Union
import google.protobuf.json_format import google.protobuf.json_format
import timeago # type: ignore[import-untyped]
from pubsub import pub # type: ignore[import-untyped] from pubsub import pub # type: ignore[import-untyped]
from tabulate import tabulate from tabulate import tabulate
import meshtastic.node import meshtastic.node
from meshtastic import (
from meshtastic.protobuf import (
mesh_pb2, mesh_pb2,
portnums_pb2, portnums_pb2,
telemetry_pb2, telemetry_pb2,
)
from meshtastic import (
BROADCAST_ADDR, BROADCAST_ADDR,
BROADCAST_NUM, BROADCAST_NUM,
LOCAL_ADDR, LOCAL_ADDR,
NODELESS_WANT_CONFIG_ID,
ResponseHandler, ResponseHandler,
protocols, protocols,
publishingThread, publishingThread,
@@ -40,7 +44,30 @@ from meshtastic.util import (
) )
class MeshInterface: def _timeago(delta_secs: int) -> str:
"""Convert a number of seconds in the past into a short, friendly string
e.g. "now", "30 sec ago", "1 hour ago"
Zero or negative intervals simply return "now"
"""
intervals = (
("year", 60 * 60 * 24 * 365),
("month", 60 * 60 * 24 * 30),
("day", 60 * 60 * 24),
("hour", 60 * 60),
("min", 60),
("sec", 1),
)
for name, interval_duration in intervals:
if delta_secs < interval_duration:
continue
x = delta_secs // interval_duration
plur = "s" if x > 1 else ""
return f"{x} {name}{plur} ago"
return "now"
class MeshInterface: # pylint: disable=R0902
"""Interface class for meshtastic devices """Interface class for meshtastic devices
Properties: Properties:
@@ -56,12 +83,14 @@ class MeshInterface:
self.message = message self.message = message
super().__init__(self.message) super().__init__(self.message)
def __init__(self, debugOut=None, noProto: bool=False) -> None: def __init__(self, debugOut=None, noProto: bool=False, noNodes: bool=False) -> None:
"""Constructor """Constructor
Keyword Arguments: Keyword Arguments:
noProto -- If True, don't try to run our protocol on the noProto -- If True, don't try to run our protocol on the
link - just be a dumb serial client. link - just be a dumb serial client.
noNodes -- If True, instruct the node to not send its nodedb
on startup, just other configuration information.
""" """
self.debugOut = debugOut self.debugOut = debugOut
self.nodes: Optional[Dict[str,Dict]] = None # FIXME self.nodes: Optional[Dict[str,Dict]] = None # FIXME
@@ -80,11 +109,13 @@ class MeshInterface:
random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it random.seed() # FIXME, we should not clobber the random seedval here, instead tell user they must call it
self.currentPacketId: int = random.randint(0, 0xFFFFFFFF) self.currentPacketId: int = random.randint(0, 0xFFFFFFFF)
self.nodesByNum: Optional[Dict[int, Dict]] = None self.nodesByNum: Optional[Dict[int, Dict]] = None
self.configId: Optional[int] = None self.noNodes: bool = noNodes
self.configId: Optional[int] = NODELESS_WANT_CONFIG_ID if noNodes else None
self.gotResponse: bool = False # used in gpio read self.gotResponse: bool = False # used in gpio read
self.mask: Optional[int] = None # used in gpio read and gpio watch self.mask: Optional[int] = None # used in gpio read and gpio watch
self.queueStatus: Optional[mesh_pb2.QueueStatus] = None self.queueStatus: Optional[mesh_pb2.QueueStatus] = None
self.queue: collections.OrderedDict = collections.OrderedDict() self.queue: collections.OrderedDict = collections.OrderedDict()
self._localChannels = None
def close(self): def close(self):
"""Shutdown this interface""" """Shutdown this interface"""
@@ -133,7 +164,7 @@ class MeshInterface:
# use id as dictionary key for correct json format in list of nodes # use id as dictionary key for correct json format in list of nodes
nodeid = n2["user"]["id"] nodeid = n2["user"]["id"]
nodes[nodeid] = n2 nodes[nodeid] = n2
infos = owner + myinfo + metadata + mesh + json.dumps(nodes) infos = owner + myinfo + metadata + mesh + json.dumps(nodes, indent=2)
print(infos) print(infos)
return infos return infos
@@ -152,11 +183,13 @@ class MeshInterface:
def getTimeAgo(ts) -> Optional[str]: def getTimeAgo(ts) -> Optional[str]:
"""Format how long ago have we heard from this node (aka timeago).""" """Format how long ago have we heard from this node (aka timeago)."""
return ( if ts is None:
timeago.format(datetime.fromtimestamp(ts), datetime.now()) return None
if ts delta = datetime.now() - datetime.fromtimestamp(ts)
else None delta_secs = int(delta.total_seconds())
) if delta_secs < 0:
return None # not handling a timestamp from the future
return _timeago(delta_secs)
rows: List[Dict[str, Any]] = [] rows: List[Dict[str, Any]] = []
if self.nodesByNum: if self.nodesByNum:
@@ -165,7 +198,8 @@ class MeshInterface:
if not includeSelf and node["num"] == self.localNode.nodeNum: if not includeSelf and node["num"] == self.localNode.nodeNum:
continue continue
row = {"N": 0, "User": f"UNK: {node['num']}", "ID": f"!{node['num']:08x}"} presumptive_id = f"!{node['num']:08x}"
row = {"N": 0, "User": f"Meshtastic {presumptive_id[-4:]}", "ID": presumptive_id}
user = node.get("user") user = node.get("user")
if user: if user:
@@ -174,6 +208,7 @@ class MeshInterface:
"User": user.get("longName", "N/A"), "User": user.get("longName", "N/A"),
"AKA": user.get("shortName", "N/A"), "AKA": user.get("shortName", "N/A"),
"ID": user["id"], "ID": user["id"],
"Hardware": user.get("hwModel", "UNSET")
} }
) )
@@ -210,8 +245,8 @@ class MeshInterface:
row.update( row.update(
{ {
"SNR": formatFloat(node.get("snr"), 2, " dB"), "SNR": formatFloat(node.get("snr"), 2, " dB"),
"Hops Away": node.get("hopsAway", "unknown"), "Hops Away": node.get("hopsAway", "0/unknown"),
"Channel": node.get("channel"), "Channel": node.get("channel", 0),
"LastHeard": getLH(node.get("lastHeard")), "LastHeard": getLH(node.get("lastHeard")),
"Since": getTimeAgo(node.get("lastHeard")), "Since": getTimeAgo(node.get("lastHeard")),
} }
@@ -247,7 +282,7 @@ class MeshInterface:
destinationId: Union[int, str]=BROADCAST_ADDR, destinationId: Union[int, str]=BROADCAST_ADDR,
wantAck: bool=False, wantAck: bool=False,
wantResponse: bool=False, wantResponse: bool=False,
onResponse: Optional[Callable[[mesh_pb2.MeshPacket], Any]]=None, onResponse: Optional[Callable[[dict], Any]]=None,
channelIndex: int=0, channelIndex: int=0,
): ):
"""Send a utf8 string to some other node, if the node has a display it """Send a utf8 string to some other node, if the node has a display it
@@ -287,7 +322,8 @@ class MeshInterface:
portNum: portnums_pb2.PortNum.ValueType=portnums_pb2.PortNum.PRIVATE_APP, portNum: portnums_pb2.PortNum.ValueType=portnums_pb2.PortNum.PRIVATE_APP,
wantAck: bool=False, wantAck: bool=False,
wantResponse: bool=False, wantResponse: bool=False,
onResponse: Optional[Callable[[mesh_pb2.MeshPacket], Any]]=None, onResponse: Optional[Callable[[dict], Any]]=None,
onResponseAckPermitted: bool=False,
channelIndex: int=0, channelIndex: int=0,
): ):
"""Send a data packet to some other node """Send a data packet to some other node
@@ -307,6 +343,10 @@ class MeshInterface:
onResponse -- A closure of the form funct(packet), that will be onResponse -- A closure of the form funct(packet), that will be
called when a response packet arrives (or the transaction called when a response packet arrives (or the transaction
is NAKed due to non receipt) is NAKed due to non receipt)
onResponseAckPermitted -- should the onResponse callback be called
for regular ACKs (True) or just data responses & NAKs (False)
Note that if the onResponse callback is called 'onAckNak' this
will implicitly be true.
channelIndex - channel number to use channelIndex - channel number to use
Returns the sent packet. The id field will be populated in this packet Returns the sent packet. The id field will be populated in this packet
@@ -338,7 +378,7 @@ class MeshInterface:
if onResponse is not None: if onResponse is not None:
logging.debug(f"Setting a response handler for requestId {meshPacket.id}") logging.debug(f"Setting a response handler for requestId {meshPacket.id}")
self._addResponseHandler(meshPacket.id, onResponse) self._addResponseHandler(meshPacket.id, onResponse, ackPermitted=onResponseAckPermitted)
p = self._sendPacket(meshPacket, destinationId, wantAck=wantAck) p = self._sendPacket(meshPacket, destinationId, wantAck=wantAck)
return p return p
@@ -443,7 +483,7 @@ class MeshInterface:
waitFactor = min(len(self.nodes) - 1 if self.nodes else 0, hopLimit) waitFactor = min(len(self.nodes) - 1 if self.nodes else 0, hopLimit)
self.waitForTraceRoute(waitFactor) self.waitForTraceRoute(waitFactor)
def onResponseTraceRoute(self, p): def onResponseTraceRoute(self, p: dict):
"""on response for trace route""" """on response for trace route"""
routeDiscovery = mesh_pb2.RouteDiscovery() routeDiscovery = mesh_pb2.RouteDiscovery()
routeDiscovery.ParseFromString(p["decoded"]["payload"]) routeDiscovery.ParseFromString(p["decoded"]["payload"])
@@ -497,7 +537,7 @@ class MeshInterface:
if wantResponse: if wantResponse:
self.waitForTelemetry() self.waitForTelemetry()
def onResponseTelemetry(self, p): def onResponseTelemetry(self, p: dict):
"""on response for telemetry""" """on response for telemetry"""
if p["decoded"]["portnum"] == 'TELEMETRY_APP': if p["decoded"]["portnum"] == 'TELEMETRY_APP':
self._acknowledgment.receivedTelemetry = True self._acknowledgment.receivedTelemetry = True
@@ -520,8 +560,8 @@ class MeshInterface:
if p["decoded"]["routing"]["errorReason"] == 'NO_RESPONSE': if p["decoded"]["routing"]["errorReason"] == 'NO_RESPONSE':
our_exit("No response from node. At least firmware 2.1.22 is required on the destination node.") our_exit("No response from node. At least firmware 2.1.22 is required on the destination node.")
def _addResponseHandler(self, requestId: int, callback: Callable): def _addResponseHandler(self, requestId: int, callback: Callable[[dict], Any], ackPermitted: bool=False):
self.responseHandlers[requestId] = ResponseHandler(callback) self.responseHandlers[requestId] = ResponseHandler(callback=callback, ackPermitted=ackPermitted)
def _sendPacket(self, meshPacket: mesh_pb2.MeshPacket, destinationId: Union[int,str]=BROADCAST_ADDR, wantAck: bool=False): def _sendPacket(self, meshPacket: mesh_pb2.MeshPacket, destinationId: Union[int,str]=BROADCAST_ADDR, wantAck: bool=False):
"""Send a MeshPacket to the specified node (or if unspecified, broadcast). """Send a MeshPacket to the specified node (or if unspecified, broadcast).
@@ -682,6 +722,7 @@ class MeshInterface:
self.heartbeatTimer = threading.Timer(i, callback) self.heartbeatTimer = threading.Timer(i, callback)
self.heartbeatTimer.start() self.heartbeatTimer.start()
p = mesh_pb2.ToRadio() p = mesh_pb2.ToRadio()
p.heartbeat.CopyFrom(mesh_pb2.Heartbeat())
self._sendToRadio(p) self._sendToRadio(p)
callback() # run our periodic callback now, it will make another timer if necessary callback() # run our periodic callback now, it will make another timer if necessary
@@ -705,9 +746,11 @@ class MeshInterface:
self.myInfo = None self.myInfo = None
self.nodes = {} # nodes keyed by ID self.nodes = {} # nodes keyed by ID
self.nodesByNum = {} # nodes keyed by nodenum self.nodesByNum = {} # nodes keyed by nodenum
self._localChannels = [] # empty until we start getting channels pushed from the device (during config)
startConfig = mesh_pb2.ToRadio() startConfig = mesh_pb2.ToRadio()
self.configId = random.randint(0, 0xFFFFFFFF) if self.configId is None or not self.noNodes:
self.configId = random.randint(0, 0xFFFFFFFF)
startConfig.want_config_id = self.configId startConfig.want_config_id = self.configId
self._sendToRadio(startConfig) self._sendToRadio(startConfig)
@@ -786,7 +829,12 @@ class MeshInterface:
Done with initial config messages, now send regular MeshPackets Done with initial config messages, now send regular MeshPackets
to ask for settings and channels to ask for settings and channels
""" """
self.localNode.requestChannels() # This is no longer necessary because the current protocol statemachine has already proactively sent us the locally visible channels
# self.localNode.requestChannels()
self.localNode.setChannels(self._localChannels)
# the following should only be called after we have settings and channels
self._connected() # Tell everyone else we are ready to go
def _handleQueueStatusFromRadio(self, queueStatus) -> None: def _handleQueueStatusFromRadio(self, queueStatus) -> None:
self.queueStatus = queueStatus self.queueStatus = queueStatus
@@ -836,16 +884,18 @@ class MeshInterface:
logging.debug(f"Received device metadata: {stripnl(fromRadio.metadata)}") logging.debug(f"Received device metadata: {stripnl(fromRadio.metadata)}")
elif fromRadio.HasField("node_info"): elif fromRadio.HasField("node_info"):
node = asDict["nodeInfo"] logging.debug(f"Received nodeinfo: {asDict['nodeInfo']}")
node = self._getOrCreateByNum(asDict["nodeInfo"]["num"])
node.update(asDict["nodeInfo"])
try: try:
newpos = self._fixupPosition(node["position"]) newpos = self._fixupPosition(node["position"])
node["position"] = newpos node["position"] = newpos
except: except:
logging.debug("Node without position") logging.debug("Node without position")
logging.debug(f"Received nodeinfo: {node}") # no longer necessary since we're mutating directly in nodesByNum via _getOrCreateByNum
#self.nodesByNum[node["num"]] = node
self.nodesByNum[node["num"]] = node
if "user" in node: # Some nodes might not have user/ids assigned yet if "user" in node: # Some nodes might not have user/ids assigned yet
if "id" in node["user"]: if "id" in node["user"]:
self.nodes[node["user"]["id"]] = node self.nodes[node["user"]["id"]] = node
@@ -859,21 +909,36 @@ class MeshInterface:
# stream API fromRadio.config_complete_id # stream API fromRadio.config_complete_id
logging.debug(f"Config complete ID {self.configId}") logging.debug(f"Config complete ID {self.configId}")
self._handleConfigComplete() self._handleConfigComplete()
elif fromRadio.HasField("channel"):
self._handleChannel(fromRadio.channel)
elif fromRadio.HasField("packet"): elif fromRadio.HasField("packet"):
self._handlePacketFromRadio(fromRadio.packet) self._handlePacketFromRadio(fromRadio.packet)
elif fromRadio.HasField("queueStatus"): elif fromRadio.HasField("queueStatus"):
self._handleQueueStatusFromRadio(fromRadio.queueStatus) self._handleQueueStatusFromRadio(fromRadio.queueStatus)
elif fromRadio.rebooted: elif fromRadio.HasField("mqttClientProxyMessage"):
publishingThread.queueWork(
lambda: pub.sendMessage(
"meshtastic.mqttclientproxymessage", proxymessage=fromRadio.mqttClientProxyMessage, interface=self
)
)
elif fromRadio.HasField("xmodemPacket"):
publishingThread.queueWork(
lambda: pub.sendMessage(
"meshtastic.xmodempacket", packet=fromRadio.xmodemPacket, interface=self
)
)
elif fromRadio.HasField("rebooted") and fromRadio.rebooted:
# Tell clients the device went away. Careful not to call the overridden # Tell clients the device went away. Careful not to call the overridden
# subclass version that closes the serial port # subclass version that closes the serial port
MeshInterface._disconnected(self) MeshInterface._disconnected(self)
self._startConfig() # redownload the node db etc... self._startConfig() # redownload the node db etc...
elif fromRadio.config or fromRadio.moduleConfig: elif fromRadio.HasField("config") or fromRadio.HasField("moduleConfig"):
if fromRadio.config.HasField("device"): if fromRadio.config.HasField("device"):
self.localNode.localConfig.device.CopyFrom(fromRadio.config.device) self.localNode.localConfig.device.CopyFrom(fromRadio.config.device)
elif fromRadio.config.HasField("position"): elif fromRadio.config.HasField("position"):
@@ -951,9 +1016,9 @@ class MeshInterface:
Returns the position with the updated keys Returns the position with the updated keys
""" """
if "latitudeI" in position: if "latitudeI" in position:
position["latitude"] = position["latitudeI"] * 1e-7 position["latitude"] = float(position["latitudeI"] * Decimal("1e-7"))
if "longitudeI" in position: if "longitudeI" in position:
position["longitude"] = position["longitudeI"] * 1e-7 position["longitude"] = float(position["longitudeI"] * Decimal("1e-7"))
return position return position
def _nodeNumToId(self, num): def _nodeNumToId(self, num):
@@ -982,10 +1047,23 @@ class MeshInterface:
if nodeNum in self.nodesByNum: if nodeNum in self.nodesByNum:
return self.nodesByNum[nodeNum] return self.nodesByNum[nodeNum]
else: else:
n = {"num": nodeNum} # Create a minimal node db entry presumptive_id = f"!{nodeNum:08x}"
n = {
"num": nodeNum,
"user": {
"id": presumptive_id,
"longName": f"Meshtastic {presumptive_id[-4:]}",
"shortName": f"{presumptive_id[-4:]}",
"hwModel": "UNSET"
}
} # Create a minimal node db entry
self.nodesByNum[nodeNum] = n self.nodesByNum[nodeNum] = n
return n return n
def _handleChannel(self, channel):
"""During initial config the local node will proactively send all N (8) channels it knows"""
self._localChannels.append(channel)
def _handlePacketFromRadio(self, meshPacket, hack=False): def _handlePacketFromRadio(self, meshPacket, hack=False):
"""Handle a MeshPacket that just arrived from the radio """Handle a MeshPacket that just arrived from the radio
@@ -1083,16 +1161,18 @@ class MeshInterface:
requestId = decoded.get("requestId") requestId = decoded.get("requestId")
if requestId is not None: if requestId is not None:
logging.debug(f"Got a response for requestId {requestId}") logging.debug(f"Got a response for requestId {requestId}")
# We ignore ACK packets, but send NAKs and data responses to the handlers # We ignore ACK packets unless the callback is named `onAckNak`
# or the handler is set as ackPermitted, but send NAKs and
# other, data-containing responses to the handlers
routing = decoded.get("routing") routing = decoded.get("routing")
isAck = routing is not None and ("errorReason" not in routing or routing["errorReason"] == "NONE") isAck = routing is not None and ("errorReason" not in routing or routing["errorReason"] == "NONE")
if not isAck: # we keep the responseHandler in dict until we actually call it
# we keep the responseHandler in dict until we get a non ack handler = self.responseHandlers.get(requestId, None)
handler = self.responseHandlers.pop(requestId, None) if handler is not None:
if handler is not None: if (not isAck) or handler.callback.__name__ == "onAckNak" or handler.ackPermitted:
if not isAck or (isAck and handler.__name__ == "onAckNak"): handler = self.responseHandlers.pop(requestId, None)
logging.debug(f"Calling response handler for requestId {requestId}") logging.debug(f"Calling response handler for requestId {requestId}")
handler.callback(asDict) handler.callback(asDict)
logging.debug(f"Publishing {topic}: packet={stripnl(asDict)} ") logging.debug(f"Publishing {topic}: packet={stripnl(asDict)} ")
publishingThread.queueWork( publishingThread.queueWork(

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,30 +0,0 @@
# -*- 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)

View File

@@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: nanopb.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cnanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB\x1a\n\x18\x66i.kapsi.koti.jpa.nanopb')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nanopb_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(nanopb_fileopt)
google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(nanopb_msgopt)
google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(nanopb_enumopt)
google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(nanopb)
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopb'
_FIELDTYPE._serialized_start=985
_FIELDTYPE._serialized_end=1090
_INTSIZE._serialized_start=1092
_INTSIZE._serialized_end=1160
_TYPENAMEMANGLING._serialized_start=1162
_TYPENAMEMANGLING._serialized_end=1252
_DESCRIPTORSIZE._serialized_start=1254
_DESCRIPTORSIZE._serialized_end=1323
_NANOPBOPTIONS._serialized_start=51
_NANOPBOPTIONS._serialized_end=983
# @@protoc_insertion_point(module_scope)

View File

@@ -1,321 +0,0 @@
"""
@generated by mypy-protobuf. Do not edit manually!
isort:skip_file
Custom options for defining:
- Maximum size of string/bytes
- Maximum number of elements in array
These are used by nanopb to generate statically allocable structures
for memory-limited environments.
"""
import builtins
import collections.abc
import google.protobuf.descriptor
import google.protobuf.descriptor_pb2
import google.protobuf.internal.containers
import google.protobuf.internal.enum_type_wrapper
import google.protobuf.internal.extension_dict
import google.protobuf.message
import sys
import typing
if sys.version_info >= (3, 10):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
class _FieldType:
ValueType = typing.NewType("ValueType", builtins.int)
V: typing_extensions.TypeAlias = ValueType
class _FieldTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FieldType.ValueType], builtins.type):
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
FT_DEFAULT: _FieldType.ValueType # 0
"""Automatically decide field type, generate static field if possible."""
FT_CALLBACK: _FieldType.ValueType # 1
"""Always generate a callback field."""
FT_POINTER: _FieldType.ValueType # 4
"""Always generate a dynamically allocated field."""
FT_STATIC: _FieldType.ValueType # 2
"""Generate a static field or raise an exception if not possible."""
FT_IGNORE: _FieldType.ValueType # 3
"""Ignore the field completely."""
FT_INLINE: _FieldType.ValueType # 5
"""Legacy option, use the separate 'fixed_length' option instead"""
class FieldType(_FieldType, metaclass=_FieldTypeEnumTypeWrapper): ...
FT_DEFAULT: FieldType.ValueType # 0
"""Automatically decide field type, generate static field if possible."""
FT_CALLBACK: FieldType.ValueType # 1
"""Always generate a callback field."""
FT_POINTER: FieldType.ValueType # 4
"""Always generate a dynamically allocated field."""
FT_STATIC: FieldType.ValueType # 2
"""Generate a static field or raise an exception if not possible."""
FT_IGNORE: FieldType.ValueType # 3
"""Ignore the field completely."""
FT_INLINE: FieldType.ValueType # 5
"""Legacy option, use the separate 'fixed_length' option instead"""
global___FieldType = FieldType
class _IntSize:
ValueType = typing.NewType("ValueType", builtins.int)
V: typing_extensions.TypeAlias = ValueType
class _IntSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_IntSize.ValueType], builtins.type):
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
IS_DEFAULT: _IntSize.ValueType # 0
"""Default, 32/64bit based on type in .proto"""
IS_8: _IntSize.ValueType # 8
IS_16: _IntSize.ValueType # 16
IS_32: _IntSize.ValueType # 32
IS_64: _IntSize.ValueType # 64
class IntSize(_IntSize, metaclass=_IntSizeEnumTypeWrapper): ...
IS_DEFAULT: IntSize.ValueType # 0
"""Default, 32/64bit based on type in .proto"""
IS_8: IntSize.ValueType # 8
IS_16: IntSize.ValueType # 16
IS_32: IntSize.ValueType # 32
IS_64: IntSize.ValueType # 64
global___IntSize = IntSize
class _TypenameMangling:
ValueType = typing.NewType("ValueType", builtins.int)
V: typing_extensions.TypeAlias = ValueType
class _TypenameManglingEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TypenameMangling.ValueType], builtins.type):
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
M_NONE: _TypenameMangling.ValueType # 0
"""Default, no typename mangling"""
M_STRIP_PACKAGE: _TypenameMangling.ValueType # 1
"""Strip current package name"""
M_FLATTEN: _TypenameMangling.ValueType # 2
"""Only use last path component"""
M_PACKAGE_INITIALS: _TypenameMangling.ValueType # 3
"""Replace the package name by the initials"""
class TypenameMangling(_TypenameMangling, metaclass=_TypenameManglingEnumTypeWrapper): ...
M_NONE: TypenameMangling.ValueType # 0
"""Default, no typename mangling"""
M_STRIP_PACKAGE: TypenameMangling.ValueType # 1
"""Strip current package name"""
M_FLATTEN: TypenameMangling.ValueType # 2
"""Only use last path component"""
M_PACKAGE_INITIALS: TypenameMangling.ValueType # 3
"""Replace the package name by the initials"""
global___TypenameMangling = TypenameMangling
class _DescriptorSize:
ValueType = typing.NewType("ValueType", builtins.int)
V: typing_extensions.TypeAlias = ValueType
class _DescriptorSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_DescriptorSize.ValueType], builtins.type):
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
DS_AUTO: _DescriptorSize.ValueType # 0
"""Select minimal size based on field type"""
DS_1: _DescriptorSize.ValueType # 1
"""1 word; up to 15 byte fields, no arrays"""
DS_2: _DescriptorSize.ValueType # 2
"""2 words; up to 4095 byte fields, 4095 entry arrays"""
DS_4: _DescriptorSize.ValueType # 4
"""4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays"""
DS_8: _DescriptorSize.ValueType # 8
"""8 words; up to 2^32-1 entry arrays"""
class DescriptorSize(_DescriptorSize, metaclass=_DescriptorSizeEnumTypeWrapper): ...
DS_AUTO: DescriptorSize.ValueType # 0
"""Select minimal size based on field type"""
DS_1: DescriptorSize.ValueType # 1
"""1 word; up to 15 byte fields, no arrays"""
DS_2: DescriptorSize.ValueType # 2
"""2 words; up to 4095 byte fields, 4095 entry arrays"""
DS_4: DescriptorSize.ValueType # 4
"""4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays"""
DS_8: DescriptorSize.ValueType # 8
"""8 words; up to 2^32-1 entry arrays"""
global___DescriptorSize = DescriptorSize
@typing_extensions.final
class NanoPBOptions(google.protobuf.message.Message):
"""This is the inner options message, which basically defines options for
a field. When it is used in message or file scope, it applies to all
fields.
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
MAX_SIZE_FIELD_NUMBER: builtins.int
MAX_LENGTH_FIELD_NUMBER: builtins.int
MAX_COUNT_FIELD_NUMBER: builtins.int
INT_SIZE_FIELD_NUMBER: builtins.int
TYPE_FIELD_NUMBER: builtins.int
LONG_NAMES_FIELD_NUMBER: builtins.int
PACKED_STRUCT_FIELD_NUMBER: builtins.int
PACKED_ENUM_FIELD_NUMBER: builtins.int
SKIP_MESSAGE_FIELD_NUMBER: builtins.int
NO_UNIONS_FIELD_NUMBER: builtins.int
MSGID_FIELD_NUMBER: builtins.int
ANONYMOUS_ONEOF_FIELD_NUMBER: builtins.int
PROTO3_FIELD_NUMBER: builtins.int
PROTO3_SINGULAR_MSGS_FIELD_NUMBER: builtins.int
ENUM_TO_STRING_FIELD_NUMBER: builtins.int
FIXED_LENGTH_FIELD_NUMBER: builtins.int
FIXED_COUNT_FIELD_NUMBER: builtins.int
SUBMSG_CALLBACK_FIELD_NUMBER: builtins.int
MANGLE_NAMES_FIELD_NUMBER: builtins.int
CALLBACK_DATATYPE_FIELD_NUMBER: builtins.int
CALLBACK_FUNCTION_FIELD_NUMBER: builtins.int
DESCRIPTORSIZE_FIELD_NUMBER: builtins.int
DEFAULT_HAS_FIELD_NUMBER: builtins.int
INCLUDE_FIELD_NUMBER: builtins.int
EXCLUDE_FIELD_NUMBER: builtins.int
PACKAGE_FIELD_NUMBER: builtins.int
TYPE_OVERRIDE_FIELD_NUMBER: builtins.int
SORT_BY_TAG_FIELD_NUMBER: builtins.int
FALLBACK_TYPE_FIELD_NUMBER: builtins.int
max_size: builtins.int
"""Allocated size for 'bytes' and 'string' fields.
For string fields, this should include the space for null terminator.
"""
max_length: builtins.int
"""Maximum length for 'string' fields. Setting this is equivalent
to setting max_size to a value of length+1.
"""
max_count: builtins.int
"""Allocated number of entries in arrays ('repeated' fields)"""
int_size: global___IntSize.ValueType
"""Size of integer fields. Can save some memory if you don't need
full 32 bits for the value.
"""
type: global___FieldType.ValueType
"""Force type of field (callback or static allocation)"""
long_names: builtins.bool
"""Use long names for enums, i.e. EnumName_EnumValue."""
packed_struct: builtins.bool
"""Add 'packed' attribute to generated structs.
Note: this cannot be used on CPUs that break on unaligned
accesses to variables.
"""
packed_enum: builtins.bool
"""Add 'packed' attribute to generated enums."""
skip_message: builtins.bool
"""Skip this message"""
no_unions: builtins.bool
"""Generate oneof fields as normal optional fields instead of union."""
msgid: builtins.int
"""integer type tag for a message"""
anonymous_oneof: builtins.bool
"""decode oneof as anonymous union"""
proto3: builtins.bool
"""Proto3 singular field does not generate a "has_" flag"""
proto3_singular_msgs: builtins.bool
"""Force proto3 messages to have no "has_" flag.
This was default behavior until nanopb-0.4.0.
"""
enum_to_string: builtins.bool
"""Generate an enum->string mapping function (can take up lots of space)."""
fixed_length: builtins.bool
"""Generate bytes arrays with fixed length"""
fixed_count: builtins.bool
"""Generate repeated field with fixed count"""
submsg_callback: builtins.bool
"""Generate message-level callback that is called before decoding submessages.
This can be used to set callback fields for submsgs inside oneofs.
"""
mangle_names: global___TypenameMangling.ValueType
"""Shorten or remove package names from type names.
This option applies only on the file level.
"""
callback_datatype: builtins.str
"""Data type for storage associated with callback fields."""
callback_function: builtins.str
"""Callback function used for encoding and decoding.
Prior to nanopb-0.4.0, the callback was specified in per-field pb_callback_t
structure. This is still supported, but does not work inside e.g. oneof or pointer
fields. Instead, a new method allows specifying a per-message callback that
will be called for all callback fields in a message type.
"""
descriptorsize: global___DescriptorSize.ValueType
"""Select the size of field descriptors. This option has to be defined
for the whole message, not per-field. Usually automatic selection is
ok, but if it results in compilation errors you can increase the field
size here.
"""
default_has: builtins.bool
"""Set default value for has_ fields."""
@property
def include(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
"""Extra files to include in generated `.pb.h`"""
@property
def exclude(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
"""Automatic includes to exclude from generated `.pb.h`
Same as nanopb_generator.py command line flag -x.
"""
package: builtins.str
"""Package name that applies only for nanopb."""
type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType
"""Override type of the field in generated C code. Only to be used with related field types"""
sort_by_tag: builtins.bool
"""Due to historical reasons, nanopb orders fields in structs by their tag number
instead of the order in .proto. Set this to false to keep the .proto order.
The default value will probably change to false in nanopb-0.5.0.
"""
fallback_type: global___FieldType.ValueType
"""Set the FT_DEFAULT field conversion strategy.
A field that can become a static member of a c struct (e.g. int, bool, etc)
will be a a static field.
Fields with dynamic length are converted to either a pointer or a callback.
"""
def __init__(
self,
*,
max_size: builtins.int | None = ...,
max_length: builtins.int | None = ...,
max_count: builtins.int | None = ...,
int_size: global___IntSize.ValueType | None = ...,
type: global___FieldType.ValueType | None = ...,
long_names: builtins.bool | None = ...,
packed_struct: builtins.bool | None = ...,
packed_enum: builtins.bool | None = ...,
skip_message: builtins.bool | None = ...,
no_unions: builtins.bool | None = ...,
msgid: builtins.int | None = ...,
anonymous_oneof: builtins.bool | None = ...,
proto3: builtins.bool | None = ...,
proto3_singular_msgs: builtins.bool | None = ...,
enum_to_string: builtins.bool | None = ...,
fixed_length: builtins.bool | None = ...,
fixed_count: builtins.bool | None = ...,
submsg_callback: builtins.bool | None = ...,
mangle_names: global___TypenameMangling.ValueType | None = ...,
callback_datatype: builtins.str | None = ...,
callback_function: builtins.str | None = ...,
descriptorsize: global___DescriptorSize.ValueType | None = ...,
default_has: builtins.bool | None = ...,
include: collections.abc.Iterable[builtins.str] | None = ...,
exclude: collections.abc.Iterable[builtins.str] | None = ...,
package: builtins.str | None = ...,
type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType | None = ...,
sort_by_tag: builtins.bool | None = ...,
fallback_type: global___FieldType.ValueType | None = ...,
) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "exclude", b"exclude", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "include", b"include", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> None: ...
global___NanoPBOptions = NanoPBOptions
NANOPB_FILEOPT_FIELD_NUMBER: builtins.int
NANOPB_MSGOPT_FIELD_NUMBER: builtins.int
NANOPB_ENUMOPT_FIELD_NUMBER: builtins.int
NANOPB_FIELD_NUMBER: builtins.int
nanopb_fileopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FileOptions, global___NanoPBOptions]
nanopb_msgopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.MessageOptions, global___NanoPBOptions]
nanopb_enumopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.EnumOptions, global___NanoPBOptions]
nanopb: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FieldOptions, global___NanoPBOptions]

View File

@@ -7,7 +7,7 @@ import time
from typing import Union from typing import Union
from meshtastic import admin_pb2, apponly_pb2, channel_pb2, localonly_pb2, portnums_pb2 from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, localonly_pb2, mesh_pb2, portnums_pb2
from meshtastic.util import ( from meshtastic.util import (
Timeout, Timeout,
camel_to_snake, camel_to_snake,
@@ -64,14 +64,19 @@ class Node:
"""Show human readable description of our node""" """Show human readable description of our node"""
prefs = "" prefs = ""
if self.localConfig: if self.localConfig:
prefs = message_to_json(self.localConfig) prefs = message_to_json(self.localConfig, multiline=True)
print(f"Preferences: {prefs}\n") print(f"Preferences: {prefs}\n")
prefs = "" prefs = ""
if self.moduleConfig: if self.moduleConfig:
prefs = message_to_json(self.moduleConfig) prefs = message_to_json(self.moduleConfig, multiline=True)
print(f"Module preferences: {prefs}\n") print(f"Module preferences: {prefs}\n")
self.showChannels() self.showChannels()
def setChannels(self, channels):
"""Set the channels for this node"""
self.channels = channels
self._fixupChannels()
def requestChannels(self): def requestChannels(self):
"""Send regular MeshPackets to ask channels.""" """Send regular MeshPackets to ask channels."""
logging.debug(f"requestChannels for nodeNum:{self.nodeNum}") logging.debug(f"requestChannels for nodeNum:{self.nodeNum}")
@@ -603,9 +608,10 @@ class Node:
p.get_device_metadata_request = True p.get_device_metadata_request = True
logging.info(f"Requesting device metadata") logging.info(f"Requesting device metadata")
return self._sendAdmin( self._sendAdmin(
p, wantResponse=True, onResponse=self.onRequestGetMetadata p, wantResponse=True, onResponse=self.onRequestGetMetadata
) )
self.iface.waitForAckNak()
def factoryReset(self): def factoryReset(self):
"""Tell the node to factory reset.""" """Tell the node to factory reset."""
@@ -650,11 +656,43 @@ class Node:
onResponse = self.onAckNak onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse) return self._sendAdmin(p, onResponse=onResponse)
def setFixedPosition(self, lat: Union[int, float], lon: Union[int, float], alt: int):
"""Tell the node to set fixed position to the provided value and enable the fixed position setting"""
if self != self.iface.localNode:
logging.error("Setting position of remote nodes is not supported.")
return None
p = mesh_pb2.Position()
if isinstance(lat, float) and lat != 0.0:
p.latitude_i = int(lat / 1e-7)
elif isinstance(lat, int) and lat != 0:
p.latitude_i = lat
if isinstance(lon, float) and lon != 0.0:
p.longitude_i = int(lon / 1e-7)
elif isinstance(lon, int) and lon != 0:
p.longitude_i = lon
if alt != 0:
p.altitude = alt
a = admin_pb2.AdminMessage()
a.set_fixed_position.CopyFrom(p)
return self._sendAdmin(a)
def removeFixedPosition(self):
"""Tell the node to remove the fixed position and set the fixed position setting to false"""
p = admin_pb2.AdminMessage()
p.remove_fixed_position = True
logging.info(f"Telling node to remove fixed position")
return self._sendAdmin(p)
def _fixupChannels(self): def _fixupChannels(self):
"""Fixup indexes and add disabled channels as needed""" """Fixup indexes and add disabled channels as needed"""
# Add extra disabled channels as needed # Add extra disabled channels as needed
# TODO: These 2 lines seem to not do anything. # This is needed because the protobufs will have index **missing** if the channel number is zero
for index, ch in enumerate(self.channels): for index, ch in enumerate(self.channels):
ch.index = index # fixup indexes ch.index = index # fixup indexes
@@ -676,24 +714,30 @@ class Node:
"""Handle the response packet for requesting device metadata getMetadata()""" """Handle the response packet for requesting device metadata getMetadata()"""
logging.debug(f"onRequestGetMetadata() p:{p}") logging.debug(f"onRequestGetMetadata() p:{p}")
if p["decoded"]["portnum"] == portnums_pb2.PortNum.Name( if "routing" in p["decoded"]:
portnums_pb2.PortNum.ROUTING_APP
):
if p["decoded"]["routing"]["errorReason"] != "NONE": if p["decoded"]["routing"]["errorReason"] != "NONE":
logging.warning( print(f'Error on response: {p["decoded"]["routing"]["errorReason"]}')
f'Metadata request failed, error reason: {p["decoded"]["routing"]["errorReason"]}' self.iface._acknowledgment.receivedNak = True
) else:
self._timeout.expireTime = time.time() # Do not wait any longer self.iface._acknowledgment.receivedAck = True
return # Don't try to parse this routing message if p["decoded"]["portnum"] == portnums_pb2.PortNum.Name(
logging.debug(f"Retrying metadata request.") portnums_pb2.PortNum.ROUTING_APP
self.getMetadata() ):
return if p["decoded"]["routing"]["errorReason"] != "NONE":
logging.warning(
f'Metadata request failed, error reason: {p["decoded"]["routing"]["errorReason"]}'
)
self._timeout.expireTime = time.time() # Do not wait any longer
return # Don't try to parse this routing message
logging.debug(f"Retrying metadata request.")
self.getMetadata()
return
c = p["decoded"]["admin"]["raw"].get_device_metadata_response c = p["decoded"]["admin"]["raw"].get_device_metadata_response
self._timeout.reset() # We made forward progress self._timeout.reset() # We made forward progress
logging.debug(f"Received metadata {stripnl(c)}") logging.debug(f"Received metadata {stripnl(c)}")
print(f"\nfirmware_version: {c.firmware_version}") print(f"\nfirmware_version: {c.firmware_version}")
print(f"device_state_version: {c.device_state_version}") print(f"device_state_version: {c.device_state_version}")
def onResponseRequestChannel(self, p): def onResponseRequestChannel(self, p):
"""Handle the response packet for requesting a channel _requestChannel()""" """Handle the response packet for requesting a channel _requestChannel()"""
@@ -726,9 +770,6 @@ class Node:
self.channels = self.partialChannels self.channels = self.partialChannels
self._fixupChannels() self._fixupChannels()
# FIXME, the following should only be called after we have settings and channels
self.iface._connected() # Tell everyone else we are ready to go
else: else:
self._requestChannel(index + 1) self._requestChannel(index + 1)

View File

@@ -1,26 +0,0 @@
# -*- 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)

View File

View File

@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/admin.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@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 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\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xea\x12\n\x0c\x41\x64minMessage\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\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\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\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_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\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_ADMINMESSAGE']._serialized_start=244
_globals['_ADMINMESSAGE']._serialized_end=2654
_globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=2168
_globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=2317
_globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=2320
_globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=2635
_globals['_HAMPARAMETERS']._serialized_start=2656
_globals['_HAMPARAMETERS']._serialized_end=2747
_globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=2749
_globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=2860
# @@protoc_insertion_point(module_scope)

View File

@@ -2,17 +2,18 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.containers import google.protobuf.internal.containers
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
import google.protobuf.message import google.protobuf.message
import meshtastic.channel_pb2 import meshtastic.protobuf.channel_pb2
import meshtastic.config_pb2 import meshtastic.protobuf.config_pb2
import meshtastic.connection_status_pb2 import meshtastic.protobuf.connection_status_pb2
import meshtastic.mesh_pb2 import meshtastic.protobuf.mesh_pb2
import meshtastic.module_config_pb2 import meshtastic.protobuf.module_config_pb2
import sys import sys
import typing import typing
@@ -23,7 +24,7 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class AdminMessage(google.protobuf.message.Message): class AdminMessage(google.protobuf.message.Message):
""" """
This message is handled by the Admin module and is responsible for all settings/channel read/write operations. This message is handled by the Admin module and is responsible for all settings/channel read/write operations.
@@ -240,6 +241,7 @@ class AdminMessage(google.protobuf.message.Message):
GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: builtins.int GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: builtins.int
ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: builtins.int ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: builtins.int
DELETE_FILE_REQUEST_FIELD_NUMBER: builtins.int DELETE_FILE_REQUEST_FIELD_NUMBER: builtins.int
SET_SCALE_FIELD_NUMBER: builtins.int
SET_OWNER_FIELD_NUMBER: builtins.int SET_OWNER_FIELD_NUMBER: builtins.int
SET_CHANNEL_FIELD_NUMBER: builtins.int SET_CHANNEL_FIELD_NUMBER: builtins.int
SET_CONFIG_FIELD_NUMBER: builtins.int SET_CONFIG_FIELD_NUMBER: builtins.int
@@ -264,38 +266,18 @@ class AdminMessage(google.protobuf.message.Message):
Send the specified channel in the response to this message Send the specified channel in the response to this message
NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present)
""" """
@property
def get_channel_response(self) -> meshtastic.channel_pb2.Channel:
"""
TODO: REPLACE
"""
get_owner_request: builtins.bool get_owner_request: builtins.bool
""" """
Send the current owner data in the response to this message. Send the current owner data in the response to this message.
""" """
@property
def get_owner_response(self) -> meshtastic.mesh_pb2.User:
"""
TODO: REPLACE
"""
get_config_request: global___AdminMessage.ConfigType.ValueType get_config_request: global___AdminMessage.ConfigType.ValueType
""" """
Ask for the following config data to be sent Ask for the following config data to be sent
""" """
@property
def get_config_response(self) -> meshtastic.config_pb2.Config:
"""
Send the current Config in the response to this message.
"""
get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType
""" """
Ask for the following config data to be sent Ask for the following config data to be sent
""" """
@property
def get_module_config_response(self) -> meshtastic.module_config_pb2.ModuleConfig:
"""
Send the current Config in the response to this message.
"""
get_canned_message_module_messages_request: builtins.bool get_canned_message_module_messages_request: builtins.bool
""" """
Get the Canned Message Module messages in the response to this message. Get the Canned Message Module messages in the response to this message.
@@ -308,11 +290,6 @@ class AdminMessage(google.protobuf.message.Message):
""" """
Request the node to send device metadata (firmware, protobuf version, etc) Request the node to send device metadata (firmware, protobuf version, etc)
""" """
@property
def get_device_metadata_response(self) -> meshtastic.mesh_pb2.DeviceMetadata:
"""
Device metadata response
"""
get_ringtone_request: builtins.bool get_ringtone_request: builtins.bool
""" """
Get the Ringtone in the response to this message. Get the Ringtone in the response to this message.
@@ -325,25 +302,10 @@ class AdminMessage(google.protobuf.message.Message):
""" """
Request the node to send it's connection status Request the node to send it's connection status
""" """
@property
def get_device_connection_status_response(self) -> meshtastic.connection_status_pb2.DeviceConnectionStatus:
"""
Device connection status response
"""
@property
def set_ham_mode(self) -> global___HamParameters:
"""
Setup a node for licensed amateur (ham) radio operation
"""
get_node_remote_hardware_pins_request: builtins.bool get_node_remote_hardware_pins_request: builtins.bool
""" """
Get the mesh's nodes with their available gpio pins for RemoteHardware module use Get the mesh's nodes with their available gpio pins for RemoteHardware module use
""" """
@property
def get_node_remote_hardware_pins_response(self) -> global___NodeRemoteHardwarePinsResponse:
"""
Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use
"""
enter_dfu_mode_request: builtins.bool enter_dfu_mode_request: builtins.bool
""" """
Enter (UF2) DFU mode Enter (UF2) DFU mode
@@ -353,30 +315,10 @@ class AdminMessage(google.protobuf.message.Message):
""" """
Delete the file by the specified path from the device Delete the file by the specified path from the device
""" """
@property set_scale: builtins.int
def set_owner(self) -> meshtastic.mesh_pb2.User: """
""" Set zero and offset for scale chips
Set the owner for this node """
"""
@property
def set_channel(self) -> meshtastic.channel_pb2.Channel:
"""
Set channels (using the new API).
A special channel is the "primary channel".
The other records are secondary channels.
Note: only one channel can be marked as primary.
If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically.
"""
@property
def set_config(self) -> meshtastic.config_pb2.Config:
"""
Set the current Config
"""
@property
def set_module_config(self) -> meshtastic.module_config_pb2.ModuleConfig:
"""
Set the current Config
"""
set_canned_message_module_messages: builtins.str set_canned_message_module_messages: builtins.str
""" """
Set the Canned Message Module messages text. Set the Canned Message Module messages text.
@@ -397,11 +339,6 @@ class AdminMessage(google.protobuf.message.Message):
""" """
Set specified node-num to be un-favorited on the NodeDB on the device Set specified node-num to be un-favorited on the NodeDB on the device
""" """
@property
def set_fixed_position(self) -> meshtastic.mesh_pb2.Position:
"""
Set fixed position data on the node and then set the position.fixed_position = true
"""
remove_fixed_position: builtins.bool remove_fixed_position: builtins.bool
""" """
Clear fixed position coordinates and then set position.fixed_position = false Clear fixed position coordinates and then set position.fixed_position = false
@@ -441,40 +378,123 @@ class AdminMessage(google.protobuf.message.Message):
""" """
Tell the node to reset the nodedb. Tell the node to reset the nodedb.
""" """
@property
def get_channel_response(self) -> meshtastic.protobuf.channel_pb2.Channel:
"""
TODO: REPLACE
"""
@property
def get_owner_response(self) -> meshtastic.protobuf.mesh_pb2.User:
"""
TODO: REPLACE
"""
@property
def get_config_response(self) -> meshtastic.protobuf.config_pb2.Config:
"""
Send the current Config in the response to this message.
"""
@property
def get_module_config_response(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig:
"""
Send the current Config in the response to this message.
"""
@property
def get_device_metadata_response(self) -> meshtastic.protobuf.mesh_pb2.DeviceMetadata:
"""
Device metadata response
"""
@property
def get_device_connection_status_response(self) -> meshtastic.protobuf.connection_status_pb2.DeviceConnectionStatus:
"""
Device connection status response
"""
@property
def set_ham_mode(self) -> global___HamParameters:
"""
Setup a node for licensed amateur (ham) radio operation
"""
@property
def get_node_remote_hardware_pins_response(self) -> global___NodeRemoteHardwarePinsResponse:
"""
Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use
"""
@property
def set_owner(self) -> meshtastic.protobuf.mesh_pb2.User:
"""
Set the owner for this node
"""
@property
def set_channel(self) -> meshtastic.protobuf.channel_pb2.Channel:
"""
Set channels (using the new API).
A special channel is the "primary channel".
The other records are secondary channels.
Note: only one channel can be marked as primary.
If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically.
"""
@property
def set_config(self) -> meshtastic.protobuf.config_pb2.Config:
"""
Set the current Config
"""
@property
def set_module_config(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig:
"""
Set the current Config
"""
@property
def set_fixed_position(self) -> meshtastic.protobuf.mesh_pb2.Position:
"""
Set fixed position data on the node and then set the position.fixed_position = true
"""
def __init__( def __init__(
self, self,
*, *,
get_channel_request: builtins.int = ..., get_channel_request: builtins.int = ...,
get_channel_response: meshtastic.channel_pb2.Channel | None = ..., get_channel_response: meshtastic.protobuf.channel_pb2.Channel | None = ...,
get_owner_request: builtins.bool = ..., get_owner_request: builtins.bool = ...,
get_owner_response: meshtastic.mesh_pb2.User | None = ..., get_owner_response: meshtastic.protobuf.mesh_pb2.User | None = ...,
get_config_request: global___AdminMessage.ConfigType.ValueType = ..., get_config_request: global___AdminMessage.ConfigType.ValueType = ...,
get_config_response: meshtastic.config_pb2.Config | None = ..., get_config_response: meshtastic.protobuf.config_pb2.Config | None = ...,
get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType = ..., get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType = ...,
get_module_config_response: meshtastic.module_config_pb2.ModuleConfig | None = ..., get_module_config_response: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ...,
get_canned_message_module_messages_request: builtins.bool = ..., get_canned_message_module_messages_request: builtins.bool = ...,
get_canned_message_module_messages_response: builtins.str = ..., get_canned_message_module_messages_response: builtins.str = ...,
get_device_metadata_request: builtins.bool = ..., get_device_metadata_request: builtins.bool = ...,
get_device_metadata_response: meshtastic.mesh_pb2.DeviceMetadata | None = ..., get_device_metadata_response: meshtastic.protobuf.mesh_pb2.DeviceMetadata | None = ...,
get_ringtone_request: builtins.bool = ..., get_ringtone_request: builtins.bool = ...,
get_ringtone_response: builtins.str = ..., get_ringtone_response: builtins.str = ...,
get_device_connection_status_request: builtins.bool = ..., get_device_connection_status_request: builtins.bool = ...,
get_device_connection_status_response: meshtastic.connection_status_pb2.DeviceConnectionStatus | None = ..., get_device_connection_status_response: meshtastic.protobuf.connection_status_pb2.DeviceConnectionStatus | None = ...,
set_ham_mode: global___HamParameters | None = ..., set_ham_mode: global___HamParameters | None = ...,
get_node_remote_hardware_pins_request: builtins.bool = ..., get_node_remote_hardware_pins_request: builtins.bool = ...,
get_node_remote_hardware_pins_response: global___NodeRemoteHardwarePinsResponse | None = ..., get_node_remote_hardware_pins_response: global___NodeRemoteHardwarePinsResponse | None = ...,
enter_dfu_mode_request: builtins.bool = ..., enter_dfu_mode_request: builtins.bool = ...,
delete_file_request: builtins.str = ..., delete_file_request: builtins.str = ...,
set_owner: meshtastic.mesh_pb2.User | None = ..., set_scale: builtins.int = ...,
set_channel: meshtastic.channel_pb2.Channel | None = ..., set_owner: meshtastic.protobuf.mesh_pb2.User | None = ...,
set_config: meshtastic.config_pb2.Config | None = ..., set_channel: meshtastic.protobuf.channel_pb2.Channel | None = ...,
set_module_config: meshtastic.module_config_pb2.ModuleConfig | None = ..., set_config: meshtastic.protobuf.config_pb2.Config | None = ...,
set_module_config: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ...,
set_canned_message_module_messages: builtins.str = ..., set_canned_message_module_messages: builtins.str = ...,
set_ringtone_message: builtins.str = ..., set_ringtone_message: builtins.str = ...,
remove_by_nodenum: builtins.int = ..., remove_by_nodenum: builtins.int = ...,
set_favorite_node: builtins.int = ..., set_favorite_node: builtins.int = ...,
remove_favorite_node: builtins.int = ..., remove_favorite_node: builtins.int = ...,
set_fixed_position: meshtastic.mesh_pb2.Position | None = ..., set_fixed_position: meshtastic.protobuf.mesh_pb2.Position | None = ...,
remove_fixed_position: builtins.bool = ..., remove_fixed_position: builtins.bool = ...,
begin_edit_settings: builtins.bool = ..., begin_edit_settings: builtins.bool = ...,
commit_edit_settings: builtins.bool = ..., commit_edit_settings: builtins.bool = ...,
@@ -485,13 +505,13 @@ class AdminMessage(google.protobuf.message.Message):
factory_reset: builtins.int = ..., factory_reset: builtins.int = ...,
nodedb_reset: builtins.int = ..., nodedb_reset: builtins.int = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "shutdown_seconds", b"shutdown_seconds"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "shutdown_seconds", b"shutdown_seconds"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "shutdown_seconds", b"shutdown_seconds"]) -> None: ... def ClearField(self, field_name: typing.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "shutdown_seconds", b"shutdown_seconds"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["get_channel_request", "get_channel_response", "get_owner_request", "get_owner_response", "get_config_request", "get_config_response", "get_module_config_request", "get_module_config_response", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_device_metadata_request", "get_device_metadata_response", "get_ringtone_request", "get_ringtone_response", "get_device_connection_status_request", "get_device_connection_status_response", "set_ham_mode", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "enter_dfu_mode_request", "delete_file_request", "set_owner", "set_channel", "set_config", "set_module_config", "set_canned_message_module_messages", "set_ringtone_message", "remove_by_nodenum", "set_favorite_node", "remove_favorite_node", "set_fixed_position", "remove_fixed_position", "begin_edit_settings", "commit_edit_settings", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset", "nodedb_reset"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["get_channel_request", "get_channel_response", "get_owner_request", "get_owner_response", "get_config_request", "get_config_response", "get_module_config_request", "get_module_config_response", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_device_metadata_request", "get_device_metadata_response", "get_ringtone_request", "get_ringtone_response", "get_device_connection_status_request", "get_device_connection_status_response", "set_ham_mode", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "enter_dfu_mode_request", "delete_file_request", "set_scale", "set_owner", "set_channel", "set_config", "set_module_config", "set_canned_message_module_messages", "set_ringtone_message", "remove_by_nodenum", "set_favorite_node", "remove_favorite_node", "set_fixed_position", "remove_fixed_position", "begin_edit_settings", "commit_edit_settings", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset", "nodedb_reset"] | None: ...
global___AdminMessage = AdminMessage global___AdminMessage = AdminMessage
@typing_extensions.final @typing.final
class HamParameters(google.protobuf.message.Message): class HamParameters(google.protobuf.message.Message):
""" """
Parameters for setting up Meshtastic for ameteur radio usage Parameters for setting up Meshtastic for ameteur radio usage
@@ -529,11 +549,11 @@ class HamParameters(google.protobuf.message.Message):
frequency: builtins.float = ..., frequency: builtins.float = ...,
short_name: builtins.str = ..., short_name: builtins.str = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["call_sign", b"call_sign", "frequency", b"frequency", "short_name", b"short_name", "tx_power", b"tx_power"]) -> None: ... def ClearField(self, field_name: typing.Literal["call_sign", b"call_sign", "frequency", b"frequency", "short_name", b"short_name", "tx_power", b"tx_power"]) -> None: ...
global___HamParameters = HamParameters global___HamParameters = HamParameters
@typing_extensions.final @typing.final
class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message): class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message):
""" """
Response envelope for node_remote_hardware_pins Response envelope for node_remote_hardware_pins
@@ -543,15 +563,16 @@ class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message):
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int
@property @property
def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.NodeRemoteHardwarePin]: def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin]:
""" """
Nodes and their respective remote hardware GPIO pins Nodes and their respective remote hardware GPIO pins
""" """
def __init__( def __init__(
self, self,
*, *,
node_remote_hardware_pins: collections.abc.Iterable[meshtastic.mesh_pb2.NodeRemoteHardwarePin] | None = ..., node_remote_hardware_pins: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin] | None = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"]) -> None: ... def ClearField(self, field_name: typing.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"]) -> None: ...
global___NodeRemoteHardwarePinsResponse = NodeRemoteHardwarePinsResponse global___NodeRemoteHardwarePinsResponse = NodeRemoteHardwarePinsResponse

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/apponly.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@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.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_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\023com.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_CHANNELSET']._serialized_start=128
_globals['_CHANNELSET']._serialized_end=257
# @@protoc_insertion_point(module_scope)

View File

@@ -2,23 +2,19 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.containers import google.protobuf.internal.containers
import google.protobuf.message import google.protobuf.message
import meshtastic.channel_pb2 import meshtastic.protobuf.channel_pb2
import meshtastic.config_pb2 import meshtastic.protobuf.config_pb2
import sys import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class ChannelSet(google.protobuf.message.Message): class ChannelSet(google.protobuf.message.Message):
""" """
This is the most compact possible representation for a set of channels. This is the most compact possible representation for a set of channels.
@@ -33,22 +29,24 @@ class ChannelSet(google.protobuf.message.Message):
SETTINGS_FIELD_NUMBER: builtins.int SETTINGS_FIELD_NUMBER: builtins.int
LORA_CONFIG_FIELD_NUMBER: builtins.int LORA_CONFIG_FIELD_NUMBER: builtins.int
@property @property
def settings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.channel_pb2.ChannelSettings]: def settings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.channel_pb2.ChannelSettings]:
""" """
Channel list with settings Channel list with settings
""" """
@property @property
def lora_config(self) -> meshtastic.config_pb2.Config.LoRaConfig: def lora_config(self) -> meshtastic.protobuf.config_pb2.Config.LoRaConfig:
""" """
LoRa config LoRa config
""" """
def __init__( def __init__(
self, self,
*, *,
settings: collections.abc.Iterable[meshtastic.channel_pb2.ChannelSettings] | None = ..., settings: collections.abc.Iterable[meshtastic.protobuf.channel_pb2.ChannelSettings] | None = ...,
lora_config: meshtastic.config_pb2.Config.LoRaConfig | None = ..., lora_config: meshtastic.protobuf.config_pb2.Config.LoRaConfig | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["lora_config", b"lora_config"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["lora_config", b"lora_config"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["lora_config", b"lora_config", "settings", b"settings"]) -> None: ... def ClearField(self, field_name: typing.Literal["lora_config", b"lora_config", "settings", b"settings"]) -> None: ...
global___ChannelSet = ChannelSet global___ChannelSet = ChannelSet

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/atak.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/atak.proto\x12\x13meshtastic.protobuf\"\x93\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\x42\x11\n\x0fpayload_variant\"\\\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\x42\x05\n\x03_toB\x0e\n\x0c_to_callsign\"_\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*\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')
_globals = globals()
_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\023com.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_TEAM']._serialized_start=703
_globals['_TEAM']._serialized_end=895
_globals['_MEMBERROLE']._serialized_start=897
_globals['_MEMBERROLE']._serialized_end=1024
_globals['_TAKPACKET']._serialized_start=56
_globals['_TAKPACKET']._serialized_end=331
_globals['_GEOCHAT']._serialized_start=333
_globals['_GEOCHAT']._serialized_end=425
_globals['_GROUP']._serialized_start=427
_globals['_GROUP']._serialized_end=522
_globals['_STATUS']._serialized_start=524
_globals['_STATUS']._serialized_end=549
_globals['_CONTACT']._serialized_start=551
_globals['_CONTACT']._serialized_end=603
_globals['_PLI']._serialized_start=605
_globals['_PLI']._serialized_end=700
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -233,7 +234,7 @@ Doggo
""" """
global___MemberRole = MemberRole global___MemberRole = MemberRole
@typing_extensions.final @typing.final
class TAKPacket(google.protobuf.message.Message): class TAKPacket(google.protobuf.message.Message):
""" """
Packets for the official ATAK Plugin Packets for the official ATAK Plugin
@@ -256,26 +257,31 @@ class TAKPacket(google.protobuf.message.Message):
""" """
The contact / callsign for ATAK user The contact / callsign for ATAK user
""" """
@property @property
def group(self) -> global___Group: def group(self) -> global___Group:
""" """
The group for ATAK user The group for ATAK user
""" """
@property @property
def status(self) -> global___Status: def status(self) -> global___Status:
""" """
The status of the ATAK EUD The status of the ATAK EUD
""" """
@property @property
def pli(self) -> global___PLI: def pli(self) -> global___PLI:
""" """
TAK position report TAK position report
""" """
@property @property
def chat(self) -> global___GeoChat: def chat(self) -> global___GeoChat:
""" """
ATAK GeoChat message ATAK GeoChat message
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -286,13 +292,13 @@ class TAKPacket(google.protobuf.message.Message):
pli: global___PLI | None = ..., pli: global___PLI | None = ...,
chat: global___GeoChat | None = ..., chat: global___GeoChat | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "is_compressed", b"is_compressed", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> None: ... def ClearField(self, field_name: typing.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "is_compressed", b"is_compressed", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["pli", "chat"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["pli", "chat"] | None: ...
global___TAKPacket = TAKPacket global___TAKPacket = TAKPacket
@typing_extensions.final @typing.final
class GeoChat(google.protobuf.message.Message): class GeoChat(google.protobuf.message.Message):
""" """
ATAK GeoChat message ATAK GeoChat message
@@ -302,6 +308,7 @@ class GeoChat(google.protobuf.message.Message):
MESSAGE_FIELD_NUMBER: builtins.int MESSAGE_FIELD_NUMBER: builtins.int
TO_FIELD_NUMBER: builtins.int TO_FIELD_NUMBER: builtins.int
TO_CALLSIGN_FIELD_NUMBER: builtins.int
message: builtins.str message: builtins.str
""" """
The text message The text message
@@ -310,19 +317,27 @@ class GeoChat(google.protobuf.message.Message):
""" """
Uid recipient of the message Uid recipient of the message
""" """
to_callsign: builtins.str
"""
Callsign of the recipient for the message
"""
def __init__( def __init__(
self, self,
*, *,
message: builtins.str = ..., message: builtins.str = ...,
to: builtins.str | None = ..., to: builtins.str | None = ...,
to_callsign: builtins.str | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["_to", b"_to", "to", b"to"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["_to", b"_to", "_to_callsign", b"_to_callsign", "to", b"to", "to_callsign", b"to_callsign"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["_to", b"_to", "message", b"message", "to", b"to"]) -> None: ... def ClearField(self, field_name: typing.Literal["_to", b"_to", "_to_callsign", b"_to_callsign", "message", b"message", "to", b"to", "to_callsign", b"to_callsign"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["_to", b"_to"]) -> typing_extensions.Literal["to"] | None: ... @typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_to", b"_to"]) -> typing.Literal["to"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_to_callsign", b"_to_callsign"]) -> typing.Literal["to_callsign"] | None: ...
global___GeoChat = GeoChat global___GeoChat = GeoChat
@typing_extensions.final @typing.final
class Group(google.protobuf.message.Message): class Group(google.protobuf.message.Message):
""" """
ATAK Group ATAK Group
@@ -348,11 +363,11 @@ class Group(google.protobuf.message.Message):
role: global___MemberRole.ValueType = ..., role: global___MemberRole.ValueType = ...,
team: global___Team.ValueType = ..., team: global___Team.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["role", b"role", "team", b"team"]) -> None: ... def ClearField(self, field_name: typing.Literal["role", b"role", "team", b"team"]) -> None: ...
global___Group = Group global___Group = Group
@typing_extensions.final @typing.final
class Status(google.protobuf.message.Message): class Status(google.protobuf.message.Message):
""" """
ATAK EUD Status ATAK EUD Status
@@ -371,11 +386,11 @@ class Status(google.protobuf.message.Message):
*, *,
battery: builtins.int = ..., battery: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["battery", b"battery"]) -> None: ... def ClearField(self, field_name: typing.Literal["battery", b"battery"]) -> None: ...
global___Status = Status global___Status = Status
@typing_extensions.final @typing.final
class Contact(google.protobuf.message.Message): class Contact(google.protobuf.message.Message):
""" """
ATAK Contact ATAK Contact
@@ -402,11 +417,11 @@ class Contact(google.protobuf.message.Message):
callsign: builtins.str = ..., callsign: builtins.str = ...,
device_callsign: builtins.str = ..., device_callsign: builtins.str = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["callsign", b"callsign", "device_callsign", b"device_callsign"]) -> None: ... def ClearField(self, field_name: typing.Literal["callsign", b"callsign", "device_callsign", b"device_callsign"]) -> None: ...
global___Contact = Contact global___Contact = Contact
@typing_extensions.final @typing.final
class PLI(google.protobuf.message.Message): class PLI(google.protobuf.message.Message):
""" """
Position Location Information from ATAK Position Location Information from ATAK
@@ -450,6 +465,6 @@ class PLI(google.protobuf.message.Message):
speed: builtins.int = ..., speed: builtins.int = ...,
course: builtins.int = ..., course: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "course", b"course", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "speed", b"speed"]) -> None: ... def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "course", b"course", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "speed", b"speed"]) -> None: ...
global___PLI = PLI global___PLI = PLI

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/cannedmessages.proto # source: meshtastic/protobuf/cannedmessages.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default() _sym_db = _symbol_database.Default()
@@ -13,14 +13,14 @@ _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') 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(\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()) _globals = globals()
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals()) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.cannedmessages_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 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 _globals['_CANNEDMESSAGEMODULECONFIG']._serialized_start=65
_CANNEDMESSAGEMODULECONFIG._serialized_end=92 _globals['_CANNEDMESSAGEMODULECONFIG']._serialized_end=110
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,19 +2,15 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.message import google.protobuf.message
import sys import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class CannedMessageModuleConfig(google.protobuf.message.Message): class CannedMessageModuleConfig(google.protobuf.message.Message):
""" """
Canned message module configuration. Canned message module configuration.
@@ -32,6 +28,6 @@ class CannedMessageModuleConfig(google.protobuf.message.Message):
*, *,
messages: builtins.str = ..., messages: builtins.str = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["messages", b"messages"]) -> None: ... def ClearField(self, field_name: typing.Literal["messages", b"messages"]) -> None: ...
global___CannedMessageModuleConfig = CannedMessageModuleConfig global___CannedMessageModuleConfig = CannedMessageModuleConfig

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/channel.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\"\xc1\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12<\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\"E\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x17\n\x0fis_client_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\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_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\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'
_globals['_CHANNELSETTINGS']._serialized_start=59
_globals['_CHANNELSETTINGS']._serialized_end=252
_globals['_MODULESETTINGS']._serialized_start=254
_globals['_MODULESETTINGS']._serialized_end=323
_globals['_CHANNEL']._serialized_start=326
_globals['_CHANNEL']._serialized_end=505
_globals['_CHANNEL_ROLE']._serialized_start=457
_globals['_CHANNEL_ROLE']._serialized_end=505
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -16,7 +17,7 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class ChannelSettings(google.protobuf.message.Message): class ChannelSettings(google.protobuf.message.Message):
""" """
This information can be encoded as a QRcode/url so that other users can configure This information can be encoded as a QRcode/url so that other users can configure
@@ -100,6 +101,7 @@ class ChannelSettings(google.protobuf.message.Message):
""" """
Per-channel module settings. Per-channel module settings.
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -111,12 +113,12 @@ class ChannelSettings(google.protobuf.message.Message):
downlink_enabled: builtins.bool = ..., downlink_enabled: builtins.bool = ...,
module_settings: global___ModuleSettings | None = ..., module_settings: global___ModuleSettings | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["module_settings", b"module_settings"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["module_settings", b"module_settings"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel_num", b"channel_num", "downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "uplink_enabled", b"uplink_enabled"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel_num", b"channel_num", "downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "uplink_enabled", b"uplink_enabled"]) -> None: ...
global___ChannelSettings = ChannelSettings global___ChannelSettings = ChannelSettings
@typing_extensions.final @typing.final
class ModuleSettings(google.protobuf.message.Message): class ModuleSettings(google.protobuf.message.Message):
""" """
This message is specifically for modules to store per-channel configuration data. This message is specifically for modules to store per-channel configuration data.
@@ -125,20 +127,27 @@ class ModuleSettings(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
POSITION_PRECISION_FIELD_NUMBER: builtins.int POSITION_PRECISION_FIELD_NUMBER: builtins.int
IS_CLIENT_MUTED_FIELD_NUMBER: builtins.int
position_precision: builtins.int position_precision: builtins.int
""" """
Bits of precision for the location sent in position packets. Bits of precision for the location sent in position packets.
""" """
is_client_muted: builtins.bool
"""
Controls whether or not the phone / clients should mute the current channel
Useful for noisy public channels you don't necessarily want to disable
"""
def __init__( def __init__(
self, self,
*, *,
position_precision: builtins.int = ..., position_precision: builtins.int = ...,
is_client_muted: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["position_precision", b"position_precision"]) -> None: ... def ClearField(self, field_name: typing.Literal["is_client_muted", b"is_client_muted", "position_precision", b"position_precision"]) -> None: ...
global___ModuleSettings = ModuleSettings global___ModuleSettings = ModuleSettings
@typing_extensions.final @typing.final
class Channel(google.protobuf.message.Message): class Channel(google.protobuf.message.Message):
""" """
A pair of a channel number, mode and the (sharable) settings for that channel A pair of a channel number, mode and the (sharable) settings for that channel
@@ -202,15 +211,16 @@ class Channel(google.protobuf.message.Message):
(Someday - not currently implemented) An index of -1 could be used to mean "set by name", (Someday - not currently implemented) An index of -1 could be used to mean "set by name",
in which case the target node will find and set the channel by settings.name. in which case the target node will find and set the channel by settings.name.
""" """
role: global___Channel.Role.ValueType
"""
TODO: REPLACE
"""
@property @property
def settings(self) -> global___ChannelSettings: def settings(self) -> global___ChannelSettings:
""" """
The new settings, or NULL to disable that channel The new settings, or NULL to disable that channel
""" """
role: global___Channel.Role.ValueType
"""
TODO: REPLACE
"""
def __init__( def __init__(
self, self,
*, *,
@@ -218,7 +228,7 @@ class Channel(google.protobuf.message.Message):
settings: global___ChannelSettings | None = ..., settings: global___ChannelSettings | None = ...,
role: global___Channel.Role.ValueType = ..., role: global___Channel.Role.ValueType = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["settings", b"settings"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["settings", b"settings"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["index", b"index", "role", b"role", "settings", b"settings"]) -> None: ... def ClearField(self, field_name: typing.Literal["index", b"index", "role", b"role", "settings", b"settings"]) -> None: ...
global___Channel = Channel global___Channel = Channel

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/clientonly.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\"\x9f\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\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\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')
_globals = globals()
_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\023com.geeksville.meshB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_DEVICEPROFILE']._serialized_start=99
_globals['_DEVICEPROFILE']._serialized_end=386
# @@protoc_insertion_point(module_scope)

View File

@@ -0,0 +1,74 @@
"""
@generated by mypy-protobuf. Do not edit manually!
isort:skip_file
"""
import builtins
import google.protobuf.descriptor
import google.protobuf.message
import meshtastic.protobuf.localonly_pb2
import typing
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing.final
class DeviceProfile(google.protobuf.message.Message):
"""
This abstraction is used to contain any configuration for provisioning a node on any client.
It is useful for importing and exporting configurations.
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
LONG_NAME_FIELD_NUMBER: builtins.int
SHORT_NAME_FIELD_NUMBER: builtins.int
CHANNEL_URL_FIELD_NUMBER: builtins.int
CONFIG_FIELD_NUMBER: builtins.int
MODULE_CONFIG_FIELD_NUMBER: builtins.int
long_name: builtins.str
"""
Long name for the node
"""
short_name: builtins.str
"""
Short name of the node
"""
channel_url: builtins.str
"""
The url of the channels from our node
"""
@property
def config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig:
"""
The Config of the node
"""
@property
def module_config(self) -> meshtastic.protobuf.localonly_pb2.LocalModuleConfig:
"""
The ModuleConfig of the node
"""
def __init__(
self,
*,
long_name: builtins.str | None = ...,
short_name: builtins.str | None = ...,
channel_url: builtins.str | None = ...,
config: meshtastic.protobuf.localonly_pb2.LocalConfig | None = ...,
module_config: meshtastic.protobuf.localonly_pb2.LocalModuleConfig | None = ...,
) -> None: ...
def HasField(self, field_name: typing.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> builtins.bool: ...
def ClearField(self, field_name: typing.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_channel_url", b"_channel_url"]) -> typing.Literal["channel_url"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_config", b"_config"]) -> typing.Literal["config"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_long_name", b"_long_name"]) -> typing.Literal["long_name"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_module_config", b"_module_config"]) -> typing.Literal["module_config"] | None: ...
@typing.overload
def WhichOneof(self, oneof_group: typing.Literal["_short_name", b"_short_name"]) -> typing.Literal["short_name"] | None: ...
global___DeviceProfile = DeviceProfile

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
@@ -18,11 +19,11 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class Config(google.protobuf.message.Message): class Config(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing_extensions.final @typing.final
class DeviceConfig(google.protobuf.message.Message): class DeviceConfig(google.protobuf.message.Message):
""" """
Configuration Configuration
@@ -315,9 +316,9 @@ class Config(google.protobuf.message.Message):
tzdef: builtins.str = ..., tzdef: builtins.str = ...,
led_heartbeat_disabled: builtins.bool = ..., led_heartbeat_disabled: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "debug_log_enabled", b"debug_log_enabled", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "led_heartbeat_disabled", b"led_heartbeat_disabled", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled", "tzdef", b"tzdef"]) -> None: ... def ClearField(self, field_name: typing.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "debug_log_enabled", b"debug_log_enabled", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "led_heartbeat_disabled", b"led_heartbeat_disabled", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled", "tzdef", b"tzdef"]) -> None: ...
@typing_extensions.final @typing.final
class PositionConfig(google.protobuf.message.Message): class PositionConfig(google.protobuf.message.Message):
""" """
Position Config Position Config
@@ -560,9 +561,9 @@ class Config(google.protobuf.message.Message):
gps_en_gpio: builtins.int = ..., gps_en_gpio: builtins.int = ...,
gps_mode: global___Config.PositionConfig.GpsMode.ValueType = ..., gps_mode: global___Config.PositionConfig.GpsMode.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_attempt_time", b"gps_attempt_time", "gps_en_gpio", b"gps_en_gpio", "gps_enabled", b"gps_enabled", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"]) -> None: ... def ClearField(self, field_name: typing.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_attempt_time", b"gps_attempt_time", "gps_en_gpio", b"gps_en_gpio", "gps_enabled", b"gps_enabled", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"]) -> None: ...
@typing_extensions.final @typing.final
class PowerConfig(google.protobuf.message.Message): class PowerConfig(google.protobuf.message.Message):
""" """
Power Config\\ Power Config\\
@@ -634,9 +635,9 @@ class Config(google.protobuf.message.Message):
min_wake_secs: builtins.int = ..., min_wake_secs: builtins.int = ...,
device_battery_ina_address: builtins.int = ..., device_battery_ina_address: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["adc_multiplier_override", b"adc_multiplier_override", "device_battery_ina_address", b"device_battery_ina_address", "is_power_saving", b"is_power_saving", "ls_secs", b"ls_secs", "min_wake_secs", b"min_wake_secs", "on_battery_shutdown_after_secs", b"on_battery_shutdown_after_secs", "sds_secs", b"sds_secs", "wait_bluetooth_secs", b"wait_bluetooth_secs"]) -> None: ... def ClearField(self, field_name: typing.Literal["adc_multiplier_override", b"adc_multiplier_override", "device_battery_ina_address", b"device_battery_ina_address", "is_power_saving", b"is_power_saving", "ls_secs", b"ls_secs", "min_wake_secs", b"min_wake_secs", "on_battery_shutdown_after_secs", b"on_battery_shutdown_after_secs", "sds_secs", b"sds_secs", "wait_bluetooth_secs", b"wait_bluetooth_secs"]) -> None: ...
@typing_extensions.final @typing.final
class NetworkConfig(google.protobuf.message.Message): class NetworkConfig(google.protobuf.message.Message):
""" """
Network Config Network Config
@@ -669,7 +670,7 @@ class Config(google.protobuf.message.Message):
use static ip address use static ip address
""" """
@typing_extensions.final @typing.final
class IpV4Config(google.protobuf.message.Message): class IpV4Config(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -701,7 +702,7 @@ class Config(google.protobuf.message.Message):
subnet: builtins.int = ..., subnet: builtins.int = ...,
dns: builtins.int = ..., dns: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["dns", b"dns", "gateway", b"gateway", "ip", b"ip", "subnet", b"subnet"]) -> None: ... def ClearField(self, field_name: typing.Literal["dns", b"dns", "gateway", b"gateway", "ip", b"ip", "subnet", b"subnet"]) -> None: ...
WIFI_ENABLED_FIELD_NUMBER: builtins.int WIFI_ENABLED_FIELD_NUMBER: builtins.int
WIFI_SSID_FIELD_NUMBER: builtins.int WIFI_SSID_FIELD_NUMBER: builtins.int
@@ -736,15 +737,16 @@ class Config(google.protobuf.message.Message):
""" """
acquire an address via DHCP or assign static acquire an address via DHCP or assign static
""" """
rsyslog_server: builtins.str
"""
rsyslog Server and Port
"""
@property @property
def ipv4_config(self) -> global___Config.NetworkConfig.IpV4Config: def ipv4_config(self) -> global___Config.NetworkConfig.IpV4Config:
""" """
struct to keep static address struct to keep static address
""" """
rsyslog_server: builtins.str
"""
rsyslog Server and Port
"""
def __init__( def __init__(
self, self,
*, *,
@@ -757,10 +759,10 @@ class Config(google.protobuf.message.Message):
ipv4_config: global___Config.NetworkConfig.IpV4Config | None = ..., ipv4_config: global___Config.NetworkConfig.IpV4Config | None = ...,
rsyslog_server: builtins.str = ..., rsyslog_server: builtins.str = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["ipv4_config", b"ipv4_config"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["ipv4_config", b"ipv4_config"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["address_mode", b"address_mode", "eth_enabled", b"eth_enabled", "ipv4_config", b"ipv4_config", "ntp_server", b"ntp_server", "rsyslog_server", b"rsyslog_server", "wifi_enabled", b"wifi_enabled", "wifi_psk", b"wifi_psk", "wifi_ssid", b"wifi_ssid"]) -> None: ... def ClearField(self, field_name: typing.Literal["address_mode", b"address_mode", "eth_enabled", b"eth_enabled", "ipv4_config", b"ipv4_config", "ntp_server", b"ntp_server", "rsyslog_server", b"rsyslog_server", "wifi_enabled", b"wifi_enabled", "wifi_psk", b"wifi_psk", "wifi_ssid", b"wifi_ssid"]) -> None: ...
@typing_extensions.final @typing.final
class DisplayConfig(google.protobuf.message.Message): class DisplayConfig(google.protobuf.message.Message):
""" """
Display Config Display Config
@@ -958,6 +960,79 @@ class Config(google.protobuf.message.Message):
TFT Full Color Displays (not implemented yet) TFT Full Color Displays (not implemented yet)
""" """
class _CompassOrientation:
ValueType = typing.NewType("ValueType", builtins.int)
V: typing_extensions.TypeAlias = ValueType
class _CompassOrientationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._CompassOrientation.ValueType], builtins.type):
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
DEGREES_0: Config.DisplayConfig._CompassOrientation.ValueType # 0
"""
The compass and the display are in the same orientation.
"""
DEGREES_90: Config.DisplayConfig._CompassOrientation.ValueType # 1
"""
Rotate the compass by 90 degrees.
"""
DEGREES_180: Config.DisplayConfig._CompassOrientation.ValueType # 2
"""
Rotate the compass by 180 degrees.
"""
DEGREES_270: Config.DisplayConfig._CompassOrientation.ValueType # 3
"""
Rotate the compass by 270 degrees.
"""
DEGREES_0_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 4
"""
Don't rotate the compass, but invert the result.
"""
DEGREES_90_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 5
"""
Rotate the compass by 90 degrees and invert.
"""
DEGREES_180_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 6
"""
Rotate the compass by 180 degrees and invert.
"""
DEGREES_270_INVERTED: Config.DisplayConfig._CompassOrientation.ValueType # 7
"""
Rotate the compass by 270 degrees and invert.
"""
class CompassOrientation(_CompassOrientation, metaclass=_CompassOrientationEnumTypeWrapper): ...
DEGREES_0: Config.DisplayConfig.CompassOrientation.ValueType # 0
"""
The compass and the display are in the same orientation.
"""
DEGREES_90: Config.DisplayConfig.CompassOrientation.ValueType # 1
"""
Rotate the compass by 90 degrees.
"""
DEGREES_180: Config.DisplayConfig.CompassOrientation.ValueType # 2
"""
Rotate the compass by 180 degrees.
"""
DEGREES_270: Config.DisplayConfig.CompassOrientation.ValueType # 3
"""
Rotate the compass by 270 degrees.
"""
DEGREES_0_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 4
"""
Don't rotate the compass, but invert the result.
"""
DEGREES_90_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 5
"""
Rotate the compass by 90 degrees and invert.
"""
DEGREES_180_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 6
"""
Rotate the compass by 180 degrees and invert.
"""
DEGREES_270_INVERTED: Config.DisplayConfig.CompassOrientation.ValueType # 7
"""
Rotate the compass by 270 degrees and invert.
"""
SCREEN_ON_SECS_FIELD_NUMBER: builtins.int SCREEN_ON_SECS_FIELD_NUMBER: builtins.int
GPS_FORMAT_FIELD_NUMBER: builtins.int GPS_FORMAT_FIELD_NUMBER: builtins.int
AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: builtins.int AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: builtins.int
@@ -968,6 +1043,7 @@ class Config(google.protobuf.message.Message):
DISPLAYMODE_FIELD_NUMBER: builtins.int DISPLAYMODE_FIELD_NUMBER: builtins.int
HEADING_BOLD_FIELD_NUMBER: builtins.int HEADING_BOLD_FIELD_NUMBER: builtins.int
WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: builtins.int WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: builtins.int
COMPASS_ORIENTATION_FIELD_NUMBER: builtins.int
screen_on_secs: builtins.int screen_on_secs: builtins.int
""" """
Number of seconds the screen stays on after pressing the user button or receiving a message Number of seconds the screen stays on after pressing the user button or receiving a message
@@ -1011,6 +1087,10 @@ class Config(google.protobuf.message.Message):
""" """
Should we wake the screen up on accelerometer detected motion or tap Should we wake the screen up on accelerometer detected motion or tap
""" """
compass_orientation: global___Config.DisplayConfig.CompassOrientation.ValueType
"""
Indicates how to rotate or invert the compass output to accurate display on the display.
"""
def __init__( def __init__(
self, self,
*, *,
@@ -1024,10 +1104,11 @@ class Config(google.protobuf.message.Message):
displaymode: global___Config.DisplayConfig.DisplayMode.ValueType = ..., displaymode: global___Config.DisplayConfig.DisplayMode.ValueType = ...,
heading_bold: builtins.bool = ..., heading_bold: builtins.bool = ...,
wake_on_tap_or_motion: builtins.bool = ..., wake_on_tap_or_motion: builtins.bool = ...,
compass_orientation: global___Config.DisplayConfig.CompassOrientation.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["auto_screen_carousel_secs", b"auto_screen_carousel_secs", "compass_north_top", b"compass_north_top", "displaymode", b"displaymode", "flip_screen", b"flip_screen", "gps_format", b"gps_format", "heading_bold", b"heading_bold", "oled", b"oled", "screen_on_secs", b"screen_on_secs", "units", b"units", "wake_on_tap_or_motion", b"wake_on_tap_or_motion"]) -> None: ... def ClearField(self, field_name: typing.Literal["auto_screen_carousel_secs", b"auto_screen_carousel_secs", "compass_north_top", b"compass_north_top", "compass_orientation", b"compass_orientation", "displaymode", b"displaymode", "flip_screen", b"flip_screen", "gps_format", b"gps_format", "heading_bold", b"heading_bold", "oled", b"oled", "screen_on_secs", b"screen_on_secs", "units", b"units", "wake_on_tap_or_motion", b"wake_on_tap_or_motion"]) -> None: ...
@typing_extensions.final @typing.final
class LoRaConfig(google.protobuf.message.Message): class LoRaConfig(google.protobuf.message.Message):
""" """
Lora Config Lora Config
@@ -1375,6 +1456,10 @@ class Config(google.protobuf.message.Message):
Please respect your local laws and regulations. If you are a HAM, make sure you Please respect your local laws and regulations. If you are a HAM, make sure you
enable HAM mode and turn off encryption. enable HAM mode and turn off encryption.
""" """
ignore_mqtt: builtins.bool
"""
If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it.
"""
@property @property
def ignore_incoming(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: def ignore_incoming(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
""" """
@@ -1382,10 +1467,7 @@ class Config(google.protobuf.message.Message):
particular other nodes (simulating radio out of range). All nodenums listed particular other nodes (simulating radio out of range). All nodenums listed
in ignore_incoming will have packets they send dropped on receive (by router.cpp) in ignore_incoming will have packets they send dropped on receive (by router.cpp)
""" """
ignore_mqtt: builtins.bool
"""
If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it.
"""
def __init__( def __init__(
self, self,
*, *,
@@ -1406,9 +1488,9 @@ class Config(google.protobuf.message.Message):
ignore_incoming: collections.abc.Iterable[builtins.int] | None = ..., ignore_incoming: collections.abc.Iterable[builtins.int] | None = ...,
ignore_mqtt: builtins.bool = ..., ignore_mqtt: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["bandwidth", b"bandwidth", "channel_num", b"channel_num", "coding_rate", b"coding_rate", "frequency_offset", b"frequency_offset", "hop_limit", b"hop_limit", "ignore_incoming", b"ignore_incoming", "ignore_mqtt", b"ignore_mqtt", "modem_preset", b"modem_preset", "override_duty_cycle", b"override_duty_cycle", "override_frequency", b"override_frequency", "region", b"region", "spread_factor", b"spread_factor", "sx126x_rx_boosted_gain", b"sx126x_rx_boosted_gain", "tx_enabled", b"tx_enabled", "tx_power", b"tx_power", "use_preset", b"use_preset"]) -> None: ... def ClearField(self, field_name: typing.Literal["bandwidth", b"bandwidth", "channel_num", b"channel_num", "coding_rate", b"coding_rate", "frequency_offset", b"frequency_offset", "hop_limit", b"hop_limit", "ignore_incoming", b"ignore_incoming", "ignore_mqtt", b"ignore_mqtt", "modem_preset", b"modem_preset", "override_duty_cycle", b"override_duty_cycle", "override_frequency", b"override_frequency", "region", b"region", "spread_factor", b"spread_factor", "sx126x_rx_boosted_gain", b"sx126x_rx_boosted_gain", "tx_enabled", b"tx_enabled", "tx_power", b"tx_power", "use_preset", b"use_preset"]) -> None: ...
@typing_extensions.final @typing.final
class BluetoothConfig(google.protobuf.message.Message): class BluetoothConfig(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -1467,7 +1549,7 @@ class Config(google.protobuf.message.Message):
mode: global___Config.BluetoothConfig.PairingMode.ValueType = ..., mode: global___Config.BluetoothConfig.PairingMode.ValueType = ...,
fixed_pin: builtins.int = ..., fixed_pin: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "fixed_pin", b"fixed_pin", "mode", b"mode"]) -> None: ... def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "fixed_pin", b"fixed_pin", "mode", b"mode"]) -> None: ...
DEVICE_FIELD_NUMBER: builtins.int DEVICE_FIELD_NUMBER: builtins.int
POSITION_FIELD_NUMBER: builtins.int POSITION_FIELD_NUMBER: builtins.int
@@ -1501,8 +1583,8 @@ class Config(google.protobuf.message.Message):
lora: global___Config.LoRaConfig | None = ..., lora: global___Config.LoRaConfig | None = ...,
bluetooth: global___Config.BluetoothConfig | None = ..., bluetooth: global___Config.BluetoothConfig | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> None: ... def ClearField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["device", "position", "power", "network", "display", "lora", "bluetooth"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["device", "position", "power", "network", "display", "lora", "bluetooth"] | None: ...
global___Config = Config global___Config = Config

View File

@@ -0,0 +1,36 @@
# -*- 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 import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@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\x65\n\x13\x63om.geeksville.meshB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_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\023com.geeksville.meshB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_DEVICECONNECTIONSTATUS']._serialized_start=69
_globals['_DEVICECONNECTIONSTATUS']._serialized_end=410
_globals['_WIFICONNECTIONSTATUS']._serialized_start=412
_globals['_WIFICONNECTIONSTATUS']._serialized_end=524
_globals['_ETHERNETCONNECTIONSTATUS']._serialized_start=526
_globals['_ETHERNETCONNECTIONSTATUS']._serialized_end=614
_globals['_NETWORKCONNECTIONSTATUS']._serialized_start=616
_globals['_NETWORKCONNECTIONSTATUS']._serialized_end=739
_globals['_BLUETOOTHCONNECTIONSTATUS']._serialized_start=741
_globals['_BLUETOOTHCONNECTIONSTATUS']._serialized_end=817
_globals['_SERIALCONNECTIONSTATUS']._serialized_start=819
_globals['_SERIALCONNECTIONSTATUS']._serialized_end=879
# @@protoc_insertion_point(module_scope)

View File

@@ -2,20 +2,15 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.message import google.protobuf.message
import sys
import typing import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class DeviceConnectionStatus(google.protobuf.message.Message): class DeviceConnectionStatus(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -28,21 +23,25 @@ class DeviceConnectionStatus(google.protobuf.message.Message):
""" """
WiFi Status WiFi Status
""" """
@property @property
def ethernet(self) -> global___EthernetConnectionStatus: def ethernet(self) -> global___EthernetConnectionStatus:
""" """
WiFi Status WiFi Status
""" """
@property @property
def bluetooth(self) -> global___BluetoothConnectionStatus: def bluetooth(self) -> global___BluetoothConnectionStatus:
""" """
Bluetooth Status Bluetooth Status
""" """
@property @property
def serial(self) -> global___SerialConnectionStatus: def serial(self) -> global___SerialConnectionStatus:
""" """
Serial Status Serial Status
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -51,20 +50,20 @@ class DeviceConnectionStatus(google.protobuf.message.Message):
bluetooth: global___BluetoothConnectionStatus | None = ..., bluetooth: global___BluetoothConnectionStatus | None = ...,
serial: global___SerialConnectionStatus | None = ..., serial: global___SerialConnectionStatus | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> None: ... def ClearField(self, field_name: typing.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> None: ...
@typing.overload @typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_bluetooth", b"_bluetooth"]) -> typing_extensions.Literal["bluetooth"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["_bluetooth", b"_bluetooth"]) -> typing.Literal["bluetooth"] | None: ...
@typing.overload @typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_ethernet", b"_ethernet"]) -> typing_extensions.Literal["ethernet"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["_ethernet", b"_ethernet"]) -> typing.Literal["ethernet"] | None: ...
@typing.overload @typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_serial", b"_serial"]) -> typing_extensions.Literal["serial"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["_serial", b"_serial"]) -> typing.Literal["serial"] | None: ...
@typing.overload @typing.overload
def WhichOneof(self, oneof_group: typing_extensions.Literal["_wifi", b"_wifi"]) -> typing_extensions.Literal["wifi"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["_wifi", b"_wifi"]) -> typing.Literal["wifi"] | None: ...
global___DeviceConnectionStatus = DeviceConnectionStatus global___DeviceConnectionStatus = DeviceConnectionStatus
@typing_extensions.final @typing.final
class WifiConnectionStatus(google.protobuf.message.Message): class WifiConnectionStatus(google.protobuf.message.Message):
""" """
WiFi connection status WiFi connection status
@@ -75,11 +74,6 @@ class WifiConnectionStatus(google.protobuf.message.Message):
STATUS_FIELD_NUMBER: builtins.int STATUS_FIELD_NUMBER: builtins.int
SSID_FIELD_NUMBER: builtins.int SSID_FIELD_NUMBER: builtins.int
RSSI_FIELD_NUMBER: builtins.int RSSI_FIELD_NUMBER: builtins.int
@property
def status(self) -> global___NetworkConnectionStatus:
"""
Connection status
"""
ssid: builtins.str ssid: builtins.str
""" """
WiFi access point SSID WiFi access point SSID
@@ -88,6 +82,12 @@ class WifiConnectionStatus(google.protobuf.message.Message):
""" """
RSSI of wireless connection RSSI of wireless connection
""" """
@property
def status(self) -> global___NetworkConnectionStatus:
"""
Connection status
"""
def __init__( def __init__(
self, self,
*, *,
@@ -95,12 +95,12 @@ class WifiConnectionStatus(google.protobuf.message.Message):
ssid: builtins.str = ..., ssid: builtins.str = ...,
rssi: builtins.int = ..., rssi: builtins.int = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["status", b"status"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["status", b"status"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["rssi", b"rssi", "ssid", b"ssid", "status", b"status"]) -> None: ... def ClearField(self, field_name: typing.Literal["rssi", b"rssi", "ssid", b"ssid", "status", b"status"]) -> None: ...
global___WifiConnectionStatus = WifiConnectionStatus global___WifiConnectionStatus = WifiConnectionStatus
@typing_extensions.final @typing.final
class EthernetConnectionStatus(google.protobuf.message.Message): class EthernetConnectionStatus(google.protobuf.message.Message):
""" """
Ethernet connection status Ethernet connection status
@@ -114,17 +114,18 @@ class EthernetConnectionStatus(google.protobuf.message.Message):
""" """
Connection status Connection status
""" """
def __init__( def __init__(
self, self,
*, *,
status: global___NetworkConnectionStatus | None = ..., status: global___NetworkConnectionStatus | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["status", b"status"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["status", b"status"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["status", b"status"]) -> None: ... def ClearField(self, field_name: typing.Literal["status", b"status"]) -> None: ...
global___EthernetConnectionStatus = EthernetConnectionStatus global___EthernetConnectionStatus = EthernetConnectionStatus
@typing_extensions.final @typing.final
class NetworkConnectionStatus(google.protobuf.message.Message): class NetworkConnectionStatus(google.protobuf.message.Message):
""" """
Ethernet or WiFi connection status Ethernet or WiFi connection status
@@ -160,11 +161,11 @@ class NetworkConnectionStatus(google.protobuf.message.Message):
is_mqtt_connected: builtins.bool = ..., is_mqtt_connected: builtins.bool = ...,
is_syslog_connected: builtins.bool = ..., is_syslog_connected: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["ip_address", b"ip_address", "is_connected", b"is_connected", "is_mqtt_connected", b"is_mqtt_connected", "is_syslog_connected", b"is_syslog_connected"]) -> None: ... def ClearField(self, field_name: typing.Literal["ip_address", b"ip_address", "is_connected", b"is_connected", "is_mqtt_connected", b"is_mqtt_connected", "is_syslog_connected", b"is_syslog_connected"]) -> None: ...
global___NetworkConnectionStatus = NetworkConnectionStatus global___NetworkConnectionStatus = NetworkConnectionStatus
@typing_extensions.final @typing.final
class BluetoothConnectionStatus(google.protobuf.message.Message): class BluetoothConnectionStatus(google.protobuf.message.Message):
""" """
Bluetooth connection status Bluetooth connection status
@@ -194,11 +195,11 @@ class BluetoothConnectionStatus(google.protobuf.message.Message):
rssi: builtins.int = ..., rssi: builtins.int = ...,
is_connected: builtins.bool = ..., is_connected: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["is_connected", b"is_connected", "pin", b"pin", "rssi", b"rssi"]) -> None: ... def ClearField(self, field_name: typing.Literal["is_connected", b"is_connected", "pin", b"pin", "rssi", b"rssi"]) -> None: ...
global___BluetoothConnectionStatus = BluetoothConnectionStatus global___BluetoothConnectionStatus = BluetoothConnectionStatus
@typing_extensions.final @typing.final
class SerialConnectionStatus(google.protobuf.message.Message): class SerialConnectionStatus(google.protobuf.message.Message):
""" """
Serial connection status Serial connection status
@@ -222,6 +223,6 @@ class SerialConnectionStatus(google.protobuf.message.Message):
baud: builtins.int = ..., baud: builtins.int = ...,
is_connected: builtins.bool = ..., is_connected: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["baud", b"baud", "is_connected", b"is_connected"]) -> None: ... def ClearField(self, field_name: typing.Literal["baud", b"baud", "is_connected", b"is_connected"]) -> None: ...
global___SerialConnectionStatus = SerialConnectionStatus global___SerialConnectionStatus = SerialConnectionStatus

View File

@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/deviceonly.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@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 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 module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2
from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2
import nanopb_pb2 as nanopb__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a\x0cnanopb.proto\"\x99\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\"\xa1\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\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\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"\x82\x04\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\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\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\x12\x63\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\xb2\x02\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12\x32\n\x08oem_font\x18\x04 \x01(\x0e\x32 .meshtastic.protobuf.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12:\n\x10oem_local_config\x18\x07 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12G\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42m\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
_globals = globals()
_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\023com.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_DEVICESTATE.fields_by_name['no_save']._options = None
_DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
_DEVICESTATE.fields_by_name['node_db_lite']._options = None
_DEVICESTATE.fields_by_name['node_db_lite']._serialized_options = b'\222?\'\222\001$std::vector<meshtastic_NodeInfoLite>'
_globals['_SCREENFONTS']._serialized_start=1611
_globals['_SCREENFONTS']._serialized_end=1673
_globals['_POSITIONLITE']._serialized_start=258
_globals['_POSITIONLITE']._serialized_end=411
_globals['_NODEINFOLITE']._serialized_start=414
_globals['_NODEINFOLITE']._serialized_end=703
_globals['_DEVICESTATE']._serialized_start=706
_globals['_DEVICESTATE']._serialized_end=1220
_globals['_CHANNELFILE']._serialized_start=1222
_globals['_CHANNELFILE']._serialized_end=1300
_globals['_OEMSTORE']._serialized_start=1303
_globals['_OEMSTORE']._serialized_end=1609
# @@protoc_insertion_point(module_scope)

View File

@@ -2,16 +2,17 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.containers import google.protobuf.internal.containers
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
import google.protobuf.message import google.protobuf.message
import meshtastic.channel_pb2 import meshtastic.protobuf.channel_pb2
import meshtastic.localonly_pb2 import meshtastic.protobuf.localonly_pb2
import meshtastic.mesh_pb2 import meshtastic.protobuf.mesh_pb2
import meshtastic.telemetry_pb2 import meshtastic.protobuf.telemetry_pb2
import sys import sys
import typing import typing
@@ -60,7 +61,7 @@ TODO: REPLACE
""" """
global___ScreenFonts = ScreenFonts global___ScreenFonts = ScreenFonts
@typing_extensions.final @typing.final
class PositionLite(google.protobuf.message.Message): class PositionLite(google.protobuf.message.Message):
""" """
Position with static location information only for NodeDBLite Position with static location information only for NodeDBLite
@@ -94,7 +95,7 @@ class PositionLite(google.protobuf.message.Message):
be sent by devices which has a hardware GPS clock. be sent by devices which has a hardware GPS clock.
seconds since 1970 seconds since 1970
""" """
location_source: meshtastic.mesh_pb2.Position.LocSource.ValueType location_source: meshtastic.protobuf.mesh_pb2.Position.LocSource.ValueType
""" """
TODO: REPLACE TODO: REPLACE
""" """
@@ -105,13 +106,13 @@ class PositionLite(google.protobuf.message.Message):
longitude_i: builtins.int = ..., longitude_i: builtins.int = ...,
altitude: builtins.int = ..., altitude: builtins.int = ...,
time: builtins.int = ..., time: builtins.int = ...,
location_source: meshtastic.mesh_pb2.Position.LocSource.ValueType = ..., location_source: meshtastic.protobuf.mesh_pb2.Position.LocSource.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "time", b"time"]) -> None: ... def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "time", b"time"]) -> None: ...
global___PositionLite = PositionLite global___PositionLite = PositionLite
@typing_extensions.final @typing.final
class NodeInfoLite(google.protobuf.message.Message): class NodeInfoLite(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -129,17 +130,6 @@ class NodeInfoLite(google.protobuf.message.Message):
""" """
The node number The node number
""" """
@property
def user(self) -> meshtastic.mesh_pb2.User:
"""
The user info for this node
"""
@property
def position(self) -> global___PositionLite:
"""
This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
Position.time now indicates the last time we received a POSITION from that node.
"""
snr: builtins.float snr: builtins.float
""" """
Returns the Signal-to-noise ratio (SNR) of the last received message, Returns the Signal-to-noise ratio (SNR) of the last received message,
@@ -149,11 +139,6 @@ class NodeInfoLite(google.protobuf.message.Message):
""" """
Set to indicate the last time we received a packet from this node Set to indicate the last time we received a packet from this node
""" """
@property
def device_metrics(self) -> meshtastic.telemetry_pb2.DeviceMetrics:
"""
The latest device metrics for the node.
"""
channel: builtins.int channel: builtins.int
""" """
local channel index we heard that node on. Only populated if its not the default channel. local channel index we heard that node on. Only populated if its not the default channel.
@@ -171,26 +156,45 @@ class NodeInfoLite(google.protobuf.message.Message):
True if node is in our favorites list True if node is in our favorites list
Persists between NodeDB internal clean ups Persists between NodeDB internal clean ups
""" """
@property
def user(self) -> meshtastic.protobuf.mesh_pb2.User:
"""
The user info for this node
"""
@property
def position(self) -> global___PositionLite:
"""
This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
Position.time now indicates the last time we received a POSITION from that node.
"""
@property
def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics:
"""
The latest device metrics for the node.
"""
def __init__( def __init__(
self, self,
*, *,
num: builtins.int = ..., num: builtins.int = ...,
user: meshtastic.mesh_pb2.User | None = ..., user: meshtastic.protobuf.mesh_pb2.User | None = ...,
position: global___PositionLite | None = ..., position: global___PositionLite | None = ...,
snr: builtins.float = ..., snr: builtins.float = ...,
last_heard: builtins.int = ..., last_heard: builtins.int = ...,
device_metrics: meshtastic.telemetry_pb2.DeviceMetrics | None = ..., device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ...,
channel: builtins.int = ..., channel: builtins.int = ...,
via_mqtt: builtins.bool = ..., via_mqtt: builtins.bool = ...,
hops_away: builtins.int = ..., hops_away: builtins.int = ...,
is_favorite: builtins.bool = ..., is_favorite: builtins.bool = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ...
global___NodeInfoLite = NodeInfoLite global___NodeInfoLite = NodeInfoLite
@typing_extensions.final @typing.final
class DeviceState(google.protobuf.message.Message): class DeviceState(google.protobuf.message.Message):
""" """
This message is never sent over the wire, but it is used for serializing DB This message is never sent over the wire, but it is used for serializing DB
@@ -212,34 +216,12 @@ class DeviceState(google.protobuf.message.Message):
RX_WAYPOINT_FIELD_NUMBER: builtins.int RX_WAYPOINT_FIELD_NUMBER: builtins.int
NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int
NODE_DB_LITE_FIELD_NUMBER: builtins.int NODE_DB_LITE_FIELD_NUMBER: builtins.int
@property
def my_node(self) -> meshtastic.mesh_pb2.MyNodeInfo:
"""
Read only settings/info about this node
"""
@property
def owner(self) -> meshtastic.mesh_pb2.User:
"""
My owner info
"""
@property
def receive_queue(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.MeshPacket]:
"""
Received packets saved for delivery to the phone
"""
version: builtins.int version: builtins.int
""" """
A version integer used to invalidate old save files when we make A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code. NodeDB.cpp in the device code.
""" """
@property
def rx_text_message(self) -> meshtastic.mesh_pb2.MeshPacket:
"""
We keep the last received text message (only) stored in the device flash,
so we can show it on the screen.
Might be null
"""
no_save: builtins.bool no_save: builtins.bool
""" """
Used only during development. Used only during development.
@@ -251,42 +233,71 @@ class DeviceState(google.protobuf.message.Message):
Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset. Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset.
""" """
@property @property
def rx_waypoint(self) -> meshtastic.mesh_pb2.MeshPacket: def my_node(self) -> meshtastic.protobuf.mesh_pb2.MyNodeInfo:
"""
Read only settings/info about this node
"""
@property
def owner(self) -> meshtastic.protobuf.mesh_pb2.User:
"""
My owner info
"""
@property
def receive_queue(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.MeshPacket]:
"""
Received packets saved for delivery to the phone
"""
@property
def rx_text_message(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket:
"""
We keep the last received text message (only) stored in the device flash,
so we can show it on the screen.
Might be null
"""
@property
def rx_waypoint(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket:
""" """
We keep the last received waypoint stored in the device flash, We keep the last received waypoint stored in the device flash,
so we can show it on the screen. so we can show it on the screen.
Might be null Might be null
""" """
@property @property
def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.NodeRemoteHardwarePin]: def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin]:
""" """
The mesh's nodes with their available gpio pins for RemoteHardware module The mesh's nodes with their available gpio pins for RemoteHardware module
""" """
@property @property
def node_db_lite(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite]: def node_db_lite(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite]:
""" """
New lite version of NodeDB to decrease memory footprint New lite version of NodeDB to decrease memory footprint
""" """
def __init__( def __init__(
self, self,
*, *,
my_node: meshtastic.mesh_pb2.MyNodeInfo | None = ..., my_node: meshtastic.protobuf.mesh_pb2.MyNodeInfo | None = ...,
owner: meshtastic.mesh_pb2.User | None = ..., owner: meshtastic.protobuf.mesh_pb2.User | None = ...,
receive_queue: collections.abc.Iterable[meshtastic.mesh_pb2.MeshPacket] | None = ..., receive_queue: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.MeshPacket] | None = ...,
version: builtins.int = ..., version: builtins.int = ...,
rx_text_message: meshtastic.mesh_pb2.MeshPacket | None = ..., rx_text_message: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ...,
no_save: builtins.bool = ..., no_save: builtins.bool = ...,
did_gps_reset: builtins.bool = ..., did_gps_reset: builtins.bool = ...,
rx_waypoint: meshtastic.mesh_pb2.MeshPacket | None = ..., rx_waypoint: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ...,
node_remote_hardware_pins: collections.abc.Iterable[meshtastic.mesh_pb2.NodeRemoteHardwarePin] | None = ..., node_remote_hardware_pins: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin] | None = ...,
node_db_lite: collections.abc.Iterable[global___NodeInfoLite] | None = ..., node_db_lite: collections.abc.Iterable[global___NodeInfoLite] | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["my_node", b"my_node", "owner", b"owner", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["my_node", b"my_node", "owner", b"owner", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["did_gps_reset", b"did_gps_reset", "my_node", b"my_node", "no_save", b"no_save", "node_db_lite", b"node_db_lite", "node_remote_hardware_pins", b"node_remote_hardware_pins", "owner", b"owner", "receive_queue", b"receive_queue", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint", "version", b"version"]) -> None: ... def ClearField(self, field_name: typing.Literal["did_gps_reset", b"did_gps_reset", "my_node", b"my_node", "no_save", b"no_save", "node_db_lite", b"node_db_lite", "node_remote_hardware_pins", b"node_remote_hardware_pins", "owner", b"owner", "receive_queue", b"receive_queue", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint", "version", b"version"]) -> None: ...
global___DeviceState = DeviceState global___DeviceState = DeviceState
@typing_extensions.final @typing.final
class ChannelFile(google.protobuf.message.Message): class ChannelFile(google.protobuf.message.Message):
""" """
The on-disk saved channels The on-disk saved channels
@@ -296,28 +307,29 @@ class ChannelFile(google.protobuf.message.Message):
CHANNELS_FIELD_NUMBER: builtins.int CHANNELS_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int VERSION_FIELD_NUMBER: builtins.int
@property
def channels(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.channel_pb2.Channel]:
"""
The channels our node knows about
"""
version: builtins.int version: builtins.int
""" """
A version integer used to invalidate old save files when we make A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code. NodeDB.cpp in the device code.
""" """
@property
def channels(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.protobuf.channel_pb2.Channel]:
"""
The channels our node knows about
"""
def __init__( def __init__(
self, self,
*, *,
channels: collections.abc.Iterable[meshtastic.channel_pb2.Channel] | None = ..., channels: collections.abc.Iterable[meshtastic.protobuf.channel_pb2.Channel] | None = ...,
version: builtins.int = ..., version: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["channels", b"channels", "version", b"version"]) -> None: ... def ClearField(self, field_name: typing.Literal["channels", b"channels", "version", b"version"]) -> None: ...
global___ChannelFile = ChannelFile global___ChannelFile = ChannelFile
@typing_extensions.final @typing.final
class OEMStore(google.protobuf.message.Message): class OEMStore(google.protobuf.message.Message):
""" """
This can be used for customizing the firmware distribution. If populated, This can be used for customizing the firmware distribution. If populated,
@@ -359,15 +371,17 @@ class OEMStore(google.protobuf.message.Message):
The default device encryption key, 16 or 32 byte The default device encryption key, 16 or 32 byte
""" """
@property @property
def oem_local_config(self) -> meshtastic.localonly_pb2.LocalConfig: def oem_local_config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig:
""" """
A Preset LocalConfig to apply during factory reset A Preset LocalConfig to apply during factory reset
""" """
@property @property
def oem_local_module_config(self) -> meshtastic.localonly_pb2.LocalModuleConfig: def oem_local_module_config(self) -> meshtastic.protobuf.localonly_pb2.LocalModuleConfig:
""" """
A Preset LocalModuleConfig to apply during factory reset A Preset LocalModuleConfig to apply during factory reset
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -377,10 +391,10 @@ class OEMStore(google.protobuf.message.Message):
oem_font: global___ScreenFonts.ValueType = ..., oem_font: global___ScreenFonts.ValueType = ...,
oem_text: builtins.str = ..., oem_text: builtins.str = ...,
oem_aes_key: builtins.bytes = ..., oem_aes_key: builtins.bytes = ...,
oem_local_config: meshtastic.localonly_pb2.LocalConfig | None = ..., oem_local_config: meshtastic.protobuf.localonly_pb2.LocalConfig | None = ...,
oem_local_module_config: meshtastic.localonly_pb2.LocalModuleConfig | None = ..., oem_local_module_config: meshtastic.protobuf.localonly_pb2.LocalModuleConfig | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["oem_aes_key", b"oem_aes_key", "oem_font", b"oem_font", "oem_icon_bits", b"oem_icon_bits", "oem_icon_height", b"oem_icon_height", "oem_icon_width", b"oem_icon_width", "oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config", "oem_text", b"oem_text"]) -> None: ... def ClearField(self, field_name: typing.Literal["oem_aes_key", b"oem_aes_key", "oem_font", b"oem_font", "oem_icon_bits", b"oem_icon_bits", "oem_icon_height", b"oem_icon_height", "oem_icon_width", b"oem_icon_width", "oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config", "oem_text", b"oem_text"]) -> None: ...
global___OEMStore = OEMStore global___OEMStore = OEMStore

View File

@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/localonly.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@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\"\xbc\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\"\xf0\x07\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\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')
_globals = globals()
_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\023com.geeksville.meshB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_LOCALCONFIG']._serialized_start=136
_globals['_LOCALCONFIG']._serialized_end=580
_globals['_LOCALMODULECONFIG']._serialized_start=583
_globals['_LOCALMODULECONFIG']._serialized_end=1591
# @@protoc_insertion_point(module_scope)

View File

@@ -0,0 +1,220 @@
"""
@generated by mypy-protobuf. Do not edit manually!
isort:skip_file
"""
import builtins
import google.protobuf.descriptor
import google.protobuf.message
import meshtastic.protobuf.config_pb2
import meshtastic.protobuf.module_config_pb2
import typing
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing.final
class LocalConfig(google.protobuf.message.Message):
"""
Protobuf structures common to apponly.proto and deviceonly.proto
This is never sent over the wire, only for local use
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
DEVICE_FIELD_NUMBER: builtins.int
POSITION_FIELD_NUMBER: builtins.int
POWER_FIELD_NUMBER: builtins.int
NETWORK_FIELD_NUMBER: builtins.int
DISPLAY_FIELD_NUMBER: builtins.int
LORA_FIELD_NUMBER: builtins.int
BLUETOOTH_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
version: builtins.int
"""
A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code.
"""
@property
def device(self) -> meshtastic.protobuf.config_pb2.Config.DeviceConfig:
"""
The part of the config that is specific to the Device
"""
@property
def position(self) -> meshtastic.protobuf.config_pb2.Config.PositionConfig:
"""
The part of the config that is specific to the GPS Position
"""
@property
def power(self) -> meshtastic.protobuf.config_pb2.Config.PowerConfig:
"""
The part of the config that is specific to the Power settings
"""
@property
def network(self) -> meshtastic.protobuf.config_pb2.Config.NetworkConfig:
"""
The part of the config that is specific to the Wifi Settings
"""
@property
def display(self) -> meshtastic.protobuf.config_pb2.Config.DisplayConfig:
"""
The part of the config that is specific to the Display
"""
@property
def lora(self) -> meshtastic.protobuf.config_pb2.Config.LoRaConfig:
"""
The part of the config that is specific to the Lora Radio
"""
@property
def bluetooth(self) -> meshtastic.protobuf.config_pb2.Config.BluetoothConfig:
"""
The part of the config that is specific to the Bluetooth settings
"""
def __init__(
self,
*,
device: meshtastic.protobuf.config_pb2.Config.DeviceConfig | None = ...,
position: meshtastic.protobuf.config_pb2.Config.PositionConfig | None = ...,
power: meshtastic.protobuf.config_pb2.Config.PowerConfig | None = ...,
network: meshtastic.protobuf.config_pb2.Config.NetworkConfig | None = ...,
display: meshtastic.protobuf.config_pb2.Config.DisplayConfig | None = ...,
lora: meshtastic.protobuf.config_pb2.Config.LoRaConfig | None = ...,
bluetooth: meshtastic.protobuf.config_pb2.Config.BluetoothConfig | None = ...,
version: builtins.int = ...,
) -> None: ...
def HasField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power"]) -> builtins.bool: ...
def ClearField(self, field_name: typing.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "version", b"version"]) -> None: ...
global___LocalConfig = LocalConfig
@typing.final
class LocalModuleConfig(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor
MQTT_FIELD_NUMBER: builtins.int
SERIAL_FIELD_NUMBER: builtins.int
EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int
STORE_FORWARD_FIELD_NUMBER: builtins.int
RANGE_TEST_FIELD_NUMBER: builtins.int
TELEMETRY_FIELD_NUMBER: builtins.int
CANNED_MESSAGE_FIELD_NUMBER: builtins.int
AUDIO_FIELD_NUMBER: builtins.int
REMOTE_HARDWARE_FIELD_NUMBER: builtins.int
NEIGHBOR_INFO_FIELD_NUMBER: builtins.int
AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int
DETECTION_SENSOR_FIELD_NUMBER: builtins.int
PAXCOUNTER_FIELD_NUMBER: builtins.int
VERSION_FIELD_NUMBER: builtins.int
version: builtins.int
"""
A version integer used to invalidate old save files when we make
incompatible changes This integer is set at build time and is private to
NodeDB.cpp in the device code.
"""
@property
def mqtt(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.MQTTConfig:
"""
The part of the config that is specific to the MQTT module
"""
@property
def serial(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.SerialConfig:
"""
The part of the config that is specific to the Serial module
"""
@property
def external_notification(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.ExternalNotificationConfig:
"""
The part of the config that is specific to the ExternalNotification module
"""
@property
def store_forward(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.StoreForwardConfig:
"""
The part of the config that is specific to the Store & Forward module
"""
@property
def range_test(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.RangeTestConfig:
"""
The part of the config that is specific to the RangeTest module
"""
@property
def telemetry(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.TelemetryConfig:
"""
The part of the config that is specific to the Telemetry module
"""
@property
def canned_message(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.CannedMessageConfig:
"""
The part of the config that is specific to the Canned Message module
"""
@property
def audio(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.AudioConfig:
"""
The part of the config that is specific to the Audio module
"""
@property
def remote_hardware(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.RemoteHardwareConfig:
"""
The part of the config that is specific to the Remote Hardware module
"""
@property
def neighbor_info(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.NeighborInfoConfig:
"""
The part of the config that is specific to the Neighbor Info module
"""
@property
def ambient_lighting(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.AmbientLightingConfig:
"""
The part of the config that is specific to the Ambient Lighting module
"""
@property
def detection_sensor(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.DetectionSensorConfig:
"""
The part of the config that is specific to the Detection Sensor module
"""
@property
def paxcounter(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.PaxcounterConfig:
"""
Paxcounter Config
"""
def __init__(
self,
*,
mqtt: meshtastic.protobuf.module_config_pb2.ModuleConfig.MQTTConfig | None = ...,
serial: meshtastic.protobuf.module_config_pb2.ModuleConfig.SerialConfig | None = ...,
external_notification: meshtastic.protobuf.module_config_pb2.ModuleConfig.ExternalNotificationConfig | None = ...,
store_forward: meshtastic.protobuf.module_config_pb2.ModuleConfig.StoreForwardConfig | None = ...,
range_test: meshtastic.protobuf.module_config_pb2.ModuleConfig.RangeTestConfig | None = ...,
telemetry: meshtastic.protobuf.module_config_pb2.ModuleConfig.TelemetryConfig | None = ...,
canned_message: meshtastic.protobuf.module_config_pb2.ModuleConfig.CannedMessageConfig | None = ...,
audio: meshtastic.protobuf.module_config_pb2.ModuleConfig.AudioConfig | None = ...,
remote_hardware: meshtastic.protobuf.module_config_pb2.ModuleConfig.RemoteHardwareConfig | None = ...,
neighbor_info: meshtastic.protobuf.module_config_pb2.ModuleConfig.NeighborInfoConfig | None = ...,
ambient_lighting: meshtastic.protobuf.module_config_pb2.ModuleConfig.AmbientLightingConfig | None = ...,
detection_sensor: meshtastic.protobuf.module_config_pb2.ModuleConfig.DetectionSensorConfig | None = ...,
paxcounter: meshtastic.protobuf.module_config_pb2.ModuleConfig.PaxcounterConfig | None = ...,
version: builtins.int = ...,
) -> None: ...
def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ...
def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry", "version", b"version"]) -> None: ...
global___LocalModuleConfig = LocalModuleConfig

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,18 +2,19 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.containers import google.protobuf.internal.containers
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
import google.protobuf.message import google.protobuf.message
import meshtastic.channel_pb2 import meshtastic.protobuf.channel_pb2
import meshtastic.config_pb2 import meshtastic.protobuf.config_pb2
import meshtastic.module_config_pb2 import meshtastic.protobuf.module_config_pb2
import meshtastic.portnums_pb2 import meshtastic.protobuf.portnums_pb2
import meshtastic.telemetry_pb2 import meshtastic.protobuf.telemetry_pb2
import meshtastic.xmodem_pb2 import meshtastic.protobuf.xmodem_pb2
import sys import sys
import typing import typing
@@ -112,6 +113,18 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._
""" """
LoRAType device: https://loratype.org/ LoRAType device: https://loratype.org/
""" """
WIPHONE: _HardwareModel.ValueType # 20
"""
wiphone https://www.wiphone.io/
"""
WIO_WM1110: _HardwareModel.ValueType # 21
"""
WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk
"""
RAK2560: _HardwareModel.ValueType # 22
"""
RAK2560 Solar base station based on RAK4630
"""
STATION_G1: _HardwareModel.ValueType # 25 STATION_G1: _HardwareModel.ValueType # 25
""" """
B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station
@@ -276,6 +289,20 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._
TWC_MESH_V4 TWC_MESH_V4
Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS
""" """
NRF52_PROMICRO_DIY: _HardwareModel.ValueType # 63
"""
NRF52_PROMICRO_DIY
Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS
"""
RADIOMASTER_900_BANDIT_NANO: _HardwareModel.ValueType # 64
"""
RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module
ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS
"""
HELTEC_CAPSULE_SENSOR_V3: _HardwareModel.ValueType # 65
"""
Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors
"""
PRIVATE_HW: _HardwareModel.ValueType # 255 PRIVATE_HW: _HardwareModel.ValueType # 255
""" """
------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------
@@ -373,6 +400,18 @@ LORA_TYPE: HardwareModel.ValueType # 19
""" """
LoRAType device: https://loratype.org/ LoRAType device: https://loratype.org/
""" """
WIPHONE: HardwareModel.ValueType # 20
"""
wiphone https://www.wiphone.io/
"""
WIO_WM1110: HardwareModel.ValueType # 21
"""
WIO Tracker WM1110 family from Seeed Studio. Includes wio-1110-tracker and wio-1110-sdk
"""
RAK2560: HardwareModel.ValueType # 22
"""
RAK2560 Solar base station based on RAK4630
"""
STATION_G1: HardwareModel.ValueType # 25 STATION_G1: HardwareModel.ValueType # 25
""" """
B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station
@@ -537,6 +576,20 @@ TWC_MESH_V4: HardwareModel.ValueType # 62
TWC_MESH_V4 TWC_MESH_V4
Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS
""" """
NRF52_PROMICRO_DIY: HardwareModel.ValueType # 63
"""
NRF52_PROMICRO_DIY
Promicro NRF52840 with SX1262/LLCC68, SSD1306 OLED and NEO6M GPS
"""
RADIOMASTER_900_BANDIT_NANO: HardwareModel.ValueType # 64
"""
RadioMaster 900 Bandit Nano, https://www.radiomasterrc.com/products/bandit-nano-expresslrs-rf-module
ESP32-D0WDQ6 With SX1276/SKY66122, SSD1306 OLED and No GPS
"""
HELTEC_CAPSULE_SENSOR_V3: HardwareModel.ValueType # 65
"""
Heltec Capsule Sensor V3 with ESP32-S3 CPU, Portable LoRa device that can replace GNSS modules or sensors
"""
PRIVATE_HW: HardwareModel.ValueType # 255 PRIVATE_HW: HardwareModel.ValueType # 255
""" """
------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------
@@ -696,7 +749,7 @@ If this occurs on your board, please post in the forum so that we can ask you to
""" """
global___CriticalErrorCode = CriticalErrorCode global___CriticalErrorCode = CriticalErrorCode
@typing_extensions.final @typing.final
class Position(google.protobuf.message.Message): class Position(google.protobuf.message.Message):
""" """
a gps position a gps position
@@ -964,11 +1017,11 @@ class Position(google.protobuf.message.Message):
seq_number: builtins.int = ..., seq_number: builtins.int = ...,
precision_bits: builtins.int = ..., precision_bits: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["HDOP", b"HDOP", "PDOP", b"PDOP", "VDOP", b"VDOP", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "altitude_source", b"altitude_source", "fix_quality", b"fix_quality", "fix_type", b"fix_type", "gps_accuracy", b"gps_accuracy", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "next_update", b"next_update", "precision_bits", b"precision_bits", "sats_in_view", b"sats_in_view", "sensor_id", b"sensor_id", "seq_number", b"seq_number", "time", b"time", "timestamp", b"timestamp", "timestamp_millis_adjust", b"timestamp_millis_adjust"]) -> None: ... def ClearField(self, field_name: typing.Literal["HDOP", b"HDOP", "PDOP", b"PDOP", "VDOP", b"VDOP", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "altitude_source", b"altitude_source", "fix_quality", b"fix_quality", "fix_type", b"fix_type", "gps_accuracy", b"gps_accuracy", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "next_update", b"next_update", "precision_bits", b"precision_bits", "sats_in_view", b"sats_in_view", "sensor_id", b"sensor_id", "seq_number", b"seq_number", "time", b"time", "timestamp", b"timestamp", "timestamp_millis_adjust", b"timestamp_millis_adjust"]) -> None: ...
global___Position = Position global___Position = Position
@typing_extensions.final @typing.final
class User(google.protobuf.message.Message): class User(google.protobuf.message.Message):
""" """
Broadcast when a newly powered mesh node wants to find a node num it can use Broadcast when a newly powered mesh node wants to find a node num it can use
@@ -1037,7 +1090,7 @@ class User(google.protobuf.message.Message):
If this user is a licensed operator, set this flag. If this user is a licensed operator, set this flag.
Also, "long_name" should be their licence number. Also, "long_name" should be their licence number.
""" """
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType
""" """
Indicates that the user's role in the mesh Indicates that the user's role in the mesh
""" """
@@ -1050,13 +1103,13 @@ class User(google.protobuf.message.Message):
macaddr: builtins.bytes = ..., macaddr: builtins.bytes = ...,
hw_model: global___HardwareModel.ValueType = ..., hw_model: global___HardwareModel.ValueType = ...,
is_licensed: builtins.bool = ..., is_licensed: builtins.bool = ...,
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ..., role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "long_name", b"long_name", "macaddr", b"macaddr", "role", b"role", "short_name", b"short_name"]) -> None: ... def ClearField(self, field_name: typing.Literal["hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "long_name", b"long_name", "macaddr", b"macaddr", "role", b"role", "short_name", b"short_name"]) -> None: ...
global___User = User global___User = User
@typing_extensions.final @typing.final
class RouteDiscovery(google.protobuf.message.Message): class RouteDiscovery(google.protobuf.message.Message):
""" """
A message used in our Dynamic Source Routing protocol (RFC 4728 based) A message used in our Dynamic Source Routing protocol (RFC 4728 based)
@@ -1070,16 +1123,17 @@ class RouteDiscovery(google.protobuf.message.Message):
""" """
The list of nodenums this packet has visited so far The list of nodenums this packet has visited so far
""" """
def __init__( def __init__(
self, self,
*, *,
route: collections.abc.Iterable[builtins.int] | None = ..., route: collections.abc.Iterable[builtins.int] | None = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["route", b"route"]) -> None: ... def ClearField(self, field_name: typing.Literal["route", b"route"]) -> None: ...
global___RouteDiscovery = RouteDiscovery global___RouteDiscovery = RouteDiscovery
@typing_extensions.final @typing.final
class Routing(google.protobuf.message.Message): class Routing(google.protobuf.message.Message):
""" """
A Routing control Data packet handled by the routing module A Routing control Data packet handled by the routing module
@@ -1204,21 +1258,23 @@ class Routing(google.protobuf.message.Message):
ROUTE_REQUEST_FIELD_NUMBER: builtins.int ROUTE_REQUEST_FIELD_NUMBER: builtins.int
ROUTE_REPLY_FIELD_NUMBER: builtins.int ROUTE_REPLY_FIELD_NUMBER: builtins.int
ERROR_REASON_FIELD_NUMBER: builtins.int ERROR_REASON_FIELD_NUMBER: builtins.int
@property
def route_request(self) -> global___RouteDiscovery:
"""
A route request going from the requester
"""
@property
def route_reply(self) -> global___RouteDiscovery:
"""
A route reply
"""
error_reason: global___Routing.Error.ValueType error_reason: global___Routing.Error.ValueType
""" """
A failure in delivering a message (usually used for routing control messages, but might be provided A failure in delivering a message (usually used for routing control messages, but might be provided
in addition to ack.fail_id to provide details on the type of failure). in addition to ack.fail_id to provide details on the type of failure).
""" """
@property
def route_request(self) -> global___RouteDiscovery:
"""
A route request going from the requester
"""
@property
def route_reply(self) -> global___RouteDiscovery:
"""
A route reply
"""
def __init__( def __init__(
self, self,
*, *,
@@ -1226,13 +1282,13 @@ class Routing(google.protobuf.message.Message):
route_reply: global___RouteDiscovery | None = ..., route_reply: global___RouteDiscovery | None = ...,
error_reason: global___Routing.Error.ValueType = ..., error_reason: global___Routing.Error.ValueType = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> None: ... def ClearField(self, field_name: typing.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["route_request", "route_reply", "error_reason"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["route_request", "route_reply", "error_reason"] | None: ...
global___Routing = Routing global___Routing = Routing
@typing_extensions.final @typing.final
class Data(google.protobuf.message.Message): class Data(google.protobuf.message.Message):
""" """
(Formerly called SubPacket) (Formerly called SubPacket)
@@ -1250,7 +1306,7 @@ class Data(google.protobuf.message.Message):
REQUEST_ID_FIELD_NUMBER: builtins.int REQUEST_ID_FIELD_NUMBER: builtins.int
REPLY_ID_FIELD_NUMBER: builtins.int REPLY_ID_FIELD_NUMBER: builtins.int
EMOJI_FIELD_NUMBER: builtins.int EMOJI_FIELD_NUMBER: builtins.int
portnum: meshtastic.portnums_pb2.PortNum.ValueType portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType
""" """
Formerly named typ and of type Type Formerly named typ and of type Type
""" """
@@ -1295,7 +1351,7 @@ class Data(google.protobuf.message.Message):
def __init__( def __init__(
self, self,
*, *,
portnum: meshtastic.portnums_pb2.PortNum.ValueType = ..., portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType = ...,
payload: builtins.bytes = ..., payload: builtins.bytes = ...,
want_response: builtins.bool = ..., want_response: builtins.bool = ...,
dest: builtins.int = ..., dest: builtins.int = ...,
@@ -1304,11 +1360,11 @@ class Data(google.protobuf.message.Message):
reply_id: builtins.int = ..., reply_id: builtins.int = ...,
emoji: builtins.int = ..., emoji: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["dest", b"dest", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "source", b"source", "want_response", b"want_response"]) -> None: ... def ClearField(self, field_name: typing.Literal["dest", b"dest", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "source", b"source", "want_response", b"want_response"]) -> None: ...
global___Data = Data global___Data = Data
@typing_extensions.final @typing.final
class Waypoint(google.protobuf.message.Message): class Waypoint(google.protobuf.message.Message):
""" """
Waypoint message, used to share arbitrary locations across the mesh Waypoint message, used to share arbitrary locations across the mesh
@@ -1369,11 +1425,11 @@ class Waypoint(google.protobuf.message.Message):
description: builtins.str = ..., description: builtins.str = ...,
icon: builtins.int = ..., icon: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["description", b"description", "expire", b"expire", "icon", b"icon", "id", b"id", "latitude_i", b"latitude_i", "locked_to", b"locked_to", "longitude_i", b"longitude_i", "name", b"name"]) -> None: ... def ClearField(self, field_name: typing.Literal["description", b"description", "expire", b"expire", "icon", b"icon", "id", b"id", "latitude_i", b"latitude_i", "locked_to", b"locked_to", "longitude_i", b"longitude_i", "name", b"name"]) -> None: ...
global___Waypoint = Waypoint global___Waypoint = Waypoint
@typing_extensions.final @typing.final
class MqttClientProxyMessage(google.protobuf.message.Message): class MqttClientProxyMessage(google.protobuf.message.Message):
""" """
This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server
@@ -1409,13 +1465,13 @@ class MqttClientProxyMessage(google.protobuf.message.Message):
text: builtins.str = ..., text: builtins.str = ...,
retained: builtins.bool = ..., retained: builtins.bool = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["data", b"data", "payload_variant", b"payload_variant", "text", b"text"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["data", b"data", "payload_variant", b"payload_variant", "text", b"text"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "payload_variant", b"payload_variant", "retained", b"retained", "text", b"text", "topic", b"topic"]) -> None: ... def ClearField(self, field_name: typing.Literal["data", b"data", "payload_variant", b"payload_variant", "retained", b"retained", "text", b"text", "topic", b"topic"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["data", "text"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["data", "text"] | None: ...
global___MqttClientProxyMessage = MqttClientProxyMessage global___MqttClientProxyMessage = MqttClientProxyMessage
@typing_extensions.final @typing.final
class MeshPacket(google.protobuf.message.Message): class MeshPacket(google.protobuf.message.Message):
""" """
A packet envelope sent/received over the mesh A packet envelope sent/received over the mesh
@@ -1583,11 +1639,6 @@ class MeshPacket(google.protobuf.message.Message):
contains the 'channel hash' instead of the index. contains the 'channel hash' instead of the index.
This 'trick' is only used while the payload_variant is an 'encrypted'. This 'trick' is only used while the payload_variant is an 'encrypted'.
""" """
@property
def decoded(self) -> global___Data:
"""
TODO: REPLACE
"""
encrypted: builtins.bytes encrypted: builtins.bytes
""" """
TODO: REPLACE TODO: REPLACE
@@ -1657,6 +1708,12 @@ class MeshPacket(google.protobuf.message.Message):
Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header. Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header.
When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled. When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled.
""" """
@property
def decoded(self) -> global___Data:
"""
TODO: REPLACE
"""
def __init__( def __init__(
self, self,
*, *,
@@ -1675,13 +1732,13 @@ class MeshPacket(google.protobuf.message.Message):
via_mqtt: builtins.bool = ..., via_mqtt: builtins.bool = ...,
hop_start: builtins.int = ..., hop_start: builtins.int = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "payload_variant", b"payload_variant", "priority", b"priority", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "payload_variant", b"payload_variant", "priority", b"priority", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["decoded", "encrypted"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["decoded", "encrypted"] | None: ...
global___MeshPacket = MeshPacket global___MeshPacket = MeshPacket
@typing_extensions.final @typing.final
class NodeInfo(google.protobuf.message.Message): class NodeInfo(google.protobuf.message.Message):
""" """
The bluetooth to device link: The bluetooth to device link:
@@ -1718,17 +1775,6 @@ class NodeInfo(google.protobuf.message.Message):
""" """
The node number The node number
""" """
@property
def user(self) -> global___User:
"""
The user info for this node
"""
@property
def position(self) -> global___Position:
"""
This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
Position.time now indicates the last time we received a POSITION from that node.
"""
snr: builtins.float snr: builtins.float
""" """
Returns the Signal-to-noise ratio (SNR) of the last received message, Returns the Signal-to-noise ratio (SNR) of the last received message,
@@ -1744,11 +1790,6 @@ class NodeInfo(google.protobuf.message.Message):
Set to indicate the last time we received a packet from this node Set to indicate the last time we received a packet from this node
""" """
@property
def device_metrics(self) -> meshtastic.telemetry_pb2.DeviceMetrics:
"""
The latest device metrics for the node.
"""
channel: builtins.int channel: builtins.int
""" """
local channel index we heard that node on. Only populated if its not the default channel. local channel index we heard that node on. Only populated if its not the default channel.
@@ -1766,6 +1807,25 @@ class NodeInfo(google.protobuf.message.Message):
True if node is in our favorites list True if node is in our favorites list
Persists between NodeDB internal clean ups Persists between NodeDB internal clean ups
""" """
@property
def user(self) -> global___User:
"""
The user info for this node
"""
@property
def position(self) -> global___Position:
"""
This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
Position.time now indicates the last time we received a POSITION from that node.
"""
@property
def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics:
"""
The latest device metrics for the node.
"""
def __init__( def __init__(
self, self,
*, *,
@@ -1774,18 +1834,18 @@ class NodeInfo(google.protobuf.message.Message):
position: global___Position | None = ..., position: global___Position | None = ...,
snr: builtins.float = ..., snr: builtins.float = ...,
last_heard: builtins.int = ..., last_heard: builtins.int = ...,
device_metrics: meshtastic.telemetry_pb2.DeviceMetrics | None = ..., device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ...,
channel: builtins.int = ..., channel: builtins.int = ...,
via_mqtt: builtins.bool = ..., via_mqtt: builtins.bool = ...,
hops_away: builtins.int = ..., hops_away: builtins.int = ...,
is_favorite: builtins.bool = ..., is_favorite: builtins.bool = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ...
global___NodeInfo = NodeInfo global___NodeInfo = NodeInfo
@typing_extensions.final @typing.final
class MyNodeInfo(google.protobuf.message.Message): class MyNodeInfo(google.protobuf.message.Message):
""" """
Unique local debugging info for this node Unique local debugging info for this node
@@ -1820,11 +1880,11 @@ class MyNodeInfo(google.protobuf.message.Message):
reboot_count: builtins.int = ..., reboot_count: builtins.int = ...,
min_app_version: builtins.int = ..., min_app_version: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "reboot_count", b"reboot_count"]) -> None: ... def ClearField(self, field_name: typing.Literal["min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "reboot_count", b"reboot_count"]) -> None: ...
global___MyNodeInfo = MyNodeInfo global___MyNodeInfo = MyNodeInfo
@typing_extensions.final @typing.final
class LogRecord(google.protobuf.message.Message): class LogRecord(google.protobuf.message.Message):
""" """
Debug output from the device. Debug output from the device.
@@ -1933,11 +1993,11 @@ class LogRecord(google.protobuf.message.Message):
source: builtins.str = ..., source: builtins.str = ...,
level: global___LogRecord.Level.ValueType = ..., level: global___LogRecord.Level.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["level", b"level", "message", b"message", "source", b"source", "time", b"time"]) -> None: ... def ClearField(self, field_name: typing.Literal["level", b"level", "message", b"message", "source", b"source", "time", b"time"]) -> None: ...
global___LogRecord = LogRecord global___LogRecord = LogRecord
@typing_extensions.final @typing.final
class QueueStatus(google.protobuf.message.Message): class QueueStatus(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -1961,11 +2021,11 @@ class QueueStatus(google.protobuf.message.Message):
maxlen: builtins.int = ..., maxlen: builtins.int = ...,
mesh_packet_id: builtins.int = ..., mesh_packet_id: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["free", b"free", "maxlen", b"maxlen", "mesh_packet_id", b"mesh_packet_id", "res", b"res"]) -> None: ... def ClearField(self, field_name: typing.Literal["free", b"free", "maxlen", b"maxlen", "mesh_packet_id", b"mesh_packet_id", "res", b"res"]) -> None: ...
global___QueueStatus = QueueStatus global___QueueStatus = QueueStatus
@typing_extensions.final @typing.final
class FromRadio(google.protobuf.message.Message): class FromRadio(google.protobuf.message.Message):
""" """
Packets from the radio to the phone will appear on the fromRadio characteristic. Packets from the radio to the phone will appear on the fromRadio characteristic.
@@ -1995,33 +2055,6 @@ class FromRadio(google.protobuf.message.Message):
The packet id, used to allow the phone to request missing read packets from the FIFO, The packet id, used to allow the phone to request missing read packets from the FIFO,
see our bluetooth docs see our bluetooth docs
""" """
@property
def packet(self) -> global___MeshPacket:
"""
Log levels, chosen to match python logging conventions.
"""
@property
def my_info(self) -> global___MyNodeInfo:
"""
Tells the phone what our node number is, can be -1 if we've not yet joined a mesh.
NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
"""
@property
def node_info(self) -> global___NodeInfo:
"""
One packet is sent for each node in the on radio DB
starts over with the first node in our DB
"""
@property
def config(self) -> meshtastic.config_pb2.Config:
"""
Include a part of the config (was: RadioConfig radio)
"""
@property
def log_record(self) -> global___LogRecord:
"""
Set to send debug console output over our protobuf stream
"""
config_complete_id: builtins.int config_complete_id: builtins.int
""" """
Sent as true once the device has finished sending all of the responses to want_config Sent as true once the device has finished sending all of the responses to want_config
@@ -2037,35 +2070,73 @@ class FromRadio(google.protobuf.message.Message):
NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps. NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
""" """
@property @property
def moduleConfig(self) -> meshtastic.module_config_pb2.ModuleConfig: def packet(self) -> global___MeshPacket:
"""
Log levels, chosen to match python logging conventions.
"""
@property
def my_info(self) -> global___MyNodeInfo:
"""
Tells the phone what our node number is, can be -1 if we've not yet joined a mesh.
NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
"""
@property
def node_info(self) -> global___NodeInfo:
"""
One packet is sent for each node in the on radio DB
starts over with the first node in our DB
"""
@property
def config(self) -> meshtastic.protobuf.config_pb2.Config:
"""
Include a part of the config (was: RadioConfig radio)
"""
@property
def log_record(self) -> global___LogRecord:
"""
Set to send debug console output over our protobuf stream
"""
@property
def moduleConfig(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig:
""" """
Include module config Include module config
""" """
@property @property
def channel(self) -> meshtastic.channel_pb2.Channel: def channel(self) -> meshtastic.protobuf.channel_pb2.Channel:
""" """
One packet is sent for each channel One packet is sent for each channel
""" """
@property @property
def queueStatus(self) -> global___QueueStatus: def queueStatus(self) -> global___QueueStatus:
""" """
Queue status info Queue status info
""" """
@property @property
def xmodemPacket(self) -> meshtastic.xmodem_pb2.XModem: def xmodemPacket(self) -> meshtastic.protobuf.xmodem_pb2.XModem:
""" """
File Transfer Chunk File Transfer Chunk
""" """
@property @property
def metadata(self) -> global___DeviceMetadata: def metadata(self) -> global___DeviceMetadata:
""" """
Device metadata message Device metadata message
""" """
@property @property
def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage: def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage:
""" """
MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT) MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT)
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -2073,24 +2144,24 @@ class FromRadio(google.protobuf.message.Message):
packet: global___MeshPacket | None = ..., packet: global___MeshPacket | None = ...,
my_info: global___MyNodeInfo | None = ..., my_info: global___MyNodeInfo | None = ...,
node_info: global___NodeInfo | None = ..., node_info: global___NodeInfo | None = ...,
config: meshtastic.config_pb2.Config | None = ..., config: meshtastic.protobuf.config_pb2.Config | None = ...,
log_record: global___LogRecord | None = ..., log_record: global___LogRecord | None = ...,
config_complete_id: builtins.int = ..., config_complete_id: builtins.int = ...,
rebooted: builtins.bool = ..., rebooted: builtins.bool = ...,
moduleConfig: meshtastic.module_config_pb2.ModuleConfig | None = ..., moduleConfig: meshtastic.protobuf.module_config_pb2.ModuleConfig | None = ...,
channel: meshtastic.channel_pb2.Channel | None = ..., channel: meshtastic.protobuf.channel_pb2.Channel | None = ...,
queueStatus: global___QueueStatus | None = ..., queueStatus: global___QueueStatus | None = ...,
xmodemPacket: meshtastic.xmodem_pb2.XModem | None = ..., xmodemPacket: meshtastic.protobuf.xmodem_pb2.XModem | None = ...,
metadata: global___DeviceMetadata | None = ..., metadata: global___DeviceMetadata | None = ...,
mqttClientProxyMessage: global___MqttClientProxyMessage | None = ..., mqttClientProxyMessage: global___MqttClientProxyMessage | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "id", b"id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "id", b"id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "moduleConfig", "channel", "queueStatus", "xmodemPacket", "metadata", "mqttClientProxyMessage"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "moduleConfig", "channel", "queueStatus", "xmodemPacket", "metadata", "mqttClientProxyMessage"] | None: ...
global___FromRadio = FromRadio global___FromRadio = FromRadio
@typing_extensions.final @typing.final
class ToRadio(google.protobuf.message.Message): class ToRadio(google.protobuf.message.Message):
""" """
Packets/commands to the radio will be written (reliably) to the toRadio characteristic. Packets/commands to the radio will be written (reliably) to the toRadio characteristic.
@@ -2105,11 +2176,6 @@ class ToRadio(google.protobuf.message.Message):
XMODEMPACKET_FIELD_NUMBER: builtins.int XMODEMPACKET_FIELD_NUMBER: builtins.int
MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int
HEARTBEAT_FIELD_NUMBER: builtins.int HEARTBEAT_FIELD_NUMBER: builtins.int
@property
def packet(self) -> global___MeshPacket:
"""
Send this packet on the mesh
"""
want_config_id: builtins.int want_config_id: builtins.int
""" """
Phone wants radio to send full node db to the phone, This is Phone wants radio to send full node db to the phone, This is
@@ -2128,37 +2194,46 @@ class ToRadio(google.protobuf.message.Message):
(Sending this message is optional for clients) (Sending this message is optional for clients)
""" """
@property @property
def xmodemPacket(self) -> meshtastic.xmodem_pb2.XModem: def packet(self) -> global___MeshPacket:
"""
Send this packet on the mesh
"""
@property
def xmodemPacket(self) -> meshtastic.protobuf.xmodem_pb2.XModem:
""" """
File Transfer Chunk File Transfer Chunk
""" """
@property @property
def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage: def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage:
""" """
MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device) MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device)
""" """
@property @property
def heartbeat(self) -> global___Heartbeat: def heartbeat(self) -> global___Heartbeat:
""" """
Heartbeat message (used to keep the device connection awake on serial) Heartbeat message (used to keep the device connection awake on serial)
""" """
def __init__( def __init__(
self, self,
*, *,
packet: global___MeshPacket | None = ..., packet: global___MeshPacket | None = ...,
want_config_id: builtins.int = ..., want_config_id: builtins.int = ...,
disconnect: builtins.bool = ..., disconnect: builtins.bool = ...,
xmodemPacket: meshtastic.xmodem_pb2.XModem | None = ..., xmodemPacket: meshtastic.protobuf.xmodem_pb2.XModem | None = ...,
mqttClientProxyMessage: global___MqttClientProxyMessage | None = ..., mqttClientProxyMessage: global___MqttClientProxyMessage | None = ...,
heartbeat: global___Heartbeat | None = ..., heartbeat: global___Heartbeat | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> None: ... def ClearField(self, field_name: typing.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["packet", "want_config_id", "disconnect", "xmodemPacket", "mqttClientProxyMessage", "heartbeat"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["packet", "want_config_id", "disconnect", "xmodemPacket", "mqttClientProxyMessage", "heartbeat"] | None: ...
global___ToRadio = ToRadio global___ToRadio = ToRadio
@typing_extensions.final @typing.final
class Compressed(google.protobuf.message.Message): class Compressed(google.protobuf.message.Message):
""" """
Compressed message payload Compressed message payload
@@ -2168,7 +2243,7 @@ class Compressed(google.protobuf.message.Message):
PORTNUM_FIELD_NUMBER: builtins.int PORTNUM_FIELD_NUMBER: builtins.int
DATA_FIELD_NUMBER: builtins.int DATA_FIELD_NUMBER: builtins.int
portnum: meshtastic.portnums_pb2.PortNum.ValueType portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType
""" """
PortNum to determine the how to handle the compressed payload. PortNum to determine the how to handle the compressed payload.
""" """
@@ -2179,14 +2254,14 @@ class Compressed(google.protobuf.message.Message):
def __init__( def __init__(
self, self,
*, *,
portnum: meshtastic.portnums_pb2.PortNum.ValueType = ..., portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType = ...,
data: builtins.bytes = ..., data: builtins.bytes = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "portnum", b"portnum"]) -> None: ... def ClearField(self, field_name: typing.Literal["data", b"data", "portnum", b"portnum"]) -> None: ...
global___Compressed = Compressed global___Compressed = Compressed
@typing_extensions.final @typing.final
class NeighborInfo(google.protobuf.message.Message): class NeighborInfo(google.protobuf.message.Message):
""" """
Full info on edges for a single node Full info on edges for a single node
@@ -2215,6 +2290,7 @@ class NeighborInfo(google.protobuf.message.Message):
""" """
The list of out edges from this node The list of out edges from this node
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -2223,11 +2299,11 @@ class NeighborInfo(google.protobuf.message.Message):
node_broadcast_interval_secs: builtins.int = ..., node_broadcast_interval_secs: builtins.int = ...,
neighbors: collections.abc.Iterable[global___Neighbor] | None = ..., neighbors: collections.abc.Iterable[global___Neighbor] | None = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["last_sent_by_id", b"last_sent_by_id", "neighbors", b"neighbors", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"]) -> None: ... def ClearField(self, field_name: typing.Literal["last_sent_by_id", b"last_sent_by_id", "neighbors", b"neighbors", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"]) -> None: ...
global___NeighborInfo = NeighborInfo global___NeighborInfo = NeighborInfo
@typing_extensions.final @typing.final
class Neighbor(google.protobuf.message.Message): class Neighbor(google.protobuf.message.Message):
""" """
A single edge in the mesh A single edge in the mesh
@@ -2265,11 +2341,11 @@ class Neighbor(google.protobuf.message.Message):
last_rx_time: builtins.int = ..., last_rx_time: builtins.int = ...,
node_broadcast_interval_secs: builtins.int = ..., node_broadcast_interval_secs: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["last_rx_time", b"last_rx_time", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id", "snr", b"snr"]) -> None: ... def ClearField(self, field_name: typing.Literal["last_rx_time", b"last_rx_time", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id", "snr", b"snr"]) -> None: ...
global___Neighbor = Neighbor global___Neighbor = Neighbor
@typing_extensions.final @typing.final
class DeviceMetadata(google.protobuf.message.Message): class DeviceMetadata(google.protobuf.message.Message):
""" """
Device metadata response Device metadata response
@@ -2311,7 +2387,7 @@ class DeviceMetadata(google.protobuf.message.Message):
""" """
Indicates that the device has an ethernet peripheral Indicates that the device has an ethernet peripheral
""" """
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType
""" """
Indicates that the device's role in the mesh Indicates that the device's role in the mesh
""" """
@@ -2336,16 +2412,16 @@ class DeviceMetadata(google.protobuf.message.Message):
hasWifi: builtins.bool = ..., hasWifi: builtins.bool = ...,
hasBluetooth: builtins.bool = ..., hasBluetooth: builtins.bool = ...,
hasEthernet: builtins.bool = ..., hasEthernet: builtins.bool = ...,
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ..., role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
position_flags: builtins.int = ..., position_flags: builtins.int = ...,
hw_model: global___HardwareModel.ValueType = ..., hw_model: global___HardwareModel.ValueType = ...,
hasRemoteHardware: builtins.bool = ..., hasRemoteHardware: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["canShutdown", b"canShutdown", "device_state_version", b"device_state_version", "firmware_version", b"firmware_version", "hasBluetooth", b"hasBluetooth", "hasEthernet", b"hasEthernet", "hasRemoteHardware", b"hasRemoteHardware", "hasWifi", b"hasWifi", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"]) -> None: ... def ClearField(self, field_name: typing.Literal["canShutdown", b"canShutdown", "device_state_version", b"device_state_version", "firmware_version", b"firmware_version", "hasBluetooth", b"hasBluetooth", "hasEthernet", b"hasEthernet", "hasRemoteHardware", b"hasRemoteHardware", "hasWifi", b"hasWifi", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"]) -> None: ...
global___DeviceMetadata = DeviceMetadata global___DeviceMetadata = DeviceMetadata
@typing_extensions.final @typing.final
class Heartbeat(google.protobuf.message.Message): class Heartbeat(google.protobuf.message.Message):
""" """
A heartbeat message is sent to the node from the client to keep the connection alive. A heartbeat message is sent to the node from the client to keep the connection alive.
@@ -2360,7 +2436,7 @@ class Heartbeat(google.protobuf.message.Message):
global___Heartbeat = Heartbeat global___Heartbeat = Heartbeat
@typing_extensions.final @typing.final
class NodeRemoteHardwarePin(google.protobuf.message.Message): class NodeRemoteHardwarePin(google.protobuf.message.Message):
""" """
RemoteHardwarePins associated with a node RemoteHardwarePins associated with a node
@@ -2375,17 +2451,118 @@ class NodeRemoteHardwarePin(google.protobuf.message.Message):
The node_num exposing the available gpio pin The node_num exposing the available gpio pin
""" """
@property @property
def pin(self) -> meshtastic.module_config_pb2.RemoteHardwarePin: def pin(self) -> meshtastic.protobuf.module_config_pb2.RemoteHardwarePin:
""" """
The the available gpio pin for usage with RemoteHardware module The the available gpio pin for usage with RemoteHardware module
""" """
def __init__( def __init__(
self, self,
*, *,
node_num: builtins.int = ..., node_num: builtins.int = ...,
pin: meshtastic.module_config_pb2.RemoteHardwarePin | None = ..., pin: meshtastic.protobuf.module_config_pb2.RemoteHardwarePin | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["pin", b"pin"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["pin", b"pin"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["node_num", b"node_num", "pin", b"pin"]) -> None: ... def ClearField(self, field_name: typing.Literal["node_num", b"node_num", "pin", b"pin"]) -> None: ...
global___NodeRemoteHardwarePin = NodeRemoteHardwarePin global___NodeRemoteHardwarePin = NodeRemoteHardwarePin
@typing.final
class ChunkedPayload(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor
PAYLOAD_ID_FIELD_NUMBER: builtins.int
CHUNK_COUNT_FIELD_NUMBER: builtins.int
CHUNK_INDEX_FIELD_NUMBER: builtins.int
PAYLOAD_CHUNK_FIELD_NUMBER: builtins.int
payload_id: builtins.int
"""
The ID of the entire payload
"""
chunk_count: builtins.int
"""
The total number of chunks in the payload
"""
chunk_index: builtins.int
"""
The current chunk index in the total
"""
payload_chunk: builtins.bytes
"""
The binary data of the current chunk
"""
def __init__(
self,
*,
payload_id: builtins.int = ...,
chunk_count: builtins.int = ...,
chunk_index: builtins.int = ...,
payload_chunk: builtins.bytes = ...,
) -> None: ...
def ClearField(self, field_name: typing.Literal["chunk_count", b"chunk_count", "chunk_index", b"chunk_index", "payload_chunk", b"payload_chunk", "payload_id", b"payload_id"]) -> None: ...
global___ChunkedPayload = ChunkedPayload
@typing.final
class resend_chunks(google.protobuf.message.Message):
"""
Wrapper message for broken repeated oneof support
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
CHUNKS_FIELD_NUMBER: builtins.int
@property
def chunks(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: ...
def __init__(
self,
*,
chunks: collections.abc.Iterable[builtins.int] | None = ...,
) -> None: ...
def ClearField(self, field_name: typing.Literal["chunks", b"chunks"]) -> None: ...
global___resend_chunks = resend_chunks
@typing.final
class ChunkedPayloadResponse(google.protobuf.message.Message):
"""
Responses to a ChunkedPayload request
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
PAYLOAD_ID_FIELD_NUMBER: builtins.int
REQUEST_TRANSFER_FIELD_NUMBER: builtins.int
ACCEPT_TRANSFER_FIELD_NUMBER: builtins.int
RESEND_CHUNKS_FIELD_NUMBER: builtins.int
payload_id: builtins.int
"""
The ID of the entire payload
"""
request_transfer: builtins.bool
"""
Request to transfer chunked payload
"""
accept_transfer: builtins.bool
"""
Accept the transfer chunked payload
"""
@property
def resend_chunks(self) -> global___resend_chunks:
"""
Request missing indexes in the chunked payload
"""
def __init__(
self,
*,
payload_id: builtins.int = ...,
request_transfer: builtins.bool = ...,
accept_transfer: builtins.bool = ...,
resend_chunks: global___resend_chunks | None = ...,
) -> None: ...
def HasField(self, field_name: typing.Literal["accept_transfer", b"accept_transfer", "payload_variant", b"payload_variant", "request_transfer", b"request_transfer", "resend_chunks", b"resend_chunks"]) -> builtins.bool: ...
def ClearField(self, field_name: typing.Literal["accept_transfer", b"accept_transfer", "payload_id", b"payload_id", "payload_variant", b"payload_variant", "request_transfer", b"request_transfer", "resend_chunks", b"resend_chunks"]) -> None: ...
def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["request_transfer", "accept_transfer", "resend_chunks"] | None: ...
global___ChunkedPayloadResponse = ChunkedPayloadResponse

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import collections.abc import collections.abc
import google.protobuf.descriptor import google.protobuf.descriptor
@@ -53,7 +54,7 @@ GPIO pin can be written to (high / low)
""" """
global___RemoteHardwarePinType = RemoteHardwarePinType global___RemoteHardwarePinType = RemoteHardwarePinType
@typing_extensions.final @typing.final
class ModuleConfig(google.protobuf.message.Message): class ModuleConfig(google.protobuf.message.Message):
""" """
Module Config Module Config
@@ -61,7 +62,7 @@ class ModuleConfig(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@typing_extensions.final @typing.final
class MQTTConfig(google.protobuf.message.Message): class MQTTConfig(google.protobuf.message.Message):
""" """
MQTT Client Config MQTT Client Config
@@ -135,6 +136,7 @@ class ModuleConfig(google.protobuf.message.Message):
""" """
Settings for reporting information about our node to a map via MQTT Settings for reporting information about our node to a map via MQTT
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -150,10 +152,10 @@ class ModuleConfig(google.protobuf.message.Message):
map_reporting_enabled: builtins.bool = ..., map_reporting_enabled: builtins.bool = ...,
map_report_settings: global___ModuleConfig.MapReportSettings | None = ..., map_report_settings: global___ModuleConfig.MapReportSettings | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["map_report_settings", b"map_report_settings"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["map_report_settings", b"map_report_settings"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["address", b"address", "enabled", b"enabled", "encryption_enabled", b"encryption_enabled", "json_enabled", b"json_enabled", "map_report_settings", b"map_report_settings", "map_reporting_enabled", b"map_reporting_enabled", "password", b"password", "proxy_to_client_enabled", b"proxy_to_client_enabled", "root", b"root", "tls_enabled", b"tls_enabled", "username", b"username"]) -> None: ... def ClearField(self, field_name: typing.Literal["address", b"address", "enabled", b"enabled", "encryption_enabled", b"encryption_enabled", "json_enabled", b"json_enabled", "map_report_settings", b"map_report_settings", "map_reporting_enabled", b"map_reporting_enabled", "password", b"password", "proxy_to_client_enabled", b"proxy_to_client_enabled", "root", b"root", "tls_enabled", b"tls_enabled", "username", b"username"]) -> None: ...
@typing_extensions.final @typing.final
class MapReportSettings(google.protobuf.message.Message): class MapReportSettings(google.protobuf.message.Message):
""" """
Settings for reporting unencrypted information about our node to a map via MQTT Settings for reporting unencrypted information about our node to a map via MQTT
@@ -177,9 +179,9 @@ class ModuleConfig(google.protobuf.message.Message):
publish_interval_secs: builtins.int = ..., publish_interval_secs: builtins.int = ...,
position_precision: builtins.int = ..., position_precision: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs"]) -> None: ... def ClearField(self, field_name: typing.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs"]) -> None: ...
@typing_extensions.final @typing.final
class RemoteHardwareConfig(google.protobuf.message.Message): class RemoteHardwareConfig(google.protobuf.message.Message):
""" """
RemoteHardwareModule Config RemoteHardwareModule Config
@@ -203,6 +205,7 @@ class ModuleConfig(google.protobuf.message.Message):
""" """
Exposes the available pins to the mesh for reading and writing Exposes the available pins to the mesh for reading and writing
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -210,9 +213,9 @@ class ModuleConfig(google.protobuf.message.Message):
allow_undefined_pin_access: builtins.bool = ..., allow_undefined_pin_access: builtins.bool = ...,
available_pins: collections.abc.Iterable[global___RemoteHardwarePin] | None = ..., available_pins: collections.abc.Iterable[global___RemoteHardwarePin] | None = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["allow_undefined_pin_access", b"allow_undefined_pin_access", "available_pins", b"available_pins", "enabled", b"enabled"]) -> None: ... def ClearField(self, field_name: typing.Literal["allow_undefined_pin_access", b"allow_undefined_pin_access", "available_pins", b"available_pins", "enabled", b"enabled"]) -> None: ...
@typing_extensions.final @typing.final
class NeighborInfoConfig(google.protobuf.message.Message): class NeighborInfoConfig(google.protobuf.message.Message):
""" """
NeighborInfoModule Config NeighborInfoModule Config
@@ -237,9 +240,9 @@ class ModuleConfig(google.protobuf.message.Message):
enabled: builtins.bool = ..., enabled: builtins.bool = ...,
update_interval: builtins.int = ..., update_interval: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "update_interval", b"update_interval"]) -> None: ... def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "update_interval", b"update_interval"]) -> None: ...
@typing_extensions.final @typing.final
class DetectionSensorConfig(google.protobuf.message.Message): class DetectionSensorConfig(google.protobuf.message.Message):
""" """
Detection Sensor Module Config Detection Sensor Module Config
@@ -306,9 +309,9 @@ class ModuleConfig(google.protobuf.message.Message):
detection_triggered_high: builtins.bool = ..., detection_triggered_high: builtins.bool = ...,
use_pullup: builtins.bool = ..., use_pullup: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["detection_triggered_high", b"detection_triggered_high", "enabled", b"enabled", "minimum_broadcast_secs", b"minimum_broadcast_secs", "monitor_pin", b"monitor_pin", "name", b"name", "send_bell", b"send_bell", "state_broadcast_secs", b"state_broadcast_secs", "use_pullup", b"use_pullup"]) -> None: ... def ClearField(self, field_name: typing.Literal["detection_triggered_high", b"detection_triggered_high", "enabled", b"enabled", "minimum_broadcast_secs", b"minimum_broadcast_secs", "monitor_pin", b"monitor_pin", "name", b"name", "send_bell", b"send_bell", "state_broadcast_secs", b"state_broadcast_secs", "use_pullup", b"use_pullup"]) -> None: ...
@typing_extensions.final @typing.final
class AudioConfig(google.protobuf.message.Message): class AudioConfig(google.protobuf.message.Message):
""" """
Audio Config for codec2 voice Audio Config for codec2 voice
@@ -393,9 +396,9 @@ class ModuleConfig(google.protobuf.message.Message):
i2s_din: builtins.int = ..., i2s_din: builtins.int = ...,
i2s_sck: builtins.int = ..., i2s_sck: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["bitrate", b"bitrate", "codec2_enabled", b"codec2_enabled", "i2s_din", b"i2s_din", "i2s_sck", b"i2s_sck", "i2s_sd", b"i2s_sd", "i2s_ws", b"i2s_ws", "ptt_pin", b"ptt_pin"]) -> None: ... def ClearField(self, field_name: typing.Literal["bitrate", b"bitrate", "codec2_enabled", b"codec2_enabled", "i2s_din", b"i2s_din", "i2s_sck", b"i2s_sck", "i2s_sd", b"i2s_sd", "i2s_ws", b"i2s_ws", "ptt_pin", b"ptt_pin"]) -> None: ...
@typing_extensions.final @typing.final
class PaxcounterConfig(google.protobuf.message.Message): class PaxcounterConfig(google.protobuf.message.Message):
""" """
Config for the Paxcounter Module Config for the Paxcounter Module
@@ -405,6 +408,8 @@ class ModuleConfig(google.protobuf.message.Message):
ENABLED_FIELD_NUMBER: builtins.int ENABLED_FIELD_NUMBER: builtins.int
PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
WIFI_THRESHOLD_FIELD_NUMBER: builtins.int
BLE_THRESHOLD_FIELD_NUMBER: builtins.int
enabled: builtins.bool enabled: builtins.bool
""" """
Enable the Paxcounter Module Enable the Paxcounter Module
@@ -414,15 +419,25 @@ class ModuleConfig(google.protobuf.message.Message):
Interval in seconds of how often we should try to send our Interval in seconds of how often we should try to send our
metrics to the mesh metrics to the mesh
""" """
wifi_threshold: builtins.int
"""
WiFi RSSI threshold. Defaults to -80
"""
ble_threshold: builtins.int
"""
BLE RSSI threshold. Defaults to -80
"""
def __init__( def __init__(
self, self,
*, *,
enabled: builtins.bool = ..., enabled: builtins.bool = ...,
paxcounter_update_interval: builtins.int = ..., paxcounter_update_interval: builtins.int = ...,
wifi_threshold: builtins.int = ...,
ble_threshold: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval"]) -> None: ... def ClearField(self, field_name: typing.Literal["ble_threshold", b"ble_threshold", "enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval", "wifi_threshold", b"wifi_threshold"]) -> None: ...
@typing_extensions.final @typing.final
class SerialConfig(google.protobuf.message.Message): class SerialConfig(google.protobuf.message.Message):
""" """
Serial Config Serial Config
@@ -556,9 +571,9 @@ class ModuleConfig(google.protobuf.message.Message):
mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType = ..., mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType = ...,
override_console_serial_port: builtins.bool = ..., override_console_serial_port: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["baud", b"baud", "echo", b"echo", "enabled", b"enabled", "mode", b"mode", "override_console_serial_port", b"override_console_serial_port", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"]) -> None: ... def ClearField(self, field_name: typing.Literal["baud", b"baud", "echo", b"echo", "enabled", b"enabled", "mode", b"mode", "override_console_serial_port", b"override_console_serial_port", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"]) -> None: ...
@typing_extensions.final @typing.final
class ExternalNotificationConfig(google.protobuf.message.Message): class ExternalNotificationConfig(google.protobuf.message.Message):
""" """
External Notifications Config External Notifications Config
@@ -671,9 +686,9 @@ class ModuleConfig(google.protobuf.message.Message):
nag_timeout: builtins.int = ..., nag_timeout: builtins.int = ...,
use_i2s_as_buzzer: builtins.bool = ..., use_i2s_as_buzzer: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["active", b"active", "alert_bell", b"alert_bell", "alert_bell_buzzer", b"alert_bell_buzzer", "alert_bell_vibra", b"alert_bell_vibra", "alert_message", b"alert_message", "alert_message_buzzer", b"alert_message_buzzer", "alert_message_vibra", b"alert_message_vibra", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra", "use_i2s_as_buzzer", b"use_i2s_as_buzzer", "use_pwm", b"use_pwm"]) -> None: ... def ClearField(self, field_name: typing.Literal["active", b"active", "alert_bell", b"alert_bell", "alert_bell_buzzer", b"alert_bell_buzzer", "alert_bell_vibra", b"alert_bell_vibra", "alert_message", b"alert_message", "alert_message_buzzer", b"alert_message_buzzer", "alert_message_vibra", b"alert_message_vibra", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra", "use_i2s_as_buzzer", b"use_i2s_as_buzzer", "use_pwm", b"use_pwm"]) -> None: ...
@typing_extensions.final @typing.final
class StoreForwardConfig(google.protobuf.message.Message): class StoreForwardConfig(google.protobuf.message.Message):
""" """
Store and Forward Module Config Store and Forward Module Config
@@ -715,9 +730,9 @@ class ModuleConfig(google.protobuf.message.Message):
history_return_max: builtins.int = ..., history_return_max: builtins.int = ...,
history_return_window: builtins.int = ..., history_return_window: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "heartbeat", b"heartbeat", "history_return_max", b"history_return_max", "history_return_window", b"history_return_window", "records", b"records"]) -> None: ... def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "heartbeat", b"heartbeat", "history_return_max", b"history_return_max", "history_return_window", b"history_return_window", "records", b"records"]) -> None: ...
@typing_extensions.final @typing.final
class RangeTestConfig(google.protobuf.message.Message): class RangeTestConfig(google.protobuf.message.Message):
""" """
Preferences for the RangeTestModule Preferences for the RangeTestModule
@@ -748,9 +763,9 @@ class ModuleConfig(google.protobuf.message.Message):
sender: builtins.int = ..., sender: builtins.int = ...,
save: builtins.bool = ..., save: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "save", b"save", "sender", b"sender"]) -> None: ... def ClearField(self, field_name: typing.Literal["enabled", b"enabled", "save", b"save", "sender", b"sender"]) -> None: ...
@typing_extensions.final @typing.final
class TelemetryConfig(google.protobuf.message.Message): class TelemetryConfig(google.protobuf.message.Message):
""" """
Configuration for both device and environment metrics Configuration for both device and environment metrics
@@ -830,9 +845,9 @@ class ModuleConfig(google.protobuf.message.Message):
power_update_interval: builtins.int = ..., power_update_interval: builtins.int = ...,
power_screen_enabled: builtins.bool = ..., power_screen_enabled: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ... def ClearField(self, field_name: typing.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ...
@typing_extensions.final @typing.final
class CannedMessageConfig(google.protobuf.message.Message): class CannedMessageConfig(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -989,9 +1004,9 @@ class ModuleConfig(google.protobuf.message.Message):
allow_input_source: builtins.str = ..., allow_input_source: builtins.str = ...,
send_bell: builtins.bool = ..., send_bell: builtins.bool = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["allow_input_source", b"allow_input_source", "enabled", b"enabled", "inputbroker_event_ccw", b"inputbroker_event_ccw", "inputbroker_event_cw", b"inputbroker_event_cw", "inputbroker_event_press", b"inputbroker_event_press", "inputbroker_pin_a", b"inputbroker_pin_a", "inputbroker_pin_b", b"inputbroker_pin_b", "inputbroker_pin_press", b"inputbroker_pin_press", "rotary1_enabled", b"rotary1_enabled", "send_bell", b"send_bell", "updown1_enabled", b"updown1_enabled"]) -> None: ... def ClearField(self, field_name: typing.Literal["allow_input_source", b"allow_input_source", "enabled", b"enabled", "inputbroker_event_ccw", b"inputbroker_event_ccw", "inputbroker_event_cw", b"inputbroker_event_cw", "inputbroker_event_press", b"inputbroker_event_press", "inputbroker_pin_a", b"inputbroker_pin_a", "inputbroker_pin_b", b"inputbroker_pin_b", "inputbroker_pin_press", b"inputbroker_pin_press", "rotary1_enabled", b"rotary1_enabled", "send_bell", b"send_bell", "updown1_enabled", b"updown1_enabled"]) -> None: ...
@typing_extensions.final @typing.final
class AmbientLightingConfig(google.protobuf.message.Message): class AmbientLightingConfig(google.protobuf.message.Message):
""" """
Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels. Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels.
@@ -1034,7 +1049,7 @@ class ModuleConfig(google.protobuf.message.Message):
green: builtins.int = ..., green: builtins.int = ...,
blue: builtins.int = ..., blue: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["blue", b"blue", "current", b"current", "green", b"green", "led_state", b"led_state", "red", b"red"]) -> None: ... def ClearField(self, field_name: typing.Literal["blue", b"blue", "current", b"current", "green", b"green", "led_state", b"led_state", "red", b"red"]) -> None: ...
MQTT_FIELD_NUMBER: builtins.int MQTT_FIELD_NUMBER: builtins.int
SERIAL_FIELD_NUMBER: builtins.int SERIAL_FIELD_NUMBER: builtins.int
@@ -1054,66 +1069,79 @@ class ModuleConfig(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def serial(self) -> global___ModuleConfig.SerialConfig: def serial(self) -> global___ModuleConfig.SerialConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def external_notification(self) -> global___ModuleConfig.ExternalNotificationConfig: def external_notification(self) -> global___ModuleConfig.ExternalNotificationConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def store_forward(self) -> global___ModuleConfig.StoreForwardConfig: def store_forward(self) -> global___ModuleConfig.StoreForwardConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def range_test(self) -> global___ModuleConfig.RangeTestConfig: def range_test(self) -> global___ModuleConfig.RangeTestConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def telemetry(self) -> global___ModuleConfig.TelemetryConfig: def telemetry(self) -> global___ModuleConfig.TelemetryConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def canned_message(self) -> global___ModuleConfig.CannedMessageConfig: def canned_message(self) -> global___ModuleConfig.CannedMessageConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def audio(self) -> global___ModuleConfig.AudioConfig: def audio(self) -> global___ModuleConfig.AudioConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def remote_hardware(self) -> global___ModuleConfig.RemoteHardwareConfig: def remote_hardware(self) -> global___ModuleConfig.RemoteHardwareConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def neighbor_info(self) -> global___ModuleConfig.NeighborInfoConfig: def neighbor_info(self) -> global___ModuleConfig.NeighborInfoConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def ambient_lighting(self) -> global___ModuleConfig.AmbientLightingConfig: def ambient_lighting(self) -> global___ModuleConfig.AmbientLightingConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def detection_sensor(self) -> global___ModuleConfig.DetectionSensorConfig: def detection_sensor(self) -> global___ModuleConfig.DetectionSensorConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def paxcounter(self) -> global___ModuleConfig.PaxcounterConfig: def paxcounter(self) -> global___ModuleConfig.PaxcounterConfig:
""" """
TODO: REPLACE TODO: REPLACE
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -1131,13 +1159,13 @@ class ModuleConfig(google.protobuf.message.Message):
detection_sensor: global___ModuleConfig.DetectionSensorConfig | None = ..., detection_sensor: global___ModuleConfig.DetectionSensorConfig | None = ...,
paxcounter: global___ModuleConfig.PaxcounterConfig | None = ..., paxcounter: global___ModuleConfig.PaxcounterConfig | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> None: ... def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["mqtt", "serial", "external_notification", "store_forward", "range_test", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["mqtt", "serial", "external_notification", "store_forward", "range_test", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter"] | None: ...
global___ModuleConfig = ModuleConfig global___ModuleConfig = ModuleConfig
@typing_extensions.final @typing.final
class RemoteHardwarePin(google.protobuf.message.Message): class RemoteHardwarePin(google.protobuf.message.Message):
""" """
A GPIO pin definition for remote hardware module A GPIO pin definition for remote hardware module
@@ -1167,6 +1195,6 @@ class RemoteHardwarePin(google.protobuf.message.Message):
name: builtins.str = ..., name: builtins.str = ...,
type: global___RemoteHardwarePinType.ValueType = ..., type: global___RemoteHardwarePinType.ValueType = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["gpio_pin", b"gpio_pin", "name", b"name", "type", b"type"]) -> None: ... def ClearField(self, field_name: typing.Literal["gpio_pin", b"gpio_pin", "name", b"name", "type", b"type"]) -> None: ...
global___RemoteHardwarePin = RemoteHardwarePin global___RemoteHardwarePin = RemoteHardwarePin

View File

@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/mqtt.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@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\"\xe0\x03\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(\rB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_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\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_SERVICEENVELOPE']._serialized_start=121
_globals['_SERVICEENVELOPE']._serialized_end=227
_globals['_MAPREPORT']._serialized_start=230
_globals['_MAPREPORT']._serialized_end=710
# @@protoc_insertion_point(module_scope)

View File

@@ -2,21 +2,17 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.message import google.protobuf.message
import meshtastic.config_pb2 import meshtastic.protobuf.config_pb2
import meshtastic.mesh_pb2 import meshtastic.protobuf.mesh_pb2
import sys import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class ServiceEnvelope(google.protobuf.message.Message): class ServiceEnvelope(google.protobuf.message.Message):
""" """
This message wraps a MeshPacket with extra metadata about the sender and how it arrived. This message wraps a MeshPacket with extra metadata about the sender and how it arrived.
@@ -27,11 +23,6 @@ class ServiceEnvelope(google.protobuf.message.Message):
PACKET_FIELD_NUMBER: builtins.int PACKET_FIELD_NUMBER: builtins.int
CHANNEL_ID_FIELD_NUMBER: builtins.int CHANNEL_ID_FIELD_NUMBER: builtins.int
GATEWAY_ID_FIELD_NUMBER: builtins.int GATEWAY_ID_FIELD_NUMBER: builtins.int
@property
def packet(self) -> meshtastic.mesh_pb2.MeshPacket:
"""
The (probably encrypted) packet
"""
channel_id: builtins.str channel_id: builtins.str
""" """
The global channel ID it was sent on The global channel ID it was sent on
@@ -42,19 +33,25 @@ class ServiceEnvelope(google.protobuf.message.Message):
nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as
the globally trusted nodenum the globally trusted nodenum
""" """
@property
def packet(self) -> meshtastic.protobuf.mesh_pb2.MeshPacket:
"""
The (probably encrypted) packet
"""
def __init__( def __init__(
self, self,
*, *,
packet: meshtastic.mesh_pb2.MeshPacket | None = ..., packet: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ...,
channel_id: builtins.str = ..., channel_id: builtins.str = ...,
gateway_id: builtins.str = ..., gateway_id: builtins.str = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["packet", b"packet"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["packet", b"packet"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["channel_id", b"channel_id", "gateway_id", b"gateway_id", "packet", b"packet"]) -> None: ... def ClearField(self, field_name: typing.Literal["channel_id", b"channel_id", "gateway_id", b"gateway_id", "packet", b"packet"]) -> None: ...
global___ServiceEnvelope = ServiceEnvelope global___ServiceEnvelope = ServiceEnvelope
@typing_extensions.final @typing.final
class MapReport(google.protobuf.message.Message): class MapReport(google.protobuf.message.Message):
""" """
Information about a node intended to be reported unencrypted to a map using MQTT. Information about a node intended to be reported unencrypted to a map using MQTT.
@@ -84,11 +81,11 @@ class MapReport(google.protobuf.message.Message):
A VERY short name, ideally two characters. A VERY short name, ideally two characters.
Suitable for a tiny OLED screen Suitable for a tiny OLED screen
""" """
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType
""" """
Role of the node that applies specific settings for a particular use-case Role of the node that applies specific settings for a particular use-case
""" """
hw_model: meshtastic.mesh_pb2.HardwareModel.ValueType hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType
""" """
Hardware model of the node, i.e. T-Beam, Heltec V3, etc... Hardware model of the node, i.e. T-Beam, Heltec V3, etc...
""" """
@@ -96,11 +93,11 @@ class MapReport(google.protobuf.message.Message):
""" """
Device firmware version string Device firmware version string
""" """
region: meshtastic.config_pb2.Config.LoRaConfig.RegionCode.ValueType region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType
""" """
The region code for the radio (US, CN, EU433, etc...) The region code for the radio (US, CN, EU433, etc...)
""" """
modem_preset: meshtastic.config_pb2.Config.LoRaConfig.ModemPreset.ValueType modem_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType
""" """
Modem preset used by the radio (LongFast, MediumSlow, etc...) Modem preset used by the radio (LongFast, MediumSlow, etc...)
""" """
@@ -134,11 +131,11 @@ class MapReport(google.protobuf.message.Message):
*, *,
long_name: builtins.str = ..., long_name: builtins.str = ...,
short_name: builtins.str = ..., short_name: builtins.str = ...,
role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ..., role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
hw_model: meshtastic.mesh_pb2.HardwareModel.ValueType = ..., hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType = ...,
firmware_version: builtins.str = ..., firmware_version: builtins.str = ...,
region: meshtastic.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ...,
modem_preset: meshtastic.config_pb2.Config.LoRaConfig.ModemPreset.ValueType = ..., modem_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType = ...,
has_default_channel: builtins.bool = ..., has_default_channel: builtins.bool = ...,
latitude_i: builtins.int = ..., latitude_i: builtins.int = ...,
longitude_i: builtins.int = ..., longitude_i: builtins.int = ...,
@@ -146,6 +143,6 @@ class MapReport(google.protobuf.message.Message):
position_precision: builtins.int = ..., position_precision: builtins.int = ...,
num_online_local_nodes: builtins.int = ..., num_online_local_nodes: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "hw_model", b"hw_model", "latitude_i", b"latitude_i", "long_name", b"long_name", "longitude_i", b"longitude_i", "modem_preset", b"modem_preset", "num_online_local_nodes", b"num_online_local_nodes", "position_precision", b"position_precision", "region", b"region", "role", b"role", "short_name", b"short_name"]) -> None: ... def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "hw_model", b"hw_model", "latitude_i", b"latitude_i", "long_name", b"long_name", "longitude_i", b"longitude_i", "modem_preset", b"modem_preset", "num_online_local_nodes", b"num_online_local_nodes", "position_precision", b"position_precision", "region", b"region", "role", b"role", "short_name", b"short_name"]) -> None: ...
global___MapReport = MapReport global___MapReport = MapReport

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/paxcount.proto # source: meshtastic/protobuf/paxcount.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default() _sym_db = _symbol_database.Default()
@@ -13,14 +13,14 @@ _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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/paxcount.proto\x12\x13meshtastic.protobuf\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\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()) _globals = globals()
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals()) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.paxcount_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 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 _globals['_PAXCOUNT']._serialized_start=59
_PAXCOUNT._serialized_end=94 _globals['_PAXCOUNT']._serialized_end=112
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,19 +2,15 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.message import google.protobuf.message
import sys import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class Paxcount(google.protobuf.message.Message): class Paxcount(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -44,6 +40,6 @@ class Paxcount(google.protobuf.message.Message):
ble: builtins.int = ..., ble: builtins.int = ...,
uptime: builtins.int = ..., uptime: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["ble", b"ble", "uptime", b"uptime", "wifi", b"wifi"]) -> None: ... def ClearField(self, field_name: typing.Literal["ble", b"ble", "uptime", b"uptime", "wifi", b"wifi"]) -> None: ...
global___Paxcount = Paxcount global___Paxcount = Paxcount

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/portnums.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\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')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.portnums_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_PORTNUM']._serialized_start=60
_globals['_PORTNUM']._serialized_end=585
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/remote_hardware.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)meshtastic/protobuf/remote_hardware.proto\x12\x13meshtastic.protobuf\"\xdf\x01\n\x0fHardwareMessage\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x63\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.remote_hardware_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_HARDWAREMESSAGE']._serialized_start=67
_globals['_HARDWAREMESSAGE']._serialized_end=290
_globals['_HARDWAREMESSAGE_TYPE']._serialized_start=182
_globals['_HARDWAREMESSAGE_TYPE']._serialized_end=290
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -16,7 +17,7 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class HardwareMessage(google.protobuf.message.Message): class HardwareMessage(google.protobuf.message.Message):
""" """
An example app to show off the module system. This message is used for An example app to show off the module system. This message is used for
@@ -120,6 +121,6 @@ class HardwareMessage(google.protobuf.message.Message):
gpio_mask: builtins.int = ..., gpio_mask: builtins.int = ...,
gpio_value: builtins.int = ..., gpio_value: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["gpio_mask", b"gpio_mask", "gpio_value", b"gpio_value", "type", b"type"]) -> None: ... def ClearField(self, field_name: typing.Literal["gpio_mask", b"gpio_mask", "gpio_value", b"gpio_value", "type", b"type"]) -> None: ...
global___HardwareMessage = HardwareMessage global___HardwareMessage = HardwareMessage

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/rtttl.proto # source: meshtastic/protobuf/rtttl.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default() _sym_db = _symbol_database.Default()
@@ -13,14 +13,14 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\x12\nmeshtastic\"\x1f\n\x0bRTTTLConfig\x12\x10\n\x08ringtone\x18\x01 \x01(\tBf\n\x13\x63om.geeksville.meshB\x11RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/rtttl.proto\x12\x13meshtastic.protobuf\"\x1f\n\x0bRTTTLConfig\x12\x10\n\x08ringtone\x18\x01 \x01(\tBf\n\x13\x63om.geeksville.meshB\x11RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _globals = globals()
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.rtttl_pb2', globals()) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.rtttl_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_RTTTLCONFIG._serialized_start=38 _globals['_RTTTLCONFIG']._serialized_start=56
_RTTTLCONFIG._serialized_end=69 _globals['_RTTTLCONFIG']._serialized_end=87
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,19 +2,15 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.message import google.protobuf.message
import sys import typing
if sys.version_info >= (3, 8):
import typing as typing_extensions
else:
import typing_extensions
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class RTTTLConfig(google.protobuf.message.Message): class RTTTLConfig(google.protobuf.message.Message):
""" """
Canned message module configuration. Canned message module configuration.
@@ -32,6 +28,6 @@ class RTTTLConfig(google.protobuf.message.Message):
*, *,
ringtone: builtins.str = ..., ringtone: builtins.str = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["ringtone", b"ringtone"]) -> None: ... def ClearField(self, field_name: typing.Literal["ringtone", b"ringtone"]) -> None: ...
global___RTTTLConfig = RTTTLConfig global___RTTTLConfig = RTTTLConfig

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/storeforward.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&meshtastic/protobuf/storeforward.proto\x12\x13meshtastic.protobuf\"\xc0\x07\n\x0fStoreAndForward\x12@\n\x02rr\x18\x01 \x01(\x0e\x32\x34.meshtastic.protobuf.StoreAndForward.RequestResponse\x12@\n\x05stats\x18\x02 \x01(\x0b\x32/.meshtastic.protobuf.StoreAndForward.StatisticsH\x00\x12?\n\x07history\x18\x03 \x01(\x0b\x32,.meshtastic.protobuf.StoreAndForward.HistoryH\x00\x12\x43\n\theartbeat\x18\x04 \x01(\x0b\x32..meshtastic.protobuf.StoreAndForward.HeartbeatH\x00\x12\x0e\n\x04text\x18\x05 \x01(\x0cH\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBj\n\x13\x63om.geeksville.meshB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.storeforward_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_STOREANDFORWARD']._serialized_start=64
_globals['_STOREANDFORWARD']._serialized_end=1024
_globals['_STOREANDFORWARD_STATISTICS']._serialized_start=366
_globals['_STOREANDFORWARD_STATISTICS']._serialized_end=571
_globals['_STOREANDFORWARD_HISTORY']._serialized_start=573
_globals['_STOREANDFORWARD_HISTORY']._serialized_end=646
_globals['_STOREANDFORWARD_HEARTBEAT']._serialized_start=648
_globals['_STOREANDFORWARD_HEARTBEAT']._serialized_end=694
_globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_start=697
_globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_end=1013
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -16,7 +17,7 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class StoreAndForward(google.protobuf.message.Message): class StoreAndForward(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -170,7 +171,7 @@ class StoreAndForward(google.protobuf.message.Message):
Client has requested that the router abort processing the client's request Client has requested that the router abort processing the client's request
""" """
@typing_extensions.final @typing.final
class Statistics(google.protobuf.message.Message): class Statistics(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -236,9 +237,9 @@ class StoreAndForward(google.protobuf.message.Message):
return_max: builtins.int = ..., return_max: builtins.int = ...,
return_window: builtins.int = ..., return_window: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "messages_max", b"messages_max", "messages_saved", b"messages_saved", "messages_total", b"messages_total", "requests", b"requests", "requests_history", b"requests_history", "return_max", b"return_max", "return_window", b"return_window", "up_time", b"up_time"]) -> None: ... def ClearField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "messages_max", b"messages_max", "messages_saved", b"messages_saved", "messages_total", b"messages_total", "requests", b"requests", "requests_history", b"requests_history", "return_max", b"return_max", "return_window", b"return_window", "up_time", b"up_time"]) -> None: ...
@typing_extensions.final @typing.final
class History(google.protobuf.message.Message): class History(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -269,9 +270,9 @@ class StoreAndForward(google.protobuf.message.Message):
window: builtins.int = ..., window: builtins.int = ...,
last_request: builtins.int = ..., last_request: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["history_messages", b"history_messages", "last_request", b"last_request", "window", b"window"]) -> None: ... def ClearField(self, field_name: typing.Literal["history_messages", b"history_messages", "last_request", b"last_request", "window", b"window"]) -> None: ...
@typing_extensions.final @typing.final
class Heartbeat(google.protobuf.message.Message): class Heartbeat(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
@@ -295,7 +296,7 @@ class StoreAndForward(google.protobuf.message.Message):
period: builtins.int = ..., period: builtins.int = ...,
secondary: builtins.int = ..., secondary: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["period", b"period", "secondary", b"secondary"]) -> None: ... def ClearField(self, field_name: typing.Literal["period", b"period", "secondary", b"secondary"]) -> None: ...
RR_FIELD_NUMBER: builtins.int RR_FIELD_NUMBER: builtins.int
STATS_FIELD_NUMBER: builtins.int STATS_FIELD_NUMBER: builtins.int
@@ -306,25 +307,28 @@ class StoreAndForward(google.protobuf.message.Message):
""" """
TODO: REPLACE TODO: REPLACE
""" """
text: builtins.bytes
"""
Text from history message.
"""
@property @property
def stats(self) -> global___StoreAndForward.Statistics: def stats(self) -> global___StoreAndForward.Statistics:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def history(self) -> global___StoreAndForward.History: def history(self) -> global___StoreAndForward.History:
""" """
TODO: REPLACE TODO: REPLACE
""" """
@property @property
def heartbeat(self) -> global___StoreAndForward.Heartbeat: def heartbeat(self) -> global___StoreAndForward.Heartbeat:
""" """
TODO: REPLACE TODO: REPLACE
""" """
text: builtins.bytes
"""
Text from history message.
"""
def __init__( def __init__(
self, self,
*, *,
@@ -334,8 +338,8 @@ class StoreAndForward(google.protobuf.message.Message):
heartbeat: global___StoreAndForward.Heartbeat | None = ..., heartbeat: global___StoreAndForward.Heartbeat | None = ...,
text: builtins.bytes = ..., text: builtins.bytes = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "history", b"history", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "history", b"history", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "history", b"history", "rr", b"rr", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> None: ... def ClearField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "history", b"history", "rr", b"rr", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["stats", "history", "heartbeat", "text"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["stats", "history", "heartbeat", "text"] | None: ...
global___StoreAndForward = StoreAndForward global___StoreAndForward = StoreAndForward

View File

@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/telemetry.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\"\x81\x01\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\x12\x16\n\x0euptime_seconds\x18\x05 \x01(\r\"\xb6\x02\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\x12\x0b\n\x03iaq\x18\x07 \x01(\r\x12\x10\n\x08\x64istance\x18\x08 \x01(\x02\x12\x0b\n\x03lux\x18\t \x01(\x02\x12\x11\n\twhite_lux\x18\n \x01(\x02\x12\x0e\n\x06ir_lux\x18\x0b \x01(\x02\x12\x0e\n\x06uv_lux\x18\x0c \x01(\x02\x12\x16\n\x0ewind_direction\x18\r \x01(\r\x12\x12\n\nwind_speed\x18\x0e \x01(\x02\x12\x0e\n\x06weight\x18\x0f \x01(\x02\"\x8c\x01\n\x0cPowerMetrics\x12\x13\n\x0b\x63h1_voltage\x18\x01 \x01(\x02\x12\x13\n\x0b\x63h1_current\x18\x02 \x01(\x02\x12\x13\n\x0b\x63h2_voltage\x18\x03 \x01(\x02\x12\x13\n\x0b\x63h2_current\x18\x04 \x01(\x02\x12\x13\n\x0b\x63h3_voltage\x18\x05 \x01(\x02\x12\x13\n\x0b\x63h3_current\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\xad\x02\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12<\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetricsH\x00\x12\x46\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetricsH\x00\x12\x45\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.AirQualityMetricsH\x00\x12:\n\rpower_metrics\x18\x05 \x01(\x0b\x32!.meshtastic.protobuf.PowerMetricsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\xea\x02\n\x13TelemetrySensorType\x12\x10\n\x0cSENSOR_UNSET\x10\x00\x12\n\n\x06\x42ME280\x10\x01\x12\n\n\x06\x42ME680\x10\x02\x12\x0b\n\x07MCP9808\x10\x03\x12\n\n\x06INA260\x10\x04\x12\n\n\x06INA219\x10\x05\x12\n\n\x06\x42MP280\x10\x06\x12\t\n\x05SHTC3\x10\x07\x12\t\n\x05LPS22\x10\x08\x12\x0b\n\x07QMC6310\x10\t\x12\x0b\n\x07QMI8658\x10\n\x12\x0c\n\x08QMC5883L\x10\x0b\x12\t\n\x05SHT31\x10\x0c\x12\x0c\n\x08PMSA003I\x10\r\x12\x0b\n\x07INA3221\x10\x0e\x12\n\n\x06\x42MP085\x10\x0f\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.telemetry_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_TELEMETRYSENSORTYPE']._serialized_start=1339
_globals['_TELEMETRYSENSORTYPE']._serialized_end=1701
_globals['_DEVICEMETRICS']._serialized_start=61
_globals['_DEVICEMETRICS']._serialized_end=190
_globals['_ENVIRONMENTMETRICS']._serialized_start=193
_globals['_ENVIRONMENTMETRICS']._serialized_end=503
_globals['_POWERMETRICS']._serialized_start=506
_globals['_POWERMETRICS']._serialized_end=646
_globals['_AIRQUALITYMETRICS']._serialized_start=649
_globals['_AIRQUALITYMETRICS']._serialized_end=968
_globals['_TELEMETRY']._serialized_start=971
_globals['_TELEMETRY']._serialized_end=1272
_globals['_NAU7802CONFIG']._serialized_start=1274
_globals['_NAU7802CONFIG']._serialized_end=1336
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -90,6 +91,42 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra
""" """
RCWL-9620 Doppler Radar Distance Sensor, used for water level detection RCWL-9620 Doppler Radar Distance Sensor, used for water level detection
""" """
SHT4X: _TelemetrySensorType.ValueType # 17
"""
Sensirion High accuracy temperature and humidity
"""
VEML7700: _TelemetrySensorType.ValueType # 18
"""
VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor.
"""
MLX90632: _TelemetrySensorType.ValueType # 19
"""
MLX90632 non-contact IR temperature sensor.
"""
OPT3001: _TelemetrySensorType.ValueType # 20
"""
TI OPT3001 Ambient Light Sensor
"""
LTR390UV: _TelemetrySensorType.ValueType # 21
"""
Lite On LTR-390UV-01 UV Light Sensor
"""
TSL25911FN: _TelemetrySensorType.ValueType # 22
"""
AMS TSL25911FN RGB Light Sensor
"""
AHT10: _TelemetrySensorType.ValueType # 23
"""
AHT10 Integrated temperature and humidity sensor
"""
DFROBOT_LARK: _TelemetrySensorType.ValueType # 24
"""
DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction)
"""
NAU7802: _TelemetrySensorType.ValueType # 25
"""
NAU7802 Scale Chip or compatible
"""
class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper): class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
""" """
@@ -164,9 +201,45 @@ RCWL9620: TelemetrySensorType.ValueType # 16
""" """
RCWL-9620 Doppler Radar Distance Sensor, used for water level detection RCWL-9620 Doppler Radar Distance Sensor, used for water level detection
""" """
SHT4X: TelemetrySensorType.ValueType # 17
"""
Sensirion High accuracy temperature and humidity
"""
VEML7700: TelemetrySensorType.ValueType # 18
"""
VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor.
"""
MLX90632: TelemetrySensorType.ValueType # 19
"""
MLX90632 non-contact IR temperature sensor.
"""
OPT3001: TelemetrySensorType.ValueType # 20
"""
TI OPT3001 Ambient Light Sensor
"""
LTR390UV: TelemetrySensorType.ValueType # 21
"""
Lite On LTR-390UV-01 UV Light Sensor
"""
TSL25911FN: TelemetrySensorType.ValueType # 22
"""
AMS TSL25911FN RGB Light Sensor
"""
AHT10: TelemetrySensorType.ValueType # 23
"""
AHT10 Integrated temperature and humidity sensor
"""
DFROBOT_LARK: TelemetrySensorType.ValueType # 24
"""
DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction)
"""
NAU7802: TelemetrySensorType.ValueType # 25
"""
NAU7802 Scale Chip or compatible
"""
global___TelemetrySensorType = TelemetrySensorType global___TelemetrySensorType = TelemetrySensorType
@typing_extensions.final @typing.final
class DeviceMetrics(google.protobuf.message.Message): class DeviceMetrics(google.protobuf.message.Message):
""" """
Key native device metrics such as battery level Key native device metrics such as battery level
@@ -208,11 +281,11 @@ class DeviceMetrics(google.protobuf.message.Message):
air_util_tx: builtins.float = ..., air_util_tx: builtins.float = ...,
uptime_seconds: builtins.int = ..., uptime_seconds: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"]) -> None: ... def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "uptime_seconds", b"uptime_seconds", "voltage", b"voltage"]) -> None: ...
global___DeviceMetrics = DeviceMetrics global___DeviceMetrics = DeviceMetrics
@typing_extensions.final @typing.final
class EnvironmentMetrics(google.protobuf.message.Message): class EnvironmentMetrics(google.protobuf.message.Message):
""" """
Weather station or other environmental metrics Weather station or other environmental metrics
@@ -228,6 +301,13 @@ class EnvironmentMetrics(google.protobuf.message.Message):
CURRENT_FIELD_NUMBER: builtins.int CURRENT_FIELD_NUMBER: builtins.int
IAQ_FIELD_NUMBER: builtins.int IAQ_FIELD_NUMBER: builtins.int
DISTANCE_FIELD_NUMBER: builtins.int DISTANCE_FIELD_NUMBER: builtins.int
LUX_FIELD_NUMBER: builtins.int
WHITE_LUX_FIELD_NUMBER: builtins.int
IR_LUX_FIELD_NUMBER: builtins.int
UV_LUX_FIELD_NUMBER: builtins.int
WIND_DIRECTION_FIELD_NUMBER: builtins.int
WIND_SPEED_FIELD_NUMBER: builtins.int
WEIGHT_FIELD_NUMBER: builtins.int
temperature: builtins.float temperature: builtins.float
""" """
Temperature measured Temperature measured
@@ -261,6 +341,35 @@ class EnvironmentMetrics(google.protobuf.message.Message):
""" """
RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm. RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm.
""" """
lux: builtins.float
"""
VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor.
"""
white_lux: builtins.float
"""
VEML7700 high accuracy white light(irradiance) not calibrated digital 16-bit resolution sensor.
"""
ir_lux: builtins.float
"""
Infrared lux
"""
uv_lux: builtins.float
"""
Ultraviolet lux
"""
wind_direction: builtins.int
"""
Wind direction in degrees
0 degrees = North, 90 = East, etc...
"""
wind_speed: builtins.float
"""
Wind speed in m/s
"""
weight: builtins.float
"""
Weight in KG
"""
def __init__( def __init__(
self, self,
*, *,
@@ -272,12 +381,19 @@ class EnvironmentMetrics(google.protobuf.message.Message):
current: builtins.float = ..., current: builtins.float = ...,
iaq: builtins.int = ..., iaq: builtins.int = ...,
distance: builtins.float = ..., distance: builtins.float = ...,
lux: builtins.float = ...,
white_lux: builtins.float = ...,
ir_lux: builtins.float = ...,
uv_lux: builtins.float = ...,
wind_direction: builtins.int = ...,
wind_speed: builtins.float = ...,
weight: builtins.float = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "relative_humidity", b"relative_humidity", "temperature", b"temperature", "voltage", b"voltage"]) -> None: ... def ClearField(self, field_name: typing.Literal["barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lux", b"lux", "relative_humidity", b"relative_humidity", "temperature", b"temperature", "uv_lux", b"uv_lux", "voltage", b"voltage", "weight", b"weight", "white_lux", b"white_lux", "wind_direction", b"wind_direction", "wind_speed", b"wind_speed"]) -> None: ...
global___EnvironmentMetrics = EnvironmentMetrics global___EnvironmentMetrics = EnvironmentMetrics
@typing_extensions.final @typing.final
class PowerMetrics(google.protobuf.message.Message): class PowerMetrics(google.protobuf.message.Message):
""" """
Power Metrics (voltage / current / etc) Power Metrics (voltage / current / etc)
@@ -325,11 +441,11 @@ class PowerMetrics(google.protobuf.message.Message):
ch3_voltage: builtins.float = ..., ch3_voltage: builtins.float = ...,
ch3_current: builtins.float = ..., ch3_current: builtins.float = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage"]) -> None: ... def ClearField(self, field_name: typing.Literal["ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage"]) -> None: ...
global___PowerMetrics = PowerMetrics global___PowerMetrics = PowerMetrics
@typing_extensions.final @typing.final
class AirQualityMetrics(google.protobuf.message.Message): class AirQualityMetrics(google.protobuf.message.Message):
""" """
Air quality metrics Air quality metrics
@@ -413,11 +529,11 @@ class AirQualityMetrics(google.protobuf.message.Message):
particles_50um: builtins.int = ..., particles_50um: builtins.int = ...,
particles_100um: builtins.int = ..., particles_100um: builtins.int = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_50um", b"particles_50um", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard"]) -> None: ... def ClearField(self, field_name: typing.Literal["particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_50um", b"particles_50um", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard"]) -> None: ...
global___AirQualityMetrics = AirQualityMetrics global___AirQualityMetrics = AirQualityMetrics
@typing_extensions.final @typing.final
class Telemetry(google.protobuf.message.Message): class Telemetry(google.protobuf.message.Message):
""" """
Types of Measurements the telemetry module is equipped to handle Types of Measurements the telemetry module is equipped to handle
@@ -439,21 +555,25 @@ class Telemetry(google.protobuf.message.Message):
""" """
Key native device metrics such as battery level Key native device metrics such as battery level
""" """
@property @property
def environment_metrics(self) -> global___EnvironmentMetrics: def environment_metrics(self) -> global___EnvironmentMetrics:
""" """
Weather station or other environmental metrics Weather station or other environmental metrics
""" """
@property @property
def air_quality_metrics(self) -> global___AirQualityMetrics: def air_quality_metrics(self) -> global___AirQualityMetrics:
""" """
Air quality metrics Air quality metrics
""" """
@property @property
def power_metrics(self) -> global___PowerMetrics: def power_metrics(self) -> global___PowerMetrics:
""" """
Power Metrics Power Metrics
""" """
def __init__( def __init__(
self, self,
*, *,
@@ -463,8 +583,36 @@ class Telemetry(google.protobuf.message.Message):
air_quality_metrics: global___AirQualityMetrics | None = ..., air_quality_metrics: global___AirQualityMetrics | None = ...,
power_metrics: global___PowerMetrics | None = ..., power_metrics: global___PowerMetrics | None = ...,
) -> None: ... ) -> None: ...
def HasField(self, field_name: typing_extensions.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ... def HasField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ...
def ClearField(self, field_name: typing_extensions.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ... def ClearField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ...
def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics"] | None: ... def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics"] | None: ...
global___Telemetry = Telemetry global___Telemetry = Telemetry
@typing.final
class Nau7802Config(google.protobuf.message.Message):
"""
NAU7802 Telemetry configuration, for saving to flash
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
ZEROOFFSET_FIELD_NUMBER: builtins.int
CALIBRATIONFACTOR_FIELD_NUMBER: builtins.int
zeroOffset: builtins.int
"""
The offset setting for the NAU7802
"""
calibrationFactor: builtins.float
"""
The calibration factor for the NAU7802
"""
def __init__(
self,
*,
zeroOffset: builtins.int = ...,
calibrationFactor: builtins.float = ...,
) -> None: ...
def ClearField(self, field_name: typing.Literal["calibrationFactor", b"calibrationFactor", "zeroOffset", b"zeroOffset"]) -> None: ...
global___Nau7802Config = Nau7802Config

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/protobuf/xmodem.proto
"""Generated protocol buffer code."""
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
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/xmodem.proto\x12\x13meshtastic.protobuf\"\xbf\x01\n\x06XModem\x12\x34\n\x07\x63ontrol\x18\x01 \x01(\x0e\x32#.meshtastic.protobuf.XModem.Control\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\r\n\x05\x63rc16\x18\x03 \x01(\r\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\"S\n\x07\x43ontrol\x12\x07\n\x03NUL\x10\x00\x12\x07\n\x03SOH\x10\x01\x12\x07\n\x03STX\x10\x02\x12\x07\n\x03\x45OT\x10\x04\x12\x07\n\x03\x41\x43K\x10\x06\x12\x07\n\x03NAK\x10\x15\x12\x07\n\x03\x43\x41N\x10\x18\x12\t\n\x05\x43TRLZ\x10\x1a\x42\x61\n\x13\x63om.geeksville.meshB\x0cXmodemProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.xmodem_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_globals['_XMODEM']._serialized_start=58
_globals['_XMODEM']._serialized_end=249
_globals['_XMODEM_CONTROL']._serialized_start=166
_globals['_XMODEM_CONTROL']._serialized_end=249
# @@protoc_insertion_point(module_scope)

View File

@@ -2,6 +2,7 @@
@generated by mypy-protobuf. Do not edit manually! @generated by mypy-protobuf. Do not edit manually!
isort:skip_file isort:skip_file
""" """
import builtins import builtins
import google.protobuf.descriptor import google.protobuf.descriptor
import google.protobuf.internal.enum_type_wrapper import google.protobuf.internal.enum_type_wrapper
@@ -16,7 +17,7 @@ else:
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
@typing_extensions.final @typing.final
class XModem(google.protobuf.message.Message): class XModem(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -61,6 +62,6 @@ class XModem(google.protobuf.message.Message):
crc16: builtins.int = ..., crc16: builtins.int = ...,
buffer: builtins.bytes = ..., buffer: builtins.bytes = ...,
) -> None: ... ) -> None: ...
def ClearField(self, field_name: typing_extensions.Literal["buffer", b"buffer", "control", b"control", "crc16", b"crc16", "seq", b"seq"]) -> None: ... def ClearField(self, field_name: typing.Literal["buffer", b"buffer", "control", b"control", "crc16", b"crc16", "seq", b"seq"]) -> None: ...
global___XModem = XModem global___XModem = XModem

View File

@@ -4,7 +4,7 @@ import logging
from pubsub import pub # type: ignore[import-untyped] from pubsub import pub # type: ignore[import-untyped]
from meshtastic import portnums_pb2, remote_hardware_pb2 from meshtastic.protobuf import portnums_pb2, remote_hardware_pb2
from meshtastic.util import our_exit from meshtastic.util import our_exit

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/remote_hardware.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\x12\nmeshtastic\"\xd6\x01\n\x0fHardwareMessage\x12.\n\x04type\x18\x01 \x01(\x0e\x32 .meshtastic.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x63\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.remote_hardware_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_HARDWAREMESSAGE._serialized_start=49
_HARDWAREMESSAGE._serialized_end=263
_HARDWAREMESSAGE_TYPE._serialized_start=155
_HARDWAREMESSAGE_TYPE._serialized_end=263
# @@protoc_insertion_point(module_scope)

View File

@@ -4,6 +4,8 @@ import logging
import platform import platform
import time import time
from typing import Optional
import serial # type: ignore[import-untyped] import serial # type: ignore[import-untyped]
import meshtastic.util import meshtastic.util
@@ -16,7 +18,7 @@ if platform.system() != "Windows":
class SerialInterface(StreamInterface): class SerialInterface(StreamInterface):
"""Interface class for meshtastic devices over a serial link""" """Interface class for meshtastic devices over a serial link"""
def __init__(self, devPath=None, debugOut=None, noProto=False, connectNow=True): def __init__(self, devPath: Optional[str]=None, debugOut=None, noProto=False, connectNow=True, noNodes: bool=False):
"""Constructor, opens a connection to a specified serial port, or if unspecified try to """Constructor, opens a connection to a specified serial port, or if unspecified try to
find one Meshtastic device by probing find one Meshtastic device by probing
@@ -26,7 +28,7 @@ class SerialInterface(StreamInterface):
""" """
self.noProto = noProto self.noProto = noProto
self.devPath = devPath self.devPath: Optional[str] = devPath
if self.devPath is None: if self.devPath is None:
ports = meshtastic.util.findPorts(True) ports = meshtastic.util.findPorts(True)
@@ -60,7 +62,7 @@ class SerialInterface(StreamInterface):
time.sleep(0.1) time.sleep(0.1)
StreamInterface.__init__( StreamInterface.__init__(
self, debugOut=debugOut, noProto=noProto, connectNow=connectNow self, debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes
) )
def close(self): def close(self):

View File

@@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/storeforward.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\x1dmeshtastic/storeforward.proto\x12\nmeshtastic\"\x9c\x07\n\x0fStoreAndForward\x12\x37\n\x02rr\x18\x01 \x01(\x0e\x32+.meshtastic.StoreAndForward.RequestResponse\x12\x37\n\x05stats\x18\x02 \x01(\x0b\x32&.meshtastic.StoreAndForward.StatisticsH\x00\x12\x36\n\x07history\x18\x03 \x01(\x0b\x32#.meshtastic.StoreAndForward.HistoryH\x00\x12:\n\theartbeat\x18\x04 \x01(\x0b\x32%.meshtastic.StoreAndForward.HeartbeatH\x00\x12\x0e\n\x04text\x18\x05 \x01(\x0cH\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBj\n\x13\x63om.geeksville.meshB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.storeforward_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_STOREANDFORWARD._serialized_start=46
_STOREANDFORWARD._serialized_end=970
_STOREANDFORWARD_STATISTICS._serialized_start=312
_STOREANDFORWARD_STATISTICS._serialized_end=517
_STOREANDFORWARD_HISTORY._serialized_start=519
_STOREANDFORWARD_HISTORY._serialized_end=592
_STOREANDFORWARD_HEARTBEAT._serialized_start=594
_STOREANDFORWARD_HEARTBEAT._serialized_end=640
_STOREANDFORWARD_REQUESTRESPONSE._serialized_start=643
_STOREANDFORWARD_REQUESTRESPONSE._serialized_end=959
# @@protoc_insertion_point(module_scope)

View File

@@ -19,7 +19,7 @@ MAX_TO_FROM_RADIO_SIZE = 512
class StreamInterface(MeshInterface): class StreamInterface(MeshInterface):
"""Interface class for meshtastic devices over a stream link (serial, TCP, etc)""" """Interface class for meshtastic devices over a stream link (serial, TCP, etc)"""
def __init__(self, debugOut=None, noProto=False, connectNow=True): def __init__(self, debugOut=None, noProto=False, connectNow=True, noNodes=False):
"""Constructor, opens a connection to self.stream """Constructor, opens a connection to self.stream
Keyword Arguments: Keyword Arguments:
@@ -43,7 +43,7 @@ class StreamInterface(MeshInterface):
# FIXME, figure out why daemon=True causes reader thread to exit too early # FIXME, figure out why daemon=True causes reader thread to exit too early
self._rxThread = threading.Thread(target=self.__reader, args=(), daemon=True) self._rxThread = threading.Thread(target=self.__reader, args=(), daemon=True)
MeshInterface.__init__(self, debugOut=debugOut, noProto=noProto) MeshInterface.__init__(self, debugOut=debugOut, noProto=noProto, noNodes=noNodes)
# Start the reader thread after superclass constructor completes init # Start the reader thread after superclass constructor completes init
if connectNow: if connectNow:

View File

@@ -17,6 +17,7 @@ class TCPInterface(StreamInterface):
noProto=False, noProto=False,
connectNow=True, connectNow=True,
portNumber=4403, portNumber=4403,
noNodes:bool=False,
): ):
"""Constructor, opens a connection to a specified IP address/hostname """Constructor, opens a connection to a specified IP address/hostname
@@ -38,7 +39,7 @@ class TCPInterface(StreamInterface):
self.socket = None self.socket = None
StreamInterface.__init__( StreamInterface.__init__(
self, debugOut=debugOut, noProto=noProto, connectNow=connectNow self, debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes
) )
def _socket_shutdown(self): def _socket_shutdown(self):

View File

@@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/telemetry.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\x1ameshtastic/telemetry.proto\x12\nmeshtastic\"\x81\x01\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\x12\x16\n\x0euptime_seconds\x18\x05 \x01(\r\"\xba\x01\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\x12\x0b\n\x03iaq\x18\x07 \x01(\r\x12\x10\n\x08\x64istance\x18\x08 \x01(\x02\"\x8c\x01\n\x0cPowerMetrics\x12\x13\n\x0b\x63h1_voltage\x18\x01 \x01(\x02\x12\x13\n\x0b\x63h1_current\x18\x02 \x01(\x02\x12\x13\n\x0b\x63h2_voltage\x18\x03 \x01(\x02\x12\x13\n\x0b\x63h2_current\x18\x04 \x01(\x02\x12\x13\n\x0b\x63h3_voltage\x18\x05 \x01(\x02\x12\x13\n\x0b\x63h3_current\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\x89\x02\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12\x33\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x19.meshtastic.DeviceMetricsH\x00\x12=\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x1e.meshtastic.EnvironmentMetricsH\x00\x12<\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x1d.meshtastic.AirQualityMetricsH\x00\x12\x31\n\rpower_metrics\x18\x05 \x01(\x0b\x32\x18.meshtastic.PowerMetricsH\x00\x42\t\n\x07variant*\xee\x01\n\x13TelemetrySensorType\x12\x10\n\x0cSENSOR_UNSET\x10\x00\x12\n\n\x06\x42ME280\x10\x01\x12\n\n\x06\x42ME680\x10\x02\x12\x0b\n\x07MCP9808\x10\x03\x12\n\n\x06INA260\x10\x04\x12\n\n\x06INA219\x10\x05\x12\n\n\x06\x42MP280\x10\x06\x12\t\n\x05SHTC3\x10\x07\x12\t\n\x05LPS22\x10\x08\x12\x0b\n\x07QMC6310\x10\t\x12\x0b\n\x07QMI8658\x10\n\x12\x0c\n\x08QMC5883L\x10\x0b\x12\t\n\x05SHT31\x10\x0c\x12\x0c\n\x08PMSA003I\x10\r\x12\x0b\n\x07INA3221\x10\x0e\x12\n\n\x06\x42MP085\x10\x0f\x12\x0c\n\x08RCWL9620\x10\x10\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.telemetry_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_TELEMETRYSENSORTYPE._serialized_start=1097
_TELEMETRYSENSORTYPE._serialized_end=1335
_DEVICEMETRICS._serialized_start=43
_DEVICEMETRICS._serialized_end=172
_ENVIRONMENTMETRICS._serialized_start=175
_ENVIRONMENTMETRICS._serialized_end=361
_POWERMETRICS._serialized_start=364
_POWERMETRICS._serialized_end=504
_AIRQUALITYMETRICS._serialized_start=507
_AIRQUALITYMETRICS._serialized_end=826
_TELEMETRY._serialized_start=829
_TELEMETRY._serialized_end=1094
# @@protoc_insertion_point(module_scope)

View File

@@ -44,7 +44,7 @@ def test_init_onNodeInfoReceive(caplog, iface_with_nodes):
iface = iface_with_nodes iface = iface_with_nodes
iface.myInfo.my_node_num = 2475227164 iface.myInfo.my_node_num = 2475227164
packet = { packet = {
"from": "foo", "from": 4808675309,
"decoded": { "decoded": {
"user": { "user": {
"id": "bar", "id": "bar",

View File

@@ -21,7 +21,7 @@ from meshtastic.__main__ import (
) )
from meshtastic import mt_config from meshtastic import mt_config
from ..channel_pb2 import Channel # pylint: disable=E0611 from ..protobuf.channel_pb2 import Channel # pylint: disable=E0611
# from ..ble_interface import BLEInterface # from ..ble_interface import BLEInterface
from ..node import Node from ..node import Node
@@ -724,29 +724,79 @@ def test_main_sendtext_with_dest(mock_findPorts, mock_serial, mocked_open, mock_
assert re.search(r"Warning: There were no self.nodes.", caplog.text, re.MULTILINE) assert re.search(r"Warning: There were no self.nodes.", caplog.text, re.MULTILINE)
assert err == "" assert err == ""
@pytest.mark.unit
@pytest.mark.usefixtures("reset_mt_config")
def test_main_removeposition_invalid(capsys):
"""Test --remove-position with an invalid dest"""
sys.argv = ["", "--remove-position", "--dest", "!12345678"]
mt_config.args = sys.argv
iface = MagicMock(autospec=SerialInterface)
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main()
out, err = capsys.readouterr()
assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"remote nodes is not supported", out, re.MULTILINE)
assert err == ""
mo.assert_called()
@pytest.mark.unit
@pytest.mark.usefixtures("reset_mt_config")
def test_main_setlat_invalid(capsys):
"""Test --setlat with an invalid dest"""
sys.argv = ["", "--setlat", "37.5", "--dest", "!12345678"]
mt_config.args = sys.argv
iface = MagicMock(autospec=SerialInterface)
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main()
out, err = capsys.readouterr()
assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"remote nodes is not supported", out, re.MULTILINE)
assert err == ""
mo.assert_called()
@pytest.mark.unit
@pytest.mark.usefixtures("reset_mt_config")
def test_main_removeposition(capsys):
"""Test --remove-position"""
sys.argv = ["", "--remove-position"]
mt_config.args = sys.argv
mocked_node = MagicMock(autospec=Node)
def mock_removeFixedPosition():
print("inside mocked removeFixedPosition")
mocked_node.removeFixedPosition.side_effect = mock_removeFixedPosition
iface = MagicMock(autospec=SerialInterface)
iface.localNode = mocked_node
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main()
out, err = capsys.readouterr()
assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"Removing fixed position", out, re.MULTILINE)
assert re.search(r"inside mocked removeFixedPosition", out, re.MULTILINE)
assert err == ""
mo.assert_called()
@pytest.mark.unit @pytest.mark.unit
@pytest.mark.usefixtures("reset_mt_config") @pytest.mark.usefixtures("reset_mt_config")
def test_main_setlat(capsys): def test_main_setlat(capsys):
"""Test --sendlat""" """Test --setlat"""
sys.argv = ["", "--setlat", "37.5"] sys.argv = ["", "--setlat", "37.5"]
mt_config.args = sys.argv mt_config.args = sys.argv
mocked_node = MagicMock(autospec=Node) mocked_node = MagicMock(autospec=Node)
def mock_writeConfig(): def mock_setFixedPosition(lat, lon, alt):
print("inside mocked writeConfig") print("inside mocked setFixedPosition")
mocked_node.writeConfig.side_effect = mock_writeConfig
iface = MagicMock(autospec=SerialInterface)
def mock_sendPosition(lat, lon, alt):
print("inside mocked sendPosition")
print(f"{lat} {lon} {alt}") print(f"{lat} {lon} {alt}")
iface.sendPosition.side_effect = mock_sendPosition mocked_node.setFixedPosition.side_effect = mock_setFixedPosition
iface.localNode.return_value = mocked_node
iface = MagicMock(autospec=SerialInterface)
iface.localNode = mocked_node
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main() main()
@@ -754,8 +804,7 @@ def test_main_setlat(capsys):
assert re.search(r"Connected to radio", out, re.MULTILINE) assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"Fixing latitude", out, re.MULTILINE) assert re.search(r"Fixing latitude", out, re.MULTILINE)
assert re.search(r"Setting device position", out, re.MULTILINE) assert re.search(r"Setting device position", out, re.MULTILINE)
assert re.search(r"inside mocked sendPosition", out, re.MULTILINE) assert re.search(r"inside mocked setFixedPosition", out, re.MULTILINE)
# TODO: Why does this not work? assert re.search(r'inside mocked writeConfig', out, re.MULTILINE)
assert err == "" assert err == ""
mo.assert_called() mo.assert_called()
@@ -769,19 +818,14 @@ def test_main_setlon(capsys):
mocked_node = MagicMock(autospec=Node) mocked_node = MagicMock(autospec=Node)
def mock_writeConfig(): def mock_setFixedPosition(lat, lon, alt):
print("inside mocked writeConfig") print("inside mocked setFixedPosition")
mocked_node.writeConfig.side_effect = mock_writeConfig
iface = MagicMock(autospec=SerialInterface)
def mock_sendPosition(lat, lon, alt):
print("inside mocked sendPosition")
print(f"{lat} {lon} {alt}") print(f"{lat} {lon} {alt}")
iface.sendPosition.side_effect = mock_sendPosition mocked_node.setFixedPosition.side_effect = mock_setFixedPosition
iface.localNode.return_value = mocked_node
iface = MagicMock(autospec=SerialInterface)
iface.localNode = mocked_node
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main() main()
@@ -789,8 +833,7 @@ def test_main_setlon(capsys):
assert re.search(r"Connected to radio", out, re.MULTILINE) assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"Fixing longitude", out, re.MULTILINE) assert re.search(r"Fixing longitude", out, re.MULTILINE)
assert re.search(r"Setting device position", out, re.MULTILINE) assert re.search(r"Setting device position", out, re.MULTILINE)
assert re.search(r"inside mocked sendPosition", out, re.MULTILINE) assert re.search(r"inside mocked setFixedPosition", out, re.MULTILINE)
# TODO: Why does this not work? assert re.search(r'inside mocked writeConfig', out, re.MULTILINE)
assert err == "" assert err == ""
mo.assert_called() mo.assert_called()
@@ -804,19 +847,14 @@ def test_main_setalt(capsys):
mocked_node = MagicMock(autospec=Node) mocked_node = MagicMock(autospec=Node)
def mock_writeConfig(): def mock_setFixedPosition(lat, lon, alt):
print("inside mocked writeConfig") print("inside mocked setFixedPosition")
mocked_node.writeConfig.side_effect = mock_writeConfig
iface = MagicMock(autospec=SerialInterface)
def mock_sendPosition(lat, lon, alt):
print("inside mocked sendPosition")
print(f"{lat} {lon} {alt}") print(f"{lat} {lon} {alt}")
iface.sendPosition.side_effect = mock_sendPosition mocked_node.setFixedPosition.side_effect = mock_setFixedPosition
iface.localNode.return_value = mocked_node
iface = MagicMock(autospec=SerialInterface)
iface.localNode = mocked_node
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
main() main()
@@ -824,8 +862,7 @@ def test_main_setalt(capsys):
assert re.search(r"Connected to radio", out, re.MULTILINE) assert re.search(r"Connected to radio", out, re.MULTILINE)
assert re.search(r"Fixing altitude", out, re.MULTILINE) assert re.search(r"Fixing altitude", out, re.MULTILINE)
assert re.search(r"Setting device position", out, re.MULTILINE) assert re.search(r"Setting device position", out, re.MULTILINE)
assert re.search(r"inside mocked sendPosition", out, re.MULTILINE) assert re.search(r"inside mocked setFixedPosition", out, re.MULTILINE)
# TODO: Why does this not work? assert re.search(r'inside mocked writeConfig', out, re.MULTILINE)
assert err == "" assert err == ""
mo.assert_called() mo.assert_called()

View File

@@ -5,9 +5,11 @@ import re
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import pytest import pytest
from hypothesis import given, strategies as st
from .. import mesh_pb2, config_pb2, BROADCAST_ADDR, LOCAL_ADDR from ..protobuf import mesh_pb2, config_pb2
from ..mesh_interface import MeshInterface from .. import BROADCAST_ADDR, LOCAL_ADDR
from ..mesh_interface import MeshInterface, _timeago
from ..node import Node from ..node import Node
# TODO # TODO
@@ -588,7 +590,7 @@ def test_getOrCreateByNum_minimal(iface_with_nodes):
iface = iface_with_nodes iface = iface_with_nodes
iface.myInfo.my_node_num = 2475227164 iface.myInfo.my_node_num = 2475227164
tmp = iface._getOrCreateByNum(123) tmp = iface._getOrCreateByNum(123)
assert tmp == {"num": 123} assert tmp == {"num": 123, "user": {"hwModel": "UNSET", "id": "!0000007b", "shortName": "007b", "longName": "Meshtastic 007b"}}
@pytest.mark.unit @pytest.mark.unit
@@ -684,3 +686,21 @@ def test_waitConnected_isConnected_timeout(capsys):
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"warn about something", err, re.MULTILINE) assert re.search(r"warn about something", err, re.MULTILINE)
assert out == "" assert out == ""
@pytest.mark.unit
def test_timeago():
"""Test that the _timeago function returns sane values"""
assert _timeago(0) == "now"
assert _timeago(1) == "1 sec ago"
assert _timeago(15) == "15 secs ago"
assert _timeago(333) == "5 mins ago"
assert _timeago(99999) == "1 day ago"
assert _timeago(9999999) == "3 months ago"
assert _timeago(-999) == "now"
@given(seconds=st.integers())
def test_timeago_fuzz(seconds):
"""Fuzz _timeago to ensure it works with any integer"""
val = _timeago(seconds)
assert re.match(r"(now|\d+ (secs?|mins?|hours?|days?|months?|years?))", val)

View File

@@ -6,8 +6,8 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from .. import localonly_pb2, config_pb2 from ..protobuf import localonly_pb2, config_pb2
from ..channel_pb2 import Channel # pylint: disable=E0611 from ..protobuf.channel_pb2 import Channel # pylint: disable=E0611
from ..node import Node from ..node import Node
from ..serial_interface import SerialInterface from ..serial_interface import SerialInterface
from ..mesh_interface import MeshInterface from ..mesh_interface import MeshInterface

View File

@@ -6,7 +6,7 @@ from unittest.mock import mock_open, patch
import pytest import pytest
from ..serial_interface import SerialInterface from ..serial_interface import SerialInterface
from .. import config_pb2 from ..protobuf import config_pb2
@pytest.mark.unit @pytest.mark.unit

View File

@@ -5,7 +5,7 @@ from unittest.mock import patch
import pytest import pytest
from .. import config_pb2 from ..protobuf import config_pb2
from ..tcp_interface import TCPInterface from ..tcp_interface import TCPInterface

View File

@@ -6,9 +6,10 @@ import re
from unittest.mock import patch from unittest.mock import patch
import pytest import pytest
from hypothesis import given, strategies as st
from meshtastic.supported_device import SupportedDevice from meshtastic.supported_device import SupportedDevice
from meshtastic.mesh_pb2 import MyNodeInfo from meshtastic.protobuf import mesh_pb2
from meshtastic.util import ( from meshtastic.util import (
Timeout, Timeout,
active_ports_on_supported_devices, active_ports_on_supported_devices,
@@ -33,6 +34,7 @@ from meshtastic.util import (
stripnl, stripnl,
support_info, support_info,
message_to_json, message_to_json,
Acknowledgment
) )
@@ -63,6 +65,7 @@ def test_fromStr():
assert fromStr("123") == 123 assert fromStr("123") == 123
assert fromStr("abc") == "abc" assert fromStr("abc") == "abc"
assert fromStr("123456789") == 123456789 assert fromStr("123456789") == 123456789
assert fromStr("base64:Zm9vIGJhciBiYXo=") == b"foo bar baz"
@pytest.mark.unitslow @pytest.mark.unitslow
@@ -552,6 +555,42 @@ def test_active_ports_on_supported_devices_mac_duplicates_check(mock_platform, m
@pytest.mark.unit @pytest.mark.unit
def test_message_to_json_shows_all(): def test_message_to_json_shows_all():
"""Test that message_to_json prints fields that aren't included in data passed in""" """Test that message_to_json prints fields that aren't included in data passed in"""
actual = json.loads(message_to_json(MyNodeInfo())) actual = json.loads(message_to_json(mesh_pb2.MyNodeInfo()))
expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0 } expected = { "myNodeNum": 0, "rebootCount": 0, "minAppVersion": 0 }
assert actual == expected assert actual == expected
@pytest.mark.unit
def test_acknowledgement_reset():
"""
Test that the reset method can set all fields back to False
"""
test_ack_obj = Acknowledgment()
# everything's set to False; let's set it to True to get a good test
test_ack_obj.receivedAck = True
test_ack_obj.receivedNak = True
test_ack_obj.receivedImplAck = True
test_ack_obj.receivedTraceRoute = True
test_ack_obj.receivedTelemetry = True
test_ack_obj.receivedPosition = True
test_ack_obj.reset()
assert test_ack_obj.receivedAck is False
assert test_ack_obj.receivedNak is False
assert test_ack_obj.receivedImplAck is False
assert test_ack_obj.receivedTraceRoute is False
assert test_ack_obj.receivedTelemetry is False
assert test_ack_obj.receivedPosition is False
@given(a_string=st.text(
alphabet=st.characters(
codec='ascii',
min_codepoint=0x5F,
max_codepoint=0x7A,
exclude_characters=r'`',
)).filter(
lambda x: x not in [''] and x[0] not in "_" and x[-1] not in '_' and not re.search(r'__', x)
))
def test_roundtrip_snake_to_camel_camel_to_snake(a_string):
"""Test that snake_to_camel and camel_to_snake roundtrip each other"""
value0 = snake_to_camel(a_string=a_string)
value1 = camel_to_snake(a_string=value0)
assert a_string == value1, (a_string, value1)

View File

@@ -22,7 +22,8 @@ import threading
from pubsub import pub # type: ignore[import-untyped] from pubsub import pub # type: ignore[import-untyped]
from pytap2 import TapDevice from pytap2 import TapDevice
from meshtastic import portnums_pb2, mt_config from meshtastic.protobuf import portnums_pb2
from meshtastic import mt_config
from meshtastic.util import ipstr, readnet_u16 from meshtastic.util import ipstr, readnet_u16

View File

@@ -11,9 +11,10 @@ import threading
import time import time
import traceback import traceback
from queue import Queue from queue import Queue
from typing import Union from typing import List, NoReturn, Union
from google.protobuf.json_format import MessageToJson from google.protobuf.json_format import MessageToJson
from google.protobuf.message import Message
import packaging.version as pkg_version import packaging.version as pkg_version
import requests import requests
@@ -23,8 +24,16 @@ import serial.tools.list_ports # type: ignore[import-untyped]
from meshtastic.supported_device import supported_devices from meshtastic.supported_device import supported_devices
from meshtastic.version import get_active_version from meshtastic.version import get_active_version
"""Some devices such as a seger jlink we never want to accidentally open""" """Some devices such as a seger jlink or st-link we never want to accidentally open
blacklistVids = dict.fromkeys([0x1366]) 0x1915 NordicSemi (PPK2)
"""
blacklistVids = dict.fromkeys([0x1366, 0x0483, 0x1915])
"""Some devices are highly likely to be meshtastic.
0x239a RAK4631
0x303a Heltec tracker"""
whitelistVids = dict.fromkeys([0x239a, 0x303a])
def quoteBooleans(a_string): def quoteBooleans(a_string):
"""Quote booleans """Quote booleans
@@ -103,7 +112,7 @@ def pskToString(psk: bytes):
return "secret" return "secret"
def stripnl(s): def stripnl(s) -> str:
"""Remove newlines from a string (and remove extra whitespace)""" """Remove newlines from a string (and remove extra whitespace)"""
s = str(s).replace("\n", " ") s = str(s).replace("\n", " ")
return " ".join(s.split()) return " ".join(s.split())
@@ -122,26 +131,42 @@ def catchAndIgnore(reason, closure):
logging.error(f"Exception thrown in {reason}: {ex}") logging.error(f"Exception thrown in {reason}: {ex}")
def findPorts(eliminate_duplicates=False): def findPorts(eliminate_duplicates: bool=False) -> List[str]:
"""Find all ports that might have meshtastic devices """Find all ports that might have meshtastic devices
eliminate_duplicates will run the eliminate_duplicate_port() on the collection eliminate_duplicates will run the eliminate_duplicate_port() on the collection
Returns: Returns:
list -- a list of device paths list -- a list of device paths
""" """
l = list( all_ports = serial.tools.list_ports.comports()
# look for 'likely' meshtastic devices
ports = list(
map( map(
lambda port: port.device, lambda port: port.device,
filter( filter(
lambda port: port.vid is not None and port.vid not in blacklistVids, lambda port: port.vid is not None and port.vid in whitelistVids,
serial.tools.list_ports.comports(), all_ports,
), ),
) )
) )
l.sort()
# if no likely devices, just list everything not blacklisted
if len(ports) == 0:
ports = list(
map(
lambda port: port.device,
filter(
lambda port: port.vid is not None and port.vid not in blacklistVids,
all_ports,
),
)
)
ports.sort()
if eliminate_duplicates: if eliminate_duplicates:
l = eliminate_duplicate_port(l) ports = eliminate_duplicate_port(ports)
return l return ports
class dotdict(dict): class dotdict(dict):
@@ -263,7 +288,7 @@ class DeferredExecution:
print(traceback.format_exc()) print(traceback.format_exc())
def our_exit(message, return_value=1): def our_exit(message, return_value=1) -> NoReturn:
"""Print the message and return a value. """Print the message and return a value.
return_value defaults to 1 (non-successful) return_value defaults to 1 (non-successful)
""" """
@@ -627,6 +652,8 @@ def check_if_newer_version():
return pypi_version return pypi_version
def message_to_json(message):
"Return protobuf message as JSON. Always print all fields, even when not present in data." def message_to_json(message: Message, multiline: bool=False) -> str:
return stripnl(MessageToJson(message, always_print_fields_with_no_presence=True)) """Return protobuf message as JSON. Always print all fields, even when not present in data."""
json = MessageToJson(message, always_print_fields_with_no_presence=True)
return stripnl(json) if not multiline else json

View File

@@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/xmodem.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/xmodem.proto\x12\nmeshtastic\"\xb6\x01\n\x06XModem\x12+\n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x1a.meshtastic.XModem.Control\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\r\n\x05\x63rc16\x18\x03 \x01(\r\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\"S\n\x07\x43ontrol\x12\x07\n\x03NUL\x10\x00\x12\x07\n\x03SOH\x10\x01\x12\x07\n\x03STX\x10\x02\x12\x07\n\x03\x45OT\x10\x04\x12\x07\n\x03\x41\x43K\x10\x06\x12\x07\n\x03NAK\x10\x15\x12\x07\n\x03\x43\x41N\x10\x18\x12\t\n\x05\x43TRLZ\x10\x1a\x42\x61\n\x13\x63om.geeksville.meshB\x0cXmodemProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.xmodem_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_XMODEM._serialized_start=40
_XMODEM._serialized_end=222
_XMODEM_CONTROL._serialized_start=139
_XMODEM_CONTROL._serialized_end=222
# @@protoc_insertion_point(module_scope)

1559
poetry.lock generated Normal file
View File

File diff suppressed because it is too large Load Diff

52
pyproject.toml Normal file
View File

@@ -0,0 +1,52 @@
[tool.poetry]
name = "meshtastic"
version = "2.3.12"
description = "Python API & client shell for talking to Meshtastic devices"
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
license = "GPL-3.0-only"
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.8,<3.13" # was 3.7 for production but, 3.8 is needed for pytap2, 3.9 is needed for pandas, bleak requires a max of 3.13 for some reason
pyserial = "^3.5"
protobuf = ">=5.26.0"
dotmap = "^1.3.30"
pexpect = "^4.9.0"
pyqrcode = "^1.2.1"
tabulate = "^0.9.0"
webencodings = "^0.5.1"
requests = "^2.31.0"
pyparsing = "^3.1.2"
pyyaml = "^6.0.1"
pypubsub = "^4.0.3"
bleak = "^0.21.1"
packaging = "^24.0"
print-color = "^0.4.6"
[tool.poetry.group.dev.dependencies]
hypothesis = "^6.103.2"
pytest = "^8.2.2"
pytest-cov = "^5.0.0"
pdoc3 = "^0.10.0"
autopep8 = "^2.1.0"
pylint = "^3.2.3"
pytap2 = "^2.3.0"
pyinstaller = "^6.8.0"
mypy = "^1.10.0"
mypy-protobuf = "^3.6.0"
types-protobuf = "^5.26.0.20240422"
types-tabulate = "^0.9.0.20240106"
types-requests = "^2.31.0.20240406"
types-setuptools = "^69.5.0.20240423"
types-pyyaml = "^6.0.12.20240311"
[tool.poetry.extras]
tunnel = ["pytap2"]
[tool.poetry.scripts]
meshtastic = "meshtastic.__main__:main"
mesh-tunnel = "meshtastic.__main__:tunnelMain [tunnel]"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

View File

@@ -1,29 +0,0 @@
markdown
pyserial
protobuf>=5.26.0
dotmap
pexpect
pyqrcode
tabulate
timeago
webencodings
requests
pyparsing
twine
autopep8
pylint
pytest
pytest-cov
pyyaml
pytap2
pdoc3
pypubsub
bleak
packaging
mypy
mypy-protobuf
types-protobuf
types-tabulate
types-requests
types-setuptools
types-PyYAML

Some files were not shown because too many files have changed in this diff Show More